{"version":3,"file":"nepali-datepicker-pro.umd.cjs","names":[],"sources":["../src/calendar-data/bs-month-lengths.ts","../src/adapters/bs-ad-calendar-adapter.ts","../src/date-math/native-date-math.ts","../src/domain/date-value.ts","../src/application/calendar-view.ts","../src/application/constraints.ts","../src/format/index.ts","../src/application/presets.ts","../src/application/date-range-controller.ts","../src/format/parse.ts","../src/application/date-time-controller.ts","../src/application/month-picker-controller.ts","../src/autoinit/segmented-field.ts","../src/autoinit/segment-schemas.ts","../src/position/index.ts","../src/render/dom.ts","../src/autoinit/index.ts","../src/functions/index.ts"],"sourcesContent":["// Generated from references/nepali.datepicker.v5.0.6.min.js.\n// The runtime library does not load or depend on that script.\nexport const BS_YEAR_MIN = 1970;\nexport const BS_YEAR_MAX = 2100;\nexport const BS_EPOCH_BS = { year: 2000, month: 9, day: 17 } as const;\nexport const BS_EPOCH_AD = { year: 1944, month: 1, day: 1 } as const;\n\nexport const BS_MONTH_LENGTHS_BY_YEAR: Readonly<Record<number, readonly number[]>> = {\n  1970: [31,31,32,31,31,31,30,29,30,29,30,30],\n  1971: [31,31,32,31,32,30,30,29,30,29,30,30],\n  1972: [31,32,31,32,31,30,30,30,29,29,30,31],\n  1973: [30,32,31,32,31,30,30,30,29,30,29,31],\n  1974: [31,31,32,31,31,31,30,29,30,29,30,30],\n  1975: [31,31,32,32,31,30,30,29,30,29,30,30],\n  1976: [31,32,31,32,31,30,30,30,29,29,30,31],\n  1977: [30,32,31,32,31,31,29,30,29,30,29,31],\n  1978: [31,31,32,31,31,31,30,29,30,29,30,30],\n  1979: [31,31,32,32,31,30,30,29,30,29,30,30],\n  1980: [31,32,31,32,31,30,30,30,29,29,30,31],\n  1981: [31,31,31,32,31,31,29,30,30,29,30,30],\n  1982: [31,31,32,31,31,31,30,29,30,29,30,30],\n  1983: [31,31,32,32,31,30,30,29,30,29,30,30],\n  1984: [31,32,31,32,31,30,30,30,29,29,30,31],\n  1985: [31,31,31,32,31,31,29,30,30,29,30,30],\n  1986: [31,31,32,31,31,31,30,29,30,29,30,30],\n  1987: [31,32,31,32,31,30,30,29,30,29,30,30],\n  1988: [31,32,31,32,31,30,30,30,29,29,30,31],\n  1989: [31,31,31,32,31,31,30,29,30,29,30,30],\n  1990: [31,31,32,31,31,31,30,29,30,29,30,30],\n  1991: [31,32,31,32,31,30,30,30,29,29,30,30],\n  1992: [31,32,31,32,31,30,30,30,29,30,29,31],\n  1993: [31,31,31,32,31,31,30,29,30,29,30,30],\n  1994: [31,31,32,31,31,31,30,29,30,29,30,30],\n  1995: [31,32,31,32,31,30,30,30,29,29,30,30],\n  1996: [31,32,31,32,31,30,30,30,29,30,29,31],\n  1997: [31,31,32,31,31,31,30,29,30,29,30,30],\n  1998: [31,31,32,31,31,31,30,29,30,29,30,30],\n  1999: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2000: [30,32,31,32,31,30,30,30,29,30,29,31],\n  2001: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2002: [31,31,32,32,31,30,30,29,30,29,30,30],\n  2003: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2004: [30,32,31,32,31,30,30,30,29,30,29,31],\n  2005: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2006: [31,31,32,32,31,30,30,29,30,29,30,30],\n  2007: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2008: [31,31,31,32,31,31,29,30,30,29,29,31],\n  2009: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2010: [31,31,32,32,31,30,30,29,30,29,30,30],\n  2011: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2012: [31,31,31,32,31,31,29,30,30,29,30,30],\n  2013: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2014: [31,31,32,32,31,30,30,29,30,29,30,30],\n  2015: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2016: [31,31,31,32,31,31,29,30,30,29,30,30],\n  2017: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2018: [31,32,31,32,31,30,30,29,30,29,30,30],\n  2019: [31,32,31,32,31,30,30,30,29,30,29,31],\n  2020: [31,31,31,32,31,31,30,29,30,29,30,30],\n  2021: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2022: [31,32,31,32,31,30,30,30,29,29,30,30],\n  2023: [31,32,31,32,31,30,30,30,29,30,29,31],\n  2024: [31,31,31,32,31,31,30,29,30,29,30,30],\n  2025: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2026: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2027: [30,32,31,32,31,30,30,30,29,30,29,31],\n  2028: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2029: [31,31,32,31,32,30,30,29,30,29,30,30],\n  2030: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2031: [30,32,31,32,31,30,30,30,29,30,29,31],\n  2032: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2033: [31,31,32,32,31,30,30,29,30,29,30,30],\n  2034: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2035: [30,32,31,32,31,31,29,30,30,29,29,31],\n  2036: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2037: [31,31,32,32,31,30,30,29,30,29,30,30],\n  2038: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2039: [31,31,31,32,31,31,29,30,30,29,30,30],\n  2040: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2041: [31,31,32,32,31,30,30,29,30,29,30,30],\n  2042: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2043: [31,31,31,32,31,31,29,30,30,29,30,30],\n  2044: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2045: [31,32,31,32,31,30,30,29,30,29,30,30],\n  2046: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2047: [31,31,31,32,31,31,30,29,30,29,30,30],\n  2048: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2049: [31,32,31,32,31,30,30,30,29,29,30,30],\n  2050: [31,32,31,32,31,30,30,30,29,30,29,31],\n  2051: [31,31,31,32,31,31,30,29,30,29,30,30],\n  2052: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2053: [31,32,31,32,31,30,30,30,29,29,30,30],\n  2054: [31,32,31,32,31,30,30,30,29,30,29,31],\n  2055: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2056: [31,31,32,31,32,30,30,29,30,29,30,30],\n  2057: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2058: [30,32,31,32,31,30,30,30,29,30,29,31],\n  2059: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2060: [31,31,32,32,31,30,30,29,30,29,30,30],\n  2061: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2062: [30,32,31,32,31,31,29,30,29,30,29,31],\n  2063: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2064: [31,31,32,32,31,30,30,29,30,29,30,30],\n  2065: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2066: [31,31,31,32,31,31,29,30,30,29,29,31],\n  2067: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2068: [31,31,32,32,31,30,30,29,30,29,30,30],\n  2069: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2070: [31,31,31,32,31,31,29,30,30,29,30,30],\n  2071: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2072: [31,32,31,32,31,30,30,29,30,29,30,30],\n  2073: [31,32,31,32,31,30,30,30,29,29,30,31],\n  2074: [31,31,31,32,31,31,30,29,30,29,30,30],\n  2075: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2076: [31,32,31,32,31,30,30,30,29,29,30,30],\n  2077: [31,32,31,32,31,30,30,30,29,30,29,31],\n  2078: [31,31,31,32,31,31,30,29,30,29,30,30],\n  2079: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2080: [31,32,31,32,31,30,30,30,29,29,30,30],\n  2081: [31,32,31,32,31,30,30,30,29,30,29,31],\n  2082: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2083: [31,31,32,31,31,31,30,29,30,29,30,30],\n  2084: [31,31,32,31,31,30,30,30,29,30,30,30],\n  2085: [31,32,31,32,30,31,30,30,29,30,30,30],\n  2086: [30,32,31,32,31,30,30,30,29,30,30,30],\n  2087: [31,31,32,31,31,31,30,30,29,30,30,30],\n  2088: [30,31,32,32,30,31,30,30,29,30,30,30],\n  2089: [30,32,31,32,31,30,30,30,29,30,30,30],\n  2090: [30,32,31,32,31,30,30,30,29,30,30,30],\n  2091: [31,31,32,31,31,31,30,30,29,30,30,30],\n  2092: [30,31,32,32,31,30,30,30,29,30,30,30],\n  2093: [30,32,31,32,31,30,30,30,29,30,30,30],\n  2094: [31,31,32,31,31,30,30,30,29,30,30,30],\n  2095: [31,31,32,31,31,31,30,29,30,30,30,30],\n  2096: [30,31,32,32,31,30,30,29,30,29,30,30],\n  2097: [31,32,31,32,31,30,30,30,29,30,30,30],\n  2098: [31,31,32,31,31,31,29,30,29,30,29,31],\n  2099: [31,31,32,31,31,31,30,29,29,30,30,30],\n  2100: [31,32,31,32,30,31,30,29,30,29,30,30],\n};\n\nexport const BS_MONTH_LENGTHS: readonly (readonly number[])[] = Array.from(\n  { length: BS_YEAR_MAX - BS_YEAR_MIN + 1 },\n  (_, index) => BS_MONTH_LENGTHS_BY_YEAR[BS_YEAR_MIN + index],\n);\n","import {\n  BS_EPOCH_AD,\n  BS_EPOCH_BS,\n  BS_MONTH_LENGTHS_BY_YEAR,\n  BS_YEAR_MAX,\n  BS_YEAR_MIN,\n} from '../calendar-data/bs-month-lengths.js';\nimport type { BsDate, CalendarAdapter, PickerLocale } from '../types.js';\n\nconst BS_MONTHS_EN = ['Baisakh', 'Jestha', 'Ashar', 'Shrawan', 'Bhadra', 'Ashwin', 'Kartik', 'Mangsir', 'Poush', 'Magh', 'Falgun', 'Chaitra'];\nconst BS_MONTHS_NE = ['बैशाख', 'जेठ', 'अषाढ', 'श्रावण', 'भाद्र', 'आश्विन', 'कार्तिक', 'मङ्सिर', 'पौष', 'माघ', 'फाल्गुन', 'चैत्र'];\nconst WEEKDAYS_EN = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst WEEKDAYS_NE = ['आ', 'सो', 'मं', 'बु', 'बि', 'शु', 'श'];\nconst DEVANAGARI_DIGITS: Record<string, string> = {\n  '0': '०',\n  '1': '१',\n  '2': '२',\n  '3': '३',\n  '4': '४',\n  '5': '५',\n  '6': '६',\n  '7': '७',\n  '8': '८',\n  '9': '९',\n};\n\nfunction utcDay(date: Date): number {\n  return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) / 86400000;\n}\n\nfunction dateFromParts(parts: BsDate): Date {\n  return new Date(parts.year, parts.month - 1, parts.day);\n}\n\n// Precomputed cumulative day offsets so BS↔AD conversions are O(1)/O(12) lookups\n// instead of iterating day-by-day from the epoch. Built once from the vendored\n// month-length table at module load.\nconst YEAR_COUNT = BS_YEAR_MAX - BS_YEAR_MIN + 1;\nconst MONTH_CUMULATIVE: number[][] = []; // MONTH_CUMULATIVE[yearIndex][m] = days in that year before month m+1\nconst YEAR_START: number[] = new Array(YEAR_COUNT + 1); // YEAR_START[yearIndex] = days before that year from BS_YEAR_MIN\nYEAR_START[0] = 0;\nfor (let yearIndex = 0; yearIndex < YEAR_COUNT; yearIndex += 1) {\n  const row = BS_MONTH_LENGTHS_BY_YEAR[BS_YEAR_MIN + yearIndex];\n  const cumulative = [0];\n  for (let month = 0; month < 12; month += 1) cumulative.push(cumulative[month] + row[month]);\n  MONTH_CUMULATIVE.push(cumulative);\n  YEAR_START[yearIndex + 1] = YEAR_START[yearIndex] + cumulative[12];\n}\nconst TOTAL_DAYS = YEAR_START[YEAR_COUNT];\n\n// Absolute day number of a BS date, counting from (BS_YEAR_MIN, 1, 1) === day 0.\nfunction absoluteBsDay(year: number, month: number, day: number): number {\n  const yearIndex = year - BS_YEAR_MIN;\n  return YEAR_START[yearIndex] + MONTH_CUMULATIVE[yearIndex][month - 1] + (day - 1);\n}\n\nconst EPOCH_ABSOLUTE = absoluteBsDay(BS_EPOCH_BS.year, BS_EPOCH_BS.month, BS_EPOCH_BS.day);\n\nexport class BsAdCalendarAdapter implements CalendarAdapter {\n  readonly minSupportedYear = BS_YEAR_MIN;\n  readonly maxSupportedYear = BS_YEAR_MAX;\n\n  adToBs(adDate: Date): BsDate {\n    this.assertValidAd(adDate);\n    const diff = utcDay(adDate) - utcDay(dateFromParts(BS_EPOCH_AD));\n    const date = this.bsFromAbsolute(EPOCH_ABSOLUTE + diff);\n    this.assertValidBs(date);\n    return date;\n  }\n\n  bsToAd(year: number, month: number, day: number): Date {\n    this.assertValidBs({ year, month, day });\n    const diff = absoluteBsDay(year, month, day) - EPOCH_ABSOLUTE;\n    const date = dateFromParts(BS_EPOCH_AD);\n    date.setDate(date.getDate() + diff);\n    return date;\n  }\n\n  daysInBsMonth(year: number, month: number): number {\n    const row = BS_MONTH_LENGTHS_BY_YEAR[year];\n    if (!row || month < 1 || month > 12) {\n      throw new RangeError(`Unsupported BS year/month: ${year}-${month}`);\n    }\n    return row[month - 1];\n  }\n\n  todayBs(): BsDate {\n    return this.adToBs(new Date());\n  }\n\n  bsMonthNames(locale: PickerLocale): string[] {\n    return locale === 'ne' ? [...BS_MONTHS_NE] : [...BS_MONTHS_EN];\n  }\n\n  bsWeekdayShort(locale: PickerLocale): string[] {\n    return locale === 'ne' ? [...WEEKDAYS_NE] : [...WEEKDAYS_EN];\n  }\n\n  toLocaleDigits(n: number | string, locale: PickerLocale): string {\n    const value = String(n);\n    if (locale !== 'ne') return value;\n    return value.replace(/[0-9]/g, (digit) => DEVANAGARI_DIGITS[digit] ?? digit);\n  }\n\n  // Resolve an absolute day number (from BS_YEAR_MIN,1,1) back to a BS date.\n  // Out-of-range inputs yield an out-of-range year so assertValidBs rejects them.\n  private bsFromAbsolute(absolute: number): BsDate {\n    if (absolute < 0 || absolute >= TOTAL_DAYS) {\n      return { year: BS_YEAR_MIN - 1, month: 1, day: 1 };\n    }\n    let lo = 0;\n    let hi = YEAR_COUNT;\n    while (lo < hi) {\n      const mid = (lo + hi + 1) >> 1;\n      if (YEAR_START[mid] <= absolute) lo = mid;\n      else hi = mid - 1;\n    }\n    const yearIndex = lo;\n    const remaining = absolute - YEAR_START[yearIndex];\n    const cumulative = MONTH_CUMULATIVE[yearIndex];\n    let month = 1;\n    while (month < 12 && cumulative[month] <= remaining) month += 1;\n    return { year: BS_YEAR_MIN + yearIndex, month, day: remaining - cumulative[month - 1] + 1 };\n  }\n\n  private assertValidAd(adDate: Date): void {\n    if (!(adDate instanceof Date) || Number.isNaN(adDate.getTime())) {\n      throw new TypeError('Expected a valid AD Date');\n    }\n  }\n\n  private assertValidBs(date: BsDate): void {\n    if (date.year < BS_YEAR_MIN || date.year > BS_YEAR_MAX) {\n      throw new RangeError(`BS year ${date.year} is outside supported range ${BS_YEAR_MIN}-${BS_YEAR_MAX}`);\n    }\n    const maxDay = this.daysInBsMonth(date.year, date.month);\n    if (date.day < 1 || date.day > maxDay) {\n      throw new RangeError(`Invalid BS date: ${date.year}-${date.month}-${date.day}`);\n    }\n  }\n}\n\nexport const defaultCalendarAdapter = new BsAdCalendarAdapter();\n","import type { DateMath, DateMathUnit } from '../types.js';\n\nconst TOKEN_PATTERN = /YYYY|MMMM|MM|DD|HH|hh|mm|ss|A|dddd/g;\nexport const GREGORIAN_MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const GREGORIAN_MONTHS_SHORT = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst MONTHS = GREGORIAN_MONTHS;\nconst WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nfunction clone(date: Date): Date {\n  return new Date(date.getTime());\n}\n\nfunction pad2(value: number): string {\n  return String(value).padStart(2, '0');\n}\n\nexport const nativeDateMath: DateMath = {\n  add(date: Date, amount: number, unit: DateMathUnit): Date {\n    const next = clone(date);\n    if (unit === 'day') next.setDate(next.getDate() + amount);\n    if (unit === 'month') next.setMonth(next.getMonth() + amount);\n    if (unit === 'year') next.setFullYear(next.getFullYear() + amount);\n    return next;\n  },\n  diff(a: Date, b: Date): number {\n    const left = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());\n    const right = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());\n    return Math.round((left - right) / 86400000);\n  },\n  format(date: Date, format: string): string {\n    const hour12 = date.getHours() % 12 || 12;\n    return format.replace(TOKEN_PATTERN, (token) => {\n      switch (token) {\n        case 'YYYY': return String(date.getFullYear());\n        case 'MMMM': return MONTHS[date.getMonth()];\n        case 'MM': return pad2(date.getMonth() + 1);\n        case 'DD': return pad2(date.getDate());\n        case 'dddd': return WEEKDAYS[date.getDay()];\n        case 'HH': return pad2(date.getHours());\n        case 'hh': return pad2(hour12);\n        case 'mm': return pad2(date.getMinutes());\n        case 'ss': return pad2(date.getSeconds());\n        case 'A': return date.getHours() >= 12 ? 'PM' : 'AM';\n        default: return token;\n      }\n    });\n  },\n  parse(value: Date | string | number): Date | null {\n    if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : clone(value);\n    if (typeof value === 'number') {\n      const date = new Date(value);\n      return Number.isNaN(date.getTime()) ? null : date;\n    }\n    const relative = value.match(/^([+-])(\\d+)([dmy])$/);\n    if (value === 'today') return new Date();\n    if (relative) {\n      const [, sign, rawAmount, rawUnit] = relative;\n      const amount = Number(rawAmount) * (sign === '-' ? -1 : 1);\n      const unit = rawUnit === 'd' ? 'day' : rawUnit === 'm' ? 'month' : 'year';\n      return nativeDateMath.add(new Date(), amount, unit);\n    }\n    const date = new Date(value);\n    return Number.isNaN(date.getTime()) ? null : date;\n  },\n  startOf(date: Date, unit: DateMathUnit): Date {\n    const next = clone(date);\n    if (unit === 'year') next.setMonth(0, 1);\n    if (unit === 'month') next.setDate(1);\n    next.setHours(0, 0, 0, 0);\n    return next;\n  },\n  endOf(date: Date, unit: DateMathUnit): Date {\n    const next = nativeDateMath.startOf(nativeDateMath.add(date, 1, unit), unit);\n    next.setMilliseconds(-1);\n    return next;\n  },\n  daysInMonth(year: number, month: number): number {\n    return new Date(year, month, 0).getDate();\n  },\n};\n","import type { BsDate, CalendarAdapter, DateRange, DateValue } from '../types.js';\n\nexport function startOfLocalDay(date: Date): Date {\n  return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\nexport function createDateValue(adapter: CalendarAdapter, adDate: Date): DateValue {\n  if (!(adDate instanceof Date) || Number.isNaN(adDate.getTime())) {\n    throw new TypeError('DateValue requires a valid Date');\n  }\n  const ad = startOfLocalDay(adDate);\n  return Object.freeze({ ad, bs: adapter.adToBs(ad) });\n}\n\nexport function dateValueFromBs(adapter: CalendarAdapter, bs: BsDate): DateValue {\n  return createDateValue(adapter, adapter.bsToAd(bs.year, bs.month, bs.day));\n}\n\nexport function compareDateValue(a: DateValue, b: DateValue): number {\n  return a.ad.getTime() - b.ad.getTime();\n}\n\nexport function isSameDateValue(a: DateValue | null | undefined, b: DateValue | null | undefined): boolean {\n  return !!a && !!b && a.ad.getTime() === b.ad.getTime();\n}\n\nexport function createDateRange(start: DateValue, end: DateValue): DateRange {\n  return compareDateValue(start, end) <= 0\n    ? Object.freeze({ start, end })\n    : Object.freeze({ start: end, end: start });\n}\n\nexport function isWithinRange(range: DateRange, date: DateValue): boolean {\n  return date.ad.getTime() >= range.start.ad.getTime() && date.ad.getTime() <= range.end.ad.getTime();\n}\n","import { createDateValue, dateValueFromBs } from '../domain/date-value.js';\nimport type { CalendarAdapter, CalendarMode, DateMath, DateValue } from '../types.js';\n\nexport interface ViewYearMonth {\n  year: number;\n  month: number;\n}\n\n// Year/month of an AD Date, expressed in whichever calendar the active mode\n// navigates — this is what a controller's `viewYear`/`viewMonth` mean.\nexport function viewYearMonthOf(mode: CalendarMode, adapter: CalendarAdapter, date: Date): ViewYearMonth {\n  if (mode === 'AD') return { year: date.getFullYear(), month: date.getMonth() + 1 };\n  const bs = adapter.adToBs(date);\n  return { year: bs.year, month: bs.month };\n}\n\n// AD Date of the 1st of (year, month) as named in the active mode's calendar.\nexport function firstOfViewMonth(mode: CalendarMode, adapter: CalendarAdapter, year: number, month: number): Date {\n  return mode === 'AD' ? new Date(year, month - 1, 1) : adapter.bsToAd(year, month, 1);\n}\n\nexport function daysInViewMonth(mode: CalendarMode, adapter: CalendarAdapter, dateMath: DateMath, year: number, month: number): number {\n  return mode === 'AD' ? dateMath.daysInMonth(year, month) : adapter.daysInBsMonth(year, month);\n}\n\n// AD Date of the last day of (year, month) as named in the active mode's calendar.\nexport function lastOfViewMonth(mode: CalendarMode, adapter: CalendarAdapter, dateMath: DateMath, year: number, month: number): Date {\n  const days = daysInViewMonth(mode, adapter, dateMath, year, month);\n  return mode === 'AD' ? new Date(year, month - 1, days) : adapter.bsToAd(year, month, days);\n}\n\n// Mode-aware year bounds, for clamping navigation and validating typed input.\nexport function viewYearBounds(mode: CalendarMode, adapter: CalendarAdapter): { min: number; max: number } {\n  if (mode === 'BS') return { min: adapter.minSupportedYear, max: adapter.maxSupportedYear };\n  return {\n    min: adapter.bsToAd(adapter.minSupportedYear, 1, 1).getFullYear() + 1,\n    max: adapter.bsToAd(adapter.maxSupportedYear, 1, 1).getFullYear(),\n  };\n}\n\nexport function clampViewYear(mode: CalendarMode, adapter: CalendarAdapter, year: number): number {\n  const { min, max } = viewYearBounds(mode, adapter);\n  return Math.max(min, Math.min(max, year));\n}\n\nexport interface MonthSpan {\n  start: ViewYearMonth;\n  end: ViewYearMonth;\n}\n\n// The span of months in the *other* calendar that (year, month) in `mode`\n// overlaps. A BS month starts and ends mid-Gregorian-month (and vice versa),\n// so a single \"anchor\" month name undersells what a viewed month actually\n// covers — this returns both ends so the UI can show e.g. \"April/May\".\nexport function crossCalendarMonthSpan(mode: CalendarMode, adapter: CalendarAdapter, dateMath: DateMath, year: number, month: number): MonthSpan {\n  const other: CalendarMode = mode === 'AD' ? 'BS' : 'AD';\n  const first = firstOfViewMonth(mode, adapter, year, month);\n  const last = lastOfViewMonth(mode, adapter, dateMath, year, month);\n  return { start: viewYearMonthOf(other, adapter, first), end: viewYearMonthOf(other, adapter, last) };\n}\n\n// Full day-grid for one viewed month, walking the active mode's calendar\n// rather than always BS. Always pads to a fixed 6 rows (42 cells) — not just\n// to a whole week — so the grid (and the popup around it) doesn't change\n// height as you navigate between a 5-row month and a 6-row one.\nexport function buildViewMonthCells(mode: CalendarMode, adapter: CalendarAdapter, dateMath: DateMath, year: number, month: number): Array<DateValue | null> {\n  const days = daysInViewMonth(mode, adapter, dateMath, year, month);\n  const leading = firstOfViewMonth(mode, adapter, year, month).getDay();\n  const cells: Array<DateValue | null> = Array.from({ length: leading }, () => null);\n  for (let day = 1; day <= days; day += 1) {\n    cells.push(mode === 'AD' ? createDateValue(adapter, new Date(year, month - 1, day)) : dateValueFromBs(adapter, { year, month, day }));\n  }\n  while (cells.length < 42) cells.push(null);\n  return cells;\n}\n","import { nativeDateMath } from '../date-math/native-date-math.js';\nimport { startOfLocalDay } from '../domain/date-value.js';\nimport type { DateMath } from '../types.js';\n\n// Resolve a bound that may be a Date, an ISO string, 'today', or a relative\n// token like '+7d' / '-1m' / '+2y' (parsed via DateMath), normalized to the\n// start of its local day.\nexport function resolveBound(value: Date | string | null | undefined, dateMath: DateMath = nativeDateMath): Date | null {\n  if (value == null) return null;\n  const parsed = dateMath.parse(value);\n  return parsed ? startOfLocalDay(parsed) : null;\n}\n\nexport interface DayConstraints {\n  minDate?: Date | string | null;\n  maxDate?: Date | string | null;\n  disabledDates?: (date: Date) => boolean;\n  disabledWeekdays?: number[];\n}\n\n// True when a calendar day should be shown but not selectable.\nexport function isDayDisabled(date: Date, constraints: DayConstraints, dateMath: DateMath = nativeDateMath): boolean {\n  const day = startOfLocalDay(date);\n  const time = day.getTime();\n  const min = resolveBound(constraints.minDate, dateMath);\n  if (min && time < min.getTime()) return true;\n  const max = resolveBound(constraints.maxDate, dateMath);\n  if (max && time > max.getTime()) return true;\n  if (constraints.disabledWeekdays && constraints.disabledWeekdays.includes(day.getDay())) return true;\n  if (constraints.disabledDates && constraints.disabledDates(day)) return true;\n  return false;\n}\n","import type { BsDate, CalendarAdapter, CalendarMode, PickerLocale, ValueFormat } from '../types.js';\n\nconst WEEKDAYS_NE = ['आइतबार', 'सोमबार', 'मङ्गलबार', 'बुधबार', 'बिहिबार', 'शुक्रबार', 'शनिबार'];\nconst WEEKDAYS_EN = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\n// Token positions are found in one pass over the *original* format string, so\n// a resolved value that happens to contain a token-like substring (e.g. the\n// month name \"Ashwin\" starting with the same letter as the \"A\" meridiem\n// token) is never re-scanned and mangled by a later replace pass — unlike\n// chained `.replace(token, value)` calls, which corrupted \"Ashwin 2083\" into\n// \"AMshwin 2083\" once the \"A\" replace ran over the already-substituted string.\nconst TOKEN_PATTERN = /YYYY|MMMM|MM|DD|dddd|HH|hh|mm|ss|A/g;\n\nfunction pad2(value: number): string {\n  return String(value).padStart(2, '0');\n}\n\nexport function formatDateValue(date: Date, adapter: CalendarAdapter, options: {\n  mode?: CalendarMode;\n  format?: string;\n  locale?: PickerLocale;\n} = {}): string {\n  const mode = options.mode ?? 'BS';\n  const locale = options.locale ?? 'en';\n  const format = options.format ?? 'YYYY-MM-DD';\n  const hour12 = date.getHours() % 12 || 12;\n  const bs = mode === 'BS' ? adapter.adToBs(date) : null;\n  const bsMonths = mode === 'BS' ? adapter.bsMonthNames(locale) : null;\n  const adMonths = locale === 'ne' ? adapter.bsMonthNames('ne') : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n  const weekdays = locale === 'ne' ? WEEKDAYS_NE : WEEKDAYS_EN;\n  const raw = format.replace(TOKEN_PATTERN, (token) => {\n    switch (token) {\n      case 'YYYY': return String(bs ? bs.year : date.getFullYear());\n      case 'MMMM': return bs ? (bsMonths![bs.month - 1] ?? String(bs.month)) : (adMonths[date.getMonth()] ?? String(date.getMonth() + 1));\n      case 'MM': return pad2(bs ? bs.month : date.getMonth() + 1);\n      case 'DD': return pad2(bs ? bs.day : date.getDate());\n      case 'dddd': return weekdays[date.getDay()] ?? '';\n      case 'HH': return pad2(date.getHours());\n      case 'hh': return pad2(hour12);\n      case 'mm': return pad2(date.getMinutes());\n      case 'ss': return pad2(date.getSeconds());\n      case 'A': return date.getHours() >= 12 ? 'PM' : 'AM';\n      default: return token;\n    }\n  });\n  return locale === 'ne' ? adapter.toLocaleDigits(raw, locale) : raw;\n}\n\nexport function parseDateValue(value: Date | string | number | null | undefined): Date | null {\n  if (value == null) return null;\n  if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : new Date(value);\n  const date = new Date(value);\n  return Number.isNaN(date.getTime()) ? null : date;\n}\n\nexport function formatRange(start: Date, end: Date, adapter: CalendarAdapter, options: {\n  mode?: CalendarMode;\n  format?: string;\n  separator?: string;\n  locale?: PickerLocale;\n} = {}): string {\n  const separator = options.separator ?? ' – ';\n  return [\n    formatDateValue(start, adapter, options),\n    formatDateValue(end, adapter, options),\n  ].join(separator);\n}\n\n/** Resolve the machine (\"server\") value for one date, independent of the\n *  display calendar/format. Defaults to AD ISO. Built from local `ad`\n *  components (no `toISOString()` → no timezone shift). */\nexport function formatMachineValue(\n  parts: { ad: Date; bs: BsDate; time?: { hour: number; minute: number; second?: number } },\n  format: ValueFormat,\n  adapter: CalendarAdapter,\n  withTime = false,\n): string | number | Date {\n  if (typeof format === 'object') {\n    return formatDateValue(parts.ad, adapter, { mode: format.calendar, format: format.format, locale: 'en' });\n  }\n  if (format === 'timestamp') return parts.ad.getTime();\n  if (format === 'date-object') return parts.ad;\n  const time = withTime && parts.time ? `${pad2(parts.time.hour)}:${pad2(parts.time.minute)}` : '';\n  if (format === 'iso-bs') {\n    const date = `${parts.bs.year}-${pad2(parts.bs.month)}-${pad2(parts.bs.day)}`;\n    return time ? `${date} ${time}` : date;\n  }\n  // 'iso' (default) — AD ISO from local components.\n  const ad = parts.ad;\n  const date = `${ad.getFullYear()}-${pad2(ad.getMonth() + 1)}-${pad2(ad.getDate())}`;\n  return time ? `${date}T${time}` : date;\n}\n\n/** Coerce a machine value into a string for a DOM/form field (Date → AD ISO). */\nexport function stringifyMachineValue(value: string | number | Date): string {\n  if (value instanceof Date) {\n    return `${value.getFullYear()}-${pad2(value.getMonth() + 1)}-${pad2(value.getDate())}`;\n  }\n  return String(value);\n}\n","import type { DateMath, DateRangePickerOptions, PresetContext, PresetDefinition } from '../types.js';\nimport type { CalendarAdapter } from '../types.js';\n\nfunction fiscalYearStartFor(bsYear: number, bsMonth: number, fiscalStartMonth: number): number {\n  return bsMonth >= fiscalStartMonth ? bsYear : bsYear - 1;\n}\n\nfunction fiscalYearRange(adapter: CalendarAdapter, fyStartYear: number, fiscalStartMonth: number): { start: Date; end: Date } {\n  const start = adapter.bsToAd(fyStartYear, fiscalStartMonth, 1);\n  const endYear = fiscalStartMonth === 1 ? fyStartYear : fyStartYear + 1;\n  const endMonth = fiscalStartMonth === 1 ? 12 : fiscalStartMonth - 1;\n  const endDay = adapter.daysInBsMonth(endYear, endMonth);\n  return { start, end: adapter.bsToAd(endYear, endMonth, endDay) };\n}\n\nexport function buildDefaultPresets(options: DateRangePickerOptions, adapter: CalendarAdapter, dateMath: DateMath): PresetDefinition[] {\n  const fiscalStartMonth = options.fiscalStartMonth ?? 4;\n  const lookback = options.fiscalYearLookback ?? 5;\n  const today = new Date();\n  const todayBs = adapter.adToBs(today);\n  const fyStart = fiscalYearStartFor(todayBs.year, todayBs.month, fiscalStartMonth);\n  const ctx: PresetContext = { today, fiscalStartMonth, adapter, dateMath };\n\n  const range = (id: string, label: string, resolve: (ctx: PresetContext) => { start: Date; end: Date }): PresetDefinition => ({\n    id,\n    label,\n    kind: 'range',\n    resolve,\n  });\n\n  const fyItems = Array.from({ length: lookback }, (_, index) => {\n    const year = fyStart - index;\n    return range(`fy-${year}`, `${year}/${String((year + 1) % 100).padStart(2, '0')} BS`, () => fiscalYearRange(adapter, year, fiscalStartMonth));\n  });\n\n  const items: PresetDefinition[] = [\n    range('today', 'Today', ({ today }) => ({ start: today, end: today })),\n    range('last7', 'Last 7 days', ({ today, dateMath }) => ({ start: dateMath.add(today, -7, 'day'), end: today })),\n    range('last15', 'Last 15 days', ({ today, dateMath }) => ({ start: dateMath.add(today, -15, 'day'), end: today })),\n    range('last30', 'Last 30 days', ({ today, dateMath }) => ({ start: dateMath.add(today, -30, 'day'), end: today })),\n    range('last45', 'Last 45 days', ({ today, dateMath }) => ({ start: dateMath.add(today, -45, 'day'), end: today })),\n    range('last60', 'Last 60 days', ({ today, dateMath }) => ({ start: dateMath.add(today, -60, 'day'), end: today })),\n    range('fytd', 'This Fiscal Year to Date', () => ({ start: adapter.bsToAd(fyStart, fiscalStartMonth, 1), end: today })),\n    { id: 'fiscalYear', label: 'Fiscal Year', kind: 'submenu', items: fyItems },\n    { id: 'month', label: 'Pick a Month', kind: 'submenu', items: [] },\n    { id: 'custom', label: 'Custom Range', kind: 'submenu', items: [] },\n  ];\n\n  return items.map((preset) => {\n    if (preset.kind !== 'range' || !preset.resolve) return preset;\n    const resolve = preset.resolve;\n    return { ...preset, resolve: () => resolve(ctx) };\n  });\n}\n\nexport function normalizePresets(options: DateRangePickerOptions, adapter: CalendarAdapter, dateMath: DateMath): PresetDefinition[] {\n  if (options.ranges) {\n    return Object.entries(options.ranges).map(([label, [start, end]]) => ({\n      id: label.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, ''),\n      label,\n      kind: 'range',\n      resolve: () => ({ start, end }),\n    }));\n  }\n  if (options.presets === false) return [];\n  if (Array.isArray(options.presets)) return options.presets;\n  return buildDefaultPresets(options, adapter, dateMath);\n}\n","import { defaultCalendarAdapter } from '../adapters/bs-ad-calendar-adapter.js';\nimport { nativeDateMath } from '../date-math/native-date-math.js';\nimport { buildViewMonthCells, clampViewYear, firstOfViewMonth, lastOfViewMonth, viewYearBounds, viewYearMonthOf } from './calendar-view.js';\nimport { isDayDisabled, resolveBound } from './constraints.js';\nimport { createDateRange, createDateValue, dateValueFromBs, isSameDateValue } from '../domain/date-value.js';\nimport { formatRange, formatMachineValue, stringifyMachineValue } from '../format/index.js';\nimport type { CalendarMode, DateRange, DateRangePickerOptions, DateRangeResult, DateValue, PickerInstance, PresetDefinition } from '../types.js';\nimport { normalizePresets } from './presets.js';\n\nexport interface DateRangeControllerState {\n  isOpen: boolean;\n  mode: CalendarMode;\n  allowModeToggle: boolean;\n  showSecondaryCalendar: boolean;\n  viewYear: number;\n  viewMonth: number;\n  range: DateRange | null;\n  pendingStart: DateValue | null;\n  hoverDate: DateValue | null;\n  activePresetId: string | null;\n  openSubmenuId: string | null;\n  view: 'day' | 'month' | 'year';\n  yearGroupStart: number;\n  // Internal: 'month' while the \"Pick a Month\" preset is active (whole-month\n  // selection). Driven by the preset rail, not a public option.\n  selectionUnit: 'day' | 'month';\n}\n\nexport interface DateRangeController extends PickerInstance<DateRangeResult, DateRangePickerOptions> {\n  getState(): DateRangeControllerState;\n  getPresets(): PresetDefinition[];\n  getToday(): DateValue;\n  selectDay(value: DateValue): void;\n  hoverDay(value: DateValue | null): void;\n  selectMonth(year: number, month: number): void;\n  isMonthDisabled(year: number, month: number): boolean;\n  startMonthSelect(): void;\n  navigateMonth(delta: number): void;\n  navigateYear(delta: number): void;\n  navigateYearGroup(delta: number): void;\n  setView(view: 'day' | 'month' | 'year'): void;\n  selectMonthView(month: number): void;\n  selectYearView(year: number): void;\n  toggleMode(): void;\n  selectPreset(id: string): void;\n  selectSubmenuItem(submenuId: string, itemId: string): void;\n  toggleSubmenu(id: string): void;\n  startCustomRange(): void;\n  apply(): void;\n  isDisabled(value: DateValue): boolean;\n  validateTyped(text: string): 'valid' | 'invalid' | 'empty';\n  commitTyped(text: string): 'valid' | 'invalid' | 'empty';\n  typedString(): string;\n  typedReference(): string;\n  yearBounds(): { min: number; max: number };\n  cellForBs(year: number, month: number, day: number): DateValue;\n  buildMonthCells(year: number, month: number): Array<DateValue | null>;\n}\n\nexport function createDateRangeController(initialOptions: DateRangePickerOptions = {}): DateRangeController {\n  let options = { ...initialOptions };\n  const adapter = options.adapter ?? defaultCalendarAdapter;\n  const dateMath = options.dateMath ?? nativeDateMath;\n  let presets = normalizePresets(options, adapter, dateMath);\n  let listeners: Array<(value: DateRangeResult) => void> = [];\n  let stateListeners: Array<() => void> = [];\n  const today = createDateValue(adapter, new Date());\n  // A range is shown only when explicitly provided via value/defaultValue, or\n  // when a defaultPresetId names a preset. Otherwise the picker starts empty and\n  // the calendar just opens on the current month.\n  const providedRange = options.value !== undefined ? options.value : options.defaultValue;\n  const initialRange = providedRange ?? (options.defaultPresetId ? resolvePresetRange(options.defaultPresetId) : null);\n  const viewAnchor = initialRange ?? resolveInitialRange();\n  const initialMode: CalendarMode = options.mode ?? 'BS';\n  const initialView = viewYearMonthOf(initialMode, adapter, viewAnchor.end);\n\n  let state: DateRangeControllerState = {\n    isOpen: false,\n    mode: initialMode,\n    allowModeToggle: options.allowModeToggle !== false,\n    showSecondaryCalendar: options.showSecondaryCalendar !== false,\n    viewYear: initialView.year,\n    viewMonth: initialView.month,\n    range: initialRange ? createDateRange(createDateValue(adapter, initialRange.start), createDateValue(adapter, initialRange.end)) : null,\n    pendingStart: null,\n    hoverDate: null,\n    activePresetId: providedRange ? null : (options.defaultPresetId ?? null),\n    openSubmenuId: null,\n    view: 'day',\n    yearGroupStart: initialView.year - 6,\n    selectionUnit: 'day',\n  };\n\n  // Mode-aware: \"Pick a Month\" spans a whole BS month when mode is BS, or a\n  // whole Gregorian month when mode is AD — whichever calendar is active.\n  const firstOfMonth = (year: number, month: number): DateValue => createDateValue(adapter, firstOfViewMonth(state.mode, adapter, year, month));\n  const lastOfMonth = (year: number, month: number): DateValue => createDateValue(adapter, lastOfViewMonth(state.mode, adapter, dateMath, year, month));\n\n  const pad2 = (n: number): string => String(n).padStart(2, '0');\n\n  // Mode-aware ASCII `YYYY-MM-DD` for one endpoint.\n  function dvToAscii(value: DateValue): string {\n    return state.mode === 'BS'\n      ? `${value.bs.year}-${pad2(value.bs.month)}-${pad2(value.bs.day)}`\n      : `${value.ad.getFullYear()}-${pad2(value.ad.getMonth() + 1)}-${pad2(value.ad.getDate())}`;\n  }\n\n  // Build one endpoint from typed parts (mode-aware), or null if impossible.\n  function parseTypedDay(year: number, month: number, day: number): DateValue | null {\n    try {\n      if (state.mode === 'BS') {\n        if (year < adapter.minSupportedYear || year > adapter.maxSupportedYear) return null;\n        if (month < 1 || month > 12) return null;\n        if (day < 1 || day > adapter.daysInBsMonth(year, month)) return null;\n        return dateValueFromBs(adapter, { year, month, day });\n      }\n      if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n      const ad = new Date(year, month - 1, day);\n      if (ad.getFullYear() !== year || ad.getMonth() !== month - 1 || ad.getDate() !== day) return null;\n      return createDateValue(adapter, ad);\n    } catch {\n      return null;\n    }\n  }\n\n  // Parse a full `YYYY-MM-DD – YYYY-MM-DD` string into an ordered, allowed range.\n  function parseTypedRange(text: string): DateRange | null {\n    const m = /^\\s*(\\d{1,4})-(\\d{1,2})-(\\d{1,2})\\s+–\\s+(\\d{1,4})-(\\d{1,2})-(\\d{1,2})\\s*$/.exec(text);\n    if (!m) return null;\n    const start = parseTypedDay(Number(m[1]), Number(m[2]), Number(m[3]));\n    const end = parseTypedDay(Number(m[4]), Number(m[5]), Number(m[6]));\n    if (!start || !end) return null;\n    if (controller.isDisabled(start) || controller.isDisabled(end)) return null;\n    return createDateRange(start, end);\n  }\n\n  function clampYear(year: number): number {\n    return clampViewYear(state.mode, adapter, year);\n  }\n\n  // Re-express the currently viewed month in a new mode, anchored on the same\n  // real month so toggling BS/AD doesn't jump the calendar to an unrelated page.\n  function reviewInMode(nextMode: CalendarMode): Pick<DateRangeControllerState, 'mode' | 'viewYear' | 'viewMonth' | 'yearGroupStart'> {\n    const anchor = firstOfViewMonth(state.mode, adapter, state.viewYear, state.viewMonth);\n    const view = viewYearMonthOf(nextMode, adapter, anchor);\n    return { mode: nextMode, viewYear: view.year, viewMonth: view.month, yearGroupStart: clampViewYear(nextMode, adapter, view.year - 6) };\n  }\n\n  function resolveInitialRange(): { start: Date; end: Date } {\n    const firstRange = presets.find((preset) => preset.kind === 'range' && preset.resolve);\n    return firstRange?.resolve?.({ today: new Date(), fiscalStartMonth: options.fiscalStartMonth ?? 4, adapter, dateMath }) ?? { start: new Date(), end: new Date() };\n  }\n\n  // Resolve a named preset (top-level or submenu item) to its range, or null.\n  function resolvePresetRange(id: string): { start: Date; end: Date } | null {\n    const find = (list: PresetDefinition[]): PresetDefinition | null => {\n      for (const preset of list) {\n        if (preset.id === id && preset.resolve) return preset;\n        const nested = preset.items ? find(preset.items) : null;\n        if (nested) return nested;\n      }\n      return null;\n    };\n    const preset = find(presets);\n    if (!preset?.resolve) return null;\n    const r = preset.resolve({ today: new Date(), fiscalStartMonth: options.fiscalStartMonth ?? 4, adapter, dateMath });\n    return { start: r.start, end: r.end };\n  }\n\n  function setState(patch: Partial<DateRangeControllerState>): void {\n    state = { ...state, ...patch };\n    stateListeners.forEach((listener) => listener());\n  }\n\n  function toResult(range: DateRange): DateRangeResult {\n    const vf = options.valueFormat ?? 'iso';\n    const startValue = formatMachineValue({ ad: range.start.ad, bs: range.start.bs }, vf, adapter);\n    const endValue = formatMachineValue({ ad: range.end.ad, bs: range.end.bs }, vf, adapter);\n    return {\n      start: range.start.ad,\n      end: range.end.ad,\n      startBs: range.start.bs,\n      endBs: range.end.bs,\n      formatted: formatRange(range.start.ad, range.end.ad, adapter, {\n        mode: state.mode,\n        format: options.displayFormat ?? options.locale?.format ?? 'YYYY-MM-DD',\n        separator: options.locale?.separator,\n        locale: 'en',\n      }),\n      startValue,\n      endValue,\n      value: `${stringifyMachineValue(startValue)},${stringifyMachineValue(endValue)}`,\n    };\n  }\n\n  function emit(range: DateRange): void {\n    const result = toResult(range);\n    options.onApply?.(result);\n    listeners.forEach((listener) => listener(result));\n  }\n\n  const controller: DateRangeController = {\n    getState: () => state,\n    getPresets: () => presets,\n    getToday: () => today,\n    getValue: () => (state.range ? toResult(state.range) : null),\n    setValue(value) {\n      setState({\n        range: value ? createDateRange(createDateValue(adapter, value.start), createDateValue(adapter, value.end)) : null,\n        pendingStart: null,\n        hoverDate: null,\n      });\n    },\n    show() {\n      if (!state.isOpen) {\n        setState({ isOpen: true });\n        options.onOpen?.();\n      }\n    },\n    hide() {\n      if (state.isOpen) {\n        setState({ isOpen: false, pendingStart: null, hoverDate: null, openSubmenuId: null });\n        options.onClose?.();\n      }\n    },\n    update(patch) {\n      options = { ...options, ...patch };\n      presets = normalizePresets(options, adapter, dateMath);\n      const next: Partial<DateRangeControllerState> = {};\n      if ('mode' in patch) {\n        const nextMode = options.mode ?? 'BS';\n        if (nextMode !== state.mode) Object.assign(next, reviewInMode(nextMode));\n      }\n      if ('allowModeToggle' in patch) next.allowModeToggle = options.allowModeToggle !== false;\n      if ('showSecondaryCalendar' in patch) next.showSecondaryCalendar = options.showSecondaryCalendar !== false;\n      setState(next);\n    },\n    destroy() {\n      listeners = [];\n      stateListeners = [];\n    },\n    onChange(cb) {\n      listeners.push(cb);\n      return () => {\n        listeners = listeners.filter((listener) => listener !== cb);\n      };\n    },\n    selectDay(value) {\n      if (controller.isDisabled(value)) return;\n      if (!state.pendingStart) {\n        setState({ pendingStart: value, range: null, activePresetId: null, hoverDate: null });\n        options.onChange?.({ start: value.ad });\n        return;\n      }\n      const range = createDateRange(state.pendingStart, value);\n      setState({ range, pendingStart: null, hoverDate: null, activePresetId: null });\n      options.onChange?.({ start: range.start.ad, end: range.end.ad });\n      if (options.autoApply) controller.apply();\n    },\n    hoverDay(value) {\n      // Only react when the hovered day actually changes. Without this guard,\n      // re-rendering the cell under the cursor makes the browser re-fire\n      // mouseenter on the replacement node → an infinite render loop that makes\n      // the calendar impossible to click. Also a no-op before the first click.\n      const next = state.pendingStart ? value : null;\n      if (next === state.hoverDate) return;\n      if (next && state.hoverDate && isSameDateValue(next, state.hoverDate)) return;\n      setState({ hoverDate: next });\n    },\n    // A single click selects the whole BS month: the range spans its first day\n    // to its last day. This is the \"quickly pick a month\" shortcut.\n    selectMonth(year, month) {\n      if (controller.isMonthDisabled(year, month)) return;\n      const range = createDateRange(firstOfMonth(year, month), lastOfMonth(year, month));\n      setState({ range, pendingStart: null, hoverDate: null, viewYear: year, viewMonth: month });\n      options.onChange?.({ start: range.start.ad, end: range.end.ad });\n      if (options.autoApply) controller.apply();\n    },\n    isMonthDisabled(year, month) {\n      const min = resolveBound(options.minDate, dateMath);\n      const max = resolveBound(options.maxDate, dateMath);\n      if (min && lastOfMonth(year, month).ad.getTime() < min.getTime()) return true;\n      if (max && firstOfMonth(year, month).ad.getTime() > max.getTime()) return true;\n      return false;\n    },\n    // Activated by the \"Pick a Month\" entry in the presets rail: switch the grid\n    // to whole-month selection.\n    startMonthSelect() {\n      setState({ activePresetId: 'month', selectionUnit: 'month', pendingStart: null, hoverDate: null, range: null, openSubmenuId: null, view: 'day' });\n    },\n    navigateMonth(delta) {\n      let year = state.viewYear;\n      let month = state.viewMonth + delta;\n      while (month > 12) { month -= 12; year += 1; }\n      while (month < 1) { month += 12; year -= 1; }\n      setState({ viewYear: year, viewMonth: month });\n    },\n    navigateYear(delta) {\n      setState({ viewYear: clampYear(state.viewYear + delta) });\n    },\n    navigateYearGroup(delta) {\n      setState({ yearGroupStart: clampYear(state.yearGroupStart + delta * 12) });\n    },\n    setView(view) {\n      setState(view === 'year' ? { view, yearGroupStart: clampYear(state.viewYear - 6) } : { view });\n    },\n    selectMonthView(month) {\n      setState({ viewMonth: month, view: 'day' });\n    },\n    selectYearView(year) {\n      setState({ viewYear: clampYear(year), view: 'month' });\n    },\n    toggleMode() {\n      if (!state.allowModeToggle) return;\n      setState(reviewInMode(state.mode === 'BS' ? 'AD' : 'BS'));\n    },\n    selectPreset(id) {\n      const preset = presets.find((item) => item.id === id);\n      if (!preset?.resolve) return;\n      const resolved = preset.resolve({ today: new Date(), fiscalStartMonth: options.fiscalStartMonth ?? 4, adapter, dateMath });\n      const range = createDateRange(createDateValue(adapter, resolved.start), createDateValue(adapter, resolved.end));\n      const view = viewYearMonthOf(state.mode, adapter, range.end.ad);\n      setState({ range, activePresetId: id, selectionUnit: 'day', pendingStart: null, hoverDate: null, viewYear: view.year, viewMonth: view.month, openSubmenuId: null });\n      options.onChange?.({ start: range.start.ad, end: range.end.ad });\n    },\n    selectSubmenuItem(submenuId, itemId) {\n      const item = presets.find((preset) => preset.id === submenuId)?.items?.find((preset) => preset.id === itemId);\n      if (!item?.resolve) return;\n      const resolved = item.resolve({ today: new Date(), fiscalStartMonth: options.fiscalStartMonth ?? 4, adapter, dateMath });\n      const range = createDateRange(createDateValue(adapter, resolved.start), createDateValue(adapter, resolved.end));\n      const view = viewYearMonthOf(state.mode, adapter, range.end.ad);\n      setState({ range, activePresetId: itemId, selectionUnit: 'day', pendingStart: null, hoverDate: null, viewYear: view.year, viewMonth: view.month, openSubmenuId: null });\n    },\n    toggleSubmenu(id) {\n      setState({ openSubmenuId: state.openSubmenuId === id ? null : id });\n    },\n    startCustomRange() {\n      setState({\n        activePresetId: 'custom',\n        selectionUnit: 'day',\n        pendingStart: null,\n        hoverDate: null,\n        range: null,\n        openSubmenuId: null,\n      });\n      options.onChange?.({});\n    },\n    apply() {\n      if (!state.range) return;\n      emit(state.range);\n      controller.hide();\n    },\n    isDisabled(value) {\n      return isDayDisabled(value.ad, options, dateMath);\n    },\n    yearBounds() {\n      return viewYearBounds(state.mode, adapter);\n    },\n    typedString: () => (state.range ? `${dvToAscii(state.range.start)} – ${dvToAscii(state.range.end)}` : ''),\n    typedReference() {\n      const r = state.range ?? { start: today, end: today };\n      return `${dvToAscii(r.start)} – ${dvToAscii(r.end)}`;\n    },\n    // Parse `YYYY-MM-DD – YYYY-MM-DD` (mode-aware); both ends must be valid and\n    // allowed. Start after end is tolerated (createDateRange orders them).\n    validateTyped(text) {\n      if (text.trim() === '') return 'empty';\n      return parseTypedRange(text) ? 'valid' : 'invalid';\n    },\n    commitTyped(text) {\n      if (text.trim() === '') {\n        if (state.range) setState({ range: null, pendingStart: null, hoverDate: null });\n        return 'empty';\n      }\n      const range = parseTypedRange(text);\n      if (!range) return 'invalid';\n      const view = viewYearMonthOf(state.mode, adapter, range.end.ad);\n      setState({ range, pendingStart: null, hoverDate: null, activePresetId: null, selectionUnit: 'day', viewYear: view.year, viewMonth: view.month });\n      options.onChange?.({ start: range.start.ad, end: range.end.ad });\n      emit(range);\n      return 'valid';\n    },\n    cellForBs(year, month, day) {\n      return dateValueFromBs(adapter, { year, month, day });\n    },\n    buildMonthCells(year, month) {\n      return buildViewMonthCells(state.mode, adapter, dateMath, year, month);\n    },\n  };\n\n  (controller as unknown as { onStateChange: (cb: () => void) => () => void }).onStateChange = (cb: () => void) => {\n    stateListeners.push(cb);\n    return () => {\n      stateListeners = stateListeners.filter((listener) => listener !== cb);\n    };\n  };\n\n  return controller;\n}\n\nexport function previewRange(state: DateRangeControllerState): DateRange | null {\n  if (state.pendingStart && state.hoverDate) return createDateRange(state.pendingStart, state.hoverDate);\n  return state.range;\n}\n\nexport function isRangeBoundary(range: DateRange | null, value: DateValue): 'start' | 'end' | null {\n  if (!range) return null;\n  if (isSameDateValue(range.start, value)) return 'start';\n  if (isSameDateValue(range.end, value)) return 'end';\n  return null;\n}\n","// Parsing + input-masking helpers for typeable date/datetime fields.\n// The canonical typing format is always `YYYY-MM-DD` (date) or\n// `YYYY-MM-DD HH:mm` (datetime), independent of the display format, so parsing\n// stays unambiguous. Both ASCII and Devanagari digits are accepted.\n\nconst DEVANAGARI_TO_ASCII: Record<string, string> = {\n  '०': '0', '१': '1', '२': '2', '३': '3', '४': '4',\n  '५': '5', '६': '6', '७': '7', '८': '8', '९': '9',\n};\n\n/** Convert any Devanagari digits in the string to their ASCII equivalents. */\nexport function normalizeDigits(text: string): string {\n  return text.replace(/[०-९]/g, (d) => DEVANAGARI_TO_ASCII[d] ?? d);\n}\n\nexport interface TypedTokens {\n  year: number;\n  month: number;\n  day: number;\n  hour?: number;\n  minute?: number;\n}\n\n/** Split a typed string into numeric parts without any calendar validation.\n *  Returns `'empty'` for blank input and `null` for a shape that can't be a\n *  date at all. Calendar-range validation is the caller's job. */\nexport function tokenizeTyped(text: string): TypedTokens | 'empty' | null {\n  const s = normalizeDigits(text).trim();\n  if (s === '') return 'empty';\n  const m = s.match(/^(\\d{1,4})[-/.](\\d{1,2})[-/.](\\d{1,2})(?:[ T](\\d{1,2}):(\\d{1,2}))?$/);\n  if (!m) return null;\n  const tokens: TypedTokens = { year: Number(m[1]), month: Number(m[2]), day: Number(m[3]) };\n  if (m[4] != null) {\n    tokens.hour = Number(m[4]);\n    tokens.minute = Number(m[5]);\n  }\n  return tokens;\n}\n\n/** Reformat raw input into the masked `YYYY-MM-DD[ HH:mm]` shape as the user\n *  types: keep only digits (normalizing Nepali → ASCII) and re-insert the fixed\n *  separators. Extra digits past the template are dropped. */\nexport function maskTypedDate(text: string, withTime: boolean): string {\n  const digits = normalizeDigits(text).replace(/\\D/g, '');\n  const segments = withTime ? [4, 2, 2, 2, 2] : [4, 2, 2];\n  const separators = withTime ? ['', '-', '-', ' ', ':'] : ['', '-', '-'];\n  let out = '';\n  let i = 0;\n  for (let s = 0; s < segments.length && i < digits.length; s += 1) {\n    out += separators[s] + digits.slice(i, i + segments[s]);\n    i += segments[s];\n  }\n  return out;\n}\n\n/** Count the digit characters in a string (used for caret preservation). */\nexport function countDigits(text: string): number {\n  return (normalizeDigits(text).match(/\\d/g) ?? []).length;\n}\n","import { defaultCalendarAdapter } from '../adapters/bs-ad-calendar-adapter.js';\nimport { nativeDateMath } from '../date-math/native-date-math.js';\nimport { buildViewMonthCells, clampViewYear, firstOfViewMonth, viewYearBounds, viewYearMonthOf } from './calendar-view.js';\nimport { isDayDisabled } from './constraints.js';\nimport { createDateValue, dateValueFromBs } from '../domain/date-value.js';\nimport { formatDateValue, formatMachineValue } from '../format/index.js';\nimport { tokenizeTyped } from '../format/parse.js';\nimport type { CalendarMode, DateTimePickerOptions, DateTimeResult, DateValue, PickerInstance, TimeValue } from '../types.js';\n\nexport interface DateTimeControllerState {\n  isOpen: boolean;\n  mode: CalendarMode;\n  allowModeToggle: boolean;\n  showSecondaryCalendar: boolean;\n  viewYear: number;\n  viewMonth: number;\n  selected: DateValue | null;\n  time: Required<TimeValue> | null;\n  view: 'day' | 'month' | 'year';\n  yearGroupStart: number;\n  timeFormat: '12h' | '24h';\n  minuteStep: number;\n}\n\nexport interface DateTimeController extends PickerInstance<DateTimeResult, DateTimePickerOptions> {\n  getState(): DateTimeControllerState;\n  /**\n   * Accepts a raw AD `Date` (mirrors the `value` option and what framework\n   * wrappers hold), a result-shaped `{ ad: Date }` (what `getValue()` returns,\n   * so the value round-trips), or `null` to clear.\n   */\n  setValue(value: Date | DateTimeResult | { ad: Date } | null): void;\n  selectDay(value: DateValue): void;\n  goToday(): void;\n  setTime(hour: number, minute: number, second?: number): void;\n  setHour(hour24: number): boolean;\n  setMinute(minute: number): boolean;\n  stepHour(delta: number): void;\n  stepMinute(delta: number): void;\n  toggleMeridiem(): void;\n  setTimeToNow(): void;\n  confirm(): void;\n  clear(): void;\n  navigateMonth(delta: number): void;\n  navigateYear(delta: number): void;\n  navigateYearGroup(delta: number): void;\n  setView(view: 'day' | 'month' | 'year'): void;\n  selectMonthView(month: number): void;\n  selectYearView(year: number): void;\n  toggleMode(): void;\n  isDisabled(value: DateValue): boolean;\n  validateTyped(text: string): 'valid' | 'invalid' | 'empty';\n  commitTyped(text: string): 'valid' | 'invalid' | 'empty';\n  typedString(): string;\n  typedReference(): string;\n  yearBounds(): { min: number; max: number };\n  isHourDisabled(hour: number): boolean;\n  isMinuteDisabled(hour: number, minute: number): boolean;\n  cellForBs(year: number, month: number, day: number): DateValue;\n  buildMonthCells(year: number, month: number): Array<DateValue | null>;\n}\n\nexport function createDateTimeController(initialOptions: DateTimePickerOptions = {}): DateTimeController {\n  let options = { ...initialOptions };\n  const adapter = options.adapter ?? defaultCalendarAdapter;\n  let listeners: Array<(value: DateTimeResult) => void> = [];\n  let stateListeners: Array<() => void> = [];\n  // A value is selected only when `value`/`defaultValue` is explicitly provided;\n  // otherwise the field starts empty. The calendar still opens on today's month.\n  const providedValue = options.value !== undefined ? options.value : options.defaultValue;\n  const initialDate = providedValue ?? new Date();\n  const initialValue = createDateValue(adapter, initialDate);\n  const defaultTime = options.defaultTime ?? { hour: initialDate.getHours(), minute: initialDate.getMinutes(), second: initialDate.getSeconds() };\n  const initialMode: CalendarMode = options.mode ?? 'BS';\n  const initialView = viewYearMonthOf(initialMode, adapter, initialValue.ad);\n\n  let state: DateTimeControllerState = {\n    isOpen: false,\n    mode: initialMode,\n    allowModeToggle: options.allowModeToggle !== false,\n    showSecondaryCalendar: options.showSecondaryCalendar !== false,\n    viewYear: initialView.year,\n    viewMonth: initialView.month,\n    selected: providedValue ? initialValue : null,\n    time: options.withTime ? { hour: defaultTime.hour, minute: defaultTime.minute, second: 0 } : null,\n    view: 'day',\n    yearGroupStart: initialView.year - 6,\n    timeFormat: options.timeFormat ?? '24h',\n    minuteStep: options.minuteStep && options.minuteStep > 0 ? options.minuteStep : 1,\n  };\n\n  function setState(patch: Partial<DateTimeControllerState>): void {\n    state = { ...state, ...patch };\n    stateListeners.forEach((listener) => listener());\n  }\n\n  function clampYear(year: number): number {\n    return clampViewYear(state.mode, adapter, year);\n  }\n\n  // Re-express the currently viewed month in a new mode, anchored on the same\n  // real month so toggling BS/AD doesn't jump the calendar to an unrelated page.\n  function reviewInMode(nextMode: CalendarMode): Pick<DateTimeControllerState, 'mode' | 'viewYear' | 'viewMonth' | 'yearGroupStart'> {\n    const anchor = firstOfViewMonth(state.mode, adapter, state.viewYear, state.viewMonth);\n    const view = viewYearMonthOf(nextMode, adapter, anchor);\n    return { mode: nextMode, viewYear: view.year, viewMonth: view.month, yearGroupStart: clampViewYear(nextMode, adapter, view.year - 6) };\n  }\n\n  // Wrap a value into [0, size) so spinners roll over (23:00 + 1h → 00:00).\n  function wrap(value: number, size: number): number {\n    return ((value % size) + size) % size;\n  }\n\n  // Keep a time within optional minTime/maxTime bounds (absolute, per spec).\n  function clampTime(time: Required<TimeValue>): Required<TimeValue> {\n    if (!options.minTime && !options.maxTime) return time;\n    const minutesOfDay = time.hour * 60 + time.minute;\n    const lo = options.minTime ? options.minTime.hour * 60 + (options.minTime.minute ?? 0) : 0;\n    const hi = options.maxTime ? options.maxTime.hour * 60 + (options.maxTime.minute ?? 0) : 24 * 60 - 1;\n    const clamped = Math.max(lo, Math.min(hi, minutesOfDay));\n    if (clamped === minutesOfDay) return time;\n    return { hour: Math.floor(clamped / 60), minute: clamped % 60, second: time.second };\n  }\n\n  function commitTime(next: Required<TimeValue>): void {\n    setState({ time: clampTime(next) });\n  }\n\n  // Absolute minute-of-day bounds from minTime/maxTime (per clampTime).\n  function timeBounds(): { lo: number; hi: number } {\n    const lo = options.minTime ? options.minTime.hour * 60 + (options.minTime.minute ?? 0) : 0;\n    const hi = options.maxTime ? options.maxTime.hour * 60 + (options.maxTime.minute ?? 0) : 24 * 60 - 1;\n    return { lo, hi };\n  }\n\n  // Parse typed text into a concrete DateValue (+ optional time), honouring the\n  // active BS/AD mode and all date/time constraints. Returns a status sentinel\n  // for blank ('empty') or unparseable/out-of-range/disabled ('invalid') input.\n  function parseTyped(text: string): { value: DateValue; time: { hour: number; minute: number } | null } | 'empty' | 'invalid' {\n    const tokens = tokenizeTyped(text);\n    if (tokens === 'empty') return 'empty';\n    if (!tokens) return 'invalid';\n    let value: DateValue;\n    try {\n      if (state.mode === 'BS') {\n        if (tokens.year < adapter.minSupportedYear || tokens.year > adapter.maxSupportedYear) return 'invalid';\n        if (tokens.month < 1 || tokens.month > 12) return 'invalid';\n        if (tokens.day < 1 || tokens.day > adapter.daysInBsMonth(tokens.year, tokens.month)) return 'invalid';\n        value = dateValueFromBs(adapter, { year: tokens.year, month: tokens.month, day: tokens.day });\n      } else {\n        if (tokens.month < 1 || tokens.month > 12 || tokens.day < 1 || tokens.day > 31) return 'invalid';\n        const ad = new Date(tokens.year, tokens.month - 1, tokens.day);\n        // Reject calendar overflow (e.g. Feb 30 rolling into March).\n        if (ad.getFullYear() !== tokens.year || ad.getMonth() !== tokens.month - 1 || ad.getDate() !== tokens.day) return 'invalid';\n        value = createDateValue(adapter, ad);\n      }\n    } catch {\n      return 'invalid';\n    }\n    if (controller.isDisabled(value)) return 'invalid';\n    if (options.withTime && tokens.hour != null) {\n      if (tokens.hour > 23 || (tokens.minute ?? 0) > 59) return 'invalid';\n      return { value, time: { hour: tokens.hour, minute: tokens.minute ?? 0 } };\n    }\n    return { value, time: null };\n  }\n\n  function pad2(n: number): string {\n    return String(n).padStart(2, '0');\n  }\n\n  // Mode-aware canonical ASCII string for a value (+ current time when withTime).\n  function toAscii(value: DateValue): string {\n    const date = state.mode === 'BS'\n      ? `${value.bs.year}-${pad2(value.bs.month)}-${pad2(value.bs.day)}`\n      : `${value.ad.getFullYear()}-${pad2(value.ad.getMonth() + 1)}-${pad2(value.ad.getDate())}`;\n    if (!options.withTime) return date;\n    const now = new Date();\n    const t = state.time ?? { hour: now.getHours(), minute: now.getMinutes() };\n    return `${date} ${pad2(t.hour)}:${pad2(t.minute)}`;\n  }\n\n  // Shared state mutation for preview/commit of a parsed typed value.\n  function applyParsed(parsed: { value: DateValue; time: { hour: number; minute: number } | null }): void {\n    const view = viewYearMonthOf(state.mode, adapter, parsed.value.ad);\n    const patch: Partial<DateTimeControllerState> = {\n      selected: parsed.value,\n      viewYear: view.year,\n      viewMonth: view.month,\n    };\n    if (parsed.time && state.time) {\n      patch.time = clampTime({ hour: parsed.time.hour, minute: parsed.time.minute, second: 0 });\n    }\n    setState(patch);\n  }\n\n  function buildResult(value: DateValue): DateTimeResult {\n    const ad = new Date(value.ad);\n    if (state.time) ad.setHours(state.time.hour, state.time.minute, state.time.second, 0);\n    return {\n      ad,\n      bs: value.bs,\n      time: state.time ?? undefined,\n      formatted: formatDateValue(ad, adapter, {\n        mode: state.mode,\n        format: options.displayFormat ?? (options.withTime\n          ? (state.timeFormat === '12h' ? 'YYYY-MM-DD hh:mm A' : 'YYYY-MM-DD HH:mm')\n          : 'YYYY-MM-DD'),\n        locale: options.locale ?? 'en',\n      }),\n      value: formatMachineValue({ ad, bs: value.bs, time: state.time ?? undefined }, options.valueFormat ?? 'iso', adapter, !!options.withTime),\n    };\n  }\n\n  function emit(value: DateValue): void {\n    const result = buildResult(value);\n    options.onChange?.(result);\n    listeners.forEach((listener) => listener(result));\n  }\n\n  const controller: DateTimeController = {\n    getState: () => state,\n    getValue: () => (state.selected ? buildResult(state.selected) : null),\n    setValue(value) {\n      const ad = value instanceof Date ? value : value?.ad ?? null;\n      setState({ selected: ad ? createDateValue(adapter, ad) : null });\n    },\n    show() {\n      if (!state.isOpen) {\n        setState({ isOpen: true });\n        options.onOpen?.();\n      }\n    },\n    hide() {\n      if (state.isOpen) {\n        setState({ isOpen: false });\n        options.onClose?.();\n      }\n    },\n    update(patch) {\n      options = { ...options, ...patch };\n      const next: Partial<DateTimeControllerState> = {};\n      if ('mode' in patch) {\n        const nextMode = options.mode ?? 'BS';\n        if (nextMode !== state.mode) Object.assign(next, reviewInMode(nextMode));\n      }\n      if ('allowModeToggle' in patch) next.allowModeToggle = options.allowModeToggle !== false;\n      if ('showSecondaryCalendar' in patch) next.showSecondaryCalendar = options.showSecondaryCalendar !== false;\n      if ('timeFormat' in patch) next.timeFormat = options.timeFormat ?? '24h';\n      if ('minuteStep' in patch) next.minuteStep = options.minuteStep && options.minuteStep > 0 ? options.minuteStep : 1;\n      if (('minTime' in patch || 'maxTime' in patch) && state.time) next.time = clampTime(state.time);\n      if ('withTime' in patch) {\n        if (options.withTime && !state.time) {\n          const now = new Date();\n          const dt = options.defaultTime ?? { hour: now.getHours(), minute: now.getMinutes() };\n          next.time = { hour: dt.hour, minute: dt.minute, second: 0 };\n        } else if (!options.withTime) {\n          next.time = null;\n        }\n      }\n      setState(next);\n    },\n    destroy() {\n      listeners = [];\n      stateListeners = [];\n    },\n    onChange(cb) {\n      listeners.push(cb);\n      return () => {\n        listeners = listeners.filter((listener) => listener !== cb);\n      };\n    },\n    selectDay(value) {\n      if (controller.isDisabled(value)) return;\n      const view = viewYearMonthOf(state.mode, adapter, value.ad);\n      setState({ selected: value, viewYear: view.year, viewMonth: view.month });\n      if (options.closeOnSelect ?? !options.withTime) {\n        emit(value);\n        controller.hide();\n      }\n    },\n    // Jumps straight to today regardless of which month/year/view is\n    // currently showing — the calendar-grid equivalent of the time panel's\n    // \"Now\" button, for when you've navigated away and want back quickly.\n    goToday() {\n      const today = createDateValue(adapter, new Date());\n      if (controller.isDisabled(today)) return;\n      const view = viewYearMonthOf(state.mode, adapter, today.ad);\n      setState({ selected: today, viewYear: view.year, viewMonth: view.month, view: 'day' });\n      if (options.closeOnSelect ?? !options.withTime) {\n        emit(today);\n        controller.hide();\n      }\n    },\n    setTime(hour, minute, second = 0) {\n      commitTime({ hour: wrap(hour, 24), minute: wrap(minute, 60), second: wrap(second, 60) });\n    },\n    // Validated absolute setters for typed entry: reject out-of-range or\n    // disabled values (so the field can flag them) instead of wrapping, and\n    // skip a redundant re-render when the value is unchanged.\n    setHour(hour24) {\n      if (!state.time || !Number.isInteger(hour24) || hour24 < 0 || hour24 > 23) return false;\n      if (controller.isHourDisabled(hour24)) return false;\n      if (state.time.hour !== hour24) commitTime({ ...state.time, hour: hour24 });\n      return true;\n    },\n    setMinute(minute) {\n      if (!state.time || !Number.isInteger(minute) || minute < 0 || minute > 59) return false;\n      if (controller.isMinuteDisabled(state.time.hour, minute)) return false;\n      if (state.time.minute !== minute) commitTime({ ...state.time, minute });\n      return true;\n    },\n    stepHour(delta) {\n      if (!state.time) return;\n      commitTime({ ...state.time, hour: wrap(state.time.hour + delta, 24) });\n    },\n    stepMinute(delta) {\n      if (!state.time) return;\n      commitTime({ ...state.time, minute: wrap(state.time.minute + delta * state.minuteStep, 60) });\n    },\n    toggleMeridiem() {\n      if (!state.time) return;\n      const hour = state.time.hour < 12 ? state.time.hour + 12 : state.time.hour - 12;\n      commitTime({ ...state.time, hour });\n    },\n    setTimeToNow() {\n      if (!state.time) return;\n      const now = new Date();\n      commitTime({ hour: now.getHours(), minute: now.getMinutes(), second: now.getSeconds() });\n    },\n    confirm() {\n      if (state.selected) emit(state.selected);\n      controller.hide();\n    },\n    clear() {\n      setState({ selected: null });\n    },\n    navigateMonth(delta) {\n      let year = state.viewYear;\n      let month = state.viewMonth + delta;\n      while (month > 12) { month -= 12; year += 1; }\n      while (month < 1) { month += 12; year -= 1; }\n      setState({ viewYear: year, viewMonth: month });\n      options.onChangeMonthYear?.(year, month);\n    },\n    navigateYear(delta) {\n      const year = clampYear(state.viewYear + delta);\n      setState({ viewYear: year });\n      options.onChangeMonthYear?.(year, state.viewMonth);\n    },\n    navigateYearGroup(delta) {\n      setState({ yearGroupStart: clampYear(state.yearGroupStart + delta * 12) });\n    },\n    setView(view) {\n      setState(view === 'year' ? { view, yearGroupStart: clampYear(state.viewYear - 6) } : { view });\n    },\n    selectMonthView(month) {\n      setState({ viewMonth: month, view: 'day' });\n      options.onChangeMonthYear?.(state.viewYear, month);\n    },\n    selectYearView(year) {\n      const y = clampYear(year);\n      setState({ viewYear: y, view: 'month' });\n      options.onChangeMonthYear?.(y, state.viewMonth);\n    },\n    toggleMode() {\n      if (!state.allowModeToggle) return;\n      setState(reviewInMode(state.mode === 'BS' ? 'AD' : 'BS'));\n    },\n    isDisabled(value) {\n      return isDayDisabled(value.ad, options, nativeDateMath);\n    },\n    // Non-mutating check used to flag the input as valid/invalid while typing.\n    validateTyped(text) {\n      const parsed = parseTyped(text);\n      return parsed === 'empty' ? 'empty' : parsed === 'invalid' ? 'invalid' : 'valid';\n    },\n    // Parse + apply typed text: select the date, sync the calendar view and\n    // emit; on blank, clear the selection. Invalid input is a no-op.\n    commitTyped(text) {\n      const parsed = parseTyped(text);\n      if (parsed === 'empty') {\n        if (state.selected) setState({ selected: null });\n        return 'empty';\n      }\n      if (parsed === 'invalid') return 'invalid';\n      applyParsed(parsed);\n      emit(parsed.value);\n      return 'valid';\n    },\n    // Canonical ASCII `YYYY-MM-DD[ HH:mm]` of the current selection (active\n    // calendar mode), or '' when nothing is selected — seeds the typed editor.\n    typedString() {\n      return state.selected ? toAscii(state.selected) : '';\n    },\n    // Same, but falls back to today when nothing is selected — used to seed a\n    // section the first time it is stepped with the arrow keys.\n    typedReference() {\n      return toAscii(state.selected ?? createDateValue(adapter, new Date()));\n    },\n    yearBounds() {\n      return viewYearBounds(state.mode, adapter);\n    },\n    // An hour is disabled when it lies entirely outside min/max, or when every\n    // step-minute in it is rejected by disabledTimes.\n    isHourDisabled(hour) {\n      const { lo, hi } = timeBounds();\n      if (hour * 60 + 59 < lo || hour * 60 > hi) return true;\n      if (options.disabledTimes) {\n        const step = state.minuteStep > 0 ? state.minuteStep : 1;\n        for (let m = 0; m < 60; m += step) if (!options.disabledTimes(hour, m)) return false;\n        return true;\n      }\n      return false;\n    },\n    isMinuteDisabled(hour, minute) {\n      const { lo, hi } = timeBounds();\n      const t = hour * 60 + minute;\n      if (t < lo || t > hi) return true;\n      return options.disabledTimes?.(hour, minute) ?? false;\n    },\n    cellForBs(year, month, day) {\n      return dateValueFromBs(adapter, { year, month, day });\n    },\n    buildMonthCells(year, month) {\n      return buildViewMonthCells(state.mode, adapter, nativeDateMath, year, month);\n    },\n  };\n\n  (controller as unknown as { onStateChange: (cb: () => void) => () => void }).onStateChange = (cb: () => void) => {\n    stateListeners.push(cb);\n    return () => {\n      stateListeners = stateListeners.filter((listener) => listener !== cb);\n    };\n  };\n\n  return controller;\n}\n\nexport { nativeDateMath };\n","import { defaultCalendarAdapter } from '../adapters/bs-ad-calendar-adapter.js';\nimport { formatDateValue, formatMachineValue, stringifyMachineValue } from '../format/index.js';\nimport type { MonthPickerOptions, MonthResult, MonthValue, PickerInstance, PickerLocale } from '../types.js';\n\nexport interface MonthPickerControllerState {\n  isOpen: boolean;\n  view: 'month' | 'year';\n  viewYear: number;\n  viewMonth: number;\n  yearGroupStart: number;\n  selected: MonthValue | null;\n  showSecondaryCalendar: boolean;\n}\n\nexport interface MonthPickerController extends PickerInstance<MonthResult, MonthPickerOptions> {\n  getState(): MonthPickerControllerState;\n  navigateMonth(delta: number): void;\n  navigateYear(delta: number): void;\n  navigateYearGroup(delta: number): void;\n  setView(view: 'day' | 'month' | 'year'): void;\n  selectMonthView(month: number): void;\n  selectYearView(year: number): void;\n  validateTyped(text: string): 'valid' | 'invalid' | 'empty';\n  commitTyped(text: string): 'valid' | 'invalid' | 'empty';\n  typedString(): string;\n  typedReference(): string;\n  yearBounds(): { min: number; max: number };\n}\n\nexport function createMonthPickerController(initialOptions: MonthPickerOptions = {}): MonthPickerController {\n  let options = { ...initialOptions };\n  const adapter = options.adapter ?? defaultCalendarAdapter;\n  // Read live so a runtime `update({ locale })` re-labels the month grid.\n  const currentLocale = (): PickerLocale => options.locale ?? 'en';\n  let listeners: Array<(value: MonthResult) => void> = [];\n  let stateListeners: Array<() => void> = [];\n\n  // Selected only when a month is explicitly provided; otherwise empty. The\n  // grid still opens on the current BS month.\n  const providedMonth = options.value !== undefined ? options.value : options.defaultValue;\n  const initial = providedMonth ?? adapter.todayBs();\n\n  let state: MonthPickerControllerState = {\n    isOpen: false,\n    view: 'month',\n    viewYear: initial.year,\n    viewMonth: initial.month,\n    yearGroupStart: initial.year - 6,\n    selected: providedMonth ? { year: providedMonth.year, month: providedMonth.month } : null,\n    showSecondaryCalendar: options.showSecondaryCalendar !== false,\n  };\n\n  function setState(patch: Partial<MonthPickerControllerState>): void {\n    state = { ...state, ...patch };\n    stateListeners.forEach((listener) => listener());\n  }\n\n  function clampYear(year: number): number {\n    const lo = options.minYear ?? adapter.minSupportedYear;\n    const hi = options.maxYear ?? adapter.maxSupportedYear;\n    return Math.max(lo, Math.min(hi, year));\n  }\n\n  function buildResult(year: number, month: number): MonthResult {\n    const days = adapter.daysInBsMonth(year, month);\n    const start = adapter.bsToAd(year, month, 1);\n    const end = adapter.bsToAd(year, month, days);\n    // A month is a from→to date range: first day → last day.\n    const vf = options.valueFormat ?? 'iso';\n    const startValue = formatMachineValue({ ad: start, bs: { year, month, day: 1 } }, vf, adapter);\n    const endValue = formatMachineValue({ ad: end, bs: { year, month, day: days } }, vf, adapter);\n    return {\n      year,\n      month,\n      bs: { year, month },\n      monthName: adapter.bsMonthNames(currentLocale())[month - 1],\n      start,\n      end,\n      formatted: formatDateValue(start, adapter, { mode: 'BS', format: options.displayFormat ?? 'MMMM YYYY', locale: currentLocale() }),\n      startValue,\n      endValue,\n      value: `${stringifyMachineValue(startValue)},${stringifyMachineValue(endValue)}`,\n    };\n  }\n\n  function emit(result: MonthResult): void {\n    options.onChange?.(result);\n    listeners.forEach((listener) => listener(result));\n  }\n\n  const controller: MonthPickerController = {\n    getState: () => state,\n    getValue: () => (state.selected ? buildResult(state.selected.year, state.selected.month) : null),\n    setValue(value) {\n      setState({ selected: value ? { year: value.year, month: value.month } : null, viewYear: value?.year ?? state.viewYear, viewMonth: value?.month ?? state.viewMonth });\n    },\n    show() {\n      if (!state.isOpen) {\n        setState({ isOpen: true, view: 'month' });\n        options.onOpen?.();\n      }\n    },\n    hide() {\n      if (state.isOpen) {\n        setState({ isOpen: false });\n        options.onClose?.();\n      }\n    },\n    update(patch) {\n      options = { ...options, ...patch };\n      setState('showSecondaryCalendar' in patch ? { showSecondaryCalendar: options.showSecondaryCalendar !== false } : {});\n    },\n    destroy() {\n      listeners = [];\n      stateListeners = [];\n    },\n    onChange(cb) {\n      listeners.push(cb);\n      return () => {\n        listeners = listeners.filter((listener) => listener !== cb);\n      };\n    },\n    navigateMonth() {\n      // Month picker never shows a day view; kept for ViewControls compatibility.\n    },\n    navigateYear(delta) {\n      setState({ viewYear: clampYear(state.viewYear + delta) });\n    },\n    navigateYearGroup(delta) {\n      setState({ yearGroupStart: clampYear(state.yearGroupStart + delta * 12) });\n    },\n    setView(view) {\n      // No day view here — treat a drill-down out of the year grid as \"month\".\n      if (view === 'year') setState({ view: 'year', yearGroupStart: clampYear(state.viewYear - 6) });\n      else setState({ view: 'month' });\n    },\n    selectMonthView(month) {\n      const selected = { year: state.viewYear, month };\n      setState({ selected, viewMonth: month });\n      emit(buildResult(selected.year, month));\n      controller.hide();\n    },\n    selectYearView(year) {\n      setState({ viewYear: clampYear(year), view: 'month' });\n    },\n    yearBounds: () => ({ min: options.minYear ?? adapter.minSupportedYear, max: options.maxYear ?? adapter.maxSupportedYear }),\n    typedString: () => (state.selected ? `${state.selected.year}-${String(state.selected.month).padStart(2, '0')}` : ''),\n    typedReference() {\n      const v = state.selected ?? adapter.todayBs();\n      return `${v.year}-${String(v.month).padStart(2, '0')}`;\n    },\n    // Parse `YYYY-MM`; a month is valid when the year is in range and month 1–12.\n    validateTyped(text) {\n      const m = /^\\s*(\\d{1,4})-(\\d{1,2})\\s*$/.exec(text);\n      if (text.trim() === '') return 'empty';\n      if (!m) return 'invalid';\n      const year = Number(m[1]);\n      const month = Number(m[2]);\n      const { min, max } = controller.yearBounds();\n      return year >= min && year <= max && month >= 1 && month <= 12 ? 'valid' : 'invalid';\n    },\n    commitTyped(text) {\n      const status = controller.validateTyped(text);\n      if (status === 'empty') { if (state.selected) setState({ selected: null }); return 'empty'; }\n      if (status === 'invalid') return 'invalid';\n      const m = /^\\s*(\\d{1,4})-(\\d{1,2})\\s*$/.exec(text)!;\n      const year = Number(m[1]);\n      const month = Number(m[2]);\n      setState({ selected: { year, month }, viewYear: year, viewMonth: month });\n      emit(buildResult(year, month));\n      return 'valid';\n    },\n  };\n\n  (controller as unknown as { onStateChange: (cb: () => void) => () => void }).onStateChange = (cb: () => void) => {\n    stateListeners.push(cb);\n    return () => {\n      stateListeners = stateListeners.filter((listener) => listener !== cb);\n    };\n  };\n\n  return controller;\n}\n","// Turns a single <input> into a native-`<input type=\"date\">`-style segmented\n// editor: fixed separators, focus selects a whole section, Arrow Up/Down step\n// the focused section, digits fill it with auto-advance, Left/Right move\n// between sections and Backspace clears. It never behaves like a free-text\n// field. The set of sections is described by a schema, so the same widget\n// backs the date, datetime (incl. AM/PM), month and range pickers.\nimport { normalizeDigits } from '../format/parse.js';\n\nexport interface SegmentSpec {\n  key: string;\n  len: number;\n  min: number;\n  max: number;\n  placeholder: string;\n  kind?: 'num' | 'meridiem';\n}\n\nexport type SegmentValues = Record<string, number | null>;\n\nexport interface SegmentedFieldConfig {\n  /** Ordered sections + separator strings; re-read on every focus so mode /\n   *  withTime changes rebuild the field. */\n  schema: () => Array<SegmentSpec | string>;\n  /** Parse the controller's ASCII value into per-key section values. */\n  seed: (ascii: string) => SegmentValues;\n  /** Build the controller's ASCII value from a complete set of section values. */\n  toAscii: (values: SegmentValues) => string;\n  /** Placeholder shown when the field is empty and unfocused. */\n  placeholder: () => string;\n  /** Locale display string shown when the field is not being edited. */\n  formatted: () => string;\n  /** ASCII of the committed value, or '' if none — seeds sections on focus. */\n  committed: () => string;\n  /** ASCII of the value or today — seeds a section on first arrow step. */\n  reference: () => string;\n  validate: (ascii: string) => 'valid' | 'invalid' | 'empty';\n  commit: (ascii: string) => 'valid' | 'invalid' | 'empty';\n  open: () => void;\n  close: () => void;\n}\n\nexport interface SegmentedField {\n  isEditing: () => boolean;\n  destroy: () => void;\n}\n\ninterface Segment extends SegmentSpec {\n  value: number | null;\n  buffer: string;\n}\n\nexport function attachSegmentedField(input: HTMLInputElement, cfg: SegmentedFieldConfig): SegmentedField {\n  let segments: Segment[] = [];\n  let layout: Array<Segment | string> = [];\n  let active = 0;\n  let editing = false;\n  let dirty = false; // whether the user changed anything this editing session\n\n  function build(): void {\n    segments = [];\n    layout = cfg.schema().map((part) => {\n      if (typeof part === 'string') return part;\n      const seg: Segment = { ...part, kind: part.kind ?? 'num', value: null, buffer: '' };\n      segments.push(seg);\n      return seg;\n    });\n  }\n\n  function display(seg: Segment): string {\n    if (seg.value == null) return seg.placeholder;\n    if (seg.kind === 'meridiem') return seg.value === 1 ? 'PM' : 'AM';\n    return String(seg.value).padStart(seg.len, '0');\n  }\n\n  function render(): string {\n    return layout.map((p) => (typeof p === 'string' ? p : display(p))).join('');\n  }\n\n  // Character range of a section — widths are fixed (placeholder length === len).\n  function rangeOf(index: number): [number, number] {\n    let pos = 0;\n    for (const p of layout) {\n      if (typeof p === 'string') { pos += p.length; continue; }\n      if (segments.indexOf(p) === index) return [pos, pos + p.len];\n      pos += p.len;\n    }\n    return [0, 0];\n  }\n\n  function segmentAtPos(pos: number): number {\n    let offset = 0;\n    for (const p of layout) {\n      if (typeof p === 'string') { offset += p.length; continue; }\n      if (pos <= offset + p.len) return segments.indexOf(p);\n      offset += p.len;\n    }\n    return segments.length - 1;\n  }\n\n  function paint(): void {\n    input.value = render();\n    const [a, b] = rangeOf(active);\n    input.setSelectionRange(a, b);\n    input.setAttribute('aria-valuetext', input.value);\n  }\n\n  // Full ASCII string, or null when a section is still empty.\n  function assemble(): string | null {\n    if (segments.some((s) => s.value == null)) return null;\n    const values: SegmentValues = {};\n    segments.forEach((s) => { values[s.key] = s.value; });\n    return cfg.toAscii(values);\n  }\n\n  // Flag the field valid/invalid after each edit (no calendar mutation — like a\n  // native date input, the picker only updates on commit).\n  function sync(): void {\n    const ascii = assemble();\n    if (!ascii) {\n      input.classList.remove('ndp-input-invalid');\n      input.removeAttribute('aria-invalid');\n      return;\n    }\n    const status = cfg.validate(ascii);\n    input.classList.toggle('ndp-input-invalid', status === 'invalid');\n    input.setAttribute('aria-invalid', status === 'invalid' ? 'true' : 'false');\n  }\n\n  function selectSegment(index: number): void {\n    active = Math.max(0, Math.min(segments.length - 1, index));\n    paint();\n  }\n\n  function seedFromReference(seg: Segment): void {\n    const v = cfg.seed(cfg.reference())[seg.key];\n    seg.value = v == null ? seg.min : Math.max(seg.min, Math.min(seg.max, v));\n  }\n\n  function step(delta: number): void {\n    const seg = segments[active];\n    seg.buffer = '';\n    dirty = true;\n    if (seg.value == null) {\n      seedFromReference(seg); // first press lands on today's part\n    } else {\n      const range = seg.max - seg.min + 1;\n      seg.value = ((seg.value - seg.min + delta) % range + range) % range + seg.min;\n    }\n    paint();\n    sync();\n  }\n\n  function finalize(seg: Segment): void {\n    if (!seg.buffer) return;\n    seg.value = Math.max(seg.min, Math.min(seg.max, parseInt(seg.buffer, 10)));\n    seg.buffer = '';\n  }\n\n  function typeDigit(digit: string): void {\n    const seg = segments[active];\n    if (seg.kind === 'meridiem') return; // AM/PM is set with a/p, not digits\n    dirty = true;\n    seg.buffer += digit;\n    const n = parseInt(seg.buffer, 10);\n    if (seg.len >= 4) {\n      seg.value = n;\n      if (seg.buffer.length >= seg.len) { finalize(seg); advance(); }\n    } else if (seg.buffer.length >= 2 || n * 10 > seg.max) {\n      finalize(seg);\n      advance();\n    } else {\n      seg.value = n;\n    }\n    paint();\n    sync();\n  }\n\n  function setMeridiem(pm: boolean): void {\n    dirty = true;\n    segments[active].value = pm ? 1 : 0;\n    paint();\n    sync();\n  }\n\n  function advance(): void {\n    if (active < segments.length - 1) active += 1;\n  }\n\n  function backspace(): void {\n    const seg = segments[active];\n    dirty = true;\n    if (seg.value != null || seg.buffer) {\n      seg.value = null;\n      seg.buffer = '';\n    } else if (active > 0) {\n      active -= 1;\n      segments[active].value = null;\n      segments[active].buffer = '';\n    }\n    paint();\n    sync();\n  }\n\n  function beginEditing(atPos?: number): void {\n    build();\n    const map = cfg.seed(cfg.committed());\n    segments.forEach((s) => { s.value = map[s.key] ?? null; s.buffer = ''; });\n    editing = true;\n    dirty = false;\n    active = atPos == null ? 0 : segmentAtPos(atPos);\n    paint();\n  }\n\n  function finishEditing(): void {\n    editing = false;\n    input.classList.remove('ndp-input-invalid');\n    input.removeAttribute('aria-invalid');\n    // Untouched session — just restore the canonical display, don't re-commit.\n    if (!dirty) { input.value = cfg.formatted(); return; }\n    segments.forEach(finalize);\n    const filled = segments.filter((s) => s.value != null).length;\n    if (filled === segments.length) {\n      const ascii = assemble()!;\n      if (cfg.commit(ascii) === 'invalid') input.value = cfg.formatted();\n    } else if (filled === 0) {\n      cfg.commit('');\n    } else {\n      input.value = cfg.formatted(); // discard a partial entry\n    }\n  }\n\n  function onKeydown(event: Event): void {\n    const e = event as KeyboardEvent;\n    if (e.altKey || e.ctrlKey || e.metaKey) return; // leave shortcuts alone\n    if (!editing) { if (e.key !== 'Tab') beginEditing(); }\n    const key = e.key;\n    const seg = segments[active];\n    if (seg && seg.kind === 'meridiem' && /^[apAP]$/.test(key)) {\n      e.preventDefault();\n      setMeridiem(/p/i.test(key));\n    } else if (/^[0-9]$/.test(key) || /^[०-९]$/.test(key)) {\n      e.preventDefault();\n      typeDigit(normalizeDigits(key));\n    } else if (key === 'ArrowUp') {\n      e.preventDefault();\n      step(1);\n    } else if (key === 'ArrowDown') {\n      e.preventDefault();\n      step(-1);\n    } else if (key === 'ArrowLeft') {\n      e.preventDefault();\n      selectSegment(active - 1);\n    } else if (key === 'ArrowRight' || key === '-' || key === '/' || key === ':' || key === ' ') {\n      e.preventDefault();\n      selectSegment(active + 1);\n    } else if (key === 'Backspace' || key === 'Delete') {\n      e.preventDefault();\n      backspace();\n    } else if (key === 'Enter') {\n      e.preventDefault();\n      finishEditing();\n      cfg.close();\n    } else if (key === 'Escape') {\n      e.preventDefault();\n      editing = false;\n      input.value = cfg.formatted();\n      input.classList.remove('ndp-input-invalid');\n      input.removeAttribute('aria-invalid');\n      cfg.close();\n    } else if (key !== 'Tab') {\n      e.preventDefault(); // block any other free-text insertion\n    }\n  }\n\n  function onFocus(): void {\n    if (!editing) beginEditing();\n    cfg.open();\n  }\n\n  function onMouseup(): void {\n    // Re-select the whole section the caret landed in.\n    if (editing) selectSegment(segmentAtPos(input.selectionStart ?? 0));\n  }\n\n  function onBlur(): void {\n    if (editing) finishEditing();\n  }\n\n  function onBeforeinput(e: Event): void {\n    e.preventDefault(); // route all input through keydown\n  }\n\n  input.classList.add('ndp-trigger--segmented');\n  input.setAttribute('inputmode', 'numeric');\n  input.setAttribute('autocomplete', 'off');\n  if (!input.getAttribute('placeholder')) input.setAttribute('placeholder', cfg.placeholder());\n  input.addEventListener('keydown', onKeydown);\n  input.addEventListener('focus', onFocus);\n  input.addEventListener('mouseup', onMouseup);\n  input.addEventListener('blur', onBlur);\n  input.addEventListener('beforeinput', onBeforeinput);\n\n  return {\n    isEditing: () => editing,\n    destroy() {\n      input.classList.remove('ndp-trigger--segmented');\n      input.removeEventListener('keydown', onKeydown);\n      input.removeEventListener('focus', onFocus);\n      input.removeEventListener('mouseup', onMouseup);\n      input.removeEventListener('blur', onBlur);\n      input.removeEventListener('beforeinput', onBeforeinput);\n    },\n  };\n}\n","// Schema builders for the segmented field — one per picker shape. Each returns\n// the `schema` / `seed` / `toAscii` / `placeholder` slice of a\n// SegmentedFieldConfig; the mount supplies the validate/commit/open/close rest.\nimport type { SegmentSpec, SegmentValues } from './segmented-field.js';\n\ntype SchemaPart = Pick<import('./segmented-field.js').SegmentedFieldConfig, 'schema' | 'seed' | 'toAscii' | 'placeholder'>;\n\nconst pad = (n: number, len = 2): string => String(n).padStart(len, '0');\n\nfunction yearSpec(bounds: { min: number; max: number }): SegmentSpec {\n  return { key: 'year', len: 4, min: bounds.min, max: bounds.max, placeholder: 'YYYY' };\n}\nconst MONTH: SegmentSpec = { key: 'month', len: 2, min: 1, max: 12, placeholder: 'MM' };\n// BS months can have up to 32 days; the exact per-month length is enforced at\n// commit time, so the section itself allows stepping/typing up to 32.\nconst DAY: SegmentSpec = { key: 'day', len: 2, min: 1, max: 32, placeholder: 'DD' };\n\n/** `YYYY-MM-DD`, optionally `… HH:mm` (24h) or `… hh:mm --` (12h with AM/PM). */\nexport function dateSchema(opts: {\n  yearBounds: () => { min: number; max: number };\n  withTime: () => boolean;\n  hour12: () => boolean;\n}): SchemaPart {\n  const is12h = () => opts.withTime() && opts.hour12();\n  return {\n    schema() {\n      const parts: Array<SegmentSpec | string> = [yearSpec(opts.yearBounds()), '-', MONTH, '-', DAY];\n      if (opts.withTime()) {\n        const h12 = is12h();\n        parts.push(' ', { key: 'hour', len: 2, min: h12 ? 1 : 0, max: h12 ? 12 : 23, placeholder: h12 ? 'hh' : 'HH' }, ':', { key: 'minute', len: 2, min: 0, max: 59, placeholder: 'mm' });\n        if (h12) parts.push(' ', { key: 'meridiem', len: 2, min: 0, max: 1, placeholder: '--', kind: 'meridiem' });\n      }\n      return parts;\n    },\n    placeholder: () => (opts.withTime() ? (is12h() ? 'YYYY-MM-DD hh:mm --' : 'YYYY-MM-DD HH:mm') : 'YYYY-MM-DD'),\n    seed(ascii) {\n      const m = /^(\\d+)-(\\d+)-(\\d+)(?:[ ](\\d+):(\\d+))?$/.exec(ascii);\n      if (!m) return {};\n      const values: SegmentValues = { year: +m[1], month: +m[2], day: +m[3] };\n      if (m[4] != null) {\n        const h24 = +m[4];\n        if (is12h()) { values.hour = h24 % 12 || 12; values.meridiem = h24 >= 12 ? 1 : 0; } else values.hour = h24;\n        values.minute = +m[5];\n      }\n      return values;\n    },\n    toAscii(v) {\n      const date = `${pad(v.year!, 4)}-${pad(v.month!)}-${pad(v.day!)}`;\n      if (v.hour == null) return date;\n      const h = v.meridiem != null ? (v.hour! % 12) + (v.meridiem === 1 ? 12 : 0) : v.hour!;\n      return `${date} ${pad(h)}:${pad(v.minute!)}`;\n    },\n  };\n}\n\n/** `YYYY-MM` for the month picker. */\nexport function monthSchema(opts: { yearBounds: () => { min: number; max: number } }): SchemaPart {\n  return {\n    schema: () => [yearSpec(opts.yearBounds()), '-', MONTH],\n    placeholder: () => 'YYYY-MM',\n    seed(ascii): SegmentValues {\n      const m = /^(\\d+)-(\\d+)$/.exec(ascii);\n      return m ? { year: +m[1], month: +m[2] } : {};\n    },\n    toAscii: (v) => `${pad(v.year!, 4)}-${pad(v.month!)}`,\n  };\n}\n\n/** `YYYY-MM-DD – YYYY-MM-DD` for the range picker. */\nexport function rangeSchema(opts: { yearBounds: () => { min: number; max: number } }): SchemaPart {\n  const group = (p: 's' | 'e'): Array<SegmentSpec | string> => {\n    const yb = opts.yearBounds();\n    return [\n      { key: `${p}Y`, len: 4, min: yb.min, max: yb.max, placeholder: 'YYYY' }, '-',\n      { key: `${p}M`, len: 2, min: 1, max: 12, placeholder: 'MM' }, '-',\n      { key: `${p}D`, len: 2, min: 1, max: 32, placeholder: 'DD' },\n    ];\n  };\n  return {\n    schema: () => [...group('s'), ' – ', ...group('e')],\n    placeholder: () => 'YYYY-MM-DD – YYYY-MM-DD',\n    seed(ascii): SegmentValues {\n      const m = /^(\\d+)-(\\d+)-(\\d+)\\s+–\\s+(\\d+)-(\\d+)-(\\d+)$/.exec(ascii);\n      if (!m) return {};\n      return { sY: +m[1], sM: +m[2], sD: +m[3], eY: +m[4], eM: +m[5], eD: +m[6] };\n    },\n    toAscii: (v) => `${pad(v.sY!, 4)}-${pad(v.sM!)}-${pad(v.sD!)} – ${pad(v.eY!, 4)}-${pad(v.eM!)}-${pad(v.eD!)}`,\n  };\n}\n","export interface AnchorRect {\n  top: number;\n  left: number;\n  width: number;\n  height: number;\n  bottom: number;\n  right: number;\n}\n\nexport interface PopupSize {\n  width: number;\n  height: number;\n}\n\nexport function computePopupPosition(anchor: AnchorRect, popup: PopupSize, viewport: { width: number; height: number }, options: {\n  opens?: 'left' | 'right' | 'center' | 'auto';\n  drops?: 'down' | 'up' | 'auto';\n  gap?: number;\n} = {}): { top: number; left: number; placementY: 'up' | 'down'; placementX: 'left' | 'right' | 'center' } {\n  const gap = options.gap ?? 6;\n  const spaceBelow = viewport.height - anchor.bottom;\n  const spaceAbove = anchor.top;\n  const placementY = options.drops === 'up' || (options.drops !== 'down' && spaceBelow < popup.height && spaceAbove > spaceBelow) ? 'up' : 'down';\n  const top = placementY === 'down' ? anchor.bottom + gap : Math.max(gap, anchor.top - popup.height - gap);\n\n  let placementX: 'left' | 'right' | 'center' = options.opens === 'left' || options.opens === 'right' || options.opens === 'center' ? options.opens : 'left';\n  if (options.opens === 'auto' || !options.opens) {\n    if (anchor.left + popup.width <= viewport.width) placementX = 'left';\n    else if (anchor.right - popup.width >= 0) placementX = 'right';\n    else placementX = 'center';\n  }\n\n  const rawLeft = placementX === 'right'\n    ? anchor.right - popup.width\n    : placementX === 'center'\n      ? anchor.left + anchor.width / 2 - popup.width / 2\n      : anchor.left;\n\n  return {\n    top,\n    left: Math.max(gap, Math.min(rawLeft, viewport.width - popup.width - gap)),\n    placementY,\n    placementX,\n  };\n}\n","import { defaultCalendarAdapter } from '../adapters/bs-ad-calendar-adapter.js';\nimport type { DateRangeController } from '../application/date-range-controller.js';\nimport { previewRange } from '../application/date-range-controller.js';\nimport type { DateTimeController } from '../application/date-time-controller.js';\nimport { crossCalendarMonthSpan, viewYearBounds, viewYearMonthOf } from '../application/calendar-view.js';\nimport type { MonthSpan } from '../application/calendar-view.js';\nimport type { MonthPickerController } from '../application/month-picker-controller.js';\nimport { GREGORIAN_MONTHS_SHORT, nativeDateMath } from '../date-math/native-date-math.js';\nimport { formatDateValue } from '../format/index.js';\nimport { normalizeDigits } from '../format/parse.js';\nimport { computePopupPosition } from '../position/index.js';\nimport type { CalendarAdapter, CalendarMode, DateRange, DateValue } from '../types.js';\n\ntype CalendarView = 'day' | 'month' | 'year';\n\n// The subset of controller behaviour the shared header + month/year grids use.\n// Both the datetime and range controllers satisfy this structurally. `mode` is\n// absent on the month picker (always BS), so it's read as `mode ?? 'BS'`.\ninterface ViewControls {\n  getState(): { view: CalendarView; viewYear: number; viewMonth: number; yearGroupStart: number; mode?: CalendarMode; showSecondaryCalendar?: boolean };\n  navigateMonth(delta: number): void;\n  navigateYear(delta: number): void;\n  navigateYearGroup(delta: number): void;\n  setView(view: CalendarView): void;\n  selectMonthView(month: number): void;\n  selectYearView(year: number): void;\n}\n\nfunction el<K extends keyof HTMLElementTagNameMap>(tag: K, className?: string, attrs: Record<string, string> = {}): HTMLElementTagNameMap[K] {\n  const node = document.createElement(tag);\n  if (className) node.className = className;\n  Object.entries(attrs).forEach(([key, value]) => node.setAttribute(key, value));\n  return node;\n}\n\nfunction setText(node: HTMLElement, text: string): HTMLElement {\n  node.textContent = text;\n  return node;\n}\n\nfunction pad2(value: number): string {\n  return String(value).padStart(2, '0');\n}\n\nfunction isSameDay(a: DateValue | null | undefined, b: DateValue | null | undefined): boolean {\n  return !!a && !!b && a.ad.getTime() === b.ad.getTime();\n}\n\nfunction inRange(range: DateRange | null, value: DateValue): boolean {\n  if (!range) return false;\n  return value.ad.getTime() >= range.start.ad.getTime() && value.ad.getTime() <= range.end.ad.getTime();\n}\n\nfunction classForRange(value: DateValue, range: DateRange | null, today: DateValue): string {\n  const classes = ['ndp-cell'];\n  if (isSameDay(value, today)) classes.push('is-today');\n  if (inRange(range, value)) classes.push('is-in-range');\n  if (isSameDay(range?.start, value)) classes.push('is-range-start');\n  if (isSameDay(range?.end, value)) classes.push('is-range-end');\n  return classes.join(' ');\n}\n\nfunction navButton(glyph: string, aria: string, onClick: () => void, hidden = false): HTMLElement {\n  const button = setText(el('button', 'ndp-nav', { type: 'button', 'aria-label': aria || glyph }), glyph);\n  if (hidden) {\n    button.classList.add('is-hidden');\n    button.setAttribute('tabindex', '-1');\n    button.setAttribute('aria-hidden', 'true');\n  } else {\n    button.addEventListener('click', onClick);\n  }\n  return button;\n}\n\n// Label a cross-calendar month span as \"Month/Month[ Year/Year]\" when the\n// viewed month overlaps two months of the other calendar (the usual case —\n// BS/AD months are offset by roughly half a month), or a single name when it\n// doesn't. BS names render in Devanagari, AD names in English, matching how\n// each calendar is always scripted regardless of primary/secondary position.\nfunction monthSpanText(span: MonthSpan, otherMode: CalendarMode, adapter: CalendarAdapter, withYear = true): string {\n  const names = otherMode === 'AD' ? GREGORIAN_MONTHS_SHORT : adapter.bsMonthNames('ne');\n  const startName = names[span.start.month - 1];\n  const endName = names[span.end.month - 1];\n  const months = startName === endName ? startName : `${startName}/${endName}`;\n  if (!withYear) return months;\n  const yearOf = (y: number) => (otherMode === 'AD' ? String(y) : adapter.toLocaleDigits(y, 'ne'));\n  const years = span.start.year === span.end.year ? yearOf(span.start.year) : `${yearOf(span.start.year)}/${yearOf(span.end.year)}`;\n  return `${months} ${years}`;\n}\n\n// View-aware header: the label drills down day → month → year, and the arrows\n// step month/year/year-group depending on which view is showing. The active\n// `mode` decides which calendar is the big/primary label (what's navigated)\n// and which is the small/secondary hint — the two swap when mode is 'AD'.\nfunction renderHeader(controller: ViewControls): HTMLElement {\n  const adapter = defaultCalendarAdapter;\n  const { view, viewYear, viewMonth, yearGroupStart, mode = 'BS', showSecondaryCalendar = true } = controller.getState();\n  const header = el('div', 'ndp-cal-header');\n\n  let outerPrev: HTMLElement;\n  let innerPrev: HTMLElement;\n  let innerNext: HTMLElement;\n  let outerNext: HTMLElement;\n  if (view === 'day') {\n    outerPrev = navButton('«', 'Previous year', () => controller.navigateYear(-1));\n    innerPrev = navButton('‹', 'Previous month', () => controller.navigateMonth(-1));\n    innerNext = navButton('›', 'Next month', () => controller.navigateMonth(1));\n    outerNext = navButton('»', 'Next year', () => controller.navigateYear(1));\n  } else if (view === 'month') {\n    outerPrev = navButton('«', '', () => {}, true);\n    innerPrev = navButton('‹', 'Previous year', () => controller.navigateYear(-1));\n    innerNext = navButton('›', 'Next year', () => controller.navigateYear(1));\n    outerNext = navButton('»', '', () => {}, true);\n  } else {\n    outerPrev = navButton('«', '', () => {}, true);\n    innerPrev = navButton('‹', 'Previous years', () => controller.navigateYearGroup(-1));\n    innerNext = navButton('›', 'Next years', () => controller.navigateYearGroup(1));\n    outerNext = navButton('»', '', () => {}, true);\n  }\n\n  const label = el('button', 'ndp-cal-label', { type: 'button', 'aria-live': 'polite', 'aria-label': 'Switch calendar view' });\n  let primary: string;\n  let secondary: string;\n  if (view === 'day') {\n    const span = crossCalendarMonthSpan(mode, adapter, nativeDateMath, viewYear, viewMonth);\n    if (mode === 'AD') {\n      primary = `${GREGORIAN_MONTHS_SHORT[viewMonth - 1]} ${viewYear}`;\n      secondary = monthSpanText(span, 'BS', adapter);\n    } else {\n      primary = `${adapter.bsMonthNames('ne')[viewMonth - 1]} ${adapter.toLocaleDigits(viewYear, 'ne')}`;\n      secondary = monthSpanText(span, 'AD', adapter);\n    }\n    label.addEventListener('click', () => controller.setView('month'));\n  } else if (view === 'month') {\n    if (mode === 'AD') {\n      primary = String(viewYear);\n      secondary = `${adapter.adToBs(new Date(viewYear, 0, 1)).year} BS`;\n    } else {\n      primary = adapter.toLocaleDigits(viewYear, 'ne');\n      secondary = `${adapter.bsToAd(viewYear, 1, 1).getFullYear()} AD`;\n    }\n    label.addEventListener('click', () => controller.setView('year'));\n  } else {\n    const { max } = viewYearBounds(mode, adapter);\n    const end = Math.min(yearGroupStart + 11, max);\n    if (mode === 'AD') {\n      primary = `${yearGroupStart} – ${end}`;\n      secondary = `${adapter.adToBs(new Date(yearGroupStart, 0, 1)).year} – ${adapter.adToBs(new Date(end, 0, 1)).year} BS`;\n    } else {\n      primary = `${adapter.toLocaleDigits(yearGroupStart, 'ne')} – ${adapter.toLocaleDigits(end, 'ne')}`;\n      secondary = `${adapter.bsToAd(yearGroupStart, 1, 1).getFullYear()} – ${adapter.bsToAd(end, 1, 1).getFullYear()}`;\n    }\n    label.addEventListener('click', () => controller.setView('day'));\n  }\n  label.appendChild(setText(el('div', 'ndp-cal-label-primary'), `${primary} ▾`));\n  if (showSecondaryCalendar) label.appendChild(setText(el('div', 'ndp-cal-label-secondary'), secondary));\n\n  header.append(outerPrev, innerPrev, label, innerNext, outerNext);\n  return header;\n}\n\nfunction renderWeekdays(mode: CalendarMode = 'BS'): HTMLElement {\n  const row = el('div', 'ndp-weekdays', { role: 'row' });\n  defaultCalendarAdapter.bsWeekdayShort(mode === 'AD' ? 'en' : 'ne').forEach((weekday) => row.appendChild(setText(el('div', 'ndp-weekday', { role: 'columnheader' }), weekday)));\n  return row;\n}\n\nfunction renderMonthGrid(controller: ViewControls): HTMLElement {\n  const adapter = defaultCalendarAdapter;\n  const { viewYear, viewMonth, mode = 'BS', showSecondaryCalendar = true } = controller.getState();\n  const otherMode: CalendarMode = mode === 'AD' ? 'BS' : 'AD';\n  const grid = el('div', 'ndp-monthgrid', { role: 'grid' });\n  for (let index = 0; index < 12; index += 1) {\n    const month = index + 1;\n    const selected = month === viewMonth;\n    const primaryName = mode === 'AD' ? GREGORIAN_MONTHS_SHORT[index] : adapter.bsMonthNames('ne')[index];\n    const btn = setText(el('button', `ndp-monthcell${selected ? ' is-selected' : ''}`, { type: 'button', role: 'gridcell', 'aria-selected': selected ? 'true' : 'false' }), primaryName);\n    if (showSecondaryCalendar) {\n      // The other calendar's month usually straddles this one (~half-month\n      // offset), so show both overlapped months, e.g. \"Baisakh/Jestha\".\n      const span = crossCalendarMonthSpan(mode, adapter, nativeDateMath, viewYear, month);\n      btn.appendChild(setText(el('span', 'ndp-monthcell-en'), monthSpanText(span, otherMode, adapter, false)));\n    }\n    btn.addEventListener('click', () => controller.selectMonthView(month));\n    grid.appendChild(btn);\n  }\n  return grid;\n}\n\nfunction renderYearGrid(controller: ViewControls): HTMLElement {\n  const adapter = defaultCalendarAdapter;\n  const { viewYear, yearGroupStart, mode = 'BS', showSecondaryCalendar = true } = controller.getState();\n  const { min, max } = viewYearBounds(mode, adapter);\n  const grid = el('div', 'ndp-yeargrid', { role: 'grid' });\n  for (let i = 0; i < 12; i += 1) {\n    const year = yearGroupStart + i;\n    if (year < min || year > max) {\n      grid.appendChild(el('div', 'ndp-yearcell ndp-yearcell--empty', { role: 'gridcell' }));\n      continue;\n    }\n    const selected = year === viewYear;\n    const btn = el('button', `ndp-yearcell${selected ? ' is-selected' : ''}`, { type: 'button', role: 'gridcell', 'aria-selected': selected ? 'true' : 'false' });\n    const primaryDigits = mode === 'AD' ? String(year) : adapter.toLocaleDigits(year, 'ne');\n    btn.appendChild(setText(el('span', 'ndp-yearcell-bs'), primaryDigits));\n    if (showSecondaryCalendar) {\n      const secondaryLabel = mode === 'AD' ? String(adapter.adToBs(new Date(year, 0, 1)).year) : String(adapter.bsToAd(year, 1, 1).getFullYear());\n      btn.appendChild(setText(el('span', 'ndp-yearcell-en'), secondaryLabel));\n    }\n    btn.addEventListener('click', () => controller.selectYearView(year));\n    grid.appendChild(btn);\n  }\n  return grid;\n}\n\n// Year navigation header used while picking a month. The grid is months, so the\n// inner ‹ › step whole years; the outer slots stay hidden so the header keeps\n// the same 5-column layout (and full-width centered label) as the day header.\n// Mode-aware: \"Pick a Month\" spans a BS or a Gregorian month depending on mode.\nfunction renderMonthRangeHeader(controller: DateRangeController): HTMLElement {\n  const adapter = defaultCalendarAdapter;\n  const { viewYear, mode, showSecondaryCalendar } = controller.getState();\n  const header = el('div', 'ndp-cal-header');\n  const outerPrev = navButton('«', '', () => {}, true);\n  const innerPrev = navButton('‹', 'Previous year', () => controller.navigateYear(-1));\n  const innerNext = navButton('›', 'Next year', () => controller.navigateYear(1));\n  const outerNext = navButton('»', '', () => {}, true);\n  const label = el('div', 'ndp-cal-label ndp-cal-label--static');\n  if (mode === 'AD') {\n    label.appendChild(setText(el('div', 'ndp-cal-label-primary'), `${viewYear} AD`));\n    if (showSecondaryCalendar) label.appendChild(setText(el('div', 'ndp-cal-label-secondary'), `${adapter.adToBs(new Date(viewYear, 0, 1)).year} BS`));\n  } else {\n    label.appendChild(setText(el('div', 'ndp-cal-label-primary'), `${adapter.toLocaleDigits(viewYear, 'ne')} BS`));\n    if (showSecondaryCalendar) label.appendChild(setText(el('div', 'ndp-cal-label-secondary'), `${adapter.bsToAd(viewYear, 1, 1).getFullYear()} AD`));\n  }\n  header.append(outerPrev, innerPrev, label, innerNext, outerNext);\n  return header;\n}\n\n// The 12-month grid for month mode: one click selects the whole month (BS or\n// Gregorian, per the active mode), and the range spans that month's first →\n// last day.\nfunction renderMonthRangeGrid(controller: DateRangeController): HTMLElement {\n  const adapter = defaultCalendarAdapter;\n  const state = controller.getState();\n  const viewYear = state.viewYear;\n  const mode = state.mode;\n  const otherMode: CalendarMode = mode === 'AD' ? 'BS' : 'AD';\n  const sel = state.range;\n  const selStart = sel ? viewYearMonthOf(mode, adapter, sel.start.ad) : null;\n  const grid = el('div', 'ndp-monthgrid ndp-monthgrid--range', { role: 'grid' });\n  for (let index = 0; index < 12; index += 1) {\n    const month = index + 1;\n    const disabled = controller.isMonthDisabled(viewYear, month);\n    const selected = !!selStart && selStart.year === viewYear && selStart.month === month;\n    const primaryName = mode === 'AD' ? GREGORIAN_MONTHS_SHORT[index] : adapter.bsMonthNames('ne')[index];\n    const classes = ['ndp-monthcell'];\n    if (selected) classes.push('is-selected');\n    if (disabled) classes.push('is-disabled');\n    const btn = setText(el('button', classes.join(' '), { type: 'button', role: 'gridcell', 'aria-selected': selected ? 'true' : 'false' }), primaryName);\n    if (state.showSecondaryCalendar) {\n      const span = crossCalendarMonthSpan(mode, adapter, nativeDateMath, viewYear, month);\n      btn.appendChild(setText(el('span', 'ndp-monthcell-en'), monthSpanText(span, otherMode, adapter, false)));\n    }\n    if (disabled) btn.setAttribute('aria-disabled', 'true');\n    else btn.addEventListener('click', () => controller.selectMonth(viewYear, month));\n    grid.appendChild(btn);\n  }\n  return grid;\n}\n\nconst MODE_TOGGLE_SVG ='<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"1 4 1 10 7 10\"/><polyline points=\"23 20 23 14 17 14\"/><path d=\"M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15\"/></svg>';\n\n// A single-button BS/AD toggle with a swap glyph.\nfunction renderModeSwitch(mode: CalendarMode, toggle: () => void): HTMLElement {\n  const btn = el('button', 'ndp-mode-toggle', { type: 'button', 'aria-label': `Switch to ${mode === 'BS' ? 'AD' : 'BS'}` });\n  btn.setAttribute('data-mode', mode);\n  btn.innerHTML = MODE_TOGGLE_SVG;\n  btn.addEventListener('click', toggle);\n  return btn;\n}\n\nexport function renderRangePanel(root: HTMLElement, controller: DateRangeController): void {\n  const state = controller.getState();\n  const adapter = defaultCalendarAdapter;\n  const fmt = (value: DateValue) => formatDateValue(value.ad, adapter, { mode: state.mode, locale: state.mode === 'BS' ? 'ne' : 'en' });\n  root.innerHTML = '';\n  const panel = el('div', 'ndp-panel ndp-panel--range ndp-panel--compact', { role: 'dialog', 'aria-label': 'Date range picker' });\n\n  const presetRail = el('div', 'ndp-presets');\n  controller.getPresets().forEach((preset) => {\n    if (preset.kind === 'range') {\n      const btn = setText(el('button', `ndp-preset${state.activePresetId === preset.id ? ' is-active' : ''}`, { type: 'button' }), preset.label);\n      btn.addEventListener('click', () => controller.selectPreset(preset.id));\n      presetRail.appendChild(btn);\n      return;\n    }\n    const btn = setText(el('button', `ndp-preset ndp-preset--submenu${state.activePresetId === preset.id ? ' is-active' : ''}${state.openSubmenuId === preset.id ? ' is-open' : ''}`, { type: 'button' }), preset.label);\n    btn.addEventListener('click', () => {\n      if (preset.id === 'custom') controller.startCustomRange();\n      else if (preset.id === 'month') controller.startMonthSelect();\n      else controller.toggleSubmenu(preset.id);\n    });\n    presetRail.appendChild(btn);\n    if (state.openSubmenuId === preset.id) {\n      const list = el('div', 'ndp-submenu-list');\n      preset.items?.forEach((item) => {\n        const itemBtn = setText(el('button', 'ndp-submenu-item', { type: 'button' }), item.label);\n        itemBtn.addEventListener('click', () => controller.selectSubmenuItem(preset.id, item.id));\n        list.appendChild(itemBtn);\n      });\n      presetRail.appendChild(list);\n    }\n  });\n\n  const calCol = el('div', 'ndp-cal-col');\n\n  // Input group: Start · End · BS/AD switch, joined as one control. The active\n  // field is highlighted so custom-range selection has clear, live feedback.\n  const awaitingStart = !state.pendingStart && !state.range;\n  const awaitingEnd = !!state.pendingStart;\n  const startText = state.pendingStart ? fmt(state.pendingStart) : state.range ? fmt(state.range.start) : 'Start';\n  const endText = state.pendingStart ? 'End' : state.range ? fmt(state.range.end) : 'End';\n  const group = el('div', 'ndp-input-group');\n  const startField = el('div', `ndp-ig-field${awaitingStart ? ' is-active' : ''}`);\n  startField.append(setText(el('span', 'ndp-ig-label'), 'Start'), setText(el('span', 'ndp-ig-value'), startText));\n  const endField = el('div', `ndp-ig-field${awaitingEnd ? ' is-active' : ''}`);\n  endField.append(setText(el('span', 'ndp-ig-label'), 'End'), setText(el('span', 'ndp-ig-value'), endText));\n  group.append(startField, setText(el('span', 'ndp-ig-arrow', { 'aria-hidden': 'true' }), '→'), endField);\n  if (state.allowModeToggle) {\n    group.appendChild(renderModeSwitch(state.mode, () => controller.toggleMode()));\n  }\n  calCol.appendChild(group);\n\n  const monthUnit = state.selectionUnit === 'month';\n\n  if (monthUnit) {\n    calCol.appendChild(setText(el('div', 'ndp-range-hint'), 'महिना छान्नुहोस् · pick a month for its full date span'));\n  } else if (state.activePresetId === 'custom' || state.pendingStart) {\n    // Guidance shown while picking a custom day range, so clicking \"Custom\n    // Range\" has an obvious effect instead of feeling like nothing happened.\n    const message = state.pendingStart ? 'अन्त्य मिति छान्नुहोस् · now pick the end date' : 'सुरु मिति छान्नुहोस् · pick the start date';\n    calCol.appendChild(setText(el('div', 'ndp-range-hint'), message));\n  }\n\n  if (monthUnit) {\n    calCol.appendChild(renderMonthRangeHeader(controller));\n    calCol.appendChild(renderMonthRangeGrid(controller));\n  } else {\n    calCol.appendChild(renderHeader(controller));\n    if (state.view === 'day') {\n      calCol.appendChild(renderWeekdays(state.mode));\n      const grid = el('div', 'ndp-grid', { role: 'grid' });\n      const preview = previewRange(state);\n      controller.buildMonthCells(state.viewYear, state.viewMonth).forEach((cell) => {\n        if (!cell) {\n          grid.appendChild(el('div', 'ndp-cell ndp-cell--empty', { role: 'gridcell' }));\n          return;\n        }\n        const disabled = controller.isDisabled(cell);\n        const cls = classForRange(cell, preview, controller.getToday()) + (disabled ? ' is-disabled' : '');\n        const btn = el('button', cls, { type: 'button', role: 'gridcell', 'aria-selected': inRange(preview, cell) ? 'true' : 'false' });\n        if (disabled) btn.setAttribute('aria-disabled', 'true');\n        const primaryDay = state.mode === 'AD' ? String(cell.ad.getDate()) : adapter.toLocaleDigits(cell.bs.day, 'ne');\n        btn.appendChild(setText(el('span', 'ndp-cell-primary'), primaryDay));\n        if (state.showSecondaryCalendar) {\n          const secondaryDay = state.mode === 'AD' ? adapter.toLocaleDigits(cell.bs.day, 'ne') : String(cell.ad.getDate());\n          btn.appendChild(setText(el('span', 'ndp-cell-secondary'), secondaryDay));\n        }\n        if (!disabled) {\n          btn.addEventListener('click', () => controller.selectDay(cell));\n          btn.addEventListener('mouseenter', () => controller.hoverDay(cell));\n        }\n        grid.appendChild(btn);\n      });\n      calCol.appendChild(grid);\n    } else if (state.view === 'month') {\n      calCol.appendChild(renderMonthGrid(controller));\n    } else {\n      calCol.appendChild(renderYearGrid(controller));\n    }\n  }\n\n  const apply = setText(el('button', 'ndp-apply', { type: 'button' }), 'Apply');\n  apply.addEventListener('click', () => controller.apply());\n  calCol.appendChild(apply);\n\n  panel.append(presetRail, calCol);\n  root.appendChild(panel);\n}\n\nfunction meridiemOf(hour: number): 'AM' | 'PM' {\n  return hour < 12 ? 'AM' : 'PM';\n}\n\nfunction to12h(hour: number): number {\n  const h = hour % 12;\n  return h === 0 ? 12 : h;\n}\n\ninterface WheelItem {\n  value: number;\n  text: string;\n  disabled: boolean;\n}\n\n// A scrollable \"drum\" column, iOS-style. The row nearest the center band is the\n// selection; disabled rows are shown struck-through and skipped when the scroll\n// settles. Clicking a row selects it directly — the deterministic path used by\n// keyboard/touch/tests — while a flick-scroll commits the centered value once it\n// comes to rest (a full re-render then re-centers on the committed row).\nfunction timeWheel(label: string, items: WheelItem[], selectedValue: number, onSelect: (value: number) => void): HTMLElement {\n  const wheel = el('div', 'ndp-wheel', { role: 'listbox', 'aria-label': label });\n  const list = el('div', 'ndp-wheel-list');\n  const rows: HTMLElement[] = [];\n  let selectedIndex = Math.max(0, items.findIndex((it) => it.value === selectedValue));\n\n  items.forEach((it) => {\n    const classes = ['ndp-wheel-item'];\n    if (it.disabled) classes.push('is-disabled');\n    if (it.value === selectedValue) classes.push('is-selected');\n    const row = setText(el('button', classes.join(' '), {\n      type: 'button',\n      role: 'option',\n      tabindex: '-1',\n      'aria-selected': it.value === selectedValue ? 'true' : 'false',\n      'aria-disabled': it.disabled ? 'true' : 'false',\n    }), it.text);\n    if (!it.disabled) row.addEventListener('click', () => onSelect(it.value));\n    rows.push(row);\n    list.appendChild(row);\n  });\n  wheel.appendChild(list);\n\n  const center = (): void => {\n    const row = rows[selectedIndex];\n    if (row) list.scrollTop = row.offsetTop - (list.clientHeight - row.clientHeight) / 2;\n  };\n\n  let settle = 0;\n  list.addEventListener('scroll', () => {\n    window.clearTimeout(settle);\n    settle = window.setTimeout(() => {\n      const mid = list.scrollTop + list.clientHeight / 2;\n      let bestIndex = selectedIndex;\n      let bestDist = Infinity;\n      rows.forEach((row, i) => {\n        if (items[i].disabled) return;\n        const dist = Math.abs(row.offsetTop + row.clientHeight / 2 - mid);\n        if (dist < bestDist) { bestDist = dist; bestIndex = i; }\n      });\n      if (items[bestIndex] && items[bestIndex].value !== selectedValue) onSelect(items[bestIndex].value);\n      else { selectedIndex = bestIndex; center(); }\n    }, 130);\n  }, { passive: true });\n\n  if (typeof requestAnimationFrame === 'function') requestAnimationFrame(center);\n  else center();\n  return wheel;\n}\n\n// An accessible, keyboard-first numeric field for one time segment. It's an\n// ARIA spinbutton: type digits (masked to two, Nepali digits accepted), Arrow\n// Up/Down steps, Enter/blur commits. `onCommit` returns false for an invalid or\n// disabled value, and the field reverts to the last good display. `field` tags\n// the element so focus can be restored after the panel re-renders.\nfunction timeInput(opts: {\n  field: string;\n  label: string;\n  display: string;\n  min: number;\n  max: number;\n  now: number;\n  onCommit: (raw: string) => boolean;\n  onStep: (delta: number) => void;\n}): HTMLInputElement {\n  const input = el('input', 'ndp-time-input', {\n    type: 'text',\n    inputmode: 'numeric',\n    autocomplete: 'off',\n    maxlength: '2',\n    role: 'spinbutton',\n    'aria-label': opts.label,\n    'aria-valuemin': String(opts.min),\n    'aria-valuemax': String(opts.max),\n    'aria-valuenow': String(opts.now),\n    'aria-valuetext': opts.display,\n    'data-ndp-field': opts.field,\n  }) as HTMLInputElement;\n  input.value = opts.display;\n  const revert = () => { input.value = opts.display; input.classList.remove('ndp-input-invalid'); };\n  input.addEventListener('focus', () => input.select());\n  input.addEventListener('input', () => {\n    input.value = normalizeDigits(input.value).replace(/\\D/g, '').slice(0, 2);\n    // Live invalid hint without committing (empty is neutral, not invalid).\n    const n = Number(input.value);\n    const bad = input.value !== '' && (Number.isNaN(n) || n < opts.min || n > opts.max);\n    input.classList.toggle('ndp-input-invalid', bad);\n  });\n  input.addEventListener('keydown', (e) => {\n    if (e.key === 'ArrowUp') { e.preventDefault(); opts.onStep(1); }\n    else if (e.key === 'ArrowDown') { e.preventDefault(); opts.onStep(-1); }\n    else if (e.key === 'Enter') { e.preventDefault(); if (!opts.onCommit(input.value)) revert(); }\n  });\n  input.addEventListener('blur', () => { if (!opts.onCommit(input.value)) revert(); });\n  return input;\n}\n\nfunction renderTimeControls(controller: DateTimeController): HTMLElement | null {\n  const state = controller.getState();\n  if (!state.time) return null;\n  const { hour, minute, second } = state.time;\n  const is12h = state.timeFormat === '12h';\n  const step = state.minuteStep > 0 ? state.minuteStep : 1;\n  const pm = meridiemOf(hour) === 'PM';\n\n  const panel = el('div', 'ndp-time-panel');\n  panel.appendChild(setText(el('div', 'ndp-time-title'), 'समय / Time'));\n\n  const to24 = (display: number): number => (is12h ? (display % 12) + (pm ? 12 : 0) : display);\n  const hourDisplay = is12h ? to12h(hour) : hour;\n\n  // ---- editable entry (keyboard-first): type HH : mm [AM/PM] ----\n  const entry = el('div', 'ndp-time-entry', { role: 'group', 'aria-label': 'Enter time' });\n  entry.appendChild(timeInput({\n    field: 'hour',\n    label: is12h ? 'Hour (1–12)' : 'Hour (0–23)',\n    display: pad2(hourDisplay),\n    min: is12h ? 1 : 0,\n    max: is12h ? 12 : 23,\n    now: hourDisplay,\n    onCommit: (raw) => {\n      if (raw === '') return false;\n      const n = Number(normalizeDigits(raw));\n      if (!Number.isInteger(n)) return false;\n      if (is12h) return n >= 1 && n <= 12 ? controller.setHour((n % 12) + (pm ? 12 : 0)) : false;\n      return controller.setHour(n);\n    },\n    onStep: (d) => controller.stepHour(d),\n  }));\n  entry.appendChild(setText(el('span', 'ndp-time-entry-colon', { 'aria-hidden': 'true' }), ':'));\n  entry.appendChild(timeInput({\n    field: 'minute',\n    label: 'Minute (0–59)',\n    display: pad2(minute),\n    min: 0,\n    max: 59,\n    now: minute,\n    onCommit: (raw) => {\n      if (raw === '') return false;\n      const n = Number(normalizeDigits(raw));\n      return Number.isInteger(n) ? controller.setMinute(n) : false;\n    },\n    onStep: (d) => controller.stepMinute(d),\n  }));\n  if (is12h) {\n    const ampm = setText(el('button', 'ndp-time-ampm', {\n      type: 'button',\n      'data-ndp-field': 'ampm',\n      'aria-label': `Meridiem, currently ${pm ? 'PM' : 'AM'}`,\n    }), pm ? 'PM' : 'AM');\n    ampm.addEventListener('click', () => controller.toggleMeridiem());\n    ampm.addEventListener('keydown', (e) => {\n      if (e.key === 'ArrowUp' || e.key === 'ArrowDown') { e.preventDefault(); controller.toggleMeridiem(); }\n    });\n    entry.appendChild(ampm);\n  }\n  panel.appendChild(entry);\n\n  const wheelsLabel = setText(el('div', 'ndp-time-scroll-hint', { 'aria-hidden': 'true' }), 'or scroll');\n  panel.appendChild(wheelsLabel);\n\n  const wheels = el('div', 'ndp-time-wheels');\n\n  // ---- hours ----\n  const hourItems: WheelItem[] = [];\n  if (is12h) {\n    for (let d = 1; d <= 12; d += 1) hourItems.push({ value: d, text: pad2(d), disabled: controller.isHourDisabled(to24(d)) });\n  } else {\n    for (let h = 0; h < 24; h += 1) hourItems.push({ value: h, text: pad2(h), disabled: controller.isHourDisabled(h) });\n  }\n  wheels.appendChild(timeWheel('Hour', hourItems, is12h ? to12h(hour) : hour, (display) => controller.setTime(to24(display), minute, second)));\n\n  wheels.appendChild(setText(el('span', 'ndp-wheel-colon'), ':'));\n\n  // ---- minutes ----\n  const minuteItems: WheelItem[] = [];\n  for (let m = 0; m < 60; m += step) minuteItems.push({ value: m, text: pad2(m), disabled: controller.isMinuteDisabled(hour, m) });\n  wheels.appendChild(timeWheel('Min', minuteItems, minute, (m) => controller.setTime(hour, m, second)));\n\n  // ---- meridiem (12h only) ----\n  if (is12h) {\n    const merItems: WheelItem[] = [\n      { value: 0, text: 'AM', disabled: false },\n      { value: 1, text: 'PM', disabled: false },\n    ];\n    wheels.appendChild(timeWheel('AM/PM', merItems, pm ? 1 : 0, (v) => { if ((v === 1) !== pm) controller.toggleMeridiem(); }));\n  }\n\n  panel.appendChild(wheels);\n\n  const now = setText(el('button', 'ndp-time-now', { type: 'button' }), 'अहिले / Now');\n  now.addEventListener('click', () => controller.setTimeToNow());\n  panel.appendChild(now);\n  return panel;\n}\n\nexport function renderDateTimePanel(root: HTMLElement, controller: DateTimeController): void {\n  const state = controller.getState();\n  const adapter = defaultCalendarAdapter;\n  // Preserve keyboard focus (and caret) across the full re-render so typing/\n  // arrowing in a time field isn't interrupted. Fields are tagged data-ndp-field.\n  const active = document.activeElement as HTMLElement | null;\n  const restoreField = active && root.contains(active) ? active.getAttribute('data-ndp-field') : null;\n  root.innerHTML = '';\n  const dateOnly = !state.time;\n  const panelClass = `ndp-panel ndp-panel--datetime${dateOnly ? ' ndp-panel--date-only' : ''}`;\n  const panel = el('div', panelClass, { role: 'dialog', 'aria-label': 'Date time picker' });\n  const calCol = el('div', 'ndp-cal-col');\n  calCol.appendChild(renderHeader(controller));\n\n  // Small \"Today\" shortcut, tucked above the grid rather than taking a full\n  // footer row — jumps back regardless of which month/year/view is showing,\n  // mirroring the time panel's \"Now\" button.\n  const todayRow = el('div', 'ndp-today-row');\n  const todayBtn = setText(el('button', 'ndp-today-btn', { type: 'button' }), 'आज / Today');\n  todayBtn.addEventListener('click', () => controller.goToday());\n  todayRow.appendChild(todayBtn);\n  calCol.appendChild(todayRow);\n\n  if (state.view === 'day') {\n    calCol.appendChild(renderWeekdays(state.mode));\n    const grid = el('div', 'ndp-grid', { role: 'grid' });\n    const todayBs = adapter.todayBs();\n    const today = controller.cellForBs(todayBs.year, todayBs.month, todayBs.day);\n    controller.buildMonthCells(state.viewYear, state.viewMonth).forEach((cell) => {\n      if (!cell) {\n        grid.appendChild(el('div', 'ndp-cell ndp-cell--empty', { role: 'gridcell' }));\n        return;\n      }\n      const disabled = controller.isDisabled(cell);\n      const classes = ['ndp-cell'];\n      if (isSameDay(cell, today)) classes.push('is-today');\n      if (isSameDay(cell, state.selected)) classes.push('is-range-start');\n      if (disabled) classes.push('is-disabled');\n      const btn = el('button', classes.join(' '), { type: 'button', role: 'gridcell', 'aria-selected': isSameDay(cell, state.selected) ? 'true' : 'false' });\n      if (disabled) btn.setAttribute('aria-disabled', 'true');\n      const primaryDay = state.mode === 'AD' ? String(cell.ad.getDate()) : adapter.toLocaleDigits(cell.bs.day, 'ne');\n      btn.appendChild(setText(el('span', 'ndp-cell-primary'), primaryDay));\n      if (state.showSecondaryCalendar) {\n        const secondaryDay = state.mode === 'AD' ? adapter.toLocaleDigits(cell.bs.day, 'ne') : String(cell.ad.getDate());\n        btn.appendChild(setText(el('span', 'ndp-cell-secondary'), secondaryDay));\n      }\n      if (!disabled) btn.addEventListener('click', () => controller.selectDay(cell));\n      grid.appendChild(btn);\n    });\n    calCol.appendChild(grid);\n  } else if (state.view === 'month') {\n    calCol.appendChild(renderMonthGrid(controller));\n  } else {\n    calCol.appendChild(renderYearGrid(controller));\n  }\n\n  // Calendar and time sit side by side on one screen (stacks on narrow widths);\n  // the action row spans the full width beneath both. The time panel only shows\n  // in the day view — month/year views are just for navigating.\n  const body = el('div', 'ndp-datetime-body');\n  body.appendChild(calCol);\n  const timeControls = state.view === 'day' ? renderTimeControls(controller) : null;\n  if (timeControls) body.appendChild(timeControls);\n  panel.appendChild(body);\n\n  // Show Clear/Done only when the panel stays open after selecting a date\n  // (i.e. withTime mode). In date-only mode the panel auto-closes on pick\n  // so the footer buttons would never be seen.\n  if (timeControls) {\n    const footer = el('div', 'ndp-button-row');\n    const clear = setText(el('button', 'ndp-secondary', { type: 'button' }), 'Clear');\n    const done = setText(el('button', 'ndp-apply', { type: 'button' }), 'Done');\n    clear.addEventListener('click', () => controller.clear());\n    done.addEventListener('click', () => controller.confirm());\n    footer.append(clear, done);\n    panel.appendChild(footer);\n  }\n\n  root.appendChild(panel);\n\n  if (restoreField) {\n    const next = panel.querySelector<HTMLElement>(`[data-ndp-field=\"${restoreField}\"]`);\n    if (next) {\n      next.focus();\n      if (next instanceof HTMLInputElement) next.select();\n    }\n  }\n}\n\nexport function renderMonthPickerPanel(root: HTMLElement, controller: MonthPickerController): void {\n  const state = controller.getState();\n  root.innerHTML = '';\n  const panel = el('div', 'ndp-panel ndp-panel--month', { role: 'dialog', 'aria-label': 'Month picker' });\n  const col = el('div', 'ndp-cal-col');\n  col.appendChild(renderHeader(controller));\n  col.appendChild(state.view === 'year' ? renderYearGrid(controller) : renderMonthGrid(controller));\n  panel.appendChild(col);\n  root.appendChild(panel);\n}\n\nexport function positionPopup(trigger: HTMLElement, popup: HTMLElement, options: { opens?: 'left' | 'right' | 'center' | 'auto'; drops?: 'down' | 'up' | 'auto' } = {}): void {\n  // Set fixed position + a throwaway top/left so the browser computes\n  // the correct shrink-wrap box before we measure it. On first open the\n  // portal is position:static and spans the full viewport width — the\n  // inner panel is much narrower, so measuring in static flow gives a\n  // wildly wrong width. All four assignments happen in one synchronous\n  // block; the browser won't paint until we return.\n  popup.style.position = 'fixed';\n  popup.style.top = '0px';\n  popup.style.left = '0px';\n  void popup.offsetHeight;\n  const rect = trigger.getBoundingClientRect();\n  const popupRect = popup.getBoundingClientRect();\n  const pos = computePopupPosition(rect, { width: popupRect.width, height: popupRect.height }, { width: window.innerWidth, height: window.innerHeight }, options);\n  popup.style.top = `${pos.top}px`;\n  popup.style.left = `${pos.left}px`;\n}\n","import { createDateRangeController } from '../application/date-range-controller.js';\nimport { createDateTimeController } from '../application/date-time-controller.js';\nimport { createMonthPickerController } from '../application/month-picker-controller.js';\nimport { formatDateValue, formatRange, formatMachineValue, stringifyMachineValue } from '../format/index.js';\nimport type { ValueFormat } from '../types.js';\nimport { attachSegmentedField } from './segmented-field.js';\nimport type { SegmentedField } from './segmented-field.js';\nimport { dateSchema, monthSchema, rangeSchema } from './segment-schemas.js';\nimport { defaultCalendarAdapter } from '../adapters/bs-ad-calendar-adapter.js';\nimport { positionPopup, renderDateTimePanel, renderMonthPickerPanel, renderRangePanel } from '../render/dom.js';\nimport type { DateRangePickerOptions, DateRangeResult, DateTimePickerOptions, DateTimeResult, MonthPickerOptions, MonthResult, PickerInstance } from '../types.js';\n\nexport const regional = {\n  ne: { locale: { separator: ' – ', applyLabel: 'लागू गर्नुहोस्', cancelLabel: 'रद्द गर्नुहोस्', firstDay: 0 } },\n  en: { locale: { separator: ' – ', applyLabel: 'Apply', cancelLabel: 'Cancel', firstDay: 0 } },\n};\n\nlet defaults: Partial<DateTimePickerOptions & DateRangePickerOptions> = {};\n\nexport function setDefaults(options: Partial<DateTimePickerOptions & DateRangePickerOptions>): void {\n  defaults = { ...defaults, ...options };\n}\n\nfunction resolveAppendTo(target: HTMLElement, appendTo?: string | HTMLElement): HTMLElement {\n  if (appendTo instanceof HTMLElement) return appendTo;\n  if (typeof appendTo === 'string') return document.querySelector<HTMLElement>(appendTo) ?? document.body;\n  return document.body;\n}\n\nfunction resolveTarget(ref?: string | HTMLElement): HTMLElement | null {\n  if (ref instanceof HTMLElement) return ref;\n  if (typeof ref === 'string') return document.querySelector<HTMLElement>(ref);\n  return null;\n}\n\n// Write a machine value into a form field (input/textarea/select) or element.\nfunction writeTargetValue(el: HTMLElement, value: string): void {\n  if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) el.value = value;\n  else el.textContent = value;\n}\n\n// Create a hidden <input name> inside the wrapper to carry the machine value,\n// and stop the visible input from also submitting its (display) value.\nfunction createHiddenSubmit(name: string, wrapper: HTMLElement, visible: HTMLInputElement): HTMLInputElement {\n  const hidden = document.createElement('input');\n  hidden.type = 'hidden';\n  hidden.name = name;\n  wrapper.appendChild(hidden);\n  if (visible.getAttribute('name')) visible.removeAttribute('name');\n  return hidden;\n}\n\n/** Wraps the trigger in an input-group container with a clear button and an\n *  optional BS/AD mode switch. Both buttons are always created; their\n *  visibility is decided live by the predicates so options like `clearable`\n *  and `allowModeToggle` can be toggled at runtime via `update()`. */\nfunction withInputGroup(\n  trigger: HTMLElement,\n  shouldShowClear: () => boolean,\n  onClear: () => void,\n  modeSwitch?: { mode: () => 'BS' | 'AD'; toggle: () => void; enabled: () => boolean },\n): { wrapper: HTMLElement; updateClear: () => void; updateMode: () => void } {\n  const wrapper = document.createElement('div');\n  wrapper.className = 'ndp-trigger-wrap';\n  trigger.parentNode?.insertBefore(wrapper, trigger);\n  wrapper.appendChild(trigger);\n\n  // ---- clear button ----\n  const clearBtn = document.createElement('button');\n  clearBtn.className = 'ndp-clear';\n  clearBtn.setAttribute('type', 'button');\n  clearBtn.setAttribute('aria-label', 'Clear');\n  clearBtn.innerHTML = '&#215;';\n  clearBtn.style.display = 'none';\n  clearBtn.addEventListener('click', (e) => {\n    e.stopPropagation();\n    onClear();\n  });\n  wrapper.appendChild(clearBtn);\n\n  function updateClear() {\n    clearBtn.style.display = shouldShowClear() ? '' : 'none';\n  }\n\n  // ---- mode switch segment ----\n  let updateMode = () => {};\n  if (modeSwitch) {\n    const btn = document.createElement('button');\n    btn.className = 'ndp-mode-toggle';\n    btn.setAttribute('type', 'button');\n    btn.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"1 4 1 10 7 10\"/><polyline points=\"23 20 23 14 17 14\"/><path d=\"M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15\"/></svg>';\n    btn.addEventListener('click', (e) => {\n      e.stopPropagation();\n      modeSwitch.toggle();\n    });\n    wrapper.appendChild(btn);\n\n    updateMode = () => {\n      btn.style.display = modeSwitch.enabled() ? '' : 'none';\n      btn.setAttribute('aria-label', `Switch to ${modeSwitch.mode() === 'BS' ? 'AD' : 'BS'}`);\n      btn.setAttribute('data-mode', modeSwitch.mode());\n    };\n    updateMode();\n  }\n\n  return { wrapper, updateClear, updateMode };\n}\n\n/** Wraps a controller's `update` so options captured in the mount closure\n *  (clearable, allowModeToggle, opens/drops, autoUpdateInput, appendTo)\n *  take effect live instead of only at construction time. */\nfunction makeLiveUpdate<T extends { update: (patch: Partial<O>) => void; getState: () => { isOpen: boolean } }, O>(\n  controller: T,\n  merged: O,\n  refresh: () => void,\n): void {\n  const base = controller.update.bind(controller);\n  controller.update = (patch: Partial<O>) => {\n    Object.assign(merged as object, patch);\n    base(patch);\n    refresh();\n  };\n}\n\nfunction trackPosition(trigger: HTMLElement, portal: HTMLElement, options: { opens?: 'left' | 'right' | 'center' | 'auto'; drops?: 'down' | 'up' | 'auto' }, getOpen: () => boolean): () => void {\n  let raf = 0;\n  function reposition() {\n    if (!getOpen() || portal.style.display === 'none') return;\n    cancelAnimationFrame(raf);\n    raf = requestAnimationFrame(() => positionPopup(trigger, portal, options));\n  }\n  document.addEventListener('scroll', reposition, { passive: true, capture: true });\n  window.addEventListener('resize', reposition);\n  return () => {\n    cancelAnimationFrame(raf);\n    document.removeEventListener('scroll', reposition, true);\n    window.removeEventListener('resize', reposition);\n  };\n}\n\nexport function mountDateRangePicker(target: HTMLInputElement | HTMLElement, options: DateRangePickerOptions = {}): PickerInstance<DateRangeResult, DateRangePickerOptions> {\n  const merged = { ...defaults, ...options } as DateRangePickerOptions;\n  const controller = createDateRangeController(merged);\n  const trigger = target instanceof HTMLInputElement ? target : document.createElement('button');\n  if (!(target instanceof HTMLInputElement)) {\n    trigger.setAttribute('type', 'button');\n    target.appendChild(trigger);\n  }\n  trigger.classList.add('ndp-trigger');\n  trigger.setAttribute('role', 'combobox');\n  trigger.setAttribute('aria-haspopup', 'dialog');\n  const allowInput = trigger instanceof HTMLInputElement && merged.allowInput !== false;\n  let segmented: SegmentedField | null = null;\n  const portal = document.createElement('div');\n  portal.className = 'ndp-panel-root';\n  portal.style.display = 'none';\n  resolveAppendTo(target, merged.appendTo ?? merged.container).appendChild(portal);\n\n  const unsubscribe = (controller as unknown as { onStateChange: (cb: () => void) => () => void }).onStateChange(render);\n  const outside = (event: MouseEvent) => {\n    if (!portal.contains(event.target as Node) && event.target !== trigger) controller.hide();\n  };\n  const stopTracking = trackPosition(trigger, portal, merged, () => controller.getState().isOpen);\n\n  const inputGroup = trigger instanceof HTMLInputElement\n    ? withInputGroup(\n      trigger,\n      () => merged.clearable !== false && controller.getValue() !== null,\n      () => controller.setValue(null),\n      { mode: () => controller.getState().mode, toggle: () => controller.toggleMode(), enabled: () => merged.allowModeToggle !== false },\n    )\n    : null;\n\n  // Machine value targets for the two endpoints (submitName / altField may be a\n  // single combined field or a { start, end } pair).\n  const rangeAdapter = merged.adapter ?? defaultCalendarAdapter;\n  const rangeMachineFormat: ValueFormat = merged.altFormat ?? merged.valueFormat ?? 'iso';\n  const rangeTargets: Array<{ el: HTMLElement; part: 'start' | 'end' | 'combined' }> = [];\n  if (trigger instanceof HTMLInputElement && inputGroup) {\n    const sn = merged.submitName;\n    if (typeof sn === 'string') rangeTargets.push({ el: createHiddenSubmit(sn, inputGroup.wrapper, trigger), part: 'combined' });\n    else if (sn) {\n      rangeTargets.push({ el: createHiddenSubmit(sn.start, inputGroup.wrapper, trigger), part: 'start' });\n      rangeTargets.push({ el: createHiddenSubmit(sn.end, inputGroup.wrapper, trigger), part: 'end' });\n    }\n  }\n  const af = merged.altField;\n  if (af && typeof af === 'object' && !(af instanceof HTMLElement)) {\n    const s = resolveTarget(af.start); if (s) rangeTargets.push({ el: s, part: 'start' });\n    const e = resolveTarget(af.end); if (e) rangeTargets.push({ el: e, part: 'end' });\n  } else if (af) {\n    const el = resolveTarget(af); if (el) rangeTargets.push({ el, part: 'combined' });\n  }\n  function syncMachine(): void {\n    if (!rangeTargets.length) return;\n    const r = controller.getValue();\n    let startStr = '';\n    let endStr = '';\n    if (r) {\n      startStr = stringifyMachineValue(formatMachineValue({ ad: r.start, bs: r.startBs }, rangeMachineFormat, rangeAdapter));\n      endStr = stringifyMachineValue(formatMachineValue({ ad: r.end, bs: r.endBs }, rangeMachineFormat, rangeAdapter));\n    }\n    const combined = r ? `${startStr},${endStr}` : '';\n    rangeTargets.forEach((t) => writeTargetValue(t.el, t.part === 'start' ? startStr : t.part === 'end' ? endStr : combined));\n  }\n\n  function updateInput(value = controller.getValue()): void {\n    if (segmented?.isEditing()) return;\n    if (!(trigger instanceof HTMLInputElement)) {\n      trigger.textContent = value?.formatted ?? 'Select date range';\n      return;\n    }\n    trigger.value = merged.autoUpdateInput !== false ? (value?.formatted ?? '') : trigger.value;\n  }\n\n  let wasOpen = false;\n  function render(): void {\n    const state = controller.getState();\n    trigger.setAttribute('aria-expanded', state.isOpen ? 'true' : 'false');\n    updateInput();\n    syncMachine();\n    inputGroup?.updateClear();\n    inputGroup?.updateMode();\n    portal.style.display = state.isOpen ? 'block' : 'none';\n    if (state.isOpen) {\n      renderRangePanel(portal, controller);\n      if (!wasOpen) positionPopup(trigger, portal, merged);\n    } else {\n      portal.innerHTML = '';\n    }\n    wasOpen = state.isOpen;\n  }\n\n  if (trigger instanceof HTMLInputElement) {\n    trigger.readOnly = !allowInput;\n    if (allowInput) {\n      segmented = attachSegmentedField(trigger, {\n        ...rangeSchema({ yearBounds: () => controller.yearBounds() }),\n        committed: () => controller.typedString(),\n        reference: () => controller.typedReference(),\n        formatted: () => controller.getValue()?.formatted ?? '',\n        validate: (ascii) => controller.validateTyped(ascii),\n        commit: (ascii) => controller.commitTyped(ascii),\n        open: () => controller.show(),\n        close: () => controller.hide(),\n      });\n    }\n  }\n  if (!allowInput) {\n    trigger.addEventListener('keydown', (event: Event) => {\n      const e = event as KeyboardEvent;\n      if (e.key === 'Escape' && controller.getState().isOpen) { e.preventDefault(); controller.hide(); }\n      else if ((e.key === 'ArrowDown' || e.key === 'Down') && !controller.getState().isOpen) { e.preventDefault(); controller.show(); }\n    });\n    trigger.addEventListener('focus', () => controller.show());\n  }\n  trigger.addEventListener('click', () => controller.show());\n  document.addEventListener('mousedown', outside, true);\n  controller.onChange((value) => {\n    updateInput(value);\n    inputGroup?.updateClear();\n    inputGroup?.updateMode();\n    target.dispatchEvent(new CustomEvent('apply.nepaliDateRangePicker', { bubbles: true, detail: value }));\n  });\n  render();\n\n  makeLiveUpdate(controller, merged, () => {\n    if (controller.getState().isOpen) positionPopup(trigger, portal, merged);\n  });\n\n  let igWrapper: HTMLElement | null = null;\n  if (inputGroup) igWrapper = inputGroup.wrapper;\n  const baseDestroy = controller.destroy;\n  controller.destroy = () => {\n    unsubscribe();\n    stopTracking();\n    segmented?.destroy();\n    if (igWrapper) igWrapper.remove();\n    document.removeEventListener('mousedown', outside, true);\n    portal.remove();\n    baseDestroy();\n  };\n  return controller;\n}\n\nexport function mountDateTimePicker(target: HTMLInputElement | HTMLElement, options: DateTimePickerOptions = {}): PickerInstance<DateTimeResult, DateTimePickerOptions> {\n  const merged = { ...defaults, ...options } as DateTimePickerOptions;\n  const controller = createDateTimeController(merged);\n  const trigger = target instanceof HTMLInputElement ? target : document.createElement('button');\n  if (!(target instanceof HTMLInputElement)) {\n    trigger.setAttribute('type', 'button');\n    target.appendChild(trigger);\n  }\n  trigger.classList.add('ndp-trigger');\n  trigger.setAttribute('role', 'combobox');\n  trigger.setAttribute('aria-haspopup', 'dialog');\n  const portal = document.createElement('div');\n  portal.className = 'ndp-panel-root';\n  portal.style.display = 'none';\n  resolveAppendTo(target, merged.appendTo).appendChild(portal);\n  const unsubscribe = (controller as unknown as { onStateChange: (cb: () => void) => () => void }).onStateChange(render);\n  const outside = (event: MouseEvent) => {\n    if (!portal.contains(event.target as Node) && event.target !== trigger) controller.hide();\n  };\n  const stopTracking = trackPosition(trigger, portal, merged, () => controller.getState().isOpen);\n\n  const inputGroup = trigger instanceof HTMLInputElement\n    ? withInputGroup(\n      trigger,\n      () => merged.clearable !== false && controller.getValue() !== null,\n      () => controller.setValue(null),\n      { mode: () => controller.getState().mode, toggle: () => controller.toggleMode(), enabled: () => merged.allowModeToggle !== false },\n    )\n    : null;\n\n  const allowInput = trigger instanceof HTMLInputElement && merged.allowInput !== false;\n  let segmented: SegmentedField | null = null;\n\n  // Machine (\"server\") value targets: an auto hidden input (submitName) and/or\n  // an explicit altField. The value follows valueFormat/altFormat, independent\n  // of the display calendar.\n  const dtAdapter = merged.adapter ?? defaultCalendarAdapter;\n  const machineFormat: ValueFormat = merged.altFormat ?? merged.valueFormat ?? 'iso';\n  const machineTargets: HTMLElement[] = [];\n  if (trigger instanceof HTMLInputElement) {\n    if (typeof merged.submitName === 'string' && inputGroup) machineTargets.push(createHiddenSubmit(merged.submitName, inputGroup.wrapper, trigger));\n    const alt = resolveTarget(merged.altField);\n    if (alt) machineTargets.push(alt);\n  }\n  function syncMachine(): void {\n    if (!machineTargets.length) return;\n    const r = controller.getValue();\n    const str = r ? stringifyMachineValue(formatMachineValue({ ad: r.ad, bs: r.bs, time: r.time }, machineFormat, dtAdapter, !!merged.withTime)) : '';\n    machineTargets.forEach((el) => writeTargetValue(el, str));\n  }\n\n  function updateInput(value = controller.getValue()): void {\n    // Never overwrite the field while the user is editing its segments.\n    if (segmented?.isEditing()) return;\n    const label = value?.formatted ?? 'Select date';\n    if (trigger instanceof HTMLInputElement) trigger.value = label === 'Select date' ? '' : label;\n    else trigger.textContent = label;\n  }\n\n  let wasOpen = false;\n  function render(): void {\n    const state = controller.getState();\n    trigger.setAttribute('aria-expanded', state.isOpen ? 'true' : 'false');\n    updateInput();\n    syncMachine();\n    inputGroup?.updateClear();\n    inputGroup?.updateMode();\n    portal.style.display = state.isOpen ? 'block' : 'none';\n    if (state.isOpen) {\n      renderDateTimePanel(portal, controller);\n      if (!wasOpen) positionPopup(trigger, portal, merged);\n    } else {\n      portal.innerHTML = '';\n    }\n    wasOpen = state.isOpen;\n  }\n\n  // The mount owns the input's read-only state (framework wrappers may render it\n  // read-only by default): a typeable field becomes a native-date-style\n  // segmented editor; otherwise it stays locked.\n  if (trigger instanceof HTMLInputElement) {\n    trigger.readOnly = !allowInput;\n    if (allowInput) {\n      segmented = attachSegmentedField(trigger, {\n        ...dateSchema({\n          yearBounds: () => controller.yearBounds(),\n          withTime: () => !!merged.withTime,\n          hour12: () => merged.timeFormat === '12h',\n        }),\n        committed: () => controller.typedString(),\n        reference: () => controller.typedReference(),\n        formatted: () => controller.getValue()?.formatted ?? '',\n        validate: (ascii) => controller.validateTyped(ascii),\n        commit: (ascii) => controller.commitTyped(ascii),\n        open: () => controller.show(),\n        close: () => controller.hide(),\n      });\n    }\n  }\n\n  // Keyboard for the non-typeable (read-only) field: Escape closes,\n  // Down/Alt+Down opens — the ARIA combobox pattern. The segmented editor\n  // handles its own keys when typing is allowed.\n  if (!allowInput) {\n    trigger.addEventListener('keydown', (event: Event) => {\n      const e = event as KeyboardEvent;\n      if (e.key === 'Escape' && controller.getState().isOpen) {\n        e.preventDefault();\n        controller.hide();\n      } else if ((e.key === 'ArrowDown' || e.key === 'Down') && !controller.getState().isOpen) {\n        e.preventDefault();\n        controller.show();\n      }\n    });\n  }\n\n  if (!allowInput) trigger.addEventListener('focus', () => controller.show());\n  trigger.addEventListener('click', () => controller.show());\n  document.addEventListener('mousedown', outside, true);\n  controller.onChange((value) => {\n    updateInput(value);\n    inputGroup?.updateClear();\n    inputGroup?.updateMode();\n    target.dispatchEvent(new CustomEvent('select.nepaliDatePicker', { bubbles: true, detail: value }));\n  });\n  render();\n\n  makeLiveUpdate(controller, merged, () => {\n    if (controller.getState().isOpen) positionPopup(trigger, portal, merged);\n  });\n\n  let igWrapper: HTMLElement | null = null;\n  if (inputGroup) igWrapper = inputGroup.wrapper;\n  const baseDestroy = controller.destroy;\n  controller.destroy = () => {\n    unsubscribe();\n    stopTracking();\n    segmented?.destroy();\n    if (igWrapper) igWrapper.remove();\n    document.removeEventListener('mousedown', outside, true);\n    portal.remove();\n    baseDestroy();\n  };\n  return controller;\n}\n\nexport function mountMonthPicker(target: HTMLInputElement | HTMLElement, options: MonthPickerOptions = {}): PickerInstance<MonthResult, MonthPickerOptions> {\n  const merged = { ...defaults, ...options } as MonthPickerOptions;\n  const controller = createMonthPickerController(merged);\n  const trigger = target instanceof HTMLInputElement ? target : document.createElement('button');\n  if (!(target instanceof HTMLInputElement)) {\n    trigger.setAttribute('type', 'button');\n    target.appendChild(trigger);\n  }\n  trigger.classList.add('ndp-trigger');\n  trigger.setAttribute('role', 'combobox');\n  trigger.setAttribute('aria-haspopup', 'dialog');\n  const allowInput = trigger instanceof HTMLInputElement && merged.allowInput !== false;\n  let segmented: SegmentedField | null = null;\n  const portal = document.createElement('div');\n  portal.className = 'ndp-panel-root';\n  portal.style.display = 'none';\n  resolveAppendTo(target, merged.appendTo ?? merged.container).appendChild(portal);\n  const unsubscribe = (controller as unknown as { onStateChange: (cb: () => void) => () => void }).onStateChange(render);\n  const outside = (event: MouseEvent) => {\n    if (!portal.contains(event.target as Node) && event.target !== trigger) controller.hide();\n  };\n  const stopTracking = trackPosition(trigger, portal, merged, () => controller.getState().isOpen);\n\n  const inputGroup = trigger instanceof HTMLInputElement\n    ? withInputGroup(trigger, () => merged.clearable !== false && controller.getValue() !== null, () => controller.setValue(null))\n    : null;\n\n  // A month is a from→to date range, so it delivers start/end machine values\n  // exactly like the range picker (single combined field, or a { start, end } pair).\n  const monthAdapter = merged.adapter ?? defaultCalendarAdapter;\n  const monthMachineFormat: ValueFormat = merged.altFormat ?? merged.valueFormat ?? 'iso';\n  const monthTargets: Array<{ el: HTMLElement; part: 'start' | 'end' | 'combined' }> = [];\n  if (trigger instanceof HTMLInputElement && inputGroup) {\n    const sn = merged.submitName;\n    if (typeof sn === 'string') monthTargets.push({ el: createHiddenSubmit(sn, inputGroup.wrapper, trigger), part: 'combined' });\n    else if (sn) {\n      monthTargets.push({ el: createHiddenSubmit(sn.start, inputGroup.wrapper, trigger), part: 'start' });\n      monthTargets.push({ el: createHiddenSubmit(sn.end, inputGroup.wrapper, trigger), part: 'end' });\n    }\n  }\n  const maf = merged.altField;\n  if (maf && typeof maf === 'object' && !(maf instanceof HTMLElement)) {\n    const s = resolveTarget(maf.start); if (s) monthTargets.push({ el: s, part: 'start' });\n    const e = resolveTarget(maf.end); if (e) monthTargets.push({ el: e, part: 'end' });\n  } else if (maf) {\n    const el = resolveTarget(maf); if (el) monthTargets.push({ el, part: 'combined' });\n  }\n  function syncMachine(): void {\n    if (!monthTargets.length) return;\n    const r = controller.getValue();\n    let startStr = '';\n    let endStr = '';\n    if (r) {\n      const days = monthAdapter.daysInBsMonth(r.year, r.month);\n      startStr = stringifyMachineValue(formatMachineValue({ ad: r.start, bs: { year: r.year, month: r.month, day: 1 } }, monthMachineFormat, monthAdapter));\n      endStr = stringifyMachineValue(formatMachineValue({ ad: r.end, bs: { year: r.year, month: r.month, day: days } }, monthMachineFormat, monthAdapter));\n    }\n    const combined = r ? `${startStr},${endStr}` : '';\n    monthTargets.forEach((t) => writeTargetValue(t.el, t.part === 'start' ? startStr : t.part === 'end' ? endStr : combined));\n  }\n\n  function updateInput(value = controller.getValue()): void {\n    if (segmented?.isEditing()) return;\n    const label = value?.formatted ?? '';\n    if (trigger instanceof HTMLInputElement) trigger.value = label;\n    else trigger.textContent = label || 'Select month';\n  }\n\n  let wasOpen = false;\n  function render(): void {\n    const state = controller.getState();\n    trigger.setAttribute('aria-expanded', state.isOpen ? 'true' : 'false');\n    updateInput();\n    syncMachine();\n    inputGroup?.updateClear();\n    portal.style.display = state.isOpen ? 'block' : 'none';\n    if (state.isOpen) {\n      renderMonthPickerPanel(portal, controller);\n      if (!wasOpen) positionPopup(trigger, portal, merged);\n    } else {\n      portal.innerHTML = '';\n    }\n    wasOpen = state.isOpen;\n  }\n\n  if (trigger instanceof HTMLInputElement) {\n    trigger.readOnly = !allowInput;\n    if (allowInput) {\n      segmented = attachSegmentedField(trigger, {\n        ...monthSchema({ yearBounds: () => controller.yearBounds() }),\n        committed: () => controller.typedString(),\n        reference: () => controller.typedReference(),\n        formatted: () => controller.getValue()?.formatted ?? '',\n        validate: (ascii) => controller.validateTyped(ascii),\n        commit: (ascii) => controller.commitTyped(ascii),\n        open: () => controller.show(),\n        close: () => controller.hide(),\n      });\n    }\n  }\n  if (!allowInput) {\n    trigger.addEventListener('keydown', (event: Event) => {\n      const e = event as KeyboardEvent;\n      if (e.key === 'Escape' && controller.getState().isOpen) { e.preventDefault(); controller.hide(); }\n      else if ((e.key === 'ArrowDown' || e.key === 'Down') && !controller.getState().isOpen) { e.preventDefault(); controller.show(); }\n    });\n    trigger.addEventListener('focus', () => controller.show());\n  }\n  trigger.addEventListener('click', () => controller.show());\n  document.addEventListener('mousedown', outside, true);\n  controller.onChange((value) => {\n    updateInput(value);\n    inputGroup?.updateClear();\n    target.dispatchEvent(new CustomEvent('select.nepaliMonthPicker', { bubbles: true, detail: value }));\n  });\n  render();\n\n  makeLiveUpdate(controller, merged, () => {\n    if (controller.getState().isOpen) positionPopup(trigger, portal, merged);\n  });\n\n  let igWrapper: HTMLElement | null = null;\n  if (inputGroup) igWrapper = inputGroup.wrapper;\n  const baseDestroy = controller.destroy;\n  controller.destroy = () => {\n    unsubscribe();\n    stopTracking();\n    segmented?.destroy();\n    if (igWrapper) igWrapper.remove();\n    document.removeEventListener('mousedown', outside, true);\n    portal.remove();\n    baseDestroy();\n  };\n  return controller;\n}\n\n// Machine-value options expressible as plain data-* attributes.\nfunction machineDataOptions(ds: DOMStringMap): { valueFormat?: ValueFormat; submitName?: string; altField?: string } {\n  const valueFormat = ds.valueFormat as ValueFormat | undefined;\n  return {\n    valueFormat: valueFormat || undefined,\n    submitName: ds.submitName || undefined,\n    altField: ds.altField || undefined,\n  };\n}\n\nexport function autoInit(root: ParentNode = document): void {\n  root.querySelectorAll<HTMLInputElement>('[data-nepali-datepicker]').forEach((input) => mountDateTimePicker(input, {\n    withTime: input.dataset.withTime === 'true',\n    timeFormat: input.dataset.timeFormat === '12h' ? '12h' : input.dataset.timeFormat === '24h' ? '24h' : undefined,\n    minuteStep: input.dataset.minuteStep ? Number(input.dataset.minuteStep) : undefined,\n    ...machineDataOptions(input.dataset),\n  }));\n  root.querySelectorAll<HTMLInputElement>('[data-nepali-daterange]').forEach((input) => mountDateRangePicker(input, {\n    fiscalStartMonth: input.dataset.fiscalStartMonth ? Number(input.dataset.fiscalStartMonth) : undefined,\n    ...machineDataOptions(input.dataset),\n  }));\n  root.querySelectorAll<HTMLInputElement>('[data-nepali-monthpicker]').forEach((input) => mountMonthPicker(input, {\n    ...machineDataOptions(input.dataset),\n  }));\n}\n\nexport function formatBoundRange(value: DateRangeResult): string {\n  return formatRange(value.start, value.end, defaultCalendarAdapter, { mode: 'BS', locale: 'ne' });\n}\n\nexport function formatBoundDate(value: DateTimeResult): string {\n  return formatDateValue(value.ad, defaultCalendarAdapter, { mode: 'BS', locale: 'ne' });\n}\n","import { defaultCalendarAdapter } from '../adapters/bs-ad-calendar-adapter.js';\nimport { nativeDateMath } from '../date-math/native-date-math.js';\nimport type { BsDate, CalendarAdapter, DateMath } from '../types.js';\n\nfunction compareBs(a: BsDate, b: BsDate): number {\n  return a.year * 10000 + a.month * 100 + a.day - (b.year * 10000 + b.month * 100 + b.day);\n}\n\nfunction makeNepaliFunctions(adapter: CalendarAdapter, dateMath: DateMath) {\n  return {\n    AD2BS: (d: Date) => adapter.adToBs(d),\n    BS2AD: (yearOrDate: number | BsDate, month?: number, day?: number) => {\n      const bs = typeof yearOrDate === 'object' ? yearOrDate : { year: yearOrDate, month: month ?? 1, day: day ?? 1 };\n      return adapter.bsToAd(bs.year, bs.month, bs.day);\n    },\n    ConvertToUnicode: (n: number | string) => adapter.toLocaleDigits(n, 'ne'),\n    ConvertToNumber: (value: number | string) => String(value).replace(/[०-९]/g, (char) => '०१२३४५६७८९'.indexOf(char).toString()),\n    AD: {\n      GetCurrentDate: () => new Date(),\n      GetCurrentYear: () => new Date().getFullYear(),\n      GetCurrentMonth: () => new Date().getMonth() + 1,\n      GetCurrentDay: () => new Date().getDate(),\n      GetDaysInMonth: (y: number, m: number) => dateMath.daysInMonth(y, m),\n      DatesDiff: (a: Date, b: Date) => dateMath.diff(a, b, 'day'),\n      AddDays: (d: Date, n: number) => dateMath.add(d, n, 'day'),\n      GetFullDate: (d: Date) => dateMath.format(d, 'DD MMMM YYYY'),\n    },\n    BS: {\n      GetCurrentDate: () => adapter.todayBs(),\n      GetCurrentYear: () => adapter.todayBs().year,\n      GetCurrentMonth: () => adapter.todayBs().month,\n      GetCurrentDay: () => adapter.todayBs().day,\n      GetDaysInMonth: (y: number, m: number) => adapter.daysInBsMonth(y, m),\n      GetMonths: () => adapter.bsMonthNames('en'),\n      GetMonthsInUnicode: () => adapter.bsMonthNames('ne'),\n      GetDaysUnicodeShort: () => adapter.bsWeekdayShort('ne'),\n      ValidateDate: (y: number, m: number, d: number) => {\n        try {\n          return d >= 1 && d <= adapter.daysInBsMonth(y, m);\n        } catch {\n          return false;\n        }\n      },\n      IsEqualTo: (a: BsDate, b: BsDate) => compareBs(a, b) === 0,\n      IsGreaterThan: (a: BsDate, b: BsDate) => compareBs(a, b) > 0,\n      IsLessThan: (a: BsDate, b: BsDate) => compareBs(a, b) < 0,\n      IsBetweenDates: (date: BsDate, start: BsDate, end: BsDate, inclusive = false) => {\n        const left = compareBs(date, start);\n        const right = compareBs(date, end);\n        return inclusive ? left >= 0 && right <= 0 : left > 0 && right < 0;\n      },\n    },\n  };\n}\n\nexport const nepaliFunctions = makeNepaliFunctions(defaultCalendarAdapter, nativeDateMath);\nexport { makeNepaliFunctions };\n"],"mappings":"oRAEA,IAAa,EAAc,KACd,EAAc,KACd,EAAc,CAAE,KAAM,IAAM,MAAO,EAAG,IAAK,EAAG,EAC9C,EAAc,CAAE,KAAM,KAAM,MAAO,EAAG,IAAK,CAAE,EAE7C,EAAwE,CACnF,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,IAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC1C,KAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAC5C,EAEgE,MAAM,KACpE,CAAE,OAAQ,GAA8B,GACvC,EAAG,IAAU,EAAyB,EAAc,EACvD,ECvIA,IAAM,EAAe,CAAC,UAAW,SAAU,QAAS,UAAW,SAAU,SAAU,SAAU,UAAW,QAAS,OAAQ,SAAU,SAAS,EACtI,EAAe,CAAC,QAAS,MAAO,OAAQ,SAAU,QAAS,SAAU,UAAW,SAAU,MAAO,MAAO,UAAW,OAAO,EAC1H,EAAc,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EAC9D,EAAc,CAAC,IAAK,KAAM,KAAM,KAAM,KAAM,KAAM,GAAG,EACrD,EAA4C,CAChD,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,GACP,EAEA,SAAS,EAAO,EAAoB,CAClC,OAAO,KAAK,IAAI,EAAK,YAAY,EAAG,EAAK,SAAS,EAAG,EAAK,QAAQ,CAAC,EAAI,KACzE,CAEA,SAAS,EAAc,EAAqB,CAC1C,OAAO,IAAI,KAAK,EAAM,KAAM,EAAM,MAAQ,EAAG,EAAM,GAAG,CACxD,CAKA,IAAM,EAAa,EAAc,EAAc,EACzC,EAA+B,CAAC,EAChC,EAA2B,MAAM,EAAa,CAAC,EACrD,EAAW,GAAK,EAChB,IAAK,IAAI,EAAY,EAAG,EAAY,EAAY,GAAa,EAAG,CAC9D,IAAM,EAAM,EAAyB,EAAc,GAC7C,EAAa,CAAC,CAAC,EACrB,IAAK,IAAI,EAAQ,EAAG,EAAQ,GAAI,GAAS,EAAG,EAAW,KAAK,EAAW,GAAS,EAAI,EAAM,EAC1F,EAAiB,KAAK,CAAU,EAChC,EAAW,EAAY,GAAK,EAAW,GAAa,EAAW,GACjE,CACA,IAAM,EAAa,EAAW,GAG9B,SAAS,EAAc,EAAc,EAAe,EAAqB,CACvE,IAAM,EAAY,EAAO,EACzB,OAAO,EAAW,GAAa,EAAiB,EAAU,CAAC,EAAQ,IAAM,EAAM,EACjF,CAEA,IAAM,EAAiB,EAAc,EAAY,KAAM,EAAY,MAAO,EAAY,GAAG,EAE5E,EAAb,KAA4D,qCAC9B,wBACA,EAE5B,OAAO,EAAsB,CAC3B,KAAK,cAAc,CAAM,EACzB,IAAM,EAAO,EAAO,CAAM,EAAI,EAAO,EAAc,CAAW,CAAC,EACzD,EAAO,KAAK,eAAe,EAAiB,CAAI,EAEtD,OADA,KAAK,cAAc,CAAI,EAChB,CACT,CAEA,OAAO,EAAc,EAAe,EAAmB,CACrD,KAAK,cAAc,CAAE,OAAM,QAAO,KAAI,CAAC,EACvC,IAAM,EAAO,EAAc,EAAM,EAAO,CAAG,EAAI,EACzC,EAAO,EAAc,CAAW,EAEtC,OADA,EAAK,QAAQ,EAAK,QAAQ,EAAI,CAAI,EAC3B,CACT,CAEA,cAAc,EAAc,EAAuB,CACjD,IAAM,EAAM,EAAyB,GACrC,GAAI,CAAC,GAAO,EAAQ,GAAK,EAAQ,GAC/B,MAAU,WAAW,8BAA8B,EAAK,GAAG,GAAO,EAEpE,OAAO,EAAI,EAAQ,EACrB,CAEA,SAAkB,CAChB,OAAO,KAAK,OAAO,IAAI,IAAM,CAC/B,CAEA,aAAa,EAAgC,CAC3C,OAAO,IAAW,KAAO,CAAC,GAAG,CAAY,EAAI,CAAC,GAAG,CAAY,CAC/D,CAEA,eAAe,EAAgC,CAC7C,OAAO,IAAW,KAAO,CAAC,GAAG,CAAW,EAAI,CAAC,GAAG,CAAW,CAC7D,CAEA,eAAe,EAAoB,EAA8B,CAC/D,IAAM,EAAQ,OAAO,CAAC,EAEtB,OADI,IAAW,KACR,EAAM,QAAQ,SAAW,GAAU,EAAkB,IAAU,CAAK,EAD/C,CAE9B,CAIA,eAAuB,EAA0B,CAC/C,GAAI,EAAW,GAAK,GAAY,EAC9B,MAAO,CAAE,KAAM,EAAc,EAAG,MAAO,EAAG,IAAK,CAAE,EAEnD,IAAI,EAAK,EACL,EAAK,EACT,KAAO,EAAK,GAAI,CACd,IAAM,EAAO,EAAK,EAAK,GAAM,EACzB,EAAW,IAAQ,EAAU,EAAK,EACjC,EAAK,EAAM,CAClB,CACA,IAAM,EAAY,EACZ,EAAY,EAAW,EAAW,GAClC,EAAa,EAAiB,GAChC,EAAQ,EACZ,KAAO,EAAQ,IAAM,EAAW,IAAU,GAAW,GAAS,EAC9D,MAAO,CAAE,KAAM,EAAc,EAAW,QAAO,IAAK,EAAY,EAAW,EAAQ,GAAK,CAAE,CAC5F,CAEA,cAAsB,EAAoB,CACxC,GAAI,EAAE,aAAkB,OAAS,OAAO,MAAM,EAAO,QAAQ,CAAC,EAC5D,MAAU,UAAU,0BAA0B,CAElD,CAEA,cAAsB,EAAoB,CACxC,GAAI,EAAK,KAAA,MAAsB,EAAK,KAAA,KAClC,MAAU,WAAW,WAAW,EAAK,KAAK,8BAA8B,EAAY,GAAG,GAAa,EAEtG,IAAM,EAAS,KAAK,cAAc,EAAK,KAAM,EAAK,KAAK,EACvD,GAAI,EAAK,IAAM,GAAK,EAAK,IAAM,EAC7B,MAAU,WAAW,oBAAoB,EAAK,KAAK,GAAG,EAAK,MAAM,GAAG,EAAK,KAAK,CAElF,CACF,EAEa,EAAyB,IAAI,EC5IpC,EAAgB,sCACT,EAAmB,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,UAAU,EAC5I,EAAyB,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACnH,EAAS,EACT,EAAW,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,UAAU,EAE9F,SAAS,EAAM,EAAkB,CAC/B,OAAO,IAAI,KAAK,EAAK,QAAQ,CAAC,CAChC,CAEA,SAAS,EAAK,EAAuB,CACnC,OAAO,OAAO,CAAK,CAAC,CAAC,SAAS,EAAG,GAAG,CACtC,CAEA,IAAa,EAA2B,CACtC,IAAI,EAAY,EAAgB,EAA0B,CACxD,IAAM,EAAO,EAAM,CAAI,EAIvB,OAHI,IAAS,OAAO,EAAK,QAAQ,EAAK,QAAQ,EAAI,CAAM,EACpD,IAAS,SAAS,EAAK,SAAS,EAAK,SAAS,EAAI,CAAM,EACxD,IAAS,QAAQ,EAAK,YAAY,EAAK,YAAY,EAAI,CAAM,EAC1D,CACT,EACA,KAAK,EAAS,EAAiB,CAC7B,IAAM,EAAO,KAAK,IAAI,EAAE,YAAY,EAAG,EAAE,SAAS,EAAG,EAAE,QAAQ,CAAC,EAC1D,EAAQ,KAAK,IAAI,EAAE,YAAY,EAAG,EAAE,SAAS,EAAG,EAAE,QAAQ,CAAC,EACjE,OAAO,KAAK,OAAO,EAAO,GAAS,KAAQ,CAC7C,EACA,OAAO,EAAY,EAAwB,CACzC,IAAM,EAAS,EAAK,SAAS,EAAI,IAAM,GACvC,OAAO,EAAO,QAAQ,EAAgB,GAAU,CAC9C,OAAQ,EAAR,CACE,IAAK,OAAQ,OAAO,OAAO,EAAK,YAAY,CAAC,EAC7C,IAAK,OAAQ,OAAO,EAAO,EAAK,SAAS,GACzC,IAAK,KAAM,OAAO,EAAK,EAAK,SAAS,EAAI,CAAC,EAC1C,IAAK,KAAM,OAAO,EAAK,EAAK,QAAQ,CAAC,EACrC,IAAK,OAAQ,OAAO,EAAS,EAAK,OAAO,GACzC,IAAK,KAAM,OAAO,EAAK,EAAK,SAAS,CAAC,EACtC,IAAK,KAAM,OAAO,EAAK,CAAM,EAC7B,IAAK,KAAM,OAAO,EAAK,EAAK,WAAW,CAAC,EACxC,IAAK,KAAM,OAAO,EAAK,EAAK,WAAW,CAAC,EACxC,IAAK,IAAK,OAAO,EAAK,SAAS,GAAK,GAAK,KAAO,KAChD,QAAS,OAAO,CAClB,CACF,CAAC,CACH,EACA,MAAM,EAA4C,CAChD,GAAI,aAAiB,KAAM,OAAO,OAAO,MAAM,EAAM,QAAQ,CAAC,EAAI,KAAO,EAAM,CAAK,EACpF,GAAI,OAAO,GAAU,SAAU,CAC7B,IAAM,EAAO,IAAI,KAAK,CAAK,EAC3B,OAAO,OAAO,MAAM,EAAK,QAAQ,CAAC,EAAI,KAAO,CAC/C,CACA,IAAM,EAAW,EAAM,MAAM,sBAAsB,EACnD,GAAI,IAAU,QAAS,OAAO,IAAI,KAClC,GAAI,EAAU,CACZ,GAAM,EAAG,EAAM,EAAW,GAAW,EAC/B,EAAS,OAAO,CAAS,GAAK,IAAS,IAAM,GAAK,GAClD,EAAO,IAAY,IAAM,MAAQ,IAAY,IAAM,QAAU,OACnE,OAAO,EAAe,IAAI,IAAI,KAAQ,EAAQ,CAAI,CACpD,CACA,IAAM,EAAO,IAAI,KAAK,CAAK,EAC3B,OAAO,OAAO,MAAM,EAAK,QAAQ,CAAC,EAAI,KAAO,CAC/C,EACA,QAAQ,EAAY,EAA0B,CAC5C,IAAM,EAAO,EAAM,CAAI,EAIvB,OAHI,IAAS,QAAQ,EAAK,SAAS,EAAG,CAAC,EACnC,IAAS,SAAS,EAAK,QAAQ,CAAC,EACpC,EAAK,SAAS,EAAG,EAAG,EAAG,CAAC,EACjB,CACT,EACA,MAAM,EAAY,EAA0B,CAC1C,IAAM,EAAO,EAAe,QAAQ,EAAe,IAAI,EAAM,EAAG,CAAI,EAAG,CAAI,EAE3E,OADA,EAAK,gBAAgB,EAAE,EAChB,CACT,EACA,YAAY,EAAc,EAAuB,CAC/C,OAAO,IAAI,KAAK,EAAM,EAAO,CAAC,CAAC,CAAC,QAAQ,CAC1C,CACF,EC7EA,SAAgB,EAAgB,EAAkB,CAChD,OAAO,IAAI,KAAK,EAAK,YAAY,EAAG,EAAK,SAAS,EAAG,EAAK,QAAQ,CAAC,CACrE,CAEA,SAAgB,EAAgB,EAA0B,EAAyB,CACjF,GAAI,EAAE,aAAkB,OAAS,OAAO,MAAM,EAAO,QAAQ,CAAC,EAC5D,MAAU,UAAU,iCAAiC,EAEvD,IAAM,EAAK,EAAgB,CAAM,EACjC,OAAO,OAAO,OAAO,CAAE,KAAI,GAAI,EAAQ,OAAO,CAAE,CAAE,CAAC,CACrD,CAEA,SAAgB,EAAgB,EAA0B,EAAuB,CAC/E,OAAO,EAAgB,EAAS,EAAQ,OAAO,EAAG,KAAM,EAAG,MAAO,EAAG,GAAG,CAAC,CAC3E,CAEA,SAAgB,GAAiB,EAAc,EAAsB,CACnE,OAAO,EAAE,GAAG,QAAQ,EAAI,EAAE,GAAG,QAAQ,CACvC,CAEA,SAAgB,GAAgB,EAAiC,EAA0C,CACzG,MAAO,CAAC,CAAC,GAAK,CAAC,CAAC,GAAK,EAAE,GAAG,QAAQ,IAAM,EAAE,GAAG,QAAQ,CACvD,CAEA,SAAgB,EAAgB,EAAkB,EAA2B,CAC3E,OAAO,GAAiB,EAAO,CAAG,GAAK,EACnC,OAAO,OAAO,CAAE,QAAO,KAAI,CAAC,EAC5B,OAAO,OAAO,CAAE,MAAO,EAAK,IAAK,CAAM,CAAC,CAC9C,CCpBA,SAAgB,EAAgB,EAAoB,EAA0B,EAA2B,CACvG,GAAI,IAAS,KAAM,MAAO,CAAE,KAAM,EAAK,YAAY,EAAG,MAAO,EAAK,SAAS,EAAI,CAAE,EACjF,IAAM,EAAK,EAAQ,OAAO,CAAI,EAC9B,MAAO,CAAE,KAAM,EAAG,KAAM,MAAO,EAAG,KAAM,CAC1C,CAGA,SAAgB,EAAiB,EAAoB,EAA0B,EAAc,EAAqB,CAChH,OAAO,IAAS,KAAO,IAAI,KAAK,EAAM,EAAQ,EAAG,CAAC,EAAI,EAAQ,OAAO,EAAM,EAAO,CAAC,CACrF,CAEA,SAAgB,GAAgB,EAAoB,EAA0B,EAAoB,EAAc,EAAuB,CACrI,OAAO,IAAS,KAAO,EAAS,YAAY,EAAM,CAAK,EAAI,EAAQ,cAAc,EAAM,CAAK,CAC9F,CAGA,SAAgB,GAAgB,EAAoB,EAA0B,EAAoB,EAAc,EAAqB,CACnI,IAAM,EAAO,GAAgB,EAAM,EAAS,EAAU,EAAM,CAAK,EACjE,OAAO,IAAS,KAAO,IAAI,KAAK,EAAM,EAAQ,EAAG,CAAI,EAAI,EAAQ,OAAO,EAAM,EAAO,CAAI,CAC3F,CAGA,SAAgB,EAAe,EAAoB,EAAwD,CAEzG,OADI,IAAS,KAAa,CAAE,IAAK,EAAQ,iBAAkB,IAAK,EAAQ,gBAAiB,EAClF,CACL,IAAK,EAAQ,OAAO,EAAQ,iBAAkB,EAAG,CAAC,CAAC,CAAC,YAAY,EAAI,EACpE,IAAK,EAAQ,OAAO,EAAQ,iBAAkB,EAAG,CAAC,CAAC,CAAC,YAAY,CAClE,CACF,CAEA,SAAgB,GAAc,EAAoB,EAA0B,EAAsB,CAChG,GAAM,CAAE,MAAK,OAAQ,EAAe,EAAM,CAAO,EACjD,OAAO,KAAK,IAAI,EAAK,KAAK,IAAI,EAAK,CAAI,CAAC,CAC1C,CAWA,SAAgB,GAAuB,EAAoB,EAA0B,EAAoB,EAAc,EAA0B,CAC/I,IAAM,EAAsB,IAAS,KAAO,KAAO,KAC7C,EAAQ,EAAiB,EAAM,EAAS,EAAM,CAAK,EACnD,EAAO,GAAgB,EAAM,EAAS,EAAU,EAAM,CAAK,EACjE,MAAO,CAAE,MAAO,EAAgB,EAAO,EAAS,CAAK,EAAG,IAAK,EAAgB,EAAO,EAAS,CAAI,CAAE,CACrG,CAMA,SAAgB,GAAoB,EAAoB,EAA0B,EAAoB,EAAc,EAAwC,CAC1J,IAAM,EAAO,GAAgB,EAAM,EAAS,EAAU,EAAM,CAAK,EAC3D,EAAU,EAAiB,EAAM,EAAS,EAAM,CAAK,CAAC,CAAC,OAAO,EAC9D,EAAiC,MAAM,KAAK,CAAE,OAAQ,CAAQ,MAAS,IAAI,EACjF,IAAK,IAAI,EAAM,EAAG,GAAO,EAAM,GAAO,EACpC,EAAM,KAAK,IAAS,KAAO,EAAgB,EAAS,IAAI,KAAK,EAAM,EAAQ,EAAG,CAAG,CAAC,EAAI,EAAgB,EAAS,CAAE,OAAM,QAAO,KAAI,CAAC,CAAC,EAEtI,KAAO,EAAM,OAAS,IAAI,EAAM,KAAK,IAAI,EACzC,OAAO,CACT,CCnEA,SAAgB,EAAa,EAAyC,EAAqB,EAA6B,CACtH,GAAI,GAAS,KAAM,OAAO,KAC1B,IAAM,EAAS,EAAS,MAAM,CAAK,EACnC,OAAO,EAAS,EAAgB,CAAM,EAAI,IAC5C,CAUA,SAAgB,GAAc,EAAY,EAA6B,EAAqB,EAAyB,CACnH,IAAM,EAAM,EAAgB,CAAI,EAC1B,EAAO,EAAI,QAAQ,EACnB,EAAM,EAAa,EAAY,QAAS,CAAQ,EACtD,GAAI,GAAO,EAAO,EAAI,QAAQ,EAAG,MAAO,GACxC,IAAM,EAAM,EAAa,EAAY,QAAS,CAAQ,EAItD,MADA,GAFI,GAAO,EAAO,EAAI,QAAQ,GAC1B,EAAY,kBAAoB,EAAY,iBAAiB,SAAS,EAAI,OAAO,CAAC,GAClF,EAAY,eAAiB,EAAY,cAAc,CAAG,EAEhE,CC7BA,IAAM,GAAc,CAAC,SAAU,SAAU,WAAY,SAAU,UAAW,WAAY,QAAQ,EACxF,GAAc,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,UAAU,EAQ3F,GAAgB,sCAEtB,SAAS,EAAK,EAAuB,CACnC,OAAO,OAAO,CAAK,CAAC,CAAC,SAAS,EAAG,GAAG,CACtC,CAEA,SAAgB,EAAgB,EAAY,EAA0B,EAIlE,CAAC,EAAW,CACd,IAAM,EAAO,EAAQ,MAAQ,KACvB,EAAS,EAAQ,QAAU,KAC3B,EAAS,EAAQ,QAAU,aAC3B,EAAS,EAAK,SAAS,EAAI,IAAM,GACjC,EAAK,IAAS,KAAO,EAAQ,OAAO,CAAI,EAAI,KAC5C,EAAW,IAAS,KAAO,EAAQ,aAAa,CAAM,EAAI,KAC1D,EAAW,IAAW,KAAO,EAAQ,aAAa,IAAI,EAAI,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,UAAU,EACnL,EAAW,IAAW,KAAO,GAAc,GAC3C,EAAM,EAAO,QAAQ,GAAgB,GAAU,CACnD,OAAQ,EAAR,CACE,IAAK,OAAQ,OAAO,OAAO,EAAK,EAAG,KAAO,EAAK,YAAY,CAAC,EAC5D,IAAK,OAAQ,OAAO,EAAM,EAAU,EAAG,MAAQ,IAAM,OAAO,EAAG,KAAK,EAAM,EAAS,EAAK,SAAS,IAAM,OAAO,EAAK,SAAS,EAAI,CAAC,EACjI,IAAK,KAAM,OAAO,EAAK,EAAK,EAAG,MAAQ,EAAK,SAAS,EAAI,CAAC,EAC1D,IAAK,KAAM,OAAO,EAAK,EAAK,EAAG,IAAM,EAAK,QAAQ,CAAC,EACnD,IAAK,OAAQ,OAAO,EAAS,EAAK,OAAO,IAAM,GAC/C,IAAK,KAAM,OAAO,EAAK,EAAK,SAAS,CAAC,EACtC,IAAK,KAAM,OAAO,EAAK,CAAM,EAC7B,IAAK,KAAM,OAAO,EAAK,EAAK,WAAW,CAAC,EACxC,IAAK,KAAM,OAAO,EAAK,EAAK,WAAW,CAAC,EACxC,IAAK,IAAK,OAAO,EAAK,SAAS,GAAK,GAAK,KAAO,KAChD,QAAS,OAAO,CAClB,CACF,CAAC,EACD,OAAO,IAAW,KAAO,EAAQ,eAAe,EAAK,CAAM,EAAI,CACjE,CAEA,SAAgB,GAAe,EAA+D,CAC5F,GAAI,GAAS,KAAM,OAAO,KAC1B,GAAI,aAAiB,KAAM,OAAO,OAAO,MAAM,EAAM,QAAQ,CAAC,EAAI,KAAO,IAAI,KAAK,CAAK,EACvF,IAAM,EAAO,IAAI,KAAK,CAAK,EAC3B,OAAO,OAAO,MAAM,EAAK,QAAQ,CAAC,EAAI,KAAO,CAC/C,CAEA,SAAgB,GAAY,EAAa,EAAW,EAA0B,EAK1E,CAAC,EAAW,CACd,IAAM,EAAY,EAAQ,WAAa,MACvC,MAAO,CACL,EAAgB,EAAO,EAAS,CAAO,EACvC,EAAgB,EAAK,EAAS,CAAO,CACvC,CAAC,CAAC,KAAK,CAAS,CAClB,CAKA,SAAgB,EACd,EACA,EACA,EACA,EAAW,GACa,CACxB,GAAI,OAAO,GAAW,SACpB,OAAO,EAAgB,EAAM,GAAI,EAAS,CAAE,KAAM,EAAO,SAAU,OAAQ,EAAO,OAAQ,OAAQ,IAAK,CAAC,EAE1G,GAAI,IAAW,YAAa,OAAO,EAAM,GAAG,QAAQ,EACpD,GAAI,IAAW,cAAe,OAAO,EAAM,GAC3C,IAAM,EAAO,GAAY,EAAM,KAAO,GAAG,EAAK,EAAM,KAAK,IAAI,EAAE,GAAG,EAAK,EAAM,KAAK,MAAM,IAAM,GAC9F,GAAI,IAAW,SAAU,CACvB,IAAM,EAAO,GAAG,EAAM,GAAG,KAAK,GAAG,EAAK,EAAM,GAAG,KAAK,EAAE,GAAG,EAAK,EAAM,GAAG,GAAG,IAC1E,OAAO,EAAO,GAAG,EAAK,GAAG,IAAS,CACpC,CAEA,IAAM,EAAK,EAAM,GACX,EAAO,GAAG,EAAG,YAAY,EAAE,GAAG,EAAK,EAAG,SAAS,EAAI,CAAC,EAAE,GAAG,EAAK,EAAG,QAAQ,CAAC,IAChF,OAAO,EAAO,GAAG,EAAK,GAAG,IAAS,CACpC,CAGA,SAAgB,EAAsB,EAAuC,CAI3E,OAHI,aAAiB,KACZ,GAAG,EAAM,YAAY,EAAE,GAAG,EAAK,EAAM,SAAS,EAAI,CAAC,EAAE,GAAG,EAAK,EAAM,QAAQ,CAAC,IAE9E,OAAO,CAAK,CACrB,CChGA,SAAS,GAAmB,EAAgB,EAAiB,EAAkC,CAC7F,OAAO,GAAW,EAAmB,EAAS,EAAS,CACzD,CAEA,SAAS,GAAgB,EAA0B,EAAqB,EAAsD,CAC5H,IAAM,EAAQ,EAAQ,OAAO,EAAa,EAAkB,CAAC,EACvD,EAAU,IAAqB,EAAI,EAAc,EAAc,EAC/D,EAAW,IAAqB,EAAI,GAAK,EAAmB,EAC5D,EAAS,EAAQ,cAAc,EAAS,CAAQ,EACtD,MAAO,CAAE,QAAO,IAAK,EAAQ,OAAO,EAAS,EAAU,CAAM,CAAE,CACjE,CAEA,SAAgB,GAAoB,EAAiC,EAA0B,EAAwC,CACrI,IAAM,EAAmB,EAAQ,kBAAoB,EAC/C,EAAW,EAAQ,oBAAsB,EACzC,EAAQ,IAAI,KACZ,EAAU,EAAQ,OAAO,CAAK,EAC9B,EAAU,GAAmB,EAAQ,KAAM,EAAQ,MAAO,CAAgB,EAC1E,EAAqB,CAAE,QAAO,mBAAkB,UAAS,UAAS,EAElE,GAAS,EAAY,EAAe,KAAmF,CAC3H,KACA,QACA,KAAM,QACN,SACF,GAEM,EAAU,MAAM,KAAK,CAAE,OAAQ,CAAS,GAAI,EAAG,IAAU,CAC7D,IAAM,EAAO,EAAU,EACvB,OAAO,EAAM,MAAM,IAAQ,GAAG,EAAK,GAAG,QAAQ,EAAO,GAAK,GAAG,CAAC,CAAC,SAAS,EAAG,GAAG,EAAE,SAAY,GAAgB,EAAS,EAAM,CAAgB,CAAC,CAC9I,CAAC,EAeD,MAAO,CAZL,EAAM,QAAS,SAAU,CAAE,YAAa,CAAE,MAAO,EAAO,IAAK,CAAM,EAAE,EACrE,EAAM,QAAS,eAAgB,CAAE,QAAO,eAAgB,CAAE,MAAO,EAAS,IAAI,EAAO,GAAI,KAAK,EAAG,IAAK,CAAM,EAAE,EAC9G,EAAM,SAAU,gBAAiB,CAAE,QAAO,eAAgB,CAAE,MAAO,EAAS,IAAI,EAAO,IAAK,KAAK,EAAG,IAAK,CAAM,EAAE,EACjH,EAAM,SAAU,gBAAiB,CAAE,QAAO,eAAgB,CAAE,MAAO,EAAS,IAAI,EAAO,IAAK,KAAK,EAAG,IAAK,CAAM,EAAE,EACjH,EAAM,SAAU,gBAAiB,CAAE,QAAO,eAAgB,CAAE,MAAO,EAAS,IAAI,EAAO,IAAK,KAAK,EAAG,IAAK,CAAM,EAAE,EACjH,EAAM,SAAU,gBAAiB,CAAE,QAAO,eAAgB,CAAE,MAAO,EAAS,IAAI,EAAO,IAAK,KAAK,EAAG,IAAK,CAAM,EAAE,EACjH,EAAM,OAAQ,gCAAmC,CAAE,MAAO,EAAQ,OAAO,EAAS,EAAkB,CAAC,EAAG,IAAK,CAAM,EAAE,EACrH,CAAE,GAAI,aAAc,MAAO,cAAe,KAAM,UAAW,MAAO,CAAQ,EAC1E,CAAE,GAAI,QAAS,MAAO,eAAgB,KAAM,UAAW,MAAO,CAAC,CAAE,EACjE,CAAE,GAAI,SAAU,MAAO,eAAgB,KAAM,UAAW,MAAO,CAAC,CAAE,CAG7D,CAAA,CAAM,IAAK,GAAW,CAC3B,GAAI,EAAO,OAAS,SAAW,CAAC,EAAO,QAAS,OAAO,EACvD,IAAM,EAAU,EAAO,QACvB,MAAO,CAAE,GAAG,EAAQ,YAAe,EAAQ,CAAG,CAAE,CAClD,CAAC,CACH,CAEA,SAAgB,GAAiB,EAAiC,EAA0B,EAAwC,CAWlI,OAVI,EAAQ,OACH,OAAO,QAAQ,EAAQ,MAAM,CAAC,CAAC,KAAK,CAAC,EAAO,CAAC,EAAO,OAAW,CACpE,GAAI,EAAM,YAAY,CAAC,CAAC,QAAQ,cAAe,GAAG,CAAC,CAAC,QAAQ,SAAU,EAAE,EACxE,QACA,KAAM,QACN,aAAgB,CAAE,QAAO,KAAI,EAC/B,EAAE,EAEA,EAAQ,UAAY,GAAc,CAAC,EACnC,MAAM,QAAQ,EAAQ,OAAO,EAAU,EAAQ,QAC5C,GAAoB,EAAS,EAAS,CAAQ,CACvD,CCRA,SAAgB,GAA0B,EAAyC,CAAC,EAAwB,CAC1G,IAAI,EAAU,CAAE,GAAG,CAAe,EAC5B,EAAU,EAAQ,SAAW,EAC7B,EAAW,EAAQ,UAAY,EACjC,EAAU,GAAiB,EAAS,EAAS,CAAQ,EACrD,EAAqD,CAAC,EACtD,EAAoC,CAAC,EACnC,EAAQ,EAAgB,EAAS,IAAI,IAAM,EAI3C,EAAgB,EAAQ,QAAU,IAAA,GAA4B,EAAQ,aAAxB,EAAQ,MACtD,EAAe,IAAkB,EAAQ,gBAAkB,EAAmB,EAAQ,eAAe,EAAI,MACzG,EAAa,GAAgB,EAAoB,EACjD,EAA4B,EAAQ,MAAQ,KAC5C,EAAc,EAAgB,EAAa,EAAS,EAAW,GAAG,EAEpE,EAAkC,CACpC,OAAQ,GACR,KAAM,EACN,gBAAiB,EAAQ,kBAAoB,GAC7C,sBAAuB,EAAQ,wBAA0B,GACzD,SAAU,EAAY,KACtB,UAAW,EAAY,MACvB,MAAO,EAAe,EAAgB,EAAgB,EAAS,EAAa,KAAK,EAAG,EAAgB,EAAS,EAAa,GAAG,CAAC,EAAI,KAClI,aAAc,KACd,UAAW,KACX,eAAgB,EAAgB,KAAQ,EAAQ,iBAAmB,KACnE,cAAe,KACf,KAAM,MACN,eAAgB,EAAY,KAAO,EACnC,cAAe,KACjB,EAIM,GAAgB,EAAc,IAA6B,EAAgB,EAAS,EAAiB,EAAM,KAAM,EAAS,EAAM,CAAK,CAAC,EACtI,GAAe,EAAc,IAA6B,EAAgB,EAAS,GAAgB,EAAM,KAAM,EAAS,EAAU,EAAM,CAAK,CAAC,EAE9I,EAAQ,GAAsB,OAAO,CAAC,CAAC,CAAC,SAAS,EAAG,GAAG,EAG7D,SAAS,EAAU,EAA0B,CAC3C,OAAO,EAAM,OAAS,KAClB,GAAG,EAAM,GAAG,KAAK,GAAG,EAAK,EAAM,GAAG,KAAK,EAAE,GAAG,EAAK,EAAM,GAAG,GAAG,IAC7D,GAAG,EAAM,GAAG,YAAY,EAAE,GAAG,EAAK,EAAM,GAAG,SAAS,EAAI,CAAC,EAAE,GAAG,EAAK,EAAM,GAAG,QAAQ,CAAC,GAC3F,CAGA,SAAS,EAAc,EAAc,EAAe,EAA+B,CACjF,GAAI,CACF,GAAI,EAAM,OAAS,KAIjB,OAHI,EAAO,EAAQ,kBAAoB,EAAO,EAAQ,kBAClD,EAAQ,GAAK,EAAQ,IACrB,EAAM,GAAK,EAAM,EAAQ,cAAc,EAAM,CAAK,EAAU,KACzD,EAAgB,EAAS,CAAE,OAAM,QAAO,KAAI,CAAC,EAEtD,GAAI,EAAQ,GAAK,EAAQ,IAAM,EAAM,GAAK,EAAM,GAAI,OAAO,KAC3D,IAAM,EAAK,IAAI,KAAK,EAAM,EAAQ,EAAG,CAAG,EAExC,OADI,EAAG,YAAY,IAAM,GAAQ,EAAG,SAAS,IAAM,EAAQ,GAAK,EAAG,QAAQ,IAAM,EAAY,KACtF,EAAgB,EAAS,CAAE,CACpC,MAAQ,CACN,OAAO,IACT,CACF,CAGA,SAAS,EAAgB,EAAgC,CACvD,IAAM,EAAI,4EAA4E,KAAK,CAAI,EAC/F,GAAI,CAAC,EAAG,OAAO,KACf,IAAM,EAAQ,EAAc,OAAO,EAAE,EAAE,EAAG,OAAO,EAAE,EAAE,EAAG,OAAO,EAAE,EAAE,CAAC,EAC9D,EAAM,EAAc,OAAO,EAAE,EAAE,EAAG,OAAO,EAAE,EAAE,EAAG,OAAO,EAAE,EAAE,CAAC,EAGlE,MAFI,CAAC,GAAS,CAAC,GACX,EAAW,WAAW,CAAK,GAAK,EAAW,WAAW,CAAG,EAAU,KAChE,EAAgB,EAAO,CAAG,CACnC,CAEA,SAAS,EAAU,EAAsB,CACvC,OAAO,GAAc,EAAM,KAAM,EAAS,CAAI,CAChD,CAIA,SAAS,EAAa,EAA8G,CAClI,IAAM,EAAS,EAAiB,EAAM,KAAM,EAAS,EAAM,SAAU,EAAM,SAAS,EAC9E,EAAO,EAAgB,EAAU,EAAS,CAAM,EACtD,MAAO,CAAE,KAAM,EAAU,SAAU,EAAK,KAAM,UAAW,EAAK,MAAO,eAAgB,GAAc,EAAU,EAAS,EAAK,KAAO,CAAC,CAAE,CACvI,CAEA,SAAS,GAAkD,CAEzD,OADmB,EAAQ,KAAM,GAAW,EAAO,OAAS,SAAW,EAAO,OACvE,CAAA,EAAY,UAAU,CAAE,MAAO,IAAI,KAAQ,iBAAkB,EAAQ,kBAAoB,EAAG,UAAS,UAAS,CAAC,GAAK,CAAE,MAAO,IAAI,KAAQ,IAAK,IAAI,IAAO,CAClK,CAGA,SAAS,EAAmB,EAA+C,CACzE,IAAM,EAAQ,GAAsD,CAClE,IAAK,IAAM,KAAU,EAAM,CACzB,GAAI,EAAO,KAAO,GAAM,EAAO,QAAS,OAAO,EAC/C,IAAM,EAAS,EAAO,MAAQ,EAAK,EAAO,KAAK,EAAI,KACnD,GAAI,EAAQ,OAAO,CACrB,CACA,OAAO,IACT,EACM,EAAS,EAAK,CAAO,EAC3B,GAAI,CAAC,GAAQ,QAAS,OAAO,KAC7B,IAAM,EAAI,EAAO,QAAQ,CAAE,MAAO,IAAI,KAAQ,iBAAkB,EAAQ,kBAAoB,EAAG,UAAS,UAAS,CAAC,EAClH,MAAO,CAAE,MAAO,EAAE,MAAO,IAAK,EAAE,GAAI,CACtC,CAEA,SAAS,EAAS,EAAgD,CAChE,EAAQ,CAAE,GAAG,EAAO,GAAG,CAAM,EAC7B,EAAe,QAAS,GAAa,EAAS,CAAC,CACjD,CAEA,SAAS,EAAS,EAAmC,CACnD,IAAM,EAAK,EAAQ,aAAe,MAC5B,EAAa,EAAmB,CAAE,GAAI,EAAM,MAAM,GAAI,GAAI,EAAM,MAAM,EAAG,EAAG,EAAI,CAAO,EACvF,EAAW,EAAmB,CAAE,GAAI,EAAM,IAAI,GAAI,GAAI,EAAM,IAAI,EAAG,EAAG,EAAI,CAAO,EACvF,MAAO,CACL,MAAO,EAAM,MAAM,GACnB,IAAK,EAAM,IAAI,GACf,QAAS,EAAM,MAAM,GACrB,MAAO,EAAM,IAAI,GACjB,UAAW,GAAY,EAAM,MAAM,GAAI,EAAM,IAAI,GAAI,EAAS,CAC5D,KAAM,EAAM,KACZ,OAAQ,EAAQ,eAAiB,EAAQ,QAAQ,QAAU,aAC3D,UAAW,EAAQ,QAAQ,UAC3B,OAAQ,IACV,CAAC,EACD,aACA,WACA,MAAO,GAAG,EAAsB,CAAU,EAAE,GAAG,EAAsB,CAAQ,GAC/E,CACF,CAEA,SAAS,EAAK,EAAwB,CACpC,IAAM,EAAS,EAAS,CAAK,EAC7B,EAAQ,UAAU,CAAM,EACxB,EAAU,QAAS,GAAa,EAAS,CAAM,CAAC,CAClD,CAEA,IAAM,EAAkC,CACtC,aAAgB,EAChB,eAAkB,EAClB,aAAgB,EAChB,aAAiB,EAAM,MAAQ,EAAS,EAAM,KAAK,EAAI,KACvD,SAAS,EAAO,CACd,EAAS,CACP,MAAO,EAAQ,EAAgB,EAAgB,EAAS,EAAM,KAAK,EAAG,EAAgB,EAAS,EAAM,GAAG,CAAC,EAAI,KAC7G,aAAc,KACd,UAAW,IACb,CAAC,CACH,EACA,MAAO,CACA,EAAM,SACT,EAAS,CAAE,OAAQ,EAAK,CAAC,EACzB,EAAQ,SAAS,EAErB,EACA,MAAO,CACD,EAAM,SACR,EAAS,CAAE,OAAQ,GAAO,aAAc,KAAM,UAAW,KAAM,cAAe,IAAK,CAAC,EACpF,EAAQ,UAAU,EAEtB,EACA,OAAO,EAAO,CACZ,EAAU,CAAE,GAAG,EAAS,GAAG,CAAM,EACjC,EAAU,GAAiB,EAAS,EAAS,CAAQ,EACrD,IAAM,EAA0C,CAAC,EACjD,GAAI,SAAU,EAAO,CACnB,IAAM,EAAW,EAAQ,MAAQ,KAC7B,IAAa,EAAM,MAAM,OAAO,OAAO,EAAM,EAAa,CAAQ,CAAC,CACzE,CACI,oBAAqB,IAAO,EAAK,gBAAkB,EAAQ,kBAAoB,IAC/E,0BAA2B,IAAO,EAAK,sBAAwB,EAAQ,wBAA0B,IACrG,EAAS,CAAI,CACf,EACA,SAAU,CACR,EAAY,CAAC,EACb,EAAiB,CAAC,CACpB,EACA,SAAS,EAAI,CAEX,OADA,EAAU,KAAK,CAAE,MACJ,CACX,EAAY,EAAU,OAAQ,GAAa,IAAa,CAAE,CAC5D,CACF,EACA,UAAU,EAAO,CACf,GAAI,EAAW,WAAW,CAAK,EAAG,OAClC,GAAI,CAAC,EAAM,aAAc,CACvB,EAAS,CAAE,aAAc,EAAO,MAAO,KAAM,eAAgB,KAAM,UAAW,IAAK,CAAC,EACpF,EAAQ,WAAW,CAAE,MAAO,EAAM,EAAG,CAAC,EACtC,MACF,CACA,IAAM,EAAQ,EAAgB,EAAM,aAAc,CAAK,EACvD,EAAS,CAAE,QAAO,aAAc,KAAM,UAAW,KAAM,eAAgB,IAAK,CAAC,EAC7E,EAAQ,WAAW,CAAE,MAAO,EAAM,MAAM,GAAI,IAAK,EAAM,IAAI,EAAG,CAAC,EAC3D,EAAQ,WAAW,EAAW,MAAM,CAC1C,EACA,SAAS,EAAO,CAKd,IAAM,EAAO,EAAM,aAAe,EAAQ,KACtC,IAAS,EAAM,YACf,GAAQ,EAAM,WAAa,GAAgB,EAAM,EAAM,SAAS,GACpE,EAAS,CAAE,UAAW,CAAK,CAAC,EAC9B,EAGA,YAAY,EAAM,EAAO,CACvB,GAAI,EAAW,gBAAgB,EAAM,CAAK,EAAG,OAC7C,IAAM,EAAQ,EAAgB,EAAa,EAAM,CAAK,EAAG,EAAY,EAAM,CAAK,CAAC,EACjF,EAAS,CAAE,QAAO,aAAc,KAAM,UAAW,KAAM,SAAU,EAAM,UAAW,CAAM,CAAC,EACzF,EAAQ,WAAW,CAAE,MAAO,EAAM,MAAM,GAAI,IAAK,EAAM,IAAI,EAAG,CAAC,EAC3D,EAAQ,WAAW,EAAW,MAAM,CAC1C,EACA,gBAAgB,EAAM,EAAO,CAC3B,IAAM,EAAM,EAAa,EAAQ,QAAS,CAAQ,EAC5C,EAAM,EAAa,EAAQ,QAAS,CAAQ,EAGlD,MADA,GADI,GAAO,EAAY,EAAM,CAAK,CAAC,CAAC,GAAG,QAAQ,EAAI,EAAI,QAAQ,GAC3D,GAAO,EAAa,EAAM,CAAK,CAAC,CAAC,GAAG,QAAQ,EAAI,EAAI,QAAQ,EAElE,EAGA,kBAAmB,CACjB,EAAS,CAAE,eAAgB,QAAS,cAAe,QAAS,aAAc,KAAM,UAAW,KAAM,MAAO,KAAM,cAAe,KAAM,KAAM,KAAM,CAAC,CAClJ,EACA,cAAc,EAAO,CACnB,IAAI,EAAO,EAAM,SACb,EAAQ,EAAM,UAAY,EAC9B,KAAO,EAAQ,IAAM,GAAS,GAAI,GAAQ,EAC1C,KAAO,EAAQ,GAAK,GAAS,GAAI,IACjC,EAAS,CAAE,SAAU,EAAM,UAAW,CAAM,CAAC,CAC/C,EACA,aAAa,EAAO,CAClB,EAAS,CAAE,SAAU,EAAU,EAAM,SAAW,CAAK,CAAE,CAAC,CAC1D,EACA,kBAAkB,EAAO,CACvB,EAAS,CAAE,eAAgB,EAAU,EAAM,eAAiB,EAAQ,EAAE,CAAE,CAAC,CAC3E,EACA,QAAQ,EAAM,CACZ,EAAS,IAAS,OAAS,CAAE,OAAM,eAAgB,EAAU,EAAM,SAAW,CAAC,CAAE,EAAI,CAAE,MAAK,CAAC,CAC/F,EACA,gBAAgB,EAAO,CACrB,EAAS,CAAE,UAAW,EAAO,KAAM,KAAM,CAAC,CAC5C,EACA,eAAe,EAAM,CACnB,EAAS,CAAE,SAAU,EAAU,CAAI,EAAG,KAAM,OAAQ,CAAC,CACvD,EACA,YAAa,CACN,EAAM,iBACX,EAAS,EAAa,EAAM,OAAS,KAAO,KAAO,IAAI,CAAC,CAC1D,EACA,aAAa,EAAI,CACf,IAAM,EAAS,EAAQ,KAAM,GAAS,EAAK,KAAO,CAAE,EACpD,GAAI,CAAC,GAAQ,QAAS,OACtB,IAAM,EAAW,EAAO,QAAQ,CAAE,MAAO,IAAI,KAAQ,iBAAkB,EAAQ,kBAAoB,EAAG,UAAS,UAAS,CAAC,EACnH,EAAQ,EAAgB,EAAgB,EAAS,EAAS,KAAK,EAAG,EAAgB,EAAS,EAAS,GAAG,CAAC,EACxG,EAAO,EAAgB,EAAM,KAAM,EAAS,EAAM,IAAI,EAAE,EAC9D,EAAS,CAAE,QAAO,eAAgB,EAAI,cAAe,MAAO,aAAc,KAAM,UAAW,KAAM,SAAU,EAAK,KAAM,UAAW,EAAK,MAAO,cAAe,IAAK,CAAC,EAClK,EAAQ,WAAW,CAAE,MAAO,EAAM,MAAM,GAAI,IAAK,EAAM,IAAI,EAAG,CAAC,CACjE,EACA,kBAAkB,EAAW,EAAQ,CACnC,IAAM,EAAO,EAAQ,KAAM,GAAW,EAAO,KAAO,CAAS,CAAC,EAAE,OAAO,KAAM,GAAW,EAAO,KAAO,CAAM,EAC5G,GAAI,CAAC,GAAM,QAAS,OACpB,IAAM,EAAW,EAAK,QAAQ,CAAE,MAAO,IAAI,KAAQ,iBAAkB,EAAQ,kBAAoB,EAAG,UAAS,UAAS,CAAC,EACjH,EAAQ,EAAgB,EAAgB,EAAS,EAAS,KAAK,EAAG,EAAgB,EAAS,EAAS,GAAG,CAAC,EACxG,EAAO,EAAgB,EAAM,KAAM,EAAS,EAAM,IAAI,EAAE,EAC9D,EAAS,CAAE,QAAO,eAAgB,EAAQ,cAAe,MAAO,aAAc,KAAM,UAAW,KAAM,SAAU,EAAK,KAAM,UAAW,EAAK,MAAO,cAAe,IAAK,CAAC,CACxK,EACA,cAAc,EAAI,CAChB,EAAS,CAAE,cAAe,EAAM,gBAAkB,EAAK,KAAO,CAAG,CAAC,CACpE,EACA,kBAAmB,CACjB,EAAS,CACP,eAAgB,SAChB,cAAe,MACf,aAAc,KACd,UAAW,KACX,MAAO,KACP,cAAe,IACjB,CAAC,EACD,EAAQ,WAAW,CAAC,CAAC,CACvB,EACA,OAAQ,CACD,EAAM,QACX,EAAK,EAAM,KAAK,EAChB,EAAW,KAAK,EAClB,EACA,WAAW,EAAO,CAChB,OAAO,GAAc,EAAM,GAAI,EAAS,CAAQ,CAClD,EACA,YAAa,CACX,OAAO,EAAe,EAAM,KAAM,CAAO,CAC3C,EACA,gBAAoB,EAAM,MAAQ,GAAG,EAAU,EAAM,MAAM,KAAK,EAAE,KAAK,EAAU,EAAM,MAAM,GAAG,IAAM,GACtG,gBAAiB,CACf,IAAM,EAAI,EAAM,OAAS,CAAE,MAAO,EAAO,IAAK,CAAM,EACpD,MAAO,GAAG,EAAU,EAAE,KAAK,EAAE,KAAK,EAAU,EAAE,GAAG,GACnD,EAGA,cAAc,EAAM,CAElB,OADI,EAAK,KAAK,IAAM,GAAW,QACxB,EAAgB,CAAI,EAAI,QAAU,SAC3C,EACA,YAAY,EAAM,CAChB,GAAI,EAAK,KAAK,IAAM,GAElB,OADI,EAAM,OAAO,EAAS,CAAE,MAAO,KAAM,aAAc,KAAM,UAAW,IAAK,CAAC,EACvE,QAET,IAAM,EAAQ,EAAgB,CAAI,EAClC,GAAI,CAAC,EAAO,MAAO,UACnB,IAAM,EAAO,EAAgB,EAAM,KAAM,EAAS,EAAM,IAAI,EAAE,EAI9D,OAHA,EAAS,CAAE,QAAO,aAAc,KAAM,UAAW,KAAM,eAAgB,KAAM,cAAe,MAAO,SAAU,EAAK,KAAM,UAAW,EAAK,KAAM,CAAC,EAC/I,EAAQ,WAAW,CAAE,MAAO,EAAM,MAAM,GAAI,IAAK,EAAM,IAAI,EAAG,CAAC,EAC/D,EAAK,CAAK,EACH,OACT,EACA,UAAU,EAAM,EAAO,EAAK,CAC1B,OAAO,EAAgB,EAAS,CAAE,OAAM,QAAO,KAAI,CAAC,CACtD,EACA,gBAAgB,EAAM,EAAO,CAC3B,OAAO,GAAoB,EAAM,KAAM,EAAS,EAAU,EAAM,CAAK,CACvE,CACF,EASA,MAPA,GAA6E,cAAiB,IAC5F,EAAe,KAAK,CAAE,MACT,CACX,EAAiB,EAAe,OAAQ,GAAa,IAAa,CAAE,CACtE,GAGK,CACT,CAEA,SAAgB,GAAa,EAAmD,CAE9E,OADI,EAAM,cAAgB,EAAM,UAAkB,EAAgB,EAAM,aAAc,EAAM,SAAS,EAC9F,EAAM,KACf,CC9YA,IAAM,GAA8C,CAClD,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7C,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAC/C,EAGA,SAAgB,EAAgB,EAAsB,CACpD,OAAO,EAAK,QAAQ,SAAW,GAAM,GAAoB,IAAM,CAAC,CAClE,CAaA,SAAgB,GAAc,EAA4C,CACxE,IAAM,EAAI,EAAgB,CAAI,CAAC,CAAC,KAAK,EACrC,GAAI,IAAM,GAAI,MAAO,QACrB,IAAM,EAAI,EAAE,MAAM,qEAAqE,EACvF,GAAI,CAAC,EAAG,OAAO,KACf,IAAM,EAAsB,CAAE,KAAM,OAAO,EAAE,EAAE,EAAG,MAAO,OAAO,EAAE,EAAE,EAAG,IAAK,OAAO,EAAE,EAAE,CAAE,EAKzF,OAJI,EAAE,IAAM,OACV,EAAO,KAAO,OAAO,EAAE,EAAE,EACzB,EAAO,OAAS,OAAO,EAAE,EAAE,GAEtB,CACT,CCyBA,SAAgB,GAAyB,EAAwC,CAAC,EAAuB,CACvG,IAAI,EAAU,CAAE,GAAG,CAAe,EAC5B,EAAU,EAAQ,SAAW,EAC/B,EAAoD,CAAC,EACrD,EAAoC,CAAC,EAGnC,EAAgB,EAAQ,QAAU,IAAA,GAA4B,EAAQ,aAAxB,EAAQ,MACtD,EAAc,GAAiB,IAAI,KACnC,EAAe,EAAgB,EAAS,CAAW,EACnD,EAAc,EAAQ,aAAe,CAAE,KAAM,EAAY,SAAS,EAAG,OAAQ,EAAY,WAAW,EAAG,OAAQ,EAAY,WAAW,CAAE,EACxI,EAA4B,EAAQ,MAAQ,KAC5C,EAAc,EAAgB,EAAa,EAAS,EAAa,EAAE,EAErE,EAAiC,CACnC,OAAQ,GACR,KAAM,EACN,gBAAiB,EAAQ,kBAAoB,GAC7C,sBAAuB,EAAQ,wBAA0B,GACzD,SAAU,EAAY,KACtB,UAAW,EAAY,MACvB,SAAU,EAAgB,EAAe,KACzC,KAAM,EAAQ,SAAW,CAAE,KAAM,EAAY,KAAM,OAAQ,EAAY,OAAQ,OAAQ,CAAE,EAAI,KAC7F,KAAM,MACN,eAAgB,EAAY,KAAO,EACnC,WAAY,EAAQ,YAAc,MAClC,WAAY,EAAQ,YAAc,EAAQ,WAAa,EAAI,EAAQ,WAAa,CAClF,EAEA,SAAS,EAAS,EAA+C,CAC/D,EAAQ,CAAE,GAAG,EAAO,GAAG,CAAM,EAC7B,EAAe,QAAS,GAAa,EAAS,CAAC,CACjD,CAEA,SAAS,EAAU,EAAsB,CACvC,OAAO,GAAc,EAAM,KAAM,EAAS,CAAI,CAChD,CAIA,SAAS,EAAa,EAA6G,CACjI,IAAM,EAAS,EAAiB,EAAM,KAAM,EAAS,EAAM,SAAU,EAAM,SAAS,EAC9E,EAAO,EAAgB,EAAU,EAAS,CAAM,EACtD,MAAO,CAAE,KAAM,EAAU,SAAU,EAAK,KAAM,UAAW,EAAK,MAAO,eAAgB,GAAc,EAAU,EAAS,EAAK,KAAO,CAAC,CAAE,CACvI,CAGA,SAAS,EAAK,EAAe,EAAsB,CACjD,OAAS,EAAQ,EAAQ,GAAQ,CACnC,CAGA,SAAS,EAAU,EAAgD,CACjE,GAAI,CAAC,EAAQ,SAAW,CAAC,EAAQ,QAAS,OAAO,EACjD,IAAM,EAAe,EAAK,KAAO,GAAK,EAAK,OACrC,EAAK,EAAQ,QAAU,EAAQ,QAAQ,KAAO,IAAM,EAAQ,QAAQ,QAAU,GAAK,EACnF,EAAK,EAAQ,QAAU,EAAQ,QAAQ,KAAO,IAAM,EAAQ,QAAQ,QAAU,GAAK,KACnF,EAAU,KAAK,IAAI,EAAI,KAAK,IAAI,EAAI,CAAY,CAAC,EAEvD,OADI,IAAY,EAAqB,EAC9B,CAAE,KAAM,KAAK,MAAM,EAAU,EAAE,EAAG,OAAQ,EAAU,GAAI,OAAQ,EAAK,MAAO,CACrF,CAEA,SAAS,EAAW,EAAiC,CACnD,EAAS,CAAE,KAAM,EAAU,CAAI,CAAE,CAAC,CACpC,CAGA,SAAS,GAAyC,CAGhD,MAAO,CAAE,GAFE,EAAQ,QAAU,EAAQ,QAAQ,KAAO,IAAM,EAAQ,QAAQ,QAAU,GAAK,EAE5E,GADF,EAAQ,QAAU,EAAQ,QAAQ,KAAO,IAAM,EAAQ,QAAQ,QAAU,GAAK,IACzE,CAClB,CAKA,SAAS,EAAW,EAAyG,CAC3H,IAAM,EAAS,GAAc,CAAI,EACjC,GAAI,IAAW,QAAS,MAAO,QAC/B,GAAI,CAAC,EAAQ,MAAO,UACpB,IAAI,EACJ,GAAI,CACF,GAAI,EAAM,OAAS,KAAM,CAGvB,GAFI,EAAO,KAAO,EAAQ,kBAAoB,EAAO,KAAO,EAAQ,kBAChE,EAAO,MAAQ,GAAK,EAAO,MAAQ,IACnC,EAAO,IAAM,GAAK,EAAO,IAAM,EAAQ,cAAc,EAAO,KAAM,EAAO,KAAK,EAAG,MAAO,UAC5F,EAAQ,EAAgB,EAAS,CAAE,KAAM,EAAO,KAAM,MAAO,EAAO,MAAO,IAAK,EAAO,GAAI,CAAC,CAC9F,KAAO,CACL,GAAI,EAAO,MAAQ,GAAK,EAAO,MAAQ,IAAM,EAAO,IAAM,GAAK,EAAO,IAAM,GAAI,MAAO,UACvF,IAAM,EAAK,IAAI,KAAK,EAAO,KAAM,EAAO,MAAQ,EAAG,EAAO,GAAG,EAE7D,GAAI,EAAG,YAAY,IAAM,EAAO,MAAQ,EAAG,SAAS,IAAM,EAAO,MAAQ,GAAK,EAAG,QAAQ,IAAM,EAAO,IAAK,MAAO,UAClH,EAAQ,EAAgB,EAAS,CAAE,CACrC,CACF,MAAQ,CACN,MAAO,SACT,CAMA,OALI,EAAW,WAAW,CAAK,EAAU,UACrC,EAAQ,UAAY,EAAO,MAAQ,KACjC,EAAO,KAAO,KAAO,EAAO,QAAU,GAAK,GAAW,UACnD,CAAE,QAAO,KAAM,CAAE,KAAM,EAAO,KAAM,OAAQ,EAAO,QAAU,CAAE,CAAE,EAEnE,CAAE,QAAO,KAAM,IAAK,CAC7B,CAEA,SAAS,EAAK,EAAmB,CAC/B,OAAO,OAAO,CAAC,CAAC,CAAC,SAAS,EAAG,GAAG,CAClC,CAGA,SAAS,EAAQ,EAA0B,CACzC,IAAM,EAAO,EAAM,OAAS,KACxB,GAAG,EAAM,GAAG,KAAK,GAAG,EAAK,EAAM,GAAG,KAAK,EAAE,GAAG,EAAK,EAAM,GAAG,GAAG,IAC7D,GAAG,EAAM,GAAG,YAAY,EAAE,GAAG,EAAK,EAAM,GAAG,SAAS,EAAI,CAAC,EAAE,GAAG,EAAK,EAAM,GAAG,QAAQ,CAAC,IACzF,GAAI,CAAC,EAAQ,SAAU,OAAO,EAC9B,IAAM,EAAM,IAAI,KACV,EAAI,EAAM,MAAQ,CAAE,KAAM,EAAI,SAAS,EAAG,OAAQ,EAAI,WAAW,CAAE,EACzE,MAAO,GAAG,EAAK,GAAG,EAAK,EAAE,IAAI,EAAE,GAAG,EAAK,EAAE,MAAM,GACjD,CAGA,SAAS,EAAY,EAAmF,CACtG,IAAM,EAAO,EAAgB,EAAM,KAAM,EAAS,EAAO,MAAM,EAAE,EAC3D,EAA0C,CAC9C,SAAU,EAAO,MACjB,SAAU,EAAK,KACf,UAAW,EAAK,KAClB,EACI,EAAO,MAAQ,EAAM,OACvB,EAAM,KAAO,EAAU,CAAE,KAAM,EAAO,KAAK,KAAM,OAAQ,EAAO,KAAK,OAAQ,OAAQ,CAAE,CAAC,GAE1F,EAAS,CAAK,CAChB,CAEA,SAAS,EAAY,EAAkC,CACrD,IAAM,EAAK,IAAI,KAAK,EAAM,EAAE,EAE5B,OADI,EAAM,MAAM,EAAG,SAAS,EAAM,KAAK,KAAM,EAAM,KAAK,OAAQ,EAAM,KAAK,OAAQ,CAAC,EAC7E,CACL,KACA,GAAI,EAAM,GACV,KAAM,EAAM,MAAQ,IAAA,GACpB,UAAW,EAAgB,EAAI,EAAS,CACtC,KAAM,EAAM,KACZ,OAAQ,EAAQ,gBAAkB,EAAQ,SACrC,EAAM,aAAe,MAAQ,qBAAuB,mBACrD,cACJ,OAAQ,EAAQ,QAAU,IAC5B,CAAC,EACD,MAAO,EAAmB,CAAE,KAAI,GAAI,EAAM,GAAI,KAAM,EAAM,MAAQ,IAAA,EAAU,EAAG,EAAQ,aAAe,MAAO,EAAS,CAAC,CAAC,EAAQ,QAAQ,CAC1I,CACF,CAEA,SAAS,EAAK,EAAwB,CACpC,IAAM,EAAS,EAAY,CAAK,EAChC,EAAQ,WAAW,CAAM,EACzB,EAAU,QAAS,GAAa,EAAS,CAAM,CAAC,CAClD,CAEA,IAAM,EAAiC,CACrC,aAAgB,EAChB,aAAiB,EAAM,SAAW,EAAY,EAAM,QAAQ,EAAI,KAChE,SAAS,EAAO,CACd,IAAM,EAAK,aAAiB,KAAO,EAAQ,GAAO,IAAM,KACxD,EAAS,CAAE,SAAU,EAAK,EAAgB,EAAS,CAAE,EAAI,IAAK,CAAC,CACjE,EACA,MAAO,CACA,EAAM,SACT,EAAS,CAAE,OAAQ,EAAK,CAAC,EACzB,EAAQ,SAAS,EAErB,EACA,MAAO,CACD,EAAM,SACR,EAAS,CAAE,OAAQ,EAAM,CAAC,EAC1B,EAAQ,UAAU,EAEtB,EACA,OAAO,EAAO,CACZ,EAAU,CAAE,GAAG,EAAS,GAAG,CAAM,EACjC,IAAM,EAAyC,CAAC,EAChD,GAAI,SAAU,EAAO,CACnB,IAAM,EAAW,EAAQ,MAAQ,KAC7B,IAAa,EAAM,MAAM,OAAO,OAAO,EAAM,EAAa,CAAQ,CAAC,CACzE,CAMA,GALI,oBAAqB,IAAO,EAAK,gBAAkB,EAAQ,kBAAoB,IAC/E,0BAA2B,IAAO,EAAK,sBAAwB,EAAQ,wBAA0B,IACjG,eAAgB,IAAO,EAAK,WAAa,EAAQ,YAAc,OAC/D,eAAgB,IAAO,EAAK,WAAa,EAAQ,YAAc,EAAQ,WAAa,EAAI,EAAQ,WAAa,IAC5G,YAAa,GAAS,YAAa,IAAU,EAAM,OAAM,EAAK,KAAO,EAAU,EAAM,IAAI,GAC1F,aAAc,KACZ,EAAQ,UAAY,CAAC,EAAM,KAAM,CACnC,IAAM,EAAM,IAAI,KACV,EAAK,EAAQ,aAAe,CAAE,KAAM,EAAI,SAAS,EAAG,OAAQ,EAAI,WAAW,CAAE,EACnF,EAAK,KAAO,CAAE,KAAM,EAAG,KAAM,OAAQ,EAAG,OAAQ,OAAQ,CAAE,CAC5D,MAAY,EAAQ,WAClB,EAAK,KAAO,MAGhB,EAAS,CAAI,CACf,EACA,SAAU,CACR,EAAY,CAAC,EACb,EAAiB,CAAC,CACpB,EACA,SAAS,EAAI,CAEX,OADA,EAAU,KAAK,CAAE,MACJ,CACX,EAAY,EAAU,OAAQ,GAAa,IAAa,CAAE,CAC5D,CACF,EACA,UAAU,EAAO,CACf,GAAI,EAAW,WAAW,CAAK,EAAG,OAClC,IAAM,EAAO,EAAgB,EAAM,KAAM,EAAS,EAAM,EAAE,EAC1D,EAAS,CAAE,SAAU,EAAO,SAAU,EAAK,KAAM,UAAW,EAAK,KAAM,CAAC,GACpE,EAAQ,eAAiB,CAAC,EAAQ,YACpC,EAAK,CAAK,EACV,EAAW,KAAK,EAEpB,EAIA,SAAU,CACR,IAAM,EAAQ,EAAgB,EAAS,IAAI,IAAM,EACjD,GAAI,EAAW,WAAW,CAAK,EAAG,OAClC,IAAM,EAAO,EAAgB,EAAM,KAAM,EAAS,EAAM,EAAE,EAC1D,EAAS,CAAE,SAAU,EAAO,SAAU,EAAK,KAAM,UAAW,EAAK,MAAO,KAAM,KAAM,CAAC,GACjF,EAAQ,eAAiB,CAAC,EAAQ,YACpC,EAAK,CAAK,EACV,EAAW,KAAK,EAEpB,EACA,QAAQ,EAAM,EAAQ,EAAS,EAAG,CAChC,EAAW,CAAE,KAAM,EAAK,EAAM,EAAE,EAAG,OAAQ,EAAK,EAAQ,EAAE,EAAG,OAAQ,EAAK,EAAQ,EAAE,CAAE,CAAC,CACzF,EAIA,QAAQ,EAAQ,CAId,MAHI,CAAC,EAAM,MAAQ,CAAC,OAAO,UAAU,CAAM,GAAK,EAAS,GAAK,EAAS,IACnE,EAAW,eAAe,CAAM,EAAU,IAC1C,EAAM,KAAK,OAAS,GAAQ,EAAW,CAAE,GAAG,EAAM,KAAM,KAAM,CAAO,CAAC,EACnE,GACT,EACA,UAAU,EAAQ,CAIhB,MAHI,CAAC,EAAM,MAAQ,CAAC,OAAO,UAAU,CAAM,GAAK,EAAS,GAAK,EAAS,IACnE,EAAW,iBAAiB,EAAM,KAAK,KAAM,CAAM,EAAU,IAC7D,EAAM,KAAK,SAAW,GAAQ,EAAW,CAAE,GAAG,EAAM,KAAM,QAAO,CAAC,EAC/D,GACT,EACA,SAAS,EAAO,CACT,EAAM,MACX,EAAW,CAAE,GAAG,EAAM,KAAM,KAAM,EAAK,EAAM,KAAK,KAAO,EAAO,EAAE,CAAE,CAAC,CACvE,EACA,WAAW,EAAO,CACX,EAAM,MACX,EAAW,CAAE,GAAG,EAAM,KAAM,OAAQ,EAAK,EAAM,KAAK,OAAS,EAAQ,EAAM,WAAY,EAAE,CAAE,CAAC,CAC9F,EACA,gBAAiB,CACf,GAAI,CAAC,EAAM,KAAM,OACjB,IAAM,EAAO,EAAM,KAAK,KAAO,GAAK,EAAM,KAAK,KAAO,GAAK,EAAM,KAAK,KAAO,GAC7E,EAAW,CAAE,GAAG,EAAM,KAAM,MAAK,CAAC,CACpC,EACA,cAAe,CACb,GAAI,CAAC,EAAM,KAAM,OACjB,IAAM,EAAM,IAAI,KAChB,EAAW,CAAE,KAAM,EAAI,SAAS,EAAG,OAAQ,EAAI,WAAW,EAAG,OAAQ,EAAI,WAAW,CAAE,CAAC,CACzF,EACA,SAAU,CACJ,EAAM,UAAU,EAAK,EAAM,QAAQ,EACvC,EAAW,KAAK,CAClB,EACA,OAAQ,CACN,EAAS,CAAE,SAAU,IAAK,CAAC,CAC7B,EACA,cAAc,EAAO,CACnB,IAAI,EAAO,EAAM,SACb,EAAQ,EAAM,UAAY,EAC9B,KAAO,EAAQ,IAAM,GAAS,GAAI,GAAQ,EAC1C,KAAO,EAAQ,GAAK,GAAS,GAAI,IACjC,EAAS,CAAE,SAAU,EAAM,UAAW,CAAM,CAAC,EAC7C,EAAQ,oBAAoB,EAAM,CAAK,CACzC,EACA,aAAa,EAAO,CAClB,IAAM,EAAO,EAAU,EAAM,SAAW,CAAK,EAC7C,EAAS,CAAE,SAAU,CAAK,CAAC,EAC3B,EAAQ,oBAAoB,EAAM,EAAM,SAAS,CACnD,EACA,kBAAkB,EAAO,CACvB,EAAS,CAAE,eAAgB,EAAU,EAAM,eAAiB,EAAQ,EAAE,CAAE,CAAC,CAC3E,EACA,QAAQ,EAAM,CACZ,EAAS,IAAS,OAAS,CAAE,OAAM,eAAgB,EAAU,EAAM,SAAW,CAAC,CAAE,EAAI,CAAE,MAAK,CAAC,CAC/F,EACA,gBAAgB,EAAO,CACrB,EAAS,CAAE,UAAW,EAAO,KAAM,KAAM,CAAC,EAC1C,EAAQ,oBAAoB,EAAM,SAAU,CAAK,CACnD,EACA,eAAe,EAAM,CACnB,IAAM,EAAI,EAAU,CAAI,EACxB,EAAS,CAAE,SAAU,EAAG,KAAM,OAAQ,CAAC,EACvC,EAAQ,oBAAoB,EAAG,EAAM,SAAS,CAChD,EACA,YAAa,CACN,EAAM,iBACX,EAAS,EAAa,EAAM,OAAS,KAAO,KAAO,IAAI,CAAC,CAC1D,EACA,WAAW,EAAO,CAChB,OAAO,GAAc,EAAM,GAAI,EAAS,CAAc,CACxD,EAEA,cAAc,EAAM,CAClB,IAAM,EAAS,EAAW,CAAI,EAC9B,OAAO,IAAW,QAAU,QAAU,IAAW,UAAY,UAAY,OAC3E,EAGA,YAAY,EAAM,CAChB,IAAM,EAAS,EAAW,CAAI,EAQ9B,OAPI,IAAW,SACT,EAAM,UAAU,EAAS,CAAE,SAAU,IAAK,CAAC,EACxC,SAEL,IAAW,UAAkB,WACjC,EAAY,CAAM,EAClB,EAAK,EAAO,KAAK,EACV,QACT,EAGA,aAAc,CACZ,OAAO,EAAM,SAAW,EAAQ,EAAM,QAAQ,EAAI,EACpD,EAGA,gBAAiB,CACf,OAAO,EAAQ,EAAM,UAAY,EAAgB,EAAS,IAAI,IAAM,CAAC,CACvE,EACA,YAAa,CACX,OAAO,EAAe,EAAM,KAAM,CAAO,CAC3C,EAGA,eAAe,EAAM,CACnB,GAAM,CAAE,KAAI,MAAO,EAAW,EAC9B,GAAI,EAAO,GAAK,GAAK,GAAM,EAAO,GAAK,EAAI,MAAO,GAClD,GAAI,EAAQ,cAAe,CACzB,IAAM,EAAO,EAAM,WAAa,EAAI,EAAM,WAAa,EACvD,IAAK,IAAI,EAAI,EAAG,EAAI,GAAI,GAAK,EAAM,GAAI,CAAC,EAAQ,cAAc,EAAM,CAAC,EAAG,MAAO,GAC/E,MAAO,EACT,CACA,MAAO,EACT,EACA,iBAAiB,EAAM,EAAQ,CAC7B,GAAM,CAAE,KAAI,MAAO,EAAW,EACxB,EAAI,EAAO,GAAK,EAEtB,OADI,EAAI,GAAM,EAAI,EAAW,GACtB,EAAQ,gBAAgB,EAAM,CAAM,GAAK,EAClD,EACA,UAAU,EAAM,EAAO,EAAK,CAC1B,OAAO,EAAgB,EAAS,CAAE,OAAM,QAAO,KAAI,CAAC,CACtD,EACA,gBAAgB,EAAM,EAAO,CAC3B,OAAO,GAAoB,EAAM,KAAM,EAAS,EAAgB,EAAM,CAAK,CAC7E,CACF,EASA,MAPA,GAA6E,cAAiB,IAC5F,EAAe,KAAK,CAAE,MACT,CACX,EAAiB,EAAe,OAAQ,GAAa,IAAa,CAAE,CACtE,GAGK,CACT,CCxZA,SAAgB,GAA4B,EAAqC,CAAC,EAA0B,CAC1G,IAAI,EAAU,CAAE,GAAG,CAAe,EAC5B,EAAU,EAAQ,SAAW,EAE7B,MAAoC,EAAQ,QAAU,KACxD,EAAiD,CAAC,EAClD,EAAoC,CAAC,EAInC,EAAgB,EAAQ,QAAU,IAAA,GAA4B,EAAQ,aAAxB,EAAQ,MACtD,EAAU,GAAiB,EAAQ,QAAQ,EAE7C,EAAoC,CACtC,OAAQ,GACR,KAAM,QACN,SAAU,EAAQ,KAClB,UAAW,EAAQ,MACnB,eAAgB,EAAQ,KAAO,EAC/B,SAAU,EAAgB,CAAE,KAAM,EAAc,KAAM,MAAO,EAAc,KAAM,EAAI,KACrF,sBAAuB,EAAQ,wBAA0B,EAC3D,EAEA,SAAS,EAAS,EAAkD,CAClE,EAAQ,CAAE,GAAG,EAAO,GAAG,CAAM,EAC7B,EAAe,QAAS,GAAa,EAAS,CAAC,CACjD,CAEA,SAAS,EAAU,EAAsB,CACvC,IAAM,EAAK,EAAQ,SAAW,EAAQ,iBAChC,EAAK,EAAQ,SAAW,EAAQ,iBACtC,OAAO,KAAK,IAAI,EAAI,KAAK,IAAI,EAAI,CAAI,CAAC,CACxC,CAEA,SAAS,EAAY,EAAc,EAA4B,CAC7D,IAAM,EAAO,EAAQ,cAAc,EAAM,CAAK,EACxC,EAAQ,EAAQ,OAAO,EAAM,EAAO,CAAC,EACrC,EAAM,EAAQ,OAAO,EAAM,EAAO,CAAI,EAEtC,EAAK,EAAQ,aAAe,MAC5B,EAAa,EAAmB,CAAE,GAAI,EAAO,GAAI,CAAE,OAAM,QAAO,IAAK,CAAE,CAAE,EAAG,EAAI,CAAO,EACvF,EAAW,EAAmB,CAAE,GAAI,EAAK,GAAI,CAAE,OAAM,QAAO,IAAK,CAAK,CAAE,EAAG,EAAI,CAAO,EAC5F,MAAO,CACL,OACA,QACA,GAAI,CAAE,OAAM,OAAM,EAClB,UAAW,EAAQ,aAAa,EAAc,CAAC,CAAC,CAAC,EAAQ,GACzD,QACA,MACA,UAAW,EAAgB,EAAO,EAAS,CAAE,KAAM,KAAM,OAAQ,EAAQ,eAAiB,YAAa,OAAQ,EAAc,CAAE,CAAC,EAChI,aACA,WACA,MAAO,GAAG,EAAsB,CAAU,EAAE,GAAG,EAAsB,CAAQ,GAC/E,CACF,CAEA,SAAS,EAAK,EAA2B,CACvC,EAAQ,WAAW,CAAM,EACzB,EAAU,QAAS,GAAa,EAAS,CAAM,CAAC,CAClD,CAEA,IAAM,EAAoC,CACxC,aAAgB,EAChB,aAAiB,EAAM,SAAW,EAAY,EAAM,SAAS,KAAM,EAAM,SAAS,KAAK,EAAI,KAC3F,SAAS,EAAO,CACd,EAAS,CAAE,SAAU,EAAQ,CAAE,KAAM,EAAM,KAAM,MAAO,EAAM,KAAM,EAAI,KAAM,SAAU,GAAO,MAAQ,EAAM,SAAU,UAAW,GAAO,OAAS,EAAM,SAAU,CAAC,CACrK,EACA,MAAO,CACA,EAAM,SACT,EAAS,CAAE,OAAQ,GAAM,KAAM,OAAQ,CAAC,EACxC,EAAQ,SAAS,EAErB,EACA,MAAO,CACD,EAAM,SACR,EAAS,CAAE,OAAQ,EAAM,CAAC,EAC1B,EAAQ,UAAU,EAEtB,EACA,OAAO,EAAO,CACZ,EAAU,CAAE,GAAG,EAAS,GAAG,CAAM,EACjC,EAAS,0BAA2B,EAAQ,CAAE,sBAAuB,EAAQ,wBAA0B,EAAM,EAAI,CAAC,CAAC,CACrH,EACA,SAAU,CACR,EAAY,CAAC,EACb,EAAiB,CAAC,CACpB,EACA,SAAS,EAAI,CAEX,OADA,EAAU,KAAK,CAAE,MACJ,CACX,EAAY,EAAU,OAAQ,GAAa,IAAa,CAAE,CAC5D,CACF,EACA,eAAgB,CAEhB,EACA,aAAa,EAAO,CAClB,EAAS,CAAE,SAAU,EAAU,EAAM,SAAW,CAAK,CAAE,CAAC,CAC1D,EACA,kBAAkB,EAAO,CACvB,EAAS,CAAE,eAAgB,EAAU,EAAM,eAAiB,EAAQ,EAAE,CAAE,CAAC,CAC3E,EACA,QAAQ,EAAM,CAES,EAAjB,IAAS,OAAiB,CAAE,KAAM,OAAQ,eAAgB,EAAU,EAAM,SAAW,CAAC,CAAE,EAC9E,CAAE,KAAM,OAAQ,CAAC,CACjC,EACA,gBAAgB,EAAO,CACrB,IAAM,EAAW,CAAE,KAAM,EAAM,SAAU,OAAM,EAC/C,EAAS,CAAE,WAAU,UAAW,CAAM,CAAC,EACvC,EAAK,EAAY,EAAS,KAAM,CAAK,CAAC,EACtC,EAAW,KAAK,CAClB,EACA,eAAe,EAAM,CACnB,EAAS,CAAE,SAAU,EAAU,CAAI,EAAG,KAAM,OAAQ,CAAC,CACvD,EACA,gBAAmB,CAAE,IAAK,EAAQ,SAAW,EAAQ,iBAAkB,IAAK,EAAQ,SAAW,EAAQ,gBAAiB,GACxH,gBAAoB,EAAM,SAAW,GAAG,EAAM,SAAS,KAAK,GAAG,OAAO,EAAM,SAAS,KAAK,CAAC,CAAC,SAAS,EAAG,GAAG,IAAM,GACjH,gBAAiB,CACf,IAAM,EAAI,EAAM,UAAY,EAAQ,QAAQ,EAC5C,MAAO,GAAG,EAAE,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,SAAS,EAAG,GAAG,GACrD,EAEA,cAAc,EAAM,CAClB,IAAM,EAAI,8BAA8B,KAAK,CAAI,EACjD,GAAI,EAAK,KAAK,IAAM,GAAI,MAAO,QAC/B,GAAI,CAAC,EAAG,MAAO,UACf,IAAM,EAAO,OAAO,EAAE,EAAE,EAClB,EAAQ,OAAO,EAAE,EAAE,EACnB,CAAE,MAAK,OAAQ,EAAW,WAAW,EAC3C,OAAO,GAAQ,GAAO,GAAQ,GAAO,GAAS,GAAK,GAAS,GAAK,QAAU,SAC7E,EACA,YAAY,EAAM,CAChB,IAAM,EAAS,EAAW,cAAc,CAAI,EAC5C,GAAI,IAAW,QAA6D,OAA9C,EAAM,UAAU,EAAS,CAAE,SAAU,IAAK,CAAC,EAAU,QACnF,GAAI,IAAW,UAAW,MAAO,UACjC,IAAM,EAAI,8BAA8B,KAAK,CAAI,EAC3C,EAAO,OAAO,EAAE,EAAE,EAClB,EAAQ,OAAO,EAAE,EAAE,EAGzB,OAFA,EAAS,CAAE,SAAU,CAAE,OAAM,OAAM,EAAG,SAAU,EAAM,UAAW,CAAM,CAAC,EACxE,EAAK,EAAY,EAAM,CAAK,CAAC,EACtB,OACT,CACF,EASA,MAPA,GAA6E,cAAiB,IAC5F,EAAe,KAAK,CAAE,MACT,CACX,EAAiB,EAAe,OAAQ,GAAa,IAAa,CAAE,CACtE,GAGK,CACT,CCnIA,SAAgB,GAAqB,EAAyB,EAA2C,CACvG,IAAI,EAAsB,CAAC,EACvB,EAAkC,CAAC,EACnC,EAAS,EACT,EAAU,GACV,EAAQ,GAEZ,SAAS,GAAc,CACrB,EAAW,CAAC,EACZ,EAAS,EAAI,OAAO,CAAC,CAAC,IAAK,GAAS,CAClC,GAAI,OAAO,GAAS,SAAU,OAAO,EACrC,IAAM,EAAe,CAAE,GAAG,EAAM,KAAM,EAAK,MAAQ,MAAO,MAAO,KAAM,OAAQ,EAAG,EAElF,OADA,EAAS,KAAK,CAAG,EACV,CACT,CAAC,CACH,CAEA,SAAS,EAAQ,EAAsB,CAGrC,OAFI,EAAI,OAAS,KAAa,EAAI,YAC9B,EAAI,OAAS,WAAmB,EAAI,QAAU,EAAI,KAAO,KACtD,OAAO,EAAI,KAAK,CAAC,CAAC,SAAS,EAAI,IAAK,GAAG,CAChD,CAEA,SAAS,GAAiB,CACxB,OAAO,EAAO,IAAK,GAAO,OAAO,GAAM,SAAW,EAAI,EAAQ,CAAC,CAAE,CAAC,CAAC,KAAK,EAAE,CAC5E,CAGA,SAAS,EAAQ,EAAiC,CAChD,IAAI,EAAM,EACV,IAAK,IAAM,KAAK,EAAQ,CACtB,GAAI,OAAO,GAAM,SAAU,CAAE,GAAO,EAAE,OAAQ,QAAU,CACxD,GAAI,EAAS,QAAQ,CAAC,IAAM,EAAO,MAAO,CAAC,EAAK,EAAM,EAAE,GAAG,EAC3D,GAAO,EAAE,GACX,CACA,MAAO,CAAC,EAAG,CAAC,CACd,CAEA,SAAS,EAAa,EAAqB,CACzC,IAAI,EAAS,EACb,IAAK,IAAM,KAAK,EAAQ,CACtB,GAAI,OAAO,GAAM,SAAU,CAAE,GAAU,EAAE,OAAQ,QAAU,CAC3D,GAAI,GAAO,EAAS,EAAE,IAAK,OAAO,EAAS,QAAQ,CAAC,EACpD,GAAU,EAAE,GACd,CACA,OAAO,EAAS,OAAS,CAC3B,CAEA,SAAS,GAAc,CACrB,EAAM,MAAQ,EAAO,EACrB,GAAM,CAAC,EAAG,GAAK,EAAQ,CAAM,EAC7B,EAAM,kBAAkB,EAAG,CAAC,EAC5B,EAAM,aAAa,iBAAkB,EAAM,KAAK,CAClD,CAGA,SAAS,GAA0B,CACjC,GAAI,EAAS,KAAM,GAAM,EAAE,OAAS,IAAI,EAAG,OAAO,KAClD,IAAM,EAAwB,CAAC,EAE/B,OADA,EAAS,QAAS,GAAM,CAAE,EAAO,EAAE,KAAO,EAAE,KAAO,CAAC,EAC7C,EAAI,QAAQ,CAAM,CAC3B,CAIA,SAAS,GAAa,CACpB,IAAM,EAAQ,EAAS,EACvB,GAAI,CAAC,EAAO,CACV,EAAM,UAAU,OAAO,mBAAmB,EAC1C,EAAM,gBAAgB,cAAc,EACpC,MACF,CACA,IAAM,EAAS,EAAI,SAAS,CAAK,EACjC,EAAM,UAAU,OAAO,oBAAqB,IAAW,SAAS,EAChE,EAAM,aAAa,eAAgB,IAAW,UAAY,OAAS,OAAO,CAC5E,CAEA,SAAS,EAAc,EAAqB,CAC1C,EAAS,KAAK,IAAI,EAAG,KAAK,IAAI,EAAS,OAAS,EAAG,CAAK,CAAC,EACzD,EAAM,CACR,CAEA,SAAS,EAAkB,EAAoB,CAC7C,IAAM,EAAI,EAAI,KAAK,EAAI,UAAU,CAAC,CAAC,CAAC,EAAI,KACxC,EAAI,MAAQ,GAAK,KAAO,EAAI,IAAM,KAAK,IAAI,EAAI,IAAK,KAAK,IAAI,EAAI,IAAK,CAAC,CAAC,CAC1E,CAEA,SAAS,EAAK,EAAqB,CACjC,IAAM,EAAM,EAAS,GAGrB,GAFA,EAAI,OAAS,GACb,EAAQ,GACJ,EAAI,OAAS,KACf,EAAkB,CAAG,MAChB,CACL,IAAM,EAAQ,EAAI,IAAM,EAAI,IAAM,EAClC,EAAI,QAAU,EAAI,MAAQ,EAAI,IAAM,GAAS,EAAQ,GAAS,EAAQ,EAAI,GAC5E,CACA,EAAM,EACN,EAAK,CACP,CAEA,SAAS,EAAS,EAAoB,CAC/B,AAEL,EAAI,UADJ,EAAI,MAAQ,KAAK,IAAI,EAAI,IAAK,KAAK,IAAI,EAAI,IAAK,SAAS,EAAI,OAAQ,EAAE,CAAC,CAAC,EAC5D,GACf,CAEA,SAAS,EAAU,EAAqB,CACtC,IAAM,EAAM,EAAS,GACrB,GAAI,EAAI,OAAS,WAAY,OAC7B,EAAQ,GACR,EAAI,QAAU,EACd,IAAM,EAAI,SAAS,EAAI,OAAQ,EAAE,EAC7B,EAAI,KAAO,GACb,EAAI,MAAQ,EACR,EAAI,OAAO,QAAU,EAAI,MAAO,EAAS,CAAG,EAAG,EAAQ,IAClD,EAAI,OAAO,QAAU,GAAK,EAAI,GAAK,EAAI,KAChD,EAAS,CAAG,EACZ,EAAQ,GAER,EAAI,MAAQ,EAEd,EAAM,EACN,EAAK,CACP,CAEA,SAAS,EAAY,EAAmB,CACtC,EAAQ,GACR,EAAS,EAAO,CAAC,MAAQ,KACzB,EAAM,EACN,EAAK,CACP,CAEA,SAAS,GAAgB,CACnB,EAAS,EAAS,OAAS,IAAG,GAAU,EAC9C,CAEA,SAAS,GAAkB,CACzB,IAAM,EAAM,EAAS,GACrB,EAAQ,GACJ,EAAI,OAAS,MAAQ,EAAI,QAC3B,EAAI,MAAQ,KACZ,EAAI,OAAS,IACJ,EAAS,IAClB,IACA,EAAS,EAAO,CAAC,MAAQ,KACzB,EAAS,EAAO,CAAC,OAAS,IAE5B,EAAM,EACN,EAAK,CACP,CAEA,SAAS,EAAa,EAAsB,CAC1C,EAAM,EACN,IAAM,EAAM,EAAI,KAAK,EAAI,UAAU,CAAC,EACpC,EAAS,QAAS,GAAM,CAAE,EAAE,MAAQ,EAAI,EAAE,MAAQ,KAAM,EAAE,OAAS,EAAI,CAAC,EACxE,EAAU,GACV,EAAQ,GACR,EAAS,GAAS,KAAO,EAAI,EAAa,CAAK,EAC/C,EAAM,CACR,CAEA,SAAS,GAAsB,CAK7B,GAJA,EAAU,GACV,EAAM,UAAU,OAAO,mBAAmB,EAC1C,EAAM,gBAAgB,cAAc,EAEhC,CAAC,EAAO,CAAE,EAAM,MAAQ,EAAI,UAAU,EAAG,MAAQ,CACrD,EAAS,QAAQ,CAAQ,EACzB,IAAM,EAAS,EAAS,OAAQ,GAAM,EAAE,OAAS,IAAI,CAAC,CAAC,OACvD,GAAI,IAAW,EAAS,OAAQ,CAC9B,IAAM,EAAQ,EAAS,EACnB,EAAI,OAAO,CAAK,IAAM,YAAW,EAAM,MAAQ,EAAI,UAAU,EACnE,MAAW,IAAW,EACpB,EAAI,OAAO,EAAE,EAEb,EAAM,MAAQ,EAAI,UAAU,CAEhC,CAEA,SAAS,EAAU,EAAoB,CACrC,IAAM,EAAI,EACV,GAAI,EAAE,QAAU,EAAE,SAAW,EAAE,QAAS,OACnC,GAAe,EAAE,MAAQ,OAAO,EAAa,EAClD,IAAM,EAAM,EAAE,IACR,EAAM,EAAS,GACjB,GAAO,EAAI,OAAS,YAAc,WAAW,KAAK,CAAG,GACvD,EAAE,eAAe,EACjB,EAAY,KAAK,KAAK,CAAG,CAAC,GACjB,UAAU,KAAK,CAAG,GAAK,UAAU,KAAK,CAAG,GAClD,EAAE,eAAe,EACjB,EAAU,EAAgB,CAAG,CAAC,GACrB,IAAQ,WACjB,EAAE,eAAe,EACjB,EAAK,CAAC,GACG,IAAQ,aACjB,EAAE,eAAe,EACjB,EAAK,EAAE,GACE,IAAQ,aACjB,EAAE,eAAe,EACjB,EAAc,EAAS,CAAC,GACf,IAAQ,cAAgB,IAAQ,KAAO,IAAQ,KAAO,IAAQ,KAAO,IAAQ,KACtF,EAAE,eAAe,EACjB,EAAc,EAAS,CAAC,GACf,IAAQ,aAAe,IAAQ,UACxC,EAAE,eAAe,EACjB,EAAU,GACD,IAAQ,SACjB,EAAE,eAAe,EACjB,EAAc,EACd,EAAI,MAAM,GACD,IAAQ,UACjB,EAAE,eAAe,EACjB,EAAU,GACV,EAAM,MAAQ,EAAI,UAAU,EAC5B,EAAM,UAAU,OAAO,mBAAmB,EAC1C,EAAM,gBAAgB,cAAc,EACpC,EAAI,MAAM,GACD,IAAQ,OACjB,EAAE,eAAe,CAErB,CAEA,SAAS,GAAgB,CAClB,GAAS,EAAa,EAC3B,EAAI,KAAK,CACX,CAEA,SAAS,GAAkB,CAErB,GAAS,EAAc,EAAa,EAAM,gBAAkB,CAAC,CAAC,CACpE,CAEA,SAAS,GAAe,CAClB,GAAS,EAAc,CAC7B,CAEA,SAAS,EAAc,EAAgB,CACrC,EAAE,eAAe,CACnB,CAYA,OAVA,EAAM,UAAU,IAAI,wBAAwB,EAC5C,EAAM,aAAa,YAAa,SAAS,EACzC,EAAM,aAAa,eAAgB,KAAK,EACnC,EAAM,aAAa,aAAa,GAAG,EAAM,aAAa,cAAe,EAAI,YAAY,CAAC,EAC3F,EAAM,iBAAiB,UAAW,CAAS,EAC3C,EAAM,iBAAiB,QAAS,CAAO,EACvC,EAAM,iBAAiB,UAAW,CAAS,EAC3C,EAAM,iBAAiB,OAAQ,CAAM,EACrC,EAAM,iBAAiB,cAAe,CAAa,EAE5C,CACL,cAAiB,EACjB,SAAU,CACR,EAAM,UAAU,OAAO,wBAAwB,EAC/C,EAAM,oBAAoB,UAAW,CAAS,EAC9C,EAAM,oBAAoB,QAAS,CAAO,EAC1C,EAAM,oBAAoB,UAAW,CAAS,EAC9C,EAAM,oBAAoB,OAAQ,CAAM,EACxC,EAAM,oBAAoB,cAAe,CAAa,CACxD,CACF,CACF,CClTA,IAAM,GAAO,EAAW,EAAM,IAAc,OAAO,CAAC,CAAC,CAAC,SAAS,EAAK,GAAG,EAEvE,SAAS,GAAS,EAAmD,CACnE,MAAO,CAAE,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAO,IAAK,IAAK,EAAO,IAAK,YAAa,MAAO,CACtF,CACA,IAAM,GAAqB,CAAE,IAAK,QAAS,IAAK,EAAG,IAAK,EAAG,IAAK,GAAI,YAAa,IAAK,EAGhF,GAAmB,CAAE,IAAK,MAAO,IAAK,EAAG,IAAK,EAAG,IAAK,GAAI,YAAa,IAAK,EAGlF,SAAgB,GAAW,EAIZ,CACb,IAAM,MAAc,EAAK,SAAS,GAAK,EAAK,OAAO,EACnD,MAAO,CACL,QAAS,CACP,IAAM,EAAqC,CAAC,GAAS,EAAK,WAAW,CAAC,EAAG,IAAK,GAAO,IAAK,EAAG,EAC7F,GAAI,EAAK,SAAS,EAAG,CACnB,IAAM,EAAM,EAAM,EAClB,EAAM,KAAK,IAAK,CAAE,IAAK,OAAQ,IAAK,EAAG,IAAK,KAAa,IAAK,EAAM,GAAK,GAAI,YAAa,EAAM,KAAO,IAAK,EAAG,IAAK,CAAE,IAAK,SAAU,IAAK,EAAG,IAAK,EAAG,IAAK,GAAI,YAAa,IAAK,CAAC,EAC7K,GAAK,EAAM,KAAK,IAAK,CAAE,IAAK,WAAY,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,YAAa,KAAM,KAAM,UAAW,CAAC,CAC3G,CACA,OAAO,CACT,EACA,gBAAoB,EAAK,SAAS,EAAK,EAAM,EAAI,sBAAwB,mBAAsB,aAC/F,KAAK,EAAO,CACV,IAAM,EAAI,yCAAyC,KAAK,CAAK,EAC7D,GAAI,CAAC,EAAG,MAAO,CAAC,EAChB,IAAM,EAAwB,CAAE,KAAM,CAAC,EAAE,GAAI,MAAO,CAAC,EAAE,GAAI,IAAK,CAAC,EAAE,EAAG,EACtE,GAAI,EAAE,IAAM,KAAM,CAChB,IAAM,EAAM,CAAC,EAAE,GACX,EAAM,GAAK,EAAO,KAAO,EAAM,IAAM,GAAI,EAAO,SAAW,KAAO,KAAmB,EAAO,KAAO,EACvG,EAAO,OAAS,CAAC,EAAE,EACrB,CACA,OAAO,CACT,EACA,QAAQ,EAAG,CACT,IAAM,EAAO,GAAG,EAAI,EAAE,KAAO,CAAC,EAAE,GAAG,EAAI,EAAE,KAAM,EAAE,GAAG,EAAI,EAAE,GAAI,IAG9D,OAFI,EAAE,MAAQ,KAAa,EAEpB,GAAG,EAAK,GAAG,EADR,EAAE,UAAY,KAAsD,EAAE,KAAhD,EAAE,KAAQ,IAAO,EAAE,WAAa,EAAI,GAAK,EAClD,EAAE,GAAG,EAAI,EAAE,MAAO,GAC3C,CACF,CACF,CAGA,SAAgB,GAAY,EAAsE,CAChG,MAAO,CACL,WAAc,CAAC,GAAS,EAAK,WAAW,CAAC,EAAG,IAAK,EAAK,EACtD,gBAAmB,UACnB,KAAK,EAAsB,CACzB,IAAM,EAAI,gBAAgB,KAAK,CAAK,EACpC,OAAO,EAAI,CAAE,KAAM,CAAC,EAAE,GAAI,MAAO,CAAC,EAAE,EAAG,EAAI,CAAC,CAC9C,EACA,QAAU,GAAM,GAAG,EAAI,EAAE,KAAO,CAAC,EAAE,GAAG,EAAI,EAAE,KAAM,GACpD,CACF,CAGA,SAAgB,GAAY,EAAsE,CAChG,IAAM,EAAS,GAA8C,CAC3D,IAAM,EAAK,EAAK,WAAW,EAC3B,MAAO,CACL,CAAE,IAAK,GAAG,EAAE,GAAI,IAAK,EAAG,IAAK,EAAG,IAAK,IAAK,EAAG,IAAK,YAAa,MAAO,EAAG,IACzE,CAAE,IAAK,GAAG,EAAE,GAAI,IAAK,EAAG,IAAK,EAAG,IAAK,GAAI,YAAa,IAAK,EAAG,IAC9D,CAAE,IAAK,GAAG,EAAE,GAAI,IAAK,EAAG,IAAK,EAAG,IAAK,GAAI,YAAa,IAAK,CAC7D,CACF,EACA,MAAO,CACL,WAAc,CAAC,GAAG,EAAM,GAAG,EAAG,MAAO,GAAG,EAAM,GAAG,CAAC,EAClD,gBAAmB,0BACnB,KAAK,EAAsB,CACzB,IAAM,EAAI,8CAA8C,KAAK,CAAK,EAElE,OADK,EACE,CAAE,GAAI,CAAC,EAAE,GAAI,GAAI,CAAC,EAAE,GAAI,GAAI,CAAC,EAAE,GAAI,GAAI,CAAC,EAAE,GAAI,GAAI,CAAC,EAAE,GAAI,GAAI,CAAC,EAAE,EAAG,EAD3D,CAAC,CAElB,EACA,QAAU,GAAM,GAAG,EAAI,EAAE,GAAK,CAAC,EAAE,GAAG,EAAI,EAAE,EAAG,EAAE,GAAG,EAAI,EAAE,EAAG,EAAE,KAAK,EAAI,EAAE,GAAK,CAAC,EAAE,GAAG,EAAI,EAAE,EAAG,EAAE,GAAG,EAAI,EAAE,EAAG,GAC5G,CACF,CC1EA,SAAgB,GAAqB,EAAoB,EAAkB,EAA6C,EAIpH,CAAC,EAAsG,CACzG,IAAM,EAAM,EAAQ,KAAO,EACrB,EAAa,EAAS,OAAS,EAAO,OACtC,EAAa,EAAO,IACpB,EAAa,EAAQ,QAAU,MAAS,EAAQ,QAAU,QAAU,EAAa,EAAM,QAAU,EAAa,EAAc,KAAO,OACnI,EAAM,IAAe,OAAS,EAAO,OAAS,EAAM,KAAK,IAAI,EAAK,EAAO,IAAM,EAAM,OAAS,CAAG,EAEnG,EAA0C,EAAQ,QAAU,QAAU,EAAQ,QAAU,SAAW,EAAQ,QAAU,SAAW,EAAQ,MAAQ,QAChJ,EAAQ,QAAU,QAAU,CAAC,EAAQ,SACvC,AAEK,EAFD,EAAO,KAAO,EAAM,OAAS,EAAS,MAAoB,OACrD,EAAO,MAAQ,EAAM,OAAS,EAAgB,QACrC,UAGpB,IAAM,EAAU,IAAe,QAC3B,EAAO,MAAQ,EAAM,MACrB,IAAe,SACb,EAAO,KAAO,EAAO,MAAQ,EAAI,EAAM,MAAQ,EAC/C,EAAO,KAEb,MAAO,CACL,MACA,KAAM,KAAK,IAAI,EAAK,KAAK,IAAI,EAAS,EAAS,MAAQ,EAAM,MAAQ,CAAG,CAAC,EACzE,aACA,YACF,CACF,CChBA,SAAS,EAA0C,EAAQ,EAAoB,EAAgC,CAAC,EAA6B,CAC3I,IAAM,EAAO,SAAS,cAAc,CAAG,EAGvC,OAFI,IAAW,EAAK,UAAY,GAChC,OAAO,QAAQ,CAAK,CAAC,CAAC,SAAS,CAAC,EAAK,KAAW,EAAK,aAAa,EAAK,CAAK,CAAC,EACtE,CACT,CAEA,SAAS,EAAQ,EAAmB,EAA2B,CAE7D,MADA,GAAK,YAAc,EACZ,CACT,CAEA,SAAS,EAAK,EAAuB,CACnC,OAAO,OAAO,CAAK,CAAC,CAAC,SAAS,EAAG,GAAG,CACtC,CAEA,SAAS,EAAU,EAAiC,EAA0C,CAC5F,MAAO,CAAC,CAAC,GAAK,CAAC,CAAC,GAAK,EAAE,GAAG,QAAQ,IAAM,EAAE,GAAG,QAAQ,CACvD,CAEA,SAAS,GAAQ,EAAyB,EAA2B,CAEnE,OADK,EACE,EAAM,GAAG,QAAQ,GAAK,EAAM,MAAM,GAAG,QAAQ,GAAK,EAAM,GAAG,QAAQ,GAAK,EAAM,IAAI,GAAG,QAAQ,EADjF,EAErB,CAEA,SAAS,GAAc,EAAkB,EAAyB,EAA0B,CAC1F,IAAM,EAAU,CAAC,UAAU,EAK3B,OAJI,EAAU,EAAO,CAAK,GAAG,EAAQ,KAAK,UAAU,EAChD,GAAQ,EAAO,CAAK,GAAG,EAAQ,KAAK,aAAa,EACjD,EAAU,GAAO,MAAO,CAAK,GAAG,EAAQ,KAAK,gBAAgB,EAC7D,EAAU,GAAO,IAAK,CAAK,GAAG,EAAQ,KAAK,cAAc,EACtD,EAAQ,KAAK,GAAG,CACzB,CAEA,SAAS,EAAU,EAAe,EAAc,EAAqB,EAAS,GAAoB,CAChG,IAAM,EAAS,EAAQ,EAAG,SAAU,UAAW,CAAE,KAAM,SAAU,aAAc,GAAQ,CAAM,CAAC,EAAG,CAAK,EAQtG,OAPI,GACF,EAAO,UAAU,IAAI,WAAW,EAChC,EAAO,aAAa,WAAY,IAAI,EACpC,EAAO,aAAa,cAAe,MAAM,GAEzC,EAAO,iBAAiB,QAAS,CAAO,EAEnC,CACT,CAOA,SAAS,EAAc,EAAiB,EAAyB,EAA0B,EAAW,GAAc,CAClH,IAAM,EAAQ,IAAc,KAAO,EAAyB,EAAQ,aAAa,IAAI,EAC/E,EAAY,EAAM,EAAK,MAAM,MAAQ,GACrC,EAAU,EAAM,EAAK,IAAI,MAAQ,GACjC,EAAS,IAAc,EAAU,EAAY,GAAG,EAAU,GAAG,IACnE,GAAI,CAAC,EAAU,OAAO,EACtB,IAAM,EAAU,GAAe,IAAc,KAAO,OAAO,CAAC,EAAI,EAAQ,eAAe,EAAG,IAAI,EAE9F,MAAO,GAAG,EAAO,GADH,EAAK,MAAM,OAAS,EAAK,IAAI,KAAO,EAAO,EAAK,MAAM,IAAI,EAAI,GAAG,EAAO,EAAK,MAAM,IAAI,EAAE,GAAG,EAAO,EAAK,IAAI,IAAI,KAEhI,CAMA,SAAS,GAAa,EAAuC,CAC3D,IAAM,EAAU,EACV,CAAE,OAAM,WAAU,YAAW,iBAAgB,OAAO,KAAM,wBAAwB,IAAS,EAAW,SAAS,EAC/G,EAAS,EAAG,MAAO,gBAAgB,EAErC,EACA,EACA,EACA,EACA,IAAS,OACX,EAAY,EAAU,IAAK,oBAAuB,EAAW,aAAa,EAAE,CAAC,EAC7E,EAAY,EAAU,IAAK,qBAAwB,EAAW,cAAc,EAAE,CAAC,EAC/E,EAAY,EAAU,IAAK,iBAAoB,EAAW,cAAc,CAAC,CAAC,EAC1E,EAAY,EAAU,IAAK,gBAAmB,EAAW,aAAa,CAAC,CAAC,GAC/D,IAAS,SAClB,EAAY,EAAU,IAAK,OAAU,CAAC,EAAG,EAAI,EAC7C,EAAY,EAAU,IAAK,oBAAuB,EAAW,aAAa,EAAE,CAAC,EAC7E,EAAY,EAAU,IAAK,gBAAmB,EAAW,aAAa,CAAC,CAAC,EACxE,EAAY,EAAU,IAAK,OAAU,CAAC,EAAG,EAAI,IAE7C,EAAY,EAAU,IAAK,OAAU,CAAC,EAAG,EAAI,EAC7C,EAAY,EAAU,IAAK,qBAAwB,EAAW,kBAAkB,EAAE,CAAC,EACnF,EAAY,EAAU,IAAK,iBAAoB,EAAW,kBAAkB,CAAC,CAAC,EAC9E,EAAY,EAAU,IAAK,OAAU,CAAC,EAAG,EAAI,GAG/C,IAAM,EAAQ,EAAG,SAAU,gBAAiB,CAAE,KAAM,SAAU,YAAa,SAAU,aAAc,sBAAuB,CAAC,EACvH,EACA,EACJ,GAAI,IAAS,MAAO,CAClB,IAAM,EAAO,GAAuB,EAAM,EAAS,EAAgB,EAAU,CAAS,EAClF,IAAS,MACX,EAAU,GAAG,EAAuB,EAAY,GAAG,GAAG,IACtD,EAAY,EAAc,EAAM,KAAM,CAAO,IAE7C,EAAU,GAAG,EAAQ,aAAa,IAAI,CAAC,CAAC,EAAY,GAAG,GAAG,EAAQ,eAAe,EAAU,IAAI,IAC/F,EAAY,EAAc,EAAM,KAAM,CAAO,GAE/C,EAAM,iBAAiB,YAAe,EAAW,QAAQ,OAAO,CAAC,CACnE,MAAO,GAAI,IAAS,QACd,IAAS,MACX,EAAU,OAAO,CAAQ,EACzB,EAAY,GAAG,EAAQ,OAAO,IAAI,KAAK,EAAU,EAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAE7D,EAAU,EAAQ,eAAe,EAAU,IAAI,EAC/C,EAAY,GAAG,EAAQ,OAAO,EAAU,EAAG,CAAC,CAAC,CAAC,YAAY,EAAE,MAE9D,EAAM,iBAAiB,YAAe,EAAW,QAAQ,MAAM,CAAC,MAC3D,CACL,GAAM,CAAE,OAAQ,EAAe,EAAM,CAAO,EACtC,EAAM,KAAK,IAAI,EAAiB,GAAI,CAAG,EACzC,IAAS,MACX,EAAU,GAAG,EAAe,KAAK,IACjC,EAAY,GAAG,EAAQ,OAAO,IAAI,KAAK,EAAgB,EAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,EAAQ,OAAO,IAAI,KAAK,EAAK,EAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAEjH,EAAU,GAAG,EAAQ,eAAe,EAAgB,IAAI,EAAE,KAAK,EAAQ,eAAe,EAAK,IAAI,IAC/F,EAAY,GAAG,EAAQ,OAAO,EAAgB,EAAG,CAAC,CAAC,CAAC,YAAY,EAAE,KAAK,EAAQ,OAAO,EAAK,EAAG,CAAC,CAAC,CAAC,YAAY,KAE/G,EAAM,iBAAiB,YAAe,EAAW,QAAQ,KAAK,CAAC,CACjE,CAKA,OAJA,EAAM,YAAY,EAAQ,EAAG,MAAO,uBAAuB,EAAG,GAAG,EAAQ,GAAG,CAAC,EACzE,GAAuB,EAAM,YAAY,EAAQ,EAAG,MAAO,yBAAyB,EAAG,CAAS,CAAC,EAErG,EAAO,OAAO,EAAW,EAAW,EAAO,EAAW,CAAS,EACxD,CACT,CAEA,SAAS,GAAe,EAAqB,KAAmB,CAC9D,IAAM,EAAM,EAAG,MAAO,eAAgB,CAAE,KAAM,KAAM,CAAC,EAErD,OADA,EAAuB,eAAe,IAAS,KAAO,KAAO,IAAI,CAAC,CAAC,QAAS,GAAY,EAAI,YAAY,EAAQ,EAAG,MAAO,cAAe,CAAE,KAAM,cAAe,CAAC,EAAG,CAAO,CAAC,CAAC,EACtK,CACT,CAEA,SAAS,GAAgB,EAAuC,CAC9D,IAAM,EAAU,EACV,CAAE,WAAU,YAAW,OAAO,KAAM,wBAAwB,IAAS,EAAW,SAAS,EACzF,EAA0B,IAAS,KAAO,KAAO,KACjD,EAAO,EAAG,MAAO,gBAAiB,CAAE,KAAM,MAAO,CAAC,EACxD,IAAK,IAAI,EAAQ,EAAG,EAAQ,GAAI,GAAS,EAAG,CAC1C,IAAM,EAAQ,EAAQ,EAChB,EAAW,IAAU,EACrB,EAAc,IAAS,KAAO,EAAuB,GAAS,EAAQ,aAAa,IAAI,CAAC,CAAC,GACzF,EAAM,EAAQ,EAAG,SAAU,gBAAgB,EAAW,eAAiB,KAAM,CAAE,KAAM,SAAU,KAAM,WAAY,gBAAiB,EAAW,OAAS,OAAQ,CAAC,EAAG,CAAW,EACnL,GAAI,EAAuB,CAGzB,IAAM,EAAO,GAAuB,EAAM,EAAS,EAAgB,EAAU,CAAK,EAClF,EAAI,YAAY,EAAQ,EAAG,OAAQ,kBAAkB,EAAG,EAAc,EAAM,EAAW,EAAS,EAAK,CAAC,CAAC,CACzG,CACA,EAAI,iBAAiB,YAAe,EAAW,gBAAgB,CAAK,CAAC,EACrE,EAAK,YAAY,CAAG,CACtB,CACA,OAAO,CACT,CAEA,SAAS,GAAe,EAAuC,CAC7D,IAAM,EAAU,EACV,CAAE,WAAU,iBAAgB,OAAO,KAAM,wBAAwB,IAAS,EAAW,SAAS,EAC9F,CAAE,MAAK,OAAQ,EAAe,EAAM,CAAO,EAC3C,EAAO,EAAG,MAAO,eAAgB,CAAE,KAAM,MAAO,CAAC,EACvD,IAAK,IAAI,EAAI,EAAG,EAAI,GAAI,GAAK,EAAG,CAC9B,IAAM,EAAO,EAAiB,EAC9B,GAAI,EAAO,GAAO,EAAO,EAAK,CAC5B,EAAK,YAAY,EAAG,MAAO,mCAAoC,CAAE,KAAM,UAAW,CAAC,CAAC,EACpF,QACF,CACA,IAAM,EAAW,IAAS,EACpB,EAAM,EAAG,SAAU,eAAe,EAAW,eAAiB,KAAM,CAAE,KAAM,SAAU,KAAM,WAAY,gBAAiB,EAAW,OAAS,OAAQ,CAAC,EACtJ,EAAgB,IAAS,KAAO,OAAO,CAAI,EAAI,EAAQ,eAAe,EAAM,IAAI,EAEtF,GADA,EAAI,YAAY,EAAQ,EAAG,OAAQ,iBAAiB,EAAG,CAAa,CAAC,EACjE,EAAuB,CACzB,IAAM,EAAiC,OAAhB,IAAS,KAAc,EAAQ,OAAO,IAAI,KAAK,EAAM,EAAG,CAAC,CAAC,CAAC,CAAC,KAAe,EAAQ,OAAO,EAAM,EAAG,CAAC,CAAC,CAAC,YAAY,CAAC,EAC1I,EAAI,YAAY,EAAQ,EAAG,OAAQ,iBAAiB,EAAG,CAAc,CAAC,CACxE,CACA,EAAI,iBAAiB,YAAe,EAAW,eAAe,CAAI,CAAC,EACnE,EAAK,YAAY,CAAG,CACtB,CACA,OAAO,CACT,CAMA,SAAS,GAAuB,EAA8C,CAC5E,IAAM,EAAU,EACV,CAAE,WAAU,OAAM,yBAA0B,EAAW,SAAS,EAChE,EAAS,EAAG,MAAO,gBAAgB,EACnC,EAAY,EAAU,IAAK,OAAU,CAAC,EAAG,EAAI,EAC7C,EAAY,EAAU,IAAK,oBAAuB,EAAW,aAAa,EAAE,CAAC,EAC7E,EAAY,EAAU,IAAK,gBAAmB,EAAW,aAAa,CAAC,CAAC,EACxE,EAAY,EAAU,IAAK,OAAU,CAAC,EAAG,EAAI,EAC7C,EAAQ,EAAG,MAAO,qCAAqC,EAS7D,OARI,IAAS,MACX,EAAM,YAAY,EAAQ,EAAG,MAAO,uBAAuB,EAAG,GAAG,EAAS,IAAI,CAAC,EAC3E,GAAuB,EAAM,YAAY,EAAQ,EAAG,MAAO,yBAAyB,EAAG,GAAG,EAAQ,OAAO,IAAI,KAAK,EAAU,EAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAEjJ,EAAM,YAAY,EAAQ,EAAG,MAAO,uBAAuB,EAAG,GAAG,EAAQ,eAAe,EAAU,IAAI,EAAE,IAAI,CAAC,EACzG,GAAuB,EAAM,YAAY,EAAQ,EAAG,MAAO,yBAAyB,EAAG,GAAG,EAAQ,OAAO,EAAU,EAAG,CAAC,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,GAElJ,EAAO,OAAO,EAAW,EAAW,EAAO,EAAW,CAAS,EACxD,CACT,CAKA,SAAS,GAAqB,EAA8C,CAC1E,IAAM,EAAU,EACV,EAAQ,EAAW,SAAS,EAC5B,EAAW,EAAM,SACjB,EAAO,EAAM,KACb,EAA0B,IAAS,KAAO,KAAO,KACjD,EAAM,EAAM,MACZ,EAAW,EAAM,EAAgB,EAAM,EAAS,EAAI,MAAM,EAAE,EAAI,KAChE,EAAO,EAAG,MAAO,qCAAsC,CAAE,KAAM,MAAO,CAAC,EAC7E,IAAK,IAAI,EAAQ,EAAG,EAAQ,GAAI,GAAS,EAAG,CAC1C,IAAM,EAAQ,EAAQ,EAChB,EAAW,EAAW,gBAAgB,EAAU,CAAK,EACrD,EAAW,CAAC,CAAC,GAAY,EAAS,OAAS,GAAY,EAAS,QAAU,EAC1E,EAAc,IAAS,KAAO,EAAuB,GAAS,EAAQ,aAAa,IAAI,CAAC,CAAC,GACzF,EAAU,CAAC,eAAe,EAC5B,GAAU,EAAQ,KAAK,aAAa,EACpC,GAAU,EAAQ,KAAK,aAAa,EACxC,IAAM,EAAM,EAAQ,EAAG,SAAU,EAAQ,KAAK,GAAG,EAAG,CAAE,KAAM,SAAU,KAAM,WAAY,gBAAiB,EAAW,OAAS,OAAQ,CAAC,EAAG,CAAW,EACpJ,GAAI,EAAM,sBAAuB,CAC/B,IAAM,EAAO,GAAuB,EAAM,EAAS,EAAgB,EAAU,CAAK,EAClF,EAAI,YAAY,EAAQ,EAAG,OAAQ,kBAAkB,EAAG,EAAc,EAAM,EAAW,EAAS,EAAK,CAAC,CAAC,CACzG,CACI,EAAU,EAAI,aAAa,gBAAiB,MAAM,EACjD,EAAI,iBAAiB,YAAe,EAAW,YAAY,EAAU,CAAK,CAAC,EAChF,EAAK,YAAY,CAAG,CACtB,CACA,OAAO,CACT,CAEA,IAAM,GAAiB,qVAGvB,SAAS,GAAiB,EAAoB,EAAiC,CAC7E,IAAM,EAAM,EAAG,SAAU,kBAAmB,CAAE,KAAM,SAAU,aAAc,aAAa,IAAS,KAAO,KAAO,MAAO,CAAC,EAIxH,OAHA,EAAI,aAAa,YAAa,CAAI,EAClC,EAAI,UAAY,GAChB,EAAI,iBAAiB,QAAS,CAAM,EAC7B,CACT,CAEA,SAAgB,GAAiB,EAAmB,EAAuC,CACzF,IAAM,EAAQ,EAAW,SAAS,EAC5B,EAAU,EACV,EAAO,GAAqB,EAAgB,EAAM,GAAI,EAAS,CAAE,KAAM,EAAM,KAAM,OAAQ,EAAM,OAAS,KAAO,KAAO,IAAK,CAAC,EACpI,EAAK,UAAY,GACjB,IAAM,EAAQ,EAAG,MAAO,gDAAiD,CAAE,KAAM,SAAU,aAAc,mBAAoB,CAAC,EAExH,EAAa,EAAG,MAAO,aAAa,EAC1C,EAAW,WAAW,CAAC,CAAC,QAAS,GAAW,CAC1C,GAAI,EAAO,OAAS,QAAS,CAC3B,IAAM,EAAM,EAAQ,EAAG,SAAU,aAAa,EAAM,iBAAmB,EAAO,GAAK,aAAe,KAAM,CAAE,KAAM,QAAS,CAAC,EAAG,EAAO,KAAK,EACzI,EAAI,iBAAiB,YAAe,EAAW,aAAa,EAAO,EAAE,CAAC,EACtE,EAAW,YAAY,CAAG,EAC1B,MACF,CACA,IAAM,EAAM,EAAQ,EAAG,SAAU,iCAAiC,EAAM,iBAAmB,EAAO,GAAK,aAAe,KAAK,EAAM,gBAAkB,EAAO,GAAK,WAAa,KAAM,CAAE,KAAM,QAAS,CAAC,EAAG,EAAO,KAAK,EAOnN,GANA,EAAI,iBAAiB,YAAe,CAC9B,EAAO,KAAO,SAAU,EAAW,iBAAiB,EAC/C,EAAO,KAAO,QAAS,EAAW,iBAAiB,EACvD,EAAW,cAAc,EAAO,EAAE,CACzC,CAAC,EACD,EAAW,YAAY,CAAG,EACtB,EAAM,gBAAkB,EAAO,GAAI,CACrC,IAAM,EAAO,EAAG,MAAO,kBAAkB,EACzC,EAAO,OAAO,QAAS,GAAS,CAC9B,IAAM,EAAU,EAAQ,EAAG,SAAU,mBAAoB,CAAE,KAAM,QAAS,CAAC,EAAG,EAAK,KAAK,EACxF,EAAQ,iBAAiB,YAAe,EAAW,kBAAkB,EAAO,GAAI,EAAK,EAAE,CAAC,EACxF,EAAK,YAAY,CAAO,CAC1B,CAAC,EACD,EAAW,YAAY,CAAI,CAC7B,CACF,CAAC,EAED,IAAM,EAAS,EAAG,MAAO,aAAa,EAIhC,EAAgB,CAAC,EAAM,cAAgB,CAAC,EAAM,MAC9C,EAAc,CAAC,CAAC,EAAM,aACtB,EAAY,EAAM,aAAe,EAAI,EAAM,YAAY,EAAI,EAAM,MAAQ,EAAI,EAAM,MAAM,KAAK,EAAI,QAClG,EAAU,EAAM,aAAe,MAAQ,EAAM,MAAQ,EAAI,EAAM,MAAM,GAAG,EAAI,MAC5E,EAAQ,EAAG,MAAO,iBAAiB,EACnC,EAAa,EAAG,MAAO,eAAe,EAAgB,aAAe,IAAI,EAC/E,EAAW,OAAO,EAAQ,EAAG,OAAQ,cAAc,EAAG,OAAO,EAAG,EAAQ,EAAG,OAAQ,cAAc,EAAG,CAAS,CAAC,EAC9G,IAAM,EAAW,EAAG,MAAO,eAAe,EAAc,aAAe,IAAI,EAC3E,EAAS,OAAO,EAAQ,EAAG,OAAQ,cAAc,EAAG,KAAK,EAAG,EAAQ,EAAG,OAAQ,cAAc,EAAG,CAAO,CAAC,EACxG,EAAM,OAAO,EAAY,EAAQ,EAAG,OAAQ,eAAgB,CAAE,cAAe,MAAO,CAAC,EAAG,GAAG,EAAG,CAAQ,EAClG,EAAM,iBACR,EAAM,YAAY,GAAiB,EAAM,SAAY,EAAW,WAAW,CAAC,CAAC,EAE/E,EAAO,YAAY,CAAK,EAExB,IAAM,EAAY,EAAM,gBAAkB,QAE1C,GAAI,EACF,EAAO,YAAY,EAAQ,EAAG,MAAO,gBAAgB,EAAG,wDAAwD,CAAC,OAC5G,GAAI,EAAM,iBAAmB,UAAY,EAAM,aAAc,CAGlE,IAAM,EAAU,EAAM,aAAe,iDAAmD,6CACxF,EAAO,YAAY,EAAQ,EAAG,MAAO,gBAAgB,EAAG,CAAO,CAAC,CAClE,CAEA,GAAI,EACF,EAAO,YAAY,GAAuB,CAAU,CAAC,EACrD,EAAO,YAAY,GAAqB,CAAU,CAAC,OAGnD,GADA,EAAO,YAAY,GAAa,CAAU,CAAC,EACvC,EAAM,OAAS,MAAO,CACxB,EAAO,YAAY,GAAe,EAAM,IAAI,CAAC,EAC7C,IAAM,EAAO,EAAG,MAAO,WAAY,CAAE,KAAM,MAAO,CAAC,EAC7C,EAAU,GAAa,CAAK,EAClC,EAAW,gBAAgB,EAAM,SAAU,EAAM,SAAS,CAAC,CAAC,QAAS,GAAS,CAC5E,GAAI,CAAC,EAAM,CACT,EAAK,YAAY,EAAG,MAAO,2BAA4B,CAAE,KAAM,UAAW,CAAC,CAAC,EAC5E,MACF,CACA,IAAM,EAAW,EAAW,WAAW,CAAI,EAErC,EAAM,EAAG,SADH,GAAc,EAAM,EAAS,EAAW,SAAS,CAAC,GAAK,EAAW,eAAiB,IACjE,CAAE,KAAM,SAAU,KAAM,WAAY,gBAAiB,GAAQ,EAAS,CAAI,EAAI,OAAS,OAAQ,CAAC,EAC1H,GAAU,EAAI,aAAa,gBAAiB,MAAM,EACtD,IAAM,EAAa,EAAM,OAAS,KAAO,OAAO,EAAK,GAAG,QAAQ,CAAC,EAAI,EAAQ,eAAe,EAAK,GAAG,IAAK,IAAI,EAE7G,GADA,EAAI,YAAY,EAAQ,EAAG,OAAQ,kBAAkB,EAAG,CAAU,CAAC,EAC/D,EAAM,sBAAuB,CAC/B,IAAM,EAAe,EAAM,OAAS,KAAO,EAAQ,eAAe,EAAK,GAAG,IAAK,IAAI,EAAI,OAAO,EAAK,GAAG,QAAQ,CAAC,EAC/G,EAAI,YAAY,EAAQ,EAAG,OAAQ,oBAAoB,EAAG,CAAY,CAAC,CACzE,CACK,IACH,EAAI,iBAAiB,YAAe,EAAW,UAAU,CAAI,CAAC,EAC9D,EAAI,iBAAiB,iBAAoB,EAAW,SAAS,CAAI,CAAC,GAEpE,EAAK,YAAY,CAAG,CACtB,CAAC,EACD,EAAO,YAAY,CAAI,CACzB,MAAW,EAAM,OAAS,QACxB,EAAO,YAAY,GAAgB,CAAU,CAAC,EAE9C,EAAO,YAAY,GAAe,CAAU,CAAC,EAIjD,IAAM,EAAQ,EAAQ,EAAG,SAAU,YAAa,CAAE,KAAM,QAAS,CAAC,EAAG,OAAO,EAC5E,EAAM,iBAAiB,YAAe,EAAW,MAAM,CAAC,EACxD,EAAO,YAAY,CAAK,EAExB,EAAM,OAAO,EAAY,CAAM,EAC/B,EAAK,YAAY,CAAK,CACxB,CAEA,SAAS,GAAW,EAA2B,CAC7C,OAAO,EAAO,GAAK,KAAO,IAC5B,CAEA,SAAS,GAAM,EAAsB,CACnC,IAAM,EAAI,EAAO,GACjB,OAAO,IAAM,EAAI,GAAK,CACxB,CAaA,SAAS,GAAU,EAAe,EAAoB,EAAuB,EAAgD,CAC3H,IAAM,EAAQ,EAAG,MAAO,YAAa,CAAE,KAAM,UAAW,aAAc,CAAM,CAAC,EACvE,EAAO,EAAG,MAAO,gBAAgB,EACjC,EAAsB,CAAC,EACzB,EAAgB,KAAK,IAAI,EAAG,EAAM,UAAW,GAAO,EAAG,QAAU,CAAa,CAAC,EAEnF,EAAM,QAAS,GAAO,CACpB,IAAM,EAAU,CAAC,gBAAgB,EAC7B,EAAG,UAAU,EAAQ,KAAK,aAAa,EACvC,EAAG,QAAU,GAAe,EAAQ,KAAK,aAAa,EAC1D,IAAM,EAAM,EAAQ,EAAG,SAAU,EAAQ,KAAK,GAAG,EAAG,CAClD,KAAM,SACN,KAAM,SACN,SAAU,KACV,gBAAiB,EAAG,QAAU,EAAgB,OAAS,QACvD,gBAAiB,EAAG,SAAW,OAAS,OAC1C,CAAC,EAAG,EAAG,IAAI,EACN,EAAG,UAAU,EAAI,iBAAiB,YAAe,EAAS,EAAG,KAAK,CAAC,EACxE,EAAK,KAAK,CAAG,EACb,EAAK,YAAY,CAAG,CACtB,CAAC,EACD,EAAM,YAAY,CAAI,EAEtB,IAAM,MAAqB,CACzB,IAAM,EAAM,EAAK,GACb,IAAK,EAAK,UAAY,EAAI,WAAa,EAAK,aAAe,EAAI,cAAgB,EACrF,EAEI,EAAS,EAmBb,OAlBA,EAAK,iBAAiB,aAAgB,CACpC,OAAO,aAAa,CAAM,EAC1B,EAAS,OAAO,eAAiB,CAC/B,IAAM,EAAM,EAAK,UAAY,EAAK,aAAe,EAC7C,EAAY,EACZ,EAAW,IACf,EAAK,SAAS,EAAK,IAAM,CACvB,GAAI,EAAM,EAAE,CAAC,SAAU,OACvB,IAAM,EAAO,KAAK,IAAI,EAAI,UAAY,EAAI,aAAe,EAAI,CAAG,EAC5D,EAAO,IAAY,EAAW,EAAM,EAAY,EACtD,CAAC,EACG,EAAM,IAAc,EAAM,EAAU,CAAC,QAAU,EAAe,EAAS,EAAM,EAAU,CAAC,KAAK,GAC1F,EAAgB,EAAW,EAAO,EAC3C,EAAG,GAAG,CACR,EAAG,CAAE,QAAS,EAAK,CAAC,EAEhB,OAAO,uBAA0B,WAAY,sBAAsB,CAAM,EACxE,EAAO,EACL,CACT,CAOA,SAAS,GAAU,EASE,CACnB,IAAM,EAAQ,EAAG,QAAS,iBAAkB,CAC1C,KAAM,OACN,UAAW,UACX,aAAc,MACd,UAAW,IACX,KAAM,aACN,aAAc,EAAK,MACnB,gBAAiB,OAAO,EAAK,GAAG,EAChC,gBAAiB,OAAO,EAAK,GAAG,EAChC,gBAAiB,OAAO,EAAK,GAAG,EAChC,iBAAkB,EAAK,QACvB,iBAAkB,EAAK,KACzB,CAAC,EACD,EAAM,MAAQ,EAAK,QACnB,IAAM,MAAe,CAAE,EAAM,MAAQ,EAAK,QAAS,EAAM,UAAU,OAAO,mBAAmB,CAAG,EAehG,OAdA,EAAM,iBAAiB,YAAe,EAAM,OAAO,CAAC,EACpD,EAAM,iBAAiB,YAAe,CACpC,EAAM,MAAQ,EAAgB,EAAM,KAAK,CAAC,CAAC,QAAQ,MAAO,EAAE,CAAC,CAAC,MAAM,EAAG,CAAC,EAExE,IAAM,EAAI,OAAO,EAAM,KAAK,EACtB,EAAM,EAAM,QAAU,KAAO,OAAO,MAAM,CAAC,GAAK,EAAI,EAAK,KAAO,EAAI,EAAK,KAC/E,EAAM,UAAU,OAAO,oBAAqB,CAAG,CACjD,CAAC,EACD,EAAM,iBAAiB,UAAY,GAAM,CACnC,EAAE,MAAQ,WAAa,EAAE,eAAe,EAAG,EAAK,OAAO,CAAC,GACnD,EAAE,MAAQ,aAAe,EAAE,eAAe,EAAG,EAAK,OAAO,EAAE,GAC3D,EAAE,MAAQ,UAAW,EAAE,eAAe,EAAQ,EAAK,SAAS,EAAM,KAAK,GAAG,EAAO,EAC5F,CAAC,EACD,EAAM,iBAAiB,WAAc,CAAO,EAAK,SAAS,EAAM,KAAK,GAAG,EAAO,CAAG,CAAC,EAC5E,CACT,CAEA,SAAS,GAAmB,EAAoD,CAC9E,IAAM,EAAQ,EAAW,SAAS,EAClC,GAAI,CAAC,EAAM,KAAM,OAAO,KACxB,GAAM,CAAE,OAAM,SAAQ,UAAW,EAAM,KACjC,EAAQ,EAAM,aAAe,MAC7B,EAAO,EAAM,WAAa,EAAI,EAAM,WAAa,EACjD,EAAK,GAAW,CAAI,IAAM,KAE1B,EAAQ,EAAG,MAAO,gBAAgB,EACxC,EAAM,YAAY,EAAQ,EAAG,MAAO,gBAAgB,EAAG,YAAY,CAAC,EAEpE,IAAM,EAAQ,GAA6B,EAAS,EAAU,IAAO,EAAK,GAAK,GAAK,EAC9E,EAAc,EAAQ,GAAM,CAAI,EAAI,EAGpC,EAAQ,EAAG,MAAO,iBAAkB,CAAE,KAAM,QAAS,aAAc,YAAa,CAAC,EAgCvF,GA/BA,EAAM,YAAY,GAAU,CAC1B,MAAO,OACP,MAAO,EAAQ,cAAgB,cAC/B,QAAS,EAAK,CAAW,EACzB,IAAK,KACL,IAAK,EAAQ,GAAK,GAClB,IAAK,EACL,SAAW,GAAQ,CACjB,GAAI,IAAQ,GAAI,MAAO,GACvB,IAAM,EAAI,OAAO,EAAgB,CAAG,CAAC,EAGrC,OAFK,OAAO,UAAU,CAAC,EACnB,EAAc,GAAK,GAAK,GAAK,IAAK,EAAW,QAAS,EAAI,IAAO,EAAK,GAAK,EAAE,EAC1E,EAAW,QAAQ,CAAC,EAFM,EAGnC,EACA,OAAS,GAAM,EAAW,SAAS,CAAC,CACtC,CAAC,CAAC,EACF,EAAM,YAAY,EAAQ,EAAG,OAAQ,uBAAwB,CAAE,cAAe,MAAO,CAAC,EAAG,GAAG,CAAC,EAC7F,EAAM,YAAY,GAAU,CAC1B,MAAO,SACP,MAAO,gBACP,QAAS,EAAK,CAAM,EACpB,IAAK,EACL,IAAK,GACL,IAAK,EACL,SAAW,GAAQ,CACjB,GAAI,IAAQ,GAAI,MAAO,GACvB,IAAM,EAAI,OAAO,EAAgB,CAAG,CAAC,EACrC,OAAO,OAAO,UAAU,CAAC,EAAI,EAAW,UAAU,CAAC,EAAI,EACzD,EACA,OAAS,GAAM,EAAW,WAAW,CAAC,CACxC,CAAC,CAAC,EACE,EAAO,CACT,IAAM,EAAO,EAAQ,EAAG,SAAU,gBAAiB,CACjD,KAAM,SACN,iBAAkB,OAClB,aAAc,uBAAuB,EAAK,KAAO,MACnD,CAAC,EAAG,EAAK,KAAO,IAAI,EACpB,EAAK,iBAAiB,YAAe,EAAW,eAAe,CAAC,EAChE,EAAK,iBAAiB,UAAY,GAAM,EAClC,EAAE,MAAQ,WAAa,EAAE,MAAQ,eAAe,EAAE,eAAe,EAAG,EAAW,eAAe,EACpG,CAAC,EACD,EAAM,YAAY,CAAI,CACxB,CACA,EAAM,YAAY,CAAK,EAEvB,IAAM,EAAc,EAAQ,EAAG,MAAO,uBAAwB,CAAE,cAAe,MAAO,CAAC,EAAG,WAAW,EACrG,EAAM,YAAY,CAAW,EAE7B,IAAM,EAAS,EAAG,MAAO,iBAAiB,EAGpC,EAAyB,CAAC,EAChC,GAAI,EACF,IAAK,IAAI,EAAI,EAAG,GAAK,GAAI,GAAK,EAAG,EAAU,KAAK,CAAE,MAAO,EAAG,KAAM,EAAK,CAAC,EAAG,SAAU,EAAW,eAAe,EAAK,CAAC,CAAC,CAAE,CAAC,OAEzH,IAAK,IAAI,EAAI,EAAG,EAAI,GAAI,GAAK,EAAG,EAAU,KAAK,CAAE,MAAO,EAAG,KAAM,EAAK,CAAC,EAAG,SAAU,EAAW,eAAe,CAAC,CAAE,CAAC,EAEpH,EAAO,YAAY,GAAU,OAAQ,EAAW,EAAQ,GAAM,CAAI,EAAI,EAAO,GAAY,EAAW,QAAQ,EAAK,CAAO,EAAG,EAAQ,CAAM,CAAC,CAAC,EAE3I,EAAO,YAAY,EAAQ,EAAG,OAAQ,iBAAiB,EAAG,GAAG,CAAC,EAG9D,IAAM,EAA2B,CAAC,EAClC,IAAK,IAAI,EAAI,EAAG,EAAI,GAAI,GAAK,EAAM,EAAY,KAAK,CAAE,MAAO,EAAG,KAAM,EAAK,CAAC,EAAG,SAAU,EAAW,iBAAiB,EAAM,CAAC,CAAE,CAAC,EAC/H,EAAO,YAAY,GAAU,MAAO,EAAa,EAAS,GAAM,EAAW,QAAQ,EAAM,EAAG,CAAM,CAAC,CAAC,EAGhG,GAKF,EAAO,YAAY,GAAU,QAAS,CAHpC,CAAE,MAAO,EAAG,KAAM,KAAM,SAAU,EAAM,EACxC,CAAE,MAAO,EAAG,KAAM,KAAM,SAAU,EAAM,CAEJ,EAAU,KAAa,GAAM,CAAO,IAAM,IAAO,GAAI,EAAW,eAAe,CAAG,CAAC,CAAC,EAG5H,EAAM,YAAY,CAAM,EAExB,IAAM,EAAM,EAAQ,EAAG,SAAU,eAAgB,CAAE,KAAM,QAAS,CAAC,EAAG,aAAa,EAGnF,OAFA,EAAI,iBAAiB,YAAe,EAAW,aAAa,CAAC,EAC7D,EAAM,YAAY,CAAG,EACd,CACT,CAEA,SAAgB,GAAoB,EAAmB,EAAsC,CAC3F,IAAM,EAAQ,EAAW,SAAS,EAC5B,EAAU,EAGV,EAAS,SAAS,cAClB,EAAe,GAAU,EAAK,SAAS,CAAM,EAAI,EAAO,aAAa,gBAAgB,EAAI,KAC/F,EAAK,UAAY,GAGjB,IAAM,EAAQ,EAAG,MAAO,gCAFN,EAAM,KACgE,GAA1B,0BAC1B,CAAE,KAAM,SAAU,aAAc,kBAAmB,CAAC,EAClF,EAAS,EAAG,MAAO,aAAa,EACtC,EAAO,YAAY,GAAa,CAAU,CAAC,EAK3C,IAAM,EAAW,EAAG,MAAO,eAAe,EACpC,EAAW,EAAQ,EAAG,SAAU,gBAAiB,CAAE,KAAM,QAAS,CAAC,EAAG,YAAY,EAKxF,GAJA,EAAS,iBAAiB,YAAe,EAAW,QAAQ,CAAC,EAC7D,EAAS,YAAY,CAAQ,EAC7B,EAAO,YAAY,CAAQ,EAEvB,EAAM,OAAS,MAAO,CACxB,EAAO,YAAY,GAAe,EAAM,IAAI,CAAC,EAC7C,IAAM,EAAO,EAAG,MAAO,WAAY,CAAE,KAAM,MAAO,CAAC,EAC7C,EAAU,EAAQ,QAAQ,EAC1B,EAAQ,EAAW,UAAU,EAAQ,KAAM,EAAQ,MAAO,EAAQ,GAAG,EAC3E,EAAW,gBAAgB,EAAM,SAAU,EAAM,SAAS,CAAC,CAAC,QAAS,GAAS,CAC5E,GAAI,CAAC,EAAM,CACT,EAAK,YAAY,EAAG,MAAO,2BAA4B,CAAE,KAAM,UAAW,CAAC,CAAC,EAC5E,MACF,CACA,IAAM,EAAW,EAAW,WAAW,CAAI,EACrC,EAAU,CAAC,UAAU,EACvB,EAAU,EAAM,CAAK,GAAG,EAAQ,KAAK,UAAU,EAC/C,EAAU,EAAM,EAAM,QAAQ,GAAG,EAAQ,KAAK,gBAAgB,EAC9D,GAAU,EAAQ,KAAK,aAAa,EACxC,IAAM,EAAM,EAAG,SAAU,EAAQ,KAAK,GAAG,EAAG,CAAE,KAAM,SAAU,KAAM,WAAY,gBAAiB,EAAU,EAAM,EAAM,QAAQ,EAAI,OAAS,OAAQ,CAAC,EACjJ,GAAU,EAAI,aAAa,gBAAiB,MAAM,EACtD,IAAM,EAAa,EAAM,OAAS,KAAO,OAAO,EAAK,GAAG,QAAQ,CAAC,EAAI,EAAQ,eAAe,EAAK,GAAG,IAAK,IAAI,EAE7G,GADA,EAAI,YAAY,EAAQ,EAAG,OAAQ,kBAAkB,EAAG,CAAU,CAAC,EAC/D,EAAM,sBAAuB,CAC/B,IAAM,EAAe,EAAM,OAAS,KAAO,EAAQ,eAAe,EAAK,GAAG,IAAK,IAAI,EAAI,OAAO,EAAK,GAAG,QAAQ,CAAC,EAC/G,EAAI,YAAY,EAAQ,EAAG,OAAQ,oBAAoB,EAAG,CAAY,CAAC,CACzE,CACK,GAAU,EAAI,iBAAiB,YAAe,EAAW,UAAU,CAAI,CAAC,EAC7E,EAAK,YAAY,CAAG,CACtB,CAAC,EACD,EAAO,YAAY,CAAI,CACzB,MAAW,EAAM,OAAS,QACxB,EAAO,YAAY,GAAgB,CAAU,CAAC,EAE9C,EAAO,YAAY,GAAe,CAAU,CAAC,EAM/C,IAAM,EAAO,EAAG,MAAO,mBAAmB,EAC1C,EAAK,YAAY,CAAM,EACvB,IAAM,EAAe,EAAM,OAAS,MAAQ,GAAmB,CAAU,EAAI,KAO7E,GANI,GAAc,EAAK,YAAY,CAAY,EAC/C,EAAM,YAAY,CAAI,EAKlB,EAAc,CAChB,IAAM,EAAS,EAAG,MAAO,gBAAgB,EACnC,EAAQ,EAAQ,EAAG,SAAU,gBAAiB,CAAE,KAAM,QAAS,CAAC,EAAG,OAAO,EAC1E,EAAO,EAAQ,EAAG,SAAU,YAAa,CAAE,KAAM,QAAS,CAAC,EAAG,MAAM,EAC1E,EAAM,iBAAiB,YAAe,EAAW,MAAM,CAAC,EACxD,EAAK,iBAAiB,YAAe,EAAW,QAAQ,CAAC,EACzD,EAAO,OAAO,EAAO,CAAI,EACzB,EAAM,YAAY,CAAM,CAC1B,CAIA,GAFA,EAAK,YAAY,CAAK,EAElB,EAAc,CAChB,IAAM,EAAO,EAAM,cAA2B,oBAAoB,EAAa,GAAG,EAC9E,IACF,EAAK,MAAM,EACP,aAAgB,kBAAkB,EAAK,OAAO,EAEtD,CACF,CAEA,SAAgB,GAAuB,EAAmB,EAAyC,CACjG,IAAM,EAAQ,EAAW,SAAS,EAClC,EAAK,UAAY,GACjB,IAAM,EAAQ,EAAG,MAAO,6BAA8B,CAAE,KAAM,SAAU,aAAc,cAAe,CAAC,EAChG,EAAM,EAAG,MAAO,aAAa,EACnC,EAAI,YAAY,GAAa,CAAU,CAAC,EACxC,EAAI,YAAY,EAAM,OAAS,OAAS,GAAe,CAAU,EAAI,GAAgB,CAAU,CAAC,EAChG,EAAM,YAAY,CAAG,EACrB,EAAK,YAAY,CAAK,CACxB,CAEA,SAAgB,EAAc,EAAsB,EAAoB,EAA4F,CAAC,EAAS,CAO5K,EAAM,MAAM,SAAW,QACvB,EAAM,MAAM,IAAM,MAClB,EAAM,MAAM,KAAO,MACnB,EAAW,aACX,IAAM,EAAO,EAAQ,sBAAsB,EACrC,EAAY,EAAM,sBAAsB,EACxC,EAAM,GAAqB,EAAM,CAAE,MAAO,EAAU,MAAO,OAAQ,EAAU,MAAO,EAAG,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAY,EAAG,CAAO,EAC9J,EAAM,MAAM,IAAM,GAAG,EAAI,IAAI,IAC7B,EAAM,MAAM,KAAO,GAAG,EAAI,KAAK,GACjC,CCtsBA,IAAa,GAAW,CACtB,GAAI,CAAE,OAAQ,CAAE,UAAW,MAAO,WAAY,iBAAkB,YAAa,iBAAkB,SAAU,CAAE,CAAE,EAC7G,GAAI,CAAE,OAAQ,CAAE,UAAW,MAAO,WAAY,QAAS,YAAa,SAAU,SAAU,CAAE,CAAE,CAC9F,EAEI,EAAoE,CAAC,EAEzE,SAAgB,GAAY,EAAwE,CAClG,EAAW,CAAE,GAAG,EAAU,GAAG,CAAQ,CACvC,CAEA,SAAS,GAAgB,EAAqB,EAA8C,CAG1F,OAFI,aAAoB,YAAoB,EACxC,OAAO,GAAa,SAAiB,SAAS,cAA2B,CAAQ,GAAK,SAAS,KAC5F,SAAS,IAClB,CAEA,SAAS,EAAc,EAAgD,CAGrE,OAFI,aAAe,YAAoB,EACnC,OAAO,GAAQ,SAAiB,SAAS,cAA2B,CAAG,EACpE,IACT,CAGA,SAAS,GAAiB,EAAiB,EAAqB,CAC1D,aAAc,kBAAoB,aAAc,qBAAuB,aAAc,kBAAmB,EAAG,MAAQ,EAClH,EAAG,YAAc,CACxB,CAIA,SAAS,EAAmB,EAAc,EAAsB,EAA6C,CAC3G,IAAM,EAAS,SAAS,cAAc,OAAO,EAK7C,MAJA,GAAO,KAAO,SACd,EAAO,KAAO,EACd,EAAQ,YAAY,CAAM,EACtB,EAAQ,aAAa,MAAM,GAAG,EAAQ,gBAAgB,MAAM,EACzD,CACT,CAMA,SAAS,GACP,EACA,EACA,EACA,EAC2E,CAC3E,IAAM,EAAU,SAAS,cAAc,KAAK,EAC5C,EAAQ,UAAY,mBACpB,EAAQ,YAAY,aAAa,EAAS,CAAO,EACjD,EAAQ,YAAY,CAAO,EAG3B,IAAM,EAAW,SAAS,cAAc,QAAQ,EAChD,EAAS,UAAY,YACrB,EAAS,aAAa,OAAQ,QAAQ,EACtC,EAAS,aAAa,aAAc,OAAO,EAC3C,EAAS,UAAY,SACrB,EAAS,MAAM,QAAU,OACzB,EAAS,iBAAiB,QAAU,GAAM,CACxC,EAAE,gBAAgB,EAClB,EAAQ,CACV,CAAC,EACD,EAAQ,YAAY,CAAQ,EAE5B,SAAS,GAAc,CACrB,EAAS,MAAM,QAAU,EAAgB,EAAI,GAAK,MACpD,CAGA,IAAI,MAAmB,CAAC,EACxB,GAAI,EAAY,CACd,IAAM,EAAM,SAAS,cAAc,QAAQ,EAC3C,EAAI,UAAY,kBAChB,EAAI,aAAa,OAAQ,QAAQ,EACjC,EAAI,UAAY,qVAChB,EAAI,iBAAiB,QAAU,GAAM,CACnC,EAAE,gBAAgB,EAClB,EAAW,OAAO,CACpB,CAAC,EACD,EAAQ,YAAY,CAAG,EAEvB,MAAmB,CACjB,EAAI,MAAM,QAAU,EAAW,QAAQ,EAAI,GAAK,OAChD,EAAI,aAAa,aAAc,aAAa,EAAW,KAAK,IAAM,KAAO,KAAO,MAAM,EACtF,EAAI,aAAa,YAAa,EAAW,KAAK,CAAC,CACjD,EACA,EAAW,CACb,CAEA,MAAO,CAAE,UAAS,cAAa,YAAW,CAC5C,CAKA,SAAS,GACP,EACA,EACA,EACM,CACN,IAAM,EAAO,EAAW,OAAO,KAAK,CAAU,EAC9C,EAAW,OAAU,GAAsB,CACzC,OAAO,OAAO,EAAkB,CAAK,EACrC,EAAK,CAAK,EACV,EAAQ,CACV,CACF,CAEA,SAAS,GAAc,EAAsB,EAAqB,EAA2F,EAAoC,CAC/L,IAAI,EAAM,EACV,SAAS,GAAa,CAChB,CAAC,EAAQ,GAAK,EAAO,MAAM,UAAY,SAC3C,qBAAqB,CAAG,EACxB,EAAM,0BAA4B,EAAc,EAAS,EAAQ,CAAO,CAAC,EAC3E,CAGA,OAFA,SAAS,iBAAiB,SAAU,EAAY,CAAE,QAAS,GAAM,QAAS,EAAK,CAAC,EAChF,OAAO,iBAAiB,SAAU,CAAU,MAC/B,CACX,qBAAqB,CAAG,EACxB,SAAS,oBAAoB,SAAU,EAAY,EAAI,EACvD,OAAO,oBAAoB,SAAU,CAAU,CACjD,CACF,CAEA,SAAgB,GAAqB,EAAwC,EAAkC,CAAC,EAA4D,CAC1K,IAAM,EAAS,CAAE,GAAG,EAAU,GAAG,CAAQ,EACnC,EAAa,GAA0B,CAAM,EAC7C,EAAU,aAAkB,iBAAmB,EAAS,SAAS,cAAc,QAAQ,EACvF,aAAkB,mBACtB,EAAQ,aAAa,OAAQ,QAAQ,EACrC,EAAO,YAAY,CAAO,GAE5B,EAAQ,UAAU,IAAI,aAAa,EACnC,EAAQ,aAAa,OAAQ,UAAU,EACvC,EAAQ,aAAa,gBAAiB,QAAQ,EAC9C,IAAM,EAAa,aAAmB,kBAAoB,EAAO,aAAe,GAC5E,EAAmC,KACjC,EAAS,SAAS,cAAc,KAAK,EAC3C,EAAO,UAAY,iBACnB,EAAO,MAAM,QAAU,OACvB,GAAgB,EAAQ,EAAO,UAAY,EAAO,SAAS,CAAC,CAAC,YAAY,CAAM,EAE/E,IAAM,EAAe,EAA4E,cAAc,CAAM,EAC/G,EAAW,GAAsB,CACjC,CAAC,EAAO,SAAS,EAAM,MAAc,GAAK,EAAM,SAAW,GAAS,EAAW,KAAK,CAC1F,EACM,EAAe,GAAc,EAAS,EAAQ,MAAc,EAAW,SAAS,CAAC,CAAC,MAAM,EAExF,EAAa,aAAmB,iBAClC,GACA,MACM,EAAO,YAAc,IAAS,EAAW,SAAS,IAAM,SACxD,EAAW,SAAS,IAAI,EAC9B,CAAE,SAAY,EAAW,SAAS,CAAC,CAAC,KAAM,WAAc,EAAW,WAAW,EAAG,YAAe,EAAO,kBAAoB,EAAM,CACnI,EACE,KAIE,EAAe,EAAO,SAAW,EACjC,EAAkC,EAAO,WAAa,EAAO,aAAe,MAC5E,EAA+E,CAAC,EACtF,GAAI,aAAmB,kBAAoB,EAAY,CACrD,IAAM,EAAK,EAAO,WACd,OAAO,GAAO,SAAU,EAAa,KAAK,CAAE,GAAI,EAAmB,EAAI,EAAW,QAAS,CAAO,EAAG,KAAM,UAAW,CAAC,EAClH,IACP,EAAa,KAAK,CAAE,GAAI,EAAmB,EAAG,MAAO,EAAW,QAAS,CAAO,EAAG,KAAM,OAAQ,CAAC,EAClG,EAAa,KAAK,CAAE,GAAI,EAAmB,EAAG,IAAK,EAAW,QAAS,CAAO,EAAG,KAAM,KAAM,CAAC,EAElG,CACA,IAAM,EAAK,EAAO,SAClB,GAAI,GAAM,OAAO,GAAO,UAAY,EAAE,aAAc,aAAc,CAChE,IAAM,EAAI,EAAc,EAAG,KAAK,EAAO,GAAG,EAAa,KAAK,CAAE,GAAI,EAAG,KAAM,OAAQ,CAAC,EACpF,IAAM,EAAI,EAAc,EAAG,GAAG,EAAO,GAAG,EAAa,KAAK,CAAE,GAAI,EAAG,KAAM,KAAM,CAAC,CAClF,MAAO,GAAI,EAAI,CACb,IAAM,EAAK,EAAc,CAAE,EAAO,GAAI,EAAa,KAAK,CAAE,KAAI,KAAM,UAAW,CAAC,CAClF,CACA,SAAS,GAAoB,CAC3B,GAAI,CAAC,EAAa,OAAQ,OAC1B,IAAM,EAAI,EAAW,SAAS,EAC1B,EAAW,GACX,EAAS,GACT,IACF,EAAW,EAAsB,EAAmB,CAAE,GAAI,EAAE,MAAO,GAAI,EAAE,OAAQ,EAAG,EAAoB,CAAY,CAAC,EACrH,EAAS,EAAsB,EAAmB,CAAE,GAAI,EAAE,IAAK,GAAI,EAAE,KAAM,EAAG,EAAoB,CAAY,CAAC,GAEjH,IAAM,EAAW,EAAI,GAAG,EAAS,GAAG,IAAW,GAC/C,EAAa,QAAS,GAAM,GAAiB,EAAE,GAAI,EAAE,OAAS,QAAU,EAAW,EAAE,OAAS,MAAQ,EAAS,CAAQ,CAAC,CAC1H,CAEA,SAAS,EAAY,EAAQ,EAAW,SAAS,EAAS,CACpD,OAAW,UAAU,EACzB,IAAI,EAAE,aAAmB,kBAAmB,CAC1C,EAAQ,YAAc,GAAO,WAAa,oBAC1C,MACF,CACA,EAAQ,MAAQ,EAAO,kBAAoB,GAAmC,EAAQ,MAAlC,GAAO,WAAa,EADxE,CAEF,CAEA,IAAI,EAAU,GACd,SAAS,GAAe,CACtB,IAAM,EAAQ,EAAW,SAAS,EAClC,EAAQ,aAAa,gBAAiB,EAAM,OAAS,OAAS,OAAO,EACrE,EAAY,EACZ,EAAY,EACZ,GAAY,YAAY,EACxB,GAAY,WAAW,EACvB,EAAO,MAAM,QAAU,EAAM,OAAS,QAAU,OAC5C,EAAM,QACR,GAAiB,EAAQ,CAAU,EAC9B,GAAS,EAAc,EAAS,EAAQ,CAAM,GAEnD,EAAO,UAAY,GAErB,EAAU,EAAM,MAClB,CAEI,aAAmB,mBACrB,EAAQ,SAAW,CAAC,EAChB,IACF,EAAY,GAAqB,EAAS,CACxC,GAAG,GAAY,CAAE,eAAkB,EAAW,WAAW,CAAE,CAAC,EAC5D,cAAiB,EAAW,YAAY,EACxC,cAAiB,EAAW,eAAe,EAC3C,cAAiB,EAAW,SAAS,CAAC,EAAE,WAAa,GACrD,SAAW,GAAU,EAAW,cAAc,CAAK,EACnD,OAAS,GAAU,EAAW,YAAY,CAAK,EAC/C,SAAY,EAAW,KAAK,EAC5B,UAAa,EAAW,KAAK,CAC/B,CAAC,IAGA,IACH,EAAQ,iBAAiB,UAAY,GAAiB,CACpD,IAAM,EAAI,EACN,EAAE,MAAQ,UAAY,EAAW,SAAS,CAAC,CAAC,QAAU,EAAE,eAAe,EAAG,EAAW,KAAK,IACpF,EAAE,MAAQ,aAAe,EAAE,MAAQ,SAAW,CAAC,EAAW,SAAS,CAAC,CAAC,SAAU,EAAE,eAAe,EAAG,EAAW,KAAK,EAC/H,CAAC,EACD,EAAQ,iBAAiB,YAAe,EAAW,KAAK,CAAC,GAE3D,EAAQ,iBAAiB,YAAe,EAAW,KAAK,CAAC,EACzD,SAAS,iBAAiB,YAAa,EAAS,EAAI,EACpD,EAAW,SAAU,GAAU,CAC7B,EAAY,CAAK,EACjB,GAAY,YAAY,EACxB,GAAY,WAAW,EACvB,EAAO,cAAc,IAAI,YAAY,8BAA+B,CAAE,QAAS,GAAM,OAAQ,CAAM,CAAC,CAAC,CACvG,CAAC,EACD,EAAO,EAEP,GAAe,EAAY,MAAc,CACnC,EAAW,SAAS,CAAC,CAAC,QAAQ,EAAc,EAAS,EAAQ,CAAM,CACzE,CAAC,EAED,IAAI,EAAgC,KAChC,IAAY,EAAY,EAAW,SACvC,IAAM,EAAc,EAAW,QAU/B,MATA,GAAW,YAAgB,CACzB,EAAY,EACZ,EAAa,EACb,GAAW,QAAQ,EACf,GAAW,EAAU,OAAO,EAChC,SAAS,oBAAoB,YAAa,EAAS,EAAI,EACvD,EAAO,OAAO,EACd,EAAY,CACd,EACO,CACT,CAEA,SAAgB,GAAoB,EAAwC,EAAiC,CAAC,EAA0D,CACtK,IAAM,EAAS,CAAE,GAAG,EAAU,GAAG,CAAQ,EACnC,EAAa,GAAyB,CAAM,EAC5C,EAAU,aAAkB,iBAAmB,EAAS,SAAS,cAAc,QAAQ,EACvF,aAAkB,mBACtB,EAAQ,aAAa,OAAQ,QAAQ,EACrC,EAAO,YAAY,CAAO,GAE5B,EAAQ,UAAU,IAAI,aAAa,EACnC,EAAQ,aAAa,OAAQ,UAAU,EACvC,EAAQ,aAAa,gBAAiB,QAAQ,EAC9C,IAAM,EAAS,SAAS,cAAc,KAAK,EAC3C,EAAO,UAAY,iBACnB,EAAO,MAAM,QAAU,OACvB,GAAgB,EAAQ,EAAO,QAAQ,CAAC,CAAC,YAAY,CAAM,EAC3D,IAAM,EAAe,EAA4E,cAAc,CAAM,EAC/G,EAAW,GAAsB,CACjC,CAAC,EAAO,SAAS,EAAM,MAAc,GAAK,EAAM,SAAW,GAAS,EAAW,KAAK,CAC1F,EACM,EAAe,GAAc,EAAS,EAAQ,MAAc,EAAW,SAAS,CAAC,CAAC,MAAM,EAExF,EAAa,aAAmB,iBAClC,GACA,MACM,EAAO,YAAc,IAAS,EAAW,SAAS,IAAM,SACxD,EAAW,SAAS,IAAI,EAC9B,CAAE,SAAY,EAAW,SAAS,CAAC,CAAC,KAAM,WAAc,EAAW,WAAW,EAAG,YAAe,EAAO,kBAAoB,EAAM,CACnI,EACE,KAEE,EAAa,aAAmB,kBAAoB,EAAO,aAAe,GAC5E,EAAmC,KAKjC,EAAY,EAAO,SAAW,EAC9B,EAA6B,EAAO,WAAa,EAAO,aAAe,MACvE,EAAgC,CAAC,EACvC,GAAI,aAAmB,iBAAkB,CACnC,OAAO,EAAO,YAAe,UAAY,GAAY,EAAe,KAAK,EAAmB,EAAO,WAAY,EAAW,QAAS,CAAO,CAAC,EAC/I,IAAM,EAAM,EAAc,EAAO,QAAQ,EACrC,GAAK,EAAe,KAAK,CAAG,CAClC,CACA,SAAS,GAAoB,CAC3B,GAAI,CAAC,EAAe,OAAQ,OAC5B,IAAM,EAAI,EAAW,SAAS,EACxB,EAAM,EAAI,EAAsB,EAAmB,CAAE,GAAI,EAAE,GAAI,GAAI,EAAE,GAAI,KAAM,EAAE,IAAK,EAAG,EAAe,EAAW,CAAC,CAAC,EAAO,QAAQ,CAAC,EAAI,GAC/I,EAAe,QAAS,GAAO,GAAiB,EAAI,CAAG,CAAC,CAC1D,CAEA,SAAS,EAAY,EAAQ,EAAW,SAAS,EAAS,CAExD,GAAI,GAAW,UAAU,EAAG,OAC5B,IAAM,EAAQ,GAAO,WAAa,cAC9B,aAAmB,iBAAkB,EAAQ,MAAQ,IAAU,cAAgB,GAAK,EACnF,EAAQ,YAAc,CAC7B,CAEA,IAAI,EAAU,GACd,SAAS,GAAe,CACtB,IAAM,EAAQ,EAAW,SAAS,EAClC,EAAQ,aAAa,gBAAiB,EAAM,OAAS,OAAS,OAAO,EACrE,EAAY,EACZ,EAAY,EACZ,GAAY,YAAY,EACxB,GAAY,WAAW,EACvB,EAAO,MAAM,QAAU,EAAM,OAAS,QAAU,OAC5C,EAAM,QACR,GAAoB,EAAQ,CAAU,EACjC,GAAS,EAAc,EAAS,EAAQ,CAAM,GAEnD,EAAO,UAAY,GAErB,EAAU,EAAM,MAClB,CAKI,aAAmB,mBACrB,EAAQ,SAAW,CAAC,EAChB,IACF,EAAY,GAAqB,EAAS,CACxC,GAAG,GAAW,CACZ,eAAkB,EAAW,WAAW,EACxC,aAAgB,CAAC,CAAC,EAAO,SACzB,WAAc,EAAO,aAAe,KACtC,CAAC,EACD,cAAiB,EAAW,YAAY,EACxC,cAAiB,EAAW,eAAe,EAC3C,cAAiB,EAAW,SAAS,CAAC,EAAE,WAAa,GACrD,SAAW,GAAU,EAAW,cAAc,CAAK,EACnD,OAAS,GAAU,EAAW,YAAY,CAAK,EAC/C,SAAY,EAAW,KAAK,EAC5B,UAAa,EAAW,KAAK,CAC/B,CAAC,IAOA,GACH,EAAQ,iBAAiB,UAAY,GAAiB,CACpD,IAAM,EAAI,EACN,EAAE,MAAQ,UAAY,EAAW,SAAS,CAAC,CAAC,QAC9C,EAAE,eAAe,EACjB,EAAW,KAAK,IACN,EAAE,MAAQ,aAAe,EAAE,MAAQ,SAAW,CAAC,EAAW,SAAS,CAAC,CAAC,SAC/E,EAAE,eAAe,EACjB,EAAW,KAAK,EAEpB,CAAC,EAGE,GAAY,EAAQ,iBAAiB,YAAe,EAAW,KAAK,CAAC,EAC1E,EAAQ,iBAAiB,YAAe,EAAW,KAAK,CAAC,EACzD,SAAS,iBAAiB,YAAa,EAAS,EAAI,EACpD,EAAW,SAAU,GAAU,CAC7B,EAAY,CAAK,EACjB,GAAY,YAAY,EACxB,GAAY,WAAW,EACvB,EAAO,cAAc,IAAI,YAAY,0BAA2B,CAAE,QAAS,GAAM,OAAQ,CAAM,CAAC,CAAC,CACnG,CAAC,EACD,EAAO,EAEP,GAAe,EAAY,MAAc,CACnC,EAAW,SAAS,CAAC,CAAC,QAAQ,EAAc,EAAS,EAAQ,CAAM,CACzE,CAAC,EAED,IAAI,EAAgC,KAChC,IAAY,EAAY,EAAW,SACvC,IAAM,EAAc,EAAW,QAU/B,MATA,GAAW,YAAgB,CACzB,EAAY,EACZ,EAAa,EACb,GAAW,QAAQ,EACf,GAAW,EAAU,OAAO,EAChC,SAAS,oBAAoB,YAAa,EAAS,EAAI,EACvD,EAAO,OAAO,EACd,EAAY,CACd,EACO,CACT,CAEA,SAAgB,GAAiB,EAAwC,EAA8B,CAAC,EAAoD,CAC1J,IAAM,EAAS,CAAE,GAAG,EAAU,GAAG,CAAQ,EACnC,EAAa,GAA4B,CAAM,EAC/C,EAAU,aAAkB,iBAAmB,EAAS,SAAS,cAAc,QAAQ,EACvF,aAAkB,mBACtB,EAAQ,aAAa,OAAQ,QAAQ,EACrC,EAAO,YAAY,CAAO,GAE5B,EAAQ,UAAU,IAAI,aAAa,EACnC,EAAQ,aAAa,OAAQ,UAAU,EACvC,EAAQ,aAAa,gBAAiB,QAAQ,EAC9C,IAAM,EAAa,aAAmB,kBAAoB,EAAO,aAAe,GAC5E,EAAmC,KACjC,EAAS,SAAS,cAAc,KAAK,EAC3C,EAAO,UAAY,iBACnB,EAAO,MAAM,QAAU,OACvB,GAAgB,EAAQ,EAAO,UAAY,EAAO,SAAS,CAAC,CAAC,YAAY,CAAM,EAC/E,IAAM,EAAe,EAA4E,cAAc,CAAM,EAC/G,EAAW,GAAsB,CACjC,CAAC,EAAO,SAAS,EAAM,MAAc,GAAK,EAAM,SAAW,GAAS,EAAW,KAAK,CAC1F,EACM,EAAe,GAAc,EAAS,EAAQ,MAAc,EAAW,SAAS,CAAC,CAAC,MAAM,EAExF,EAAa,aAAmB,iBAClC,GAAe,MAAe,EAAO,YAAc,IAAS,EAAW,SAAS,IAAM,SAAY,EAAW,SAAS,IAAI,CAAC,EAC3H,KAIE,EAAe,EAAO,SAAW,EACjC,EAAkC,EAAO,WAAa,EAAO,aAAe,MAC5E,EAA+E,CAAC,EACtF,GAAI,aAAmB,kBAAoB,EAAY,CACrD,IAAM,EAAK,EAAO,WACd,OAAO,GAAO,SAAU,EAAa,KAAK,CAAE,GAAI,EAAmB,EAAI,EAAW,QAAS,CAAO,EAAG,KAAM,UAAW,CAAC,EAClH,IACP,EAAa,KAAK,CAAE,GAAI,EAAmB,EAAG,MAAO,EAAW,QAAS,CAAO,EAAG,KAAM,OAAQ,CAAC,EAClG,EAAa,KAAK,CAAE,GAAI,EAAmB,EAAG,IAAK,EAAW,QAAS,CAAO,EAAG,KAAM,KAAM,CAAC,EAElG,CACA,IAAM,EAAM,EAAO,SACnB,GAAI,GAAO,OAAO,GAAQ,UAAY,EAAE,aAAe,aAAc,CACnE,IAAM,EAAI,EAAc,EAAI,KAAK,EAAO,GAAG,EAAa,KAAK,CAAE,GAAI,EAAG,KAAM,OAAQ,CAAC,EACrF,IAAM,EAAI,EAAc,EAAI,GAAG,EAAO,GAAG,EAAa,KAAK,CAAE,GAAI,EAAG,KAAM,KAAM,CAAC,CACnF,MAAO,GAAI,EAAK,CACd,IAAM,EAAK,EAAc,CAAG,EAAO,GAAI,EAAa,KAAK,CAAE,KAAI,KAAM,UAAW,CAAC,CACnF,CACA,SAAS,GAAoB,CAC3B,GAAI,CAAC,EAAa,OAAQ,OAC1B,IAAM,EAAI,EAAW,SAAS,EAC1B,EAAW,GACX,EAAS,GACb,GAAI,EAAG,CACL,IAAM,EAAO,EAAa,cAAc,EAAE,KAAM,EAAE,KAAK,EACvD,EAAW,EAAsB,EAAmB,CAAE,GAAI,EAAE,MAAO,GAAI,CAAE,KAAM,EAAE,KAAM,MAAO,EAAE,MAAO,IAAK,CAAE,CAAE,EAAG,EAAoB,CAAY,CAAC,EACpJ,EAAS,EAAsB,EAAmB,CAAE,GAAI,EAAE,IAAK,GAAI,CAAE,KAAM,EAAE,KAAM,MAAO,EAAE,MAAO,IAAK,CAAK,CAAE,EAAG,EAAoB,CAAY,CAAC,CACrJ,CACA,IAAM,EAAW,EAAI,GAAG,EAAS,GAAG,IAAW,GAC/C,EAAa,QAAS,GAAM,GAAiB,EAAE,GAAI,EAAE,OAAS,QAAU,EAAW,EAAE,OAAS,MAAQ,EAAS,CAAQ,CAAC,CAC1H,CAEA,SAAS,EAAY,EAAQ,EAAW,SAAS,EAAS,CACxD,GAAI,GAAW,UAAU,EAAG,OAC5B,IAAM,EAAQ,GAAO,WAAa,GAC9B,aAAmB,iBAAkB,EAAQ,MAAQ,EACpD,EAAQ,YAAc,GAAS,cACtC,CAEA,IAAI,EAAU,GACd,SAAS,GAAe,CACtB,IAAM,EAAQ,EAAW,SAAS,EAClC,EAAQ,aAAa,gBAAiB,EAAM,OAAS,OAAS,OAAO,EACrE,EAAY,EACZ,EAAY,EACZ,GAAY,YAAY,EACxB,EAAO,MAAM,QAAU,EAAM,OAAS,QAAU,OAC5C,EAAM,QACR,GAAuB,EAAQ,CAAU,EACpC,GAAS,EAAc,EAAS,EAAQ,CAAM,GAEnD,EAAO,UAAY,GAErB,EAAU,EAAM,MAClB,CAEI,aAAmB,mBACrB,EAAQ,SAAW,CAAC,EAChB,IACF,EAAY,GAAqB,EAAS,CACxC,GAAG,GAAY,CAAE,eAAkB,EAAW,WAAW,CAAE,CAAC,EAC5D,cAAiB,EAAW,YAAY,EACxC,cAAiB,EAAW,eAAe,EAC3C,cAAiB,EAAW,SAAS,CAAC,EAAE,WAAa,GACrD,SAAW,GAAU,EAAW,cAAc,CAAK,EACnD,OAAS,GAAU,EAAW,YAAY,CAAK,EAC/C,SAAY,EAAW,KAAK,EAC5B,UAAa,EAAW,KAAK,CAC/B,CAAC,IAGA,IACH,EAAQ,iBAAiB,UAAY,GAAiB,CACpD,IAAM,EAAI,EACN,EAAE,MAAQ,UAAY,EAAW,SAAS,CAAC,CAAC,QAAU,EAAE,eAAe,EAAG,EAAW,KAAK,IACpF,EAAE,MAAQ,aAAe,EAAE,MAAQ,SAAW,CAAC,EAAW,SAAS,CAAC,CAAC,SAAU,EAAE,eAAe,EAAG,EAAW,KAAK,EAC/H,CAAC,EACD,EAAQ,iBAAiB,YAAe,EAAW,KAAK,CAAC,GAE3D,EAAQ,iBAAiB,YAAe,EAAW,KAAK,CAAC,EACzD,SAAS,iBAAiB,YAAa,EAAS,EAAI,EACpD,EAAW,SAAU,GAAU,CAC7B,EAAY,CAAK,EACjB,GAAY,YAAY,EACxB,EAAO,cAAc,IAAI,YAAY,2BAA4B,CAAE,QAAS,GAAM,OAAQ,CAAM,CAAC,CAAC,CACpG,CAAC,EACD,EAAO,EAEP,GAAe,EAAY,MAAc,CACnC,EAAW,SAAS,CAAC,CAAC,QAAQ,EAAc,EAAS,EAAQ,CAAM,CACzE,CAAC,EAED,IAAI,EAAgC,KAChC,IAAY,EAAY,EAAW,SACvC,IAAM,EAAc,EAAW,QAU/B,MATA,GAAW,YAAgB,CACzB,EAAY,EACZ,EAAa,EACb,GAAW,QAAQ,EACf,GAAW,EAAU,OAAO,EAChC,SAAS,oBAAoB,YAAa,EAAS,EAAI,EACvD,EAAO,OAAO,EACd,EAAY,CACd,EACO,CACT,CAGA,SAAS,GAAmB,EAAyF,CAEnH,MAAO,CACL,YAFkB,EAAG,aAEO,IAAA,GAC5B,WAAY,EAAG,YAAc,IAAA,GAC7B,SAAU,EAAG,UAAY,IAAA,EAC3B,CACF,CAEA,SAAgB,GAAS,EAAmB,SAAgB,CAC1D,EAAK,iBAAmC,0BAA0B,CAAC,CAAC,QAAS,GAAU,GAAoB,EAAO,CAChH,SAAU,EAAM,QAAQ,WAAa,OACrC,WAAY,EAAM,QAAQ,aAAe,MAAQ,MAAQ,EAAM,QAAQ,aAAe,MAAQ,MAAQ,IAAA,GACtG,WAAY,EAAM,QAAQ,WAAa,OAAO,EAAM,QAAQ,UAAU,EAAI,IAAA,GAC1E,GAAG,GAAmB,EAAM,OAAO,CACrC,CAAC,CAAC,EACF,EAAK,iBAAmC,yBAAyB,CAAC,CAAC,QAAS,GAAU,GAAqB,EAAO,CAChH,iBAAkB,EAAM,QAAQ,iBAAmB,OAAO,EAAM,QAAQ,gBAAgB,EAAI,IAAA,GAC5F,GAAG,GAAmB,EAAM,OAAO,CACrC,CAAC,CAAC,EACF,EAAK,iBAAmC,2BAA2B,CAAC,CAAC,QAAS,GAAU,GAAiB,EAAO,CAC9G,GAAG,GAAmB,EAAM,OAAO,CACrC,CAAC,CAAC,CACJ,CC3kBA,SAAS,EAAU,EAAW,EAAmB,CAC/C,OAAO,EAAE,KAAO,IAAQ,EAAE,MAAQ,IAAM,EAAE,KAAO,EAAE,KAAO,IAAQ,EAAE,MAAQ,IAAM,EAAE,IACtF,CAEA,SAAS,GAAoB,EAA0B,EAAoB,CACzE,MAAO,CACL,MAAQ,GAAY,EAAQ,OAAO,CAAC,EACpC,OAAQ,EAA6B,EAAgB,IAAiB,CACpE,IAAM,EAAK,OAAO,GAAe,SAAW,EAAa,CAAE,KAAM,EAAY,MAAO,GAAS,EAAG,IAAK,GAAO,CAAE,EAC9G,OAAO,EAAQ,OAAO,EAAG,KAAM,EAAG,MAAO,EAAG,GAAG,CACjD,EACA,iBAAmB,GAAuB,EAAQ,eAAe,EAAG,IAAI,EACxE,gBAAkB,GAA2B,OAAO,CAAK,CAAC,CAAC,QAAQ,SAAW,GAAS,aAAa,QAAQ,CAAI,CAAC,CAAC,SAAS,CAAC,EAC5H,GAAI,CACF,mBAAsB,IAAI,KAC1B,mBAAsB,IAAI,KAAK,CAAA,CAAE,YAAY,EAC7C,oBAAuB,IAAI,KAAK,CAAA,CAAE,SAAS,EAAI,EAC/C,kBAAqB,IAAI,KAAK,CAAA,CAAE,QAAQ,EACxC,gBAAiB,EAAW,IAAc,EAAS,YAAY,EAAG,CAAC,EACnE,WAAY,EAAS,IAAY,EAAS,KAAK,EAAG,EAAG,KAAK,EAC1D,SAAU,EAAS,IAAc,EAAS,IAAI,EAAG,EAAG,KAAK,EACzD,YAAc,GAAY,EAAS,OAAO,EAAG,cAAc,CAC7D,EACA,GAAI,CACF,mBAAsB,EAAQ,QAAQ,EACtC,mBAAsB,EAAQ,QAAQ,CAAC,CAAC,KACxC,oBAAuB,EAAQ,QAAQ,CAAC,CAAC,MACzC,kBAAqB,EAAQ,QAAQ,CAAC,CAAC,IACvC,gBAAiB,EAAW,IAAc,EAAQ,cAAc,EAAG,CAAC,EACpE,cAAiB,EAAQ,aAAa,IAAI,EAC1C,uBAA0B,EAAQ,aAAa,IAAI,EACnD,wBAA2B,EAAQ,eAAe,IAAI,EACtD,cAAe,EAAW,EAAW,IAAc,CACjD,GAAI,CACF,OAAO,GAAK,GAAK,GAAK,EAAQ,cAAc,EAAG,CAAC,CAClD,MAAQ,CACN,MAAO,EACT,CACF,EACA,WAAY,EAAW,IAAc,EAAU,EAAG,CAAC,IAAM,EACzD,eAAgB,EAAW,IAAc,EAAU,EAAG,CAAC,EAAI,EAC3D,YAAa,EAAW,IAAc,EAAU,EAAG,CAAC,EAAI,EACxD,gBAAiB,EAAc,EAAe,EAAa,EAAY,KAAU,CAC/E,IAAM,EAAO,EAAU,EAAM,CAAK,EAC5B,EAAQ,EAAU,EAAM,CAAG,EACjC,OAAO,EAAY,GAAQ,GAAK,GAAS,EAAI,EAAO,GAAK,EAAQ,CACnE,CACF,CACF,CACF,CAEA,IAAa,GAAkB,GAAoB,EAAwB,CAAc"}