@jpahd/kalendus 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +406 -0
  3. package/custom-elements.json +4443 -0
  4. package/dist/components/Context.d.ts +9 -0
  5. package/dist/components/Context.d.ts.map +1 -0
  6. package/dist/components/Day.d.ts +11 -0
  7. package/dist/components/Day.d.ts.map +1 -0
  8. package/dist/components/Entry.d.ts +43 -0
  9. package/dist/components/Entry.d.ts.map +1 -0
  10. package/dist/components/Header.d.ts +16 -0
  11. package/dist/components/Header.d.ts.map +1 -0
  12. package/dist/components/Menu.d.ts +28 -0
  13. package/dist/components/Menu.d.ts.map +1 -0
  14. package/dist/components/Month.d.ts +21 -0
  15. package/dist/components/Month.d.ts.map +1 -0
  16. package/dist/components/Week.d.ts +36 -0
  17. package/dist/components/Week.d.ts.map +1 -0
  18. package/dist/components/Year.d.ts +20 -0
  19. package/dist/components/Year.d.ts.map +1 -0
  20. package/dist/generated/locale-codes.d.ts +14 -0
  21. package/dist/generated/locale-codes.d.ts.map +1 -0
  22. package/dist/generated/locales/ar.d.ts +33 -0
  23. package/dist/generated/locales/ar.d.ts.map +1 -0
  24. package/dist/generated/locales/bn.d.ts +33 -0
  25. package/dist/generated/locales/bn.d.ts.map +1 -0
  26. package/dist/generated/locales/de-DE.d.ts +33 -0
  27. package/dist/generated/locales/de-DE.d.ts.map +1 -0
  28. package/dist/generated/locales/de.d.ts +33 -0
  29. package/dist/generated/locales/de.d.ts.map +1 -0
  30. package/dist/generated/locales/es.d.ts +33 -0
  31. package/dist/generated/locales/es.d.ts.map +1 -0
  32. package/dist/generated/locales/fr.d.ts +33 -0
  33. package/dist/generated/locales/fr.d.ts.map +1 -0
  34. package/dist/generated/locales/hi.d.ts +33 -0
  35. package/dist/generated/locales/hi.d.ts.map +1 -0
  36. package/dist/generated/locales/id.d.ts +33 -0
  37. package/dist/generated/locales/id.d.ts.map +1 -0
  38. package/dist/generated/locales/it.d.ts +33 -0
  39. package/dist/generated/locales/it.d.ts.map +1 -0
  40. package/dist/generated/locales/ja.d.ts +33 -0
  41. package/dist/generated/locales/ja.d.ts.map +1 -0
  42. package/dist/generated/locales/ko.d.ts +33 -0
  43. package/dist/generated/locales/ko.d.ts.map +1 -0
  44. package/dist/generated/locales/nl.d.ts +33 -0
  45. package/dist/generated/locales/nl.d.ts.map +1 -0
  46. package/dist/generated/locales/pl.d.ts +33 -0
  47. package/dist/generated/locales/pl.d.ts.map +1 -0
  48. package/dist/generated/locales/pt.d.ts +33 -0
  49. package/dist/generated/locales/pt.d.ts.map +1 -0
  50. package/dist/generated/locales/ru.d.ts +33 -0
  51. package/dist/generated/locales/ru.d.ts.map +1 -0
  52. package/dist/generated/locales/th.d.ts +33 -0
  53. package/dist/generated/locales/th.d.ts.map +1 -0
  54. package/dist/generated/locales/tr.d.ts +33 -0
  55. package/dist/generated/locales/tr.d.ts.map +1 -0
  56. package/dist/generated/locales/uk.d.ts +33 -0
  57. package/dist/generated/locales/uk.d.ts.map +1 -0
  58. package/dist/generated/locales/vi.d.ts +33 -0
  59. package/dist/generated/locales/vi.d.ts.map +1 -0
  60. package/dist/generated/locales/zh-Hans.d.ts +33 -0
  61. package/dist/generated/locales/zh-Hans.d.ts.map +1 -0
  62. package/dist/kalendus.js +1806 -0
  63. package/dist/kalendus.js.map +1 -0
  64. package/dist/lib/DirectionalCalendarDateCalculator.d.ts +29 -0
  65. package/dist/lib/DirectionalCalendarDateCalculator.d.ts.map +1 -0
  66. package/dist/lib/LayoutCalculator.d.ts +47 -0
  67. package/dist/lib/LayoutCalculator.d.ts.map +1 -0
  68. package/dist/lib/SlotManager.d.ts +130 -0
  69. package/dist/lib/SlotManager.d.ts.map +1 -0
  70. package/dist/lib/ViewStateController.d.ts +22 -0
  71. package/dist/lib/ViewStateController.d.ts.map +1 -0
  72. package/dist/lib/allDayLayout.d.ts +24 -0
  73. package/dist/lib/allDayLayout.d.ts.map +1 -0
  74. package/dist/lib/catchError.d.ts +2 -0
  75. package/dist/lib/catchError.d.ts.map +1 -0
  76. package/dist/lib/getColorTextWithContrast.d.ts +8 -0
  77. package/dist/lib/getColorTextWithContrast.d.ts.map +1 -0
  78. package/dist/lib/getOverlappingEntitiesIndices.d.ts +8 -0
  79. package/dist/lib/getOverlappingEntitiesIndices.d.ts.map +1 -0
  80. package/dist/lib/getSortedGradingsByIndex.d.ts +2 -0
  81. package/dist/lib/getSortedGradingsByIndex.d.ts.map +1 -0
  82. package/dist/lib/localization.d.ts +34 -0
  83. package/dist/lib/localization.d.ts.map +1 -0
  84. package/dist/lib/messages.d.ts +4 -0
  85. package/dist/lib/messages.d.ts.map +1 -0
  86. package/dist/lib/partitionOverlappingIntervals.d.ts +6 -0
  87. package/dist/lib/partitionOverlappingIntervals.d.ts.map +1 -0
  88. package/dist/lib/weekDisplayContext.d.ts +31 -0
  89. package/dist/lib/weekDisplayContext.d.ts.map +1 -0
  90. package/dist/lib/weekStartHelper.d.ts +57 -0
  91. package/dist/lib/weekStartHelper.d.ts.map +1 -0
  92. package/dist/lms-calendar.d.ts +166 -0
  93. package/dist/lms-calendar.d.ts.map +1 -0
  94. package/package.json +118 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kalendus.js","sources":["../node_modules/.pnpm/@lit-labs+observers@2.1.0/node_modules/@lit-labs/observers/resize-controller.js","../node_modules/.pnpm/remeda@2.33.6/node_modules/remeda/dist/purry.js","../node_modules/.pnpm/remeda@2.33.6/node_modules/remeda/dist/lazyDataLastImpl-DtF3cihj.js","../node_modules/.pnpm/remeda@2.33.6/node_modules/remeda/dist/utilityEvaluators-BQqW5Ir5.js","../node_modules/.pnpm/remeda@2.33.6/node_modules/remeda/dist/pipe.js","../node_modules/.pnpm/remeda@2.33.6/node_modules/remeda/dist/purryOrderRules-4JgY6z4X.js","../node_modules/.pnpm/remeda@2.33.6/node_modules/remeda/dist/filter.js","../node_modules/.pnpm/remeda@2.33.6/node_modules/remeda/dist/groupBy.js","../node_modules/.pnpm/remeda@2.33.6/node_modules/remeda/dist/map.js","../node_modules/.pnpm/remeda@2.33.6/node_modules/remeda/dist/merge.js","../node_modules/.pnpm/remeda@2.33.6/node_modules/remeda/dist/sort.js","../node_modules/.pnpm/remeda@2.33.6/node_modules/remeda/dist/sortBy.js","../node_modules/.pnpm/ts-pattern@5.9.0/node_modules/ts-pattern/dist/index.js","../src/lib/localization.ts","../src/lib/weekStartHelper.ts","../src/components/Context.ts","../src/components/Day.ts","../src/generated/locales/ar.ts","../src/lib/messages.ts","../src/generated/locales/bn.ts","../src/generated/locales/de.ts","../src/generated/locales/de-DE.ts","../src/generated/locales/es.ts","../src/generated/locales/fr.ts","../src/generated/locales/hi.ts","../src/generated/locales/id.ts","../src/generated/locales/it.ts","../src/generated/locales/ja.ts","../src/generated/locales/ko.ts","../src/generated/locales/nl.ts","../src/generated/locales/pl.ts","../src/generated/locales/pt.ts","../src/generated/locales/ru.ts","../src/generated/locales/th.ts","../src/generated/locales/tr.ts","../src/generated/locales/uk.ts","../src/generated/locales/vi.ts","../src/generated/locales/zh-Hans.ts","../src/components/Entry.ts","../src/components/Header.ts","../node_modules/.pnpm/ts-ics@2.4.1/node_modules/ts-ics/dist/index.js","../src/components/Menu.ts","../src/lib/DirectionalCalendarDateCalculator.ts","../src/components/Month.ts","../src/components/Week.ts","../src/components/Year.ts","../src/lib/getColorTextWithContrast.ts","../src/lib/LayoutCalculator.ts","../src/lib/SlotManager.ts","../src/lib/ViewStateController.ts","../src/lib/weekDisplayContext.ts","../src/lms-calendar.ts","../src/lib/allDayLayout.ts"],"sourcesContent":["import{AsyncDirective as t}from\"lit-html/async-directive.js\";import{directive as s}from\"lit-html/directive.js\";import{isServer as i}from\"lit-html/is-server.js\";class h{constructor(t,{target:s,config:h,callback:e,skipInitial:r}){this.t=new Set,this.o=!1,this.i=!1,this.h=t,null!==s&&this.t.add(s??t),this.l=h,this.o=r??this.o,this.callback=e,i||(window.ResizeObserver?(this.u=new ResizeObserver(t=>{this.handleChanges(t),this.h.requestUpdate()}),t.addController(this)):console.warn(\"ResizeController error: browser does not support ResizeObserver.\"))}handleChanges(t){this.value=this.callback?.(t,this.u)}hostConnected(){for(const t of this.t)this.observe(t)}hostDisconnected(){this.disconnect()}async hostUpdated(){!this.o&&this.i&&this.handleChanges([]),this.i=!1}observe(t){this.t.add(t),this.u.observe(t,this.l),this.i=!0,this.h.requestUpdate()}unobserve(t){this.t.delete(t),this.u.unobserve(t)}disconnect(){this.u.disconnect()}target(t){return e(this,t)}}const e=s(class extends t{constructor(){super(...arguments),this.observing=!1}render(t,s){}update(t,[s,i]){this.controller=s,this.part=t,this.observe=i,!1===i?(s.unobserve(t.element),this.observing=!1):!1===this.observing&&(s.observe(t.element),this.observing=!0)}disconnected(){this.controller?.unobserve(this.part.element),this.observing=!1}reconnected(){!1!==this.observe&&!1===this.observing&&(this.controller?.observe(this.part.element),this.observing=!0)}});export{h as ResizeController};\n//# sourceMappingURL=resize-controller.js.map\n","import{t as e}from\"./lazyDataLastImpl-DtF3cihj.js\";function t(t,n,r){let i=t.length-n.length;if(i===0)return t(...n);if(i===1)return e(t,n,r);throw Error(`Wrong number of arguments`)}export{t as purry};\n//# sourceMappingURL=purry.js.map","function e(e,t,n){let r=n=>e(n,...t);return n===void 0?r:Object.assign(r,{lazy:n,lazyArgs:t})}export{e as t};\n//# sourceMappingURL=lazyDataLastImpl-DtF3cihj.js.map","const e={done:!0,hasNext:!1},t={done:!1,hasNext:!1},n=()=>e,r=e=>({hasNext:!0,next:e,done:!1});export{n,r,t};\n//# sourceMappingURL=utilityEvaluators-BQqW5Ir5.js.map","import{t as e}from\"./utilityEvaluators-BQqW5Ir5.js\";function t(e,...t){let a=e,o=t.map(e=>`lazy`in e?r(e):void 0),s=0;for(;s<t.length;){if(o[s]===void 0||!i(a)){let e=t[s];a=e(a),s+=1;continue}let e=[];for(let n=s;n<t.length;n++){let t=o[n];if(t===void 0||(e.push(t),t.isSingle))break}let r=[];for(let t of a)if(n(t,r,e))break;let{isSingle:c}=e.at(-1);a=c?r[0]:r,s+=e.length}return a}function n(t,r,i){if(i.length===0)return r.push(t),!1;let a=t,o=e,s=!1;for(let[e,t]of i.entries()){let{index:c,items:l}=t;if(l.push(a),o=t(a,c,l),t.index+=1,o.hasNext){if(o.hasMany??!1){for(let t of o.next)if(n(t,r,i.slice(e+1)))return!0;return s}a=o.next}if(!o.hasNext)break;o.done&&(s=!0)}return o.hasNext&&r.push(a),s}function r(e){let{lazy:t,lazyArgs:n}=e,r=t(...n);return Object.assign(r,{isSingle:t.single??!1,index:0,items:[]})}function i(e){return typeof e==`string`||typeof e==`object`&&!!e&&Symbol.iterator in e}export{t as pipe};\n//# sourceMappingURL=pipe.js.map","const e={asc:(e,t)=>e>t,desc:(e,t)=>e<t};function t(e,t){let[n,...a]=t;if(!i(n))return e(n,r(...a));let o=r(n,...a);return t=>e(t,o)}function n(e,[n,r,...a]){let o,s;return i(r)?(o=n,s=[r,...a]):(o=r,s=[n,...a]),t((...t)=>e(...t,o),s)}function r(t,n,...i){let a=typeof t==`function`?t:t[0],o=typeof t==`function`?`asc`:t[1],{[o]:s}=e,c=n===void 0?void 0:r(n,...i);return(e,t)=>{let n=a(e),r=a(t);return s(n,r)?1:s(r,n)?-1:c?.(e,t)??0}}function i(t){if(a(t))return!0;if(typeof t!=`object`||!Array.isArray(t))return!1;let[n,r,...i]=t;return a(n)&&typeof r==`string`&&r in e&&i.length===0}const a=e=>typeof e==`function`&&e.length===1;export{n,t};\n//# sourceMappingURL=purryOrderRules-4JgY6z4X.js.map","import{purry as e}from\"./purry.js\";import{t}from\"./utilityEvaluators-BQqW5Ir5.js\";function n(...t){return e(r,t,i)}const r=(e,t)=>e.filter(t),i=e=>(n,r,i)=>e(n,r,i)?{done:!1,hasNext:!0,next:n}:t;export{n as filter};\n//# sourceMappingURL=filter.js.map","import{purry as e}from\"./purry.js\";function t(...t){return e(n,t)}const n=(e,t)=>{let n=Object.create(null);for(let r=0;r<e.length;r++){let i=e[r],a=t(i,r,e);if(a!==void 0){let e=n[a];e===void 0?n[a]=[i]:e.push(i)}}return Object.setPrototypeOf(n,Object.prototype),n};export{t as groupBy};\n//# sourceMappingURL=groupBy.js.map","import{purry as e}from\"./purry.js\";function t(...t){return e(n,t,r)}const n=(e,t)=>e.map(t),r=e=>(t,n,r)=>({done:!1,hasNext:!0,next:e(t,n,r)});export{t as map};\n//# sourceMappingURL=map.js.map","import{purry as e}from\"./purry.js\";function t(...t){return e(n,t)}const n=(e,t)=>({...e,...t});export{t as merge};\n//# sourceMappingURL=merge.js.map","import{purry as e}from\"./purry.js\";function t(...t){return e(n,t)}function n(e,t){let n=[...e];return n.sort(t),n}export{t as sort};\n//# sourceMappingURL=sort.js.map","import{t as e}from\"./purryOrderRules-4JgY6z4X.js\";function t(...t){return e(n,t)}const n=(e,t)=>[...e].sort(t);export{t as sortBy};\n//# sourceMappingURL=sortBy.js.map","const t=Symbol.for(\"@ts-pattern/matcher\"),e=Symbol.for(\"@ts-pattern/isVariadic\"),n=\"@ts-pattern/anonymous-select-key\",r=t=>Boolean(t&&\"object\"==typeof t),i=e=>e&&!!e[t],o=(n,s,c)=>{if(i(n)){const e=n[t](),{matched:r,selections:i}=e.match(s);return r&&i&&Object.keys(i).forEach(t=>c(t,i[t])),r}if(r(n)){if(!r(s))return!1;if(Array.isArray(n)){if(!Array.isArray(s))return!1;let t=[],r=[],u=[];for(const o of n.keys()){const s=n[o];i(s)&&s[e]?u.push(s):u.length?r.push(s):t.push(s)}if(u.length){if(u.length>1)throw new Error(\"Pattern error: Using `...P.array(...)` several times in a single pattern is not allowed.\");if(s.length<t.length+r.length)return!1;const e=s.slice(0,t.length),n=0===r.length?[]:s.slice(-r.length),i=s.slice(t.length,0===r.length?Infinity:-r.length);return t.every((t,n)=>o(t,e[n],c))&&r.every((t,e)=>o(t,n[e],c))&&(0===u.length||o(u[0],i,c))}return n.length===s.length&&n.every((t,e)=>o(t,s[e],c))}return Reflect.ownKeys(n).every(e=>{const r=n[e];return(e in s||i(u=r)&&\"optional\"===u[t]().matcherType)&&o(r,s[e],c);var u})}return Object.is(s,n)},s=e=>{var n,o,u;return r(e)?i(e)?null!=(n=null==(o=(u=e[t]()).getSelectionKeys)?void 0:o.call(u))?n:[]:Array.isArray(e)?c(e,s):c(Object.values(e),s):[]},c=(t,e)=>t.reduce((t,n)=>t.concat(e(n)),[]);function u(...t){if(1===t.length){const[e]=t;return t=>o(e,t,()=>{})}if(2===t.length){const[e,n]=t;return o(e,n,()=>{})}throw new Error(`isMatching wasn't given the right number of arguments: expected 1 or 2, received ${t.length}.`)}function a(t){return Object.assign(t,{optional:()=>h(t),and:e=>d(t,e),or:e=>y(t,e),select:e=>void 0===e?v(t):v(e,t)})}function l(t){return Object.assign((t=>Object.assign(t,{[Symbol.iterator](){let n=0;const r=[{value:Object.assign(t,{[e]:!0}),done:!1},{done:!0,value:void 0}];return{next:()=>{var t;return null!=(t=r[n++])?t:r.at(-1)}}}}))(t),{optional:()=>l(h(t)),select:e=>l(void 0===e?v(t):v(e,t))})}function h(e){return a({[t]:()=>({match:t=>{let n={};const r=(t,e)=>{n[t]=e};return void 0===t?(s(e).forEach(t=>r(t,void 0)),{matched:!0,selections:n}):{matched:o(e,t,r),selections:n}},getSelectionKeys:()=>s(e),matcherType:\"optional\"})})}const f=(t,e)=>{for(const n of t)if(!e(n))return!1;return!0},g=(t,e)=>{for(const[n,r]of t.entries())if(!e(r,n))return!1;return!0},m=(t,e)=>{const n=Reflect.ownKeys(t);for(const r of n)if(!e(r,t[r]))return!1;return!0};function d(...e){return a({[t]:()=>({match:t=>{let n={};const r=(t,e)=>{n[t]=e};return{matched:e.every(e=>o(e,t,r)),selections:n}},getSelectionKeys:()=>c(e,s),matcherType:\"and\"})})}function y(...e){return a({[t]:()=>({match:t=>{let n={};const r=(t,e)=>{n[t]=e};return c(e,s).forEach(t=>r(t,void 0)),{matched:e.some(e=>o(e,t,r)),selections:n}},getSelectionKeys:()=>c(e,s),matcherType:\"or\"})})}function p(e){return{[t]:()=>({match:t=>({matched:Boolean(e(t))})})}}function v(...e){const r=\"string\"==typeof e[0]?e[0]:void 0,i=2===e.length?e[1]:\"string\"==typeof e[0]?void 0:e[0];return a({[t]:()=>({match:t=>{let e={[null!=r?r:n]:t};return{matched:void 0===i||o(i,t,(t,n)=>{e[t]=n}),selections:e}},getSelectionKeys:()=>[null!=r?r:n].concat(void 0===i?[]:s(i))})})}function b(t){return!0}function w(t){return\"number\"==typeof t}function S(t){return\"string\"==typeof t}function j(t){return\"bigint\"==typeof t}const K=a(p(b)),O=a(p(b)),E=K,x=t=>Object.assign(a(t),{startsWith:e=>{return x(d(t,(n=e,p(t=>S(t)&&t.startsWith(n)))));var n},endsWith:e=>{return x(d(t,(n=e,p(t=>S(t)&&t.endsWith(n)))));var n},minLength:e=>x(d(t,(t=>p(e=>S(e)&&e.length>=t))(e))),length:e=>x(d(t,(t=>p(e=>S(e)&&e.length===t))(e))),maxLength:e=>x(d(t,(t=>p(e=>S(e)&&e.length<=t))(e))),includes:e=>{return x(d(t,(n=e,p(t=>S(t)&&t.includes(n)))));var n},regex:e=>{return x(d(t,(n=e,p(t=>S(t)&&Boolean(t.match(n))))));var n}}),A=x(p(S)),N=t=>Object.assign(a(t),{between:(e,n)=>N(d(t,((t,e)=>p(n=>w(n)&&t<=n&&e>=n))(e,n))),lt:e=>N(d(t,(t=>p(e=>w(e)&&e<t))(e))),gt:e=>N(d(t,(t=>p(e=>w(e)&&e>t))(e))),lte:e=>N(d(t,(t=>p(e=>w(e)&&e<=t))(e))),gte:e=>N(d(t,(t=>p(e=>w(e)&&e>=t))(e))),int:()=>N(d(t,p(t=>w(t)&&Number.isInteger(t)))),finite:()=>N(d(t,p(t=>w(t)&&Number.isFinite(t)))),positive:()=>N(d(t,p(t=>w(t)&&t>0))),negative:()=>N(d(t,p(t=>w(t)&&t<0)))}),P=N(p(w)),k=t=>Object.assign(a(t),{between:(e,n)=>k(d(t,((t,e)=>p(n=>j(n)&&t<=n&&e>=n))(e,n))),lt:e=>k(d(t,(t=>p(e=>j(e)&&e<t))(e))),gt:e=>k(d(t,(t=>p(e=>j(e)&&e>t))(e))),lte:e=>k(d(t,(t=>p(e=>j(e)&&e<=t))(e))),gte:e=>k(d(t,(t=>p(e=>j(e)&&e>=t))(e))),positive:()=>k(d(t,p(t=>j(t)&&t>0))),negative:()=>k(d(t,p(t=>j(t)&&t<0)))}),T=k(p(j)),B=a(p(function(t){return\"boolean\"==typeof t})),_=a(p(function(t){return\"symbol\"==typeof t})),W=a(p(function(t){return null==t})),$=a(p(function(t){return null!=t}));var z={__proto__:null,matcher:t,optional:h,array:function(...e){return l({[t]:()=>({match:t=>{if(!Array.isArray(t))return{matched:!1};if(0===e.length)return{matched:!0};const n=e[0];let r={};if(0===t.length)return s(n).forEach(t=>{r[t]=[]}),{matched:!0,selections:r};const i=(t,e)=>{r[t]=(r[t]||[]).concat([e])};return{matched:t.every(t=>o(n,t,i)),selections:r}},getSelectionKeys:()=>0===e.length?[]:s(e[0])})})},set:function(...e){return a({[t]:()=>({match:t=>{if(!(t instanceof Set))return{matched:!1};let n={};if(0===t.size)return{matched:!0,selections:n};if(0===e.length)return{matched:!0};const r=(t,e)=>{n[t]=(n[t]||[]).concat([e])},i=e[0];return{matched:f(t,t=>o(i,t,r)),selections:n}},getSelectionKeys:()=>0===e.length?[]:s(e[0])})})},map:function(...e){return a({[t]:()=>({match:t=>{if(!(t instanceof Map))return{matched:!1};let n={};if(0===t.size)return{matched:!0,selections:n};const r=(t,e)=>{n[t]=(n[t]||[]).concat([e])};if(0===e.length)return{matched:!0};var i;if(1===e.length)throw new Error(`\\`P.map\\` wasn't given enough arguments. Expected (key, value), received ${null==(i=e[0])?void 0:i.toString()}`);const[s,c]=e;return{matched:g(t,(t,e)=>{const n=o(s,e,r),i=o(c,t,r);return n&&i}),selections:n}},getSelectionKeys:()=>0===e.length?[]:[...s(e[0]),...s(e[1])]})})},record:function(...e){return a({[t]:()=>({match:t=>{if(null===t||\"object\"!=typeof t||Array.isArray(t))return{matched:!1};var n;if(0===e.length)throw new Error(`\\`P.record\\` wasn't given enough arguments. Expected (value) or (key, value), received ${null==(n=e[0])?void 0:n.toString()}`);let r={};const i=(t,e)=>{r[t]=(r[t]||[]).concat([e])},[s,c]=1===e.length?[A,e[0]]:e;return{matched:m(t,(t,e)=>{const n=\"string\"!=typeof t||Number.isNaN(Number(t))?null:Number(t),r=null!==n&&o(s,n,i),u=o(s,t,i),a=o(c,e,i);return(u||r)&&a}),selections:r}},getSelectionKeys:()=>0===e.length?[]:[...s(e[0]),...s(e[1])]})})},intersection:d,union:y,not:function(e){return a({[t]:()=>({match:t=>({matched:!o(e,t,()=>{})}),getSelectionKeys:()=>[],matcherType:\"not\"})})},when:p,select:v,any:K,unknown:O,_:E,string:A,number:P,bigint:T,boolean:B,symbol:_,nullish:W,nonNullable:$,instanceOf:function(t){return a(p(function(t){return e=>e instanceof t}(t)))},shape:function(t){return a(p(u(t)))}};class I extends Error{constructor(t){let e;try{e=JSON.stringify(t)}catch(n){e=t}super(`Pattern matching error: no pattern matches value ${e}`),this.input=void 0,this.input=t}}const L={matched:!1,value:void 0};function M(t){return new R(t,L)}class R{constructor(t,e){this.input=void 0,this.state=void 0,this.input=t,this.state=e}with(...t){if(this.state.matched)return this;const e=t[t.length-1],r=[t[0]];let i;3===t.length&&\"function\"==typeof t[1]?i=t[1]:t.length>2&&r.push(...t.slice(1,t.length-1));let s=!1,c={};const u=(t,e)=>{s=!0,c[t]=e},a=!r.some(t=>o(t,this.input,u))||i&&!Boolean(i(this.input))?L:{matched:!0,value:e(s?n in c?c[n]:c:this.input,this.input)};return new R(this.input,a)}when(t,e){if(this.state.matched)return this;const n=Boolean(t(this.input));return new R(this.input,n?{matched:!0,value:e(this.input,this.input)}:L)}otherwise(t){return this.state.matched?this.state.value:t(this.input)}exhaustive(t=F){return this.state.matched?this.state.value:t(this.input)}run(){return this.exhaustive()}returnType(){return this}narrow(){return this}}function F(t){throw new I(t)}export{I as NonExhaustiveError,z as P,z as Pattern,u as isMatching,M as match};\n//# sourceMappingURL=index.js.map\n","import { DateTime } from 'luxon';\n\n/**\n * Map lit-localize locale codes to Intl/Luxon-compatible BCP47 tags.\n * Some of our locale codes (e.g., `zh-Hans`) use Unicode script subtags\n * that Luxon/Intl may not handle correctly — they need proper region tags.\n */\nconst LUXON_LOCALE_MAP: Record<string, string> = {\n 'zh-Hans': 'zh-CN',\n 'zh-Hant': 'zh-TW',\n};\n\n/**\n * Resolve a locale tag to a Luxon/Intl-compatible BCP47 tag.\n */\nfunction resolveLuxonLocale(locale: string): string {\n return LUXON_LOCALE_MAP[locale] || locale;\n}\n\n// ── Cached month names (12-element array per locale) ─────────────────\nconst _monthCache = new Map<string, readonly string[]>();\n\nfunction getMonthNames(locale: string): readonly string[] {\n const key = resolveLuxonLocale(locale);\n let arr = _monthCache.get(key);\n if (!arr) {\n arr = Object.freeze(\n Array.from({ length: 12 }, (_, i) =>\n DateTime.local()\n .set({ month: (i + 1) as 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 })\n .setLocale(key)\n .toFormat('MMM'),\n ),\n );\n _monthCache.set(key, arr);\n }\n return arr;\n}\n\n// ── Cached weekday names (7-element array per locale) ────────────────\nconst _weekdayCache = new Map<string, readonly string[]>();\n\nfunction getWeekdayNames(locale: string): readonly string[] {\n const key = resolveLuxonLocale(locale);\n let arr = _weekdayCache.get(key);\n if (!arr) {\n arr = Object.freeze(\n Array.from({ length: 7 }, (_, i) =>\n DateTime.local()\n .set({ weekday: (i + 1) as 1 | 2 | 3 | 4 | 5 | 6 | 7 })\n .setLocale(key)\n .toFormat('ccc'),\n ),\n );\n _weekdayCache.set(key, arr);\n }\n return arr;\n}\n\n// ── Cached Intl.DateTimeFormat for day+month ─────────────────────────\nconst _dayMonthFmtCache = new Map<string, Intl.DateTimeFormat>();\n\nfunction getDayMonthFormatter(locale: string): Intl.DateTimeFormat {\n const key = resolveLuxonLocale(locale);\n let fmt = _dayMonthFmtCache.get(key);\n if (!fmt) {\n fmt = new Intl.DateTimeFormat(key, { day: 'numeric', month: 'short' });\n _dayMonthFmtCache.set(key, fmt);\n }\n return fmt;\n}\n\n/**\n * Format a DateTime with the given locale\n */\nexport function formatDateTime(dateTime: DateTime, format: string, locale = 'en'): string {\n return dateTime.setLocale(resolveLuxonLocale(locale)).toFormat(format);\n}\n\n/**\n * Get localized month name (abbreviated)\n */\nexport function getLocalizedMonth(month: number, locale = 'en'): string {\n return getMonthNames(locale)[month - 1];\n}\n\n/**\n * Format day + abbreviated month using the locale's natural ordering.\n * e.g., \"1. Feb.\" (de), \"1 feb\" (es), \"2月1日\" (zh/ja)\n */\nexport function getLocalizedDayMonth(day: number, month: number, year: number, locale = 'en'): string {\n const date = new Date(year, month - 1, day);\n return getDayMonthFormatter(locale).format(date);\n}\n\n/**\n * Get localized weekday name (abbreviated for calendar headers)\n */\nexport function getLocalizedWeekdayShort(weekday: number, locale = 'en'): string {\n return getWeekdayNames(locale)[weekday - 1];\n}\n\n// ── Cached Intl.DateTimeFormat for time (hour+minute) ───────────────\nconst _timeFmtCache = new Map<string, Intl.DateTimeFormat>();\n\nfunction getTimeFormatter(locale: string): Intl.DateTimeFormat {\n const key = resolveLuxonLocale(locale);\n let fmt = _timeFmtCache.get(key);\n if (!fmt) {\n fmt = new Intl.DateTimeFormat(key, { hour: 'numeric', minute: '2-digit' });\n _timeFmtCache.set(key, fmt);\n }\n return fmt;\n}\n\n/**\n * Format a time (hour + minute) using the locale's preferred notation.\n * e.g., \"3:30 PM\" (en), \"15:30\" (de), \"下午3:30\" (zh-CN)\n */\nexport function formatLocalizedTime(hour: number, minute: number, locale = 'en'): string {\n const d = new Date(2000, 0, 1, hour, minute);\n return getTimeFormatter(locale).format(d);\n}\n\n/**\n * Format a time range with an en-dash separator.\n * e.g., \"9:00 AM – 5:00 PM\" (en), \"09:00 – 17:00\" (de)\n */\nexport function formatLocalizedTimeRange(\n startHour: number,\n startMinute: number,\n endHour: number,\n endMinute: number,\n locale = 'en',\n): string {\n const start = formatLocalizedTime(startHour, startMinute, locale);\n const end = formatLocalizedTime(endHour, endMinute, locale);\n return `${start} \\u2013 ${end}`;\n}\n\n/**\n * Format a full date (day + month + year) using the locale's natural ordering.\n * e.g., \"Feb 1, 2026\" (en), \"1. Feb. 2026\" (de), \"2026年2月1日\" (ja)\n */\nexport function formatLocalizedDate(\n day: number,\n month: number,\n year: number,\n locale = 'en',\n): string {\n const key = resolveLuxonLocale(locale);\n const d = new Date(year, month - 1, day);\n return new Intl.DateTimeFormat(key, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n }).format(d);\n}\n","/**\n * Week-start helpers — centralizes the \"first day of week\" offset math\n * that was previously duplicated across lms-calendar.ts, Week.ts, Month.ts,\n * and SlotManager.ts.\n *\n * All functions are pure and dependency-free (only JS Date + CalendarDate).\n */\n\n/**\n * Supported first-day-of-week values (JS Date convention).\n * 0 = Sunday, 1 = Monday (ISO 8601 default), 6 = Saturday\n */\nexport type FirstDayOfWeek = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n/**\n * How many days to subtract from `jsDayOfWeek` to reach `firstDay`.\n *\n * JS Date.getDay(): 0 = Sun, 1 = Mon, ..., 6 = Sat\n *\n * @example getWeekStartOffset(0, 1) // Sunday when Monday-first → 6\n * @example getWeekStartOffset(1, 1) // Monday when Monday-first → 0\n * @example getWeekStartOffset(0, 0) // Sunday when Sunday-first → 0\n */\nexport function getWeekStartOffset(jsDayOfWeek: number, firstDay: FirstDayOfWeek): number {\n return ((jsDayOfWeek - firstDay) % 7 + 7) % 7;\n}\n\n/**\n * Return the 7 CalendarDate values of the week containing `activeDate`,\n * starting from `firstDay`.\n */\nexport function getWeekDates(activeDate: CalendarDate, firstDay: FirstDayOfWeek): CalendarDate[] {\n const current = new Date(activeDate.year, activeDate.month - 1, activeDate.day);\n const offset = getWeekStartOffset(current.getDay(), firstDay);\n const weekStart = new Date(current);\n weekStart.setDate(current.getDate() - offset);\n\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(weekStart);\n d.setDate(weekStart.getDate() + i);\n return { day: d.getDate(), month: d.getMonth() + 1, year: d.getFullYear() };\n });\n}\n\n/**\n * Column offset for the 1st of a month in a week-start-aware grid.\n *\n * @example getFirstDayOffset({ year: 2026, month: 1, day: 1 }, 1) // Thu → 3\n * @example getFirstDayOffset({ year: 2026, month: 1, day: 1 }, 0) // Thu → 4\n */\nexport function getFirstDayOffset(date: CalendarDate, firstDay: FirstDayOfWeek): number {\n const jsDay = new Date(date.year, date.month - 1, 1).getDay();\n return getWeekStartOffset(jsDay, firstDay);\n}\n\n/**\n * Map Luxon weekday numbers to display order for a given firstDay.\n * Returns an array of 7 Luxon weekday numbers (1 = Mon ... 7 = Sun).\n *\n * @example getWeekdayOrder(1) // Monday-first → [1, 2, 3, 4, 5, 6, 7]\n * @example getWeekdayOrder(0) // Sunday-first → [7, 1, 2, 3, 4, 5, 6]\n */\nexport function getWeekdayOrder(firstDay: FirstDayOfWeek): number[] {\n // Luxon: 1 = Mon, 2 = Tue, ..., 7 = Sun\n // JS: 0 = Sun, 1 = Mon, ..., 6 = Sat\n const luxonFirst = firstDay === 0 ? 7 : firstDay;\n return Array.from({ length: 7 }, (_, i) => ((luxonFirst - 1 + i) % 7) + 1);\n}\n\n/**\n * CLDR-derived mapping of locale tags to conventional first day of week.\n *\n * Sources:\n * - Unicode CLDR supplemental/weekData\n * - Intl.Locale.prototype.getWeekInfo() (where available)\n *\n * Covers language-only codes and region-specific overrides.\n */\nconst LOCALE_WEEK_START: Record<string, FirstDayOfWeek> = {\n // Sunday-first (0)\n en: 0, 'en-US': 0, 'en-CA': 0, 'en-AU': 0, 'en-NZ': 0,\n ja: 0, 'ja-JP': 0,\n ko: 0, 'ko-KR': 0,\n zh: 0, 'zh-CN': 0, 'zh-TW': 0, 'zh-Hans': 0, 'zh-Hant': 0,\n pt: 0, 'pt-BR': 0,\n he: 0, 'he-IL': 0,\n hi: 0, 'hi-IN': 0,\n bn: 0, 'bn-BD': 0, 'bn-IN': 0,\n id: 0, 'id-ID': 0,\n th: 0, 'th-TH': 0,\n\n // Monday-first (1) — ISO 8601 default for most of Europe, Africa, etc.\n de: 1, 'de-DE': 1, 'de-AT': 1, 'de-CH': 1,\n fr: 1, 'fr-FR': 1, 'fr-CA': 1,\n es: 1, 'es-ES': 1, 'es-MX': 1, 'es-AR': 1,\n it: 1, 'it-IT': 1,\n nl: 1, 'nl-NL': 1,\n pl: 1, 'pl-PL': 1,\n ru: 1, 'ru-RU': 1,\n uk: 1, 'uk-UA': 1,\n sv: 1, 'sv-SE': 1,\n da: 1, 'da-DK': 1,\n nb: 1, 'nb-NO': 1,\n fi: 1, 'fi-FI': 1,\n cs: 1, 'cs-CZ': 1,\n tr: 1, 'tr-TR': 1,\n vi: 1, 'vi-VN': 1,\n 'pt-PT': 1, // Portugal uses Monday (unlike Brazil)\n 'en-GB': 1, // UK uses Monday\n\n // Saturday-first (6)\n ar: 6, 'ar-SA': 6, 'ar-AE': 6, 'ar-EG': 6,\n fa: 6, 'fa-IR': 6,\n};\n\n/**\n * Look up the conventional first day of week for a given locale tag.\n *\n * Resolution order:\n * 1. Exact match (e.g., \"en-US\")\n * 2. Language-only fallback (e.g., \"en\")\n * 3. Default to Monday (ISO 8601)\n *\n * @example getFirstDayForLocale('en-US') // 0 (Sunday)\n * @example getFirstDayForLocale('de') // 1 (Monday)\n * @example getFirstDayForLocale('ar') // 6 (Saturday)\n * @example getFirstDayForLocale('xx') // 1 (Monday, default)\n */\nexport function getFirstDayForLocale(locale: string): FirstDayOfWeek {\n // Try exact match first\n if (locale in LOCALE_WEEK_START) {\n return LOCALE_WEEK_START[locale];\n }\n\n // Try language-only fallback (strip region)\n const lang = locale.split('-')[0];\n if (lang in LOCALE_WEEK_START) {\n return LOCALE_WEEK_START[lang];\n }\n\n // ISO 8601 default\n return 1;\n}\n","import { LitElement, css, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { getLocalizedWeekdayShort } from '../lib/localization.js';\nimport { type FirstDayOfWeek, getWeekdayOrder } from '../lib/weekStartHelper.js';\n\n@customElement('lms-calendar-context')\nexport default class Context extends LitElement {\n @property({ type: Number })\n firstDayOfWeek: FirstDayOfWeek = 1;\n\n @property({ type: String })\n locale = 'en';\n\n static override styles = css`\n :host {\n display: block;\n flex-shrink: 0;\n }\n\n div {\n height: var(--context-height, 1.75em);\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n }\n span {\n /* Match the month indicator's margin (0.25em) + padding (0.25em) */\n padding: var(--context-padding, 0.25em) var(--context-padding-inline, 0.5em);\n text-align: var(--context-text-align, left);\n }\n `;\n\n override render() {\n const order = getWeekdayOrder(this.firstDayOfWeek);\n return html` <div>\n ${order.map((luxonDay) => html`<span>${getLocalizedWeekdayShort(luxonDay, this.locale)}</span>`)}\n </div>`;\n }\n}\n","import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\n\nimport { formatLocalizedTime } from '../lib/localization.js';\n\n@customElement('lms-calendar-day')\nexport default class Day extends LitElement {\n @state()\n _hours = [...Array(25).keys()];\n\n @state()\n _hasActiveSidebar = false;\n\n @property({ type: Number })\n allDayRowCount = 0;\n\n @property({ type: String })\n locale = 'en';\n\n static override styles = css`\n :host {\n display: block;\n height: 100%;\n width: 100%;\n }\n\n .wrapper {\n display: flex;\n flex-direction: column;\n height: var(--view-container-height);\n width: 100%;\n overflow: hidden;\n }\n\n .container {\n display: flex;\n flex: 1;\n width: 100%;\n }\n\n .main {\n display: grid;\n grid-template-columns: var(--day-grid-columns, var(--calendar-grid-columns-day));\n grid-template-rows: 1fr;\n height: var(--main-content-height);\n gap: var(--day-gap, 1px);\n overflow-y: scroll;\n text-align: var(--day-text-align, center);\n padding: var(--day-padding, 0.5em);\n position: relative;\n contain: content;\n }\n\n .time-labels {\n grid-column: 1;\n position: relative;\n height: var(--day-total-height);\n display: var(--day-show-time-column, block);\n border-right: var(--sidebar-border, 1px solid var(--separator-light));\n }\n\n .hour-label {\n position: absolute;\n left: 0;\n right: 0;\n text-align: var(--hour-text-align, center);\n font-size: var(--hour-indicator-font-size);\n color: var(--hour-indicator-color);\n }\n\n .hour-label .indicator {\n position: relative;\n top: var(--indicator-top, -0.6em);\n }\n\n .timed-content {\n grid-column: 2;\n position: relative;\n height: var(--day-total-height);\n background-image: repeating-linear-gradient(\n to bottom,\n transparent 0,\n transparent calc(var(--hour-height) - 1px),\n var(--separator-light) calc(var(--hour-height) - 1px),\n var(--separator-light) var(--hour-height)\n );\n background-size: 100% var(--hour-height);\n }\n\n .sidebar {\n height: 100%;\n border-left: var(--sidebar-border, 1px solid var(--separator-light));\n }\n\n .w-100 {\n width: 100%;\n }\n\n .w-70 {\n width: 70%;\n }\n\n .w-30 {\n width: 30%;\n }\n\n .w-0 {\n width: 0;\n }\n\n .all-day-wrapper {\n display: grid;\n grid-template-rows: 1fr;\n border-bottom: 1px solid var(--separator-light, rgba(0, 0, 0, 0.1));\n /* Isolate repaint from the hour-grid scroller beneath */\n contain: paint;\n }\n\n .all-day {\n font-size: var(--day-all-day-font-size, 16px);\n margin: var(--day-all-day-margin, 0 1.25em 0 4.25em);\n overflow: hidden;\n min-height: 0;\n padding: 0.5em 0;\n }\n `;\n\n private _renderIndicatorValue(hour: number) {\n return formatLocalizedTime(hour, 0, this.locale);\n }\n\n override render() {\n const hasAllDay = this.allDayRowCount > 0;\n const containerHeight = hasAllDay\n ? `calc(100% - 3.5em - ${this.allDayRowCount * 24}px)`\n : '100%';\n\n return html` <div class=\"wrapper\">\n ${\n hasAllDay\n ? html`\n <div class=\"all-day-wrapper\">\n <div class=\"all-day\">\n <slot name=\"all-day\" id=\"all-day\" class=\"entry\"></slot>\n </div>\n </div>\n `\n : nothing\n }\n <div class=\"container\" style=\"height: ${containerHeight}\">\n <div\n class=\"main ${classMap({\n 'w-100': !this._hasActiveSidebar,\n 'w-70': this._hasActiveSidebar,\n })}\"\n >\n <div class=\"time-labels\">\n ${this._hours.map(\n (hour) => html`\n <div\n class=\"hour-label\"\n style=\"top: calc(${hour} * var(--hour-height))\"\n >\n <span class=\"indicator\">\n ${this._renderIndicatorValue(hour)}\n </span>\n </div>\n `,\n )}\n </div>\n <div class=\"timed-content\">\n <slot name=\"timed\"></slot>\n </div>\n </div>\n <div\n class=\"sidebar w-30\"\n ?hidden=${!this._hasActiveSidebar}\n ></div>\n </div>\n </div>`;\n }\n}\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `ملاحظات`,\n s090f2107b5a69a7f: `أ`,\n s15ba5784a11e0b88: `الشهر الحالي`,\n s22380c7fc798a44f: `بدون محتوى`,\n s2bc4d1196bce49dc: `تصدير كملف ICS`,\n s3c44e22d1af5693e: `سنة`,\n s48e186fb300e5464: `الوقت`,\n s58ab939b42a026a6: `طوال اليوم`,\n s5e8250fb85d64c23: `إغلاق`,\n s63d040e37887f17e: `اليوم`,\n s680f01021b5e339d: `أسبوع`,\n s98b32ef4a0856c08: `بدون عنوان`,\n s99f110d27e30b289: `العنوان`,\n sa0fd990c985f24bd: `تفاصيل الحدث`,\n sac8252732f2edb19: `التاريخ`,\n sb47daaf9e1c4a905: `شهر`,\n se0955919920ee87d: `يوم`,\n sfce4bfbe0f911aa7: `بدون وقت`,\n sa1b2c3d4e5f60001: `السابق`,\n sa1b2c3d4e5f60002: `التالي`,\n sa1b2c3d4e5f60003: `أحداث`,\n sa1b2c3d4e5f60004: `حدث تقويمي`,\n sa1b2c3d4e5f60005: `اضغط Enter أو Space لفتح التفاصيل`,\n sa1b2c3d4e5f60006: `إلى`,\n sa1b2c3d4e5f60007: `التبديل إلى عرض اليوم لـ`,\n sa1b2c3d4e5f60008: `عرض الأيام السابقة`,\n sa1b2c3d4e5f60009: `عرض الأيام التالية`,\n sa1b2c3d4e5f60010: `المزيد`,\n sa1b2c3d4e5f60011: `عرض التقويم`,\n sa1b2c3d4e5f60012: `عرض`,\n};\n","import { targetLocales } from '../generated/locale-codes.js';\nimport { templates as arTemplates } from '../generated/locales/ar.js';\nimport { templates as bnTemplates } from '../generated/locales/bn.js';\nimport { templates as deTemplates } from '../generated/locales/de.js';\nimport { templates as deDETemplates } from '../generated/locales/de-DE.js';\nimport { templates as esTemplates } from '../generated/locales/es.js';\nimport { templates as frTemplates } from '../generated/locales/fr.js';\nimport { templates as hiTemplates } from '../generated/locales/hi.js';\nimport { templates as idTemplates } from '../generated/locales/id.js';\nimport { templates as itTemplates } from '../generated/locales/it.js';\nimport { templates as jaTemplates } from '../generated/locales/ja.js';\nimport { templates as koTemplates } from '../generated/locales/ko.js';\nimport { templates as nlTemplates } from '../generated/locales/nl.js';\nimport { templates as plTemplates } from '../generated/locales/pl.js';\nimport { templates as ptTemplates } from '../generated/locales/pt.js';\nimport { templates as ruTemplates } from '../generated/locales/ru.js';\nimport { templates as thTemplates } from '../generated/locales/th.js';\nimport { templates as trTemplates } from '../generated/locales/tr.js';\nimport { templates as ukTemplates } from '../generated/locales/uk.js';\nimport { templates as viTemplates } from '../generated/locales/vi.js';\nimport { templates as zhHansTemplates } from '../generated/locales/zh-Hans.js';\n\nconst allTemplates: Record<string, Record<string, string>> = {\n ar: arTemplates,\n bn: bnTemplates,\n de: deTemplates,\n 'de-DE': deDETemplates,\n es: esTemplates,\n fr: frTemplates,\n hi: hiTemplates,\n id: idTemplates,\n it: itTemplates,\n ja: jaTemplates,\n ko: koTemplates,\n nl: nlTemplates,\n pl: plTemplates,\n pt: ptTemplates,\n ru: ruTemplates,\n th: thTemplates,\n tr: trTemplates,\n uk: ukTemplates,\n vi: viTemplates,\n 'zh-Hans': zhHansTemplates,\n};\n\n// Typed message keys — compile-time safety for hash IDs\nexport type MessageKey =\n | 'day'\n | 'week'\n | 'month'\n | 'currentMonth'\n | 'allDay'\n | 'today'\n | 'noTitle'\n | 'noContent'\n | 'noTime'\n | 'eventDetails'\n | 'exportAsICS'\n | 'title'\n | 'time'\n | 'date'\n | 'notes'\n | 'close'\n | 'calendarWeek'\n | 'year'\n | 'previous'\n | 'next'\n | 'events'\n | 'calendarEvent'\n | 'pressToOpen'\n | 'to'\n | 'switchToDayView'\n | 'showEarlierDays'\n | 'showLaterDays'\n | 'more'\n | 'calendarView'\n | 'viewLabel';\n\nexport type ResolvedMessages = Readonly<Record<MessageKey, string>>;\n\n// Single source of truth: key ↔ hash ↔ fallback\nconst MESSAGE_DEFS: ReadonlyArray<readonly [MessageKey, string, string]> = [\n ['day', 'se0955919920ee87d', 'Day'],\n ['week', 's680f01021b5e339d', 'Week'],\n ['month', 'sb47daaf9e1c4a905', 'Month'],\n ['currentMonth', 's15ba5784a11e0b88', 'Current Month'],\n ['allDay', 's58ab939b42a026a6', 'All Day'],\n ['today', 's63d040e37887f17e', 'Today'],\n ['noTitle', 's98b32ef4a0856c08', 'No Title'],\n ['noContent', 's22380c7fc798a44f', 'No Content'],\n ['noTime', 'sfce4bfbe0f911aa7', 'No Time'],\n ['eventDetails', 'sa0fd990c985f24bd', 'Event Details'],\n ['exportAsICS', 's2bc4d1196bce49dc', 'Export as ICS'],\n ['title', 's99f110d27e30b289', 'Title'],\n ['time', 's48e186fb300e5464', 'Time'],\n ['date', 'sac8252732f2edb19', 'Date'],\n ['notes', 's005053d82b712e0a', 'Notes'],\n ['close', 's5e8250fb85d64c23', 'Close'],\n ['calendarWeek', 's090f2107b5a69a7f', 'CW'],\n ['year', 's3c44e22d1af5693e', 'Year'],\n ['previous', 'sa1b2c3d4e5f60001', 'Previous'],\n ['next', 'sa1b2c3d4e5f60002', 'Next'],\n ['events', 'sa1b2c3d4e5f60003', 'events'],\n ['calendarEvent', 'sa1b2c3d4e5f60004', 'Calendar event'],\n ['pressToOpen', 'sa1b2c3d4e5f60005', 'Press Enter or Space to open details'],\n ['to', 'sa1b2c3d4e5f60006', 'to'],\n ['switchToDayView', 'sa1b2c3d4e5f60007', 'Switch to day view for'],\n ['showEarlierDays', 'sa1b2c3d4e5f60008', 'Show earlier days'],\n ['showLaterDays', 'sa1b2c3d4e5f60009', 'Show later days'],\n ['more', 'sa1b2c3d4e5f60010', 'more'],\n ['calendarView', 'sa1b2c3d4e5f60011', 'Calendar view'],\n ['viewLabel', 'sa1b2c3d4e5f60012', 'view'],\n] as const;\n\nconst _bundleCache = new Map<string, ResolvedMessages>();\n\nfunction resolveTemplates(locale: string): Record<string, string> | undefined {\n if (locale === 'en') return undefined;\n return allTemplates[locale] ?? allTemplates[locale.split('-')[0]];\n}\n\nexport function getMessages(locale: string): ResolvedMessages {\n let bundle = _bundleCache.get(locale);\n if (bundle) return bundle;\n\n const templates = resolveTemplates(locale);\n const resolved = {} as Record<MessageKey, string>;\n for (const [key, hashId, fallback] of MESSAGE_DEFS) {\n resolved[key] = templates?.[hashId] ?? fallback;\n }\n bundle = Object.freeze(resolved);\n _bundleCache.set(locale, bundle);\n return bundle;\n}\n\n// Dev-mode validation — tree-shaken in production builds\nif ((import.meta as ImportMeta & { env?: { DEV?: boolean } }).env?.DEV) {\n for (const code of targetLocales) {\n if (!(code in allTemplates)) {\n console.warn(`[lms-calendar] Missing locale template registration for \"${code}\"`);\n }\n }\n}\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `নোট`,\n s090f2107b5a69a7f: `স`,\n s15ba5784a11e0b88: `বর্তমান মাস`,\n s22380c7fc798a44f: `বিষয়বস্তু নেই`,\n s2bc4d1196bce49dc: `ICS হিসাবে রপ্তানি`,\n s3c44e22d1af5693e: `বছর`,\n s48e186fb300e5464: `সময়`,\n s58ab939b42a026a6: `সারাদিন`,\n s5e8250fb85d64c23: `বন্ধ`,\n s63d040e37887f17e: `আজ`,\n s680f01021b5e339d: `সপ্তাহ`,\n s98b32ef4a0856c08: `শিরোনাম নেই`,\n s99f110d27e30b289: `শিরোনাম`,\n sa0fd990c985f24bd: `ইভেন্টের বিবরণ`,\n sac8252732f2edb19: `তারিখ`,\n sb47daaf9e1c4a905: `মাস`,\n se0955919920ee87d: `দিন`,\n sfce4bfbe0f911aa7: `সময় নেই`,\n sa1b2c3d4e5f60001: `আগের`,\n sa1b2c3d4e5f60002: `পরের`,\n sa1b2c3d4e5f60003: `ইভেন্ট`,\n sa1b2c3d4e5f60004: `ক্যালেন্ডার ইভেন্ট`,\n sa1b2c3d4e5f60005: `বিস্তারিত দেখতে Enter বা Space চাপুন`,\n sa1b2c3d4e5f60006: `থেকে`,\n sa1b2c3d4e5f60007: `দিনের ভিউতে যান`,\n sa1b2c3d4e5f60008: `আগের দিনগুলি দেখান`,\n sa1b2c3d4e5f60009: `পরের দিনগুলি দেখান`,\n sa1b2c3d4e5f60010: `আরও`,\n sa1b2c3d4e5f60011: `ক্যালেন্ডার ভিউ`,\n sa1b2c3d4e5f60012: `ভিউ`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `Notizen`,\n s090f2107b5a69a7f: `KW`,\n s15ba5784a11e0b88: `Aktueller Monat`,\n s22380c7fc798a44f: `Kein Inhalt`,\n s2bc4d1196bce49dc: `Als ICS exportieren`,\n s3c44e22d1af5693e: `Jahr`,\n s48e186fb300e5464: `Zeit`,\n s58ab939b42a026a6: `Ganztägig`,\n s5e8250fb85d64c23: `Schließen`,\n s63d040e37887f17e: `Heute`,\n s680f01021b5e339d: `Woche`,\n s98b32ef4a0856c08: `Kein Titel`,\n s99f110d27e30b289: `Titel`,\n sa0fd990c985f24bd: `Termindetails`,\n sac8252732f2edb19: `Datum`,\n sb47daaf9e1c4a905: `Monat`,\n se0955919920ee87d: `Tag`,\n sfce4bfbe0f911aa7: `Keine Zeit`,\n sa1b2c3d4e5f60001: `Zurück`,\n sa1b2c3d4e5f60002: `Weiter`,\n sa1b2c3d4e5f60003: `Termine`,\n sa1b2c3d4e5f60004: `Kalenderereignis`,\n sa1b2c3d4e5f60005: `Enter oder Leertaste drücken für Details`,\n sa1b2c3d4e5f60006: `bis`,\n sa1b2c3d4e5f60007: `Zur Tagesansicht wechseln für`,\n sa1b2c3d4e5f60008: `Frühere Tage anzeigen`,\n sa1b2c3d4e5f60009: `Spätere Tage anzeigen`,\n sa1b2c3d4e5f60010: `mehr`,\n sa1b2c3d4e5f60011: `Kalenderansicht`,\n sa1b2c3d4e5f60012: `Ansicht`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `Notizen`,\n s090f2107b5a69a7f: `KW`,\n s15ba5784a11e0b88: `Aktueller Monat`,\n s22380c7fc798a44f: `Kein Inhalt`,\n s2bc4d1196bce49dc: `Als ICS exportieren`,\n s3c44e22d1af5693e: `Jahr`,\n s48e186fb300e5464: `Zeit`,\n s58ab939b42a026a6: `Ganztägig`,\n s5e8250fb85d64c23: `Schließen`,\n s63d040e37887f17e: `Heute`,\n s680f01021b5e339d: `Woche`,\n s98b32ef4a0856c08: `Kein Titel`,\n s99f110d27e30b289: `Titel`,\n sa0fd990c985f24bd: `Termindetails`,\n sac8252732f2edb19: `Datum`,\n sb47daaf9e1c4a905: `Monat`,\n se0955919920ee87d: `Tag`,\n sfce4bfbe0f911aa7: `Keine Zeit`,\n sa1b2c3d4e5f60001: `Zurück`,\n sa1b2c3d4e5f60002: `Weiter`,\n sa1b2c3d4e5f60003: `Termine`,\n sa1b2c3d4e5f60004: `Kalenderereignis`,\n sa1b2c3d4e5f60005: `Enter oder Leertaste drücken für Details`,\n sa1b2c3d4e5f60006: `bis`,\n sa1b2c3d4e5f60007: `Zur Tagesansicht wechseln für`,\n sa1b2c3d4e5f60008: `Frühere Tage anzeigen`,\n sa1b2c3d4e5f60009: `Spätere Tage anzeigen`,\n sa1b2c3d4e5f60010: `mehr`,\n sa1b2c3d4e5f60011: `Kalenderansicht`,\n sa1b2c3d4e5f60012: `Ansicht`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `Notas`,\n s090f2107b5a69a7f: `S`,\n s15ba5784a11e0b88: `Mes actual`,\n s22380c7fc798a44f: `Sin contenido`,\n s2bc4d1196bce49dc: `Exportar como ICS`,\n s3c44e22d1af5693e: `Año`,\n s48e186fb300e5464: `Hora`,\n s58ab939b42a026a6: `Todo el día`,\n s5e8250fb85d64c23: `Cerrar`,\n s63d040e37887f17e: `Hoy`,\n s680f01021b5e339d: `Semana`,\n s98b32ef4a0856c08: `Sin título`,\n s99f110d27e30b289: `Título`,\n sa0fd990c985f24bd: `Detalles del evento`,\n sac8252732f2edb19: `Fecha`,\n sb47daaf9e1c4a905: `Mes`,\n se0955919920ee87d: `Día`,\n sfce4bfbe0f911aa7: `Sin hora`,\n sa1b2c3d4e5f60001: `Anterior`,\n sa1b2c3d4e5f60002: `Siguiente`,\n sa1b2c3d4e5f60003: `eventos`,\n sa1b2c3d4e5f60004: `Evento del calendario`,\n sa1b2c3d4e5f60005: `Pulsa Enter o Espacio para abrir detalles`,\n sa1b2c3d4e5f60006: `a`,\n sa1b2c3d4e5f60007: `Cambiar a vista diaria para`,\n sa1b2c3d4e5f60008: `Mostrar días anteriores`,\n sa1b2c3d4e5f60009: `Mostrar días posteriores`,\n sa1b2c3d4e5f60010: `más`,\n sa1b2c3d4e5f60011: `Vista del calendario`,\n sa1b2c3d4e5f60012: `vista`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `Notes`,\n s090f2107b5a69a7f: `S`,\n s15ba5784a11e0b88: `Mois en cours`,\n s22380c7fc798a44f: `Aucun contenu`,\n s2bc4d1196bce49dc: `Exporter en ICS`,\n s3c44e22d1af5693e: `Année`,\n s48e186fb300e5464: `Heure`,\n s58ab939b42a026a6: `Toute la journée`,\n s5e8250fb85d64c23: `Fermer`,\n s63d040e37887f17e: `Aujourd'hui`,\n s680f01021b5e339d: `Semaine`,\n s98b32ef4a0856c08: `Sans titre`,\n s99f110d27e30b289: `Titre`,\n sa0fd990c985f24bd: `Détails de l'événement`,\n sac8252732f2edb19: `Date`,\n sb47daaf9e1c4a905: `Mois`,\n se0955919920ee87d: `Jour`,\n sfce4bfbe0f911aa7: `Aucune heure`,\n sa1b2c3d4e5f60001: `Précédent`,\n sa1b2c3d4e5f60002: `Suivant`,\n sa1b2c3d4e5f60003: `événements`,\n sa1b2c3d4e5f60004: `Événement du calendrier`,\n sa1b2c3d4e5f60005: `Appuyez sur Entrée ou Espace pour ouvrir les détails`,\n sa1b2c3d4e5f60006: `à`,\n sa1b2c3d4e5f60007: `Passer à la vue journalière pour`,\n sa1b2c3d4e5f60008: `Afficher les jours précédents`,\n sa1b2c3d4e5f60009: `Afficher les jours suivants`,\n sa1b2c3d4e5f60010: `plus`,\n sa1b2c3d4e5f60011: `Vue du calendrier`,\n sa1b2c3d4e5f60012: `vue`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `टिप्पणियाँ`,\n s090f2107b5a69a7f: `स`,\n s15ba5784a11e0b88: `वर्तमान महीना`,\n s22380c7fc798a44f: `कोई सामग्री नहीं`,\n s2bc4d1196bce49dc: `ICS के रूप में निर्यात करें`,\n s3c44e22d1af5693e: `वर्ष`,\n s48e186fb300e5464: `समय`,\n s58ab939b42a026a6: `पूरा दिन`,\n s5e8250fb85d64c23: `बंद करें`,\n s63d040e37887f17e: `आज`,\n s680f01021b5e339d: `सप्ताह`,\n s98b32ef4a0856c08: `कोई शीर्षक नहीं`,\n s99f110d27e30b289: `शीर्षक`,\n sa0fd990c985f24bd: `कार्यक्रम विवरण`,\n sac8252732f2edb19: `तारीख`,\n sb47daaf9e1c4a905: `महीना`,\n se0955919920ee87d: `दिन`,\n sfce4bfbe0f911aa7: `कोई समय नहीं`,\n sa1b2c3d4e5f60001: `पिछला`,\n sa1b2c3d4e5f60002: `अगला`,\n sa1b2c3d4e5f60003: `इवेंट`,\n sa1b2c3d4e5f60004: `कैलेंडर इवेंट`,\n sa1b2c3d4e5f60005: `विवरण खोलने के लिए Enter या Space दबाएं`,\n sa1b2c3d4e5f60006: `से`,\n sa1b2c3d4e5f60007: `दिन दृश्य पर जाएं`,\n sa1b2c3d4e5f60008: `पहले के दिन दिखाएं`,\n sa1b2c3d4e5f60009: `बाद के दिन दिखाएं`,\n sa1b2c3d4e5f60010: `अधिक`,\n sa1b2c3d4e5f60011: `कैलेंडर दृश्य`,\n sa1b2c3d4e5f60012: `दृश्य`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `Catatan`,\n s090f2107b5a69a7f: `M`,\n s15ba5784a11e0b88: `Bulan Ini`,\n s22380c7fc798a44f: `Tanpa Konten`,\n s2bc4d1196bce49dc: `Ekspor sebagai ICS`,\n s3c44e22d1af5693e: `Tahun`,\n s48e186fb300e5464: `Waktu`,\n s58ab939b42a026a6: `Sepanjang Hari`,\n s5e8250fb85d64c23: `Tutup`,\n s63d040e37887f17e: `Hari Ini`,\n s680f01021b5e339d: `Minggu`,\n s98b32ef4a0856c08: `Tanpa Judul`,\n s99f110d27e30b289: `Judul`,\n sa0fd990c985f24bd: `Detail Acara`,\n sac8252732f2edb19: `Tanggal`,\n sb47daaf9e1c4a905: `Bulan`,\n se0955919920ee87d: `Hari`,\n sfce4bfbe0f911aa7: `Tanpa Waktu`,\n sa1b2c3d4e5f60001: `Sebelumnya`,\n sa1b2c3d4e5f60002: `Berikutnya`,\n sa1b2c3d4e5f60003: `acara`,\n sa1b2c3d4e5f60004: `Acara kalender`,\n sa1b2c3d4e5f60005: `Tekan Enter atau Spasi untuk membuka detail`,\n sa1b2c3d4e5f60006: `sampai`,\n sa1b2c3d4e5f60007: `Beralih ke tampilan hari untuk`,\n sa1b2c3d4e5f60008: `Tampilkan hari sebelumnya`,\n sa1b2c3d4e5f60009: `Tampilkan hari berikutnya`,\n sa1b2c3d4e5f60010: `lainnya`,\n sa1b2c3d4e5f60011: `Tampilan kalender`,\n sa1b2c3d4e5f60012: `tampilan`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `Note`,\n s090f2107b5a69a7f: `S`,\n s15ba5784a11e0b88: `Mese corrente`,\n s22380c7fc798a44f: `Nessun contenuto`,\n s2bc4d1196bce49dc: `Esporta come ICS`,\n s3c44e22d1af5693e: `Anno`,\n s48e186fb300e5464: `Ora`,\n s58ab939b42a026a6: `Tutto il giorno`,\n s5e8250fb85d64c23: `Chiudi`,\n s63d040e37887f17e: `Oggi`,\n s680f01021b5e339d: `Settimana`,\n s98b32ef4a0856c08: `Senza titolo`,\n s99f110d27e30b289: `Titolo`,\n sa0fd990c985f24bd: `Dettagli evento`,\n sac8252732f2edb19: `Data`,\n sb47daaf9e1c4a905: `Mese`,\n se0955919920ee87d: `Giorno`,\n sfce4bfbe0f911aa7: `Nessun orario`,\n sa1b2c3d4e5f60001: `Precedente`,\n sa1b2c3d4e5f60002: `Successivo`,\n sa1b2c3d4e5f60003: `eventi`,\n sa1b2c3d4e5f60004: `Evento del calendario`,\n sa1b2c3d4e5f60005: `Premi Invio o Spazio per aprire i dettagli`,\n sa1b2c3d4e5f60006: `a`,\n sa1b2c3d4e5f60007: `Passa alla vista giornaliera per`,\n sa1b2c3d4e5f60008: `Mostra giorni precedenti`,\n sa1b2c3d4e5f60009: `Mostra giorni successivi`,\n sa1b2c3d4e5f60010: `altro`,\n sa1b2c3d4e5f60011: `Vista calendario`,\n sa1b2c3d4e5f60012: `vista`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `メモ`,\n s090f2107b5a69a7f: `週`,\n s15ba5784a11e0b88: `今月`,\n s22380c7fc798a44f: `内容なし`,\n s2bc4d1196bce49dc: `ICSとして書き出す`,\n s3c44e22d1af5693e: `年`,\n s48e186fb300e5464: `時間`,\n s58ab939b42a026a6: `終日`,\n s5e8250fb85d64c23: `閉じる`,\n s63d040e37887f17e: `今日`,\n s680f01021b5e339d: `週`,\n s98b32ef4a0856c08: `タイトルなし`,\n s99f110d27e30b289: `タイトル`,\n sa0fd990c985f24bd: `予定の詳細`,\n sac8252732f2edb19: `日付`,\n sb47daaf9e1c4a905: `月`,\n se0955919920ee87d: `日`,\n sfce4bfbe0f911aa7: `時間なし`,\n sa1b2c3d4e5f60001: `前へ`,\n sa1b2c3d4e5f60002: `次へ`,\n sa1b2c3d4e5f60003: `件`,\n sa1b2c3d4e5f60004: `カレンダーイベント`,\n sa1b2c3d4e5f60005: `EnterまたはSpaceキーで詳細を開く`,\n sa1b2c3d4e5f60006: `から`,\n sa1b2c3d4e5f60007: `日表示に切り替え`,\n sa1b2c3d4e5f60008: `前の日を表示`,\n sa1b2c3d4e5f60009: `次の日を表示`,\n sa1b2c3d4e5f60010: `もっと`,\n sa1b2c3d4e5f60011: `カレンダー表示`,\n sa1b2c3d4e5f60012: `表示`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `메모`,\n s090f2107b5a69a7f: `주`,\n s15ba5784a11e0b88: `이번 달`,\n s22380c7fc798a44f: `내용 없음`,\n s2bc4d1196bce49dc: `ICS로 내보내기`,\n s3c44e22d1af5693e: `년`,\n s48e186fb300e5464: `시간`,\n s58ab939b42a026a6: `종일`,\n s5e8250fb85d64c23: `닫기`,\n s63d040e37887f17e: `오늘`,\n s680f01021b5e339d: `주`,\n s98b32ef4a0856c08: `제목 없음`,\n s99f110d27e30b289: `제목`,\n sa0fd990c985f24bd: `일정 상세`,\n sac8252732f2edb19: `날짜`,\n sb47daaf9e1c4a905: `월`,\n se0955919920ee87d: `일`,\n sfce4bfbe0f911aa7: `시간 없음`,\n sa1b2c3d4e5f60001: `이전`,\n sa1b2c3d4e5f60002: `다음`,\n sa1b2c3d4e5f60003: `일정`,\n sa1b2c3d4e5f60004: `캘린더 이벤트`,\n sa1b2c3d4e5f60005: `Enter 또는 Space를 눌러 세부 정보 열기`,\n sa1b2c3d4e5f60006: `부터`,\n sa1b2c3d4e5f60007: `일 보기로 전환`,\n sa1b2c3d4e5f60008: `이전 날 표시`,\n sa1b2c3d4e5f60009: `다음 날 표시`,\n sa1b2c3d4e5f60010: `더보기`,\n sa1b2c3d4e5f60011: `캘린더 보기`,\n sa1b2c3d4e5f60012: `보기`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `Notities`,\n s090f2107b5a69a7f: `W`,\n s15ba5784a11e0b88: `Huidige maand`,\n s22380c7fc798a44f: `Geen inhoud`,\n s2bc4d1196bce49dc: `Exporteren als ICS`,\n s3c44e22d1af5693e: `Jaar`,\n s48e186fb300e5464: `Tijd`,\n s58ab939b42a026a6: `Hele dag`,\n s5e8250fb85d64c23: `Sluiten`,\n s63d040e37887f17e: `Vandaag`,\n s680f01021b5e339d: `Week`,\n s98b32ef4a0856c08: `Geen titel`,\n s99f110d27e30b289: `Titel`,\n sa0fd990c985f24bd: `Details evenement`,\n sac8252732f2edb19: `Datum`,\n sb47daaf9e1c4a905: `Maand`,\n se0955919920ee87d: `Dag`,\n sfce4bfbe0f911aa7: `Geen tijd`,\n sa1b2c3d4e5f60001: `Vorige`,\n sa1b2c3d4e5f60002: `Volgende`,\n sa1b2c3d4e5f60003: `evenementen`,\n sa1b2c3d4e5f60004: `Agendagebeurtenis`,\n sa1b2c3d4e5f60005: `Druk op Enter of Spatie om details te openen`,\n sa1b2c3d4e5f60006: `tot`,\n sa1b2c3d4e5f60007: `Naar dagweergave voor`,\n sa1b2c3d4e5f60008: `Eerdere dagen tonen`,\n sa1b2c3d4e5f60009: `Latere dagen tonen`,\n sa1b2c3d4e5f60010: `meer`,\n sa1b2c3d4e5f60011: `Agendaweergave`,\n sa1b2c3d4e5f60012: `weergave`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `Notatki`,\n s090f2107b5a69a7f: `T`,\n s15ba5784a11e0b88: `Bieżący miesiąc`,\n s22380c7fc798a44f: `Brak treści`,\n s2bc4d1196bce49dc: `Eksportuj jako ICS`,\n s3c44e22d1af5693e: `Rok`,\n s48e186fb300e5464: `Czas`,\n s58ab939b42a026a6: `Cały dzień`,\n s5e8250fb85d64c23: `Zamknij`,\n s63d040e37887f17e: `Dziś`,\n s680f01021b5e339d: `Tydzień`,\n s98b32ef4a0856c08: `Brak tytułu`,\n s99f110d27e30b289: `Tytuł`,\n sa0fd990c985f24bd: `Szczegóły wydarzenia`,\n sac8252732f2edb19: `Data`,\n sb47daaf9e1c4a905: `Miesiąc`,\n se0955919920ee87d: `Dzień`,\n sfce4bfbe0f911aa7: `Brak czasu`,\n sa1b2c3d4e5f60001: `Poprzedni`,\n sa1b2c3d4e5f60002: `Następny`,\n sa1b2c3d4e5f60003: `wydarzeń`,\n sa1b2c3d4e5f60004: `Wydarzenie kalendarza`,\n sa1b2c3d4e5f60005: `Naciśnij Enter lub Spację, aby otworzyć szczegóły`,\n sa1b2c3d4e5f60006: `do`,\n sa1b2c3d4e5f60007: `Przełącz na widok dnia dla`,\n sa1b2c3d4e5f60008: `Pokaż wcześniejsze dni`,\n sa1b2c3d4e5f60009: `Pokaż późniejsze dni`,\n sa1b2c3d4e5f60010: `więcej`,\n sa1b2c3d4e5f60011: `Widok kalendarza`,\n sa1b2c3d4e5f60012: `widok`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `Notas`,\n s090f2107b5a69a7f: `S`,\n s15ba5784a11e0b88: `Mês atual`,\n s22380c7fc798a44f: `Sem conteúdo`,\n s2bc4d1196bce49dc: `Exportar como ICS`,\n s3c44e22d1af5693e: `Ano`,\n s48e186fb300e5464: `Hora`,\n s58ab939b42a026a6: `O dia todo`,\n s5e8250fb85d64c23: `Fechar`,\n s63d040e37887f17e: `Hoje`,\n s680f01021b5e339d: `Semana`,\n s98b32ef4a0856c08: `Sem título`,\n s99f110d27e30b289: `Título`,\n sa0fd990c985f24bd: `Detalhes do evento`,\n sac8252732f2edb19: `Data`,\n sb47daaf9e1c4a905: `Mês`,\n se0955919920ee87d: `Dia`,\n sfce4bfbe0f911aa7: `Sem horário`,\n sa1b2c3d4e5f60001: `Anterior`,\n sa1b2c3d4e5f60002: `Próximo`,\n sa1b2c3d4e5f60003: `eventos`,\n sa1b2c3d4e5f60004: `Evento do calendário`,\n sa1b2c3d4e5f60005: `Pressione Enter ou Espaço para abrir detalhes`,\n sa1b2c3d4e5f60006: `até`,\n sa1b2c3d4e5f60007: `Mudar para visualização diária de`,\n sa1b2c3d4e5f60008: `Mostrar dias anteriores`,\n sa1b2c3d4e5f60009: `Mostrar dias posteriores`,\n sa1b2c3d4e5f60010: `mais`,\n sa1b2c3d4e5f60011: `Visualização do calendário`,\n sa1b2c3d4e5f60012: `visualização`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `Заметки`,\n s090f2107b5a69a7f: `Н`,\n s15ba5784a11e0b88: `Текущий месяц`,\n s22380c7fc798a44f: `Нет содержимого`,\n s2bc4d1196bce49dc: `Экспорт в ICS`,\n s3c44e22d1af5693e: `Год`,\n s48e186fb300e5464: `Время`,\n s58ab939b42a026a6: `Весь день`,\n s5e8250fb85d64c23: `Закрыть`,\n s63d040e37887f17e: `Сегодня`,\n s680f01021b5e339d: `Неделя`,\n s98b32ef4a0856c08: `Без названия`,\n s99f110d27e30b289: `Название`,\n sa0fd990c985f24bd: `Детали события`,\n sac8252732f2edb19: `Дата`,\n sb47daaf9e1c4a905: `Месяц`,\n se0955919920ee87d: `День`,\n sfce4bfbe0f911aa7: `Нет времени`,\n sa1b2c3d4e5f60001: `Назад`,\n sa1b2c3d4e5f60002: `Вперёд`,\n sa1b2c3d4e5f60003: `событий`,\n sa1b2c3d4e5f60004: `Событие календаря`,\n sa1b2c3d4e5f60005: `Нажмите Enter или Пробел для открытия деталей`,\n sa1b2c3d4e5f60006: `до`,\n sa1b2c3d4e5f60007: `Переключиться на дневной вид для`,\n sa1b2c3d4e5f60008: `Показать предыдущие дни`,\n sa1b2c3d4e5f60009: `Показать следующие дни`,\n sa1b2c3d4e5f60010: `ещё`,\n sa1b2c3d4e5f60011: `Вид календаря`,\n sa1b2c3d4e5f60012: `вид`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `บันทึก`,\n s090f2107b5a69a7f: `ส`,\n s15ba5784a11e0b88: `เดือนปัจจุบัน`,\n s22380c7fc798a44f: `ไม่มีเนื้อหา`,\n s2bc4d1196bce49dc: `ส่งออกเป็น ICS`,\n s3c44e22d1af5693e: `ปี`,\n s48e186fb300e5464: `เวลา`,\n s58ab939b42a026a6: `ทั้งวัน`,\n s5e8250fb85d64c23: `ปิด`,\n s63d040e37887f17e: `วันนี้`,\n s680f01021b5e339d: `สัปดาห์`,\n s98b32ef4a0856c08: `ไม่มีชื่อ`,\n s99f110d27e30b289: `ชื่อ`,\n sa0fd990c985f24bd: `รายละเอียดกิจกรรม`,\n sac8252732f2edb19: `วันที่`,\n sb47daaf9e1c4a905: `เดือน`,\n se0955919920ee87d: `วัน`,\n sfce4bfbe0f911aa7: `ไม่มีเวลา`,\n sa1b2c3d4e5f60001: `ก่อนหน้า`,\n sa1b2c3d4e5f60002: `ถัดไป`,\n sa1b2c3d4e5f60003: `กิจกรรม`,\n sa1b2c3d4e5f60004: `กิจกรรมปฏิทิน`,\n sa1b2c3d4e5f60005: `กด Enter หรือ Space เพื่อเปิดรายละเอียด`,\n sa1b2c3d4e5f60006: `ถึง`,\n sa1b2c3d4e5f60007: `สลับไปมุมมองรายวันสำหรับ`,\n sa1b2c3d4e5f60008: `แสดงวันก่อนหน้า`,\n sa1b2c3d4e5f60009: `แสดงวันถัดไป`,\n sa1b2c3d4e5f60010: `เพิ่มเติม`,\n sa1b2c3d4e5f60011: `มุมมองปฏิทิน`,\n sa1b2c3d4e5f60012: `มุมมอง`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `Notlar`,\n s090f2107b5a69a7f: `H`,\n s15ba5784a11e0b88: `Bu Ay`,\n s22380c7fc798a44f: `İçerik Yok`,\n s2bc4d1196bce49dc: `ICS Olarak Dışa Aktar`,\n s3c44e22d1af5693e: `Yıl`,\n s48e186fb300e5464: `Zaman`,\n s58ab939b42a026a6: `Tüm Gün`,\n s5e8250fb85d64c23: `Kapat`,\n s63d040e37887f17e: `Bugün`,\n s680f01021b5e339d: `Hafta`,\n s98b32ef4a0856c08: `Başlıksız`,\n s99f110d27e30b289: `Başlık`,\n sa0fd990c985f24bd: `Etkinlik Detayları`,\n sac8252732f2edb19: `Tarih`,\n sb47daaf9e1c4a905: `Ay`,\n se0955919920ee87d: `Gün`,\n sfce4bfbe0f911aa7: `Zaman Yok`,\n sa1b2c3d4e5f60001: `Önceki`,\n sa1b2c3d4e5f60002: `Sonraki`,\n sa1b2c3d4e5f60003: `etkinlik`,\n sa1b2c3d4e5f60004: `Takvim etkinliği`,\n sa1b2c3d4e5f60005: `Ayrıntıları açmak için Enter veya Boşluk tuşuna basın`,\n sa1b2c3d4e5f60006: `ile`,\n sa1b2c3d4e5f60007: `Gün görünümüne geç`,\n sa1b2c3d4e5f60008: `Önceki günleri göster`,\n sa1b2c3d4e5f60009: `Sonraki günleri göster`,\n sa1b2c3d4e5f60010: `daha fazla`,\n sa1b2c3d4e5f60011: `Takvim görünümü`,\n sa1b2c3d4e5f60012: `görünüm`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `Нотатки`,\n s090f2107b5a69a7f: `Т`,\n s15ba5784a11e0b88: `Поточний місяць`,\n s22380c7fc798a44f: `Без вмісту`,\n s2bc4d1196bce49dc: `Експорт в ICS`,\n s3c44e22d1af5693e: `Рік`,\n s48e186fb300e5464: `Час`,\n s58ab939b42a026a6: `Увесь день`,\n s5e8250fb85d64c23: `Закрити`,\n s63d040e37887f17e: `Сьогодні`,\n s680f01021b5e339d: `Тиждень`,\n s98b32ef4a0856c08: `Без назви`,\n s99f110d27e30b289: `Назва`,\n sa0fd990c985f24bd: `Деталі події`,\n sac8252732f2edb19: `Дата`,\n sb47daaf9e1c4a905: `Місяць`,\n se0955919920ee87d: `День`,\n sfce4bfbe0f911aa7: `Без часу`,\n sa1b2c3d4e5f60001: `Попередній`,\n sa1b2c3d4e5f60002: `Наступний`,\n sa1b2c3d4e5f60003: `подій`,\n sa1b2c3d4e5f60004: `Подія календаря`,\n sa1b2c3d4e5f60005: `Натисніть Enter або Пробіл для відкриття деталей`,\n sa1b2c3d4e5f60006: `до`,\n sa1b2c3d4e5f60007: `Перейти до денного перегляду для`,\n sa1b2c3d4e5f60008: `Показати попередні дні`,\n sa1b2c3d4e5f60009: `Показати наступні дні`,\n sa1b2c3d4e5f60010: `ще`,\n sa1b2c3d4e5f60011: `Перегляд календаря`,\n sa1b2c3d4e5f60012: `перегляд`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `Ghi chú`,\n s090f2107b5a69a7f: `T`,\n s15ba5784a11e0b88: `Tháng hiện tại`,\n s22380c7fc798a44f: `Không có nội dung`,\n s2bc4d1196bce49dc: `Xuất dưới dạng ICS`,\n s3c44e22d1af5693e: `Năm`,\n s48e186fb300e5464: `Thời gian`,\n s58ab939b42a026a6: `Cả ngày`,\n s5e8250fb85d64c23: `Đóng`,\n s63d040e37887f17e: `Hôm nay`,\n s680f01021b5e339d: `Tuần`,\n s98b32ef4a0856c08: `Không có tiêu đề`,\n s99f110d27e30b289: `Tiêu đề`,\n sa0fd990c985f24bd: `Chi tiết sự kiện`,\n sac8252732f2edb19: `Ngày`,\n sb47daaf9e1c4a905: `Tháng`,\n se0955919920ee87d: `Ngày`,\n sfce4bfbe0f911aa7: `Không có thời gian`,\n sa1b2c3d4e5f60001: `Trước`,\n sa1b2c3d4e5f60002: `Sau`,\n sa1b2c3d4e5f60003: `sự kiện`,\n sa1b2c3d4e5f60004: `Sự kiện lịch`,\n sa1b2c3d4e5f60005: `Nhấn Enter hoặc Space để mở chi tiết`,\n sa1b2c3d4e5f60006: `đến`,\n sa1b2c3d4e5f60007: `Chuyển sang xem theo ngày cho`,\n sa1b2c3d4e5f60008: `Hiển thị ngày trước đó`,\n sa1b2c3d4e5f60009: `Hiển thị ngày tiếp theo`,\n sa1b2c3d4e5f60010: `thêm`,\n sa1b2c3d4e5f60011: `Xem lịch`,\n sa1b2c3d4e5f60012: `xem`,\n};\n","// Do not modify this file by hand!\n// Re-generate this file by running lit-localize\n\n/* eslint-disable no-irregular-whitespace */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const templates = {\n s005053d82b712e0a: `备注`,\n s090f2107b5a69a7f: `周`,\n s15ba5784a11e0b88: `本月`,\n s22380c7fc798a44f: `无内容`,\n s2bc4d1196bce49dc: `导出为 ICS`,\n s3c44e22d1af5693e: `年`,\n s48e186fb300e5464: `时间`,\n s58ab939b42a026a6: `全天`,\n s5e8250fb85d64c23: `关闭`,\n s63d040e37887f17e: `今天`,\n s680f01021b5e339d: `周`,\n s98b32ef4a0856c08: `无标题`,\n s99f110d27e30b289: `标题`,\n sa0fd990c985f24bd: `事件详情`,\n sac8252732f2edb19: `日期`,\n sb47daaf9e1c4a905: `月`,\n se0955919920ee87d: `日`,\n sfce4bfbe0f911aa7: `无时间`,\n sa1b2c3d4e5f60001: `上一个`,\n sa1b2c3d4e5f60002: `下一个`,\n sa1b2c3d4e5f60003: `事件`,\n sa1b2c3d4e5f60004: `日历事件`,\n sa1b2c3d4e5f60005: `按 Enter 或空格键打开详情`,\n sa1b2c3d4e5f60006: `至`,\n sa1b2c3d4e5f60007: `切换到日视图`,\n sa1b2c3d4e5f60008: `显示更早的日期`,\n sa1b2c3d4e5f60009: `显示更晚的日期`,\n sa1b2c3d4e5f60010: `更多`,\n sa1b2c3d4e5f60011: `日历视图`,\n sa1b2c3d4e5f60012: `视图`,\n};\n","import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { P, match } from 'ts-pattern';\n\nimport { formatLocalizedTime, formatLocalizedTimeRange } from '../lib/localization.js';\nimport { getMessages } from '../lib/messages.js';\nimport type { CalendarDateInterval } from '../lms-calendar';\n\n/**\n * Calendar entry component with accessibility and interaction support\n *\n * @prop {Object} accessibility - Accessibility configuration for tab order and ARIA attributes\n */\n@customElement('lms-calendar-entry')\nexport default class Entry extends LitElement {\n @property({ attribute: false })\n time?: CalendarTimeInterval;\n\n @property()\n heading = '';\n\n @property()\n content?: string;\n\n @property({ type: Boolean })\n isContinuation = false;\n\n @property({ type: Object }) date?: CalendarDateInterval;\n\n @property({ type: String, reflect: true, attribute: 'data-density' })\n density: 'compact' | 'standard' | 'full' = 'standard';\n\n @property({ type: String, reflect: true, attribute: 'data-display-mode' })\n displayMode: 'default' | 'month-dot' = 'default';\n\n @property({ type: Boolean, reflect: true, attribute: 'data-float-text' })\n floatText = false;\n\n @property({ type: Object, attribute: false })\n accessibility?: { tabIndex: number; role: 'button'; ariaLabel: string };\n\n @property({ type: String })\n locale = 'en';\n\n @state()\n _highlighted?: boolean;\n\n @state()\n _extended?: boolean;\n\n private _sumReducer: (accumulator: number, currentValue: number) => number = (\n accumulator,\n currentValue,\n ) => accumulator + currentValue;\n\n static override styles = css`\n :host {\n /* Use shared design tokens from root component */\n font-size: var(--entry-font-size);\n line-height: var(--entry-line-height);\n font-family: var(--system-ui);\n contain: layout style;\n\n grid-column: 2;\n display: block;\n cursor: pointer;\n user-select: none;\n border-radius: var(--entry-border-radius);\n grid-row: var(--start-slot);\n width: var(--entry-width, 100%);\n margin-left: var(--entry-margin-left, 0);\n background-color: var(--entry-background-color);\n color: var(--entry-color);\n border: var(--entry-border, none);\n /* z-index of separators in day view is 0 */\n z-index: var(--entry-z-index, 1);\n opacity: var(--entry-opacity, 1);\n box-sizing: border-box;\n padding-bottom: 1px;\n min-height: var(--entry-min-height);\n overflow: hidden;\n position: relative;\n }\n\n /* Color handle indicator on the left - only for day/week views */\n :host::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: var(--entry-handle-width, 0px);\n background-color: var(--entry-handle-color, transparent);\n border-radius: var(--entry-border-radius) 0 0 var(--entry-border-radius);\n display: var(--entry-handle-display, none);\n }\n\n :host(:last-child) {\n padding-bottom: 0;\n }\n\n :host([data-highlighted]) {\n background: var(--entry-highlight-color);\n }\n\n /* ARIA-compliant highlighted border for active menu entries */\n :host([aria-selected='true']) {\n outline: 3px solid var(--entry-focus-color);\n outline-offset: 2px;\n position: relative;\n z-index: 999 !important; /* Ensure highlighted entry appears above others */\n }\n\n /* Keyboard-only focus styles — mouse clicks won't trigger the outline */\n :host(:focus-visible) {\n outline: 2px solid var(--entry-focus-color);\n outline-offset: 2px;\n position: relative;\n z-index: 999 !important;\n }\n\n :host([data-extended]) {\n background: var(--entry-extended-background-color, var(--background-color));\n }\n\n .main {\n padding: var(--entry-padding);\n padding-top: calc(var(--entry-padding-top, 0) + 0.15em);\n border-radius: var(--entry-border-radius);\n background-color: inherit;\n text-align: left;\n height: 100%;\n box-sizing: border-box;\n display: flex;\n flex-direction: var(--entry-layout);\n align-items: var(--entry-align); /* Use shared design token */\n justify-content: flex-start; /* Always align content to left */\n gap: var(--entry-gap);\n overflow: visible;\n position: relative;\n }\n\n /* Compact grouped content - don't stretch to fill height */\n .main.compact,\n .main.standard {\n align-self: flex-start; /* Don't stretch vertically */\n height: auto; /* Use natural content height instead of 100% */\n min-height: var(--entry-min-height, 1.2em);\n }\n\n /* When handle design is used, adjust padding for the colored handle */\n .main {\n padding-left: var(--entry-padding-left, 0.25em);\n }\n\n .text-content {\n position: absolute;\n top: var(--entry-text-top, -20px);\n left: var(--entry-text-left, 0);\n background: rgba(255, 255, 255, 0.95);\n padding: 2px 6px;\n border-radius: 3px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n font-size: 0.7rem;\n z-index: 1000;\n white-space: nowrap;\n pointer-events: auto;\n line-height: 1.2;\n }\n\n /* Compact mode: single line with title only */\n .main.compact {\n flex-direction: row;\n align-items: flex-start; /* Top-left alignment for better overlapping visibility */\n gap: 0;\n }\n\n /* Standard mode: title + time in various layouts */\n .main.standard {\n flex-direction: var(--entry-layout, row);\n align-items: flex-start;\n gap: 0.25em;\n }\n\n /* Full mode: multi-line with all content */\n .main.full {\n flex-direction: column;\n align-items: flex-start;\n gap: 0.1em;\n }\n\n .title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: var(--entry-title-wrap);\n font-weight: var(--entry-title-weight);\n }\n\n .time {\n font-family: var(--entry-font-family, var(--system-ui));\n font-size: var(--entry-time-font-size);\n opacity: var(--entry-time-opacity);\n white-space: nowrap;\n flex-shrink: 0;\n margin-left: 0; /* Ensure time stays on the left, don't auto-align to right */\n }\n\n /* Row layout: optimized for side-by-side content */\n .main[style*='--entry-layout: row'] {\n align-items: center; /* Center align for single-line layout */\n gap: 0.5em; /* Gap between title and time */\n flex-wrap: nowrap; /* Prevent wrapping */\n min-height: 1.4em; /* Ensure consistent height */\n }\n\n .main[style*='--entry-layout: row'] .title {\n flex: 1 1 auto; /* Allow title to grow but not beyond container */\n min-width: 0; /* Allow title to shrink below content size */\n max-width: 65%; /* Reserve space for time, but allow more for title */\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .main[style*='--entry-layout: row'] .time {\n flex: 0 0 auto; /* Fixed size, don't grow or shrink */\n min-width: fit-content; /* Ensure time always fits */\n font-size: 0.8em; /* Slightly smaller in row layout */\n opacity: 0.9;\n }\n\n /* Column layout: optimized for stacked content */\n .main[style*='--entry-layout: column'] {\n align-items: flex-start;\n gap: 0.15em; /* Tighter spacing for stacked layout */\n padding-top: 0.2em; /* Slight top padding for better visual balance */\n }\n\n .main[style*='--entry-layout: column'] .title {\n width: 100%;\n font-weight: 500; /* Slightly bolder in column layout */\n line-height: 1.2;\n margin-bottom: 0.1em;\n }\n\n .main[style*='--entry-layout: column'] .time {\n width: 100%;\n font-size: 0.85em;\n opacity: 0.8;\n line-height: 1.1;\n }\n\n /* Month view dot indicator styles */\n :host([data-display-mode='month-dot']) {\n background: var(--entry-month-background);\n padding: var(--entry-month-padding);\n border-radius: 0;\n color: var(--entry-month-text-color);\n position: relative;\n z-index: 1;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n overflow: visible;\n contain: style;\n min-height: auto;\n }\n\n /* Multi-day events keep their background in month view */\n :host([data-display-mode='month-dot'][data-is-continuation='true']),\n :host([data-display-mode='month-dot']) .main[data-is-multi-day='true'] {\n background: var(--entry-background-color);\n border-radius: var(--border-radius-sm);\n color: var(--entry-color);\n }\n\n :host([data-display-mode='month-dot']) .main {\n padding: 0;\n align-items: center;\n gap: var(--entry-dot-margin);\n flex-wrap: nowrap;\n overflow: visible;\n flex-direction: row !important;\n }\n\n :host([data-display-mode='month-dot']) .title {\n color: inherit;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex: 1;\n min-width: 0;\n }\n\n :host([data-display-mode='month-dot']) .time {\n font-family: var(--entry-time-font);\n text-align: var(--entry-time-align);\n min-width: 0;\n margin-left: auto;\n color: inherit;\n opacity: 0.8;\n flex-shrink: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .color-dot {\n width: var(--entry-dot-size);\n height: var(--entry-dot-size);\n border-radius: 50%;\n background-color: var(--entry-color);\n flex-shrink: 0;\n aspect-ratio: 1;\n }\n\n .content {\n font-size: 0.9em;\n opacity: 0.9;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* Responsive behavior based on available height */\n :host([data-height='compact']) .main {\n flex-direction: row;\n align-items: center;\n }\n\n :host([data-height='compact']) .time {\n display: var(--entry-compact-show-time, none);\n }\n\n :host([data-height='standard']) .main {\n flex-direction: row;\n align-items: flex-start;\n }\n\n :host([data-height='full']) .main {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([data-height='full']) .title {\n white-space: normal;\n word-wrap: break-word;\n }\n `;\n\n private _renderTitle() {\n return match(this.content)\n .with(P.nullish, () => this.heading)\n .otherwise(() => `${this.heading}: ${this.content}`);\n }\n\n private _renderTime() {\n const msg = getMessages(this.locale);\n\n if (this.displayMode === 'month-dot') {\n // In month view, always try to show time when possible\n if (this.isContinuation) {\n return html`<span class=\"time\">${msg.allDay}</span>`;\n }\n const timeString = this._displayInterval(this.time);\n return timeString ? html`<span class=\"time\">${timeString}</span>` : nothing;\n }\n\n if (this.density === 'compact') {\n return nothing; // No time in compact mode by default\n }\n\n if (this.isContinuation) {\n return html`<span class=\"time\">${msg.allDay}</span>`;\n }\n\n const timeString = this._displayInterval(this.time);\n return timeString ? html`<span class=\"time\">${timeString}</span>` : nothing;\n }\n\n private _renderContent() {\n if (this.density === 'full' && this.content) {\n return html`<span class=\"content\">${this.content}</span>`;\n }\n return nothing;\n }\n\n private _shouldShowTime(): boolean {\n if (this.density === 'compact') return false;\n if (this.isContinuation) return true; // Always show \"All Day\"\n return this.density === 'standard' || this.density === 'full';\n }\n\n private _getAriaLabel(): string {\n const msg = getMessages(this.locale);\n const timeInfo = this.time\n ? `${formatLocalizedTime(this.time.start.hour, this.time.start.minute, this.locale)} ${msg.to} ${formatLocalizedTime(this.time.end.hour, this.time.end.minute, this.locale)}`\n : msg.allDay;\n\n const contentInfo = this.content ? `, ${this.content}` : '';\n\n return `${msg.calendarEvent}: ${this.heading}${contentInfo}, ${timeInfo}. ${msg.pressToOpen}`;\n }\n\n override updated() {\n // Sync interactive attributes to :host so the focus outline wraps the\n // full absolutely-positioned entry, not just the inner .main content.\n if (!this.floatText) {\n this.tabIndex = this.accessibility?.tabIndex ?? 0;\n this.setAttribute('role', 'button');\n this.setAttribute('aria-label', this.accessibility?.ariaLabel ?? this._getAriaLabel());\n this.setAttribute('aria-selected', this._highlighted ? 'true' : 'false');\n }\n }\n\n override render() {\n const mainClass = `main ${this.density}`;\n\n if (this.displayMode === 'month-dot') {\n const isMultiDay = this.isContinuation;\n return html`\n <div\n class=${mainClass}\n title=${this._renderTitle()}\n data-full-content=${this.content || ''}\n ?data-extended=${this._extended}\n ?data-is-multi-day=${isMultiDay}\n >\n ${\n !isMultiDay\n ? html`\n <span class=\"color-dot\"></span>\n `\n : ''\n }\n <span class=\"title\">${this.heading}</span>\n ${this._renderTime()}\n </div>\n `;\n }\n\n // Float text mode: render box with floating text above\n if (this.floatText) {\n return html`\n <div\n class=${mainClass}\n style=\"background-color: var(--entry-background-color); height: 100%; position: relative; overflow: visible;\"\n >\n <div class=\"text-content\">\n <span style=\"font-weight: 500;\">${this.heading}</span>\n ${this._renderTime()}\n </div>\n </div>\n `;\n }\n\n return html`\n <div\n class=${mainClass}\n title=${this._renderTitle()}\n data-full-content=${this.content || ''}\n ?data-extended=${this._extended}\n >\n <span class=\"title\">${this.heading}</span>\n ${this._shouldShowTime() ? this._renderTime() : nothing}\n ${this._renderContent()}\n </div>\n `;\n }\n\n private _displayInterval(time?: CalendarTimeInterval) {\n if (!time) {\n return nothing;\n }\n\n const END_HOURS = 2;\n const components = [time.start.hour, time.start.minute, time.end.hour, time.end.minute];\n\n const lastsAllDay =\n components[END_HOURS] === 24 && components.reduce(this._sumReducer, 0) % 24 === 0;\n if (lastsAllDay) {\n return getMessages(this.locale).allDay;\n }\n\n return formatLocalizedTimeRange(\n time.start.hour,\n time.start.minute,\n time.end.hour,\n time.end.minute,\n this.locale,\n );\n }\n\n constructor() {\n super();\n this.addEventListener('click', this._handleInteraction);\n this.addEventListener('keydown', this._handleInteraction);\n this.addEventListener('focus', this._handleFocus);\n }\n\n /**\n * Public method to clear the selection state\n */\n public clearSelection() {\n this._highlighted = false;\n }\n\n private _handleFocus(_e: FocusEvent) {\n // When an entry receives focus via keyboard navigation,\n // clear any previously selected entries (but don't open menu)\n const clearSelectionEvent = new CustomEvent('clear-other-selections', {\n detail: { exceptEntry: this },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(clearSelectionEvent);\n }\n\n private _handleInteraction(e: Event) {\n if (e instanceof KeyboardEvent && e.key !== 'Enter' && e.key !== ' ') {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n\n if (!this._highlighted) {\n this._highlighted = true;\n\n if (!this.date) {\n return;\n }\n\n // Dispatch a custom event to communicate with the calendar\n const msg = getMessages(this.locale);\n const eventDetails = {\n heading: this.heading || msg.noTitle,\n content: this.content || msg.noContent,\n time: this.time,\n displayTime: this.time ? (this._displayInterval(this.time) as string) : msg.noTime,\n date: this.date?.start,\n anchorRect: this.getBoundingClientRect(),\n };\n\n const openMenuEvent = new CustomEvent('open-menu', {\n detail: eventDetails,\n bubbles: true,\n composed: true,\n });\n\n this.dispatchEvent(openMenuEvent);\n\n // Listen for menu close to remove highlight\n const handleMenuClose = () => {\n this._highlighted = false;\n this.removeEventListener('menu-close', handleMenuClose);\n };\n this.addEventListener('menu-close', handleMenuClose);\n }\n }\n}\n","import { LitElement, css, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { DateTime } from 'luxon';\n\nimport { getLocalizedMonth } from '../lib/localization.js';\nimport { getMessages } from '../lib/messages.js';\nimport type { ViewMode } from '../lib/ViewStateController.js';\n\n@customElement('lms-calendar-header')\nexport default class Header extends LitElement {\n @property({ type: String })\n heading?: string;\n\n @property({ type: Object })\n activeDate?: CalendarDate;\n\n @property({ type: String })\n viewMode: ViewMode = 'month';\n\n @property({ type: Object })\n expandedDate?: CalendarDate;\n\n @property({ type: String })\n locale = 'en';\n\n static override styles = css`\n :host {\n display: block;\n container-type: inline-size;\n }\n\n .controls {\n height: var(--header-height, 3.5em);\n width: 100%;\n display: grid;\n grid-template-columns: 1fr auto 1fr;\n align-items: center;\n border-bottom: 1px solid var(--separator-light);\n }\n\n .info {\n padding-left: var(--header-info-padding-left, 1em);\n text-align: right;\n display: grid;\n justify-self: start;\n min-width: 0;\n overflow: hidden;\n }\n\n @container (max-width: 600px) {\n .controls {\n font-size: small;\n height: auto;\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n padding: 0.35em 0.5em;\n gap: 0.25em 0.5em;\n }\n .info {\n flex-basis: 100%;\n display: flex;\n align-items: baseline;\n justify-content: center;\n gap: 0.4em;\n padding-left: 0;\n }\n .view-detail {\n grid-row: unset;\n grid-column: unset;\n display: none;\n }\n .view-detail.active {\n display: inline;\n }\n .buttons {\n padding-right: 0;\n }\n }\n\n .view-detail {\n grid-row: 2;\n grid-column: 1;\n visibility: hidden;\n }\n\n .view-detail.active {\n visibility: visible;\n }\n .day,\n .week,\n .month,\n .year {\n color: var(--header-text-color, rgba(0, 0, 0, 0.6));\n }\n button {\n padding: 0.4em 0.7em;\n margin: 0;\n border: none;\n background: none;\n font: inherit;\n font-size: 0.85em;\n color: var(--header-text-color, rgba(0, 0, 0, 0.6));\n cursor: pointer;\n border-radius: var(--border-radius-sm, 5px);\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n\n button:hover {\n background: var(--separator-light, rgba(0, 0, 0, 0.1));\n }\n\n .context {\n display: flex;\n align-items: center;\n gap: 0;\n background: var(--separator-light, rgba(0, 0, 0, 0.06));\n border-radius: var(--border-radius-sm, 5px);\n padding: 0.15em;\n }\n\n .context button {\n border-radius: calc(var(--border-radius-sm, 5px) - 1px);\n }\n\n .context button[data-active] {\n background: var(--background-color, white);\n color: var(--separator-dark, rgba(0, 0, 0, 0.7));\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n }\n\n .buttons {\n display: flex;\n align-items: center;\n padding-right: var(--header-buttons-padding-right, 1em);\n gap: 0.15em;\n justify-self: end;\n }\n\n .buttons .separator {\n width: 1px;\n height: 1.2em;\n background: var(--separator-light, rgba(0, 0, 0, 0.15));\n margin: 0 0.2em;\n }\n `;\n\n private _getWeekInfo(date: CalendarDate) {\n const dt = DateTime.fromObject({\n year: date.year,\n month: date.month,\n day: date.day,\n });\n\n return {\n weekNumber: dt.weekNumber,\n weekYear: dt.weekYear,\n };\n }\n\n override render() {\n const date = this.activeDate!;\n const msg = getMessages(this.locale);\n\n return html`<div class=\"controls\">\n <div class=\"info\">\n <span>\n <strong>${this.heading || msg.currentMonth}</strong>\n </span>\n <div class=\"view-detail${this.viewMode === 'day' ? ' active' : ''}\">\n <span class=\"day\">${date.day}</span>\n <span class=\"month\"\n >${getLocalizedMonth(date.month, this.locale)}</span\n >\n <span class=\"year\">${date.year}</span>\n </div>\n <div class=\"view-detail${this.viewMode === 'week' ? ' active' : ''}\">\n <span class=\"week\"\n >${msg.calendarWeek}\n ${this._getWeekInfo(date).weekNumber}</span\n >\n <span class=\"month\"\n >${getLocalizedMonth(date.month, this.locale)}</span\n >\n <span class=\"year\"\n >${this._getWeekInfo(date).weekYear}</span\n >\n </div>\n <div class=\"view-detail${this.viewMode === 'month' ? ' active' : ''}\">\n <span class=\"month\"\n >${getLocalizedMonth(date.month, this.locale)}</span\n >\n <span class=\"year\">${date.year}</span>\n </div>\n <div class=\"view-detail${this.viewMode === 'year' ? ' active' : ''}\">\n <span class=\"year\">${date.year}</span>\n </div>\n </div>\n <nav class=\"context\" aria-label=\"${msg.calendarView}\" @click=${this._dispatchSwitchView}>\n <button\n type=\"button\"\n ?data-active=${this.viewMode === 'day'}\n aria-pressed=${this.viewMode === 'day' ? 'true' : 'false'}\n data-context=\"day\"\n class=\"btn-change-view\"\n >\n ${msg.day}\n </button>\n <button\n type=\"button\"\n ?data-active=${this.viewMode === 'week'}\n aria-pressed=${this.viewMode === 'week' ? 'true' : 'false'}\n data-context=\"week\"\n class=\"btn-change-view\"\n >\n ${msg.week}\n </button>\n <button\n type=\"button\"\n ?data-active=${this.viewMode === 'month'}\n aria-pressed=${this.viewMode === 'month' ? 'true' : 'false'}\n data-context=\"month\"\n class=\"btn-change-view\"\n >\n ${msg.month}\n </button>\n <button\n type=\"button\"\n ?data-active=${this.viewMode === 'year'}\n aria-pressed=${this.viewMode === 'year' ? 'true' : 'false'}\n data-context=\"year\"\n class=\"btn-change-view\"\n >\n ${msg.year}\n </button>\n </nav>\n <div class=\"buttons\" @click=${this._dispatchSwitchDate}>\n <button type=\"button\" name=\"previous\" aria-label=\"${msg.previous}\">«</button>\n <button type=\"button\" name=\"next\" aria-label=\"${msg.next}\">»</button>\n <span class=\"separator\"></span>\n <button type=\"button\" name=\"today\" @click=${this._handleTodayClick}>\n ${msg.today}\n </button>\n </div>\n </div>`;\n }\n\n private _handleTodayClick(e: Event) {\n e.stopPropagation(); // Prevent triggering _dispatchSwitchDate\n\n const today = new Date();\n const todayDate = {\n day: today.getDate(),\n month: today.getMonth() + 1,\n year: today.getFullYear(),\n };\n\n const event = new CustomEvent('jumptoday', {\n detail: { date: todayDate },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }\n\n private _dispatchSwitchDate(e: Event) {\n const target = e.target;\n if (!(target instanceof HTMLButtonElement)) {\n return;\n }\n\n const direction = e.target === e.currentTarget ? 'container' : target.name;\n const event = new CustomEvent('switchdate', {\n detail: { direction },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }\n\n private _dispatchSwitchView(e: Event) {\n const target = e.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n const view = e.target === e.currentTarget ? 'container' : target.dataset.context;\n const event = new CustomEvent('switchview', {\n detail: { view },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }\n}\n","var g=t=>Object.fromEntries(Object.entries(t).map(([e,r])=>[r,e])),I=t=>Object.keys(t);var Ce={action:\"ACTION\",description:\"DESCRIPTION\",duration:\"DURATION\",repeat:\"REPEAT\",summary:\"SUMMARY\",trigger:\"TRIGGER\",attachments:\"ATTACH\",attendees:\"ATTENDEE\"},$e=g(Ce),hn=I($e),Kn=I(Ce);var Ne={method:\"METHOD\",prodId:\"PRODID\",version:\"VERSION\",name:\"X-WR-CALNAME\"},Ze=g(Ne),Yn=I(Ze),Bn=I(Ne);var ve={alarms:\"ALARM\",categories:\"CATEGORIES\",created:\"CREATED\",description:\"DESCRIPTION\",lastModified:\"LAST-MODIFIED\",location:\"LOCATION\",exceptionDates:\"EXDATE\",recurrenceRule:\"RRULE\",stamp:\"DTSTAMP\",start:\"DTSTART\",summary:\"SUMMARY\",uid:\"UID\",timeTransparent:\"TRANSP\",url:\"URL\",end:\"DTEND\",duration:\"DURATION\",geo:\"GEO\",class:\"CLASS\",organizer:\"ORGANIZER\",priority:\"PRIORITY\",sequence:\"SEQUENCE\",status:\"STATUS\",attach:\"ATTACH\",recurrenceId:\"RECURRENCE-ID\",attendees:\"ATTENDEE\",comment:\"COMMENT\"},Xe=g(ve),Un=I(Xe),Wn=I(ve);var Ae={id:\"TZID\",lastModified:\"LAST-MODIFIED\",url:\"TZURL\"},Qe=g(Ae),wn=I(Qe),Hn=I(Ae);var be={comment:\"COMMENT\",name:\"TZNAME\",offsetFrom:\"TZOFFSETFROM\",offsetTo:\"TZOFFSETTO\",recurrenceDate:\"RDATE\",recurrenceRule:\"RRULE\",start:\"DTSTART\"},et=g(be),Zn=I(et),Xn=I(be);var xt={byDay:\"BYDAY\",byHour:\"BYHOUR\",byMinute:\"BYMINUTE\",byMonth:\"BYMONTH\",byMonthday:\"BYMONTHDAY\",bySecond:\"BYSECOND\",bySetPos:\"BYSETPOS\",byWeekNo:\"BYWEEKNO\",byYearday:\"BYYEARDAY\",count:\"COUNT\",frequency:\"FREQ\",interval:\"INTERVAL\",until:\"UNTIL\",workweekStart:\"WKST\"},tt=g(xt),to=I(tt),ro=I(xt);var Ve={categories:\"CATEGORIES\",created:\"CREATED\",description:\"DESCRIPTION\",lastModified:\"LAST-MODIFIED\",location:\"LOCATION\",exceptionDates:\"EXDATE\",recurrenceRule:\"RRULE\",stamp:\"DTSTAMP\",start:\"DTSTART\",summary:\"SUMMARY\",uid:\"UID\",url:\"URL\",duration:\"DURATION\",geo:\"GEO\",class:\"CLASS\",organizer:\"ORGANIZER\",priority:\"PRIORITY\",sequence:\"SEQUENCE\",status:\"STATUS\",attach:\"ATTACH\",recurrenceId:\"RECURRENCE-ID\",attendees:\"ATTENDEE\",comment:\"COMMENT\",completed:\"COMPLETED\",due:\"DUE\",percentComplete:\"PERCENT-COMPLETE\"},rt=g(Ve),ao=I(rt),so=I(Ve);var Me={categories:\"CATEGORIES\",created:\"CREATED\",description:\"DESCRIPTION\",lastModified:\"LAST-MODIFIED\",exceptionDates:\"EXDATE\",recurrenceRule:\"RRULE\",stamp:\"DTSTAMP\",start:\"DTSTART\",summary:\"SUMMARY\",uid:\"UID\",url:\"URL\",geo:\"GEO\",class:\"CLASS\",organizer:\"ORGANIZER\",sequence:\"SEQUENCE\",status:\"STATUS\",attach:\"ATTACH\",recurrenceId:\"RECURRENCE-ID\",attendees:\"ATTENDEE\",comment:\"COMMENT\"},nt=g(Me),io=I(nt),po=I(Me);var ze={stamp:\"DTSTAMP\",start:\"DTSTART\",uid:\"UID\",url:\"URL\",organizer:\"ORGANIZER\",attendees:\"ATTENDEE\",comment:\"COMMENT\",end:\"DTEND\",freeBusy:\"FREEBUSY\"},ot=g(ze),yo=I(ot),lo=I(ze);var at=\"BEGIN\",st=\"END\",xe=\"VCALENDAR\",X=\"VTIMEZONE\",ct=\"STANDARD\",mt=\"DAYLIGHT\",Q=\"VEVENT\",ee=\"VALARM\",te=\"VTODO\",re=\"VJOURNAL\",ne=\"VFREEBUSY\",Io=[xe,X,ct,mt,Q,ee,te,re,ne];var it=t=>new RegExp(`${at}:${t}([\\\\s\\\\S]*?)${st}:${t}`,\"g\"),St=t=>new RegExp(`${at}:${t}|${st}:${t}`,\"g\");var Dt=/\\r\\n/,Se=/\\r\\n|\\r|\\n/,Le=`\\r\n`,pt=`\n`,gt=\":\",b=\",\",Ot='\"',oe=\";\",Vo=\" \",De=\"=\",ut=75;var _e=t=>`${t}${Le}`,f=(t,e,r)=>r?e==null?\"\":_e(`${t};${r}:${e}`):_e(`${t}:${e}`),Rt=t=>_e(`BEGIN:${t}`),Ct=t=>_e(`END:${t}`);var S=t=>{if(!(t.length<1))return`${t.map(e=>`${e.key}${De}${e.value}`).join(oe)}`};var Nt=t=>{if(t.type===\"uri\"){let e=S([t.formatType&&{key:\"FMTTYPE\",value:t.formatType}].filter(r=>!!r));return f(\"ATTACH\",t.url,e)}if(t.type===\"binary\"){let e=S([t.value&&{key:\"VALUE\",value:t.value},t.encoding&&{key:\"ENCODING\",value:t.encoding}].filter(r=>!!r));return f(\"ATTACH\",t.binary,e)}throw Error(`IcsAttachment has no type! ${JSON.stringify(t)}`)};var k=(t,e)=>e?`\"MAILTO:${t}\"`:`MAILTO:${t}`;var V=(t,e)=>{let r=S([t.dir&&{key:\"DIR\",value:`\"${t.dir}\"`},t.delegatedFrom&&{key:\"DELEGATED-FROM\",value:k(t.delegatedFrom,!0)},t.member&&{key:\"MEMBER\",value:k(t.member,!0)},t.role&&{key:\"ROLE\",value:t.role},t.name&&{key:\"CN\",value:t.name},t.partstat&&{key:\"PARTSTAT\",value:t.partstat},t.sentBy&&{key:\"SENT-BY\",value:k(t.sentBy,!0)},t.rsvp!==void 0&&(t.rsvp===!0||t.rsvp===!1)&&{key:\"RSVP\",value:t.rsvp===!0?\"TRUE\":\"FALSE\"}].filter(n=>!!n));return f(e,k(t.email),r)};var M=t=>{if(Object.values(t).filter(r=>typeof r==\"number\").length===0)return;let e=\"\";return t.before&&(e+=\"-\"),e+=\"P\",t.weeks!==void 0&&(e+=`${t.weeks}W`),t.days!==void 0&&(e+=`${t.days}D`),(t.hours!==void 0||t.minutes!==void 0||t.seconds!==void 0)&&(e+=\"T\",t.hours!==void 0&&(e+=`${t.hours}H`),t.minutes!==void 0&&(e+=`${t.minutes}M`),t.seconds!==void 0&&(e+=`${t.seconds}S`)),e};var mn=Math.pow(10,8)*24*60*60*1e3,qo=-mn,vt=6048e5,At=864e5,ce=6e4,me=36e5;var pn=3600;var bt=pn*24,$o=bt*7,un=bt*365.2425,dn=un/12,Zo=dn*3,dt=Symbol.for(\"constructDateFrom\");function x(t,e){return typeof t==\"function\"?t(e):t&&typeof t==\"object\"&&dt in t?t[dt](e):t instanceof Date?new t.constructor(e):new Date(e)}function i(t,e){return x(e||t,t)}function Y(t,e,r){let n=i(t,r==null?void 0:r.in);return isNaN(e)?x((r==null?void 0:r.in)||t,NaN):(e&&n.setDate(n.getDate()+e),n)}function he(t,e,r){let n=i(t,r==null?void 0:r.in);if(isNaN(e))return x((r==null?void 0:r.in)||t,NaN);if(!e)return n;let o=n.getDate(),s=x((r==null?void 0:r.in)||t,n.getTime());s.setMonth(n.getMonth()+e+1,0);let a=s.getDate();return o>=a?s:(n.setFullYear(s.getFullYear(),s.getMonth(),o),n)}function z(t,e,r){return x((r==null?void 0:r.in)||t,+i(t)+e)}function Ke(t,e,r){return z(t,e*me,r)}var fn={};function B(){return fn}function ae(t,e){var c,m,p,d;let r=B(),n=(e==null?void 0:e.weekStartsOn)??((m=(c=e==null?void 0:e.locale)==null?void 0:c.options)==null?void 0:m.weekStartsOn)??r.weekStartsOn??((d=(p=r.locale)==null?void 0:p.options)==null?void 0:d.weekStartsOn)??0,o=i(t,e==null?void 0:e.in),s=o.getDay(),a=(s<n?7:0)+s-n;return o.setDate(o.getDate()-a),o.setHours(0,0,0,0),o}function ft(t){let e=i(t),r=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()));return r.setUTCFullYear(e.getFullYear()),+t-+r}function F(t,...e){let r=x.bind(null,t||e.find(n=>typeof n==\"object\"));return e.map(r)}function ge(t,e){let r=i(t,e==null?void 0:e.in);return r.setHours(0,0,0,0),r}function Vt(t,e,r){let[n,o]=F(r==null?void 0:r.in,t,e),s=ge(n),a=ge(o),c=+s-ft(s),m=+a-ft(a);return Math.round((c-m)/At)}function ie(t,e,r){let n=i(t,r==null?void 0:r.in);return n.setTime(n.getTime()+e*ce),n}function Pe(t,e,r){return z(t,e*1e3,r)}function j(t,e,r){return Y(t,e*7,r)}function ke(t,e,r){return he(t,e*12,r)}function pe(t,e){let r=+i(t)-+i(e);return r<0?-1:r>0?1:r}function Ye(t){return t instanceof Date||typeof t==\"object\"&&Object.prototype.toString.call(t)===\"[object Date]\"}function Be(t,e,r){let[n,o]=F(r==null?void 0:r.in,t,e),s=Mt(n,o),a=Math.abs(Vt(n,o));n.setDate(n.getDate()-s*a);let c=+(Mt(n,o)===-s),m=s*(a-c);return m===0?0:m}function Mt(t,e){let r=t.getFullYear()-e.getFullYear()||t.getMonth()-e.getMonth()||t.getDate()-e.getDate()||t.getHours()-e.getHours()||t.getMinutes()-e.getMinutes()||t.getSeconds()-e.getSeconds()||t.getMilliseconds()-e.getMilliseconds();return r<0?-1:r>0?1:r}function U(t){return e=>{let n=(t?Math[t]:Math.trunc)(e);return n===0?0:n}}function zt(t,e,r){let[n,o]=F(r==null?void 0:r.in,t,e),s=(+n-+o)/me;return U(r==null?void 0:r.roundingMethod)(s)}function Fe(t,e){return+i(t)-+i(e)}function Lt(t,e,r){let n=Fe(t,e)/ce;return U(r==null?void 0:r.roundingMethod)(n)}function yt(t,e){let r=i(t,e==null?void 0:e.in),n=r.getMonth();return r.setFullYear(r.getFullYear(),n+1,0),r.setHours(23,59,59,999),r}function _t(t,e,r){let n=Fe(t,e)/1e3;return U(r==null?void 0:r.roundingMethod)(n)}function ht(t,e,r){let n=Be(t,e,r)/7;return U(r==null?void 0:r.roundingMethod)(n)}function Kt(t,e){let[r,n]=F(t,e.start,e.end);return{start:r,end:n}}function Pt(t,e){let{start:r,end:n}=Kt(e==null?void 0:e.in,t),o=+r>+n,s=o?+r:+n,a=o?n:r;a.setHours(0,0,0,0);let c=(e==null?void 0:e.step)??1;if(!c)return[];c<0&&(c=-c,o=!o);let m=[];for(;+a<=s;)m.push(x(r,a)),a.setDate(a.getDate()+c),a.setHours(0,0,0,0);return o?m.reverse():m}function lt(t,e){let r=i(t,e==null?void 0:e.in);return r.setDate(1),r.setHours(0,0,0,0),r}function kt(t,e){let r=i(t,e==null?void 0:e.in),n=r.getFullYear();return r.setFullYear(n+1,0,0),r.setHours(23,59,59,999),r}function Yt(t,e){let r=i(t,e==null?void 0:e.in);return r.setFullYear(r.getFullYear(),0,1),r.setHours(0,0,0,0),r}function Bt(t,e){var d,l,E,v;let r=i(t,e==null?void 0:e.in),n=r.getFullYear(),o=B(),s=(e==null?void 0:e.firstWeekContainsDate)??((l=(d=e==null?void 0:e.locale)==null?void 0:d.options)==null?void 0:l.firstWeekContainsDate)??o.firstWeekContainsDate??((v=(E=o.locale)==null?void 0:E.options)==null?void 0:v.firstWeekContainsDate)??1,a=x((e==null?void 0:e.in)||t,0);a.setFullYear(n+1,0,s),a.setHours(0,0,0,0);let c=ae(a,e),m=x((e==null?void 0:e.in)||t,0);m.setFullYear(n,0,s),m.setHours(0,0,0,0);let p=ae(m,e);return+r>=+c?n+1:+r>=+p?n:n-1}function Ft(t,e){var c,m,p,d;let r=B(),n=(e==null?void 0:e.firstWeekContainsDate)??((m=(c=e==null?void 0:e.locale)==null?void 0:c.options)==null?void 0:m.firstWeekContainsDate)??r.firstWeekContainsDate??((d=(p=r.locale)==null?void 0:p.options)==null?void 0:d.firstWeekContainsDate)??1,o=Bt(t,e),s=x((e==null?void 0:e.in)||t,0);return s.setFullYear(o,0,n),s.setHours(0,0,0,0),ae(s,e)}function jt(t,e){let r=i(t,e==null?void 0:e.in),n=+ae(r,e)-+Ft(r,e);return Math.round(n/vt)+1}function Oe(t,e){return i(t,e==null?void 0:e.in).getDay()}function je(t,e){let r=i(t,e==null?void 0:e.in),n=r.getFullYear(),o=r.getMonth(),s=x(r,0);return s.setFullYear(n,o+1,0),s.setHours(0,0,0,0),s.getDate()}function Ut(t,e){return i(t,e==null?void 0:e.in).getHours()}function Wt(t,e){return i(t,e==null?void 0:e.in).getMinutes()}function Ue(t,e){return i(t,e==null?void 0:e.in).getMonth()}function Gt(t){return i(t).getSeconds()}function Jt(t,e){return i(t,e==null?void 0:e.in).getFullYear()}function wt(t,e){return+i(t)==+i(e)}function Ht(t,e,r){let n=i(t,r==null?void 0:r.in),o=jt(n,r)-e;return n.setDate(n.getDate()-o*7),i(n,r==null?void 0:r.in)}function Re(t,e,r){var l,E,v,D;let n=B(),o=(r==null?void 0:r.weekStartsOn)??((E=(l=r==null?void 0:r.locale)==null?void 0:l.options)==null?void 0:E.weekStartsOn)??n.weekStartsOn??((D=(v=n.locale)==null?void 0:v.options)==null?void 0:D.weekStartsOn)??0,s=i(t,r==null?void 0:r.in),a=s.getDay(),m=(e%7+7)%7,p=7-o,d=e<0||e>6?e-(a+p)%7:(m+p)%7-(a+p)%7;return Y(s,d,r)}function We(t,e,r){let n=+i(t,r==null?void 0:r.in),[o,s]=[+i(e.start,r==null?void 0:r.in),+i(e.end,r==null?void 0:r.in)].sort((a,c)=>a-c);return n>=o&&n<=s}function qt(t){let e=t/me;return Math.trunc(e)}function $t(t){let e=t/ce;return Math.trunc(e)}function Zt(t,e,r){let n=i(t,r==null?void 0:r.in),o=n.getFullYear(),s=n.getDate(),a=x((r==null?void 0:r.in)||t,0);a.setFullYear(o,e,15),a.setHours(0,0,0,0);let c=je(a);return n.setMonth(e,Math.min(s,c)),n}function Xt(t,e,r){let n=i(t,r==null?void 0:r.in);return n.setDate(e),n}function Qt(t,e,r){let n=i(t,r==null?void 0:r.in);return n.setMonth(0),n.setDate(e),n}function er(t,e,r){let n=i(t,r==null?void 0:r.in);return n.setHours(e),n}function tr(t,e,r){let n=i(t,r==null?void 0:r.in);return n.setMinutes(e),n}function rr(t,e,r){let n=i(t,r==null?void 0:r.in);return n.setSeconds(e),n}function nr(t,e,r){return z(t,-e,r)}function or(t,e,r){return j(t,-e,r)}var Mc=(t,e)=>{let r=Math.abs(ht(e,t)),n=Math.abs(Be(e,t)),o=n-r*7,s=Math.abs(zt(e,t)),a=s-n*24,c=Math.abs(Lt(e,t)),m=c-s*60,d=Math.abs(_t(e,t))-c*60;return{before:t>e,weeks:r,days:o,hours:a,minutes:m,seconds:d}};var ar=(t,e)=>{let r=e.before?-1:1,n=(e.seconds||0)*r,o=(e.minutes||0)*r,s=(e.hours||0)*r,a=(e.days||0)*r,c=(e.weeks||0)*r;return j(Y(Ke(ie(Pe(t,n),o),s),a),c)};var Yc=t=>t.end?t.end.date:ar(t.start.date,t.duration);var Fc=[\"PUBLISH\"],jc=[\"2.0\"];var sr=[ct,mt];var Jc=[\"FREE\",\"BUSY\",\"BUSY-UNAVAILABLE\",\"BUSY-TENTATIVE\"];var om=[\"BASE64\"],am=[\"BINARY\"];var cm=[\"NEEDS-ACTION\",\"ACCEPTED\",\"DECLINED\",\"TENTATIVE\",\"DELEGATED\"];var im=[\"DATE\",\"DATE-TIME\"];var cr=[\"SECONDLY\",\"MINUTELY\",\"HOURLY\",\"DAILY\",\"WEEKLY\",\"MONTHLY\",\"YEARLY\"];var dm=[\"TENTATIVE\",\"CONFIRMED\",\"CANCELLED\"],fm=[\"NEEDS-ACTION\",\"COMPLETED\",\"IN-PROGRESS\",\"CANCELLED\"],ym=[\"DRAFT\",\"FINAL\",\"CANCELLED\"];var Tm=[\"START\",\"END\"];var Ge=[\"SU\",\"MO\",\"TU\",\"WE\",\"TH\",\"FR\",\"SA\"];var xm=[\"PRIVATE\",\"PUBLIC\",\"CONFIDENTIAL\"];var Dm=[\"TRANSPARENT\",\"OPAQUE\"];var ue=(t,e)=>e===void 0?!1:t>=e,mr=(t,{start:e,end:r},n)=>{if(ue(n.length,t.count))return;let o=t.frequency,s=t.interval||1;if(!o)return;let a=e;if(o===\"SECONDLY\"){for(;a<r;){if(ue(n.length,t.count))return;a=Pe(a,s),n.push([a])}return}if(o===\"MINUTELY\"){for(;a<r;){if(ue(n.length,t.count))return;a=ie(a,s),n.push([a])}return}if(o===\"HOURLY\"){for(;a<r;){if(ue(n.length,t.count))return;a=Ke(a,s),n.push([a])}return}if(o===\"DAILY\"){for(;a<r;){if(ue(n.length,t.count))return;a=Y(a,s),n.push([a])}return}if(o===\"WEEKLY\"){for(;a<r;){if(ue(n.length,t.count))return;a=j(a,s),n.push([a])}return}if(o===\"MONTHLY\"){for(;a<r;)a=he(a,s),n.push([a]);return}if(o===\"YEARLY\"){for(;a<r;)a=ke(a,s),n.push([a]);return}};var ir=(t,e,r,n)=>{let o=r.map(({day:s,occurrence:a})=>({occurrence:a,day:Ge.indexOf(s)}));return t.frequency===\"YEARLY\"?t.byYearday||t.byMonthday?e.map(s=>s.filter(a=>o.find(({day:c})=>c===Oe(a)))):t.byWeekNo?e.map(s=>s.flatMap(a=>o.map(({day:c})=>Re(a,c,{weekStartsOn:n})))):t.byMonth?e.map(s=>s.flatMap(a=>o.flatMap(({day:c,occurrence:m})=>Tt(W(lt(a)),W(yt(a)),c,n,m)))):e.map(s=>s.flatMap(a=>o.flatMap(({day:c,occurrence:m})=>Tt(W(Yt(a)),W(kt(a)),c,n,m)))):t.frequency===\"MONTHLY\"?t.byMonthday?e.map(s=>s.filter(a=>o.find(({day:c})=>c===Oe(a)))):e.map(s=>s.flatMap(a=>o.flatMap(({day:c,occurrence:m})=>Tt(W(lt(a)),W(yt(a)),c,n,m)))):t.frequency===\"WEEKLY\"?e.map(s=>s.flatMap(a=>o.map(({day:c})=>Re(a,c,{weekStartsOn:n})))):e.map(s=>s.filter(a=>o.find(({day:c})=>c===Oe(a))))},Tt=(t,e,r,n,o)=>{if(o!==void 0){if(!(o<0)){let d=Re(t,r,{weekStartsOn:n}),l=t>d;return j(d,(o||1)-1+(l?1:0))}let c=Re(e,r,{weekStartsOn:n}),m=e<c;return W(ge(or(c,-(o||1)-1+(m?1:0))))}return Pt({start:t,end:e}).map(a=>W(a)).filter(a=>We(a,{start:t,end:e})).filter(a=>r===Oe(a))},W=t=>ie(t,-t.getTimezoneOffset());var pr=(t,e,r)=>t.frequency===\"YEARLY\"||t.frequency===\"MONTHLY\"||t.frequency===\"WEEKLY\"||t.frequency===\"DAILY\"?e.map(n=>n.flatMap(o=>r.map(s=>er(o,s)))):e.map(n=>n.filter(o=>r.includes(Ut(o))));var ur=(t,e,r)=>t.frequency===\"YEARLY\"||t.frequency===\"MONTHLY\"||t.frequency===\"WEEKLY\"||t.frequency===\"DAILY\"||t.frequency===\"HOURLY\"?e.map(n=>n.flatMap(o=>r.map(s=>tr(o,s)))):e.map(n=>n.filter(o=>r.includes(Wt(o))));var dr=(t,e,r)=>t.frequency===\"YEARLY\"?e.map(n=>n.flatMap(o=>r.map(s=>Zt(o,s)))):e.map(n=>n.filter(o=>r.includes(Ue(o))));var fr=(t,e,r)=>t.frequency===\"YEARLY\"||t.frequency===\"MONTHLY\"?e.map(n=>n.flatMap(o=>{let s=je(o);return r.map(a=>a>s?void 0:Xt(o,a)).filter(a=>!!a)})):t.frequency===\"WEEKLY\"?e:e.map(n=>n.filter(o=>r.includes(Ue(o))));var yr=(t,e,r)=>t.frequency===\"YEARLY\"||t.frequency===\"MONTHLY\"||t.frequency===\"WEEKLY\"||t.frequency===\"DAILY\"||t.frequency===\"HOURLY\"||t.frequency===\"MINUTELY\"?e.map(n=>n.flatMap(o=>r.map(s=>rr(o,s)))):e.map(n=>n.filter(o=>r.includes(Gt(o))));var lr=(t,e,r)=>!t.byYearday&&!t.byWeekNo&&!t.byMonthday&&!t.byMonth&&!t.byDay&&!t.byHour&&!t.byMinute&&!t.bySecond?e:e.map(n=>n.sort(pe).filter((o,s)=>r.some(a=>a>0?s===0?!1:s%a===0:s===0?n.length-1+a===0:s%(n.length-1+a)===0)));var Tr=(t,e,r,n)=>t.frequency===\"YEARLY\"?e.map(o=>o.flatMap(s=>r.map(a=>Ht(s,a,{weekStartsOn:n})))):e;var Ir=(t,e,r)=>t.frequency===\"YEARLY\"?e.map(n=>n.flatMap(o=>r.map(s=>Qt(o,s)))):t.frequency===\"MONTHLY\"||t.frequency===\"WEEKLY\"||t.frequency===\"DAILY\"?e:e.map(n=>n.filter(o=>r.includes(Jt(o))));var Er=(t,e,r)=>{let n=r;return t.byMonth&&(n=dr(t,n,t.byMonth)),t.byWeekNo&&(n=Tr(t,n,t.byWeekNo,e.weekStartsOn)),t.byYearday&&(n=Ir(t,n,t.byYearday)),t.byMonthday&&(n=fr(t,n,t.byMonthday)),t.byDay&&(n=ir(t,n,t.byDay,e.weekStartsOn)),t.byHour&&(n=pr(t,n,t.byHour)),t.byMinute&&(n=ur(t,n,t.byMinute)),t.bySecond&&(n=yr(t,n,t.bySecond)),t.bySetPos&&(n=lr(t,n,t.bySetPos)),n.map(s=>s.sort(pe).filter(a=>!(e.exceptions.length>0&&e.exceptions.some(c=>wt(c,a))||!We(a,{start:e.start,end:e.end}))))};var yn=2,xr=(t,e)=>{var p;let r=e.start,n=((p=t.until)==null?void 0:p.date)||(e==null?void 0:e.end)||ke(r,yn),o=e.exceptions||[],s=(t.workweekStart?Ge.indexOf(t.workweekStart):1)%7,a=[[r]];mr(t,{start:r,end:n},a);let c=Er(t,{start:r,end:n,exceptions:o,weekStartsOn:s},a);return t.count?c.flat().splice(0,t.count):c.flat()};var Sr=(t,e)=>e.flatMap(r=>!r.recurrenceRule||r.recurrenceRule.until&&r.recurrenceRule.until.date<t?r:xr(r.recurrenceRule,{start:r.start,end:t}).map(o=>({...r,start:o})));var se=t=>{let e=t[0]===\"+\"?1:-1,r=Number(t.slice(1,3)),n=t.length>3?Number(t.slice(3,5)):0,o=t.length>5?Number(t.slice(5,7)):0;return((r*60+n)*60+o)*1e3*e};var Dr=(t,e)=>{let r=\"en-US\",n=new Date(e.toLocaleString(r,{timeZone:\"UTC\"}));try{return new Date(e.toLocaleString(r,{timeZone:t})).getTime()-n.getTime()}catch{return e.getTime()-n.getTime()}};var Je=(t,e,r)=>{let n=r==null?void 0:r.find(s=>s.id===e);if(n){let s=Sr(t,n.props).sort((m,p)=>pe(m.start,p.start));for(let m=0;m<s.length;m+=1)if(t<s[m].start){let p=s[m-1]?s[m-1].offsetTo:s[m].offsetFrom,d=p.length>5?p.substring(0,5):p;return{offset:d,milliseconds:se(d)}}let a=s[s.length-1].offsetTo,c=a.length>5?a.substring(0,5):a;return{offset:c,milliseconds:se(c)}}let o=Dr(e,t);if(!Number.isNaN(o)){let s=o<0,a=Math.abs(qt(o)),c=Math.abs($t(o))-a*60,m=a.toString().length===1?`0${a}`:a.toString(),p=c.toString().length===1?`0${c}`:c.toString();return{offset:`${s?\"-\":\"+\"}${m}${p}`,milliseconds:o}}};var we=t=>{if(!Ye(t))throw Error(`Incorrect date object: ${t}`);let e=t.toISOString(),r=e.slice(0,4),n=e.slice(5,7),o=e.slice(8,10);return`${r}${n}${o}`},A=t=>{if(!Ye(t))throw Error(`Incorrect date object: ${t}`);return It(t)},gr=(t,e,r)=>{let n=e.date;if(!Ye(n))throw Error(`Incorrect date object: ${n}`);return Je(n,e.timezone,r)?It(n,!0):A(t)},It=(t,e)=>{let r=t.toISOString(),n=r.slice(0,4),o=r.slice(5,7),s=r.slice(8,10),a=r.slice(11,13),c=r.slice(14,16),m=r.slice(17,19);return`${n}${o}${s}T${a}${c}${m}${e?\"\":\"Z\"}`},Or=(t,e)=>{let r=se(e),n=z(t,r);return It(n,!0)};var Rr=t=>{var r,n;let e=S([((r=t.options)==null?void 0:r.related)&&{key:\"RELATED\",value:t.options.related}].filter(o=>!!o));if(t.type===\"absolute\")return f(\"TRIGGER\",A((n=t.value)==null?void 0:n.date));if(t.type===\"relative\")return f(\"TRIGGER\",M(t.value),e)};var He=t=>Object.keys(t);var Cr=(t,e)=>{if(!t)return\"\";let r=\"\";return Object.entries(t).forEach(([n,o])=>{let s=e==null?void 0:e[n];if(!s){r+=f(ln(n),o==null?void 0:o.toString());return}let a=s.generate(o);a&&(r+=f(s.name,a.value,a.options?S(Object.entries(a.options).map(([c,m])=>({key:c,value:m}))):void 0))}),r},ln=t=>{let e=\"X-\";for(let r of t)r===r.toUpperCase()&&(e+=\"-\"),e+=r.toUpperCase();return e};var Tn=t=>{let e=(t.match(/\\n/g)||[]).length;return t.length+e},Nr=t=>{let e=t.split(Dt),r=[];return e.forEach(n=>{if(Tn(n)<75){r.push(n);return}In(n,75).forEach(o=>{r.push(o)})}),r.join(Le)},In=(t,e)=>{let r=[],n=\"\",o=0;for(let s=0;s<t.length;s++){let a=t[s],m=a===`\n`?2:1;o+m>e?(r.push(r.length===0?n:` ${n}`),n=a,o=m):(n+=a,o+=m)}return n&&r.push(r.length===0?n:` ${n}`),r};var O=(t,e)=>{let r=He(t),n=e.childComponents,o=n?He(n):[],s=e.generateArrayValues,a=s?He(s):[],c=\"\";return c+=Rt(e.icsComponent),r.forEach(m=>{if(o.includes(m)||a.includes(m)||m===\"nonStandard\")return;let p=e.icsKeyMap[m];if(!p)return;let d=t[m];if(d==null)return;let l=e.generateValues[m];if(l){c+=l({icsKey:p,value:d,key:m});return}c+=f(p,String(d))}),n&&o&&o.length>0&&o.forEach(m=>{let p=t[m];!p||!Array.isArray(p)||p.length===0||p.forEach(d=>{let l=n[m];l&&(c+=l(d))})}),s&&a&&a.length>0&&a.forEach(m=>{let p=s[m];if(!p)return;let d=e.icsKeyMap[m];if(!d)return;let l=t[m];!l||!Array.isArray(l)||l.length===0||l.forEach(E=>{c+=p({icsKey:d,value:E})})}),t.nonStandard&&(c+=Cr(t.nonStandard,e==null?void 0:e.nonStandard)),c+=Ct(e.icsComponent),e!=null&&e.skipFormatLines?c:Nr(c)};var h=(t,e)=>f(t,Math.trunc(e).toString());var vr=(t,e)=>O(t,{icsComponent:ee,icsKeyMap:Ce,generateValues:{trigger:({value:r})=>Rr(r),duration:({icsKey:r,value:n})=>f(r,M(n)),repeat:({icsKey:r,value:n})=>h(r,n)},generateArrayValues:{attendees:({value:r})=>V(r,\"ATTENDEE\"),attachments:({value:r})=>Nt(r)},nonStandard:e==null?void 0:e.nonStandard,skipFormatLines:e==null?void 0:e.skipFormatLines});var T=(t,e,r=[],n)=>{let o=S([e.type&&{key:\"VALUE\",value:e.type},e.local&&!(n!=null&&n.forceUtc)&&{key:\"TZID\",value:e.local.timezone},...r].filter(a=>!!a)),s=e.type===\"DATE\"?we(e.date):e.local&&!(n!=null&&n.forceUtc)?gr(e.date,e.local,n==null?void 0:n.timezones):A(e.date);return f(t,s,o)};var de=(t,e,r)=>T(e,t,void 0,r);var G=t=>{let e=S([t.dir&&{key:\"DIR\",value:`\"${t.dir}\"`},t.name&&{key:\"CN\",value:t.name},t.sentBy&&{key:\"SENT-BY\",value:k(t.sentBy)}].filter(r=>!!r));return f(\"ORGANIZER\",k(t.email),e)};var Ar=t=>t.occurrence?`${t.occurrence}${t.day}`:t.day;var J=t=>{var n;let e=\"\",r=S([t.frequency&&{key:\"FREQ\",value:t.frequency},t.byDay&&{key:\"BYDAY\",value:t.byDay.map(o=>Ar(o)).join(\",\")},t.byHour&&{key:\"BYHOUR\",value:t.byHour.join(\",\")},t.byMinute&&{key:\"BYMINUTE\",value:t.byMinute.join(\",\")},t.byMonth&&{key:\"BYMONTH\",value:t.byMonth.map(o=>o+1).join(\",\")},t.byMonthday&&{key:\"BYMONTHDAY\",value:t.byMonthday.join(\",\")},t.bySecond&&{key:\"BYSECOND\",value:t.bySecond.join(\",\")},t.bySetPos&&{key:\"BYSETPOS\",value:t.bySetPos.join(\",\")},t.byWeekNo&&{key:\"BYWEEKNO\",value:t.byWeekNo.join(\",\")},t.byYearday&&{key:\"BYYEARDAY\",value:t.byYearday.join(\",\")},t.count&&{key:\"COUNT\",value:t.count.toString()},t.interval&&{key:\"INTERVAL\",value:t.interval.toString()},t.until&&{key:\"UNTIL\",value:t.until.type===\"DATE\"?we(t.until.date):A(((n=t.until.local)==null?void 0:n.date)||t.until.date)},t.workweekStart&&{key:\"WKST\",value:t.workweekStart}].filter(o=>!!o));return e+=f(\"RRULE\",r),e};var fe=(t,e)=>{let r=\"\";return r+=T(\"RECURRENCE-ID\",t.value,t.range?[{key:\"RANGE\",value:t.range}]:void 0,e),r};var br=t=>t.replace(/([\\\\;,])|(\\n)/g,(e,r)=>r?`\\\\${r}`:\"\\\\n\");var R=(t,e,r)=>f(t,br(e),r?S(r):void 0);var Vr=(t,e)=>O(t,{icsComponent:Q,icsKeyMap:ve,omitGenerateKeys:[\"descriptionAltRep\"],generateValues:{stamp:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones,forceUtc:!0}),start:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),end:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),created:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),lastModified:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),categories:({icsKey:r,value:n})=>f(r,n.join(\",\")),description:({icsKey:r,value:n})=>R(r,n,t.descriptionAltRep?[{key:\"ALTREP\",value:`\"${t.descriptionAltRep}\"`}]:void 0),location:({icsKey:r,value:n})=>R(r,n),comment:({icsKey:r,value:n})=>R(r,n),summary:({icsKey:r,value:n})=>R(r,n),recurrenceRule:({value:r})=>J(r),duration:({icsKey:r,value:n})=>f(r,M(n)),organizer:({value:r})=>G(r),sequence:({icsKey:r,value:n})=>h(r,n),recurrenceId:({value:r})=>fe(r,{timezones:e==null?void 0:e.timezones})},generateArrayValues:{attendees:({value:r})=>V(r,\"ATTENDEE\"),exceptionDates:({value:r})=>de(r,\"EXDATE\",{timezones:e==null?void 0:e.timezones})},childComponents:{alarms:r=>vr(r,{nonStandard:e==null?void 0:e.nonStandard,skipFormatLines:!0})},nonStandard:e==null?void 0:e.nonStandard,skipFormatLines:e==null?void 0:e.skipFormatLines,timezones:e==null?void 0:e.timezones});var Mr=(t,e)=>O(t,{icsComponent:t.type,icsKeyMap:be,generateValues:{start:({icsKey:r,value:n})=>f(r,Or(n,t.offsetTo)),recurrenceRule:({value:r})=>J(r),recurrenceDate:({icsKey:r,value:n})=>T(r,n)},omitGenerateKeys:[\"type\"],nonStandard:e==null?void 0:e.nonStandard,skipFormatLines:e==null?void 0:e.skipFormatLines});var zr=(t,e)=>O(t,{icsComponent:X,icsKeyMap:Ae,generateValues:{lastModified:({icsKey:r,value:n})=>f(r,A(n))},childComponents:{props:r=>Mr(r,{nonStandard:e==null?void 0:e.nonStandard,skipFormatLines:!0})},nonStandard:e==null?void 0:e.nonStandard,skipFormatLines:e==null?void 0:e.skipFormatLines});var Lr=(t,e)=>O(t,{icsComponent:te,icsKeyMap:Ve,generateValues:{stamp:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones,forceUtc:!0}),start:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),due:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),created:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),lastModified:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),completed:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),categories:({icsKey:r,value:n})=>f(r,n.join(\",\")),description:({icsKey:r,value:n})=>R(r,n),location:({icsKey:r,value:n})=>R(r,n),comment:({icsKey:r,value:n})=>R(r,n),summary:({icsKey:r,value:n})=>R(r,n),recurrenceRule:({value:r})=>J(r),duration:({icsKey:r,value:n})=>f(r,M(n)),organizer:({value:r})=>G(r),sequence:({icsKey:r,value:n})=>h(r,n),percentComplete:({icsKey:r,value:n})=>h(r,n),recurrenceId:({value:r})=>fe(r,{timezones:e==null?void 0:e.timezones})},generateArrayValues:{attendees:({value:r})=>V(r,\"ATTENDEE\"),exceptionDates:({value:r})=>de(r,\"EXDATE\",{timezones:e==null?void 0:e.timezones})},nonStandard:e==null?void 0:e.nonStandard,skipFormatLines:e==null?void 0:e.skipFormatLines,timezones:e==null?void 0:e.timezones});var _r=(t,e)=>O(t,{icsComponent:re,icsKeyMap:Me,generateValues:{stamp:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones,forceUtc:!0}),start:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),created:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),lastModified:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),categories:({icsKey:r,value:n})=>f(r,n.join(\",\")),description:({icsKey:r,value:n})=>R(r,n),comment:({icsKey:r,value:n})=>R(r,n),summary:({icsKey:r,value:n})=>R(r,n),recurrenceRule:({value:r})=>J(r),organizer:({value:r})=>G(r),sequence:({icsKey:r,value:n})=>h(r,n),recurrenceId:({value:r})=>fe(r,{timezones:e==null?void 0:e.timezones})},generateArrayValues:{attendees:({value:r})=>V(r,\"ATTENDEE\"),exceptionDates:({value:r})=>de(r,\"EXDATE\",{timezones:e==null?void 0:e.timezones})},nonStandard:e==null?void 0:e.nonStandard,skipFormatLines:e==null?void 0:e.skipFormatLines,timezones:e==null?void 0:e.timezones});var hr=(t,e)=>{let r=t.values.map(o=>`${A(o.start)}/${o.end?A(o.end):M(o.duration)}`).join(\",\"),n=S([t.type&&{key:\"FBTYPE\",value:t.type}].filter(o=>!!o));return f(e,r,n)};var Kr=(t,e)=>O(t,{icsComponent:ne,icsKeyMap:ze,generateValues:{stamp:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones,forceUtc:!0}),start:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),end:({icsKey:r,value:n})=>T(r,n,void 0,{timezones:e==null?void 0:e.timezones}),comment:({icsKey:r,value:n})=>R(r,n),organizer:({value:r})=>G(r)},generateArrayValues:{attendees:({value:r})=>V(r,\"ATTENDEE\"),freeBusy:({value:r})=>hr(r,\"FREEBUSY\")},nonStandard:e==null?void 0:e.nonStandard,skipFormatLines:e==null?void 0:e.skipFormatLines,timezones:e==null?void 0:e.timezones});var Vd=(t,e)=>O(t,{icsComponent:xe,icsKeyMap:Ne,generateValues:{},childComponents:{timezones:r=>zr(r,{nonStandard:e==null?void 0:e.nonStandard,skipFormatLines:!0}),events:r=>Vr(r,{skipFormatLines:!0,timezones:t.timezones,nonStandard:e==null?void 0:e.nonStandard}),todos:r=>Lr(r,{skipFormatLines:!0,timezones:t.timezones,nonStandard:e==null?void 0:e.nonStandard}),journals:r=>_r(r,{skipFormatLines:!0,timezones:t.timezones,nonStandard:e==null?void 0:e.nonStandard}),freeBusy:r=>Kr(r,{skipFormatLines:!0,timezones:t.timezones,nonStandard:e==null?void 0:e.nonStandard})},nonStandard:e==null?void 0:e.nonStandard});var u=(t,e)=>{if(t===void 0)return e;let r=t[\"~standard\"].validate(e);if(r instanceof Promise)throw new TypeError(\"Schema validation must be synchronous\");if(r.issues)throw new Error(JSON.stringify(r.issues,null,2));return r.value};var Pr=(t,e)=>{var n,o,s,a;let r=((n=e.options)==null?void 0:n.VALUE)===\"BINARY\"?{type:\"binary\",encoding:((o=e.options)==null?void 0:o.ENCODING)||\"BASE64\",binary:e.value,value:(s=e.options)==null?void 0:s.VALUE}:{type:\"uri\",url:e.value,formatType:(a=e.options)==null?void 0:a.FMTTYPE};return u(t,r)};var w=t=>t.replace(/mailto:/gi,\"\");var L=(t,e)=>{var r,n,o,s,a,c,m,p,d,l,E;return u(t,{email:w(e.value),delegatedFrom:(r=e.options)!=null&&r[\"DELEGATED-FROM\"]?w((n=e.options)==null?void 0:n[\"DELEGATED-FROM\"]):void 0,dir:(o=e.options)==null?void 0:o.DIR,member:(s=e.options)!=null&&s.MEMBER?w(e.options.MEMBER):void 0,name:(a=e.options)==null?void 0:a.CN,partstat:(c=e.options)==null?void 0:c.PARTSTAT,role:(m=e.options)==null?void 0:m.ROLE,sentBy:(p=e.options)!=null&&p[\"SENT-BY\"]?w(e.options[\"SENT-BY\"]):void 0,rsvp:(d=e.options)!=null&&d.RSVP?((l=e.options)==null?void 0:l.RSVP)===\"TRUE\"?!0:((E=e.options)==null?void 0:E.RSVP)===\"FALSE\"?!1:void 0:void 0})};var _=(t,e)=>{let r=e.value,n={};r[0]===\"-\"&&(n.before=!0,r=r.slice(1)),r=r.slice(1);let o=r.split(\"T\"),s=o[0];if(s.includes(\"D\")){let[c,m]=s.split(\"D\");n.days=Number(c),s=m}if(s.includes(\"W\")){let[c,m]=s.split(\"W\");n.weeks=Number(c),s=m}let a=o[1];if(a){if(a.includes(\"H\")){let[c,m]=a.split(\"H\");n.hours=Number(c),a=m}if(a.includes(\"M\")){let[c,m]=a.split(\"M\");n.minutes=Number(c),a=m}if(a.includes(\"S\")){let[c,m]=a.split(\"S\");n.seconds=Number(c),a=m}}return u(t,n)};var kr=(t,e)=>{let r=Number.parseInt(e.value.slice(0,4),10),n=Number.parseInt(e.value.slice(4,6),10)-1,o=Number.parseInt(e.value.slice(6,8),10),s=new Date(Date.UTC(r,n,o));return u(t,s)},H=(t,e)=>{let r=Number.parseInt(e.value.slice(0,4),10),n=Number.parseInt(e.value.slice(4,6),10)-1,o=Number.parseInt(e.value.slice(6,8),10),s=Number.parseInt(e.value.slice(9,11),10),a=Number.parseInt(e.value.slice(11,13),10),c=Number.parseInt(e.value.slice(13,15),10),m=new Date(Date.UTC(r,n,o,s,a,c));return u(t,m)},Yr=(t,e,r)=>{let n=se(r),o=H(void 0,e),s=nr(o,n);return u(t,s)};var En=(t,e)=>{var s,a,c,m,p,d;if(((s=t.options)==null?void 0:s.VALUE)===\"DATE\")return{date:kr(void 0,t),type:(a=t.options)==null?void 0:a.VALUE};let r=((c=t.options)==null?void 0:c.VALUE)||\"DATE-TIME\",n=H(void 0,t);if(!((m=t.options)!=null&&m.TZID))return{date:n,type:r};let o=Je(n,t.options.TZID,e==null?void 0:e.timezones);return o?{date:z(n,-o.milliseconds),type:r,local:(p=t.options)!=null&&p.TZID?{date:n,timezone:(d=t.options)==null?void 0:d.TZID,tzoffset:o.offset}:void 0}:{date:n,type:r}},y=(t,e,r)=>u(t,En(e,r));var Br=(t,e,r)=>{var o,s,a,c;let n=((o=e.options)==null?void 0:o.VALUE)===\"DATE-TIME\"||((s=e.options)==null?void 0:s.VALUE)===\"DATE\"?{type:\"absolute\",value:y(void 0,e,r),options:{related:(a=e.options)==null?void 0:a.RELATED}}:{type:\"relative\",value:_(void 0,e),options:{related:(c=e.options)==null?void 0:c.RELATED}};return u(t,n)};var xn=t=>t.startsWith('\"')&&t.endsWith('\"')?t.slice(1,-1):t,Et=t=>t.map(e=>{let[r,...n]=e.split(De),o=n.join(De);return{property:r,value:xn(o)}},{}),Sn=t=>t.reduce((e,r)=>(e[r.property]=r.value,e),{}),Fr=t=>Sn(Et(t));var Dn=t=>{let e=!1,r;for(let s=0;s<t.length&&r===void 0;s+=1)t.charAt(s)===Ot&&(e=!e),t.charAt(s)===gt&&!e&&(r=s);if(r===void 0)throw Error(`Line not valid: ${t}`);let n=t.substring(0,r),o=t.substring(r+1);return{property:n,value:o}},jr=t=>{let{property:e,value:r}=Dn(t);if(e.includes(oe)){let[n,...o]=e.split(oe),s=Fr(o);return{property:n,line:{options:s,value:r}}}return{property:e,line:{value:r}}};var Ur=t=>/^[ \\t]/.test(t),gn=t=>/^[A-Z]+(?:-[A-Z]+)*[:;]/.test(t),Wr=t=>{let e=[],r=t.split(Se);for(;r[0]===\"\";)r.shift();let n=r.length;for(;n>0&&r[n-1]===\"\";)n-=1,r.pop();for(let o=0;o<r.length;){let s=r[o];for(o+=1;r[o]!==void 0&&(Ur(r[o])||!gn(r[o]));)r[o]===\"\"?s+=pt:Ur(r[o])?s+=r[o].substring(1):(s+=pt,s+=r[o]),o+=1;e.push(s)}return e.filter(o=>o!==\"\")};var Gr=(t,e,r)=>{if(!e)return t;let n={};return Object.entries(e).forEach(([o,s])=>{let a=Object.entries(r||{}).find(([p,d])=>d.name===o);if(!a){n[On(o)]=s.value;return}let c=a[1].convert(s),m=a[1].schema;if(!m){n[a[0]]=c;return}n[a[0]]=u(m,c)}),t.nonStandard=n,t},On=t=>{let e=t.startsWith(\"X-\")?t.slice(2):t,r=\"\",n=!1;for(let o of e)o===\"-\"?n=!0:(r+=n?o.toUpperCase():o.toLowerCase(),n=!1);return r};var Jr=t=>t.startsWith(\"X-\");var C=(t,e,r)=>{let n=e.replace(St(r==null?void 0:r.icsComponent),\"\"),o=[...new Set(Object.values(r.childComponents||{}).flatMap(({icsComponent:l})=>l))],s=Wr(o.reduce((l,E)=>l.replace(it(E),\"\"),n)),a=r.defaultValues||{},c={};s.forEach(l=>{var P,Ee;let{property:E,line:v}=jr(l);Jr(E)&&(c[E]=v);let D=r.objectKeyMap[E];if(!D)return;let Ie=(P=r.convertArrayValues)==null?void 0:P[D];if(Ie){let Z=Ie({line:v});if(!Z)return;(a[D]===void 0||a[D]===null||!Array.isArray(a[D]))&&(a[D]=[]),Array.isArray(Z)?a[D].push(...Z):a[D].push(Z);return}let qe=(Ee=r.convertValues)==null?void 0:Ee[D];if(qe){let Z=qe({line:v});if(!Z)return;a[D]=Z;return}a[D]=v.value});let m=r.childComponents,p=m?Object.keys(m||{}):[];m&&p.length>0&&p.forEach(l=>{let E=m==null?void 0:m[l];if(!E)return;let v=Array.isArray(E.icsComponent)?E.icsComponent:[E.icsComponent],D=[],Ie=[];v.forEach(P=>{Ie.push(...n.matchAll(it(P)))}),Ie.map(P=>P[0]).forEach(P=>{let Ee=E.convert(P,{data:a});Ee&&D.push(Ee)}),D.length!==0&&(a[l]=D)});let d=u(t,a);return r!=null&&r.nonStandard?Gr(d,c,r==null?void 0:r.nonStandard):d};var q=(t,e)=>{var r,n,o;return u(t,{name:(r=e.options)==null?void 0:r.CN,dir:(n=e.options)==null?void 0:n.DIR,sentBy:(o=e.options)!=null&&o[\"SENT-BY\"]?w(e.options[\"SENT-BY\"]):void 0,email:w(e.value)})};var ye=(t,e,r)=>{var n;return u(t,{value:y(void 0,e,r),range:(n=e.options)==null?void 0:n.RANGE})};var Rn=t=>{if(t.length===2)return{day:t};let r=t.slice(0,-2);return{day:t.replace(r,\"\"),occurrence:Number(r)}},wr=(t,e)=>u(t,Rn(e.value));var Hr=(t,e)=>u(t,e.value);var Cn=[\"until\"],Nn=t=>Cn.includes(t),vn=[\"bySecond\",\"byMinute\",\"byHour\",\"byMonthday\",\"byYearday\",\"byWeekNo\",\"bySetPos\"],An=t=>vn.includes(t),bn=[\"byDay\"],Vn=t=>bn.includes(t),Mn=[\"count\",\"interval\"],zn=t=>Mn.includes(t),$=(t,e,r)=>{let n={};return Et(e.value.split(oe)).forEach(s=>{let{property:a,value:c}=s,m=tt[a];if(m){if(Nn(m)){n[m]=y(void 0,{value:c,options:{VALUE:c.includes(\"T\")?\"DATE-TIME\":\"DATE\"}},{timezones:r==null?void 0:r.timezones});return}if(An(m)){n[m]=c.split(b).map(p=>Number(p));return}if(m===\"byMonth\"){n[m]=c.split(b).map(p=>Number(p)-1);return}if(Vn(m)){n[m]=c.split(b).map(p=>wr(void 0,{value:p}));return}if(zn(m)){n[m]=Number(c);return}if(m===\"frequency\"){if(!c||!cr.includes(c))return;n[m]=c;return}if(m===\"workweekStart\"){n[m]=Hr(void 0,{value:c});return}}}),u(t,n)};var le=(t,e)=>u(t,e.value);var qr=(t,e)=>u(t,e.value);var Te=(t,e,r)=>u(t,e.value.split(\",\").map(n=>y(void 0,{value:n,options:e.options},r)));var $r=(t,e)=>u(t,e.value),Zr=(t,e)=>u(t,e.value),Xr=(t,e)=>u(t,e.value);var K=(t,e)=>u(t,Number.parseInt(e.value,10));var Qr=t=>t.replace(/\\\\(([,;\\\\])|([nN]))/g,(e,r,n)=>n||`\n`);var N=(t,e)=>u(t,Qr(e.value));var en=(...t)=>{let[e,r,n]=t;return C(e,r,{icsComponent:ee,objectKeyMap:$e,convertValues:{trigger:({line:o})=>Br(void 0,o,{timezones:n==null?void 0:n.timezones}),duration:({line:o})=>_(void 0,o),repeat:({line:o})=>K(void 0,o)},convertArrayValues:{attachments:({line:o})=>Pr(void 0,o),attendees:({line:o})=>L(void 0,o)},nonStandard:n==null?void 0:n.nonStandard,timezones:n==null?void 0:n.timezones})};var tn=(...t)=>{let[e,r,n]=t,o,s=C(e,r,{icsComponent:Q,objectKeyMap:Xe,convertValues:{stamp:({line:a})=>y(void 0,a,{timezones:n==null?void 0:n.timezones}),start:({line:a})=>y(void 0,a,{timezones:n==null?void 0:n.timezones}),end:({line:a})=>y(void 0,a,{timezones:n==null?void 0:n.timezones}),created:({line:a})=>y(void 0,a,{timezones:n==null?void 0:n.timezones}),lastModified:({line:a})=>y(void 0,a,{timezones:n==null?void 0:n.timezones}),categories:({line:a})=>a.value.split(b),description:({line:a})=>{var c;return(c=a.options)!=null&&c.ALTREP&&(o=a.options.ALTREP),N(void 0,a)},location:({line:a})=>N(void 0,a),comment:({line:a})=>N(void 0,a),summary:({line:a})=>N(void 0,a),recurrenceRule:({line:a})=>$(void 0,a,{timezones:n==null?void 0:n.timezones}),duration:({line:a})=>_(void 0,a),organizer:({line:a})=>q(void 0,a),sequence:({line:a})=>K(void 0,a),class:({line:a})=>le(void 0,a),recurrenceId:({line:a})=>ye(void 0,a,{timezones:n==null?void 0:n.timezones}),status:({line:a})=>$r(void 0,a),timeTransparent:({line:a})=>qr(void 0,a)},convertArrayValues:{attendees:({line:a})=>L(void 0,a),exceptionDates:({line:a})=>Te(void 0,a,{timezones:n==null?void 0:n.timezones})},childComponents:{alarms:{icsComponent:ee,convert:a=>en(void 0,a,{nonStandard:n==null?void 0:n.nonStandard,timezones:n==null?void 0:n.timezones})}},timezones:n==null?void 0:n.timezones,nonStandard:n==null?void 0:n.nonStandard});return o&&(s.descriptionAltRep=o),s};var rn=(...t)=>{let[e,r,n]=t,o=r.split(\"BEGIN:\")[1].split(Se)[0],s=sr.includes(o)?o:\"STANDARD\",a=r.split(\"TZOFFSETTO:\")[1].split(Se)[0];return C(e,r,{icsComponent:s,objectKeyMap:et,defaultValues:{type:s},convertValues:{start:({line:c})=>Yr(void 0,c,a),recurrenceRule:({line:c})=>$(void 0,c,{timezones:n==null?void 0:n.timezones}),recurrenceDate:({line:c})=>y(void 0,c,{timezones:n==null?void 0:n.timezones})},nonStandard:n==null?void 0:n.nonStandard,timezones:n==null?void 0:n.timezones})};var nn=(...t)=>{let[e,r,n]=t;return C(e,r,{icsComponent:X,objectKeyMap:Qe,convertValues:{lastModified:({line:o})=>H(void 0,o)},childComponents:{props:{icsComponent:[\"DAYLIGHT\",\"STANDARD\"],convert:o=>rn(void 0,o,{nonStandard:n==null?void 0:n.nonStandard,timezones:n==null?void 0:n.timezones})}},nonStandard:n==null?void 0:n.nonStandard,timezones:n==null?void 0:n.timezones})};var on=(...t)=>{let[e,r,n]=t;return C(e,r,{icsComponent:te,objectKeyMap:rt,convertValues:{stamp:({line:o})=>y(void 0,o,{timezones:n==null?void 0:n.timezones}),start:({line:o})=>y(void 0,o,{timezones:n==null?void 0:n.timezones}),due:({line:o})=>y(void 0,o,{timezones:n==null?void 0:n.timezones}),created:({line:o})=>y(void 0,o,{timezones:n==null?void 0:n.timezones}),lastModified:({line:o})=>y(void 0,o,{timezones:n==null?void 0:n.timezones}),completed:({line:o})=>y(void 0,o,{timezones:n==null?void 0:n.timezones}),categories:({line:o})=>o.value.split(b),description:({line:o})=>N(void 0,o),location:({line:o})=>N(void 0,o),comment:({line:o})=>N(void 0,o),summary:({line:o})=>N(void 0,o),recurrenceRule:({line:o})=>$(void 0,o,{timezones:n==null?void 0:n.timezones}),duration:({line:o})=>_(void 0,o),organizer:({line:o})=>q(void 0,o),sequence:({line:o})=>K(void 0,o),percentComplete:({line:o})=>K(void 0,o),class:({line:o})=>le(void 0,o),recurrenceId:({line:o})=>ye(void 0,o,{timezones:n==null?void 0:n.timezones}),status:({line:o})=>Zr(void 0,o)},convertArrayValues:{attendees:({line:o})=>L(void 0,o),exceptionDates:({line:o})=>Te(void 0,o,{timezones:n==null?void 0:n.timezones})},nonStandard:n==null?void 0:n.nonStandard,timezones:n==null?void 0:n.timezones})};var an=(...t)=>{let[e,r,n]=t;return C(e,r,{icsComponent:re,objectKeyMap:nt,convertValues:{stamp:({line:o})=>y(void 0,o,{timezones:n==null?void 0:n.timezones}),start:({line:o})=>y(void 0,o,{timezones:n==null?void 0:n.timezones}),created:({line:o})=>y(void 0,o,{timezones:n==null?void 0:n.timezones}),lastModified:({line:o})=>y(void 0,o,{timezones:n==null?void 0:n.timezones}),categories:({line:o})=>o.value.split(b),description:({line:o})=>N(void 0,o),comment:({line:o})=>N(void 0,o),summary:({line:o})=>N(void 0,o),recurrenceRule:({line:o})=>$(void 0,o,{timezones:n==null?void 0:n.timezones}),organizer:({line:o})=>q(void 0,o),sequence:({line:o})=>K(void 0,o),class:({line:o})=>le(void 0,o),recurrenceId:({line:o})=>ye(void 0,o,{timezones:n==null?void 0:n.timezones}),status:({line:o})=>Xr(void 0,o)},convertArrayValues:{attendees:({line:o})=>L(void 0,o),exceptionDates:({line:o})=>Te(void 0,o,{timezones:n==null?void 0:n.timezones})},nonStandard:n==null?void 0:n.nonStandard,timezones:n==null?void 0:n.timezones})};var sn=(t,e)=>{var r;return u(t,{type:(r=e.options)==null?void 0:r.FBTYPE,values:e.value.split(\",\").map(n=>{let[o,s]=n.split(\"/\"),a=H(void 0,{value:o});if(s.startsWith(\"PT\")){let m=_(void 0,{value:s});return{start:a,duration:m}}let c=H(void 0,{value:s});return{start:a,end:c}})})};var cn=(...t)=>{let[e,r,n]=t;return C(e,r,{icsComponent:ne,objectKeyMap:ot,convertValues:{stamp:({line:o})=>y(void 0,o,{timezones:n==null?void 0:n.timezones}),start:({line:o})=>y(void 0,o,{timezones:n==null?void 0:n.timezones}),end:({line:o})=>y(void 0,o,{timezones:n==null?void 0:n.timezones}),comment:({line:o})=>N(void 0,o),organizer:({line:o})=>q(void 0,o)},convertArrayValues:{attendees:({line:o})=>L(void 0,o),freeBusy:({line:o})=>sn(void 0,o)},nonStandard:n==null?void 0:n.nonStandard,timezones:n==null?void 0:n.timezones})};var mT=(...t)=>{let[e,r,n]=t;return C(e,r,{icsComponent:xe,objectKeyMap:Ze,convertValues:{version:({line:o})=>o.value},childComponents:{timezones:{icsComponent:X,convert:o=>nn(void 0,o,{nonStandard:n==null?void 0:n.nonStandard})},events:{icsComponent:Q,convert:(o,{data:s})=>tn(void 0,o,{nonStandard:n==null?void 0:n.nonStandard,timezones:s.timezones})},todos:{icsComponent:te,convert:(o,{data:s})=>on(void 0,o,{nonStandard:n==null?void 0:n.nonStandard,timezones:s.timezones})},journals:{icsComponent:re,convert:(o,{data:s})=>an(void 0,o,{nonStandard:n==null?void 0:n.nonStandard,timezones:s.timezones})},freeBusy:{icsComponent:ne,convert:(o,{data:s})=>cn(void 0,o,{nonStandard:n==null?void 0:n.nonStandard,timezones:s.timezones})}},nonStandard:n==null?void 0:n.nonStandard})};export{Se as BREAK_REGEX,b as COMMA,Le as CRLF_BREAK,Dt as CRLF_BREAK_REGEX,yn as DEFAULT_END_IN_YEARS,De as EQUAL_SIGN,Io as ICS_COMPONENTS,pt as LF_BREAK,ut as MAX_LINE_LENGTH,st as OBJECT_END,at as OBJECT_START,Ot as QUOTE,to as RRULE_KEYS,ro as RRULE_OBJECT_KEYS,xt as RRULE_TO_KEYS,tt as RRULE_TO_OBJECT_KEYS,oe as SEMICOLON,gt as SEPARATOR,Vo as SPACE,sr as TIMEZONE_PROP_COMPONENTS,hn as VALARM_KEYS,ee as VALARM_OBJECT_KEY,Kn as VALARM_OBJECT_KEYS,Ce as VALARM_TO_KEYS,$e as VALARM_TO_OBJECT_KEYS,Yn as VCALENDAR_KEYS,xe as VCALENDAR_OBJECT_KEY,Bn as VCALENDAR_OBJECT_KEYS,Ne as VCALENDAR_TO_KEYS,Ze as VCALENDAR_TO_OBJECT_KEYS,Un as VEVENT_KEYS,Q as VEVENT_OBJECT_KEY,Wn as VEVENT_OBJECT_KEYS,ve as VEVENT_TO_KEYS,Xe as VEVENT_TO_OBJECT_KEYS,yo as VFREEBUSY_KEYS,ne as VFREEBUSY_OBJECT_KEY,lo as VFREEBUSY_OBJECT_KEYS,ze as VFREEBUSY_TO_KEYS,ot as VFREEBUSY_TO_OBJECT_KEYS,io as VJOURNAL_KEYS,re as VJOURNAL_OBJECT_KEY,po as VJOURNAL_OBJECT_KEYS,Me as VJOURNAL_TO_KEYS,nt as VJOURNAL_TO_OBJECT_KEYS,mt as VTIMEZONE_DAYLIGHT_OBJECT_KEY,wn as VTIMEZONE_KEYS,X as VTIMEZONE_OBJECT_KEY,Hn as VTIMEZONE_OBJECT_KEYS,Zn as VTIMEZONE_PROP_KEYS,Xn as VTIMEZONE_PROP_OBJECT_KEYS,be as VTIMEZONE_PROP_TO_KEYS,et as VTIMEZONE_PROP_TO_OBJECT_KEYS,ct as VTIMEZONE_STANDARD_OBJECT_KEY,Ae as VTIMEZONE_TO_KEYS,Qe as VTIMEZONE_TO_OBJECT_KEYS,ao as VTODO_KEYS,te as VTODO_OBJECT_KEY,so as VTODO_OBJECT_KEYS,Ve as VTODO_TO_KEYS,rt as VTODO_TO_OBJECT_KEYS,om as attachmentEncodingTypes,am as attachmentValueTypes,cm as attendeePartStatusTypes,Fc as calendarMethods,jc as calendarVersions,xm as classTypes,en as convertIcsAlarm,Pr as convertIcsAttachment,L as convertIcsAttendee,mT as convertIcsCalendar,le as convertIcsClass,kr as convertIcsDate,H as convertIcsDateTime,_ as convertIcsDuration,tn as convertIcsEvent,$r as convertIcsEventStatus,Te as convertIcsExceptionDates,cn as convertIcsFreeBusy,K as convertIcsInteger,an as convertIcsJournal,Xr as convertIcsJournalStatus,Yr as convertIcsLocalOnlyDateTime,q as convertIcsOrganizer,ye as convertIcsRecurrenceId,$ as convertIcsRecurrenceRule,N as convertIcsText,y as convertIcsTimeStamp,qr as convertIcsTimeTransparent,nn as convertIcsTimezone,rn as convertIcsTimezoneProp,on as convertIcsTodo,Zr as convertIcsTodoStatus,Br as convertIcsTrigger,Hr as convertIcsWeekDay,wr as convertIcsWeekDayNumber,Gr as convertNonStandardValues,it as createGetRegex,St as createReplaceRegex,im as dateObjectTypes,dm as eventStatusTypes,xr as extendByRecurrenceRule,Sr as extendTimezoneProps,Jc as freeBusyTypes,vr as generateIcsAlarm,Nt as generateIcsAttachment,V as generateIcsAttendee,Vd as generateIcsCalendar,we as generateIcsDate,M as generateIcsDuration,Vr as generateIcsEvent,Kr as generateIcsFreeBusy,h as generateIcsInteger,_r as generateIcsJournal,gr as generateIcsLocalDateTime,Or as generateIcsLocalOnlyDateTime,k as generateIcsMail,G as generateIcsOrganizer,J as generateIcsRecurrenceRule,R as generateIcsText,T as generateIcsTimeStamp,zr as generateIcsTimezone,Mr as generateIcsTimezoneProp,Lr as generateIcsTodo,Rr as generateIcsTrigger,A as generateIcsUtcDateTime,Ar as generateIcsWeekdayNumber,Cr as generateNonStandardValues,Mc as getDurationFromInterval,Yc as getEventEnd,ar as getEventEndFromDuration,Je as getTimezoneObjectOffset,ym as journalStatusTypes,zn as recurrenceObjectKeyIsNumber,An as recurrenceObjectKeyIsNumberArray,Nn as recurrenceObjectKeyIsTimeStamp,Vn as recurrenceObjectKeyIsWeekdayNumberArray,cr as recurrenceRuleFrequencies,Dm as timeTransparentTypes,se as timeZoneOffsetToMilliseconds,fm as todoStatusTypes,Tm as triggerRelations,Ge as weekDays};\n","import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { generateIcsEvent, type IcsEvent } from 'ts-ics';\n\nimport { formatLocalizedDate } from '../lib/localization.js';\nimport { getMessages } from '../lib/messages.js';\nimport type { CalendarDate } from '../lms-calendar';\n\ninterface EventDetails {\n heading: string;\n content: string;\n time?: CalendarTimeInterval;\n displayTime: string;\n date?: CalendarDate;\n}\n\n@customElement('lms-menu')\nexport class Menu extends LitElement {\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: Object }) eventDetails: EventDetails = {\n heading: '',\n content: '',\n displayTime: '',\n };\n @property({ attribute: false }) anchorRect?: DOMRect;\n @property({ type: String }) locale = 'en';\n\n @state() private _cardTop = 0;\n @state() private _cardLeft = 0;\n @state() private _positioned = false;\n\n static override styles = css`\n :host {\n position: absolute;\n inset: 0;\n z-index: 10000;\n pointer-events: none;\n display: none;\n }\n :host([open]) {\n display: block;\n }\n .card {\n position: absolute;\n pointer-events: auto;\n background: var(--background-color);\n border-radius: var(--border-radius-md);\n box-shadow: var(--shadow-lg);\n border: 1px solid var(--separator-light);\n font-family: var(--system-ui);\n min-width: 16em;\n max-width: 22em;\n padding: 0.875em 1em;\n opacity: 0;\n transform: scale(0.95);\n transition:\n opacity 0.15s ease,\n transform 0.15s ease;\n }\n .card.visible {\n opacity: 1;\n transform: scale(1);\n }\n .header {\n display: flex;\n align-items: flex-start;\n gap: 0.5em;\n margin-bottom: 0.25em;\n }\n .title {\n flex: 1;\n font-size: 1em;\n font-weight: 600;\n color: var(--separator-dark);\n line-height: 1.3;\n word-break: break-word;\n }\n .close-btn {\n flex-shrink: 0;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 1.125em;\n line-height: 1;\n padding: 0.15em 0.25em;\n margin: -0.15em -0.25em 0 0;\n border-radius: var(--border-radius-sm);\n color: var(--header-text-color);\n transition: background-color 0.15s;\n }\n .close-btn:hover {\n background-color: var(--separator-light);\n }\n .meta {\n font-size: 0.8125em;\n color: var(--header-text-color);\n line-height: 1.5;\n }\n .notes {\n margin-top: 0.5em;\n padding-top: 0.625em;\n border-top: 1px solid var(--separator-light);\n font-size: 0.8125em;\n color: var(--separator-dark);\n word-break: break-word;\n line-height: 1.4;\n }\n .actions {\n padding-top: 0.625em;\n }\n .export-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-family: var(--system-ui);\n font-size: 0.8125em;\n font-weight: 500;\n color: var(--primary-color);\n padding: 0;\n transition: opacity 0.15s;\n }\n .export-btn:hover {\n opacity: 0.7;\n }\n `;\n\n override updated(changed: Map<string, unknown>) {\n if (changed.has('open') || changed.has('anchorRect')) {\n if (this.open && this.anchorRect) {\n this._positioned = false;\n this._computePosition();\n // Move focus into the dialog after positioning\n requestAnimationFrame(() => {\n const closeBtn = this.renderRoot.querySelector('.close-btn') as HTMLElement;\n closeBtn?.focus();\n });\n }\n }\n }\n\n private _handleKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n const focusable = Array.from(\n this.renderRoot.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n ),\n );\n if (focusable.length === 0) return;\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const root = this.renderRoot as ShadowRoot;\n if (e.shiftKey) {\n if (root.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (root.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n\n private _computePosition() {\n requestAnimationFrame(() => {\n const card = this.renderRoot.querySelector('.card') as HTMLElement;\n const container = this.parentElement;\n if (!card || !container || !this.anchorRect) return;\n\n const containerRect = container.getBoundingClientRect();\n const cardRect = card.getBoundingClientRect();\n\n // Convert anchor from viewport coords to container-relative coords\n const anchorTop = this.anchorRect.top - containerRect.top;\n const anchorLeft = this.anchorRect.left - containerRect.left;\n const anchorRight = anchorLeft + this.anchorRect.width;\n const anchorMidY = anchorTop + this.anchorRect.height / 2;\n\n const gap = 8;\n const cardW = cardRect.width || 260;\n const cardH = cardRect.height || 200;\n\n // Prefer right placement; flip left if overflow\n let left: number;\n if (anchorRight + gap + cardW <= containerRect.width) {\n left = anchorRight + gap;\n } else if (anchorLeft - gap - cardW >= 0) {\n left = anchorLeft - gap - cardW;\n } else {\n // Fallback: center horizontally in container\n left = Math.max(gap, (containerRect.width - cardW) / 2);\n }\n\n // Center vertically on anchor, clamp to container\n let top = anchorMidY - cardH / 2;\n top = Math.max(gap, Math.min(top, containerRect.height - cardH - gap));\n\n this._cardTop = top;\n this._cardLeft = left;\n this._positioned = true;\n });\n }\n\n private _handleClose = () => {\n this.open = false;\n this.dispatchEvent(new CustomEvent('menu-close', { bubbles: true, composed: true }));\n };\n\n private _handleExport = () => {\n const { heading, content, time, date } = this.eventDetails;\n const eventYear = date?.year ?? 2025;\n const eventMonth = (date?.month ?? 4) - 1;\n const eventDay = date?.day ?? 18;\n let start, end;\n if (time) {\n start = {\n date: new Date(eventYear, eventMonth, eventDay, time.start.hour, time.start.minute),\n };\n end = {\n date: new Date(eventYear, eventMonth, eventDay, time.end.hour, time.end.minute),\n };\n }\n const event: IcsEvent = {\n start: {\n date: (start && start.date) || new Date(eventYear, eventMonth, eventDay, 0, 0),\n },\n end: {\n date: (end && end.date) || new Date(eventYear, eventMonth, eventDay, 23, 59),\n },\n summary: heading,\n description: content,\n status: 'CONFIRMED',\n uid: `${Date.now()}@lms-calendar`,\n stamp: { date: new Date() },\n };\n const vevent = generateIcsEvent(event);\n const icsString = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//LMS Calendar//EN',\n vevent.trim(),\n 'END:VCALENDAR',\n ].join('\\r\\n');\n const blob = new Blob([icsString], { type: 'text/calendar' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${heading || 'event'}.ics`;\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }, 0);\n };\n\n private _formatDate(date: CalendarDate): string {\n return formatLocalizedDate(date.day, date.month, date.year, this.locale);\n }\n\n override render() {\n const msg = getMessages(this.locale);\n const cardClasses = `card${this._positioned ? ' visible' : ''}`;\n const hasNotes = this.eventDetails.content && this.eventDetails.content !== msg.noContent;\n\n return html`\n <div\n class=${cardClasses}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=${msg.eventDetails}\n style=\"top: ${this._cardTop}px; left: ${this._cardLeft}px;\"\n @keydown=${this._handleKeydown}\n >\n <div class=\"header\">\n <span class=\"title\"\n >${this.eventDetails.heading || msg.noTitle}</span\n >\n <button\n type=\"button\"\n class=\"close-btn\"\n @click=${this._handleClose}\n title=${msg.close}\n aria-label=${msg.close}\n >\n &times;\n </button>\n </div>\n <div class=\"meta\">\n ${this.eventDetails.displayTime || msg.noTime}\n </div>\n ${\n this.eventDetails.date\n ? html`<div class=\"meta\">\n ${this._formatDate(this.eventDetails.date)}\n </div>`\n : nothing\n }\n ${hasNotes ? html`<div class=\"notes\">${this.eventDetails.content}</div>` : nothing}\n <div class=\"actions\">\n <button\n type=\"button\"\n class=\"export-btn\"\n @click=${this._handleExport}\n title=${msg.exportAsICS}\n >\n ${msg.exportAsICS}\n </button>\n </div>\n </div>\n `;\n }\n}\n\nexport default Menu;\n","import { DateTime } from 'luxon';\n\nimport { CalendarDate } from '../lms-calendar';\n\n/**\n * This class handles calculations and adjustments for CalendarDate objects based on a specified direction.\n *\n * @example\n * ```javascript\n * const dateCalculator = new DirectionalCalendarDateCalculator({\n * date: { year: 2023, month: 8, day: 15 },\n * direction: 'next'\n * });\n *\n * const newDate = dateCalculator.getDateByMonthInDirection();\n * // newDate would be { year: 2023, month: 9, day: 15 }\n * ```\n */\nexport default class DirectionalCalendarDateCalculator {\n private _date?: DateTime;\n private _direction?: string;\n\n constructor({ date, direction }: { date?: CalendarDate; direction?: 'previous' | 'next' }) {\n if (date) {\n this.date = date;\n }\n this._direction = direction;\n }\n\n set date(date: CalendarDate) {\n const newDate = DateTime.fromObject(date);\n if (!newDate.isValid) {\n throw new Error(\"date couldn't be converted to DateTime object\");\n }\n this._date = newDate;\n }\n\n set direction(direction: 'previous' | 'next') {\n this._direction = direction;\n }\n\n private _toCalendarDate(date: DateTime): CalendarDate {\n return {\n day: date.day,\n month: date.month,\n year: date.year,\n };\n }\n\n public getDateByDayInDirection() {\n if (!this._date || !this._date.isValid) {\n throw new Error('date is not set or invalid');\n }\n\n if (!this._direction) {\n throw new Error('direction is not set');\n }\n\n const adjustedDate = this._date.plus({\n days: this._direction === 'next' ? 1 : -1,\n });\n\n if (!adjustedDate.isValid) {\n throw new Error('generated date is invalid');\n }\n\n this._date = adjustedDate; // Update internal state\n return this._toCalendarDate(adjustedDate);\n }\n\n public getDateByMonthInDirection() {\n if (!this._date || !this._date.isValid) {\n throw new Error('date is not set');\n }\n\n if (!this._direction) {\n throw new Error('direction is not set');\n }\n\n const adjustedDate = this._date.plus({\n months: this._direction === 'next' ? 1 : -1,\n });\n\n if (!adjustedDate.isValid) {\n throw new Error('generated date is invalid');\n }\n\n this._date = adjustedDate; // Update internal state\n return this._toCalendarDate(adjustedDate);\n }\n}\n","import { LitElement, css, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { P, match } from 'ts-pattern';\n\nimport DirectionalCalendarDateCalculator from '../lib/DirectionalCalendarDateCalculator.js';\nimport { getLocalizedDayMonth } from '../lib/localization.js';\nimport { type FirstDayOfWeek, getFirstDayOffset } from '../lib/weekStartHelper.js';\n\n@customElement('lms-calendar-month')\nexport default class Month extends LitElement {\n private currentDate = new Date();\n\n @property({ attribute: false })\n activeDate: CalendarDate = {\n day: this.currentDate.getDate(),\n month: this.currentDate.getMonth() + 1,\n year: this.currentDate.getFullYear(),\n };\n\n @property({ type: Number })\n firstDayOfWeek: FirstDayOfWeek = 1;\n\n @property({ type: String })\n locale = 'en';\n\n static override styles = css`\n :host {\n display: block;\n flex: 1;\n min-height: 0;\n }\n\n .month {\n height: 100%;\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n border-top: 1px solid var(--separator-light);\n }\n\n .month > div {\n border-bottom: 1px solid var(--separator-light);\n border-right: 1px solid var(--separator-light);\n }\n\n .month > div:nth-child(7n + 7) {\n border-right: none;\n }\n\n .month > div:nth-last-child(-n + 7) {\n border-bottom: none;\n }\n\n .day {\n width: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n overflow-x: hidden;\n overflow-y: auto;\n gap: var(--month-day-gap, 1px);\n min-width: 0;\n /* Let Blink skip layout/paint for off-screen day cells */\n content-visibility: auto;\n contain-intrinsic-size: auto 6em;\n }\n\n /* Ensure consistent multi-day event layering */\n ::slotted(lms-calendar-entry) {\n position: relative;\n margin-left: 1em;\n width: calc(100% - 1em);\n }\n\n .indicator.current {\n color: var(--indicator-color, var(--primary-color));\n font-weight: var(--indicator-font-weight, bold);\n }\n\n .indicator {\n position: sticky;\n top: 0.25em;\n left: 0.25em;\n z-index: 500;\n background: transparent;\n backdrop-filter: var(--indicator-backdrop-filter, blur(10px));\n -webkit-backdrop-filter: var(--indicator-backdrop-filter, blur(10px));\n text-align: left;\n min-height: 2em;\n line-height: 2em;\n margin: 0.25em;\n border-radius: 1em;\n align-self: flex-start;\n transition: opacity 0.2s ease-in-out;\n opacity: 1;\n padding: 0 0.25em;\n white-space: nowrap;\n }\n\n .day.scrolled .indicator {\n opacity: 0;\n }\n `;\n\n override connectedCallback() {\n super.connectedCallback();\n // Forward open-menu events from entry components\n this.addEventListener('open-menu', (e: Event) => {\n const customEvent = e as CustomEvent;\n\n // Only forward if the event came from an entry component, not from our own re-dispatch\n if (e.target !== this) {\n e.stopPropagation(); // Stop the original event\n // Re-dispatch to ensure it bubbles up to calendar\n const forwardedEvent = new CustomEvent('open-menu', {\n detail: customEvent.detail,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(forwardedEvent);\n }\n });\n\n // Add scroll detection for day cells\n this._setupScrollDetection();\n }\n\n private _setupScrollDetection() {\n // Use requestAnimationFrame for throttling\n let rafId: number | null = null;\n\n const handleScroll = (dayElement: HTMLElement) => {\n if (rafId) return;\n\n rafId = requestAnimationFrame(() => {\n if (dayElement.scrollTop > 5) {\n dayElement.classList.add('scrolled');\n } else {\n dayElement.classList.remove('scrolled');\n }\n rafId = null;\n });\n };\n\n // Add listeners after render\n this.updateComplete.then(() => {\n const days = this.shadowRoot?.querySelectorAll('.day');\n days?.forEach((day) => {\n const dayElement = day as HTMLElement;\n dayElement.addEventListener('scroll', () => handleScroll(dayElement), {\n passive: true,\n });\n });\n });\n }\n\n private _isCurrentDate(date: string) {\n return new Date(date).toDateString() === this.currentDate.toDateString();\n }\n\n private _renderIndicator({ year, month, day }: CalendarDate) {\n const isCurrentDate = this._isCurrentDate(`${year}/${month}/${day}`);\n return html` <div\n class=\"indicator ${classMap({\n current: isCurrentDate,\n })}\"\n >\n ${day === 1 ? getLocalizedDayMonth(day, month, year, this.locale) : day}\n </div>`;\n }\n\n override render() {\n return html`\n <div class=\"month\">\n ${this._getCalendarArray()?.map(\n ({ year, month, day }) =>\n html`<div\n class=\"day\"\n data-date=\"${year}-${month}-${day}\"\n @click=${this._dispatchExpand}\n @keydown=${this._handleKeydown}\n tabindex=\"0\"\n >\n ${this._renderIndicator({ year, month, day })}\n <slot name=\"${year}-${month}-${day}\"></slot>\n </div>`,\n )}\n </div>\n `;\n }\n\n private _dispatchExpand(e: Event) {\n const target = e.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n // Don't expand if the click is on an entry component or inside one\n if (target.closest('lms-calendar-entry')) {\n return;\n }\n\n const { date } = target.dataset;\n if (!date) {\n return;\n }\n\n const [year, month, day] = date.split('-').map((field: string) => parseInt(field, 10));\n const event = new CustomEvent('expand', {\n detail: { date: { day, month, year } },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }\n\n private _handleKeydown(e: KeyboardEvent) {\n const key = e.key;\n if (!(key === 'Space' || key === 'Enter')) {\n return;\n }\n\n this._dispatchExpand(e);\n }\n\n private _getDaysInMonth(date: CalendarDate) {\n /** Important note: Passing 0 as the date shifts the\n * months indices by positive 1, so 1-12 */\n return match(date)\n .with({ year: P.number, month: P.number, day: P.number }, ({ year, month }) => {\n const days = new Date(year, month, 0).getDate();\n return days > 0 ? days : 0;\n })\n .otherwise(() => 0);\n }\n\n private _getOffsetOfFirstDayInMonth(date: CalendarDate) {\n return getFirstDayOffset(date, this.firstDayOfWeek);\n }\n\n private _getDatesInMonthAsArray(date: CalendarDate, sliceArgs: number[]) {\n const daysInMonth = this._getDaysInMonth(date);\n return match(daysInMonth)\n .with(0, () => [])\n .otherwise((days) =>\n Array.from(Array(days).keys(), (_, n) => ({\n year: date.year,\n month: date.month,\n day: n + 1,\n })).slice(...(sliceArgs || [0])),\n );\n }\n\n private _getCalendarArray() {\n if (!this.activeDate) {\n return [];\n }\n\n const dateTransformer = new DirectionalCalendarDateCalculator({\n date: this.activeDate,\n });\n\n try {\n dateTransformer.direction = 'previous';\n const offset = this._getOffsetOfFirstDayInMonth(this.activeDate);\n const previousMonth =\n offset > 0\n ? this._getDatesInMonthAsArray(dateTransformer.getDateByMonthInDirection(), [\n -offset,\n ])\n : [];\n\n const activeMonth = this._getDatesInMonthAsArray(this.activeDate, []);\n\n // Reset the date transformer to the active date before getting next month\n dateTransformer.date = this.activeDate;\n dateTransformer.direction = 'next';\n const remainingDays = 42 - (previousMonth.length + activeMonth.length);\n const nextMonth =\n remainingDays > 0\n ? this._getDatesInMonthAsArray(dateTransformer.getDateByMonthInDirection(), [\n 0,\n remainingDays,\n ])\n : [];\n\n return previousMonth.concat(activeMonth, nextMonth);\n } catch (error) {\n console.error('Error generating calendar array:', error);\n return [];\n }\n }\n}\n","import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\n\nimport { formatLocalizedTime, getLocalizedWeekdayShort } from '../lib/localization.js';\nimport { getMessages } from '../lib/messages.js';\nimport { type FirstDayOfWeek, getWeekDates, getWeekdayOrder } from '../lib/weekStartHelper.js';\nimport './Day.js';\n\n@customElement('lms-calendar-week')\nexport default class Week extends LitElement {\n @property({ attribute: false })\n activeDate: CalendarDate = {\n day: new Date().getDate(),\n month: new Date().getMonth() + 1,\n year: new Date().getFullYear(),\n };\n\n @property({ type: Number })\n allDayRowCount = 0;\n\n @property({ type: Number })\n firstDayOfWeek: FirstDayOfWeek = 1;\n\n @property({ type: String })\n locale = 'en';\n\n /** Condensed subset of dates to render (defaults to full week). */\n @property({ attribute: false })\n visibleDates?: CalendarDate[];\n\n /** Start offset into the full 7-day week. */\n @property({ type: Number })\n visibleStartIndex = 0;\n\n /** Number of visible day columns. */\n @property({ type: Number })\n visibleLength = 7;\n\n static override styles = css`\n :host {\n display: block;\n height: 100%;\n width: 100%;\n }\n\n .week-container {\n display: flex;\n flex-direction: column;\n height: var(--view-container-height);\n overflow: hidden;\n position: relative;\n }\n\n .week-header {\n display: grid;\n grid-template-columns: var(--calendar-grid-columns-week);\n height: var(--day-header-height, 3.5em);\n flex-shrink: 0;\n border-bottom: var(--separator-border);\n gap: var(--day-gap, 1px);\n padding: var(--day-padding, 0.5em);\n position: relative;\n }\n\n .time-header {\n border-right: 1px solid var(--separator-light);\n }\n\n .day-label {\n text-align: center;\n padding: var(--day-padding, 0.5em);\n font-weight: var(--day-label-font-weight);\n border-right: var(--separator-border);\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: var(--day-label-gap, 0.15em);\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .day-name {\n font-size: var(--day-label-name-font-size, 0.75em);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n opacity: 0.7;\n }\n\n .day-number {\n font-size: var(--day-label-number-font-size, 1.125em);\n font-weight: var(--day-label-number-font-weight, 600);\n line-height: 1;\n }\n\n .day-label:hover {\n background-color: var(--separator-light);\n }\n\n .day-label:focus {\n outline: 2px solid var(--entry-focus-color, var(--primary-color));\n outline-offset: 2px;\n background-color: var(--separator-light);\n }\n\n .day-label:last-child {\n border-right: none;\n }\n\n .day-label.current {\n color: var(--indicator-color, var(--primary-color));\n font-weight: var(--indicator-font-weight, bold);\n }\n\n .week-scroll {\n flex: 1;\n overflow-y: auto;\n display: grid;\n grid-template-columns: var(--calendar-grid-columns-week);\n grid-template-rows: 1fr;\n gap: var(--day-gap, 1px);\n padding: var(--day-padding, 0.5em);\n min-height: 0;\n position: relative;\n contain: content;\n }\n\n .time-labels {\n grid-column: 1;\n position: relative;\n height: var(--day-total-height);\n border-right: var(--sidebar-border, 1px solid var(--separator-light));\n background: var(--background-color, white);\n }\n\n .hour-label {\n position: absolute;\n left: 0;\n right: 0;\n text-align: var(--hour-text-align, center);\n font-size: var(--hour-indicator-font-size);\n color: var(--hour-indicator-color);\n transform: translateY(var(--indicator-top, -0.55em));\n pointer-events: none;\n }\n\n .day-column {\n position: relative;\n height: var(--day-total-height);\n border-right: var(--sidebar-border, 1px solid var(--separator-light));\n background-image: repeating-linear-gradient(\n to bottom,\n transparent 0,\n transparent calc(var(--hour-height) - 1px),\n var(--separator-light) calc(var(--hour-height) - 1px),\n var(--separator-light) var(--hour-height)\n );\n background-size: 100% var(--hour-height);\n }\n\n .day-column:last-child {\n border-right: none;\n }\n\n /* All-day events section */\n .all-day-wrapper {\n display: grid;\n grid-template-rows: 1fr;\n border-bottom: var(--separator-border);\n background: var(--background-color);\n z-index: 2;\n position: relative;\n /* Isolate repaint from the hour-grid scroller beneath */\n contain: paint;\n }\n\n .all-day-container {\n display: grid;\n grid-template-columns: var(--calendar-grid-columns-week);\n gap: var(--day-gap, 1px);\n padding: var(--day-padding, 0.5em);\n min-height: 0;\n overflow: hidden;\n }\n\n .all-day-day-column {\n position: relative;\n min-height: 2em;\n padding: 0.25em 0;\n overflow: hidden;\n }\n\n /* Stack all-day events vertically with consistent positioning */\n .all-day-container .all-day-day-column ::slotted(lms-calendar-entry) {\n position: relative !important;\n display: block !important;\n margin-bottom: 0.25em !important;\n z-index: var(--entry-z-index, 1) !important;\n }\n\n /* Enhanced multi-day spanning styles with consistent ordering */\n .all-day-container .all-day-day-column ::slotted(lms-calendar-entry.first-day) {\n border-top-right-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n border-top-left-radius: var(--entry-border-radius) !important;\n border-bottom-left-radius: var(--entry-border-radius) !important;\n position: relative !important;\n }\n\n .all-day-container .all-day-day-column ::slotted(lms-calendar-entry.middle-day) {\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n border-bottom-left-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n position: relative !important;\n border-left: 3px solid rgba(255, 255, 255, 0.4) !important;\n margin-left: -2px !important;\n }\n\n .all-day-container .all-day-day-column ::slotted(lms-calendar-entry.last-day) {\n border-top-left-radius: 0 !important;\n border-bottom-left-radius: 0 !important;\n border-top-right-radius: var(--entry-border-radius) !important;\n border-bottom-right-radius: var(--entry-border-radius) !important;\n position: relative !important;\n border-left: 3px solid rgba(255, 255, 255, 0.4) !important;\n margin-left: -2px !important;\n }\n\n .all-day-container .all-day-day-column ::slotted(lms-calendar-entry.single-day) {\n border-radius: var(--entry-border-radius) !important;\n position: relative !important;\n }\n\n .all-day-time-header {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--hour-indicator-font-size);\n color: var(--hour-indicator-color);\n font-weight: var(--day-label-font-weight);\n border-right: var(--separator-border);\n }\n\n /* Peek indicators for condensed view */\n .peek-indicators {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0 0.25em;\n height: 1.5em;\n flex-shrink: 0;\n border-bottom: var(--separator-border);\n }\n\n .peek-indicator {\n display: flex;\n align-items: center;\n gap: 0.25em;\n color: var(--hour-indicator-color, rgba(0, 0, 0, 0.5));\n font-size: 0.75em;\n cursor: pointer;\n user-select: none;\n padding: 0.1em 0.35em;\n border-radius: var(--border-radius-sm, 4px);\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n\n .peek-indicator:hover {\n background-color: var(--separator-light, rgba(0, 0, 0, 0.06));\n color: var(--separator-dark, rgba(0, 0, 0, 0.7));\n }\n\n .peek-indicator:active {\n background-color: var(--separator-mid, rgba(0, 0, 0, 0.12));\n }\n\n .peek-indicator--hidden {\n visibility: hidden;\n pointer-events: none;\n }\n `;\n\n override connectedCallback() {\n super.connectedCallback();\n }\n\n private _getWeekDates(): CalendarDate[] {\n return getWeekDates(this.activeDate, this.firstDayOfWeek);\n }\n\n /** Return the dates to actually render (condensed subset or full week). */\n private _getDatesToRender(): CalendarDate[] {\n return this.visibleDates ?? this._getWeekDates();\n }\n\n /** Return the weekday order slice matching the visible dates. */\n private _getVisibleWeekdayOrder(): number[] {\n const fullOrder = getWeekdayOrder(this.firstDayOfWeek);\n if (this.visibleDates && this.visibleLength < 7) {\n return fullOrder.slice(\n this.visibleStartIndex,\n this.visibleStartIndex + this.visibleLength,\n );\n }\n return fullOrder;\n }\n\n private _isCurrentDate(date: CalendarDate) {\n const today = new Date();\n return (\n date.day === today.getDate() &&\n date.month === today.getMonth() + 1 &&\n date.year === today.getFullYear()\n );\n }\n\n /** Whether the view is condensed (showing fewer than 7 days). */\n private get _isCondensed(): boolean {\n return this.visibleDates !== undefined && this.visibleLength < 7;\n }\n\n override render() {\n const datesToRender = this._getDatesToRender();\n const weekdayOrder = this._getVisibleWeekdayOrder();\n const hasAllDay = this.allDayRowCount > 0;\n const allDayHeight = hasAllDay ? Math.max(2.5, this.allDayRowCount * 2) + 1 : 0;\n const weekContentHeight = hasAllDay\n ? `calc(var(--main-content-height) - ${allDayHeight}em)`\n : 'var(--main-content-height)';\n\n const showLeftPeek = this._isCondensed && this.visibleStartIndex > 0;\n const showRightPeek = this._isCondensed && this.visibleStartIndex + this.visibleLength < 7;\n\n return html`\n <div class=\"week-container\">\n <div class=\"week-header\">\n <div class=\"time-header\"></div>\n ${datesToRender.map((date, index) => {\n const msg = getMessages(this.locale);\n return html`\n <div\n class=\"day-label ${classMap({\n current: this._isCurrentDate(date),\n })}\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"${msg.switchToDayView} ${getLocalizedWeekdayShort(\n weekdayOrder[index],\n this.locale,\n )}, ${date.day}\"\n @click=${() => this._handleDayLabelClick(date)}\n @keydown=${(e: KeyboardEvent) =>\n this._handleDayLabelKeydown(e, date)}\n >\n <span class=\"day-name\">${getLocalizedWeekdayShort(weekdayOrder[index], this.locale)}</span>\n <span class=\"day-number\">${date.day}</span>\n </div>\n `;\n })}\n </div>\n\n <!-- Peek indicators for condensed view -->\n ${\n this._isCondensed\n ? (() => {\n const msg = getMessages(this.locale);\n return html`\n <div class=\"peek-indicators\">\n <span\n class=\"peek-indicator ${classMap({ 'peek-indicator--hidden': !showLeftPeek })}\"\n role=\"button\"\n tabindex=${showLeftPeek ? '0' : '-1'}\n aria-label=\"${msg.showEarlierDays}\"\n @click=${() => this._handlePeekNavigate('previous')}\n @keydown=${(e: KeyboardEvent) => this._handlePeekKeydown(e, 'previous')}\n >\\u2039 ${msg.more}</span>\n <span\n class=\"peek-indicator ${classMap({ 'peek-indicator--hidden': !showRightPeek })}\"\n role=\"button\"\n tabindex=${showRightPeek ? '0' : '-1'}\n aria-label=\"${msg.showLaterDays}\"\n @click=${() => this._handlePeekNavigate('next')}\n @keydown=${(e: KeyboardEvent) => this._handlePeekKeydown(e, 'next')}\n >${msg.more} \\u203A</span>\n </div>\n `;\n })()\n : nothing\n }\n\n <!-- All-day events section -->\n ${\n hasAllDay\n ? html`\n <div class=\"all-day-wrapper\">\n <div class=\"all-day-container\">\n <div class=\"all-day-time-header\">${getMessages(this.locale).allDay}</div>\n ${datesToRender.map(\n (date) => html`\n <div class=\"all-day-day-column\">\n <slot\n name=\"all-day-${date.year}-${date.month}-${date.day}\"\n ></slot>\n </div>\n `,\n )}\n </div>\n </div>\n `\n : nothing\n }\n <div class=\"week-scroll\" style=\"height: ${weekContentHeight}\">\n <div class=\"time-labels\">\n ${Array.from({ length: 25 }).map(\n (_, hour) => html`\n <div\n class=\"hour-label\"\n style=\"top: calc(${hour} * var(--hour-height))\"\n >\n ${this._renderIndicatorValue(hour)}\n </div>\n `,\n )}\n </div>\n ${datesToRender.map(\n (date) => html`\n <div class=\"day-column\">\n <slot\n name=\"timed-${date.year}-${date.month}-${date.day}\"\n ></slot>\n </div>\n `,\n )}\n </div>\n </div>\n `;\n }\n\n private _renderIndicatorValue(hour: number) {\n return formatLocalizedTime(hour, 0, this.locale);\n }\n\n private _handleDayLabelClick(date: CalendarDate) {\n const event = new CustomEvent('expand', {\n detail: { date },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }\n\n private _handleDayLabelKeydown(e: KeyboardEvent, date: CalendarDate) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._handleDayLabelClick(date);\n }\n }\n\n /**\n * Navigate the visible window by shifting the active date by 1 day.\n * The parent's `computeWeekDisplayContext` re-centers the window around the new date.\n */\n private _handlePeekNavigate(direction: 'previous' | 'next') {\n const weekDates = this._getWeekDates();\n let targetDate: CalendarDate | undefined;\n\n if (direction === 'previous' && this.visibleStartIndex > 0) {\n targetDate = weekDates[this.visibleStartIndex - 1];\n } else if (direction === 'next' && this.visibleStartIndex + this.visibleLength < 7) {\n targetDate = weekDates[this.visibleStartIndex + this.visibleLength];\n }\n\n if (targetDate) {\n this.dispatchEvent(\n new CustomEvent('peek-navigate', {\n detail: { date: targetDate, direction },\n bubbles: true,\n composed: true,\n }),\n );\n }\n }\n\n private _handlePeekKeydown(e: KeyboardEvent, direction: 'previous' | 'next') {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._handlePeekNavigate(direction);\n }\n }\n}\n","import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { DateTime } from 'luxon';\n\nimport { getLocalizedMonth, getLocalizedWeekdayShort } from '../lib/localization.js';\nimport { getMessages } from '../lib/messages.js';\nimport { getFirstDayOffset, getWeekdayOrder } from '../lib/weekStartHelper.js';\nimport type { FirstDayOfWeek } from '../lib/weekStartHelper.js';\n\nexport type DensityMode = 'dot' | 'heatmap' | 'count';\nexport type DrillTarget = 'day' | 'week' | 'month';\n\n@customElement('lms-calendar-year')\nexport default class Year extends LitElement {\n @property({ type: Object })\n activeDate: CalendarDate = (() => {\n const today = new Date();\n return { day: today.getDate(), month: today.getMonth() + 1, year: today.getFullYear() };\n })();\n\n @property({ type: Number })\n firstDayOfWeek: FirstDayOfWeek = 1;\n\n @property({ type: String })\n locale = 'en';\n\n @property({ type: Object })\n entrySumByDay: Record<string, number> = {};\n\n @property({ type: String })\n drillTarget: DrillTarget = 'month';\n\n @property({ type: String })\n densityMode: DensityMode = 'dot';\n\n static override styles = css`\n :host {\n display: block;\n contain: content;\n overflow-y: auto;\n container-type: inline-size;\n }\n\n .year-grid {\n display: grid;\n grid-template-columns: repeat(var(--year-grid-columns, 3), 1fr);\n gap: 1.25em 1em;\n padding: 1em;\n }\n\n /* Container queries — respond to component width, not viewport */\n @container (max-width: 400px) {\n .year-grid {\n grid-template-columns: repeat(var(--year-grid-columns-mobile, 1), 1fr);\n gap: 1em 0.75em;\n padding: 0.75em;\n }\n }\n\n @container (min-width: 401px) and (max-width: 700px) {\n .year-grid {\n grid-template-columns: repeat(var(--year-grid-columns-tablet, 2), 1fr);\n }\n }\n\n .mini-month {\n display: flex;\n flex-direction: column;\n gap: 0.15em;\n min-width: 0; /* prevent grid blowout */\n }\n\n .month-label {\n font-size: var(--year-month-label-font-size, 0.875em);\n font-weight: 600;\n color: var(--separator-dark, rgba(0, 0, 0, 0.7));\n cursor: pointer;\n padding: 0.3em 0;\n border: none;\n background: none;\n text-align: left;\n border-radius: 0;\n font-family: inherit;\n border-bottom: 1px solid var(--separator-light, rgba(0, 0, 0, 0.1));\n margin-bottom: 0.15em;\n }\n\n .month-label:hover {\n color: var(--primary-color, dodgerblue);\n }\n\n .weekday-header {\n display: grid;\n grid-template-columns: var(--year-cw-width, 1.8em) repeat(7, 1fr);\n text-align: center;\n }\n\n .weekday-header span {\n font-size: 0.65em;\n color: var(--header-text-color, rgba(0, 0, 0, 0.45));\n padding: 0.2em 0;\n font-weight: 500;\n overflow: hidden;\n }\n\n .day-grid {\n display: grid;\n grid-template-columns: var(--year-cw-width, 1.8em) repeat(7, 1fr);\n grid-auto-rows: calc(var(--year-cell-size, 1.8em) + 0.6em);\n justify-items: center;\n align-items: start;\n }\n\n .cw-label {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--year-cw-font-size, 0.55em);\n color: var(--year-cw-color, var(--header-text-color, rgba(0, 0, 0, 0.45)));\n cursor: pointer;\n border: none;\n background: none;\n border-radius: var(--border-radius-sm, 4px);\n font-family: inherit;\n padding: 0;\n line-height: 1;\n }\n\n .cw-label:hover {\n color: var(--primary-color, dodgerblue);\n background: var(--separator-light, rgba(0, 0, 0, 0.06));\n }\n\n .day-cell {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: var(--year-day-font-size, 0.7em);\n border: none;\n background: none;\n border-radius: 50%;\n cursor: pointer;\n position: relative;\n width: var(--year-cell-size, 1.8em);\n height: var(--year-cell-size, 1.8em);\n padding: 0;\n color: var(--separator-dark, rgba(0, 0, 0, 0.7));\n font-family: inherit;\n line-height: 1;\n overflow: visible;\n }\n\n .day-cell:hover {\n background: var(--separator-light, rgba(0, 0, 0, 0.08));\n }\n\n .day-cell.current {\n background: var(--primary-color, dodgerblue);\n color: white;\n font-weight: bold;\n }\n\n .day-cell.current:hover {\n opacity: 0.85;\n }\n\n .day-cell.selected {\n outline: 2px solid var(--primary-color, dodgerblue);\n outline-offset: -2px;\n }\n\n /* ── Dot density mode ── */\n .day-cell.has-events::after {\n content: '';\n position: absolute;\n bottom: 1px;\n left: 50%;\n transform: translateX(-50%);\n width: 3px;\n height: 3px;\n border-radius: 50%;\n background: var(--year-dot-color, var(--indicator-color, var(--primary-color, dodgerblue)));\n }\n\n .day-cell.current.has-events::after {\n background: rgba(255, 255, 255, 0.9);\n }\n\n /* ── Heatmap density mode ── */\n .day-cell[data-density='1'] {\n background: var(--year-heatmap-1, rgba(30, 144, 255, 0.15));\n }\n .day-cell[data-density='2'] {\n background: var(--year-heatmap-2, rgba(30, 144, 255, 0.35));\n }\n .day-cell[data-density='3'] {\n background: var(--year-heatmap-3, rgba(30, 144, 255, 0.55));\n }\n .day-cell[data-density='4'] {\n background: var(--year-heatmap-4, rgba(30, 144, 255, 0.75));\n color: white;\n }\n\n .day-cell.current[data-density] {\n background: var(--primary-color, dodgerblue);\n }\n\n /* ── Count density mode ── */\n .event-count {\n position: absolute;\n bottom: -0.55em;\n left: 50%;\n transform: translateX(-50%);\n font-size: 0.55em;\n color: var(--header-text-color, rgba(0, 0, 0, 0.5));\n line-height: 1;\n }\n\n .day-cell.current .event-count {\n color: rgba(255, 255, 255, 0.8);\n }\n\n .empty-cell {\n /* Grid auto-rows handles height; no explicit size needed */\n }\n `;\n\n override render() {\n const year = this.activeDate.year;\n const today = new Date();\n const todayDay = today.getDate();\n const todayMonth = today.getMonth() + 1;\n const todayYear = today.getFullYear();\n\n const weekdayOrder = getWeekdayOrder(this.firstDayOfWeek);\n\n return html`\n <div class=\"year-grid\" role=\"grid\" aria-label=\"${getMessages(this.locale).year} ${year}\">\n ${Array.from({ length: 12 }, (_, i) => {\n const month = i + 1;\n return this._renderMiniMonth(\n year,\n month,\n todayDay,\n todayMonth,\n todayYear,\n weekdayOrder,\n );\n })}\n </div>\n `;\n }\n\n private _renderMiniMonth(\n year: number,\n month: number,\n todayDay: number,\n todayMonth: number,\n todayYear: number,\n weekdayOrder: number[],\n ) {\n const daysInMonth = new Date(year, month, 0).getDate();\n const firstDayOffset = getFirstDayOffset({ year, month, day: 1 }, this.firstDayOfWeek);\n const msg = getMessages(this.locale);\n\n // Build explicit week rows: each row is a 7-slot array (null = empty cell)\n const weeks: (number | null)[][] = [];\n let currentWeek: (number | null)[] = Array.from({ length: firstDayOffset }, () => null);\n for (let day = 1; day <= daysInMonth; day++) {\n currentWeek.push(day);\n if (currentWeek.length === 7) {\n weeks.push(currentWeek);\n currentWeek = [];\n }\n }\n if (currentWeek.length > 0) {\n while (currentWeek.length < 7) currentWeek.push(null);\n weeks.push(currentWeek);\n }\n\n return html`\n <div class=\"mini-month\">\n <button\n type=\"button\"\n class=\"month-label\"\n @click=${() => this._handleMonthClick(year, month)}\n >\n ${getLocalizedMonth(month, this.locale)}\n </button>\n <div class=\"weekday-header\">\n <span></span>\n ${weekdayOrder.map(\n (wd) =>\n html`<span>${getLocalizedWeekdayShort(wd, this.locale).charAt(0)}</span>`,\n )}\n </div>\n <div class=\"day-grid\">\n ${weeks.map((week) => {\n const firstDay = week.find((d) => d !== null);\n const weekNum = firstDay\n ? DateTime.fromObject({ year, month, day: firstDay }).weekNumber\n : null;\n return html`\n ${\n weekNum !== null\n ? html`<button\n type=\"button\"\n class=\"cw-label\"\n aria-label=\"${msg.calendarWeek} ${weekNum}\"\n @click=${() => this._handleWeekClick(year, month, firstDay!)}\n >${weekNum}</button>`\n : html`\n <span class=\"empty-cell\"></span>\n `\n }\n ${week.map((day) =>\n day !== null\n ? this._renderDayCell(\n year,\n month,\n day,\n day === todayDay &&\n month === todayMonth &&\n year === todayYear,\n day === this.activeDate.day &&\n month === this.activeDate.month &&\n year === this.activeDate.year,\n this.entrySumByDay[`${year}-${month}-${day}`] ?? 0,\n )\n : html`\n <span class=\"empty-cell\"></span>\n `,\n )}\n `;\n })}\n </div>\n </div>\n `;\n }\n\n private _renderDayCell(\n year: number,\n month: number,\n day: number,\n isCurrent: boolean,\n isSelected: boolean,\n eventCount: number,\n ) {\n const classes = ['day-cell'];\n if (isCurrent) classes.push('current');\n if (isSelected && !isCurrent) classes.push('selected');\n\n // Density-specific attributes\n let densityAttr = '';\n if (this.densityMode === 'dot' && eventCount > 0) {\n classes.push('has-events');\n } else if (this.densityMode === 'heatmap' && eventCount > 0) {\n const bucket = eventCount <= 2 ? 1 : eventCount <= 5 ? 2 : eventCount <= 9 ? 3 : 4;\n densityAttr = `${bucket}`;\n }\n\n return html`\n <button\n type=\"button\"\n class=${classes.join(' ')}\n data-density=${densityAttr || nothing}\n data-date=\"${year}-${month}-${day}\"\n @click=${() => this._handleDayClick(year, month, day)}\n aria-label=\"${day} ${getLocalizedMonth(month, this.locale)} ${year}${eventCount > 0 ? `, ${eventCount} ${getMessages(this.locale).events}` : ''}\"\n >\n ${day}\n ${\n this.densityMode === 'count' && eventCount > 0\n ? html`<span class=\"event-count\">${eventCount}</span>`\n : nothing\n }\n </button>\n `;\n }\n\n private _handleDayClick(year: number, month: number, day: number) {\n this.dispatchEvent(\n new CustomEvent('expand', {\n detail: {\n date: { year, month, day },\n drillTarget: this.drillTarget,\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _handleWeekClick(year: number, month: number, day: number) {\n this.dispatchEvent(\n new CustomEvent('expand', {\n detail: {\n date: { year, month, day },\n drillTarget: 'week',\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _handleMonthClick(year: number, month: number) {\n this.dispatchEvent(\n new CustomEvent('expand', {\n detail: {\n date: { year, month, day: 1 },\n drillTarget: 'month',\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n}\n","/**\n * Calculates the text color and background color based on the given color.\n *\n * @param {string} color - The color to process.\n * @returns {[string, string]} An array containing the text color and background color.\n */\nexport default function getColorTextWithContrast(color?: string): [string, string] {\n let red = 0;\n let green = 0;\n let blue = 0;\n\n // Return default colors for undefined, empty string, or whitespace\n if (!color || !color.trim()) {\n return ['rgb(255,255,255)', 'rgb(0,0,0)'];\n }\n // Check for empty or whitespace-only string\n // Add # if missing\n const normalizedColor = color.startsWith('#') ? color : `#${color}`;\n\n const matches: RegExpMatchArray | null = normalizedColor\n .replace(/^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i, (_m, r, g, b) => `#${r}${r}${g}${g}${b}${b}`)\n .substring(1)\n .match(/.{2}/g);\n\n if (!matches || matches.length !== 3) {\n // Return default background and text colors for invalid input\n return ['rgb(255,255,255)', 'rgb(0,0,0)'];\n }\n\n try {\n [red, green, blue] = matches.map((x) => parseInt(x, 16));\n if (isNaN(red) || isNaN(green) || isNaN(blue)) {\n return ['rgb(255,255,255)', 'rgb(0,0,0)'];\n }\n } catch {\n return ['rgb(255,255,255)', 'rgb(0,0,0)'];\n }\n\n // Calculate brightness of randomized colour\n const brightness = (red * 299 + green * 587 + blue * 114) / 1000;\n\n // Calculate brightness of white and black text\n const lightText = (255 * 299 + 255 * 587 + 255 * 114) / 1000;\n const darkText = (0 * 299 + 0 * 587 + 0 * 114) / 1000;\n\n const backgroundColor = `rgb(${red},${green},${blue})`;\n const textColor =\n Math.abs(brightness - lightText) > Math.abs(brightness - darkText)\n ? 'rgb(255, 255, 255)'\n : 'rgb(0, 0, 0)';\n\n return [backgroundColor, textColor];\n}\n","/**\n * Deterministic layout calculation engine for overlapping calendar events\n * Separates layout logic from rendering concerns\n */\n\ninterface CalendarEvent {\n id: string;\n heading: string;\n startTime: { hour: number; minute: number };\n endTime: { hour: number; minute: number };\n color: string;\n}\n\ninterface GridConfig {\n minuteHeight: number;\n eventMinHeight: number;\n}\n\nexport interface LayoutBox {\n id: string;\n x: number;\n y: number;\n width: number;\n height: number;\n depth: number;\n group: number;\n opacity: number;\n zIndex: number;\n}\n\nexport interface LayoutResult {\n boxes: LayoutBox[];\n}\n\nexport class LayoutCalculator {\n private config: GridConfig;\n\n constructor(config: Partial<GridConfig & Record<string, number>> = {}) {\n this.config = {\n minuteHeight: config.minuteHeight ?? 1,\n eventMinHeight: config.eventMinHeight ?? 20,\n };\n }\n\n calculateLayout(events: CalendarEvent[]): LayoutResult {\n const intervals = this.eventsToIntervals(events);\n const grading = this.calculateGrading(intervals);\n const boxes = this.calculateBoxes(events, grading);\n\n return { boxes };\n }\n\n private eventsToIntervals(events: CalendarEvent[]): Array<{ start: number; end: number }> {\n return events.map((event) => ({\n start: event.startTime.hour * 60 + event.startTime.minute,\n end: event.endTime.hour * 60 + event.endTime.minute,\n }));\n }\n\n private calculateGrading(\n intervals: Array<{ start: number; end: number }>,\n ): Array<{ index: number; depth: number; group: number }> {\n const grading: Array<{ index: number; depth: number; group: number }> = [];\n\n const groups = this.findOverlapGroups(intervals);\n\n groups.forEach((groupIndices, groupId) => {\n if (groupIndices.length === 1) {\n grading.push({\n index: groupIndices[0],\n depth: 0,\n group: groupId,\n });\n } else {\n const groupIntervals = groupIndices.map((i) => ({\n ...intervals[i],\n originalIndex: i,\n }));\n\n const longestEvent = groupIntervals.reduce((longest, current) => {\n const currentDuration = current.end - current.start;\n const longestDuration = longest.end - longest.start;\n return currentDuration > longestDuration ? current : longest;\n });\n\n let nextDepth = 1;\n groupIntervals.forEach((interval) => {\n const isLongestEvent = interval.originalIndex === longestEvent.originalIndex;\n const depth = isLongestEvent ? 0 : nextDepth++;\n grading.push({\n index: interval.originalIndex,\n depth,\n group: groupId,\n });\n });\n }\n });\n\n grading.sort((a, b) => a.index - b.index);\n return grading;\n }\n\n private findOverlapGroups(intervals: Array<{ start: number; end: number }>): Array<number[]> {\n const groups: Array<number[]> = [];\n const assigned = new Set<number>();\n\n intervals.forEach((_interval, index) => {\n if (assigned.has(index)) return;\n\n const group = [index];\n assigned.add(index);\n\n let changed = true;\n while (changed) {\n changed = false;\n intervals.forEach((otherInterval, otherIndex) => {\n if (assigned.has(otherIndex)) return;\n\n const overlapsWithGroup = group.some((groupIndex) =>\n this.intervalsOverlap(intervals[groupIndex], otherInterval),\n );\n\n if (overlapsWithGroup) {\n group.push(otherIndex);\n assigned.add(otherIndex);\n changed = true;\n }\n });\n }\n\n groups.push(group);\n });\n\n return groups;\n }\n\n private intervalsOverlap(\n a: { start: number; end: number },\n b: { start: number; end: number },\n ): boolean {\n return a.start < b.end && b.start < a.end;\n }\n\n private calculateBoxes(\n events: CalendarEvent[],\n grading: Array<{ index: number; depth: number; group: number }>,\n ): LayoutBox[] {\n const eventsByGroup = new Map<\n number,\n Array<{\n event: CalendarEvent;\n index: number;\n grade: { index: number; depth: number; group: number };\n }>\n >();\n\n events.forEach((event, index) => {\n const grade = grading[index] || { depth: 0, group: index };\n if (!eventsByGroup.has(grade.group)) {\n eventsByGroup.set(grade.group, []);\n }\n eventsByGroup.get(grade.group)!.push({ event, index, grade });\n });\n\n return events.map((event, index) => {\n const grade = grading[index] || { depth: 0, group: index };\n const startMinute = event.startTime.hour * 60 + event.startTime.minute;\n const endMinute = event.endTime.hour * 60 + event.endTime.minute;\n const duration = endMinute - startMinute;\n\n const groupEvents = eventsByGroup.get(grade.group) || [];\n const maxDepthInGroup = Math.max(...groupEvents.map((g) => g.grade.depth));\n\n let width: number;\n let x: number;\n\n if (groupEvents.length === 1) {\n width = 100;\n x = 0;\n } else {\n const minReadableWidth = 65;\n const maxRange = 100 - minReadableWidth;\n\n if (grade.depth === 0) {\n x = 0;\n width = 100;\n } else {\n x = maxDepthInGroup > 0 ? (grade.depth / maxDepthInGroup) * maxRange : 0;\n width = 100 - x;\n }\n }\n\n const baseZIndex = 100;\n const zIndex = baseZIndex + grade.depth;\n\n return {\n id: event.id,\n x,\n y: startMinute * this.config.minuteHeight,\n width,\n height: Math.max(duration * this.config.minuteHeight, this.config.eventMinHeight),\n depth: grade.depth,\n group: grade.group,\n opacity: grade.depth === 0 ? 0.95 : Math.max(0.85, 0.95 - grade.depth * 0.05),\n zIndex,\n };\n });\n }\n}\n","/**\n * SlotManager - Centralized abstraction for calendar entry positioning\n *\n * This class handles all the complexity of positioning calendar entries across different views:\n * - Day view: uses slots for time-based positioning\n * - Week view: uses slots for day+time positioning\n * - Month view: uses slots for date-based positioning\n *\n * It provides a clean, deterministic API that abstracts away the underlying slot mechanism\n * and grid positioning complexities.\n */\n\nimport type { ViewMode } from './ViewStateController.js';\nimport { type FirstDayOfWeek, getWeekDates } from './weekStartHelper.js';\n\n// Import types - these should be available globally but let's be explicit\ndeclare global {\n type CalendarDate = {\n day: number;\n month: number;\n year: number;\n };\n\n type CalendarTimeInterval = {\n start: { hour: number; minute: number };\n end: { hour: number; minute: number };\n };\n}\n\nexport type { ViewMode };\nexport type { FirstDayOfWeek };\n\nexport interface PositionConfig {\n viewMode: ViewMode;\n date: CalendarDate;\n time?: CalendarTimeInterval;\n isAllDay?: boolean;\n activeDate?: CalendarDate; // For week view calculations\n firstDayOfWeek?: FirstDayOfWeek; // 0=Sun, 1=Mon (default), 6=Sat\n weekDates?: CalendarDate[]; // Optional visible subset for condensed week view\n}\n\nexport interface LayoutDimensions {\n width: number; // Percentage (0-100)\n x: number; // Percentage offset (0-100)\n zIndex: number; // Stacking order\n opacity: number; // Transparency\n height?: number; // For absolute positioning\n}\n\nexport interface AccessibilityInfo {\n tabIndex: number; // Tab order for keyboard navigation\n role: 'button'; // ARIA role\n ariaLabel: string; // Screen reader description\n}\n\nexport interface SlotPosition {\n slotName: string;\n gridColumn?: number; // For direct grid positioning\n gridRow?: string; // For direct grid positioning\n useDirectGrid: boolean; // Whether to bypass slots entirely\n useAbsolutePosition?: boolean; // Whether to use absolute positioning (replaces 1440-row grid)\n isAllDay?: boolean; // Whether this is an all-day event\n dayIndex?: number; // Which day column (0-6 for week view)\n isMultiDay?: boolean; // Whether this spans multiple days\n}\n\nexport class SlotManager {\n /** Cached week-date→index map, keyed by (activeDate + firstDayOfWeek). */\n private _weekIndexCache: {\n key: string;\n map: Map<string, number>;\n } | null = null;\n\n /**\n * Calculate the slot name and positioning for an entry\n */\n public calculatePosition(config: PositionConfig): SlotPosition {\n const { viewMode, date, time, isAllDay } = config;\n\n switch (viewMode) {\n case 'day':\n return this._calculateDayPosition(date, time, isAllDay);\n case 'week':\n return this._calculateWeekPosition(date, config.activeDate!, time, isAllDay, config.firstDayOfWeek, config.weekDates);\n case 'month':\n return this._calculateMonthPosition(date);\n default:\n throw new Error(`Unsupported view mode: ${viewMode}`);\n }\n }\n\n /**\n * Generate CSS styles for positioning an entry based on layout dimensions\n */\n public generatePositionCSS(\n position: SlotPosition,\n layout: LayoutDimensions,\n time?: CalendarTimeInterval,\n ): string {\n if (position.useAbsolutePosition && time) {\n // Absolute positioning — replaces 1440-row grid\n const startMinute = time.start.hour * 60 + time.start.minute;\n const endMinute = time.end.hour * 60 + time.end.minute;\n const duration = Math.max(endMinute - startMinute, 20);\n return [\n 'position: absolute',\n `top: calc(${startMinute} * var(--minute-height))`,\n `height: calc(${duration} * var(--minute-height))`,\n `width: ${layout.width}%`,\n `left: ${layout.x}%`,\n `z-index: ${layout.zIndex}`,\n `opacity: ${layout.opacity}`,\n 'margin-left: 0',\n 'grid-column: unset',\n 'grid-row: unset',\n ].join('; ');\n }\n\n if (position.useDirectGrid) {\n // Direct grid positioning (bypasses slots)\n return `grid-column: ${position.gridColumn || 2}; grid-row: ${position.gridRow || '1'}; --entry-width: ${layout.width}%; --entry-margin-left: ${layout.x}%; --entry-z-index: ${layout.zIndex}; --entry-opacity: ${layout.opacity};`;\n } else {\n // Slot-based positioning with CSS variables\n const startSlot = time ? this._getGridSlotByTime(time) : '1';\n return `--start-slot: ${startSlot}; --entry-width: ${layout.width}%; --entry-margin-left: ${layout.x}%; --entry-z-index: ${layout.zIndex}; --entry-opacity: ${layout.opacity};`;\n }\n }\n\n /**\n * Day view positioning: uses absolute positioning for timed entries\n */\n private _calculateDayPosition(\n _date: CalendarDate,\n time?: CalendarTimeInterval,\n isAllDay?: boolean,\n ): SlotPosition {\n if (isAllDay) {\n return {\n slotName: 'all-day',\n useDirectGrid: false,\n };\n }\n\n if (!time) {\n throw new Error('Day view entries must have time information');\n }\n\n return {\n slotName: 'timed',\n useDirectGrid: false,\n useAbsolutePosition: true,\n };\n }\n\n /**\n * Week view positioning: uses absolute positioning within per-day slot containers\n */\n private _calculateWeekPosition(\n date: CalendarDate,\n activeDate: CalendarDate,\n time?: CalendarTimeInterval,\n isAllDay?: boolean,\n firstDayOfWeek?: FirstDayOfWeek,\n weekDates?: CalendarDate[],\n ): SlotPosition {\n // Calculate which day column this entry belongs to\n // When weekDates is provided (condensed view), use it for 0-based column indexing\n const dayColumnIndex = weekDates\n ? this.getIndexInDates(date, weekDates)\n : this.getWeekDayIndex(date, activeDate, firstDayOfWeek ?? 1);\n const gridColumn = dayColumnIndex + 2; // +2 because column 1 is for time indicators\n\n if (isAllDay) {\n return {\n slotName: `all-day-${date.year}-${date.month}-${date.day}`,\n gridColumn,\n gridRow: '1 / 60', // All-day area spans first hour\n useDirectGrid: false, // Use slot-based positioning for all-day events\n isAllDay: true,\n dayIndex: dayColumnIndex,\n };\n }\n\n if (!time) {\n throw new Error('Week view timed entries must have time information');\n }\n\n return {\n slotName: `timed-${date.year}-${date.month}-${date.day}`,\n useDirectGrid: false,\n useAbsolutePosition: true,\n dayIndex: dayColumnIndex,\n };\n }\n\n /**\n * Month view positioning: uses date-based slots\n */\n private _calculateMonthPosition(date: CalendarDate): SlotPosition {\n return {\n slotName: `${date.year}-${date.month}-${date.day}`,\n useDirectGrid: false,\n };\n }\n\n /**\n * Convert a pixel offset within a time column to a time object.\n * Reads --minute-height from the host element. For future drag/resize interactions.\n */\n public pxToTime(px: number, hostEl: Element): { hour: number; minute: number } {\n const minuteHeight = parseFloat(\n getComputedStyle(hostEl).getPropertyValue('--minute-height'),\n ) || 0.8;\n const totalMinutes = Math.round(px / minuteHeight);\n const clamped = Math.max(0, Math.min(totalMinutes, 1439));\n return { hour: Math.floor(clamped / 60), minute: clamped % 60 };\n }\n\n /**\n * Calculate which day of the week an entry belongs to (0-6, where 0 is the first day).\n * Internally caches the week-date→index map so repeated calls for the same\n * (activeDate, firstDayOfWeek) avoid re-allocating 7 Date objects and scanning.\n */\n public getWeekDayIndex(\n entryDate: CalendarDate,\n activeDate: CalendarDate,\n firstDayOfWeek: FirstDayOfWeek = 1,\n ): number {\n const cacheKey = `${activeDate.year}-${activeDate.month}-${activeDate.day}-${firstDayOfWeek}`;\n if (!this._weekIndexCache || this._weekIndexCache.key !== cacheKey) {\n const weekDates = getWeekDates(activeDate, firstDayOfWeek);\n const map = new Map<string, number>();\n weekDates.forEach((d, i) => map.set(`${d.year}-${d.month}-${d.day}`, i));\n this._weekIndexCache = { key: cacheKey, map };\n }\n const idx = this._weekIndexCache.map.get(\n `${entryDate.year}-${entryDate.month}-${entryDate.day}`,\n );\n // Return 0 if not found, to prevent undefined from breaking sorting\n return idx ?? 0;\n }\n\n /**\n * Look up a date's index within a provided date array (for condensed views).\n */\n public getIndexInDates(date: CalendarDate, dates: CalendarDate[]): number {\n const idx = dates.findIndex(\n (d) => d.year === date.year && d.month === date.month && d.day === date.day,\n );\n return idx >= 0 ? idx : 0;\n }\n\n /**\n * Convert time interval to CSS grid row specification\n */\n private _getGridSlotByTime({ start, end }: CalendarTimeInterval): string {\n const startRow = start.hour * 60 + (start.minute + 1);\n const endRow = startRow + (end.hour * 60 + end.minute - startRow);\n\n if (startRow === endRow) {\n return `${startRow}/${endRow + 1}`;\n }\n\n return `${startRow}/${endRow}`;\n }\n\n /**\n * Calculate accessibility information including logical tab order\n */\n public calculateAccessibility(config: PositionConfig): AccessibilityInfo {\n const { viewMode, date, time, isAllDay, firstDayOfWeek } = config;\n\n let tabIndex = 0;\n\n if (viewMode === 'week' && time && !isAllDay) {\n const dayOfWeek = this.getWeekDayIndex(date, config.activeDate!, firstDayOfWeek ?? 1);\n tabIndex = 10000 + dayOfWeek * 10000 + time.start.hour * 100 + time.start.minute;\n } else if (viewMode === 'day' && time && !isAllDay) {\n tabIndex = time.start.hour * 60 + time.start.minute;\n } else if (isAllDay) {\n if (viewMode === 'week') {\n const dayOfWeek = this.getWeekDayIndex(date, config.activeDate!, firstDayOfWeek ?? 1);\n tabIndex = 1000 + dayOfWeek;\n } else {\n tabIndex = 0;\n }\n }\n\n return {\n tabIndex,\n role: 'button',\n ariaLabel: this._generateAriaLabel(config),\n };\n }\n\n /**\n * Generate comprehensive ARIA label for screen readers\n */\n private _generateAriaLabel(config: PositionConfig): string {\n const { date, time, isAllDay } = config;\n\n // Format date\n const dateStr = `${date.month}/${date.day}/${date.year}`;\n\n // Format time\n const timeStr =\n isAllDay || !time\n ? 'All day'\n : `${String(time.start.hour).padStart(2, '0')}:${String(time.start.minute).padStart(\n 2,\n '0',\n )} to ${String(time.end.hour).padStart(\n 2,\n '0',\n )}:${String(time.end.minute).padStart(2, '0')}`;\n\n return `Calendar event on ${dateStr}, ${timeStr}. Press Enter or Space to open details.`;\n }\n\n /**\n * Get human-readable description of position (for debugging)\n */\n public getPositionDescription(config: PositionConfig): string {\n const position = this.calculatePosition(config);\n\n if (position.useDirectGrid) {\n return `Direct grid: column ${position.gridColumn}, row ${position.gridRow}`;\n } else {\n return `Slot: \"${position.slotName}\"`;\n }\n }\n\n /**\n * Validate that a position configuration is valid\n */\n public validatePosition(config: PositionConfig): {\n valid: boolean;\n error?: string;\n } {\n try {\n this.calculatePosition(config);\n return { valid: true };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Unknown validation error',\n };\n }\n }\n}\n\n// Export singleton instance\nexport const slotManager = new SlotManager();\n","import type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nexport type ViewMode = 'month' | 'week' | 'day' | 'year';\n\nexport class ViewStateController implements ReactiveController {\n private _host: ReactiveControllerHost;\n private _viewMode: ViewMode = 'month';\n private _activeDate: CalendarDate;\n\n constructor(host: ReactiveControllerHost) {\n this._host = host;\n host.addController(this);\n\n const today = new Date();\n this._activeDate = {\n day: today.getDate(),\n month: today.getMonth() + 1,\n year: today.getFullYear(),\n };\n }\n\n hostConnected(): void {}\n\n get viewMode(): ViewMode {\n return this._viewMode;\n }\n\n get activeDate(): CalendarDate {\n return this._activeDate;\n }\n\n get expandedDate(): CalendarDate | undefined {\n return this._viewMode === 'day' ? this._activeDate : undefined;\n }\n\n setViewMode(mode: ViewMode): void {\n this._viewMode = mode;\n this._host.requestUpdate();\n }\n\n setActiveDate(date: CalendarDate): void {\n this._activeDate = date;\n this._host.requestUpdate();\n }\n\n navigateNext(): void {\n const current = this._activeDate;\n\n if (this._viewMode === 'month') {\n const nextMonth = new Date(current.year, current.month, 1);\n this.setActiveDate({\n day: 1,\n month: nextMonth.getMonth() + 1,\n year: nextMonth.getFullYear(),\n });\n } else if (this._viewMode === 'week') {\n const currentDateObj = new Date(current.year, current.month - 1, current.day);\n currentDateObj.setDate(currentDateObj.getDate() + 7);\n this.setActiveDate({\n day: currentDateObj.getDate(),\n month: currentDateObj.getMonth() + 1,\n year: currentDateObj.getFullYear(),\n });\n } else if (this._viewMode === 'day') {\n const nextDay = new Date(current.year, current.month - 1, current.day + 1);\n this.setActiveDate({\n day: nextDay.getDate(),\n month: nextDay.getMonth() + 1,\n year: nextDay.getFullYear(),\n });\n } else if (this._viewMode === 'year') {\n const nextYear = new Date(current.year + 1, current.month - 1, 1);\n const clamped = new Date(nextYear.getFullYear(), current.month - 1, current.day);\n // Clamp day if it overflows (e.g. Feb 29 → Feb 28 in non-leap year)\n if (clamped.getMonth() !== current.month - 1) {\n clamped.setDate(0); // last day of previous month\n }\n this.setActiveDate({\n day: clamped.getDate(),\n month: clamped.getMonth() + 1,\n year: clamped.getFullYear(),\n });\n }\n }\n\n navigatePrevious(): void {\n const current = this._activeDate;\n\n if (this._viewMode === 'month') {\n const prevMonth = new Date(current.year, current.month - 2, 1);\n this.setActiveDate({\n day: 1,\n month: prevMonth.getMonth() + 1,\n year: prevMonth.getFullYear(),\n });\n } else if (this._viewMode === 'week') {\n const currentDateObj = new Date(current.year, current.month - 1, current.day);\n currentDateObj.setDate(currentDateObj.getDate() - 7);\n this.setActiveDate({\n day: currentDateObj.getDate(),\n month: currentDateObj.getMonth() + 1,\n year: currentDateObj.getFullYear(),\n });\n } else if (this._viewMode === 'day') {\n const prevDay = new Date(current.year, current.month - 1, current.day - 1);\n this.setActiveDate({\n day: prevDay.getDate(),\n month: prevDay.getMonth() + 1,\n year: prevDay.getFullYear(),\n });\n } else if (this._viewMode === 'year') {\n const prevYear = new Date(current.year - 1, current.month - 1, 1);\n const clamped = new Date(prevYear.getFullYear(), current.month - 1, current.day);\n // Clamp day if it overflows (e.g. Feb 29 → Feb 28 in non-leap year)\n if (clamped.getMonth() !== current.month - 1) {\n clamped.setDate(0);\n }\n this.setActiveDate({\n day: clamped.getDate(),\n month: clamped.getMonth() + 1,\n year: clamped.getFullYear(),\n });\n }\n }\n\n jumpToToday(): void {\n const today = new Date();\n this.setActiveDate({\n day: today.getDate(),\n month: today.getMonth() + 1,\n year: today.getFullYear(),\n });\n }\n\n switchToMonthView(): void {\n this.setViewMode('month');\n }\n\n switchToWeekView(): void {\n this.setViewMode('week');\n }\n\n switchToDayView(): void {\n this.setViewMode('day');\n }\n\n switchToYearView(): void {\n this.setViewMode('year');\n }\n}\n","/**\n * Week display context — computes the visible day subset for condensed week views.\n *\n * Pure function (apart from a single `getComputedStyle` read for CSS tokens).\n * Designed for easy unit testing by passing a mock host element.\n */\n\nimport { type FirstDayOfWeek, getWeekDates } from './weekStartHelper.js';\n\nexport interface WeekDisplayContext {\n /** Full 7-day week dates. */\n weekDates: CalendarDate[];\n /** Subset actually shown (same as weekDates when not condensed). */\n visibleDates: CalendarDate[];\n /** Offset into weekDates where visibleDates starts. */\n visibleStartIndex: number;\n /** How many columns are visible. */\n visibleLength: number;\n /** True when showing fewer than 7 days. */\n isCondensed: boolean;\n /** CSS grid-template-columns value for the week grid. */\n gridColumns: string;\n}\n\n/**\n * Read a CSS custom property from an element, returning a trimmed string or the fallback.\n */\nfunction readCSSToken(hostEl: Element, prop: string, fallback: string): string {\n return getComputedStyle(hostEl).getPropertyValue(prop).trim() || fallback;\n}\n\n/**\n * Clamp a value to [min, max].\n */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Find the index of `activeDate` within `weekDates`, or return 0 if not found.\n */\nfunction findActiveDateIndex(weekDates: CalendarDate[], activeDate: CalendarDate): number {\n const idx = weekDates.findIndex(\n (d) => d.year === activeDate.year && d.month === activeDate.month && d.day === activeDate.day,\n );\n return idx >= 0 ? idx : 0;\n}\n\n/**\n * Compute the visible window start index, centered on `activeIndex`,\n * clamped so the window stays within [0, 7).\n */\nfunction computeVisibleStart(activeIndex: number, count: number): number {\n // Center the window around the active date\n const idealStart = activeIndex - Math.floor((count - 1) / 2);\n return clamp(idealStart, 0, 7 - count);\n}\n\n/**\n * Compute the week display context based on CSS custom properties and viewport width.\n *\n * Reads three tokens from `hostEl`:\n * - `--week-day-count` (default 7): full-width column count\n * - `--week-mobile-day-count` (default 3): condensed column count below breakpoint\n * - `--week-mobile-breakpoint` (default 768px): width threshold\n */\nexport function computeWeekDisplayContext(\n activeDate: CalendarDate,\n firstDayOfWeek: FirstDayOfWeek,\n calendarWidth: number,\n hostEl: Element,\n): WeekDisplayContext {\n // 1. Read CSS custom properties\n const rawFull = parseInt(readCSSToken(hostEl, '--week-day-count', '7'), 10);\n const fullCount = clamp(Number.isNaN(rawFull) ? 7 : rawFull, 1, 7);\n const rawMobile = parseInt(readCSSToken(hostEl, '--week-mobile-day-count', '3'), 10);\n const mobileCount = clamp(Number.isNaN(rawMobile) ? 3 : rawMobile, 1, 7);\n const rawBreakpoint = parseInt(readCSSToken(hostEl, '--week-mobile-breakpoint', '768'), 10);\n const breakpoint = Number.isNaN(rawBreakpoint) ? 768 : rawBreakpoint;\n\n // 2. Determine effective day count based on viewport width\n const effectiveCount = calendarWidth < breakpoint ? mobileCount : fullCount;\n\n // 3. Get the full 7-day week\n const weekDates = getWeekDates(activeDate, firstDayOfWeek);\n\n // 4. If showing all 7, return the full week (no condensing)\n if (effectiveCount >= 7) {\n return {\n weekDates,\n visibleDates: weekDates,\n visibleStartIndex: 0,\n visibleLength: 7,\n isCondensed: false,\n gridColumns: 'var(--time-column-width) repeat(7, 1fr)',\n };\n }\n\n // 5. Center the visible window around the active date\n const activeIndex = findActiveDateIndex(weekDates, activeDate);\n const visibleStartIndex = computeVisibleStart(activeIndex, effectiveCount);\n const visibleDates = weekDates.slice(visibleStartIndex, visibleStartIndex + effectiveCount);\n\n return {\n weekDates,\n visibleDates,\n visibleStartIndex,\n visibleLength: effectiveCount,\n isCondensed: true,\n gridColumns: `var(--time-column-width) repeat(${effectiveCount}, 1fr)`,\n };\n}\n","import { ResizeController } from '@lit-labs/observers/resize-controller.js';\nimport { LitElement, PropertyValueMap, css, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { DateTime, Interval } from 'luxon';\nimport * as R from 'remeda';\nimport { match } from 'ts-pattern';\n\nimport LMSCalendarContext from './components/Context';\nimport './components/Context.js';\nimport LMSCalendarDay from './components/Day';\nimport './components/Day.js';\nimport LMSCalendarEntry from './components/Entry';\nimport './components/Entry.js';\nimport LMSCalendarHeader from './components/Header';\nimport './components/Header.js';\nimport LMSCalendarMenu from './components/Menu';\nimport './components/Menu.js';\nimport LMSCalendarMonth from './components/Month';\nimport './components/Month.js';\nimport LMSCalendarWeek from './components/Week';\nimport './components/Week.js';\nimport LMSCalendarYear from './components/Year';\nimport './components/Year.js';\nimport type { DensityMode, DrillTarget } from './components/Year.js';\nimport { allocateAllDayRows, computeSpanClass, type AllDayEvent } from './lib/allDayLayout.js';\nimport getColorTextWithContrast from './lib/getColorTextWithContrast.js';\nimport { LayoutCalculator, type LayoutResult } from './lib/LayoutCalculator.js';\nimport { getMessages } from './lib/messages.js';\nimport {\n slotManager,\n type LayoutDimensions,\n type PositionConfig,\n type FirstDayOfWeek,\n} from './lib/SlotManager.js';\nimport { ViewStateController } from './lib/ViewStateController.js';\nimport { computeWeekDisplayContext, type WeekDisplayContext } from './lib/weekDisplayContext.js';\nimport { getWeekDates } from './lib/weekStartHelper.js';\n\n// ── Derived type for expanded (multi-day) entries ──────────────────────\ntype ExpandedCalendarEntry = CalendarEntry & {\n isContinuation: boolean;\n continuation: Continuation;\n originalStartDate?: CalendarDate;\n originalIndex: number;\n};\n\n@customElement('lms-calendar')\nexport default class LMSCalendar extends LitElement {\n @property({ type: String })\n heading?: string;\n\n @property({ type: Number, attribute: 'first-day-of-week' })\n firstDayOfWeek: FirstDayOfWeek = 1;\n\n @property({ type: String })\n locale = (typeof document !== 'undefined' && document.documentElement.lang) || 'en';\n\n @property({ type: String, attribute: 'year-drill-target' })\n yearDrillTarget: DrillTarget = 'month';\n\n @property({ type: String, attribute: 'year-density-mode' })\n yearDensityMode: DensityMode = 'dot';\n\n private _viewState = new ViewStateController(this);\n\n get activeDate(): CalendarDate {\n return this._viewState.activeDate;\n }\n\n set activeDate(value: CalendarDate) {\n this._viewState.setActiveDate(value);\n }\n\n @property({ type: Array })\n entries: CalendarEntry[] = [];\n\n @property({ type: String })\n color = '#000000';\n\n get _expandedDate(): CalendarDate | undefined {\n return this._viewState.expandedDate;\n }\n\n @state() _calendarWidth: number = (typeof window !== 'undefined' && window.innerWidth) || 1024;\n\n @state() _menuOpen = false;\n @state() _menuEventDetails?: {\n heading: string;\n content: string;\n time?: CalendarTimeInterval;\n displayTime: string;\n date?: CalendarDate;\n anchorRect?: DOMRect;\n };\n private _menuTriggerEntry?: HTMLElement;\n\n private _processedEntries: CalendarEntry[] = [];\n\n // ── Memoized derived data (recomputed only when `entries` changes) ──\n // Think of these as `useMemo(() => …, [entries])` — willUpdate is the\n // dependency check, and render methods are pure consumers.\n\n /** All entries expanded across their date spans (shared by every view). */\n private _expandedEntries: ExpandedCalendarEntry[] = [];\n\n /** Month view: sorted + color-annotated, ready for _renderEntries. */\n private _monthViewSorted: Array<{\n entry: ExpandedCalendarEntry;\n background: string;\n originalIndex: number;\n }> = [];\n\n /** Mobile badge view: per-day event counts, ready for _renderEntriesSumByDay. */\n private _entrySumByDay: Record<string, number> = {};\n\n /** Day/week view: expanded entries grouped by ISO date for O(1) lookup. */\n private _expandedByISODate = new Map<string, ExpandedCalendarEntry[]>();\n\n /** Day/week view: cached LayoutCalculator results keyed by ISO date. */\n private _layoutCache = new Map<string, LayoutResult>();\n\n /** Day/week view: cached all-day row assignments keyed by week/day key. */\n private _allDayLayoutCache = new Map<\n string,\n {\n rowAssignments: Map<string, number>;\n mergedEvents: Map<string, AllDayEvent>;\n totalRows: number;\n }\n >();\n\n private _layoutCalculator = new LayoutCalculator({\n timeColumnWidth: 80,\n minuteHeight: 1,\n eventMinHeight: 20,\n cascadeOffset: 15,\n paddingLeft: 10,\n });\n\n private _handleResize = (entries: ResizeObserverEntry[]): void => {\n const [div] = entries;\n\n this._calendarWidth = div.contentRect.width || this._calendarWidth;\n };\n\n private _resizeController: ResizeController<void> = new ResizeController<void>(this, {\n target: null,\n callback: this._handleResize,\n skipInitial: true,\n });\n\n static override styles = css`\n :host {\n display: block;\n contain: layout style paint;\n content-visibility: auto;\n contain-intrinsic-size: auto 600px 800px;\n\n --shadow-sm: rgba(0, 0, 0, 0.18) 0px 2px 4px;\n --shadow-md: rgba(0, 0, 0, 0.15) 0px 3px 3px 0px;\n --shadow-lg: rgba(0, 0, 0, 0.15) 0px 2px 8px;\n --shadow-hv: rgba(0, 0, 0, 0.08) 0px 4px 12px;\n\n --breakpoint-xs: 425px;\n --breakpoint-sm: 768px;\n --breakpoint-md: 1024px;\n\n --separator-light: rgba(0, 0, 0, 0.1);\n --separator-mid: rgba(0, 0, 0, 0.4);\n --separator-dark: rgba(0, 0, 0, 0.7);\n\n --system-ui:\n system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji',\n 'Segoe UI Emoji', 'Segoe UI Symbol';\n --monospace-ui:\n 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;\n\n --border-radius-sm: 5px;\n --border-radius-md: 7px;\n --border-radius-lg: 12px;\n\n --background-color: white;\n --primary-color: dodgerblue;\n\n --height: 100%;\n --width: 100%;\n\n /* Entry design tokens - responsive and density-aware */\n --entry-font-size: 0.8rem;\n --entry-line-height: 1.3;\n --entry-min-height: 1.2em;\n --entry-border-radius: var(--border-radius-sm);\n --entry-background-color: var(--background-color);\n --entry-color: var(--primary-color);\n --entry-highlight-color: var(--separator-light);\n --entry-focus-color: var(--primary-color);\n --entry-padding: 0.2em 0.35em;\n --entry-font-family: system-ui;\n --entry-gap: 0.25em;\n\n /* Month view dot indicator tokens */\n --entry-dot-size: 6px;\n --entry-dot-margin: 0.25em;\n --entry-month-background: transparent;\n --entry-month-padding: 0.1em 0.3em 0.1em 0;\n --entry-time-font: var(--monospace-ui);\n --entry-time-align: right;\n --entry-month-text-color: var(--separator-dark);\n\n /* Entry typography tokens */\n --entry-title-weight: 500;\n --entry-title-wrap: nowrap;\n --entry-time-font-size: 0.85em;\n --entry-time-opacity: 0.8;\n\n /* Entry density mode tokens */\n --entry-compact-show-time: none;\n --entry-layout: row;\n --entry-align: flex-start;\n\n /* Responsive scaling for different viewport sizes */\n --entry-font-size-sm: 0.7rem;\n --entry-font-size-md: 0.75rem;\n --entry-font-size-lg: 0.8rem;\n\n --context-height: 1.75em;\n --context-padding: 0.25em;\n --context-text-align: left;\n\n /* Core layout tokens */\n --time-column-width: 4em;\n --view-container-height-offset: 0px;\n --main-content-height-offset: 1em;\n\n /* Time grid sizing — replaces 1440-row grid */\n --minute-height: 0.8px;\n --hour-height: calc(60 * var(--minute-height));\n --day-total-height: calc(1440 * var(--minute-height));\n\n /* Deprecated: kept for consumers who read them, no longer used internally */\n --grid-rows-per-day: 1440;\n --calendar-grid-rows-time: repeat(var(--grid-rows-per-day), 1fr);\n\n /* Week view condensed tokens */\n --week-day-count: 7;\n --week-mobile-day-count: 3;\n --week-mobile-breakpoint: 768px;\n\n /* Grid template tokens */\n --calendar-grid-columns-day: var(--time-column-width) 1fr;\n --calendar-grid-columns-week: var(--time-column-width) repeat(7, 1fr);\n --calendar-grid-columns-month: repeat(7, 1fr);\n\n /* Calculated heights */\n --view-container-height: calc(100% - var(--view-container-height-offset));\n --main-content-height: calc(100% - var(--main-content-height-offset));\n\n /* Legacy tokens (for backward compatibility) */\n --day-header-height: 3.5em;\n --day-main-offset: var(--main-content-height-offset);\n --day-gap: 1px;\n --day-text-align: center;\n --day-padding: 0.5em;\n --day-all-day-font-size: 0.875rem;\n --day-all-day-margin: 0 1.25em 0 4.25em;\n --hour-text-align: center;\n --indicator-top: -0.55em;\n --separator-border: 1px solid var(--separator-light);\n --sidebar-border: 1px solid var(--separator-light);\n\n /* Typography tokens */\n --hour-indicator-font-size: 0.8125em;\n --hour-indicator-color: var(--header-text-color, rgba(0, 0, 0, 0.6));\n --day-label-font-weight: 500;\n --day-label-name-font-size: 0.75em;\n --day-label-number-font-size: 1.125em;\n --day-label-number-font-weight: 600;\n --day-label-gap: 0.15em;\n\n --header-height: 3.5em;\n --header-height-mobile: 4.5em;\n --header-info-padding-left: 1em;\n --header-text-color: rgba(0, 0, 0, 0.6);\n --header-buttons-padding-right: 1em;\n --button-padding: 0.75em;\n --button-border-radius: var(--border-radius-sm);\n\n --month-day-gap: 1px;\n --indicator-color: var(--primary-color);\n --indicator-font-weight: bold;\n --indicator-padding: 0.25em;\n --indicator-margin-bottom: 0.25em;\n\n --menu-min-width: 17.5em;\n --menu-max-width: 20em;\n --menu-header-padding: 0.75em 1em;\n --menu-content-padding: 1em;\n --menu-item-padding: 0.75em;\n --menu-item-margin-bottom: 0.75em;\n --menu-item-font-weight: 500;\n --menu-button-size: 2em;\n --menu-button-padding: 0.5em;\n --menu-title-font-size: 0.875em;\n --menu-title-font-weight: 500;\n --menu-content-font-size: 0.875em;\n --menu-detail-label-min-width: 4em;\n --menu-detail-label-font-size: 0.8125em;\n --menu-detail-gap: 0.5em;\n\n /* Year view tokens */\n --year-grid-columns: 3;\n --year-grid-columns-tablet: 2;\n --year-grid-columns-mobile: 1;\n --year-month-label-font-size: 0.875em;\n --year-day-font-size: 0.7em;\n --year-cell-size: 1.8em;\n --year-dot-color: var(--indicator-color, var(--primary-color));\n --year-heatmap-1: rgba(30, 144, 255, 0.15);\n --year-heatmap-2: rgba(30, 144, 255, 0.35);\n --year-heatmap-3: rgba(30, 144, 255, 0.55);\n --year-heatmap-4: rgba(30, 144, 255, 0.75);\n\n /* Year view — calendar week column */\n --year-cw-width: 1.8em;\n --year-cw-font-size: 0.55em;\n --year-cw-color: var(--header-text-color, rgba(0, 0, 0, 0.45));\n }\n .calendar-container {\n box-sizing: border-box;\n width: var(--width);\n height: var(--height);\n background-color: var(--background-color);\n border-radius: var(--calendar-border-radius, var(--border-radius-lg));\n border: 1px solid var(--separator-light);\n font-family: var(--system-ui);\n color: var(--separator-dark);\n box-shadow: var(--calendar-shadow, none);\n contain: layout style;\n position: relative;\n overflow: var(--calendar-overflow, hidden);\n display: flex;\n flex-direction: column;\n }\n header {\n flex-shrink: 0;\n }\n main {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n /* Responsive entry scaling based on viewport width */\n @media (max-width: 480px) {\n :host {\n --entry-font-size: var(--entry-font-size-sm);\n --entry-padding: 0.1em 0.2em;\n --entry-gap: 0.15em;\n --entry-line-height: 1.15;\n --entry-min-height: 1.1em;\n --entry-compact-show-time: none;\n }\n }\n\n @media (min-width: 481px) and (max-width: 768px) {\n :host {\n --entry-font-size: var(--entry-font-size-md);\n --entry-padding: 0.15em 0.25em;\n --entry-gap: 0.2em;\n --entry-line-height: 1.2;\n --entry-compact-show-time: none;\n }\n }\n\n @media (min-width: 769px) {\n :host {\n --entry-font-size: var(--entry-font-size-lg);\n --entry-compact-show-time: inline;\n }\n }\n `;\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n // Safety net: clean up listeners if component is removed while menu is open\n document.removeEventListener('click', this._handleClickOutside, true);\n document.removeEventListener('keydown', this._handleEscape);\n }\n\n protected override updated(\n changedProperties: PropertyValueMap<never> | Map<PropertyKey, unknown>,\n ): void {\n if (changedProperties.has('_menuOpen' as never)) {\n if (this._menuOpen) {\n document.addEventListener('click', this._handleClickOutside, true);\n document.addEventListener('keydown', this._handleEscape);\n } else {\n document.removeEventListener('click', this._handleClickOutside, true);\n document.removeEventListener('keydown', this._handleEscape);\n }\n }\n }\n\n private _handleClickOutside = (e: MouseEvent) => {\n if (!this._menuOpen) return;\n\n const path = e.composedPath();\n const menuEl = this.shadowRoot?.querySelector('lms-menu');\n // Close if click is not inside the menu and not on a calendar entry\n const clickedInsideMenu = menuEl && path.includes(menuEl);\n const clickedOnEntry = path.some(\n (el) => el instanceof HTMLElement && el.tagName === 'LMS-CALENDAR-ENTRY',\n );\n\n if (!clickedInsideMenu && !clickedOnEntry) {\n this._closeMenuAndClearSelections();\n }\n };\n\n private _handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this._menuOpen) {\n this._closeMenuAndClearSelections();\n }\n };\n\n private _closeMenuAndClearSelections() {\n this._menuOpen = false;\n this._menuEventDetails = undefined;\n this._returnFocusToTrigger();\n this.shadowRoot?.querySelectorAll('lms-calendar-entry').forEach((entry) => {\n (entry as LMSCalendarEntry).clearSelection();\n });\n }\n\n private _returnFocusToTrigger() {\n if (this._menuTriggerEntry) {\n this._menuTriggerEntry.focus();\n this._menuTriggerEntry = undefined;\n }\n }\n\n protected override firstUpdated(\n _changedProperties: PropertyValueMap<never> | Map<PropertyKey, unknown>,\n ): void {\n const firstElementChild = this.shadowRoot?.firstElementChild;\n if (!firstElementChild) {\n return;\n }\n\n this._resizeController.observe(firstElementChild);\n }\n\n /** We filter invalid entries in the willUpdate hook, so be prepared:\n * - This will not be shown\n * ```json\n * { date: ..., time: { start: { hour: 10, minute: 30 }, end: { hour: 10, minute: 00 } } }\n * ```\n * - The same goes for invalid dates meaning the end date being before the start date.\n *\n * We then sort the entries inplace.\n */\n protected override willUpdate(\n changedProperties: PropertyValueMap<never> | Map<PropertyKey, unknown>,\n ): void {\n if (!changedProperties.has('entries' as never)) {\n return;\n }\n\n if (!this.entries.length) {\n this._processedEntries = [];\n this._clearEntryCaches();\n return;\n }\n\n this._processedEntries = R.pipe(\n this.entries,\n R.filter((entry) => {\n // All-day entries without time are always valid\n if (!entry.time) return true;\n return Interval.fromDateTimes(\n DateTime.fromObject(R.merge(entry.date.start, entry.time.start)),\n DateTime.fromObject(R.merge(entry.date.end, entry.time.end)),\n ).isValid;\n }),\n R.sort((a, b) => {\n const aHour = a.time?.start.hour ?? 0;\n const bHour = b.time?.start.hour ?? 0;\n const aMin = a.time?.start.minute ?? 0;\n const bMin = b.time?.start.minute ?? 0;\n return aHour - bHour || aMin - bMin;\n }),\n );\n\n this._computeEntryCaches();\n }\n\n // ── Memoization helpers (the \"compute\" side of the memo pattern) ────\n // These run once per `entries` change — equivalent to the factory\n // function inside useMemo(() => { … }, [entries]).\n\n private _clearEntryCaches() {\n this._expandedEntries = [];\n this._monthViewSorted = [];\n this._entrySumByDay = {};\n this._expandedByISODate.clear();\n this._layoutCache.clear();\n this._allDayLayoutCache.clear();\n }\n\n private _computeEntryCaches() {\n // 1. Expand all entries across their date spans (the expensive O(n × span) work)\n // Each expanded entry carries its originalIndex directly, avoiding\n // repeated string-ID hashing and map lookups.\n this._expandedEntries = this._processedEntries.flatMap((entry, index) =>\n this._expandEntryMaybe({\n entry,\n range: this._getDaysRange(entry.date),\n originalIndex: index,\n }),\n ) as ExpandedCalendarEntry[];\n\n // 2. Group by ISO date for O(1) day/week lookups (no Luxon needed)\n this._expandedByISODate.clear();\n for (const entry of this._expandedEntries) {\n const { year, month, day } = entry.date.start;\n const key = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n let bucket = this._expandedByISODate.get(key);\n if (!bucket) {\n bucket = [];\n this._expandedByISODate.set(key, bucket);\n }\n bucket.push(entry);\n }\n\n // 3. Month view: sort + compute colors once\n this._monthViewSorted = R.pipe(\n this._expandedEntries,\n R.sortBy((entry) => {\n const isMultiDay = entry.continuation?.has || false;\n return isMultiDay ? entry.originalIndex - 1000 : entry.originalIndex;\n }),\n R.map((entry) => {\n const [background] = getColorTextWithContrast(entry.color);\n return { entry, background, originalIndex: entry.originalIndex };\n }),\n );\n\n // 5. Mobile badge: aggregate per-day counts once\n this._entrySumByDay = {};\n for (const entry of this._expandedEntries) {\n const key = `${entry.date.start.year}-${entry.date.start.month}-${entry.date.start.day}`;\n this._entrySumByDay[key] = (this._entrySumByDay[key] ?? 0) + 1;\n }\n\n // 6. Invalidate layout caches (entries changed, layouts are stale)\n this._layoutCache.clear();\n this._allDayLayoutCache.clear();\n }\n\n override render() {\n const viewMode = this._viewState.viewMode;\n const currentActiveDate = this._viewState.activeDate;\n\n return html`\n <div class=\"calendar-container\">\n <header>\n <lms-calendar-header\n @switchdate=${this._handleSwitchDate}\n @switchview=${this._handleSwitchView}\n @jumptoday=${this._handleJumpToday}\n .heading=${this.heading}\n .activeDate=${currentActiveDate}\n .viewMode=${viewMode}\n .expandedDate=${viewMode === 'day' ? currentActiveDate : undefined}\n .locale=${this.locale}\n >\n </lms-calendar-header>\n </header>\n\n <main role=\"region\" aria-live=\"polite\" aria-label=\"${getMessages(this.locale)[viewMode]} ${getMessages(this.locale).viewLabel}\" style=${ifDefined(viewMode === 'year' ? 'overflow-y: auto' : undefined)}>\n ${\n viewMode === 'month'\n ? html`\n <lms-calendar-context\n .firstDayOfWeek=${this.firstDayOfWeek}\n .locale=${this.locale}\n > </lms-calendar-context>\n\n <lms-calendar-month\n @expand=${this._handleExpand}\n @open-menu=${this._handleOpenMenu}\n @clear-other-selections=${this._handleClearOtherSelections}\n .activeDate=${currentActiveDate}\n .firstDayOfWeek=${this.firstDayOfWeek}\n .locale=${this.locale}\n >\n ${\n this._calendarWidth < 768\n ? this._renderEntriesSumByDay()\n : this._renderEntries()\n }\n </lms-calendar-month>\n `\n : nothing\n }\n ${\n viewMode === 'week'\n ? (() => {\n const ctx = computeWeekDisplayContext(\n currentActiveDate,\n this.firstDayOfWeek,\n this._calendarWidth,\n this,\n );\n const result = this._renderEntriesByDate(ctx);\n return html`\n <lms-calendar-week\n @expand=${this._handleExpand}\n @peek-navigate=${this._handlePeekNavigate}\n @open-menu=${this._handleOpenMenu}\n @clear-other-selections=${this._handleClearOtherSelections}\n .activeDate=${currentActiveDate}\n .allDayRowCount=${result.allDayRowCount}\n .firstDayOfWeek=${this.firstDayOfWeek}\n .locale=${this.locale}\n .visibleDates=${ctx.visibleDates}\n .visibleStartIndex=${ctx.visibleStartIndex}\n .visibleLength=${ctx.visibleLength}\n style=${styleMap({\n '--calendar-grid-columns-week': ctx.gridColumns,\n })}\n >\n ${result.elements}\n </lms-calendar-week>\n `;\n })()\n : nothing\n }\n ${\n viewMode === 'day'\n ? (() => {\n const result = this._renderEntriesByDate();\n return html`\n <lms-calendar-day\n @open-menu=${this._handleOpenMenu}\n @clear-other-selections=${this._handleClearOtherSelections}\n .allDayRowCount=${result.allDayRowCount}\n .locale=${this.locale}\n >\n ${result.elements}\n </lms-calendar-day>\n `;\n })()\n : nothing\n }\n ${\n viewMode === 'year'\n ? html`\n <lms-calendar-year\n @expand=${this._handleExpand}\n .activeDate=${currentActiveDate}\n .firstDayOfWeek=${this.firstDayOfWeek}\n .locale=${this.locale}\n .entrySumByDay=${this._entrySumByDay}\n .drillTarget=${this.yearDrillTarget}\n .densityMode=${this.yearDensityMode}\n ></lms-calendar-year>\n `\n : nothing\n }\n </main>\n\n <lms-menu\n ?open=${this._menuOpen}\n .eventDetails=${\n this._menuEventDetails || {\n heading: '',\n content: '',\n displayTime: '',\n }\n }\n .anchorRect=${this._menuEventDetails?.anchorRect}\n .locale=${this.locale}\n @menu-close=${this._handleMenuClose}\n ></lms-menu>\n </div>\n `;\n }\n\n private _handleSwitchDate(e: CustomEvent) {\n if (e.detail.direction === 'next') {\n this._viewState.navigateNext();\n } else if (e.detail.direction === 'previous') {\n this._viewState.navigatePrevious();\n }\n }\n\n private _handleSwitchView(e: CustomEvent) {\n return match(e.detail.view)\n .with('day', () => this._viewState.switchToDayView())\n .with('week', () => this._viewState.switchToWeekView())\n .with('month', () => this._viewState.switchToMonthView())\n .with('year', () => this._viewState.switchToYearView())\n .otherwise(() => {});\n }\n\n private _handleJumpToday(_e: CustomEvent) {\n this._viewState.jumpToToday();\n }\n\n private _handlePeekNavigate(e: CustomEvent) {\n // Shift active date to the target day, staying in week view\n this._viewState.setActiveDate(e.detail.date);\n }\n\n private _handleExpand(e: CustomEvent) {\n this._viewState.setActiveDate(e.detail.date);\n const target = e.detail.drillTarget || 'day';\n if (target === 'month') {\n this._viewState.switchToMonthView();\n } else if (target === 'week') {\n this._viewState.switchToWeekView();\n } else {\n this._viewState.switchToDayView();\n }\n }\n\n private _handleOpenMenu(e: CustomEvent) {\n // Reset any previously highlighted entries before opening new menu\n // but exclude the entry that triggered this event\n const clickedEntry = e.target as LMSCalendarEntry;\n this.shadowRoot?.querySelectorAll('lms-calendar-entry').forEach((entry) => {\n if (entry !== clickedEntry) {\n (entry as LMSCalendarEntry).clearSelection();\n }\n });\n this._menuTriggerEntry = clickedEntry;\n this.openMenu(e.detail);\n }\n\n private _handleClearOtherSelections(e: CustomEvent) {\n // Clear all selections except the entry that triggered this event\n const focusedEntry = e.detail.exceptEntry as LMSCalendarEntry;\n this.shadowRoot?.querySelectorAll('lms-calendar-entry').forEach((entry) => {\n if (entry !== focusedEntry) {\n (entry as LMSCalendarEntry).clearSelection();\n }\n });\n }\n\n private _handleMenuClose() {\n this._menuOpen = false;\n this._menuEventDetails = undefined;\n this._returnFocusToTrigger();\n }\n\n public openMenu(eventDetails: {\n heading: string;\n content: string;\n time?: CalendarTimeInterval;\n displayTime: string;\n date?: CalendarDate;\n anchorRect?: DOMRect;\n }) {\n this._menuEventDetails = eventDetails;\n this._menuOpen = true;\n }\n\n private _composeEntry({\n index,\n slot,\n inlineStyle,\n entry,\n isContinuation = false,\n density,\n displayMode = 'default',\n floatText = false,\n spanClass,\n }: {\n index: number;\n slot: string;\n inlineStyle: string;\n entry: Partial<CalendarEntry> & {\n accessibility?: {\n tabIndex: number;\n role: 'button';\n ariaLabel: string;\n };\n };\n isContinuation?: boolean;\n density?: 'compact' | 'standard' | 'full';\n displayMode?: 'default' | 'month-dot';\n floatText?: boolean;\n spanClass?: string;\n }) {\n // Determine density based on event duration and context if not explicitly set\n const determinedDensity = density || this._determineDensity(entry, undefined, undefined);\n\n return html`\n <lms-calendar-entry\n class=${`_${index}${spanClass ? ` ${spanClass}` : ''}`}\n slot=${slot}\n style=${inlineStyle}\n .time=${entry.time}\n .heading=${entry.heading ?? ''}\n .content=${entry.content}\n .isContinuation=${isContinuation ?? false}\n .date=${entry.date}\n .density=${determinedDensity}\n .displayMode=${displayMode}\n .floatText=${floatText}\n .accessibility=${entry.accessibility}\n .locale=${this.locale}\n >\n </lms-calendar-entry>\n `;\n }\n\n private _determineDensity(\n entry: Partial<CalendarEntry>,\n grading?: Grading[],\n index?: number,\n ): 'compact' | 'standard' | 'full' {\n if (!entry.time) return 'compact'; // Default to compact for month view\n\n // For overlapping events in day/week view, use consistent density\n // based on depth to maintain visual hierarchy\n if (grading && index !== undefined && grading[index]) {\n // All overlapping events should have consistent display\n // Top event (depth 0): show time\n // Deeper events: also show time for consistency\n // This prevents the visual chaos of mixed display modes\n return 'standard';\n }\n\n const durationMinutes =\n (entry.time.end.hour - entry.time.start.hour) * 60 +\n (entry.time.end.minute - entry.time.start.minute);\n\n // For non-overlapping events, use duration-based density\n if (durationMinutes < 30) {\n return 'compact';\n }\n\n if (durationMinutes > 120 && entry.content) {\n return 'full';\n }\n\n return 'standard';\n }\n\n /** Create an array of <lms-calendar-entry> elements for each day the entry spans\n * and add them to the entries array. */\n private _expandEntryMaybe({\n entry,\n range,\n originalIndex,\n }: {\n entry: Partial<CalendarEntry>;\n range: [Date, Date, number];\n originalIndex: number;\n }) {\n return Array.from({ length: range[2] }, (_, index) => {\n const currentStartDate = DateTime.fromJSDate(range[0]).plus({\n days: index,\n });\n const currentEndDate = currentStartDate.plus({ days: 1 }).minus({ seconds: 1 });\n const currentEntry = {\n ...entry,\n date: {\n start: currentStartDate.toObject(),\n end: currentEndDate.toObject(),\n },\n isContinuation: index > 0, // Any day after the first is a continuation\n continuation: {\n has: range[2] > 1,\n is: index > 0,\n index,\n total: range[2],\n },\n // Preserve original start date for consistent sorting\n originalStartDate: entry.date?.start,\n originalIndex,\n };\n\n return currentEntry;\n });\n }\n\n private _createConsistentEventId(\n entry:\n | CalendarEntry\n | (Partial<CalendarEntry> & {\n continuation?: Continuation;\n originalStartDate?: CalendarDate;\n }),\n ): string {\n // For expanded entries, try to find the original start date\n const expandedEntry = entry as Partial<CalendarEntry> & {\n continuation?: Continuation;\n originalStartDate?: CalendarDate;\n };\n const baseDate = expandedEntry.originalStartDate || entry.date?.start;\n\n if (!baseDate) {\n return `${entry.heading || 'unknown'}-fallback`;\n }\n\n // Create a deterministic ID based on entry content and original start date\n return `${entry.heading || 'unknown'}-${baseDate.year}-${\n baseDate.month\n }-${baseDate.day}-${entry.time?.start.hour || 0}-${entry.time?.start.minute || 0}`;\n }\n\n private _renderEntries() {\n if (!this._monthViewSorted.length) {\n return nothing;\n }\n\n // Pure map over pre-computed cache — no expansion, sorting, or color\n // computation happens here. This is the \"read\" side of the memo.\n return this._monthViewSorted.map(({ entry, background, originalIndex }) => {\n const isMultiDay = entry.isContinuation || entry.continuation?.has || false;\n const slotPrefix = isMultiDay ? 'all-day-' : '';\n\n return this._composeEntry({\n index: originalIndex,\n slot: `${slotPrefix}${entry.date.start.year}-${entry.date.start.month}-${entry.date.start.day}`,\n inlineStyle: `--entry-color: ${background}; --entry-background-color: ${background}; z-index: ${100 + originalIndex}`,\n entry: {\n time: entry.time,\n heading: entry.heading,\n content: entry.content,\n date: entry.date,\n isContinuation: entry.isContinuation || false,\n continuation: entry.continuation,\n },\n density: this._determineDensity(\n {\n time: entry.time,\n heading: entry.heading,\n content: entry.content,\n },\n undefined,\n undefined,\n ),\n displayMode: 'month-dot',\n });\n });\n }\n\n private _renderEntriesByDate(weekCtx?: WeekDisplayContext) {\n const currentActiveDate = this._viewState.activeDate;\n const viewMode = this._viewState.viewMode;\n\n if (viewMode !== 'day' && viewMode !== 'week') {\n return { elements: nothing, allDayRowCount: 0 };\n }\n\n // O(1) map lookups instead of O(n) expansion + Luxon filtering\n let allEntriesForDate: ExpandedCalendarEntry[];\n\n if (viewMode === 'day') {\n const key = `${currentActiveDate.year}-${String(currentActiveDate.month).padStart(2, '0')}-${String(currentActiveDate.day).padStart(2, '0')}`;\n allEntriesForDate = this._expandedByISODate.get(key) ?? [];\n } else {\n // Week view: use visible dates from context (condensed or full)\n const datesToRender =\n weekCtx?.visibleDates ?? getWeekDates(currentActiveDate, this.firstDayOfWeek);\n allEntriesForDate = datesToRender.flatMap((wd) => {\n const key = `${wd.year}-${String(wd.month).padStart(2, '0')}-${String(wd.day).padStart(2, '0')}`;\n return this._expandedByISODate.get(key) ?? [];\n });\n }\n\n // Single-pass partition into all-day vs timed entries\n const allDayEntries: ExpandedCalendarEntry[] = [];\n const entriesByDate: ExpandedCalendarEntry[] = [];\n for (const entry of allEntriesForDate) {\n (this._isEffectivelyAllDay(entry) ? allDayEntries : entriesByDate).push(entry);\n }\n\n if (!entriesByDate.length && !allDayEntries.length) {\n return { elements: nothing, allDayRowCount: 0 };\n }\n\n // Use SlotManager to handle positioning across different views\n return this._renderEntriesWithSlotManager(\n viewMode,\n currentActiveDate,\n allDayEntries,\n entriesByDate,\n weekCtx,\n );\n }\n\n private _renderEntriesWithSlotManager(\n viewMode: 'day' | 'week',\n currentActiveDate: CalendarDate,\n allDayEntries: ExpandedCalendarEntry[],\n entriesByDate: ExpandedCalendarEntry[],\n weekCtx?: WeekDisplayContext,\n ) {\n const allElements: ReturnType<typeof this._composeEntry>[] = [];\n\n // Process timed entries\n if (entriesByDate.length > 0) {\n // Build O(1) global-index lookup (replaces O(n) indexOf per entry)\n const globalIndexMap = new Map(entriesByDate.map((entry, i) => [entry, i]));\n\n if (viewMode === 'week') {\n // Group timed entries by day for week view\n const entriesByDay = R.groupBy(\n entriesByDate,\n (entry) =>\n `${entry.date.start.year}-${entry.date.start.month}-${entry.date.start.day}`,\n );\n\n const condensedDates = weekCtx?.isCondensed ? weekCtx.visibleDates : undefined;\n\n // Iterate in known day order — no sort needed\n const datesToRender =\n condensedDates ?? getWeekDates(currentActiveDate, this.firstDayOfWeek);\n\n for (const wd of datesToRender) {\n const dayEntries = entriesByDay[`${wd.year}-${wd.month}-${wd.day}`];\n if (!dayEntries?.length) continue;\n\n const dayElements = this._renderDayEntriesWithSlotManager(\n dayEntries,\n viewMode,\n currentActiveDate,\n globalIndexMap,\n condensedDates,\n );\n allElements.push(...dayElements);\n }\n } else {\n // Day view: process all entries together\n const dayElements = this._renderDayEntriesWithSlotManager(\n entriesByDate,\n viewMode,\n currentActiveDate,\n globalIndexMap,\n );\n allElements.push(...dayElements);\n }\n }\n\n // Compute all-day layout declaratively (cached — only recomputes when entries change)\n const condensedDatesForAllDay = weekCtx?.isCondensed ? weekCtx.visibleDates : undefined;\n const allDayKey =\n viewMode === 'week'\n ? `${currentActiveDate.year}-${currentActiveDate.month}-${currentActiveDate.day}-${this.firstDayOfWeek}-${weekCtx?.visibleStartIndex ?? 0}-${weekCtx?.visibleLength ?? 7}`\n : `day-${currentActiveDate.year}-${currentActiveDate.month}-${currentActiveDate.day}`;\n\n let allDayLayout = this._allDayLayoutCache.get(allDayKey);\n if (!allDayLayout) {\n const allDayLayoutEvents: AllDayEvent[] = allDayEntries.map((entry) => {\n const eventId = this._createConsistentEventId(entry);\n const dayIndex =\n viewMode === 'week'\n ? condensedDatesForAllDay\n ? slotManager.getIndexInDates(entry.date.start, condensedDatesForAllDay)\n : slotManager.getWeekDayIndex(\n entry.date.start,\n currentActiveDate,\n this.firstDayOfWeek,\n )\n : 0;\n return {\n id: eventId,\n days: [dayIndex],\n isMultiDay: entry.continuation?.is || entry.continuation?.has || false,\n };\n });\n\n const mergedEvents = new Map<string, AllDayEvent>();\n allDayLayoutEvents.forEach((event) => {\n const existing = mergedEvents.get(event.id);\n if (existing) {\n existing.days.push(...event.days);\n } else {\n mergedEvents.set(event.id, { ...event, days: [...event.days] });\n }\n });\n\n const { rowAssignments, totalRows } = allocateAllDayRows(\n Array.from(mergedEvents.values()),\n );\n\n allDayLayout = { rowAssignments, mergedEvents, totalRows };\n this._allDayLayoutCache.set(allDayKey, allDayLayout);\n }\n\n const { rowAssignments, mergedEvents, totalRows } = allDayLayout;\n\n // Process all-day entries with layout info\n const allDayElements = allDayEntries.map((entry, index) => {\n const [background, text] = getColorTextWithContrast(entry.color);\n const eventId = this._createConsistentEventId(entry);\n\n const positionConfig: PositionConfig = {\n viewMode,\n date: entry.date.start,\n isAllDay: true,\n activeDate: currentActiveDate,\n firstDayOfWeek: this.firstDayOfWeek,\n weekDates: condensedDatesForAllDay,\n };\n\n const position = slotManager.calculatePosition(positionConfig);\n const accessibility = slotManager.calculateAccessibility(positionConfig);\n const row = rowAssignments.get(eventId) ?? 0;\n const layoutDimensions: LayoutDimensions = {\n width: 100,\n x: 0,\n zIndex: 100 + row,\n opacity: 1,\n };\n\n const positionCSS = slotManager.generatePositionCSS(position, layoutDimensions);\n\n // Compute span class for multi-day events\n const continuation = (entry as CalendarEntry & { continuation?: Continuation })\n .continuation;\n const isMultiDay = continuation?.has || continuation?.is || false;\n let spanClass = 'single-day';\n if (isMultiDay && continuation) {\n const mergedEvent = mergedEvents.get(eventId);\n const visibleDays = mergedEvent?.days ?? [];\n const sortedDays = [...visibleDays].sort((a, b) => a - b);\n const dayIndex =\n viewMode === 'week'\n ? condensedDatesForAllDay\n ? slotManager.getIndexInDates(entry.date.start, condensedDatesForAllDay)\n : slotManager.getWeekDayIndex(\n entry.date.start,\n currentActiveDate,\n this.firstDayOfWeek,\n )\n : 0;\n spanClass = computeSpanClass({\n continuationIndex: dayIndex,\n totalDays: continuation.total,\n visibleStartIndex: sortedDays[0] ?? dayIndex,\n visibleEndIndex: sortedDays[sortedDays.length - 1] ?? dayIndex,\n });\n }\n\n return this._composeEntry({\n index: index + entriesByDate.length,\n slot: position.slotName,\n inlineStyle: `--entry-background-color: ${background}; --entry-color: ${text}; order: ${row}; ${positionCSS}`,\n entry: {\n ...entry,\n accessibility: accessibility,\n },\n density: 'standard',\n floatText: false,\n spanClass,\n });\n });\n\n return { elements: [...allDayElements, ...allElements], allDayRowCount: totalRows };\n }\n\n private _renderDayEntriesWithSlotManager(\n dayEntries: ExpandedCalendarEntry[],\n viewMode: 'day' | 'week',\n currentActiveDate: CalendarDate,\n globalIndexMap: Map<ExpandedCalendarEntry, number>,\n condensedDates?: CalendarDate[],\n ) {\n // Cache key from the day being rendered (all entries share the same date)\n const first = dayEntries[0];\n const cacheKey = `${first.date.start.year}-${String(first.date.start.month).padStart(2, '0')}-${String(first.date.start.day).padStart(2, '0')}`;\n\n // Reuse cached layout when only resize/locale/menu changed (not entries)\n let layout = this._layoutCache.get(cacheKey);\n if (!layout) {\n const layoutEvents = dayEntries.map((entry, index) => ({\n id: String(index),\n heading: entry.heading || '',\n startTime: {\n hour: entry.time!.start.hour,\n minute: entry.time!.start.minute,\n },\n endTime: {\n hour: entry.time!.end.hour,\n minute: entry.time!.end.minute,\n },\n color: entry.color || '#1976d2',\n }));\n layout = this._layoutCalculator.calculateLayout(layoutEvents);\n this._layoutCache.set(cacheKey, layout);\n }\n\n // Render entries using SlotManager\n return dayEntries.map((entry, index) => {\n const layoutBox = layout.boxes[index];\n const globalIndex = globalIndexMap.get(entry) ?? index;\n\n // Use SlotManager to determine positioning and accessibility\n const positionConfig: PositionConfig = {\n viewMode,\n date: entry.date.start,\n time: entry.time,\n activeDate: currentActiveDate,\n isAllDay: entry.isContinuation || this._isAllDayEvent(entry),\n firstDayOfWeek: this.firstDayOfWeek,\n weekDates: condensedDates,\n };\n\n const position = slotManager.calculatePosition(positionConfig);\n const accessibility = slotManager.calculateAccessibility(positionConfig);\n const layoutDimensions: LayoutDimensions = {\n width: layoutBox.width,\n x: layoutBox.x,\n zIndex: layoutBox.zIndex,\n opacity: layoutBox.opacity,\n height: layoutBox.height,\n };\n\n const positionCSS = slotManager.generatePositionCSS(\n position,\n layoutDimensions,\n entry.time,\n );\n\n const smartLayout = this._getSmartLayout(entry, layoutBox.height, layoutBox.width, {\n depth: layoutBox.depth,\n opacity: layoutBox.opacity,\n });\n\n return this._composeEntry({\n index: globalIndex,\n slot: position.slotName,\n inlineStyle: `--entry-background-color: rgba(250, 250, 250, 0.8); --entry-color: #333; --entry-border: 1px solid rgba(0, 0, 0, 0.15); --entry-handle-color: ${entry.color || '#1976d2'}; --entry-handle-width: 4px; --entry-handle-display: block; --entry-padding-left: calc(4px + 0.35em); --entry-layout: ${smartLayout}; ${positionCSS}`,\n entry: {\n ...entry,\n // Add accessibility data to entry\n accessibility: accessibility,\n },\n density: 'standard',\n floatText: false,\n });\n });\n }\n\n private _renderEntriesSumByDay() {\n // Pure read from pre-computed cache — no expansion or reduction.\n const entries = Object.entries(this._entrySumByDay);\n if (!entries.length) return nothing;\n\n return entries.map(([key, value], index) =>\n this._composeEntry({\n index,\n slot: key,\n inlineStyle: `--entry-color: var(--separator-mid); text-align: center`,\n entry: {\n heading: `${value} ${getMessages(this.locale).events}`,\n },\n displayMode: 'month-dot',\n }),\n );\n }\n\n private _getSmartLayout(\n entry: CalendarEntry,\n height: number,\n _width?: number,\n layoutBox?: { depth: number; opacity: number },\n ): 'row' | 'column' {\n if (!entry.time) return 'row';\n\n const isOverlapping = layoutBox && layoutBox.depth > 0;\n\n // Non-overlapping events always use row — they have full width available\n if (!isOverlapping) {\n return 'row';\n }\n\n // Overlapping events: use column when there's enough vertical space\n // so title and time stack clearly within the cascaded box\n const minColumnHeight = 40;\n return height >= minColumnHeight ? 'column' : 'row';\n }\n\n private _getDaysRange(date: CalendarDateInterval): [Date, Date, number] {\n const { start, end } = date;\n const startDate = new Date(start.year, start.month - 1, start.day);\n const endDate = new Date(end.year, end.month - 1, end.day);\n\n return [\n startDate,\n endDate,\n (endDate.getTime() - startDate.getTime()) / (1000 * 3600 * 24) + 1,\n ];\n }\n\n private _isEffectivelyAllDay(entry: ExpandedCalendarEntry): boolean {\n if (!entry.time) return true;\n if (Number(entry.time.end.hour) - Number(entry.time.start.hour) >= 23) return true;\n if (entry.continuation?.is || entry.continuation?.has) return true;\n return false;\n }\n\n private _isAllDayEvent(entry: Partial<CalendarEntry>): boolean {\n // Check if it's a true all-day event (0:00 to 23:59)\n if (!entry.time) return true;\n\n const { start, end } = entry.time;\n return start.hour === 0 && start.minute === 0 && end.hour === 23 && end.minute === 59;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lms-calendar': LMSCalendar;\n 'lms-calendar-header': LMSCalendarHeader;\n 'lms-calendar-month': LMSCalendarMonth;\n 'lms-calendar-week': LMSCalendarWeek;\n 'lms-calendar-day': LMSCalendarDay;\n 'lms-calendar-context': LMSCalendarContext;\n 'lms-calendar-entry': LMSCalendarEntry;\n 'lms-calendar-menu': LMSCalendarMenu;\n 'lms-calendar-year': LMSCalendarYear;\n }\n\n type CalendarTime = {\n hour: number;\n minute: number;\n };\n\n type CalendarDateInterval = {\n start: CalendarDate;\n end: CalendarDate;\n };\n\n type CalendarEntry = {\n date: CalendarDateInterval;\n time: CalendarTimeInterval;\n heading: string;\n content: string;\n color: string;\n isContinuation: boolean;\n continuation?: Continuation;\n };\n\n type Continuation = {\n has: boolean;\n is: boolean;\n index: number;\n total: number;\n };\n\n type Interval = {\n start: number;\n end: number;\n };\n\n type Grading = {\n index: number;\n depth: number;\n group: number;\n };\n\n type Partition = {\n index?: number;\n depth?: number;\n group?: number;\n start: number;\n end: number;\n };\n}\n\nexport {\n CalendarDate,\n CalendarDateInterval,\n CalendarEntry,\n CalendarTime,\n CalendarTimeInterval,\n Continuation,\n Grading,\n Interval,\n Partition,\n};\n","export interface AllDayEvent {\n id: string;\n days: number[];\n isMultiDay: boolean;\n}\n\nexport interface AllDayLayoutResult {\n rowAssignments: Map<string, number>;\n totalRows: number;\n}\n\n/**\n * Allocate row positions for all-day events so they don't overlap.\n * Multi-day events are placed first, then single-day events fill remaining slots.\n */\nexport function allocateAllDayRows(events: AllDayEvent[]): AllDayLayoutResult {\n const eventRows = new Map<string, number>();\n\n if (events.length === 0) {\n return { rowAssignments: eventRows, totalRows: 0 };\n }\n\n const multiDayEvents: AllDayEvent[] = [];\n const singleDayEvents: AllDayEvent[] = [];\n\n events.forEach((event) => {\n if (event.isMultiDay) {\n multiDayEvents.push(event);\n } else {\n singleDayEvents.push(event);\n }\n });\n\n // Sort multi-day events by start day, then by id\n multiDayEvents.sort((a, b) => {\n const aMinDay = Math.min(...a.days);\n const bMinDay = Math.min(...b.days);\n if (aMinDay !== bMinDay) return aMinDay - bMinDay;\n return a.id.localeCompare(b.id);\n });\n\n // Sort single-day events by day\n singleDayEvents.sort((a, b) => {\n const aDay = Math.min(...a.days);\n const bDay = Math.min(...b.days);\n return aDay - bDay;\n });\n\n // Track which rows are occupied on each day\n const rowOccupancy = new Map<number, Set<number>>();\n for (let day = 0; day < 7; day++) {\n rowOccupancy.set(day, new Set());\n }\n\n // Assign rows to multi-day events first\n multiDayEvents.forEach((event) => {\n let assignedRow = 0;\n let foundRow = false;\n\n while (!foundRow) {\n let rowAvailable = true;\n for (const day of event.days) {\n if (rowOccupancy.get(day)?.has(assignedRow)) {\n rowAvailable = false;\n break;\n }\n }\n\n if (rowAvailable) {\n foundRow = true;\n eventRows.set(event.id, assignedRow);\n for (const day of event.days) {\n rowOccupancy.get(day)?.add(assignedRow);\n }\n } else {\n assignedRow++;\n }\n }\n });\n\n // Then assign rows to single-day events\n singleDayEvents.forEach((event) => {\n const day = event.days[0];\n let assignedRow = 0;\n\n while (rowOccupancy.get(day)?.has(assignedRow)) {\n assignedRow++;\n }\n\n eventRows.set(event.id, assignedRow);\n rowOccupancy.get(day)?.add(assignedRow);\n });\n\n // Compute total rows needed\n let maxRows = 0;\n rowOccupancy.forEach((rows) => {\n maxRows = Math.max(maxRows, rows.size);\n });\n\n return { rowAssignments: eventRows, totalRows: maxRows };\n}\n\n/**\n * Determine the span class for an all-day entry based on its position within a multi-day span.\n */\nexport function computeSpanClass(entry: {\n continuationIndex: number;\n totalDays: number;\n visibleStartIndex: number;\n visibleEndIndex: number;\n}): 'first-day' | 'middle-day' | 'last-day' | 'single-day' {\n const { continuationIndex, totalDays, visibleStartIndex, visibleEndIndex } = entry;\n\n if (totalDays <= 1) {\n return 'single-day';\n }\n\n const isFirst = continuationIndex === visibleStartIndex;\n const isLast = continuationIndex === visibleEndIndex;\n\n if (isFirst && isLast) {\n return 'single-day';\n }\n if (isFirst) {\n return 'first-day';\n }\n if (isLast) {\n return 'last-day';\n }\n return 'middle-day';\n}\n"],"names":["constructor","t","target","s","config","h","callback","e","skipInitial","r","this","Set","o","i","add","l","window","ResizeObserver","u","handleChanges","requestUpdate","addController","console","warn","value","hostConnected","observe","hostDisconnected","disconnect","hostUpdated","unobserve","delete","super","arguments","observing","render","update","controller","part","element","disconnected","reconnected","n","length","Object","assign","lazy","lazyArgs","Error","done","hasNext","a","map","isSingle","single","index","items","push","c","at","entries","hasMany","next","slice","Symbol","iterator","asc","desc","Array","isArray","o2","filter","create","setPrototypeOf","prototype","sort","for","Boolean","matched","selections","match","keys","forEach","Infinity","every","Reflect","ownKeys","matcherType","is","getSelectionKeys","call","values","reduce","concat","optional","and","d","or","some","y","select","v","p","b","w","S","j","x","startsWith","endsWith","minLength","maxLength","includes","regex","N","between","lt","gt","lte","gte","int","Number","isInteger","finite","isFinite","positive","negative","P","k","W","z","__proto__","number","nullish","I","JSON","stringify","input","L","M","R","state","when","otherwise","exhaustive","F","run","returnType","narrow","LUXON_LOCALE_MAP","resolveLuxonLocale","locale","_monthCache","Map","_weekdayCache","_dayMonthFmtCache","getLocalizedMonth","month","key","arr","get","freeze","from","_","DateTime","local","set","setLocale","toFormat","getMonthNames","getLocalizedDayMonth","day","year","date","Date","fmt","Intl","DateTimeFormat","getDayMonthFormatter","format","getLocalizedWeekdayShort","weekday","getWeekdayNames","_timeFmtCache","formatLocalizedTime","hour","minute","getTimeFormatter","getWeekStartOffset","jsDayOfWeek","firstDay","getWeekDates","activeDate","current","offset","getDay","weekStart","setDate","getDate","getMonth","getFullYear","getFirstDayOffset","getWeekdayOrder","luxonFirst","Context","LitElement","firstDayOfWeek","order","html","luxonDay","styles","css","__decorateClass","property","type","String","customElement","Day","_hours","_hasActiveSidebar","allDayRowCount","_renderIndicatorValue","hasAllDay","containerHeight","nothing","classMap","allTemplates","ar","s005053d82b712e0a","s090f2107b5a69a7f","s15ba5784a11e0b88","s22380c7fc798a44f","s2bc4d1196bce49dc","s3c44e22d1af5693e","s48e186fb300e5464","s58ab939b42a026a6","s5e8250fb85d64c23","s63d040e37887f17e","s680f01021b5e339d","s98b32ef4a0856c08","s99f110d27e30b289","sa0fd990c985f24bd","sac8252732f2edb19","sb47daaf9e1c4a905","se0955919920ee87d","sfce4bfbe0f911aa7","sa1b2c3d4e5f60001","sa1b2c3d4e5f60002","sa1b2c3d4e5f60003","sa1b2c3d4e5f60004","sa1b2c3d4e5f60005","sa1b2c3d4e5f60006","sa1b2c3d4e5f60007","sa1b2c3d4e5f60008","sa1b2c3d4e5f60009","sa1b2c3d4e5f60010","sa1b2c3d4e5f60011","sa1b2c3d4e5f60012","bn","de","es","fr","hi","id","it","ja","ko","nl","pl","pt","ru","th","tr","uk","vi","MESSAGE_DEFS","_bundleCache","getMessages","bundle","templates","split","resolveTemplates","resolved","hashId","fallback","Entry","heading","isContinuation","density","displayMode","floatText","_sumReducer","accumulator","currentValue","addEventListener","_handleInteraction","_handleFocus","_renderTitle","content","with","_renderTime","msg","allDay","timeString","_displayInterval","time","_renderContent","_shouldShowTime","_getAriaLabel","timeInfo","start","to","end","contentInfo","calendarEvent","pressToOpen","updated","tabIndex","accessibility","setAttribute","ariaLabel","_highlighted","mainClass","isMultiDay","_extended","components","startHour","startMinute","endHour","endMinute","formatLocalizedTimeRange","clearSelection","_e","clearSelectionEvent","CustomEvent","detail","exceptEntry","bubbles","composed","dispatchEvent","KeyboardEvent","preventDefault","stopPropagation","eventDetails","noTitle","noContent","displayTime","noTime","anchorRect","getBoundingClientRect","openMenuEvent","handleMenuClose","removeEventListener","attribute","reflect","Header","viewMode","_getWeekInfo","dt","fromObject","weekNumber","weekYear","currentMonth","calendarWeek","calendarView","_dispatchSwitchView","week","_dispatchSwitchDate","previous","_handleTodayClick","today","todayDate","event","HTMLButtonElement","direction","currentTarget","name","HTMLElement","view","dataset","context","g","fromEntries","Ce","action","description","duration","repeat","summary","trigger","attachments","attendees","method","prodId","version","ve","alarms","categories","created","lastModified","location","exceptionDates","recurrenceRule","stamp","uid","timeTransparent","url","geo","class","organizer","priority","sequence","status","attach","recurrenceId","comment","offsetFrom","offsetTo","recurrenceDate","byDay","byHour","byMinute","byMonth","byMonthday","bySecond","bySetPos","byWeekNo","byYearday","count","frequency","interval","until","workweekStart","completed","due","percentComplete","freeBusy","Dt","f","join","V","dir","delegatedFrom","member","role","partstat","sentBy","rsvp","email","before","weeks","days","hours","minutes","seconds","me","Y","in","isNaN","NaN","he","getTime","setMonth","setFullYear","Ke","fn","B","ae","m","weekStartsOn","options","setHours","ie","setTime","Pe","ke","pe","Ye","toString","yt","Kt","bind","find","Ft","firstWeekContainsDate","E","Bt","Oe","je","Ue","Ht","Math","round","jt","Re","D","We","Ge","ue","ir","occurrence","indexOf","flatMap","Tt","Yt","kt","ge","reverse","Pt","getTimezoneOffset","pr","er","getHours","Ut","ur","setMinutes","getMinutes","Wt","dr","min","Zt","Xt","yr","setSeconds","rr","getSeconds","Gt","Ir","Qt","Jt","Er","Tr","lr","exceptions","wt","xr","mr","flat","splice","se","Je","Sr","props","substring","milliseconds","toLocaleString","timeZone","Dr","abs","trunc","qt","$t","we","toISOString","A","It","He","ln","toUpperCase","In","O","childComponents","generateArrayValues","Rt","icsComponent","icsKeyMap","generateValues","icsKey","nonStandard","generate","Cr","Ct","skipFormatLines","Tn","Nr","vr","related","Rr","formatType","encoding","binary","Nt","T","forceUtc","timezone","gr","timezones","replace","br","Vr","descriptionAltRep","Ar","J","G","range","fe","Menu","open","_cardTop","_cardLeft","_positioned","_handleKeydown","focusable","renderRoot","querySelectorAll","first","last","root","shiftKey","activeElement","focus","_handleClose","_handleExport","eventYear","eventMonth","eventDay","now","icsString","generateIcsEvent","trim","blob","Blob","URL","createObjectURL","document","createElement","href","download","body","appendChild","click","setTimeout","removeChild","revokeObjectURL","changed","has","_computePosition","requestAnimationFrame","closeBtn","querySelector","card","container","parentElement","containerRect","cardRect","anchorTop","top","anchorLeft","left","anchorRight","width","anchorMidY","height","cardW","cardH","max","_formatDate","formatLocalizedDate","cardClasses","hasNotes","close","exportAsICS","DirectionalCalendarDateCalculator","_direction","newDate","isValid","_date","_toCalendarDate","getDateByDayInDirection","adjustedDate","plus","getDateByMonthInDirection","months","Month","currentDate","connectedCallback","customEvent","forwardedEvent","_setupScrollDetection","rafId","updateComplete","then","shadowRoot","dayElement","scrollTop","classList","remove","handleScroll","passive","_isCurrentDate","toDateString","_renderIndicator","isCurrentDate","_getCalendarArray","_dispatchExpand","closest","field","parseInt","_getDaysInMonth","_getOffsetOfFirstDayInMonth","_getDatesInMonthAsArray","sliceArgs","dateTransformer","previousMonth","activeMonth","remainingDays","nextMonth","error","Week","visibleStartIndex","visibleLength","_getWeekDates","_getDatesToRender","visibleDates","_getVisibleWeekdayOrder","fullOrder","_isCondensed","datesToRender","weekdayOrder","allDayHeight","weekContentHeight","showLeftPeek","showRightPeek","switchToDayView","_handleDayLabelClick","_handleDayLabelKeydown","showEarlierDays","_handlePeekNavigate","_handlePeekKeydown","more","showLaterDays","weekDates","targetDate","Year","entrySumByDay","drillTarget","densityMode","todayDay","todayMonth","todayYear","_renderMiniMonth","daysInMonth","firstDayOffset","currentWeek","_handleMonthClick","wd","charAt","weekNum","_handleWeekClick","_renderDayCell","isCurrent","isSelected","eventCount","classes","densityAttr","_handleDayClick","events","getColorTextWithContrast","color","red","green","blue","matches","_m","brightness","LayoutCalculator","minuteHeight","eventMinHeight","calculateLayout","intervals","eventsToIntervals","grading","calculateGrading","boxes","calculateBoxes","startTime","endTime","findOverlapGroups","groupIndices","groupId","depth","group","groupIntervals","originalIndex","longestEvent","longest","nextDepth","groups","assigned","_interval","otherInterval","otherIndex","groupIndex","intervalsOverlap","eventsByGroup","grade","groupEvents","maxDepthInGroup","maxRange","zIndex","opacity","slotManager","_weekIndexCache","calculatePosition","isAllDay","_calculateDayPosition","_calculateWeekPosition","_calculateMonthPosition","generatePositionCSS","position","layout","useAbsolutePosition","useDirectGrid","gridColumn","gridRow","_getGridSlotByTime","slotName","dayColumnIndex","getIndexInDates","getWeekDayIndex","dayIndex","pxToTime","px","hostEl","parseFloat","getComputedStyle","getPropertyValue","totalMinutes","clamped","floor","entryDate","cacheKey","dates","idx","findIndex","startRow","endRow","calculateAccessibility","_generateAriaLabel","padStart","getPositionDescription","validatePosition","valid","message","ViewStateController","host","_viewMode","_host","_activeDate","expandedDate","setViewMode","mode","setActiveDate","navigateNext","currentDateObj","nextDay","nextYear","navigatePrevious","prevMonth","prevDay","prevYear","jumpToToday","switchToMonthView","switchToWeekView","switchToYearView","readCSSToken","prop","clamp","computeWeekDisplayContext","calendarWidth","rawFull","fullCount","rawMobile","mobileCount","rawBreakpoint","effectiveCount","isCondensed","gridColumns","activeIndex","findActiveDateIndex","computeVisibleStart","LMSCalendar","documentElement","lang","yearDrillTarget","yearDensityMode","_viewState","_calendarWidth","innerWidth","_menuOpen","_processedEntries","_expandedEntries","_monthViewSorted","_entrySumByDay","_expandedByISODate","_layoutCache","_allDayLayoutCache","_layoutCalculator","timeColumnWidth","cascadeOffset","paddingLeft","_handleResize","div","contentRect","_resizeController","ResizeController","_handleClickOutside","path","composedPath","menuEl","clickedInsideMenu","clickedOnEntry","el","tagName","_closeMenuAndClearSelections","_handleEscape","_expandedDate","disconnectedCallback","changedProperties","_menuEventDetails","_returnFocusToTrigger","entry","_menuTriggerEntry","firstUpdated","_changedProperties","firstElementChild","willUpdate","_clearEntryCaches","R.pipe","R.filter","Interval","fromDateTimes","R.merge","R.sort","aHour","bHour","aMin","bMin","_computeEntryCaches","clear","_expandEntryMaybe","_getDaysRange","bucket","R.sortBy","continuation","R.map","background","currentActiveDate","_handleSwitchDate","_handleSwitchView","_handleJumpToday","viewLabel","ifDefined","_handleExpand","_handleOpenMenu","_handleClearOtherSelections","_renderEntriesSumByDay","_renderEntries","ctx","result","_renderEntriesByDate","styleMap","elements","_handleMenuClose","clickedEntry","openMenu","focusedEntry","_composeEntry","slot","inlineStyle","spanClass","determinedDensity","_determineDensity","durationMinutes","currentStartDate","fromJSDate","currentEndDate","minus","toObject","total","originalStartDate","_createConsistentEventId","baseDate","slotPrefix","weekCtx","allEntriesForDate","allDayEntries","entriesByDate","_isEffectivelyAllDay","_renderEntriesWithSlotManager","allElements","globalIndexMap","entriesByDay","R.groupBy","condensedDates","dayEntries","dayElements","_renderDayEntriesWithSlotManager","condensedDatesForAllDay","allDayKey","allDayLayout","allDayLayoutEvents","mergedEvents","existing","rowAssignments","totalRows","eventRows","multiDayEvents","singleDayEvents","aMinDay","bMinDay","localeCompare","rowOccupancy","assignedRow","foundRow","rowAvailable","maxRows","rows","size","allocateAllDayRows","text","eventId","positionConfig","row","layoutDimensions","positionCSS","mergedEvent","sortedDays","continuationIndex","totalDays","visibleEndIndex","isFirst","isLast","computeSpanClass","layoutEvents","layoutBox","globalIndex","_isAllDayEvent","smartLayout","_getSmartLayout","_width","startDate","endDate"],"mappings":"yiBAAgK,MAAQ,WAAAA,CAAYC,GAAGC,OAAOC,EAAEC,OAAOC,EAAEC,SAASC,EAAEC,YAAYC,IAAIC,KAAKT,iBAAE,IAAIU,IAAID,KAAKE,GAAE,EAAGF,KAAKG,GAAE,EAAGH,KAAKL,EAAEJ,EAAE,OAAOE,GAAGO,KAAKT,EAAEa,IAAIX,GAAGF,GAAGS,KAAKK,EAAEV,EAAEK,KAAKE,EAAEH,GAAGC,KAAKE,EAAEF,KAAKJ,SAASC,EAAEM,IAAIG,OAAOC,gBAAgBP,KAAKQ,EAAE,IAAID,eAAehB,IAAIS,KAAKS,cAAclB,GAAGS,KAAKL,EAAEe,kBAAkBnB,EAAEoB,cAAcX,OAAOY,QAAQC,KAAK,oEAAoE,CAAC,aAAAJ,CAAclB,GAAGS,KAAKc,MAAMd,KAAKJ,WAAWL,EAAES,KAAKQ,EAAE,CAAC,aAAAO,GAAgB,IAAA,MAAUxB,KAAKS,KAAKT,EAAES,KAAKgB,QAAQzB,EAAE,CAAC,gBAAA0B,GAAmBjB,KAAKkB,YAAY,CAAC,iBAAMC,IAAenB,KAAKE,GAAGF,KAAKG,GAAGH,KAAKS,cAAc,IAAIT,KAAKG,GAAE,CAAE,CAAC,OAAAa,CAAQzB,GAAGS,KAAKT,EAAEa,IAAIb,GAAGS,KAAKQ,EAAEQ,QAAQzB,EAAES,KAAKK,GAAGL,KAAKG,GAAE,EAAGH,KAAKL,EAAEe,eAAe,CAAC,SAAAU,CAAU7B,GAAGS,KAAKT,EAAE8B,OAAO9B,GAAGS,KAAKQ,EAAEY,UAAU7B,EAAE,CAAC,UAAA2B,GAAalB,KAAKQ,EAAEU,YAAY,CAAC,MAAA1B,CAAOD,GAAG,OAAOM,EAAEG,KAAKT,EAAE,GAAE,MAAMM,EAAEJ,EAAE,cAAcF,EAAE,WAAAD,GAAcgC,SAASC,WAAWvB,KAAKwB,WAAU,CAAE,CAAC,MAAAC,CAAOlC,EAAEE,GAAG,CAAC,MAAAiC,CAAOnC,GAAGE,EAAEU,IAAIH,KAAK2B,WAAWlC,EAAEO,KAAK4B,KAAKrC,EAAES,KAAKgB,QAAQb,GAAE,IAAKA,GAAGV,EAAE2B,UAAU7B,EAAEsC,SAAS7B,KAAKwB,WAAU,IAAI,IAAKxB,KAAKwB,YAAY/B,EAAEuB,QAAQzB,EAAEsC,SAAS7B,KAAKwB,WAAU,EAAG,CAAC,YAAAM,GAAe9B,KAAK2B,YAAYP,UAAUpB,KAAK4B,KAAKC,SAAS7B,KAAKwB,WAAU,CAAE,CAAC,WAAAO,IAAc,IAAK/B,KAAKgB,UAAS,IAAKhB,KAAKwB,YAAYxB,KAAK2B,YAAYX,QAAQhB,KAAK4B,KAAKC,SAAS7B,KAAKwB,WAAU,EAAG,ICAx1C,SAASjC,EAAEA,EAAEyC,EAAEjC,GAAG,IAAII,EAAEZ,EAAE0C,OAAOD,EAAEC,OAAO,GAAO,IAAJ9B,EAAM,OAAOZ,KAAKyC,GAAG,GAAO,IAAJ7B,EAAM,OCA9H,SAAWN,EAAEN,EAAEyC,GAAG,IAAIjC,EAAEiC,GAAGnC,EAAEmC,KAAKzC,GAAG,YAAW,IAAJyC,EAAWjC,EAAEmC,OAAOC,OAAOpC,EAAE,CAACqC,KAAKJ,EAAEK,SAAS9C,GAAG,CDAwCM,CAAEN,EAAEyC,EAAEjC,GAAG,MAAMuC,MAAM,4BAA4B,CEAjL,MAAwB/C,EAAE,CAACgD,MAAK,EAAGC,SAAQ,GCAI,SAASjD,EAAEM,KAAKN,GAAG,IAAIkD,EAAE5C,EAAEK,EAAEX,EAAEmD,IAAI7C,GAAG,SAASA,EAA8lB,SAAWA,GAAG,IAAIuC,KAAK7C,EAAE8C,SAASL,GAAGnC,EAAEE,EAAER,KAAKyC,GAAG,OAAOE,OAAOC,OAAOpC,EAAE,CAAC4C,SAASpD,EAAEqD,SAAQ,EAAGC,MAAM,EAAEC,MAAM,IAAI,CAA7sB/C,CAAEF,QAAG,GAAQJ,EAAE,EAAE,KAAKA,EAAEF,EAAE0C,QAAQ,CAAC,YAAG/B,EAAET,KAAcU,EAAEsC,GAAG,CAAYA,GAAE5C,EAAPN,EAAEE,IAAOgD,GAAGhD,GAAG,EAAE,QAAQ,CAAC,IAAII,EAAE,GAAG,IAAA,IAAQmC,EAAEvC,EAAEuC,EAAEzC,EAAE0C,OAAOD,IAAI,CAAC,IAAIzC,EAAEW,EAAE8B,GAAG,QAAO,IAAJzC,IAAaM,EAAEkD,KAAKxD,GAAGA,EAAEoD,UAAU,KAAK,CAAC,IAAI5C,EAAE,GAAG,IAAA,IAAQR,KAAKkD,EAAE,GAAGT,EAAEzC,EAAEQ,EAAEF,GAAG,MAAM,IAAI8C,SAASK,GAAGnD,EAAEoD,IAAG,GAAIR,EAAEO,EAAEjD,EAAE,GAAGA,EAAEN,GAAGI,EAAEoC,MAAM,CAAC,OAAOQ,CAAC,CAAC,SAAST,EAAEzC,EAAEQ,EAAEI,GAAG,GAAc,IAAXA,EAAE8B,cAAkBlC,EAAEgD,KAAKxD,IAAG,EAAG,IAAIkD,EAAElD,EAAEW,EAAEL,EAAEJ,GAAE,EAAG,IAAA,IAAQI,EAAEN,KAAKY,EAAE+C,UAAU,CAAC,IAAIL,MAAMG,EAAEF,MAAMzC,GAAGd,EAAE,GAAGc,EAAE0C,KAAKN,GAAGvC,EAAEX,EAAEkD,EAAEO,EAAE3C,GAAGd,EAAEsD,OAAO,EAAE3C,EAAEsC,QAAQ,CAAC,GAAGtC,EAAEiD,QAAY,CAAC,IAAA,IAAQ5D,KAAKW,EAAEkD,KAAK,GAAGpB,EAAEzC,EAAEQ,EAAEI,EAAEkD,MAAMxD,EAAE,IAAI,OAAM,EAAG,OAAOJ,CAAC,CAACgD,EAAEvC,EAAEkD,IAAI,CAAC,IAAIlD,EAAEsC,QAAQ,MAAMtC,EAAEqC,OAAO9C,GAAE,EAAG,CAAC,OAAOS,EAAEsC,SAASzC,EAAEgD,KAAKN,GAAGhD,CAAC,CAAmH,SAASU,EAAEN,GAAG,MAAiB,iBAAHA,GAAuB,iBAAHA,KAAeA,GAAGyD,OAAOC,YAAY1D,CAAC,CCAz4B,MAAMA,EAAE,CAAC2D,IAAI,CAAC3D,EAAEN,IAAIM,EAAEN,EAAEkE,KAAK,CAAC5D,EAAEN,IAAIM,EAAEN,GAAG,SAASA,EAAEM,EAAEN,GAAG,IAAIyC,KAAKS,GAAGlD,EAAE,IAA4W,SAAWA,GAAG,GAAGkD,EAAElD,GAAG,OAAM,EAAG,GAAa,iBAAHA,IAAcmE,MAAMC,QAAQpE,GAAG,OAAM,EAAG,IAAIyC,EAAEjC,KAAKI,GAAGZ,EAAE,OAAOkD,EAAET,IAAc,iBAAHjC,GAAaA,KAAKF,GAAc,IAAXM,EAAE8B,MAAU,CAA9f9B,CAAE6B,GAAG,OAAOnC,EAAEmC,EAAEjC,KAAK0C,IAAI,IAAIvC,EAAEH,EAAEiC,KAAKS,GAAG,OAAOlD,GAAGM,EAAEN,EAAEW,EAAE,CAAuG,SAASH,EAAER,EAAEyC,KAAK7B,GAAG,IAAIsC,EAAY,mBAAHlD,EAAcA,EAAEA,EAAE,GAAGW,EAAY,mBAAHX,EAAc,MAAMA,EAAE,IAAIqE,CAAC1D,GAAGT,GAAGI,EAAEmD,OAAM,IAAJhB,OAAW,EAAOjC,EAAEiC,KAAK7B,GAAG,MAAM,CAACN,EAAEN,KAAK,IAAIyC,EAAES,EAAE5C,GAAGE,EAAE0C,EAAElD,GAAG,OAAOE,EAAEuC,EAAEjC,GAAG,EAAEN,EAAEM,EAAEiC,IAAG,EAAGgB,IAAInD,EAAEN,IAAI,EAAE,CAAwJ,MAAMkD,EAAE5C,GAAa,mBAAHA,GAA0B,IAAXA,EAAEoC,OCA1f,MAAMlC,EAAE,CAACF,EAAEN,IAAIM,EAAEgE,OAAOtE,GAAGY,EAAEN,GAAG,CAACmC,EAAEjC,EAAEI,IAAIN,EAAEmC,EAAEjC,EAAEI,GAAG,CAACoC,MAAK,EAAGC,SAAQ,EAAGY,KAAKpB,GAAGzC,ECA/H,MAAMyC,EAAE,CAACnC,EAAEN,KAAK,IAAIyC,iBAAEE,OAAO4B,OAAO,MAAM,IAAA,IAAQ/D,EAAE,EAAEA,EAAEF,EAAEoC,OAAOlC,IAAI,CAAC,IAAII,EAAEN,EAAEE,GAAG0C,EAAElD,EAAEY,EAAEJ,EAAEF,GAAG,QAAO,IAAJ4C,EAAW,CAAC,IAAI5C,EAAEmC,EAAES,QAAO,IAAJ5C,EAAWmC,EAAES,GAAG,CAACtC,GAAGN,EAAEkD,KAAK5C,EAAE,CAAC,CAAC,OAAO+B,OAAO6B,eAAe/B,EAAEE,OAAO8B,WAAWhC,GCApM,MAAMA,EAAE,CAACnC,EAAEN,IAAIM,EAAE6C,IAAInD,GAAGQ,EAAEF,GAAG,CAACN,EAAEyC,EAAEjC,KAAAA,CAAMwC,MAAK,EAAGC,SAAQ,EAAGY,KAAKvD,EAAEN,EAAEyC,EAAEjC,KCAvG,SAASR,KAAKA,GAAG,OAAOM,EAAEmC,EAAEzC,EAAE,CAAC,MAAMyC,EAAE,CAACnC,EAAEN,KAAAA,IAASM,KAAKN,ICAzB,SAASyC,EAAEnC,EAAEN,GAAG,IAAIyC,EAAE,IAAInC,GAAG,OAAOmC,EAAEiC,KAAK1E,GAAGyC,CAAC,CCAhC,MAAMA,EAAE,CAACnC,EAAEN,IAAI,IAAIM,GAAGoE,KAAK1E,GCAtGA,iBAAE+D,OAAOY,IAAI,uBAAuBrE,iBAAEyD,OAAOY,IAAI,0BAA0BlC,EAAE,mCAAmCjC,EAAER,GAAG4E,QAAQ5E,GAAG,iBAAiBA,GAAGY,EAAEN,GAAGA,KAAKA,EAAEN,GAAGW,EAAE,CAAC8B,EAAEvC,EAAEuD,KAAK,GAAG7C,EAAE6B,GAAG,CAAC,MAAMnC,EAAEmC,EAAEzC,MAAM6E,QAAQrE,EAAEsE,WAAWlE,GAAGN,EAAEyE,MAAM7E,GAAG,OAAOM,GAAGI,GAAG+B,OAAOqC,KAAKpE,GAAGqE,QAAQjF,GAAGyD,EAAEzD,EAAEY,EAAEZ,KAAKQ,CAAC,CAAC,GAAGA,EAAEiC,GAAG,CAAC,IAAIjC,EAAEN,GAAG,SAAS,GAAGiE,MAAMC,QAAQ3B,GAAG,CAAC,IAAI0B,MAAMC,QAAQlE,GAAG,SAAS,IAAIF,EAAE,GAAGQ,EAAE,GAAGS,EAAE,GAAG,IAAA,MAAUN,KAAK8B,EAAEuC,OAAO,CAAC,MAAM9E,EAAEuC,EAAE9B,GAAGC,EAAEV,IAAIA,EAAEI,GAAGW,EAAEuC,KAAKtD,GAAGe,EAAEyB,OAAOlC,EAAEgD,KAAKtD,GAAGF,EAAEwD,KAAKtD,EAAE,CAAC,GAAGe,EAAEyB,OAAO,CAAC,GAAGzB,EAAEyB,OAAO,EAAE,MAAM,IAAIK,MAAM,4FAA4F,GAAG7C,EAAEwC,OAAO1C,EAAE0C,OAAOlC,EAAEkC,OAAO,OAAM,EAAG,MAAMpC,EAAEJ,EAAE4D,MAAM,EAAE9D,EAAE0C,QAAQD,EAAE,IAAIjC,EAAEkC,OAAO,GAAGxC,EAAE4D,OAAOtD,EAAEkC,QAAQ9B,EAAEV,EAAE4D,MAAM9D,EAAE0C,OAAO,IAAIlC,EAAEkC,OAAOwC,KAAU1E,EAAEkC,QAAQ,OAAO1C,EAAEmF,MAAM,CAACnF,EAAEyC,IAAI9B,EAAEX,EAAEM,EAAEmC,GAAGgB,KAAKjD,EAAE2E,MAAM,CAACnF,EAAEM,IAAIK,EAAEX,EAAEyC,EAAEnC,GAAGmD,MAAM,IAAIxC,EAAEyB,QAAQ/B,EAAEM,EAAE,GAAGL,EAAE6C,GAAG,CAAC,OAAOhB,EAAEC,SAASxC,EAAEwC,QAAQD,EAAE0C,MAAM,CAACnF,EAAEM,IAAIK,EAAEX,EAAEE,EAAEI,GAAGmD,GAAG,CAAC,OAAO2B,QAAQC,QAAQ5C,GAAG0C,MAAM7E,IAAI,MAAME,EAAEiC,EAAEnC,GAAG,OAAOA,KAAKJ,GAAGU,EAAEK,EAAET,IAAI,aAAaS,EAAEjB,KAAKsF,cAAc3E,EAAEH,EAAEN,EAAEI,GAAGmD,GAAG,IAAIxC,GAAG,CAAC,OAAO0B,OAAO4C,GAAGrF,EAAEuC,IAAIvC,EAAEI,IAAI,IAAImC,EAAE9B,EAAEM,EAAE,OAAOT,EAAEF,GAAGM,EAAEN,GAAG,OAAOmC,EAAE,OAAO9B,GAAGM,EAAEX,EAAEN,MAAMwF,yBAAyB7E,EAAE8E,KAAKxE,IAAIwB,EAAE,GAAG0B,MAAMC,QAAQ9D,GAAGmD,EAAEnD,EAAEJ,GAAGuD,EAAEd,OAAO+C,OAAOpF,GAAGJ,GAAG,IAAIuD,EAAE,CAACzD,EAAEM,IAAIN,EAAE2F,OAAO,CAAC3F,EAAEyC,IAAIzC,EAAE4F,OAAOtF,EAAEmC,IAAI,IAA6O,SAASS,EAAElD,GAAG,OAAO2C,OAAOC,OAAO5C,EAAE,CAAC6F,SAAS,KAAIzF,OAA4WE,EAA1WN,EAAoXkD,EAAE,CAAClD,CAACA,GAAG,KAAA,CAAM+E,MAAM/E,IAAI,IAAIyC,EAAE,CAAA,EAAG,MAAMjC,EAAE,CAACR,EAAEM,KAAKmC,EAAEzC,GAAGM,GAAG,YAAO,IAASN,GAAGE,EAAEI,GAAG2E,QAAQjF,GAAGQ,EAAER,OAAE,IAAS,CAAC6E,SAAQ,EAAGC,WAAWrC,IAAI,CAACoC,QAAQlE,EAAEL,EAAEN,EAAEQ,GAAGsE,WAAWrC,IAAI+C,iBAAiB,IAAItF,EAAEI,GAAGgF,YAAY,eAA/N,IAAWhF,GAAvWwF,IAAIxF,GAAGyF,EAAE/F,EAAEM,GAAG0F,GAAG1F,GAAu8B,YAAcA,GAAG,OAAO4C,EAAE,CAAClD,CAACA,GAAG,KAAA,CAAM+E,MAAM/E,IAAI,IAAIyC,EAAE,GAAG,MAAMjC,EAAE,CAACR,EAAEM,KAAKmC,EAAEzC,GAAGM,GAAG,OAAOmD,EAAEnD,EAAEJ,GAAG+E,QAAQjF,GAAGQ,EAAER,OAAE,IAAS,CAAC6E,QAAQvE,EAAE2F,KAAK3F,GAAGK,EAAEL,EAAEN,EAAEQ,IAAIsE,WAAWrC,IAAI+C,iBAAiB,IAAI/B,EAAEnD,EAAEJ,GAAGoF,YAAY,QAAQ,CAAtpCY,CAAElG,EAAEM,GAAG6F,OAAO7F,QAAG,IAASA,EAAE8F,EAAEpG,GAAGoG,EAAE9F,EAAEN,IAAI,CAAsuB,SAAS+F,KAAKzF,GAAG,OAAO4C,EAAE,CAAClD,CAACA,GAAG,KAAA,CAAM+E,MAAM/E,IAAI,IAAIyC,EAAE,GAAG,MAAMjC,EAAE,CAACR,EAAEM,KAAKmC,EAAEzC,GAAGM,GAAG,MAAM,CAACuE,QAAQvE,EAAE6E,MAAM7E,GAAGK,EAAEL,EAAEN,EAAEQ,IAAIsE,WAAWrC,IAAI+C,iBAAiB,IAAI/B,EAAEnD,EAAEJ,GAAGoF,YAAY,SAAS,CAAoN,SAASe,EAAE/F,GAAG,MAAM,CAACN,CAACA,GAAG,KAAA,CAAM+E,MAAM/E,IAAAA,CAAK6E,QAAQD,QAAQtE,EAAEN,QAAQ,CAAC,SAASoG,KAAK9F,GAAG,MAAME,EAAE,iBAAiBF,EAAE,GAAGA,EAAE,QAAG,EAAOM,EAAE,IAAIN,EAAEoC,OAAOpC,EAAE,GAAG,iBAAiBA,EAAE,QAAG,EAAOA,EAAE,GAAG,OAAO4C,EAAE,CAAClD,CAACA,GAAG,KAAA,CAAM+E,MAAM/E,IAAI,IAAIM,EAAE,CAAC,CAAC,MAAME,EAAEA,EAAEiC,GAAGzC,GAAG,MAAM,CAAC6E,aAAQ,IAASjE,GAAGD,EAAEC,EAAEZ,EAAE,CAACA,EAAEyC,KAAKnC,EAAEN,GAAGyC,IAAIqC,WAAWxE,IAAIkF,iBAAiB,IAAI,CAAC,MAAMhF,EAAEA,EAAEiC,GAAGmD,YAAO,IAAShF,EAAE,GAAGV,EAAEU,OAAO,CAAC,SAAS0F,EAAEtG,GAAG,OAAM,CAAE,CAAC,SAASuG,EAAEvG,GAAG,MAAM,iBAAiBA,CAAC,CAAC,SAASwG,EAAExG,GAAG,MAAM,iBAAiBA,CAAC,CAAC,SAASyG,EAAEzG,GAAG,MAAM,iBAAiBA,CAAC,CAASkD,EAAEmD,EAAEC,IAAMpD,EAAEmD,EAAEC,UAAQI,EAAE1G,GAAG2C,OAAOC,OAAOM,EAAElD,GAAG,CAAC2G,WAAWrG,IAAI,OAAOoG,EAAEX,EAAE/F,GAAGyC,EAAEnC,EAAE+F,EAAErG,GAAGwG,EAAExG,IAAIA,EAAE2G,WAAWlE,OAAO,IAAIA,GAAGmE,SAAStG,IAAI,OAAOoG,EAAEX,EAAE/F,GAAGyC,EAAEnC,EAAE+F,EAAErG,GAAGwG,EAAExG,IAAIA,EAAE4G,SAASnE,OAAO,IAAIA,GAAGoE,UAAUvG,IAAGoG,SAAEX,EAAE/F,GAAGA,EAA4BM,EAAzB+F,EAAE/F,GAAGkG,EAAElG,IAAIA,EAAEoC,QAAQ1C,MAA3BA,IAAGA,GAAiC0C,OAAOpC,IAAGoG,SAAEX,EAAE/F,GAAGA,EAA6BM,EAA1B+F,EAAE/F,GAAGkG,EAAElG,IAAIA,EAAEoC,SAAS1C,MAA5BA,IAAGA,GAAkC8G,UAAUxG,IAAGoG,SAAEX,EAAE/F,GAAGA,EAA4BM,EAAzB+F,EAAE/F,GAAGkG,EAAElG,IAAIA,EAAEoC,QAAQ1C,UAAxBA,GAAiC+G,SAASzG,IAAI,OAAOoG,EAAEX,EAAE/F,GAAGyC,EAAEnC,EAAE+F,EAAErG,GAAGwG,EAAExG,IAAIA,EAAE+G,SAAStE,OAAO,IAAIA,GAAGuE,MAAM1G,IAAI,OAAOoG,EAAEX,EAAE/F,GAAGyC,EAAEnC,EAAE+F,EAAErG,GAAGwG,EAAExG,IAAI4E,QAAQ5E,EAAE+E,MAAMtC,QAAQ,IAAIA,KAAOiE,EAAEL,EAAEG,IAAG,MAACS,EAAEjH,GAAG2C,OAAOC,OAAOM,EAAElD,GAAG,CAACkH,QAAQ,CAAC5G,EAAEmC,KAAIwE,SAAElB,EAAE/F,GAAIA,EAA8BM,EAA5BA,EAA8BmC,EAA1B4D,EAAE5D,GAAG8D,EAAE9D,IAAIzC,GAAGyC,GAAGnC,GAAGmC,MAA9BzC,IAAIA,EAAEM,GAAmC6G,GAAG7G,IAAG2G,SAAElB,EAAE/F,GAAGA,EAAoBM,EAAjB+F,EAAE/F,GAAGiG,EAAEjG,IAAIA,EAAEN,MAAnBA,IAAGA,GAAyBoH,GAAG9G,IAAG2G,SAAElB,EAAE/F,GAAGA,EAAoBM,EAAjB+F,EAAE/F,GAAGiG,EAAEjG,IAAIA,EAAEN,MAAnBA,IAAGA,GAAyBqH,IAAI/G,IAAG2G,SAAElB,EAAE/F,GAAGA,EAAqBM,EAAlB+F,EAAE/F,GAAGiG,EAAEjG,IAAIA,GAAGN,UAAjBA,GAA0BsH,IAAIhH,IAAG2G,SAAElB,EAAE/F,GAAGA,EAAqBM,EAAlB+F,EAAE/F,GAAGiG,EAAEjG,IAAIA,GAAGN,MAApBA,IAAGA,GAA0BuH,IAAI,IAAIN,EAAElB,EAAE/F,EAAEqG,EAAErG,GAAGuG,EAAEvG,IAAIwH,OAAOC,UAAUzH,MAAM0H,OAAO,IAAIT,EAAElB,EAAE/F,EAAEqG,EAAErG,GAAGuG,EAAEvG,IAAIwH,OAAOG,SAAS3H,MAAM4H,SAAS,IAAIX,EAAElB,EAAE/F,EAAEqG,EAAErG,GAAGuG,EAAEvG,IAAIA,EAAE,KAAK6H,SAAS,IAAIZ,EAAElB,EAAE/F,EAAEqG,EAAErG,GAAGuG,EAAEvG,IAAIA,EAAE,OAAO8H,GAAEb,EAAEZ,EAAEE,IAAIwB,GAAE/H,GAAG2C,OAAOC,OAAOM,EAAElD,GAAG,CAACkH,QAAQ,CAAC5G,EAAEmC,KAAIsF,UAAEhC,EAAE/F,GAAIA,EAA8BM,EAA5BA,EAA8BmC,EAA1B4D,EAAE5D,GAAGgE,EAAEhE,IAAIzC,GAAGyC,GAAGnC,GAAGmC,UAA1BzC,EAAEM,GAAmC6G,GAAG7G,IAAGyH,UAAEhC,EAAE/F,GAAGA,EAAoBM,EAAjB+F,EAAE/F,GAAGmG,EAAEnG,IAAIA,EAAEN,UAAhBA,GAAyBoH,GAAG9G,IAAGyH,UAAEhC,EAAE/F,GAAGA,EAAoBM,EAAjB+F,EAAE/F,GAAGmG,EAAEnG,IAAIA,EAAEN,MAAnBA,IAAGA,GAAyBqH,IAAI/G,IAAGyH,UAAEhC,EAAE/F,GAAGA,EAAqBM,EAAlB+F,EAAE/F,GAAGmG,EAAEnG,IAAIA,GAAGN,MAApBA,IAAGA,GAA0BsH,IAAIhH,IAAGyH,UAAEhC,EAAE/F,GAAGA,EAAqBM,EAAlB+F,EAAE/F,GAAGmG,EAAEnG,IAAIA,GAAGN,UAAjBA,GAA0B4H,SAAS,IAAIG,GAAEhC,EAAE/F,EAAEqG,EAAErG,GAAGyG,EAAEzG,IAAIA,EAAE,KAAK6H,SAAS,IAAIE,GAAEhC,EAAE/F,EAAEqG,EAAErG,GAAGyG,EAAEzG,IAAIA,EAAE,OAAS+H,GAAE1B,EAAEI,IAAMvD,EAAEmD,EAAE,SAASrG,GAAG,MAAM,kBAAkBA,CAAC,IAAMkD,EAAEmD,EAAE,SAASrG,GAAG,MAAM,iBAAiBA,CAAC,IAAG,MAACgI,GAAE9E,EAAEmD,EAAE,SAASrG,GAAG,OAAO,MAAMA,CAAC,IAAMkD,EAAEmD,EAAE,SAASrG,GAAG,OAAO,MAAMA,CAAC,IAAI,IAAIiI,GAAE,CAACC,UAAU,KAA6gEC,OAAOL,GAA8BM,QAAQJ,IAAoI,MAAMK,WAAUtF,MAAM,WAAAhD,CAAYC,GAAG,IAAIM,EAAE,IAAIA,EAAEgI,KAAKC,UAAUvI,EAAE,OAAOyC,GAAGnC,EAAEN,CAAC,CAAC+B,MAAM,oDAAoDzB,KAAKG,KAAK+H,WAAM,EAAO/H,KAAK+H,MAAMxI,CAAC,EAAE,MAAMyI,GAAE,CAAC5D,SAAQ,EAAGtD,WAAM,GAAQ,SAASmH,GAAE1I,GAAG,OAAO,IAAI2I,GAAE3I,EAAEyI,GAAE,QAAC,MAAME,EAAE,WAAA5I,CAAYC,EAAEM,GAAGG,KAAK+H,aAAa/H,KAAKmI,aAAanI,KAAK+H,MAAMxI,EAAES,KAAKmI,MAAMtI,CAAC,CAAC,QAAQN,GAAG,GAAGS,KAAKmI,MAAM/D,QAAQ,OAAOpE,KAAK,MAAMH,EAAEN,EAAEA,EAAE0C,OAAO,GAAGlC,EAAE,CAACR,EAAE,IAAI,IAAIY,EAAE,IAAIZ,EAAE0C,QAAQ,mBAAmB1C,EAAE,GAAGY,EAAEZ,EAAE,GAAGA,EAAE0C,OAAO,GAAGlC,EAAEgD,QAAQxD,EAAE8D,MAAM,EAAE9D,EAAE0C,OAAO,IAAI,IAAIxC,GAAE,EAAGuD,EAAE,CAAA,EAAG,MAAMxC,EAAE,CAACjB,EAAEM,KAAKJ,GAAE,EAAGuD,EAAEzD,GAAGM,GAAG4C,GAAG1C,EAAEyF,KAAKjG,GAAGW,EAAEX,EAAES,KAAK+H,MAAMvH,KAAKL,IAAIgE,QAAQhE,EAAEH,KAAK+H,QAAQC,GAAE,CAAC5D,SAAQ,EAAGtD,MAAMjB,EAAEJ,EAAEuC,KAAKgB,EAAEA,EAAEhB,GAAGgB,EAAEhD,KAAK+H,MAAM/H,KAAK+H,QAAQ,OAAO,IAAIG,EAAElI,KAAK+H,MAAMtF,EAAE,CAAC,IAAA2F,CAAK7I,EAAEM,GAAG,GAAGG,KAAKmI,MAAM/D,QAAQ,OAAOpE,KAAK,MAAMgC,EAAEmC,QAAQ5E,EAAES,KAAK+H,QAAQ,OAAO,IAAIG,EAAElI,KAAK+H,MAAM/F,EAAE,CAACoC,SAAQ,EAAGtD,MAAMjB,EAAEG,KAAK+H,MAAM/H,KAAK+H,QAAQC,GAAE,CAAC,SAAAK,CAAU9I,GAAG,OAAOS,KAAKmI,MAAM/D,QAAQpE,KAAKmI,MAAMrH,MAAMvB,EAAES,KAAK+H,MAAM,CAAC,UAAAO,CAAW/I,EAAEgJ,IAAG,OAAOvI,KAAKmI,MAAM/D,QAAQpE,KAAKmI,MAAMrH,MAAMvB,EAAES,KAAK+H,MAAM,CAAC,GAAAS,GAAM,OAAOxI,KAAKsI,YAAY,CAAC,UAAAG,GAAa,OAAOzI,IAAI,CAAC,MAAA0I,GAAS,OAAO1I,IAAI,GAAE,SAASuI,GAAEhJ,GAAG,MAAM,IAAIqI,GAAErI,EAAE,CCO/0P,MAAMoJ,GAA2C,CAC7C,UAAW,QACX,UAAW,SAMf,SAASC,GAAmBC,GACxB,OAAOF,GAAiBE,IAAWA,CACvC,CAGA,MAAMC,sBAAkBC,IAoBxB,MAAMC,sBAAoBD,IAoB1B,MAAME,sBAAwBF,IAsBvB,SAASG,GAAkBC,EAAeN,EAAS,MACtD,OA7DJ,SAAuBA,GACnB,MAAMO,EAAMR,GAAmBC,GAC/B,IAAIQ,EAAMP,GAAYQ,IAAIF,GAY1B,OAXKC,IACDA,EAAMnH,OAAOqH,OACT7F,MAAM8F,KAAK,CAAEvH,OAAQ,IAAM,CAACwH,EAAGtJ,IAC3BuJ,EAASC,QACJC,IAAI,CAAET,MAAQhJ,EAAI,IAClB0J,UAAUT,GACVU,SAAS,SAGtBhB,GAAYc,IAAIR,EAAKC,IAElBA,CACX,CA8CWU,CAAclB,GAAQM,EAAQ,EACzC,CAMO,SAASa,GAAqBC,EAAad,EAAee,EAAcrB,EAAS,MACpF,MAAMsB,EAAO,IAAIC,KAAKF,EAAMf,EAAQ,EAAGc,GACvC,OA9BJ,SAA8BpB,GAC1B,MAAMO,EAAMR,GAAmBC,GAC/B,IAAIwB,EAAMpB,GAAkBK,IAAIF,GAKhC,OAJKiB,IACDA,EAAM,IAAIC,KAAKC,eAAenB,EAAK,CAAEa,IAAK,UAAWd,MAAO,UAC5DF,GAAkBW,IAAIR,EAAKiB,IAExBA,CACX,CAsBWG,CAAqB3B,GAAQ4B,OAAON,EAC/C,CAKO,SAASO,GAAyBC,EAAiB9B,EAAS,MAC/D,OAzDJ,SAAyBA,GACrB,MAAMO,EAAMR,GAAmBC,GAC/B,IAAIQ,EAAML,GAAcM,IAAIF,GAY5B,OAXKC,IACDA,EAAMnH,OAAOqH,OACT7F,MAAM8F,KAAK,CAAEvH,OAAQ,GAAK,CAACwH,EAAGtJ,IAC1BuJ,EAASC,QACJC,IAAI,CAAEe,QAAUxK,EAAI,IACpB0J,UAAUT,GACVU,SAAS,SAGtBd,GAAcY,IAAIR,EAAKC,IAEpBA,CACX,CA0CWuB,CAAgB/B,GAAQ8B,EAAU,EAC7C,CAGA,MAAME,sBAAoB9B,IAgBnB,SAAS+B,GAAoBC,EAAcC,EAAgBnC,EAAS,MACvE,MAAMvD,EAAI,IAAI8E,KAAK,IAAM,EAAG,EAAGW,EAAMC,GACrC,OAhBJ,SAA0BnC,GACtB,MAAMO,EAAMR,GAAmBC,GAC/B,IAAIwB,EAAMQ,GAAcvB,IAAIF,GAK5B,OAJKiB,IACDA,EAAM,IAAIC,KAAKC,eAAenB,EAAK,CAAE2B,KAAM,UAAWC,OAAQ,YAC9DH,GAAcjB,IAAIR,EAAKiB,IAEpBA,CACX,CAQWY,CAAiBpC,GAAQ4B,OAAOnF,EAC3C,CCnGO,SAAS4F,GAAmBC,EAAqBC,GACpD,QAASD,EAAcC,GAAY,EAAI,GAAK,CAChD,CAMO,SAASC,GAAaC,EAA0BF,GACnD,MAAMG,EAAU,IAAInB,KAAKkB,EAAWpB,KAAMoB,EAAWnC,MAAQ,EAAGmC,EAAWrB,KACrEuB,EAASN,GAAmBK,EAAQE,SAAUL,GAC9CM,EAAY,IAAItB,KAAKmB,GAG3B,OAFAG,EAAUC,QAAQJ,EAAQK,UAAYJ,GAE/B9H,MAAM8F,KAAK,CAAEvH,OAAQ,GAAK,CAACwH,EAAGtJ,KACjC,MAAMmF,EAAI,IAAI8E,KAAKsB,GAEnB,OADApG,EAAEqG,QAAQD,EAAUE,UAAYzL,GACzB,CAAE8J,IAAK3E,EAAEsG,UAAWzC,MAAO7D,EAAEuG,WAAa,EAAG3B,KAAM5E,EAAEwG,gBAEpE,CAQO,SAASC,GAAkB5B,EAAoBiB,GAElD,OAAOF,GADO,IAAId,KAAKD,EAAKD,KAAMC,EAAKhB,MAAQ,EAAG,GAAGsC,SACpBL,EACrC,CASO,SAASY,GAAgBZ,GAG5B,MAAMa,EAA0B,IAAbb,EAAiB,EAAIA,EACxC,OAAO1H,MAAM8F,KAAK,CAAEvH,OAAQ,GAAK,CAACwH,EAAGtJ,KAAQ8L,EAAa,EAAI9L,GAAK,EAAK,EAC5E,sMC5DA,IAAqB+L,GAArB,cAAqCC,EAArC,WAAA7M,GAAAgC,SAAAC,WAEIvB,KAAAoM,eAAiC,EAGjCpM,KAAA6I,OAAS,IAAA,CAoBA,MAAApH,GACL,MAAM4K,EAAQL,GAAgBhM,KAAKoM,gBACnC,OAAOE,CAAA;cACDD,EAAM3J,IAAK6J,GAAaD,CAAA,SAAa5B,GAAyB6B,EAAUvM,KAAK6I;eAEvF,GA9BiBqD,GAODM,OAASC,CAAA;;;;;;;;;;;;;;;;MALzBC,GAAA,CADCC,EAAS,CAAEC,KAAM7F,UADDmF,GAEjBlI,UAAA,iBAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,UAJDX,GAKjBlI,UAAA,SAAA,GALiBkI,GAArBQ,GAAA,CADCI,EAAc,yBACMZ,yMCArB,IAAqBa,GAArB,cAAiCZ,EAAjC,WAAA7M,GAAAgC,SAAAC,WAEIvB,KAAAgN,OAAS,IAAItJ,MAAM,IAAIa,QAGvBvE,KAAAiN,mBAAoB,EAGpBjN,KAAAkN,eAAiB,EAGjBlN,KAAA6I,OAAS,IAAA,CA8GD,qBAAAsE,CAAsBpC,GAC1B,OAAOD,GAAoBC,EAAM,EAAG/K,KAAK6I,OAC7C,CAES,MAAApH,GACL,MAAM2L,EAAYpN,KAAKkN,eAAiB,EAClCG,EAAkBD,EAClB,uBAA6C,GAAtBpN,KAAKkN,oBAC5B,OAEN,OAAOZ,CAAA;cAECc,EACMd,CAAA;;;;;;wBAOAgB;oDAE8BD;;kCAElBE,EAAS,CACnB,SAAUvN,KAAKiN,kBACf,OAAQjN,KAAKiN;;;0BAIXjN,KAAKgN,OAAOtK,IACTqI,GAASuB,CAAA;;;uDAGiBvB;;;0CAGb/K,KAAKmN,sBAAsBpC;;;;;;;;;;;+BAYtC/K,KAAKiN;;;eAIhC,GA9KiBF,GAaDP,OAASC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAXzBC,GAAA,CADCvE,KADgB4E,GAEjB/I,UAAA,SAAA,GAGA0I,GAAA,CADCvE,KAJgB4E,GAKjB/I,UAAA,oBAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAM7F,UAPDgG,GAQjB/I,UAAA,iBAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,UAVDE,GAWjB/I,UAAA,SAAA,GAXiB+I,GAArBL,GAAA,CADCI,EAAc,qBACMC,ICDd,MCgBDS,GAAuD,CACzDC,GDjBqB,CACrBC,kBAAmB,UACnBC,kBAAmB,IACnBC,kBAAmB,eACnBC,kBAAmB,aACnBC,kBAAmB,iBACnBC,kBAAmB,MACnBC,kBAAmB,QACnBC,kBAAmB,aACnBC,kBAAmB,QACnBC,kBAAmB,QACnBC,kBAAmB,QACnBC,kBAAmB,aACnBC,kBAAmB,UACnBC,kBAAmB,eACnBC,kBAAmB,UACnBC,kBAAmB,MACnBC,kBAAmB,MACnBC,kBAAmB,WACnBC,kBAAmB,SACnBC,kBAAmB,SACnBC,kBAAmB,QACnBC,kBAAmB,aACnBC,kBAAmB,oCACnBC,kBAAmB,MACnBC,kBAAmB,2BACnBC,kBAAmB,qBACnBC,kBAAmB,qBACnBC,kBAAmB,SACnBC,kBAAmB,cACnBC,kBAAmB,OCZnBC,GClBqB,CACrB9B,kBAAmB,MACnBC,kBAAmB,IACnBC,kBAAmB,cACnBC,kBAAmB,iBACnBC,kBAAmB,qBACnBC,kBAAmB,MACnBC,kBAAmB,OACnBC,kBAAmB,UACnBC,kBAAmB,OACnBC,kBAAmB,KACnBC,kBAAmB,SACnBC,kBAAmB,cACnBC,kBAAmB,UACnBC,kBAAmB,iBACnBC,kBAAmB,QACnBC,kBAAmB,MACnBC,kBAAmB,MACnBC,kBAAmB,WACnBC,kBAAmB,OACnBC,kBAAmB,OACnBC,kBAAmB,SACnBC,kBAAmB,qBACnBC,kBAAmB,uCACnBC,kBAAmB,OACnBC,kBAAmB,kBACnBC,kBAAmB,qBACnBC,kBAAmB,qBACnBC,kBAAmB,MACnBC,kBAAmB,kBACnBC,kBAAmB,ODXnBE,GEnBqB,CACrB/B,kBAAmB,UACnBC,kBAAmB,KACnBC,kBAAmB,kBACnBC,kBAAmB,cACnBC,kBAAmB,sBACnBC,kBAAmB,OACnBC,kBAAmB,OACnBC,kBAAmB,YACnBC,kBAAmB,YACnBC,kBAAmB,QACnBC,kBAAmB,QACnBC,kBAAmB,aACnBC,kBAAmB,QACnBC,kBAAmB,gBACnBC,kBAAmB,QACnBC,kBAAmB,QACnBC,kBAAmB,MACnBC,kBAAmB,aACnBC,kBAAmB,SACnBC,kBAAmB,SACnBC,kBAAmB,UACnBC,kBAAmB,mBACnBC,kBAAmB,2CACnBC,kBAAmB,MACnBC,kBAAmB,gCACnBC,kBAAmB,wBACnBC,kBAAmB,wBACnBC,kBAAmB,OACnBC,kBAAmB,kBACnBC,kBAAmB,WFVnB,QGpBqB,CACrB7B,kBAAmB,UACnBC,kBAAmB,KACnBC,kBAAmB,kBACnBC,kBAAmB,cACnBC,kBAAmB,sBACnBC,kBAAmB,OACnBC,kBAAmB,OACnBC,kBAAmB,YACnBC,kBAAmB,YACnBC,kBAAmB,QACnBC,kBAAmB,QACnBC,kBAAmB,aACnBC,kBAAmB,QACnBC,kBAAmB,gBACnBC,kBAAmB,QACnBC,kBAAmB,QACnBC,kBAAmB,MACnBC,kBAAmB,aACnBC,kBAAmB,SACnBC,kBAAmB,SACnBC,kBAAmB,UACnBC,kBAAmB,mBACnBC,kBAAmB,2CACnBC,kBAAmB,MACnBC,kBAAmB,gCACnBC,kBAAmB,wBACnBC,kBAAmB,wBACnBC,kBAAmB,OACnBC,kBAAmB,kBACnBC,kBAAmB,WHTnBG,GIrBqB,CACrBhC,kBAAmB,QACnBC,kBAAmB,IACnBC,kBAAmB,aACnBC,kBAAmB,gBACnBC,kBAAmB,oBACnBC,kBAAmB,MACnBC,kBAAmB,OACnBC,kBAAmB,cACnBC,kBAAmB,SACnBC,kBAAmB,MACnBC,kBAAmB,SACnBC,kBAAmB,aACnBC,kBAAmB,SACnBC,kBAAmB,sBACnBC,kBAAmB,QACnBC,kBAAmB,MACnBC,kBAAmB,MACnBC,kBAAmB,WACnBC,kBAAmB,WACnBC,kBAAmB,YACnBC,kBAAmB,UACnBC,kBAAmB,wBACnBC,kBAAmB,4CACnBC,kBAAmB,IACnBC,kBAAmB,8BACnBC,kBAAmB,0BACnBC,kBAAmB,2BACnBC,kBAAmB,MACnBC,kBAAmB,uBACnBC,kBAAmB,SJRnBI,GKtBqB,CACrBjC,kBAAmB,QACnBC,kBAAmB,IACnBC,kBAAmB,gBACnBC,kBAAmB,gBACnBC,kBAAmB,kBACnBC,kBAAmB,QACnBC,kBAAmB,QACnBC,kBAAmB,mBACnBC,kBAAmB,SACnBC,kBAAmB,cACnBC,kBAAmB,UACnBC,kBAAmB,aACnBC,kBAAmB,QACnBC,kBAAmB,yBACnBC,kBAAmB,OACnBC,kBAAmB,OACnBC,kBAAmB,OACnBC,kBAAmB,eACnBC,kBAAmB,YACnBC,kBAAmB,UACnBC,kBAAmB,aACnBC,kBAAmB,0BACnBC,kBAAmB,uDACnBC,kBAAmB,IACnBC,kBAAmB,mCACnBC,kBAAmB,gCACnBC,kBAAmB,8BACnBC,kBAAmB,OACnBC,kBAAmB,oBACnBC,kBAAmB,OLPnBK,GMvBqB,CACrBlC,kBAAmB,aACnBC,kBAAmB,IACnBC,kBAAmB,gBACnBC,kBAAmB,mBACnBC,kBAAmB,8BACnBC,kBAAmB,OACnBC,kBAAmB,MACnBC,kBAAmB,WACnBC,kBAAmB,WACnBC,kBAAmB,KACnBC,kBAAmB,SACnBC,kBAAmB,kBACnBC,kBAAmB,SACnBC,kBAAmB,kBACnBC,kBAAmB,QACnBC,kBAAmB,QACnBC,kBAAmB,MACnBC,kBAAmB,eACnBC,kBAAmB,QACnBC,kBAAmB,OACnBC,kBAAmB,QACnBC,kBAAmB,gBACnBC,kBAAmB,0CACnBC,kBAAmB,KACnBC,kBAAmB,oBACnBC,kBAAmB,qBACnBC,kBAAmB,oBACnBC,kBAAmB,OACnBC,kBAAmB,gBACnBC,kBAAmB,SNNnBM,GOxBqB,CACrBnC,kBAAmB,UACnBC,kBAAmB,IACnBC,kBAAmB,YACnBC,kBAAmB,eACnBC,kBAAmB,qBACnBC,kBAAmB,QACnBC,kBAAmB,QACnBC,kBAAmB,iBACnBC,kBAAmB,QACnBC,kBAAmB,WACnBC,kBAAmB,SACnBC,kBAAmB,cACnBC,kBAAmB,QACnBC,kBAAmB,eACnBC,kBAAmB,UACnBC,kBAAmB,QACnBC,kBAAmB,OACnBC,kBAAmB,cACnBC,kBAAmB,aACnBC,kBAAmB,aACnBC,kBAAmB,QACnBC,kBAAmB,iBACnBC,kBAAmB,8CACnBC,kBAAmB,SACnBC,kBAAmB,iCACnBC,kBAAmB,4BACnBC,kBAAmB,4BACnBC,kBAAmB,UACnBC,kBAAmB,oBACnBC,kBAAmB,YPLnBO,GQzBqB,CACrBpC,kBAAmB,OACnBC,kBAAmB,IACnBC,kBAAmB,gBACnBC,kBAAmB,mBACnBC,kBAAmB,mBACnBC,kBAAmB,OACnBC,kBAAmB,MACnBC,kBAAmB,kBACnBC,kBAAmB,SACnBC,kBAAmB,OACnBC,kBAAmB,YACnBC,kBAAmB,eACnBC,kBAAmB,SACnBC,kBAAmB,kBACnBC,kBAAmB,OACnBC,kBAAmB,OACnBC,kBAAmB,SACnBC,kBAAmB,gBACnBC,kBAAmB,aACnBC,kBAAmB,aACnBC,kBAAmB,SACnBC,kBAAmB,wBACnBC,kBAAmB,6CACnBC,kBAAmB,IACnBC,kBAAmB,mCACnBC,kBAAmB,2BACnBC,kBAAmB,2BACnBC,kBAAmB,QACnBC,kBAAmB,mBACnBC,kBAAmB,SRJnBQ,GS1BqB,CACrBrC,kBAAmB,KACnBC,kBAAmB,IACnBC,kBAAmB,KACnBC,kBAAmB,OACnBC,kBAAmB,aACnBC,kBAAmB,IACnBC,kBAAmB,KACnBC,kBAAmB,KACnBC,kBAAmB,MACnBC,kBAAmB,KACnBC,kBAAmB,IACnBC,kBAAmB,SACnBC,kBAAmB,OACnBC,kBAAmB,QACnBC,kBAAmB,KACnBC,kBAAmB,IACnBC,kBAAmB,IACnBC,kBAAmB,OACnBC,kBAAmB,KACnBC,kBAAmB,KACnBC,kBAAmB,IACnBC,kBAAmB,YACnBC,kBAAmB,wBACnBC,kBAAmB,KACnBC,kBAAmB,WACnBC,kBAAmB,SACnBC,kBAAmB,SACnBC,kBAAmB,MACnBC,kBAAmB,UACnBC,kBAAmB,MTHnBS,GU3BqB,CACrBtC,kBAAmB,KACnBC,kBAAmB,IACnBC,kBAAmB,OACnBC,kBAAmB,QACnBC,kBAAmB,YACnBC,kBAAmB,IACnBC,kBAAmB,KACnBC,kBAAmB,KACnBC,kBAAmB,KACnBC,kBAAmB,KACnBC,kBAAmB,IACnBC,kBAAmB,QACnBC,kBAAmB,KACnBC,kBAAmB,QACnBC,kBAAmB,KACnBC,kBAAmB,IACnBC,kBAAmB,IACnBC,kBAAmB,QACnBC,kBAAmB,KACnBC,kBAAmB,KACnBC,kBAAmB,KACnBC,kBAAmB,UACnBC,kBAAmB,8BACnBC,kBAAmB,KACnBC,kBAAmB,WACnBC,kBAAmB,UACnBC,kBAAmB,UACnBC,kBAAmB,MACnBC,kBAAmB,SACnBC,kBAAmB,MVFnBU,GW5BqB,CACrBvC,kBAAmB,WACnBC,kBAAmB,IACnBC,kBAAmB,gBACnBC,kBAAmB,cACnBC,kBAAmB,qBACnBC,kBAAmB,OACnBC,kBAAmB,OACnBC,kBAAmB,WACnBC,kBAAmB,UACnBC,kBAAmB,UACnBC,kBAAmB,OACnBC,kBAAmB,aACnBC,kBAAmB,QACnBC,kBAAmB,oBACnBC,kBAAmB,QACnBC,kBAAmB,QACnBC,kBAAmB,MACnBC,kBAAmB,YACnBC,kBAAmB,SACnBC,kBAAmB,WACnBC,kBAAmB,cACnBC,kBAAmB,oBACnBC,kBAAmB,+CACnBC,kBAAmB,MACnBC,kBAAmB,wBACnBC,kBAAmB,sBACnBC,kBAAmB,qBACnBC,kBAAmB,OACnBC,kBAAmB,iBACnBC,kBAAmB,YXDnBW,GY7BqB,CACrBxC,kBAAmB,UACnBC,kBAAmB,IACnBC,kBAAmB,kBACnBC,kBAAmB,cACnBC,kBAAmB,qBACnBC,kBAAmB,MACnBC,kBAAmB,OACnBC,kBAAmB,aACnBC,kBAAmB,UACnBC,kBAAmB,OACnBC,kBAAmB,UACnBC,kBAAmB,cACnBC,kBAAmB,QACnBC,kBAAmB,uBACnBC,kBAAmB,OACnBC,kBAAmB,UACnBC,kBAAmB,QACnBC,kBAAmB,aACnBC,kBAAmB,YACnBC,kBAAmB,WACnBC,kBAAmB,WACnBC,kBAAmB,wBACnBC,kBAAmB,oDACnBC,kBAAmB,KACnBC,kBAAmB,6BACnBC,kBAAmB,yBACnBC,kBAAmB,uBACnBC,kBAAmB,SACnBC,kBAAmB,mBACnBC,kBAAmB,SZAnBY,Ga9BqB,CACrBzC,kBAAmB,QACnBC,kBAAmB,IACnBC,kBAAmB,YACnBC,kBAAmB,eACnBC,kBAAmB,oBACnBC,kBAAmB,MACnBC,kBAAmB,OACnBC,kBAAmB,aACnBC,kBAAmB,SACnBC,kBAAmB,OACnBC,kBAAmB,SACnBC,kBAAmB,aACnBC,kBAAmB,SACnBC,kBAAmB,qBACnBC,kBAAmB,OACnBC,kBAAmB,MACnBC,kBAAmB,MACnBC,kBAAmB,cACnBC,kBAAmB,WACnBC,kBAAmB,UACnBC,kBAAmB,UACnBC,kBAAmB,uBACnBC,kBAAmB,gDACnBC,kBAAmB,MACnBC,kBAAmB,oCACnBC,kBAAmB,0BACnBC,kBAAmB,2BACnBC,kBAAmB,OACnBC,kBAAmB,6BACnBC,kBAAmB,gBbCnBa,Gc/BqB,CACrB1C,kBAAmB,UACnBC,kBAAmB,IACnBC,kBAAmB,gBACnBC,kBAAmB,kBACnBC,kBAAmB,gBACnBC,kBAAmB,MACnBC,kBAAmB,QACnBC,kBAAmB,YACnBC,kBAAmB,UACnBC,kBAAmB,UACnBC,kBAAmB,SACnBC,kBAAmB,eACnBC,kBAAmB,WACnBC,kBAAmB,iBACnBC,kBAAmB,OACnBC,kBAAmB,QACnBC,kBAAmB,OACnBC,kBAAmB,cACnBC,kBAAmB,QACnBC,kBAAmB,SACnBC,kBAAmB,UACnBC,kBAAmB,oBACnBC,kBAAmB,gDACnBC,kBAAmB,KACnBC,kBAAmB,mCACnBC,kBAAmB,0BACnBC,kBAAmB,yBACnBC,kBAAmB,MACnBC,kBAAmB,gBACnBC,kBAAmB,OdEnBc,GehCqB,CACrB3C,kBAAmB,SACnBC,kBAAmB,IACnBC,kBAAmB,gBACnBC,kBAAmB,eACnBC,kBAAmB,iBACnBC,kBAAmB,KACnBC,kBAAmB,OACnBC,kBAAmB,UACnBC,kBAAmB,MACnBC,kBAAmB,SACnBC,kBAAmB,UACnBC,kBAAmB,YACnBC,kBAAmB,OACnBC,kBAAmB,oBACnBC,kBAAmB,SACnBC,kBAAmB,QACnBC,kBAAmB,MACnBC,kBAAmB,YACnBC,kBAAmB,WACnBC,kBAAmB,QACnBC,kBAAmB,UACnBC,kBAAmB,gBACnBC,kBAAmB,0CACnBC,kBAAmB,MACnBC,kBAAmB,2BACnBC,kBAAmB,kBACnBC,kBAAmB,eACnBC,kBAAmB,YACnBC,kBAAmB,eACnBC,kBAAmB,UfGnBe,GgBjCqB,CACrB5C,kBAAmB,SACnBC,kBAAmB,IACnBC,kBAAmB,QACnBC,kBAAmB,aACnBC,kBAAmB,wBACnBC,kBAAmB,MACnBC,kBAAmB,QACnBC,kBAAmB,UACnBC,kBAAmB,QACnBC,kBAAmB,QACnBC,kBAAmB,QACnBC,kBAAmB,YACnBC,kBAAmB,SACnBC,kBAAmB,qBACnBC,kBAAmB,QACnBC,kBAAmB,KACnBC,kBAAmB,MACnBC,kBAAmB,YACnBC,kBAAmB,SACnBC,kBAAmB,UACnBC,kBAAmB,WACnBC,kBAAmB,mBACnBC,kBAAmB,wDACnBC,kBAAmB,MACnBC,kBAAmB,qBACnBC,kBAAmB,wBACnBC,kBAAmB,yBACnBC,kBAAmB,aACnBC,kBAAmB,kBACnBC,kBAAmB,WhBInBgB,GiBlCqB,CACrB7C,kBAAmB,UACnBC,kBAAmB,IACnBC,kBAAmB,kBACnBC,kBAAmB,aACnBC,kBAAmB,gBACnBC,kBAAmB,MACnBC,kBAAmB,MACnBC,kBAAmB,aACnBC,kBAAmB,UACnBC,kBAAmB,WACnBC,kBAAmB,UACnBC,kBAAmB,YACnBC,kBAAmB,QACnBC,kBAAmB,eACnBC,kBAAmB,OACnBC,kBAAmB,SACnBC,kBAAmB,OACnBC,kBAAmB,WACnBC,kBAAmB,aACnBC,kBAAmB,YACnBC,kBAAmB,QACnBC,kBAAmB,kBACnBC,kBAAmB,mDACnBC,kBAAmB,KACnBC,kBAAmB,mCACnBC,kBAAmB,yBACnBC,kBAAmB,wBACnBC,kBAAmB,KACnBC,kBAAmB,qBACnBC,kBAAmB,YjBKnBiB,GkBnCqB,CACrB9C,kBAAmB,UACnBC,kBAAmB,IACnBC,kBAAmB,iBACnBC,kBAAmB,oBACnBC,kBAAmB,qBACnBC,kBAAmB,MACnBC,kBAAmB,YACnBC,kBAAmB,UACnBC,kBAAmB,OACnBC,kBAAmB,UACnBC,kBAAmB,OACnBC,kBAAmB,mBACnBC,kBAAmB,UACnBC,kBAAmB,mBACnBC,kBAAmB,OACnBC,kBAAmB,QACnBC,kBAAmB,OACnBC,kBAAmB,qBACnBC,kBAAmB,QACnBC,kBAAmB,MACnBC,kBAAmB,UACnBC,kBAAmB,eACnBC,kBAAmB,uCACnBC,kBAAmB,MACnBC,kBAAmB,gCACnBC,kBAAmB,yBACnBC,kBAAmB,0BACnBC,kBAAmB,OACnBC,kBAAmB,WACnBC,kBAAmB,OlBMnB,UmBpCqB,CACrB7B,kBAAmB,KACnBC,kBAAmB,IACnBC,kBAAmB,KACnBC,kBAAmB,MACnBC,kBAAmB,UACnBC,kBAAmB,IACnBC,kBAAmB,KACnBC,kBAAmB,KACnBC,kBAAmB,KACnBC,kBAAmB,KACnBC,kBAAmB,IACnBC,kBAAmB,MACnBC,kBAAmB,KACnBC,kBAAmB,OACnBC,kBAAmB,KACnBC,kBAAmB,IACnBC,kBAAmB,IACnBC,kBAAmB,MACnBC,kBAAmB,MACnBC,kBAAmB,MACnBC,kBAAmB,KACnBC,kBAAmB,OACnBC,kBAAmB,mBACnBC,kBAAmB,IACnBC,kBAAmB,SACnBC,kBAAmB,UACnBC,kBAAmB,UACnBC,kBAAmB,KACnBC,kBAAmB,OACnBC,kBAAmB,OnB6CjBkB,GAAqE,CACvE,CAAC,MAAO,oBAAqB,OAC7B,CAAC,OAAQ,oBAAqB,QAC9B,CAAC,QAAS,oBAAqB,SAC/B,CAAC,eAAgB,oBAAqB,iBACtC,CAAC,SAAU,oBAAqB,WAChC,CAAC,QAAS,oBAAqB,SAC/B,CAAC,UAAW,oBAAqB,YACjC,CAAC,YAAa,oBAAqB,cACnC,CAAC,SAAU,oBAAqB,WAChC,CAAC,eAAgB,oBAAqB,iBACtC,CAAC,cAAe,oBAAqB,iBACrC,CAAC,QAAS,oBAAqB,SAC/B,CAAC,OAAQ,oBAAqB,QAC9B,CAAC,OAAQ,oBAAqB,QAC9B,CAAC,QAAS,oBAAqB,SAC/B,CAAC,QAAS,oBAAqB,SAC/B,CAAC,eAAgB,oBAAqB,MACtC,CAAC,OAAQ,oBAAqB,QAC9B,CAAC,WAAY,oBAAqB,YAClC,CAAC,OAAQ,oBAAqB,QAC9B,CAAC,SAAU,oBAAqB,UAChC,CAAC,gBAAiB,oBAAqB,kBACvC,CAAC,cAAe,oBAAqB,wCACrC,CAAC,KAAM,oBAAqB,MAC5B,CAAC,kBAAmB,oBAAqB,0BACzC,CAAC,kBAAmB,oBAAqB,qBACzC,CAAC,gBAAiB,oBAAqB,mBACvC,CAAC,OAAQ,oBAAqB,QAC9B,CAAC,eAAgB,oBAAqB,iBACtC,CAAC,YAAa,oBAAqB,SAGjCC,sBAAmB3H,IAOlB,SAAS4H,GAAY9H,GACxB,IAAI+H,EAASF,GAAapH,IAAIT,GAC9B,GAAI+H,EAAQ,OAAOA,EAEnB,MAAMC,EATV,SAA0BhI,GACtB,GAAe,OAAXA,EACJ,OAAO2E,GAAa3E,IAAW2E,GAAa3E,EAAOiI,MAAM,KAAK,GAClE,CAMsBC,CAAiBlI,GAC7BmI,EAAW,CAAA,EACjB,IAAA,MAAY5H,EAAK6H,EAAQC,KAAaT,GAClCO,EAAS5H,GAAOyH,IAAYI,IAAWC,EAI3C,OAFAN,EAAS1O,OAAOqH,OAAOyH,GACvBN,GAAa9G,IAAIf,EAAQ+H,GAClBA,CACX,sMoBvHA,IAAqBO,GAArB,cAAmChF,EAge/B,WAAA7M,GACIgC,QA5dJtB,KAAAoR,QAAU,GAMVpR,KAAAqR,gBAAiB,EAKjBrR,KAAAsR,QAA2C,WAG3CtR,KAAAuR,YAAuC,UAGvCvR,KAAAwR,WAAY,EAMZxR,KAAA6I,OAAS,KAQT7I,KAAQyR,YAAqE,CACzEC,EACAC,IACCD,EAAcC,EA2bf3R,KAAK4R,iBAAiB,QAAS5R,KAAK6R,oBACpC7R,KAAK4R,iBAAiB,UAAW5R,KAAK6R,oBACtC7R,KAAK4R,iBAAiB,QAAS5R,KAAK8R,aACxC,CApJQ,YAAAC,GACJ,OAAOzN,GAAMtE,KAAKgS,SACbC,KAAK5K,GAAEM,QAAS,IAAM3H,KAAKoR,SAC3B/I,UAAU,IAAM,GAAGrI,KAAKoR,YAAYpR,KAAKgS,UAClD,CAEQ,WAAAE,GACJ,MAAMC,EAAMxB,GAAY3Q,KAAK6I,QAE7B,GAAyB,cAArB7I,KAAKuR,YAA6B,CAElC,GAAIvR,KAAKqR,eACL,OAAO/E,CAAA,sBAA0B6F,EAAIC,gBAEzC,MAAMC,EAAarS,KAAKsS,iBAAiBtS,KAAKuS,MAC9C,OAAOF,EAAa/F,CAAA,sBAA0B+F,WAAsB/E,CACxE,CAEA,GAAqB,YAAjBtN,KAAKsR,QACL,OAAOhE,EAGX,GAAItN,KAAKqR,eACL,OAAO/E,CAAA,sBAA0B6F,EAAIC,gBAGzC,MAAMC,EAAarS,KAAKsS,iBAAiBtS,KAAKuS,MAC9C,OAAOF,EAAa/F,CAAA,sBAA0B+F,WAAsB/E,CACxE,CAEQ,cAAAkF,GACJ,MAAqB,SAAjBxS,KAAKsR,SAAsBtR,KAAKgS,QACzB1F,CAAA,yBAA6BtM,KAAKgS,iBAEtC1E,CACX,CAEQ,eAAAmF,GACJ,MAAqB,YAAjBzS,KAAKsR,YACLtR,KAAKqR,iBACe,aAAjBrR,KAAKsR,SAA2C,SAAjBtR,KAAKsR,SAC/C,CAEQ,aAAAoB,GACJ,MAAMP,EAAMxB,GAAY3Q,KAAK6I,QACvB8J,EAAW3S,KAAKuS,KAChB,GAAGzH,GAAoB9K,KAAKuS,KAAKK,MAAM7H,KAAM/K,KAAKuS,KAAKK,MAAM5H,OAAQhL,KAAK6I,WAAWsJ,EAAIU,MAAM/H,GAAoB9K,KAAKuS,KAAKO,IAAI/H,KAAM/K,KAAKuS,KAAKO,IAAI9H,OAAQhL,KAAK6I,UAClKsJ,EAAIC,OAEJW,EAAc/S,KAAKgS,QAAU,KAAKhS,KAAKgS,UAAY,GAEzD,MAAO,GAAGG,EAAIa,kBAAkBhT,KAAKoR,UAAU2B,MAAgBJ,MAAaR,EAAIc,aACpF,CAES,OAAAC,GAGAlT,KAAKwR,YACNxR,KAAKmT,SAAWnT,KAAKoT,eAAeD,UAAY,EAChDnT,KAAKqT,aAAa,OAAQ,UAC1BrT,KAAKqT,aAAa,aAAcrT,KAAKoT,eAAeE,WAAatT,KAAK0S,iBACtE1S,KAAKqT,aAAa,gBAAiBrT,KAAKuT,aAAe,OAAS,SAExE,CAES,MAAA9R,GACL,MAAM+R,EAAY,QAAQxT,KAAKsR,UAE/B,GAAyB,cAArBtR,KAAKuR,YAA6B,CAClC,MAAMkC,EAAazT,KAAKqR,eACxB,OAAO/E,CAAA;;4BAESkH;4BACAxT,KAAK+R;wCACO/R,KAAKgS,SAAW;qCACnBhS,KAAK0T;yCACDD;;sBAGhBA,EAIK,GAHAnH,CAAA;;;0CAKYtM,KAAKoR;sBACzBpR,KAAKkS;;aAGnB,CAGA,OAAIlS,KAAKwR,UACElF,CAAA;;4BAESkH;;;;0DAI8BxT,KAAKoR;0BACrCpR,KAAKkS;;;cAMhB5F,CAAA;;wBAESkH;wBACAxT,KAAK+R;oCACO/R,KAAKgS,SAAW;iCACnBhS,KAAK0T;;sCAEA1T,KAAKoR;kBACzBpR,KAAKyS,kBAAoBzS,KAAKkS,cAAgB5E;kBAC9CtN,KAAKwS;;SAGnB,CAEQ,gBAAAF,CAAiBC,GACrB,IAAKA,EACD,OAAOjF,EAGX,MACMqG,EAAa,CAACpB,EAAKK,MAAM7H,KAAMwH,EAAKK,MAAM5H,OAAQuH,EAAKO,IAAI/H,KAAMwH,EAAKO,IAAI9H,QAIhF,OAD8B,KAA1B2I,EAJc,IAIkBA,EAAWzO,OAAOlF,KAAKyR,YAAa,GAAK,IAAO,EAEzEd,GAAY3Q,KAAK6I,QAAQuJ,OzBlWrC,SACHwB,EACAC,EACAC,EACAC,EACAlL,EAAS,MAIT,MAAO,GAFOiC,GAAoB8I,EAAWC,EAAahL,QAC9CiC,GAAoBgJ,EAASC,EAAWlL,IAExD,CyB2VemL,CACHzB,EAAKK,MAAM7H,KACXwH,EAAKK,MAAM5H,OACXuH,EAAKO,IAAI/H,KACTwH,EAAKO,IAAI9H,OACThL,KAAK6I,OAEb,CAYO,cAAAoL,GACHjU,KAAKuT,cAAe,CACxB,CAEQ,YAAAzB,CAAaoC,GAGjB,MAAMC,EAAsB,IAAIC,YAAY,yBAA0B,CAClEC,OAAQ,CAAEC,YAAatU,MACvBuU,SAAS,EACTC,UAAU,IAEdxU,KAAKyU,cAAcN,EACvB,CAEQ,kBAAAtC,CAAmBhS,GACvB,KAAIA,aAAa6U,eAA2B,UAAV7U,EAAEuJ,KAA6B,MAAVvJ,EAAEuJ,MAGzDvJ,EAAE8U,iBACF9U,EAAE+U,kBAEG5U,KAAKuT,eAAc,CAGpB,GAFAvT,KAAKuT,cAAe,GAEfvT,KAAKmK,KACN,OAIJ,MAAMgI,EAAMxB,GAAY3Q,KAAK6I,QACvBgM,EAAe,CACjBzD,QAASpR,KAAKoR,SAAWe,EAAI2C,QAC7B9C,QAAShS,KAAKgS,SAAWG,EAAI4C,UAC7BxC,KAAMvS,KAAKuS,KACXyC,YAAahV,KAAKuS,KAAQvS,KAAKsS,iBAAiBtS,KAAKuS,MAAmBJ,EAAI8C,OAC5E9K,KAAMnK,KAAKmK,MAAMyI,MACjBsC,WAAYlV,KAAKmV,yBAGfC,EAAgB,IAAIhB,YAAY,YAAa,CAC/CC,OAAQQ,EACRN,SAAS,EACTC,UAAU,IAGdxU,KAAKyU,cAAcW,GAGnB,MAAMC,EAAkB,KACpBrV,KAAKuT,cAAe,EACpBvT,KAAKsV,oBAAoB,aAAcD,IAE3CrV,KAAK4R,iBAAiB,aAAcyD,EACxC,CACJ,GAjiBiBlE,GAyCD3E,OAASC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAvCzBC,GAAA,CADCC,EAAS,CAAE4I,WAAW,KADNpE,GAEjBnN,UAAA,OAAA,GAGA0I,GAAA,CADCC,KAJgBwE,GAKjBnN,UAAA,UAAA,GAGA0I,GAAA,CADCC,KAPgBwE,GAQjBnN,UAAA,UAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMzI,WAVDgN,GAWjBnN,UAAA,iBAAA,GAE4B0I,GAAA,CAA3BC,EAAS,CAAEC,KAAM1K,UAbDiP,GAaWnN,UAAA,OAAA,GAG5B0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,OAAQ2I,SAAS,EAAMD,UAAW,kBAfnCpE,GAgBjBnN,UAAA,UAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,OAAQ2I,SAAS,EAAMD,UAAW,uBAlBnCpE,GAmBjBnN,UAAA,cAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMzI,QAASqR,SAAS,EAAMD,UAAW,qBArBpCpE,GAsBjBnN,UAAA,YAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAM1K,OAAQqT,WAAW,KAxBpBpE,GAyBjBnN,UAAA,gBAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,UA3BDsE,GA4BjBnN,UAAA,SAAA,GAGA0I,GAAA,CADCvE,KA9BgBgJ,GA+BjBnN,UAAA,eAAA,GAGA0I,GAAA,CADCvE,KAjCgBgJ,GAkCjBnN,UAAA,YAAA,GAlCiBmN,GAArBzE,GAAA,CADCI,EAAc,uBACMqE,yMCLrB,IAAqBsE,GAArB,cAAoCtJ,EAApC,WAAA7M,GAAAgC,SAAAC,WAQIvB,KAAA0V,SAAqB,QAMrB1V,KAAA6I,OAAS,IAAA,CA+HD,YAAA8M,CAAaxL,GACjB,MAAMyL,EAAKlM,EAASmM,WAAW,CAC3B3L,KAAMC,EAAKD,KACXf,MAAOgB,EAAKhB,MACZc,IAAKE,EAAKF,MAGd,MAAO,CACH6L,WAAYF,EAAGE,WACfC,SAAUH,EAAGG,SAErB,CAES,MAAAtU,GACL,MAAM0I,EAAOnK,KAAKsL,WACZ6G,EAAMxB,GAAY3Q,KAAK6I,QAE7B,OAAOyD,CAAA;;;8BAGetM,KAAKoR,SAAWe,EAAI6D;;yCAES,QAAlBhW,KAAK0V,SAAqB,UAAY;wCACvCvL,EAAKF;;2BAElBf,GAAkBiB,EAAKhB,MAAOnJ,KAAK6I;;yCAErBsB,EAAKD;;yCAEa,SAAlBlK,KAAK0V,SAAsB,UAAY;;2BAErDvD,EAAI8D;0BACLjW,KAAK2V,aAAaxL,GAAM2L;;;2BAGvB5M,GAAkBiB,EAAKhB,MAAOnJ,KAAK6I;;;2BAGnC7I,KAAK2V,aAAaxL,GAAM4L;;;yCAGQ,UAAlB/V,KAAK0V,SAAuB,UAAY;;2BAEtDxM,GAAkBiB,EAAKhB,MAAOnJ,KAAK6I;;yCAErBsB,EAAKD;;yCAEa,SAAlBlK,KAAK0V,SAAsB,UAAY;yCACvCvL,EAAKD;;;+CAGCiI,EAAI+D,wBAAwBlW,KAAKmW;;;mCAG3B,QAAlBnW,KAAK0V;mCACa,QAAlB1V,KAAK0V,SAAqB,OAAS;;;;sBAIhDvD,EAAIlI;;;;mCAI2B,SAAlBjK,KAAK0V;mCACa,SAAlB1V,KAAK0V,SAAsB,OAAS;;;;sBAIjDvD,EAAIiE;;;;mCAI2B,UAAlBpW,KAAK0V;mCACa,UAAlB1V,KAAK0V,SAAuB,OAAS;;;;sBAIlDvD,EAAIhJ;;;;mCAI2B,SAAlBnJ,KAAK0V;mCACa,SAAlB1V,KAAK0V,SAAsB,OAAS;;;;sBAIjDvD,EAAIjI;;;0CAGgBlK,KAAKqW;oEACqBlE,EAAImE;gEACRnE,EAAI/O;;4DAERpD,KAAKuW;sBAC3CpE,EAAIqE;;;eAItB,CAEQ,iBAAAD,CAAkB1W,GACtBA,EAAE+U,kBAEF,MAAM4B,qBAAYpM,KACZqM,EAAY,CACdxM,IAAKuM,EAAM5K,UACXzC,MAAOqN,EAAM3K,WAAa,EAC1B3B,KAAMsM,EAAM1K,eAGV4K,EAAQ,IAAItC,YAAY,YAAa,CACvCC,OAAQ,CAAElK,KAAMsM,GAChBlC,SAAS,EACTC,UAAU,IAEdxU,KAAKyU,cAAciC,EACvB,CAEQ,mBAAAL,CAAoBxW,GACxB,MAAML,EAASK,EAAEL,OACjB,KAAMA,aAAkBmX,mBACpB,OAGJ,MAAMC,EAAY/W,EAAEL,SAAWK,EAAEgX,cAAgB,YAAcrX,EAAOsX,KAChEJ,EAAQ,IAAItC,YAAY,aAAc,CACxCC,OAAQ,CAAEuC,aACVrC,SAAS,EACTC,UAAU,IAEdxU,KAAKyU,cAAciC,EACvB,CAEQ,mBAAAP,CAAoBtW,GACxB,MAAML,EAASK,EAAEL,OACjB,KAAMA,aAAkBuX,aACpB,OAGJ,MAAMC,EAAOnX,EAAEL,SAAWK,EAAEgX,cAAgB,YAAcrX,EAAOyX,QAAQC,QACnER,EAAQ,IAAItC,YAAY,aAAc,CACxCC,OAAQ,CAAE2C,QACVzC,SAAS,EACTC,UAAU,IAEdxU,KAAKyU,cAAciC,EACvB,GA/RiBjB,GAgBDjJ,OAASC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAdzBC,GAAA,CADCC,EAAS,CAAEC,KAAMC,UADD4I,GAEjBzR,UAAA,UAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAM1K,UAJDuT,GAKjBzR,UAAA,aAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,UAPD4I,GAQjBzR,UAAA,WAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAM1K,UAVDuT,GAWjBzR,UAAA,eAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,UAbD4I,GAcjBzR,UAAA,SAAA,GAdiByR,GAArB/I,GAAA,CADCI,EAAc,wBACM2I,ICTlB,IAAC0B,GAAE5X,GAAG2C,OAAOkV,YAAYlV,OAAOgB,QAAQ3D,GAAGmD,IAAI,EAAE7C,EAAEE,KAAK,CAACA,EAAEF,KAA6BwX,GAAG,CAACC,OAAO,SAASC,YAAY,cAAcC,SAAS,WAAWC,OAAO,SAASC,QAAQ,UAAUC,QAAQ,UAAUC,YAAY,SAASC,UAAU,YAAeV,GAAEE,IAAwGF,GAA3E,CAACW,OAAO,SAASC,OAAO,SAASC,QAAQ,UAAUlB,KAAK,iBAA8C,IAACmB,GAAG,CAACC,OAAO,QAAQC,WAAW,aAAaC,QAAQ,UAAUb,YAAY,cAAcc,aAAa,gBAAgBC,SAAS,WAAWC,eAAe,SAASC,eAAe,QAAQC,MAAM,UAAU7F,MAAM,UAAU8E,QAAQ,UAAUgB,IAAI,MAAMC,gBAAgB,SAASC,IAAI,MAAM9F,IAAI,QAAQ0E,SAAS,WAAWqB,IAAI,MAAMC,MAAM,QAAQC,UAAU,YAAYC,SAAS,WAAWC,SAAS,WAAWC,OAAO,SAASC,OAAO,SAASC,aAAa,gBAAgBvB,UAAU,WAAWwB,QAAQ,WAAclC,GAAEc,IAAqFd,GAAxD,CAACtH,GAAG,OAAOwI,aAAa,gBAAgBO,IAAI,UAA8LzB,GAAnJ,CAACkC,QAAQ,UAAUvC,KAAK,SAASwC,WAAW,eAAeC,SAAS,aAAaC,eAAe,QAAQhB,eAAe,QAAQ5F,MAAM,YAAsTuE,GAAzQ,CAACsC,MAAM,QAAQC,OAAO,SAASC,SAAS,WAAWC,QAAQ,UAAUC,WAAW,aAAaC,SAAS,WAAWC,SAAS,WAAWC,SAAS,WAAWC,UAAU,YAAYC,MAAM,QAAQC,UAAU,OAAOC,SAAS,WAAWC,MAAM,QAAQC,cAAc,SAA0iBnD,GAAhgB,CAACgB,WAAW,aAAaC,QAAQ,UAAUb,YAAY,cAAcc,aAAa,gBAAgBC,SAAS,WAAWC,eAAe,SAASC,eAAe,QAAQC,MAAM,UAAU7F,MAAM,UAAU8E,QAAQ,UAAUgB,IAAI,MAAME,IAAI,MAAMpB,SAAS,WAAWqB,IAAI,MAAMC,MAAM,QAAQC,UAAU,YAAYC,SAAS,WAAWC,SAAS,WAAWC,OAAO,SAASC,OAAO,SAASC,aAAa,gBAAgBvB,UAAU,WAAWwB,QAAQ,UAAUkB,UAAU,YAAYC,IAAI,MAAMC,gBAAgB,qBAAubtD,GAAjY,CAACgB,WAAW,aAAaC,QAAQ,UAAUb,YAAY,cAAcc,aAAa,gBAAgBE,eAAe,SAASC,eAAe,QAAQC,MAAM,UAAU7F,MAAM,UAAU8E,QAAQ,UAAUgB,IAAI,MAAME,IAAI,MAAMC,IAAI,MAAMC,MAAM,QAAQC,UAAU,YAAYE,SAAS,WAAWC,OAAO,SAASC,OAAO,SAASC,aAAa,gBAAgBvB,UAAU,WAAWwB,QAAQ,YAAmMlC,GAAtJ,CAACsB,MAAM,UAAU7F,MAAM,UAAU8F,IAAI,MAAME,IAAI,MAAMG,UAAU,YAAYlB,UAAU,WAAWwB,QAAQ,UAAUvG,IAAI,QAAQ4H,SAAS,aAA0C,IAA0RC,GAAG,OAEjyFzG,GAAG3U,GAAG,GAAGA,QAASqb,GAAE,CAACrb,EAAEM,EAAEE,IAAIA,EAAK,MAAHF,EAAQ,GAAGqU,GAAG,GAAG3U,KAAKQ,KAAKF,KAAKqU,GAAG,GAAG3U,KAAKM,KAAqDkG,GAAExG,IAAI,KAAKA,EAAE0C,OAAO,SAAS,GAAG1C,EAAEmD,IAAI7C,GAAG,GAAGA,EAAEuJ,OAAWvJ,EAAEiB,SAAS+Z,KAA/N,QAAolBvT,GAAE,CAAC/H,EAAEM,IAAIA,EAAE,WAAWN,KAAK,UAAUA,IAAQub,GAAE,CAACvb,EAAEM,KAAK,IAAIE,EAAEgG,GAAE,CAACxG,EAAEwb,KAAK,CAAC3R,IAAI,MAAMtI,MAAM,IAAIvB,EAAEwb,QAAQxb,EAAEyb,eAAe,CAAC5R,IAAI,iBAAiBtI,MAAMwG,GAAE/H,EAAEyb,eAAc,IAAKzb,EAAE0b,QAAQ,CAAC7R,IAAI,SAAStI,MAAMwG,GAAE/H,EAAE0b,QAAO,IAAK1b,EAAE2b,MAAM,CAAC9R,IAAI,OAAOtI,MAAMvB,EAAE2b,MAAM3b,EAAEuX,MAAM,CAAC1N,IAAI,KAAKtI,MAAMvB,EAAEuX,MAAMvX,EAAE4b,UAAU,CAAC/R,IAAI,WAAWtI,MAAMvB,EAAE4b,UAAU5b,EAAE6b,QAAQ,CAAChS,IAAI,UAAUtI,MAAMwG,GAAE/H,EAAE6b,QAAO,SAAc,IAAT7b,EAAE8b,QAAyB,IAAT9b,EAAE8b,OAAoB,IAAT9b,EAAE8b,OAAY,CAACjS,IAAI,OAAOtI,OAAe,IAATvB,EAAE8b,KAAU,OAAO,UAAUxX,OAAO7B,KAAKA,IAAI,OAAO4Y,GAAE/a,EAAEyH,GAAE/H,EAAE+b,OAAOvb,IAAQkI,GAAE1I,IAAI,GAA2D,IAAxD2C,OAAO+C,OAAO1F,GAAGsE,OAAO9D,GAAa,iBAAHA,GAAakC,OAAW,OAAO,IAAIpC,EAAE,GAAG,OAAON,EAAEgc,SAAS1b,GAAG,KAAKA,GAAG,SAAc,IAAVN,EAAEic,QAAiB3b,GAAG,GAAGN,EAAEic,eAAmB,IAATjc,EAAEkc,OAAgB5b,GAAG,GAAGN,EAAEkc,eAAoB,IAAVlc,EAAEmc,YAA4B,IAAZnc,EAAEoc,cAA8B,IAAZpc,EAAEqc,WAAoB/b,GAAG,SAAc,IAAVN,EAAEmc,QAAiB7b,GAAG,GAAGN,EAAEmc,mBAAUnc,EAAEoc,UAAmB9b,GAAG,GAAGN,EAAEoc,iBAAwB,IAAZpc,EAAEqc,UAAmB/b,GAAG,GAAGN,EAAEqc,aAAa/b,GAAuEgc,GAAG,KAAsEjG,kBAAGtS,OAAOY,IAAI,qBAAqB,SAAS+B,GAAE1G,EAAEM,GAAG,MAAiB,mBAAHN,EAAcA,EAAEM,GAAGN,GAAa,iBAAHA,GAAaqW,MAAMrW,EAAEA,EAAEqW,IAAI/V,GAAGN,aAAa6K,KAAK,IAAI7K,EAAED,YAAYO,GAAG,IAAIuK,KAAKvK,EAAE,CAAC,SAASM,GAAEZ,EAAEM,GAAG,OAAOoG,GAAEpG,GAAGN,EAAEA,EAAE,CAAC,SAASuc,GAAEvc,EAAEM,EAAEE,GAAG,IAAIiC,EAAE7B,GAAEZ,EAAK,MAAHQ,OAAQ,EAAOA,EAAEgc,IAAI,OAAOC,MAAMnc,GAAGoG,IAAM,MAAHlG,SAAeA,EAAEgc,KAAKxc,EAAE0c,MAAMpc,GAAGmC,EAAE2J,QAAQ3J,EAAE4J,UAAU/L,GAAGmC,EAAE,CAAC,SAASka,GAAG3c,EAAEM,EAAEE,GAAG,IAAIiC,EAAE7B,GAAEZ,OAAU,GAAa,GAAGyc,MAAMnc,GAAG,OAAOoG,GAAyB1G,EAAE0c,KAAK,IAAIpc,EAAE,OAAOmC,EAAE,IAAI9B,EAAE8B,EAAE4J,UAAUnM,EAAEwG,GAAyB1G,EAAEyC,EAAEma,WAA4D,OAAjD1c,EAAE2c,SAASpa,EAAE6J,WAAWhM,EAAE,EAAE,GAA4BK,GAAnBT,EAAEmM,UAAsBnM,GAAGuC,EAAEqa,YAAY5c,EAAEqM,cAAcrM,EAAEoM,WAAW3L,GAAG8B,EAAE,CAAC,SAASwF,GAAEjI,EAAEM,EAAEE,GAAG,OAAOkG,GAAyB1G,GAAGY,GAAEZ,GAAGM,EAAE,CAAC,SAASyc,GAAG/c,EAAEM,EAAEE,GAAG,OAAOyH,GAAEjI,EAAEM,EAAEgc,GAAK,CAAC,IAAIU,GAAG,GAAG,SAASC,KAAI,OAAOD,EAAE,CAAC,SAASE,GAAGld,EAAEM,GAAG,IAAImD,EAAE0Z,EAAE9W,EAAEN,EAAE,IAAIvF,EAAEyc,KAAIxa,GAAM,MAAHnC,OAAQ,EAAOA,EAAE8c,gBAAwE,OAAvDD,EAA+B,OAA5B1Z,EAAK,MAAHnD,SAAeA,EAAEgJ,aAAc,EAAO7F,EAAE4Z,cAAe,EAAOF,EAAEC,eAAe5c,EAAE4c,eAAwD,OAAxCrX,EAAgB,OAAbM,EAAE7F,EAAE8I,aAAc,EAAOjD,EAAEgX,cAAe,EAAOtX,EAAEqX,eAAe,EAAEzc,EAAEC,GAAEZ,EAAK,MAAHM,OAAQ,EAAOA,EAAEkc,IAAItc,EAAES,EAAEuL,SAAShJ,GAAGhD,EAAEuC,EAAE,EAAE,GAAGvC,EAAEuC,EAAE,OAAO9B,EAAEyL,QAAQzL,EAAE0L,UAAUnJ,GAAGvC,EAAE2c,SAAS,EAAE,EAAE,EAAE,GAAG3c,CAAC,CAAqe,SAAS4c,GAAGvd,EAAEM,EAAEE,GAAG,IAAIiC,EAAE7B,GAAEZ,OAAU,GAAa,OAAOyC,EAAE+a,QAAQ/a,EAAEma,UAAntD,IAA6tDtc,GAAMmC,CAAC,CAAC,SAASgb,GAAGzd,EAAEM,EAAEE,GAAG,OAAOyH,GAAEjI,EAAI,IAAFM,EAAQ,CAAC,SAASmG,GAAEzG,EAAEM,EAAEE,GAAG,OAAO+b,GAAEvc,EAAI,EAAFM,EAAIE,EAAE,CAAC,SAASkd,GAAG1d,EAAEM,EAAEE,GAAG,OAAOmc,GAAG3c,EAAI,GAAFM,EAAO,CAAC,SAASqd,GAAG3d,EAAEM,GAAG,IAAIE,GAAGI,GAAEZ,IAAIY,GAAEN,GAAG,OAAOE,EAAE,GAAE,EAAGA,EAAE,EAAE,EAAEA,CAAC,CAAC,SAASod,GAAG5d,GAAG,OAAOA,aAAa6K,MAAgB,iBAAH7K,GAAiD,kBAApC2C,OAAO8B,UAAUoZ,SAASpY,KAAKzF,EAAoB,CAAqtB,SAAS8d,GAAG9d,EAAEM,GAAG,IAAIE,EAAEI,GAAEZ,UAAuByC,EAAEjC,EAAE8L,WAAW,OAAO9L,EAAEsc,YAAYtc,EAAE+L,cAAc9J,EAAE,EAAE,GAAGjC,EAAE8c,SAAS,GAAG,GAAG,GAAG,KAAK9c,CAAC,CAAqK,SAASud,GAAG/d,EAAEM,GAAG,IAAIE,EAAEiC,GAArqD,SAAWzC,KAAKM,GAAG,IAAIE,EAAEkG,GAAEsX,KAAK,KAAQ1d,EAAE2d,KAAKxb,GAAa,iBAAHA,IAAc,OAAOnC,EAAE6C,IAAI3C,EAAE,CAAklDwI,CAAEhJ,EAAEM,EAAE+S,MAAM/S,EAAEiT,KAAK,MAAM,CAACF,MAAM7S,EAAE+S,IAAI9Q,EAAE,CAAsR,SAAS0E,GAAGnH,EAAEM,GAAG,IAAIE,EAAEI,GAAEZ,OAAU,GAAa,OAAOQ,EAAE4L,QAAQ,GAAG5L,EAAE8c,SAAS,EAAE,EAAE,EAAE,GAAG9c,CAAC,CAAowB,SAAS0d,GAAGle,EAAEM,GAAG,IAAImD,EAAE0Z,EAAE9W,EAAEN,EAAE,IAAIvF,EAAEyc,KAAIxa,GAAM,MAAHnC,OAAQ,EAAOA,EAAE6d,yBAAiF,OAAvDhB,EAA+B,OAA5B1Z,EAAK,MAAHnD,OAAQ,EAAOA,EAAEgJ,aAAc,EAAO7F,EAAE4Z,cAAe,EAAOF,EAAEgB,wBAAwB3d,EAAE2d,wBAAiE,OAAxCpY,EAAgB,OAAbM,EAAE7F,EAAE8I,aAAc,EAAOjD,EAAEgX,cAAe,EAAOtX,EAAEoY,wBAAwB,EAAExd,EAArzB,SAAYX,EAAEM,GAAG,IAAIyF,EAAEjF,EAAEsd,EAAEhY,EAAE,IAAI5F,EAAEI,GAAEZ,EAAK,MAAHM,OAAQ,EAAOA,EAAEkc,IAAI/Z,EAAEjC,EAAE+L,cAAc5L,EAAEsc,KAAI/c,GAAM,MAAHI,OAAQ,EAAOA,EAAE6d,yBAAiF,OAAvDrd,EAA+B,OAA5BiF,EAAK,MAAHzF,OAAQ,EAAOA,EAAEgJ,aAAc,EAAOvD,EAAEsX,cAAe,EAAOvc,EAAEqd,wBAAwBxd,EAAEwd,wBAAiE,OAAxC/X,EAAgB,OAAbgY,EAAEzd,EAAE2I,aAAc,EAAO8U,EAAEf,cAAe,EAAOjX,EAAE+X,wBAAwB,EAAEjb,EAAEwD,IAAM,MAAHpG,OAAQ,EAAOA,EAAEkc,KAAKxc,EAAE,GAAGkD,EAAE4Z,YAAYra,EAAE,EAAE,EAAEvC,GAAGgD,EAAEoa,SAAS,EAAE,EAAE,EAAE,GAAG,IAAI7Z,EAAEyZ,GAAGha,EAAE5C,GAAG6c,EAAEzW,IAAM,MAAHpG,OAAQ,EAAOA,EAAEkc,KAAKxc,EAAE,GAAGmd,EAAEL,YAAYra,EAAE,EAAEvC,GAAGid,EAAEG,SAAS,EAAE,EAAE,EAAE,GAAG,IAAIjX,EAAE6W,GAAGC,EAAE7c,GAAG,OAAOE,IAAIiD,EAAEhB,EAAE,GAAGjC,IAAI6F,EAAE5D,EAAEA,EAAE,CAAC,CAAgS4b,CAAGre,EAAEM,GAAGJ,EAAEwG,IAAM,MAAHpG,OAAQ,EAAOA,EAAEkc,KAAKxc,EAAE,GAAG,OAAOE,EAAE4c,YAAYnc,EAAE,EAAE8B,GAAGvC,EAAEod,SAAS,EAAE,EAAE,EAAE,GAAGJ,GAAGhd,EAAEI,EAAE,CAA+F,SAASge,GAAGte,EAAEM,GAAG,OAAOM,GAAEZ,OAAU,GAAakM,QAAQ,CAAC,SAASqS,GAAGve,EAAEM,GAAG,IAAIE,EAAEI,GAAEZ,OAAU,GAAayC,EAAEjC,EAAE+L,cAAc5L,EAAEH,EAAE8L,WAAWpM,EAAEwG,GAAElG,EAAE,GAAG,OAAON,EAAE4c,YAAYra,EAAE9B,EAAE,EAAE,GAAGT,EAAEod,SAAS,EAAE,EAAE,EAAE,GAAGpd,EAAEmM,SAAS,CAA2H,SAASmS,GAAGxe,EAAEM,GAAG,OAAOM,GAAEZ,OAAU,GAAasM,UAAU,CAA4I,SAASmS,GAAGze,EAAEM,EAAEE,GAAG,IAAIiC,EAAE7B,GAAEZ,EAAK,MAAHQ,OAAQ,EAAOA,EAAEgc,IAAI7b,EAAnqB,SAAYX,EAAEM,GAAG,IAAIE,EAAEI,GAAEZ,EAAK,MAAHM,OAAQ,EAAOA,EAAEkc,IAAI/Z,GAAGya,GAAG1c,EAAEF,IAAI4d,GAAG1d,EAAEF,GAAG,OAAOoe,KAAKC,MAAMlc,EAA5pJ,QAAkqJ,CAAC,CAAwkBmc,CAAGnc,EAAEjC,GAAGF,EAAE,OAAOmC,EAAE2J,QAAQ3J,EAAE4J,UAAY,EAAF1L,GAAKC,GAAE6B,EAAK,MAAHjC,OAAQ,EAAOA,EAAEgc,GAAG,CAAC,SAASqC,GAAG7e,EAAEM,EAAEE,GAAG,IAAIM,EAAEsd,EAAEhY,EAAE0Y,EAAE,IAAIrc,EAAEwa,KAAItc,GAAM,MAAHH,OAAQ,EAAOA,EAAE4c,gBAAwE,OAAvDgB,EAA+B,OAA5Btd,EAAK,MAAHN,OAAQ,EAAOA,EAAE8I,aAAc,EAAOxI,EAAEuc,cAAe,EAAOe,EAAEhB,eAAe3a,EAAE2a,eAAwD,OAAxC0B,EAAgB,OAAb1Y,EAAE3D,EAAE6G,aAAc,EAAOlD,EAAEiX,cAAe,EAAOyB,EAAE1B,eAAe,EAAEld,EAAEU,GAAEZ,EAAK,MAAHQ,OAAQ,EAAOA,EAAEgc,IAAItZ,EAAEhD,EAAEgM,SAAqB7F,EAAE,EAAE1F,EAAuC,OAAO4b,GAAErc,EAA5CI,EAAE,GAAGA,EAAE,EAAEA,GAAG4C,EAAEmD,GAAG,IAAlC/F,EAAE,EAAE,GAAG,EAAgC+F,GAAG,GAAGnD,EAAEmD,GAAG,EAAe7F,EAAE,CAAC,SAASue,GAAG/e,EAAEM,EAAEE,GAAG,IAAIiC,GAAG7B,GAAEZ,OAAU,IAAcW,EAAET,GAAG,EAAEU,GAAEN,EAAE+S,WAAc,IAAczS,GAAEN,EAAEiT,SAAY,IAAc7O,KAAK,CAACxB,EAAEO,IAAIP,EAAEO,GAAG,OAAOhB,GAAG9B,GAAG8B,GAAGvC,CAAC,CAAmnD,IAAI8e,GAAG,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAqFC,GAAG,CAACjf,EAAEM,SAAQ,IAAJA,GAAcN,GAAGM,EAAmqB4e,GAAG,CAAClf,EAAEM,EAAEE,EAAEiC,KAAK,IAAI9B,EAAEH,EAAE2C,IAAI,EAAEuH,IAAIxK,EAAEif,WAAWjc,MAAC,CAAMic,WAAWjc,EAAEwH,IAAIsU,GAAGI,QAAQlf,MAAM,MAAqB,WAAdF,EAAE4a,UAAqB5a,EAAE0a,WAAW1a,EAAEsa,WAAWha,EAAE6C,IAAIjD,GAAGA,EAAEoE,OAAOpB,GAAGvC,EAAEsd,KAAK,EAAEvT,IAAIjH,KAAKA,IAAI6a,GAAGpb,MAAMlD,EAAEya,SAASna,EAAE6C,IAAIjD,GAAGA,EAAEmf,QAAQnc,GAAGvC,EAAEwC,IAAI,EAAEuH,IAAIjH,KAAKob,GAAG3b,EAAEO,EAAE,CAAC2Z,aAAa3a,OAAOzC,EAAEqa,QAAQ/Z,EAAE6C,IAAIjD,GAAGA,EAAEmf,QAAQnc,GAAGvC,EAAE0e,QAAQ,EAAE3U,IAAIjH,EAAE0b,WAAWhC,KAAKmC,GAAGtX,GAAEb,GAAGjE,IAAI8E,GAAE8V,GAAG5a,IAAIO,EAAEhB,EAAE0a,MAAM7c,EAAE6C,IAAIjD,GAAGA,EAAEmf,QAAQnc,GAAGvC,EAAE0e,QAAQ,EAAE3U,IAAIjH,EAAE0b,WAAWhC,KAAKmC,GAAGtX,GAA/kK,SAAYhI,GAAK,IAAIQ,EAAEI,GAAEZ,OAAU,GAAa,OAAOQ,EAAEsc,YAAYtc,EAAE+L,cAAc,EAAE,GAAG/L,EAAE8c,SAAS,EAAE,EAAE,EAAE,GAAG9c,CAAC,CAAk+J+e,CAAGrc,IAAI8E,GAAntK,SAAYhI,GAAK,IAAIQ,EAAEI,GAAEZ,UAAuByC,EAAEjC,EAAE+L,cAAc,OAAO/L,EAAEsc,YAAYra,EAAE,EAAE,EAAE,GAAGjC,EAAE8c,SAAS,GAAG,GAAG,GAAG,KAAK9c,CAAC,CAA2lKgf,CAAGtc,IAAIO,EAAEhB,EAAE0a,MAAoB,YAAdnd,EAAE4a,UAAsB5a,EAAEsa,WAAWha,EAAE6C,IAAIjD,GAAGA,EAAEoE,OAAOpB,GAAGvC,EAAEsd,KAAK,EAAEvT,IAAIjH,KAAKA,IAAI6a,GAAGpb,MAAM5C,EAAE6C,IAAIjD,GAAGA,EAAEmf,QAAQnc,GAAGvC,EAAE0e,QAAQ,EAAE3U,IAAIjH,EAAE0b,WAAWhC,KAAKmC,GAAGtX,GAAEb,GAAGjE,IAAI8E,GAAE8V,GAAG5a,IAAIO,EAAEhB,EAAE0a,MAAoB,WAAdnd,EAAE4a,UAAqBta,EAAE6C,IAAIjD,GAAGA,EAAEmf,QAAQnc,GAAGvC,EAAEwC,IAAI,EAAEuH,IAAIjH,KAAKob,GAAG3b,EAAEO,EAAE,CAAC2Z,aAAa3a,OAAOnC,EAAE6C,IAAIjD,GAAGA,EAAEoE,OAAOpB,GAAGvC,EAAEsd,KAAK,EAAEvT,IAAIjH,KAAKA,IAAI6a,GAAGpb,OAAOoc,GAAG,CAACtf,EAAEM,EAAEE,EAAEiC,EAAE9B,KAAK,QAAO,IAAJA,EAAW,CAAC,KAAKA,EAAE,GAAG,CAAC,IAAIoF,EAAE8Y,GAAG7e,EAAEQ,EAAE,CAAC4c,aAAa3a,IAAU,OAAOgE,GAAEV,GAAGpF,GAAG,GAAG,GAAtBX,EAAE+F,EAAyB,EAAE,GAAG,CAAC,IAAItC,EAAEob,GAAGve,EAAEE,EAAE,CAAC4c,aAAa3a,IAAU,OAAOuF,GAAvqP,SAAYhI,GAAK,IAAIQ,EAAEI,GAAEZ,OAAU,GAAa,OAAOQ,EAAE8c,SAAS,EAAE,EAAE,EAAE,GAAG9c,CAAC,CAA6lPif,CAAloF,SAAYzf,EAAEM,EAAEE,GAAG,OAAOiG,GAAEzG,GAAGM,EAAEE,EAAE,CAAkmFwF,CAAGvC,IAAI9C,GAAG,GAAG,GAA7BL,EAAEmD,EAAgC,EAAE,KAAK,CAAC,OAA5kM,SAAYzD,GAAK,IAAIqT,MAAM7S,EAAE+S,IAAI9Q,GAAGsb,GAAW,EAAY/d,GAAGW,GAAGH,GAAGiC,EAAEvC,EAAES,GAAGH,GAAGiC,EAAES,EAAEvC,EAAE8B,EAAEjC,EAAE0C,EAAEoa,SAAS,EAAE,EAAE,EAAE,GAAG,IAAqEH,EAAE,GAAG,MAAMja,GAAGhD,GAAGid,EAAE3Z,KAAKkD,GAAElG,EAAE0C,IAAIA,EAAEkJ,QAAQlJ,EAAEmJ,UAAlF,GAA+FnJ,EAAEoa,SAAS,EAAE,EAAE,EAAE,GAAG,OAAO3c,EAAEwc,EAAEuC,UAAUvC,CAAC,CAA+zLwC,CAAG,CAACtM,MAAMrT,EAAEuT,IAAIjT,IAAI6C,IAAID,GAAG8E,GAAE9E,IAAIoB,OAAOpB,GAAG6b,GAAG7b,EAAE,CAACmQ,MAAMrT,EAAEuT,IAAIjT,KAAKgE,OAAOpB,GAAG1C,IAAI8d,GAAGpb,KAAK8E,GAAEhI,GAAGud,GAAGvd,GAAGA,EAAE4f,qBAAyBC,GAAG,CAAC7f,EAAEM,EAAEE,IAAkB,WAAdR,EAAE4a,WAAoC,YAAd5a,EAAE4a,WAAqC,WAAd5a,EAAE4a,WAAoC,UAAd5a,EAAE4a,UAAoBta,EAAE6C,IAAIV,GAAGA,EAAE4c,QAAQ1e,GAAGH,EAAE2C,IAAIjD,GAA9qG,SAAYF,EAAEM,GAAK,IAAImC,EAAE7B,GAAEZ,OAAU,GAAa,OAAOyC,EAAE6a,SAAShd,GAAGmC,CAAC,CAAymGqd,CAAGnf,EAAET,MAAMI,EAAE6C,IAAIV,GAAGA,EAAE6B,OAAO3D,GAAGH,EAAEuG,SAA5lJ,SAAY/G,GAAK,OAAOY,GAAEZ,OAAU,GAAa+f,UAAU,CAA0iJC,CAAGrf,MAAUsf,GAAG,CAACjgB,EAAEM,EAAEE,IAAkB,WAAdR,EAAE4a,WAAoC,YAAd5a,EAAE4a,WAAqC,WAAd5a,EAAE4a,WAAoC,UAAd5a,EAAE4a,WAAmC,WAAd5a,EAAE4a,UAAqBta,EAAE6C,IAAIV,GAAGA,EAAE4c,QAAQ1e,GAAGH,EAAE2C,IAAIjD,GAA/zG,SAAYF,EAAEM,GAAK,IAAImC,EAAE7B,GAAEZ,OAAU,GAAa,OAAOyC,EAAEyd,WAAW5f,GAAGmC,CAAC,CAAwvGsO,CAAGpQ,EAAET,MAAMI,EAAE6C,IAAIV,GAAGA,EAAE6B,OAAO3D,GAAGH,EAAEuG,SAA1vJ,SAAY/G,GAAK,OAAOY,GAAEZ,OAAU,GAAamgB,YAAY,CAAssJC,CAAGzf,MAAU0f,GAAG,CAACrgB,EAAEM,EAAEE,IAAkB,WAAdR,EAAE4a,UAAqBta,EAAE6C,IAAIV,GAAGA,EAAE4c,QAAQ1e,GAAGH,EAAE2C,IAAIjD,GAA72H,SAAYF,EAAEM,GAAK,IAAImC,EAAE7B,GAAEZ,OAAU,GAAaW,EAAE8B,EAAE8J,cAAcrM,EAAEuC,EAAE4J,UAAUnJ,EAAEwD,GAAyB1G,EAAE,GAAGkD,EAAE4Z,YAAYnc,EAAEL,EAAE,IAAI4C,EAAEoa,SAAS,EAAE,EAAE,EAAE,GAAG,IAAI7Z,EAAE8a,GAAGrb,GAAG,OAAOT,EAAEoa,SAASvc,EAAEoe,KAAK4B,IAAIpgB,EAAEuD,IAAIhB,CAAC,CAAoqH8d,CAAG5f,EAAET,MAAMI,EAAE6C,IAAIV,GAAGA,EAAE6B,OAAO3D,GAAGH,EAAEuG,SAASyX,GAAG7d,MAAUyP,GAAG,CAACpQ,EAAEM,EAAEE,IAAkB,WAAdR,EAAE4a,WAAoC,YAAd5a,EAAE4a,UAAsBta,EAAE6C,IAAIV,GAAGA,EAAE4c,QAAQ1e,IAAI,IAAIT,EAAEqe,GAAG5d,GAAG,OAAOH,EAAE2C,IAAID,GAAGA,EAAEhD,OAAE,EAA90H,SAAYF,EAAEM,GAAK,IAAImC,EAAE7B,GAAEZ,OAAU,GAAa,OAAOyC,EAAE2J,QAAQ9L,GAAGmC,CAAC,CAA8wH+d,CAAG7f,EAAEuC,IAAIoB,OAAOpB,KAAKA,MAAoB,WAAdlD,EAAE4a,UAAqBta,EAAEA,EAAE6C,IAAIV,GAAGA,EAAE6B,OAAO3D,GAAGH,EAAEuG,SAASyX,GAAG7d,MAAU8f,GAAG,CAACzgB,EAAEM,EAAEE,IAAkB,WAAdR,EAAE4a,WAAoC,YAAd5a,EAAE4a,WAAqC,WAAd5a,EAAE4a,WAAoC,UAAd5a,EAAE4a,WAAmC,WAAd5a,EAAE4a,WAAoC,aAAd5a,EAAE4a,UAAuBta,EAAE6C,IAAIV,GAAGA,EAAE4c,QAAQ1e,GAAGH,EAAE2C,IAAIjD,GAA7zH,SAAYF,EAAEM,GAAK,IAAImC,EAAE7B,GAAEZ,OAAU,GAAa,OAAOyC,EAAEie,WAAWpgB,GAAGmC,CAAC,CAAsvHke,CAAGhgB,EAAET,MAAMI,EAAE6C,IAAIV,GAAGA,EAAE6B,OAAO3D,GAAGH,EAAEuG,SAAzsK,SAAY/G,GAAG,OAAOY,GAAEZ,GAAG4gB,YAAY,CAA2qKC,CAAGlgB,MAAsVmgB,GAAG,CAAC9gB,EAAEM,EAAEE,IAAkB,WAAdR,EAAE4a,UAAqBta,EAAE6C,IAAIV,GAAGA,EAAE4c,QAAQ1e,GAAGH,EAAE2C,IAAIjD,GAA7+I,SAAYF,EAAEM,GAAK,IAAImC,EAAE7B,GAAEZ,OAAU,GAAa,OAAOyC,EAAEoa,SAAS,GAAGpa,EAAE2J,QAAQ9L,GAAGmC,CAAC,CAA25Ise,CAAGpgB,EAAET,MAAoB,YAAdF,EAAE4a,WAAqC,WAAd5a,EAAE4a,WAAoC,UAAd5a,EAAE4a,UAAoBta,EAAEA,EAAE6C,IAAIV,GAAGA,EAAE6B,OAAO3D,GAAGH,EAAEuG,SAAhrL,SAAY/G,GAAK,OAAOY,GAAEZ,OAAU,GAAauM,aAAa,CAA2nLyU,CAAGrgB,MAAUsgB,GAAG,CAACjhB,EAAEM,EAAEE,KAAK,IAAIiC,EAAEjC,EAAE,OAAOR,EAAEqa,UAAU5X,EAAE4d,GAAGrgB,EAAEyC,EAAEzC,EAAEqa,UAAUra,EAAEya,WAAWhY,EAAhX,EAACzC,EAAEM,EAAEE,EAAEiC,IAAkB,WAAdzC,EAAE4a,UAAqBta,EAAE6C,IAAIxC,GAAGA,EAAE0e,QAAQnf,GAAGM,EAAE2C,IAAID,GAAGub,GAAGve,EAAEgD,EAAE,CAACka,aAAa3a,OAAOnC,EAAqR4gB,CAAGlhB,EAAEyC,EAAEzC,EAAEya,SAASna,EAAE8c,eAAepd,EAAE0a,YAAYjY,EAAEqe,GAAG9gB,EAAEyC,EAAEzC,EAAE0a,YAAY1a,EAAEsa,aAAa7X,EAAE2N,GAAGpQ,EAAEyC,EAAEzC,EAAEsa,aAAata,EAAEka,QAAQzX,EAAEyc,GAAGlf,EAAEyC,EAAEzC,EAAEka,MAAM5Z,EAAE8c,eAAepd,EAAEma,SAAS1X,EAAEod,GAAG7f,EAAEyC,EAAEzC,EAAEma,SAASna,EAAEoa,WAAW3X,EAAEwd,GAAGjgB,EAAEyC,EAAEzC,EAAEoa,WAAWpa,EAAEua,WAAW9X,EAAEge,GAAGzgB,EAAEyC,EAAEzC,EAAEua,WAAWva,EAAEwa,WAAW/X,EAAr2B,EAACzC,EAAEM,EAAEE,IAAKR,EAAE0a,WAAY1a,EAAEya,UAAWza,EAAEsa,YAAata,EAAEqa,SAAUra,EAAEka,OAAQla,EAAEma,QAASna,EAAEoa,UAAWpa,EAAEua,SAAWja,EAAE6C,IAAIV,GAAGA,EAAEiC,KAAKiZ,IAAIrZ,OAAO,CAAC3D,EAAET,IAAIM,EAAEyF,KAAK/C,GAAGA,EAAE,EAAM,IAAJhD,GAASA,EAAEgD,IAAI,EAAM,IAAJhD,EAAMuC,EAAEC,OAAO,EAAEQ,IAAI,EAAEhD,GAAGuC,EAAEC,OAAO,EAAEQ,KAAK,KAA7G5C,EAA0vB6gB,CAAGnhB,EAAEyC,EAAEzC,EAAEwa,WAAW/X,EAAEU,IAAIjD,GAAGA,EAAEwE,KAAKiZ,IAAIrZ,OAAOpB,KAAK5C,EAAE8gB,WAAW1e,OAAO,GAAGpC,EAAE8gB,WAAWnb,KAAKxC,GAA/jM,SAAYzD,EAAEM,GAAG,OAAOM,GAAEZ,KAAKY,GAAEN,EAAE,CAA+hM+gB,CAAG5d,EAAEP,MAAM6b,GAAG7b,EAAE,CAACmQ,MAAM/S,EAAE+S,MAAME,IAAIjT,EAAEiT,UAAmB+N,GAAG,CAACthB,EAAEM,KAAK,IAAI+F,EAAE,IAAI7F,EAAEF,EAAE+S,MAAM5Q,GAAgB,OAAZ4D,EAAErG,EAAE8a,YAAa,EAAOzU,EAAEuE,QAAW,MAAHtK,SAAeA,EAAEiT,MAAMmK,GAAGld,EAAjG,GAAuGG,EAAEL,EAAE8gB,YAAY,GAAGlhB,GAAGF,EAAE+a,cAAciE,GAAGI,QAAQpf,EAAE+a,eAAe,GAAG,EAAE7X,EAAE,CAAC,CAAC1C,IAA13H,EAACR,GAAGqT,MAAM/S,EAAEiT,IAAI/S,GAAGiC,KAAK,GAAGwc,GAAGxc,EAAEC,OAAO1C,EAAE2a,OAAO,OAAO,IAAIha,EAAEX,EAAE4a,UAAU1a,EAAEF,EAAE6a,UAAU,EAAE,IAAIla,EAAE,OAAO,IAAIuC,EAAE5C,EAAE,GAAO,aAAJK,EAAuF,GAAO,aAAJA,EAAuF,GAAO,WAAJA,EAAqF,GAAO,UAAJA,EAAmF,GAAO,WAAJA,EAAoF,GAAO,YAAJA,EAAsD,GAAO,WAAJA,QAAc,KAAKuC,EAAE1C,GAAG0C,EAAEwa,GAAGxa,EAAEhD,GAAGuC,EAAEe,KAAK,CAACN,SAApF,KAAKA,EAAE1C,GAAG0C,EAAEyZ,GAAGzZ,EAAEhD,GAAGuC,EAAEe,KAAK,CAACN,SAApH,KAAKA,EAAE1C,GAAG,CAAC,GAAGye,GAAGxc,EAAEC,OAAO1C,EAAE2a,OAAO,OAAOzX,EAAEuD,GAAEvD,EAAEhD,GAAGuC,EAAEe,KAAK,CAACN,GAAG,MAArJ,KAAKA,EAAE1C,GAAG,CAAC,GAAGye,GAAGxc,EAAEC,OAAO1C,EAAE2a,OAAO,OAAOzX,EAAEqZ,GAAErZ,EAAEhD,GAAGuC,EAAEe,KAAK,CAACN,GAAG,MAArJ,KAAKA,EAAE1C,GAAG,CAAC,GAAGye,GAAGxc,EAAEC,OAAO1C,EAAE2a,OAAO,OAAOzX,EAAE6Z,GAAG7Z,EAAEhD,GAAGuC,EAAEe,KAAK,CAACN,GAAG,MAAvJ,KAAKA,EAAE1C,GAAG,CAAC,GAAGye,GAAGxc,EAAEC,OAAO1C,EAAE2a,OAAO,OAAOzX,EAAEqa,GAAGra,EAAEhD,GAAGuC,EAAEe,KAAK,CAACN,GAAG,MAAzJ,KAAKA,EAAE1C,GAAG,CAAC,GAAGye,GAAGxc,EAAEC,OAAO1C,EAAE2a,OAAO,OAAOzX,EAAEua,GAAGva,EAAEhD,GAAGuC,EAAEe,KAAK,CAACN,GAAG,GAA8rHqe,CAAGvhB,EAAE,CAACqT,MAAM7S,EAAE+S,IAAI9Q,GAAGS,GAAG,IAAIO,EAAEwd,GAAGjhB,EAAE,CAACqT,MAAM7S,EAAE+S,IAAI9Q,EAAE2e,WAAWzgB,EAAEyc,aAAald,GAAGgD,GAAG,OAAOlD,EAAE2a,MAAMlX,EAAE+d,OAAOC,OAAO,EAAEzhB,EAAE2a,OAAOlX,EAAE+d,QAAuLE,GAAG1hB,IAAI,IAAIM,EAAS,MAAPN,EAAE,GAAS,GAAE,EAAkG,OAAsB,KAAN,IAAN,GAAvGwH,OAAOxH,EAAE8D,MAAM,EAAE,KAAM9D,EAAE0C,OAAO,EAAE8E,OAAOxH,EAAE8D,MAAM,EAAE,IAAI,KAAI9D,EAAE0C,OAAO,EAAE8E,OAAOxH,EAAE8D,MAAM,EAAE,IAAI,IAA4BxD,GAAwMqhB,GAAG,CAAC3hB,EAAEM,EAAEE,KAAK,IAAIiC,EAAK,MAAHjC,OAAQ,EAAOA,EAAEyd,KAAK/d,GAAGA,EAAEoQ,KAAKhQ,GAAG,GAAGmC,EAAE,CAAC,IAAIvC,EAAtkB,EAACF,EAAEM,IAAIA,EAAE+e,QAAQ7e,IAAIA,EAAEyY,gBAAgBzY,EAAEyY,eAAe6B,OAAOta,EAAEyY,eAAe6B,MAAMlQ,KAAK5K,EAAEQ,EAAE8gB,GAAG9gB,EAAEyY,eAAe,CAAC5F,MAAM7S,EAAE6S,MAAME,IAAIvT,IAAImD,IAAIxC,QAAQH,EAAE6S,MAAM1S,MAA0aihB,CAAG5hB,EAAEyC,EAAEof,OAAOnd,KAAK,CAACyY,EAAE9W,IAAIsX,GAAGR,EAAE9J,MAAMhN,EAAEgN,QAAQ,IAAA,IAAQ8J,EAAE,EAAEA,EAAEjd,EAAEwC,OAAOya,GAAG,EAAE,GAAGnd,EAAEE,EAAEid,GAAG9J,MAAM,CAAC,IAAIhN,EAAEnG,EAAEid,EAAE,GAAGjd,EAAEid,EAAE,GAAGnD,SAAS9Z,EAAEid,GAAGpD,WAAWhU,EAAEM,EAAE3D,OAAO,EAAE2D,EAAEyb,UAAU,EAAE,GAAGzb,EAAE,MAAM,CAAC4F,OAAOlG,EAAEgc,aAAaL,GAAG3b,GAAG,CAAC,IAAI7C,EAAEhD,EAAEA,EAAEwC,OAAO,GAAGsX,SAASvW,EAAEP,EAAER,OAAO,EAAEQ,EAAE4e,UAAU,EAAE,GAAG5e,EAAE,MAAM,CAAC+I,OAAOxI,EAAEse,aAAaL,GAAGje,GAAG,CAAC,IAAI9C,EAAljB,EAACX,EAAEM,KAAK,IAAIE,EAAE,QAAQiC,EAAE,IAAIoI,KAAKvK,EAAE0hB,eAAexhB,EAAE,CAACyhB,SAAS,SAAS,IAAI,OAAO,IAAIpX,KAAKvK,EAAE0hB,eAAexhB,EAAE,CAACyhB,SAASjiB,KAAK4c,UAAUna,EAAEma,SAAS,CAAA,MAAO,OAAOtc,EAAEsc,UAAUna,EAAEma,SAAS,GAA6XsF,CAAG5hB,EAAEN,GAAG,IAAIwH,OAAOiV,MAAM9b,GAAG,CAAC,IAAIT,EAAES,EAAE,EAAEuC,EAAEwb,KAAKyD,IAAlsN,SAAYniB,GAAG,IAAIM,EAAEN,EAAEsc,GAAG,OAAOoC,KAAK0D,MAAM9hB,EAAE,CAAwpN+hB,CAAG1hB,IAAI8C,EAAEib,KAAKyD,IAArqN,SAAYniB,GAAG,IAAIM,EAAEN,EAAv2L,IAA42L,OAAO0e,KAAK0D,MAAM9hB,EAAE,CAA2nNgiB,CAAG3hB,IAAM,GAAFuC,EAAmG,MAAM,CAAC+I,OAAO,GAAG/L,EAAE,IAAI,MAA7F,IAAtBgD,EAAE2a,WAAWnb,OAAW,IAAIQ,IAAIA,EAAE2a,aAAmC,IAAtBpa,EAAEoa,WAAWnb,OAAW,IAAIe,IAAIA,EAAEoa,aAAgDkE,aAAaphB,EAAE,GAAO4hB,GAAGviB,IAAI,IAAI4d,GAAG5d,SAAS+C,MAAM,0BAA0B/C,KAAK,IAAIM,EAAEN,EAAEwiB,cAA4D,MAAM,GAAlDliB,EAAEwD,MAAM,EAAE,KAAKxD,EAAEwD,MAAM,EAAE,KAAKxD,EAAEwD,MAAM,EAAE,OAA0B2e,GAAEziB,IAAI,IAAI4d,GAAG5d,SAAS+C,MAAM,0BAA0B/C,KAAK,OAAO0iB,GAAG1iB,IAA4H0iB,GAAG,CAAC1iB,EAAEM,KAAK,IAAIE,EAAER,EAAEwiB,cAA+G,MAAM,GAArGhiB,EAAEsD,MAAM,EAAE,KAAKtD,EAAEsD,MAAM,EAAE,KAAKtD,EAAEsD,MAAM,EAAE,OAAMtD,EAAEsD,MAAM,GAAG,MAAMtD,EAAEsD,MAAM,GAAG,MAAMtD,EAAEsD,MAAM,GAAG,MAAsCxD,EAAE,GAAG,OAAgUqiB,GAAG3iB,GAAG2C,OAAOqC,KAAKhF,GAAsS4iB,GAAG5iB,IAAI,IAAIM,EAAE,KAAK,IAAA,IAAQE,KAAKR,EAAEQ,IAAIA,EAAEqiB,gBAAgBviB,GAAG,KAAKA,GAAGE,EAAEqiB,cAAc,OAAOviB,GAAmMwiB,GAAG,CAAC9iB,EAAEM,KAAK,IAAIE,EAAE,GAAGiC,EAAE,GAAG9B,EAAE,EAAE,IAAA,IAAQT,EAAE,EAAEA,EAAEF,EAAE0C,OAAOxC,IAAI,CAAC,IAAIgD,EAAElD,EAAEE,GAAGid,EAAM,OAAJja,EACjqf,EAAE,EAAEvC,EAAEwc,EAAE7c,GAAGE,EAAEgD,KAAgB,IAAXhD,EAAEkC,OAAWD,EAAE,IAAIA,KAAKA,EAAES,EAAEvC,EAAEwc,IAAI1a,GAAGS,EAAEvC,GAAGwc,EAAE,CAAC,OAAO1a,GAAGjC,EAAEgD,KAAgB,IAAXhD,EAAEkC,OAAWD,EAAE,IAAIA,KAAKjC,GAAOuiB,GAAE,CAAC/iB,EAAEM,KAAK,IAAIE,EAAEmiB,GAAG3iB,GAAGyC,EAAEnC,EAAE0iB,gBAAgBriB,EAAE8B,EAAEkgB,GAAGlgB,GAAG,GAAGvC,EAAEI,EAAE2iB,oBAAoB/f,EAAEhD,EAAEyiB,GAAGziB,GAAG,GAAGuD,EAAE,GAAG,OAAOA,GADlF,CAAAzD,GAAG2U,GAAG,SAAS3U,KACsEkjB,CAAG5iB,EAAE6iB,cAAc3iB,EAAEyE,QAAQkY,IAAI,GAAGxc,EAAEoG,SAASoW,IAAIja,EAAE6D,SAASoW,IAAQ,gBAAJA,EAAkB,OAAO,IAAI9W,EAAE/F,EAAE8iB,UAAUjG,GAAG,IAAI9W,EAAE,OAAO,IAAIN,EAAE/F,EAAEmd,GAAG,GAAM,MAAHpX,EAAQ,OAAO,IAAIjF,EAAER,EAAE+iB,eAAelG,GAAS1Z,GAAH3C,EAAMA,EAAE,CAACwiB,OAAOjd,EAAE9E,MAAMwE,EAAE8D,IAAIsT,IAAc9B,GAAEhV,EAAEiH,OAAOvH,MAAMtD,GAAG9B,GAAGA,EAAE+B,OAAO,GAAG/B,EAAEsE,QAAQkY,IAAI,IAAI9W,EAAErG,EAAEmd,IAAI9W,IAAIlC,MAAMC,QAAQiC,IAAe,IAAXA,EAAE3D,QAAY2D,EAAEpB,QAAQc,IAAI,IAAIjF,EAAE2B,EAAE0a,GAAGrc,IAAI2C,GAAG3C,EAAEiF,QAAQ7F,GAAGgD,GAAGA,EAAER,OAAO,GAAGQ,EAAE+B,QAAQkY,IAAI,IAAI9W,EAAEnG,EAAEid,GAAG,IAAI9W,EAAE,OAAO,IAAIN,EAAEzF,EAAE8iB,UAAUjG,GAAG,IAAIpX,EAAE,OAAO,IAAIjF,EAAEd,EAAEmd,IAAIrc,IAAIqD,MAAMC,QAAQtD,IAAe,IAAXA,EAAE4B,QAAY5B,EAAEmE,QAAQmZ,IAAI3a,GAAG4C,EAAE,CAACid,OAAOvd,EAAExE,MAAM6c,QAAQpe,EAAEujB,cAAc9f,GADsxc,EAACzD,EAAEM,KAAK,IAAIN,EAAE,MAAM,GAAG,IAAIQ,EAAE,GAAG,OAAOmC,OAAOgB,QAAQ3D,GAAGiF,QAAQ,EAAExC,EAAE9B,MAAM,IAAIT,EAAK,MAAHI,OAAQ,EAAOA,EAAEmC,GAAG,IAAIvC,EAA2C,YAAxCM,GAAG6a,GAAEuH,GAAGngB,GAAM,MAAH9B,OAAQ,EAAOA,EAAEkd,aAAmB,IAAI3a,EAAEhD,EAAEsjB,SAAS7iB,GAAGuC,IAAI1C,GAAG6a,GAAEnb,EAAEqX,KAAKrU,EAAE3B,MAAM2B,EAAEma,QAAQ7W,GAAE7D,OAAOgB,QAAQT,EAAEma,SAASla,IAAI,EAAEM,EAAE0Z,MAAC,CAAMtT,IAAIpG,EAAElC,MAAM4b,WAAM,MAAW3c,GAC5idijB,CAAGzjB,EAAEujB,YAAe,MAAHjjB,OAAQ,EAAOA,EAAEijB,cAAc9f,GADpqB,CAAAzD,GAAG2U,GAAG,OAAO3U,KAC0pB0jB,CAAGpjB,EAAE6iB,cAAiB,MAAH7iB,GAASA,EAAEqjB,gBAAgBlgB,EAD6md,CAAAzD,IAAI,IAAIM,EAAEN,EAAEuR,MAAM6J,IAAI5a,EAAE,GAAG,OAAOF,EAAE2E,QAAQxC,IAAxG,CAAAzC,IAAI,IAAIM,GAAGN,EAAE+E,MAAM,QAAQ,IAAIrC,OAAO,OAAO1C,EAAE0C,OAAOpC,GAAyDsjB,CAAGnhB,GAAG,GAAIjC,EAAEgD,KAAKf,GAAUqgB,GAAGrgB,EAAE,IAAIwC,QAAQtE,IAAIH,EAAEgD,KAAK7C,OAAOH,EAAE8a,KAFnuZ,SAG3/DuI,CAAGpgB,IAAQrD,GAAE,CAACJ,EAAEM,IAAI+a,GAAErb,EAAE0e,KAAK0D,MAAM9hB,GAAGud,YAAgBiG,GAAG,CAAC9jB,EAAEM,IAAIyiB,GAAE/iB,EAAE,CAACmjB,aAH2tD,SAG3sDC,UAAUtL,GAAGuL,eAAe,CAACjL,QAAQ,EAAE7W,MAAMf,KADixb,CAAAR,IAAI,IAAIQ,EAAEiC,EAAE,IAAInC,EAAEkG,GAAE,EAAiB,OAAdhG,EAAER,EAAEqd,cAAe,EAAO7c,EAAEujB,UAAU,CAACla,IAAI,UAAUtI,MAAMvB,EAAEqd,QAAQ0G,UAAUzf,OAAO3D,KAAKA,IAAI,MAAY,aAATX,EAAEqN,KAAyBgO,GAAE,UAAUoH,GAAe,OAAZhgB,EAAEzC,EAAEuB,YAAa,EAAOkB,EAAEmI,OAAmB,aAAT5K,EAAEqN,KAAyBgO,GAAE,UAAU3S,GAAE1I,EAAEuB,OAAOjB,QAArD,GACh9b0jB,CAAGxjB,GAAGyX,SAAS,EAAEqL,OAAO9iB,EAAEe,MAAMkB,KAAK4Y,GAAE7a,EAAEkI,GAAEjG,IAAIyV,OAAO,EAAEoL,OAAO9iB,EAAEe,MAAMkB,KAAKrC,GAAEI,EAAEiC,IAAIwgB,oBAAoB,CAAC3K,UAAU,EAAE/W,MAAMf,KAAK+a,GAAE/a,EAAE,YAAY6X,YAAY,EAAE9W,MAAMf,KADr5B,CAAAR,IAAI,GAAY,QAATA,EAAEqN,KAAa,CAAC,IAAI/M,EAAEkG,GAAE,CAACxG,EAAEikB,YAAY,CAACpa,IAAI,UAAUtI,MAAMvB,EAAEikB,aAAa3f,OAAO9D,KAAKA,IAAI,OAAO6a,GAAE,SAASrb,EAAEqZ,IAAI/Y,EAAE,CAAC,GAAY,WAATN,EAAEqN,KAAgB,CAAC,IAAI/M,EAAEkG,GAAE,CAACxG,EAAEuB,OAAO,CAACsI,IAAI,QAAQtI,MAAMvB,EAAEuB,OAAOvB,EAAEkkB,UAAU,CAACra,IAAI,WAAWtI,MAAMvB,EAAEkkB,WAAW5f,OAAO9D,KAAKA,IAAI,OAAO6a,GAAE,SAASrb,EAAEmkB,OAAO7jB,EAAE,CAAC,MAAMyC,MAAM,8BAA8BuF,KAAKC,UAAUvI,OACmkBokB,CAAG5jB,IAAI+iB,YAAe,MAAHjjB,OAAQ,EAAOA,EAAEijB,YAAYI,gBAAmB,MAAHrjB,OAAQ,EAAOA,EAAEqjB,kBAAsBU,GAAE,CAACrkB,EAAEM,EAAEE,EAAE,GAAGiC,KAAK,IAAI9B,EAAE6F,GAAE,CAAClG,EAAE+M,MAAM,CAACxD,IAAI,QAAQtI,MAAMjB,EAAE+M,MAAM/M,EAAE8J,SAAY,MAAH3H,GAASA,EAAE6hB,WAAW,CAACza,IAAI,OAAOtI,MAAMjB,EAAE8J,MAAMma,aAAa/jB,GAAG8D,OAAOpB,KAAKA,IAAIhD,EAAW,SAATI,EAAE+M,KAAckV,GAAGjiB,EAAEsK,OAAMtK,EAAE8J,OAAY,MAAH3H,GAASA,EAAE6hB,SAAwD7B,GAAEniB,EAAEsK,MADw5Z,EAAC5K,EAAEM,EAAEE,KAAK,IAAIiC,EAAEnC,EAAEsK,KAAK,IAAIgT,GAAGnb,SAASM,MAAM,0BAA0BN,KAAK,OAAOkf,GAAGlf,EAAEnC,EAAEikB,SAAS/jB,GAAGkiB,GAAGjgB,GAAE,GAAIggB,GAAEziB,IAC3jawkB,CAAGlkB,EAAEsK,KAAKtK,EAAE8J,MAAS,MAAH3H,OAAQ,EAAOA,EAAEgiB,WAAqB,OAAOpJ,GAAErb,EAAEE,EAAES,IAA81CgI,GAAE,CAAC3I,EAAEM,EAAEE,IAAI6a,GAAErb,EAAxE,CAAAA,GAAGA,EAAE0kB,QAAQ,iBAAiB,CAACpkB,EAAEE,IAAIA,EAAE,KAAKA,IAAI,OAA0BmkB,CAAGrkB,GAAGE,EAAEgG,GAAEhG,QAAG,GAAYokB,GAAG,CAAC5kB,EAAEM,IAAIyiB,GAAE/iB,EAAE,CAACmjB,aAHlT,SAGiUC,UAAU1K,GAA0C2K,eAAe,CAACnK,MAAM,EAAEoK,OAAO9iB,EAAEe,MAAMkB,KAAK4hB,GAAE7jB,EAAEiC,OAAE,EAAO,CAACgiB,eAAkB,EAAmBH,UAAS,IAAKjR,MAAM,EAAEiQ,OAAO9iB,EAAEe,MAAMkB,KAAK4hB,GAAE7jB,EAAEiC,OAAE,EAAO,CAACgiB,eAAkB,IAAqBlR,IAAI,EAAE+P,OAAO9iB,EAAEe,MAAMkB,KAAK4hB,GAAE7jB,EAAEiC,OAAE,EAAO,CAACgiB,eAAkB,IAAqB5L,QAAQ,EAAEyK,OAAO9iB,EAAEe,MAAMkB,KAAK4hB,GAAE7jB,EAAEiC,OAAE,EAAO,CAACgiB,eAAkB,IAAqB3L,aAAa,EAAEwK,OAAO9iB,EAAEe,MAAMkB,KAAK4hB,GAAE7jB,EAAEiC,OAAE,EAAO,CAACgiB,eAAkB,IAAqB7L,WAAW,EAAE0K,OAAO9iB,EAAEe,MAAMkB,KAAK4Y,GAAE7a,EAAEiC,EAAE6Y,KAAK,MAAMtD,YAAY,EAAEsL,OAAO9iB,EAAEe,MAAMkB,KAAKkG,GAAEnI,EAAEiC,EAAEzC,EAAE6kB,kBAAkB,CAAC,CAAChb,IAAI,SAAStI,MAAM,IAAIvB,EAAE6kB,4BAAuB,GAAQ9L,SAAS,EAAEuK,OAAO9iB,EAAEe,MAAMkB,KAAKkG,GAAEnI,EAAEiC,GAAGqX,QAAQ,EAAEwJ,OAAO9iB,EAAEe,MAAMkB,KAAKkG,GAAEnI,EAAEiC,GAAG0V,QAAQ,EAAEmL,OAAO9iB,EAAEe,MAAMkB,KAAKkG,GAAEnI,EAAEiC,GAAGwW,eAAe,EAAE1X,MAAMf,KAAp6D,CAAAR,IAAI,IAAIyC,EAAE,IAAInC,EAAE,GAAGE,EAAEgG,GAAE,CAACxG,EAAE4a,WAAW,CAAC/Q,IAAI,OAAOtI,MAAMvB,EAAE4a,WAAW5a,EAAEka,OAAO,CAACrQ,IAAI,QAAQtI,MAAMvB,EAAEka,MAAM/W,IAAIxC,GAAlK,CAAAX,GAAGA,EAAEmf,WAAW,GAAGnf,EAAEmf,aAAanf,EAAE0K,MAAM1K,EAAE0K,IAAyHoa,CAAGnkB,IAAI2a,KAAK,MAAMtb,EAAEma,QAAQ,CAACtQ,IAAI,SAAStI,MAAMvB,EAAEma,OAAOmB,KAAK,MAAMtb,EAAEoa,UAAU,CAACvQ,IAAI,WAAWtI,MAAMvB,EAAEoa,SAASkB,KAAK,MAAMtb,EAAEqa,SAAS,CAACxQ,IAAI,UAAUtI,MAAMvB,EAAEqa,QAAQlX,IAAIxC,GAAGA,EAAE,GAAG2a,KAAK,MAAMtb,EAAEsa,YAAY,CAACzQ,IAAI,aAAatI,MAAMvB,EAAEsa,WAAWgB,KAAK,MAAMtb,EAAEua,UAAU,CAAC1Q,IAAI,WAAWtI,MAAMvB,EAAEua,SAASe,KAAK,MAAMtb,EAAEwa,UAAU,CAAC3Q,IAAI,WAAWtI,MAAMvB,EAAEwa,SAASc,KAAK,MAAMtb,EAAEya,UAAU,CAAC5Q,IAAI,WAAWtI,MAAMvB,EAAEya,SAASa,KAAK,MAAMtb,EAAE0a,WAAW,CAAC7Q,IAAI,YAAYtI,MAAMvB,EAAE0a,UAAUY,KAAK,MAAMtb,EAAE2a,OAAO,CAAC9Q,IAAI,QAAQtI,MAAMvB,EAAE2a,MAAMkD,YAAY7d,EAAE6a,UAAU,CAAChR,IAAI,WAAWtI,MAAMvB,EAAE6a,SAASgD,YAAY7d,EAAE8a,OAAO,CAACjR,IAAI,QAAQtI,MAAqB,SAAfvB,EAAE8a,MAAMzN,KAAckV,GAAGviB,EAAE8a,MAAMlQ,MAAM6X,IAAsB,OAAlBhgB,EAAEzC,EAAE8a,MAAM1Q,cAAoB3H,EAAEmI,OAAO5K,EAAE8a,MAAMlQ,OAAO5K,EAAE+a,eAAe,CAAClR,IAAI,OAAOtI,MAAMvB,EAAE+a,gBAAgBzW,OAAO3D,KAAKA,IAAI,OAAOL,GAAG+a,GAAE,QAAQ7a,GAAGF,GAA0hCykB,CAAEvkB,GAAGyX,SAAS,EAAEqL,OAAO9iB,EAAEe,MAAMkB,KAAK4Y,GAAE7a,EAAEkI,GAAEjG,IAAI+W,UAAU,EAAEjY,MAAMf,KAA1tE,CAAAR,IAAI,IAAIM,EAAEkG,GAAE,CAACxG,EAAEwb,KAAK,CAAC3R,IAAI,MAAMtI,MAAM,IAAIvB,EAAEwb,QAAQxb,EAAEuX,MAAM,CAAC1N,IAAI,KAAKtI,MAAMvB,EAAEuX,MAAMvX,EAAE6b,QAAQ,CAAChS,IAAI,UAAUtI,MAAMwG,GAAE/H,EAAE6b,UAAUvX,OAAO9D,KAAKA,IAAI,OAAO6a,GAAE,YAAYtT,GAAE/H,EAAE+b,OAAOzb,IAA+iE0kB,CAAExkB,GAAGkZ,SAAS,EAAE4J,OAAO9iB,EAAEe,MAAMkB,KAAKrC,GAAEI,EAAEiC,GAAGoX,aAAa,EAAEtY,MAAMf,KAArpC,EAACR,EAAEM,KAAK,IAAIE,EAAE,GAAG,OAAOA,GAAG6jB,GAAE,gBAAgBrkB,EAAEuB,MAAMvB,EAAEilB,MAAM,CAAC,CAACpb,IAAI,QAAQtI,MAAMvB,EAAEilB,aAAQ,EAAO3kB,GAAGE,GAAqjC0kB,CAAG1kB,EAAE,CAACikB,eAAkB,KAAsBxB,oBAAoB,CAAC3K,UAAU,EAAE/W,MAAMf,KAAK+a,GAAE/a,EAAE,YAAYwY,eAAe,EAAEzX,MAAMf,KAAp8E,EAACR,EAAEM,EAAEE,IAAI6jB,GAAE/jB,EAAEN,OAAE,EAAOQ,GAAm7E0P,CAAG1P,EAAE,SAAS,CAACikB,eAAkB,KAAsBzB,gBAAgB,CAACrK,OAAOnY,GAAGsjB,GAAGtjB,EAAE,CAAC+iB,mBAAyCI,iBAAgB,KAAMJ,iBAAoB,EAAqBI,0NCcnrI,IAAMwB,GAAN,cAAmBvY,EAAnB,WAAA7M,GAAAgC,SAAAC,WACyCvB,KAAA2kB,MAAO,EACvB3kB,KAAA6U,aAA6B,CACrDzD,QAAS,GACTY,QAAS,GACTgD,YAAa,IAGWhV,KAAA6I,OAAS,KAE5B7I,KAAQ4kB,SAAW,EACnB5kB,KAAQ6kB,UAAY,EACpB7kB,KAAQ8kB,aAAc,EA+G/B9kB,KAAQ+kB,eAAkBllB,IACtB,GAAc,QAAVA,EAAEuJ,IAAe,OAErB,MAAM4b,EAAYthB,MAAM8F,KACpBxJ,KAAKilB,WAAWC,iBACZ,6EAGR,GAAyB,IAArBF,EAAU/iB,OAAc,OAE5B,MAAMkjB,EAAQH,EAAU,GAClBI,EAAOJ,EAAUA,EAAU/iB,OAAS,GAEpCojB,EAAOrlB,KAAKilB,WACdplB,EAAEylB,SACED,EAAKE,gBAAkBJ,IACvBtlB,EAAE8U,iBACFyQ,EAAKI,SAGLH,EAAKE,gBAAkBH,IACvBvlB,EAAE8U,iBACFwQ,EAAMK,UA6ClBxlB,KAAQylB,aAAe,KACnBzlB,KAAK2kB,MAAO,EACZ3kB,KAAKyU,cAAc,IAAIL,YAAY,aAAc,CAAEG,SAAS,EAAMC,UAAU,MAGhFxU,KAAQ0lB,cAAgB,KACpB,MAAMtU,QAAEA,EAAAY,QAASA,EAAAO,KAASA,EAAApI,KAAMA,GAASnK,KAAK6U,aACxC8Q,EAAYxb,GAAMD,MAAQ,KAC1B0b,GAAczb,GAAMhB,OAAS,GAAK,EAClC0c,EAAW1b,GAAMF,KAAO,GAC9B,IAAI2I,EAAOE,EACPP,IACAK,EAAQ,CACJzI,KAAM,IAAIC,KAAKub,EAAWC,EAAYC,EAAUtT,EAAKK,MAAM7H,KAAMwH,EAAKK,MAAM5H,SAEhF8H,EAAM,CACF3I,KAAM,IAAIC,KAAKub,EAAWC,EAAYC,EAAUtT,EAAKO,IAAI/H,KAAMwH,EAAKO,IAAI9H,UAGhF,MAAM0L,EAAkB,CACpB9D,MAAO,CACHzI,KAAOyI,GAASA,EAAMzI,MAAS,IAAIC,KAAKub,EAAWC,EAAYC,EAAU,EAAG,IAEhF/S,IAAK,CACD3I,KAAO2I,GAAOA,EAAI3I,MAAS,IAAIC,KAAKub,EAAWC,EAAYC,EAAU,GAAI,KAE7EnO,QAAStG,EACTmG,YAAavF,EACbkH,OAAQ,YACRR,IAAK,GAAGtO,KAAK0b,qBACbrN,MAAO,CAAEtO,oBAAM,IAAIC,OAGjB2b,EAAY,CACd,kBACA,cACA,6BAJWC,GAAiBtP,GAKrBuP,OACP,iBACFpL,KAAK,QACDqL,EAAO,IAAIC,KAAK,CAACJ,GAAY,CAAEnZ,KAAM,kBACrCgM,EAAMwN,IAAIC,gBAAgBH,GAC1BzjB,EAAI6jB,SAASC,cAAc,KACjC9jB,EAAE+jB,KAAO5N,EACTnW,EAAEgkB,SAAW,GAAGrV,GAAW,cAC3BkV,SAASI,KAAKC,YAAYlkB,GAC1BA,EAAEmkB,QACFC,WAAW,KACPP,SAASI,KAAKI,YAAYrkB,GAC1B2jB,IAAIW,gBAAgBnO,IACrB,GACP,CApIS,OAAA1F,CAAQ8T,IACTA,EAAQC,IAAI,SAAWD,EAAQC,IAAI,gBAC/BjnB,KAAK2kB,MAAQ3kB,KAAKkV,aAClBlV,KAAK8kB,aAAc,EACnB9kB,KAAKknB,mBAELC,sBAAsB,KAClB,MAAMC,EAAWpnB,KAAKilB,WAAWoC,cAAc,cAC/CD,GAAU5B,UAI1B,CA6BQ,gBAAA0B,GACJC,sBAAsB,KAClB,MAAMG,EAAOtnB,KAAKilB,WAAWoC,cAAc,SACrCE,EAAYvnB,KAAKwnB,cACvB,IAAKF,IAASC,IAAcvnB,KAAKkV,WAAY,OAE7C,MAAMuS,EAAgBF,EAAUpS,wBAC1BuS,EAAWJ,EAAKnS,wBAGhBwS,EAAY3nB,KAAKkV,WAAW0S,IAAMH,EAAcG,IAChDC,EAAa7nB,KAAKkV,WAAW4S,KAAOL,EAAcK,KAClDC,EAAcF,EAAa7nB,KAAKkV,WAAW8S,MAC3CC,EAAaN,EAAY3nB,KAAKkV,WAAWgT,OAAS,EAGlDC,EAAQT,EAASM,OAAS,IAC1BI,EAAQV,EAASQ,QAAU,IAGjC,IAAIJ,EAEAA,EADAC,EANQ,EAMYI,GAASV,EAAcO,MACpCD,EAPC,EAQDF,EARC,EAQkBM,GAAS,EAC5BN,EATC,EASkBM,EAGnBlK,KAAKoK,IAZJ,GAYcZ,EAAcO,MAAQG,GAAS,GAIzD,IAAIP,EAAMK,EAAaG,EAAQ,EAC/BR,EAAM3J,KAAKoK,IAjBC,EAiBQpK,KAAK4B,IAAI+H,EAAKH,EAAcS,OAASE,EAjB7C,IAmBZpoB,KAAK4kB,SAAWgD,EAChB5nB,KAAK6kB,UAAYiD,EACjB9nB,KAAK8kB,aAAc,GAE3B,CAuDQ,WAAAwD,CAAYne,GAChB,O5BrHD,SACHF,EACAd,EACAe,EACArB,EAAS,MAET,MAAMO,EAAMR,GAAmBC,GACzBvD,EAAI,IAAI8E,KAAKF,EAAMf,EAAQ,EAAGc,GACpC,OAAO,IAAIK,KAAKC,eAAenB,EAAK,CAChCa,IAAK,UACLd,MAAO,QACPe,KAAM,YACPO,OAAOnF,EACd,C4BwGeijB,CAAoBpe,EAAKF,IAAKE,EAAKhB,MAAOgB,EAAKD,KAAMlK,KAAK6I,OACrE,CAES,MAAApH,GACL,MAAM0Q,EAAMxB,GAAY3Q,KAAK6I,QACvB2f,EAAc,QAAOxoB,KAAK8kB,YAAc,WAAa,IACrD2D,EAAWzoB,KAAK6U,aAAa7C,SAAWhS,KAAK6U,aAAa7C,UAAYG,EAAI4C,UAEhF,OAAOzI,CAAA;;wBAESkc;;;6BAGKrW,EAAI0C;8BACH7U,KAAK4kB,qBAAqB5kB,KAAK6kB;2BAClC7kB,KAAK+kB;;;;2BAIL/kB,KAAK6U,aAAazD,SAAWe,EAAI2C;;;;;iCAK3B9U,KAAKylB;gCACNtT,EAAIuW;qCACCvW,EAAIuW;;;;;;sBAMnB1oB,KAAK6U,aAAaG,aAAe7C,EAAI8C;;kBAGvCjV,KAAK6U,aAAa1K,KACZmC,CAAA;gCACMtM,KAAKsoB,YAAYtoB,KAAK6U,aAAa1K;kCAEzCmD;kBAERmb,EAAWnc,CAAA,sBAA0BtM,KAAK6U,aAAa7C,gBAAkB1E;;;;;iCAK1DtN,KAAK0lB;gCACNvT,EAAIwW;;0BAEVxW,EAAIwW;;;;SAK1B,GA1SSjE,GAcOlY,OAASC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAbmBC,GAAA,CAA3CC,EAAS,CAAEC,KAAMzI,QAASqR,SAAS,KAD3BkP,GACmC1gB,UAAA,OAAA,GAChB0I,GAAA,CAA3BC,EAAS,CAAEC,KAAM1K,UAFTwiB,GAEmB1gB,UAAA,eAAA,GAKI0I,GAAA,CAA/BC,EAAS,CAAE4I,WAAW,KAPdmP,GAOuB1gB,UAAA,aAAA,GACJ0I,GAAA,CAA3BC,EAAS,CAAEC,KAAMC,UART6X,GAQmB1gB,UAAA,SAAA,GAEX0I,GAAA,CAAhBvE,KAVQuc,GAUQ1gB,UAAA,WAAA,GACA0I,GAAA,CAAhBvE,KAXQuc,GAWQ1gB,UAAA,YAAA,GACA0I,GAAA,CAAhBvE,KAZQuc,GAYQ1gB,UAAA,cAAA,GAZR0gB,GAANhY,GAAA,CADNI,EAAc,aACF4X,ICCb,MAAqBkE,GAIjB,WAAAtpB,EAAY6K,KAAEA,EAAAyM,UAAMA,IACZzM,IACAnK,KAAKmK,KAAOA,GAEhBnK,KAAK6oB,WAAajS,CACtB,CAEA,QAAIzM,CAAKA,GACL,MAAM2e,EAAUpf,EAASmM,WAAW1L,GACpC,IAAK2e,EAAQC,QACT,MAAM,IAAIzmB,MAAM,iDAEpBtC,KAAKgpB,MAAQF,CACjB,CAEA,aAAIlS,CAAUA,GACV5W,KAAK6oB,WAAajS,CACtB,CAEQ,eAAAqS,CAAgB9e,GACpB,MAAO,CACHF,IAAKE,EAAKF,IACVd,MAAOgB,EAAKhB,MACZe,KAAMC,EAAKD,KAEnB,CAEO,uBAAAgf,GACH,IAAKlpB,KAAKgpB,QAAUhpB,KAAKgpB,MAAMD,QAC3B,MAAM,IAAIzmB,MAAM,8BAGpB,IAAKtC,KAAK6oB,WACN,MAAM,IAAIvmB,MAAM,wBAGpB,MAAM6mB,EAAenpB,KAAKgpB,MAAMI,KAAK,CACjC3N,KAA0B,SAApBzb,KAAK6oB,WAAwB,GAAI,IAG3C,IAAKM,EAAaJ,QACd,MAAM,IAAIzmB,MAAM,6BAIpB,OADAtC,KAAKgpB,MAAQG,EACNnpB,KAAKipB,gBAAgBE,EAChC,CAEO,yBAAAE,GACH,IAAKrpB,KAAKgpB,QAAUhpB,KAAKgpB,MAAMD,QAC3B,MAAM,IAAIzmB,MAAM,mBAGpB,IAAKtC,KAAK6oB,WACN,MAAM,IAAIvmB,MAAM,wBAGpB,MAAM6mB,EAAenpB,KAAKgpB,MAAMI,KAAK,CACjCE,OAA4B,SAApBtpB,KAAK6oB,WAAwB,GAAI,IAG7C,IAAKM,EAAaJ,QACd,MAAM,IAAIzmB,MAAM,6BAIpB,OADAtC,KAAKgpB,MAAQG,EACNnpB,KAAKipB,gBAAgBE,EAChC,uMC/EJ,IAAqBI,GAArB,cAAmCpd,EAAnC,WAAA7M,GAAAgC,SAAAC,WACIvB,KAAQwpB,+BAAkBpf,KAG1BpK,KAAAsL,WAA2B,CACvBrB,IAAKjK,KAAKwpB,YAAY5d,UACtBzC,MAAOnJ,KAAKwpB,YAAY3d,WAAa,EACrC3B,KAAMlK,KAAKwpB,YAAY1d,eAI3B9L,KAAAoM,eAAiC,EAGjCpM,KAAA6I,OAAS,IAAA,CAgFA,iBAAA4gB,GACLnoB,MAAMmoB,oBAENzpB,KAAK4R,iBAAiB,YAAc/R,IAChC,MAAM6pB,EAAc7pB,EAGpB,GAAIA,EAAEL,SAAWQ,KAAM,CACnBH,EAAE+U,kBAEF,MAAM+U,EAAiB,IAAIvV,YAAY,YAAa,CAChDC,OAAQqV,EAAYrV,OACpBE,SAAS,EACTC,UAAU,IAEdxU,KAAKyU,cAAckV,EACvB,IAIJ3pB,KAAK4pB,uBACT,CAEQ,qBAAAA,GAEJ,IAAIC,EAAuB,KAgB3B7pB,KAAK8pB,eAAeC,KAAK,KACrB,MAAMtO,EAAOzb,KAAKgqB,YAAY9E,iBAAiB,QAC/CzJ,GAAMjX,QAASyF,IACX,MAAMggB,EAAahgB,EACnBggB,EAAWrY,iBAAiB,SAAU,IAlBzB,CAACqY,IACdJ,IAEJA,EAAQ1C,sBAAsB,KACtB8C,EAAWC,UAAY,EACvBD,EAAWE,UAAU/pB,IAAI,YAEzB6pB,EAAWE,UAAUC,OAAO,YAEhCP,EAAQ,SASoCQ,CAAaJ,GAAa,CAClEK,SAAS,OAIzB,CAEQ,cAAAC,CAAepgB,GACnB,OAAO,IAAIC,KAAKD,GAAMqgB,iBAAmBxqB,KAAKwpB,YAAYgB,cAC9D,CAEQ,gBAAAC,EAAiBvgB,KAAEA,EAAAf,MAAMA,EAAAc,IAAOA,IACpC,MAAMygB,EAAgB1qB,KAAKuqB,eAAe,GAAGrgB,KAAQf,KAASc,KAC9D,OAAOqC,CAAA;+BACgBiB,EAAS,CACxBhC,QAASmf;;cAGH,IAARzgB,EAAYD,GAAqBC,EAAKd,EAAOe,EAAMlK,KAAK6I,QAAUoB;eAE5E,CAES,MAAAxI,GACL,OAAO6K,CAAA;;kBAEGtM,KAAK2qB,qBAAqBjoB,IACxB,EAAGwH,OAAMf,QAAOc,SACZqC,CAAA;;yCAEiBpC,KAAQf,KAASc;qCACrBjK,KAAK4qB;uCACH5qB,KAAK+kB;;;8BAGd/kB,KAAKyqB,iBAAiB,CAAEvgB,OAAMf,QAAOc;0CACzBC,KAAQf,KAASc;;;SAKvD,CAEQ,eAAA2gB,CAAgB/qB,GACpB,MAAML,EAASK,EAAEL,OACjB,KAAMA,aAAkBuX,aACpB,OAIJ,GAAIvX,EAAOqrB,QAAQ,sBACf,OAGJ,MAAM1gB,KAAEA,GAAS3K,EAAOyX,QACxB,IAAK9M,EACD,OAGJ,MAAOD,EAAMf,EAAOc,GAAOE,EAAK2G,MAAM,KAAKpO,IAAKooB,GAAkBC,SAASD,EAAO,KAC5EpU,EAAQ,IAAItC,YAAY,SAAU,CACpCC,OAAQ,CAAElK,KAAM,CAAEF,MAAKd,QAAOe,SAC9BqK,SAAS,EACTC,UAAU,IAEdxU,KAAKyU,cAAciC,EACvB,CAEQ,cAAAqO,CAAellB,GACnB,MAAMuJ,EAAMvJ,EAAEuJ,IACA,UAARA,GAA2B,UAARA,GAIzBpJ,KAAK4qB,gBAAgB/qB,EACzB,CAEQ,eAAAmrB,CAAgB7gB,GAGpB,OAAO7F,GAAM6F,GACR8H,KAAK,CAAE/H,KAAM7C,GAAEK,OAAQyB,MAAO9B,GAAEK,OAAQuC,IAAK5C,GAAEK,QAAU,EAAGwC,OAAMf,YAC/D,MAAMsS,EAAO,IAAIrR,KAAKF,EAAMf,EAAO,GAAGyC,UACtC,OAAO6P,EAAO,EAAIA,EAAO,IAE5BpT,UAAU,IAAM,EACzB,CAEQ,2BAAA4iB,CAA4B9gB,GAChC,OAAO4B,GAAkB5B,EAAMnK,KAAKoM,eACxC,CAEQ,uBAAA8e,CAAwB/gB,EAAoBghB,GAEhD,OAAO7mB,GADatE,KAAKgrB,gBAAgB7gB,IAEpC8H,KAAK,EAAG,IAAM,IACd5J,UAAWoT,GACR/X,MAAM8F,KAAK9F,MAAM+X,GAAMlX,OAAQ,CAACkF,EAAGzH,KAAAA,CAC/BkI,KAAMC,EAAKD,KACXf,MAAOgB,EAAKhB,MACZc,IAAKjI,EAAI,KACTqB,SAAU8nB,GAAa,CAAC,IAExC,CAEQ,iBAAAR,GACJ,IAAK3qB,KAAKsL,WACN,MAAO,GAGX,MAAM8f,EAAkB,IAAIxC,GAAkC,CAC1Dze,KAAMnK,KAAKsL,aAGf,IACI8f,EAAgBxU,UAAY,WAC5B,MAAMpL,EAASxL,KAAKirB,4BAA4BjrB,KAAKsL,YAC/C+f,EACF7f,EAAS,EACHxL,KAAKkrB,wBAAwBE,EAAgB/B,4BAA6B,EACrE7d,IAEL,GAEJ8f,EAActrB,KAAKkrB,wBAAwBlrB,KAAKsL,WAAY,IAGlE8f,EAAgBjhB,KAAOnK,KAAKsL,WAC5B8f,EAAgBxU,UAAY,OAC5B,MAAM2U,EAAgB,IAAMF,EAAcppB,OAASqpB,EAAYrpB,QACzDupB,EACFD,EAAgB,EACVvrB,KAAKkrB,wBAAwBE,EAAgB/B,4BAA6B,CACtE,EACAkC,IAEJ,GAEV,OAAOF,EAAclmB,OAAOmmB,EAAaE,EAC7C,OAASC,GAEL,OADA7qB,QAAQ6qB,MAAM,mCAAoCA,GAC3C,EACX,CACJ,GAzRiBlC,GAgBD/c,OAASC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAZzBC,GAAA,CADCC,EAAS,CAAE4I,WAAW,KAHNgU,GAIjBvlB,UAAA,aAAA,GAOA0I,GAAA,CADCC,EAAS,CAAEC,KAAM7F,UAVDwiB,GAWjBvlB,UAAA,iBAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,UAbD0c,GAcjBvlB,UAAA,SAAA,GAdiBulB,GAArB7c,GAAA,CADCI,EAAc,uBACMyc,yMCArB,IAAqBmC,GAArB,cAAkCvf,EAAlC,WAAA7M,GAAAgC,SAAAC,WAEIvB,KAAAsL,WAA2B,CACvBrB,oBAAA,IAASG,MAAOwB,UAChBzC,sBAAA,IAAWiB,MAAOyB,WAAa,EAC/B3B,qBAAA,IAAUE,MAAO0B,eAIrB9L,KAAAkN,eAAiB,EAGjBlN,KAAAoM,eAAiC,EAGjCpM,KAAA6I,OAAS,KAQT7I,KAAA2rB,kBAAoB,EAIpB3rB,KAAA4rB,cAAgB,CAAA,CAyPP,iBAAAnC,GACLnoB,MAAMmoB,mBACV,CAEQ,aAAAoC,GACJ,OAAOxgB,GAAarL,KAAKsL,WAAYtL,KAAKoM,eAC9C,CAGQ,iBAAA0f,GACJ,OAAO9rB,KAAK+rB,cAAgB/rB,KAAK6rB,eACrC,CAGQ,uBAAAG,GACJ,MAAMC,EAAYjgB,GAAgBhM,KAAKoM,gBACvC,OAAIpM,KAAK+rB,cAAgB/rB,KAAK4rB,cAAgB,EACnCK,EAAU5oB,MACbrD,KAAK2rB,kBACL3rB,KAAK2rB,kBAAoB3rB,KAAK4rB,eAG/BK,CACX,CAEQ,cAAA1B,CAAepgB,GACnB,MAAMqM,qBAAYpM,KAClB,OACID,EAAKF,MAAQuM,EAAM5K,WACnBzB,EAAKhB,QAAUqN,EAAM3K,WAAa,GAClC1B,EAAKD,OAASsM,EAAM1K,aAE5B,CAGA,gBAAYogB,GACR,YAA6B,IAAtBlsB,KAAK+rB,cAA8B/rB,KAAK4rB,cAAgB,CACnE,CAES,MAAAnqB,GACL,MAAM0qB,EAAgBnsB,KAAK8rB,oBACrBM,EAAepsB,KAAKgsB,0BACpB5e,EAAYpN,KAAKkN,eAAiB,EAClCmf,EAAejf,EAAY6Q,KAAKoK,IAAI,IAA2B,EAAtBroB,KAAKkN,gBAAsB,EAAI,EACxEof,EAAoBlf,EACpB,qCAAqCif,OACrC,6BAEAE,EAAevsB,KAAKksB,cAAgBlsB,KAAK2rB,kBAAoB,EAC7Da,EAAgBxsB,KAAKksB,cAAgBlsB,KAAK2rB,kBAAoB3rB,KAAK4rB,cAAgB,EAEzF,OAAOtf,CAAA;;;;sBAIO6f,EAAczpB,IAAI,CAACyH,EAAMtH,KACvB,MAAMsP,EAAMxB,GAAY3Q,KAAK6I,QAC7B,OAAOyD,CAAA;;mDAEoBiB,EAAS,CACxBhC,QAASvL,KAAKuqB,eAAepgB;;;8CAInBgI,EAAIsa,mBAAmB/hB,GACjC0hB,EAAavpB,GACb7C,KAAK6I,YACHsB,EAAKF;yCACF,IAAMjK,KAAK0sB,qBAAqBviB;2CAC7BtK,GACRG,KAAK2sB,uBAAuB9sB,EAAGsK;;yDAEVO,GAAyB0hB,EAAavpB,GAAQ7C,KAAK6I;2DACjDsB,EAAKF;;;;;;kBAQ5CjK,KAAKksB,mBAEK,MAAM/Z,EAAMxB,GAAY3Q,KAAK6I,QAC7B,OAAOyD,CAAA;;;gDAGWiB,EAAS,CAAE,0BAA2Bgf;;mCAEnDA,EAAe,IAAM;sCAClBpa,EAAIya;iCACT,IAAM5sB,KAAK6sB,oBAAoB;mCAC5BhtB,GAAqBG,KAAK8sB,mBAAmBjtB,EAAG;8BACtDsS,EAAI4a;;gDAEcxf,EAAS,CAAE,0BAA2Bif;;mCAEnDA,EAAgB,IAAM;sCACnBra,EAAI6a;iCACT,IAAMhtB,KAAK6sB,oBAAoB;mCAC5BhtB,GAAqBG,KAAK8sB,mBAAmBjtB,EAAG;uBAC7DsS,EAAI4a;;iBAGD,KACAzf;;;kBAKNF,EACMd,CAAA;;;2DAGiCqE,GAAY3Q,KAAK6I,QAAQuJ;0BAC1D+Z,EAAczpB,IACXyH,GAASmC,CAAA;;;wDAGkBnC,EAAKD,QAAQC,EAAKhB,SAASgB,EAAKF;;;;;;kBAQ9DqD;0DAEgCgf;;0BAEhC5oB,MAAM8F,KAAK,CAAEvH,OAAQ,KAAMS,IACzB,CAAC+G,EAAGsB,IAASuB,CAAA;;;uDAGcvB;;sCAEjB/K,KAAKmN,sBAAsBpC;;;;sBAK3CohB,EAAczpB,IACXyH,GAASmC,CAAA;;;kDAGgBnC,EAAKD,QAAQC,EAAKhB,SAASgB,EAAKF;;;;;;SAQ9E,CAEQ,qBAAAkD,CAAsBpC,GAC1B,OAAOD,GAAoBC,EAAM,EAAG/K,KAAK6I,OAC7C,CAEQ,oBAAA6jB,CAAqBviB,GACzB,MAAMuM,EAAQ,IAAItC,YAAY,SAAU,CACpCC,OAAQ,CAAElK,QACVoK,SAAS,EACTC,UAAU,IAEdxU,KAAKyU,cAAciC,EACvB,CAEQ,sBAAAiW,CAAuB9sB,EAAkBsK,GAC/B,UAAVtK,EAAEuJ,KAA6B,MAAVvJ,EAAEuJ,MACvBvJ,EAAE8U,iBACF3U,KAAK0sB,qBAAqBviB,GAElC,CAMQ,mBAAA0iB,CAAoBjW,GACxB,MAAMqW,EAAYjtB,KAAK6rB,gBACvB,IAAIqB,EAEc,aAAdtW,GAA4B5W,KAAK2rB,kBAAoB,EACrDuB,EAAaD,EAAUjtB,KAAK2rB,kBAAoB,GAC3B,SAAd/U,GAAwB5W,KAAK2rB,kBAAoB3rB,KAAK4rB,cAAgB,IAC7EsB,EAAaD,EAAUjtB,KAAK2rB,kBAAoB3rB,KAAK4rB,gBAGrDsB,GACAltB,KAAKyU,cACD,IAAIL,YAAY,gBAAiB,CAC7BC,OAAQ,CAAElK,KAAM+iB,EAAYtW,aAC5BrC,SAAS,EACTC,UAAU,IAI1B,CAEQ,kBAAAsY,CAAmBjtB,EAAkB+W,GAC3B,UAAV/W,EAAEuJ,KAA6B,MAAVvJ,EAAEuJ,MACvBvJ,EAAE8U,iBACF3U,KAAK6sB,oBAAoBjW,GAEjC,GAleiB8U,GA6BDlf,OAASC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA3BzBC,GAAA,CADCC,EAAS,CAAE4I,WAAW,KADNmW,GAEjB1nB,UAAA,aAAA,GAOA0I,GAAA,CADCC,EAAS,CAAEC,KAAM7F,UARD2kB,GASjB1nB,UAAA,iBAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAM7F,UAXD2kB,GAYjB1nB,UAAA,iBAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,UAdD6e,GAejB1nB,UAAA,SAAA,GAIA0I,GAAA,CADCC,EAAS,CAAE4I,WAAW,KAlBNmW,GAmBjB1nB,UAAA,eAAA,GAIA0I,GAAA,CADCC,EAAS,CAAEC,KAAM7F,UAtBD2kB,GAuBjB1nB,UAAA,oBAAA,GAIA0I,GAAA,CADCC,EAAS,CAAEC,KAAM7F,UA1BD2kB,GA2BjB1nB,UAAA,gBAAA,GA3BiB0nB,GAArBhf,GAAA,CADCI,EAAc,sBACM4e,yMCGrB,IAAqByB,GAArB,cAAkChhB,EAAlC,WAAA7M,GAAAgC,SAAAC,WAEIvB,KAAAsL,iBACI,MAAMkL,qBAAYpM,KAClB,MAAO,CAAEH,IAAKuM,EAAM5K,UAAWzC,MAAOqN,EAAM3K,WAAa,EAAG3B,KAAMsM,EAAM1K,cAC5E,KAGA9L,KAAAoM,eAAiC,EAGjCpM,KAAA6I,OAAS,KAGT7I,KAAAotB,cAAwC,CAAA,EAGxCptB,KAAAqtB,YAA2B,QAG3BrtB,KAAAstB,YAA2B,KAAA,CAmMlB,MAAA7rB,GACL,MAAMyI,EAAOlK,KAAKsL,WAAWpB,KACvBsM,qBAAYpM,KACZmjB,EAAW/W,EAAM5K,UACjB4hB,EAAahX,EAAM3K,WAAa,EAChC4hB,EAAYjX,EAAM1K,cAElBsgB,EAAepgB,GAAgBhM,KAAKoM,gBAE1C,OAAOE,CAAA;6DAC8CqE,GAAY3Q,KAAK6I,QAAQqB,QAAQA;kBAC5ExG,MAAM8F,KAAK,CAAEvH,OAAQ,IAAM,CAACwH,EAAGtJ,KAC7B,MAAMgJ,EAAQhJ,EAAI,EAClB,OAAOH,KAAK0tB,iBACRxjB,EACAf,EACAokB,EACAC,EACAC,EACArB;;SAKpB,CAEQ,gBAAAsB,CACJxjB,EACAf,EACAokB,EACAC,EACAC,EACArB,GAEA,MAAMuB,EAAc,IAAIvjB,KAAKF,EAAMf,EAAO,GAAGyC,UACvCgiB,EAAiB7hB,GAAkB,CAAE7B,OAAMf,SAAiBnJ,KAAKoM,gBACjE+F,EAAMxB,GAAY3Q,KAAK6I,QAGvB2S,EAA6B,GACnC,IAAIqS,EAAiCnqB,MAAM8F,KAAK,CAAEvH,OAAQ2rB,GAAkB,IAAM,MAClF,IAAA,IAAS3jB,EAAM,EAAGA,GAAO0jB,EAAa1jB,IAClC4jB,EAAY9qB,KAAKkH,GACU,IAAvB4jB,EAAY5rB,SACZuZ,EAAMzY,KAAK8qB,GACXA,EAAc,IAGtB,GAAIA,EAAY5rB,OAAS,EAAG,CACxB,KAAO4rB,EAAY5rB,OAAS,GAAG4rB,EAAY9qB,KAAK,MAChDyY,EAAMzY,KAAK8qB,EACf,CAEA,OAAOvhB,CAAA;;;;;6BAKc,IAAMtM,KAAK8tB,kBAAkB5jB,EAAMf;;sBAE1CD,GAAkBC,EAAOnJ,KAAK6I;;;;sBAI9BujB,EAAa1pB,IACVqrB,GACGzhB,CAAA,SAAa5B,GAAyBqjB,EAAI/tB,KAAK6I,QAAQmlB,OAAO;;;sBAIpExS,EAAM9Y,IAAK0T,IACT,MAAMhL,EAAWgL,EAAKoH,KAAMlY,GAAY,OAANA,GAC5B2oB,EAAU7iB,EACV1B,EAASmM,WAAW,CAAE3L,OAAMf,QAAOc,IAAKmB,IAAY0K,WACpD,KACN,OAAOxJ,CAAA;8BAEa,OAAZ2hB,EACM3hB,CAAA;;;oDAGc6F,EAAI8D,gBAAgBgY;+CACzB,IAAMjuB,KAAKkuB,iBAAiBhkB,EAAMf,EAAOiC;qCACnD6iB,aACC3hB,CAAA;;;8BAIR8J,EAAK1T,IAAKuH,GACA,OAARA,EACMjK,KAAKmuB,eACDjkB,EACAf,EACAc,EACAA,IAAQsjB,GACJpkB,IAAUqkB,GACVtjB,IAASujB,EACbxjB,IAAQjK,KAAKsL,WAAWrB,KACpBd,IAAUnJ,KAAKsL,WAAWnC,OAC1Be,IAASlK,KAAKsL,WAAWpB,KAC7BlK,KAAKotB,cAAc,GAAGljB,KAAQf,KAASc,MAAU,GAErDqC,CAAA;;;;;;SASlC,CAEQ,cAAA6hB,CACJjkB,EACAf,EACAc,EACAmkB,EACAC,EACAC,GAEA,MAAMC,EAAU,CAAC,YACbH,GAAWG,EAAQxrB,KAAK,WACxBsrB,IAAeD,GAAWG,EAAQxrB,KAAK,YAG3C,IAAIyrB,EAAc,GAClB,GAAyB,QAArBxuB,KAAKstB,aAAyBgB,EAAa,EAC3CC,EAAQxrB,KAAK,mBACjB,GAAgC,YAArB/C,KAAKstB,aAA6BgB,EAAa,EAAG,CAEzDE,EAAc,GADCF,GAAc,EAAI,EAAIA,GAAc,EAAI,EAAIA,GAAc,EAAI,EAAI,GAErF,CAEA,OAAOhiB,CAAA;;;wBAGSiiB,EAAQ1T,KAAK;+BACN2T,GAAelhB;6BACjBpD,KAAQf,KAASc;yBACrB,IAAMjK,KAAKyuB,gBAAgBvkB,EAAMf,EAAOc;8BACnCA,KAAOf,GAAkBC,EAAOnJ,KAAK6I,WAAWqB,IAAOokB,EAAa,EAAI,KAAKA,KAAc3d,GAAY3Q,KAAK6I,QAAQ6lB,SAAW;;kBAE3IzkB;kBAEuB,UAArBjK,KAAKstB,aAA2BgB,EAAa,EACvChiB,CAAA,6BAAiCgiB,WACjChhB;;SAItB,CAEQ,eAAAmhB,CAAgBvkB,EAAcf,EAAec,GACjDjK,KAAKyU,cACD,IAAIL,YAAY,SAAU,CACtBC,OAAQ,CACJlK,KAAM,CAAED,OAAMf,QAAOc,OACrBojB,YAAartB,KAAKqtB,aAEtB9Y,SAAS,EACTC,UAAU,IAGtB,CAEQ,gBAAA0Z,CAAiBhkB,EAAcf,EAAec,GAClDjK,KAAKyU,cACD,IAAIL,YAAY,SAAU,CACtBC,OAAQ,CACJlK,KAAM,CAAED,OAAMf,QAAOc,OACrBojB,YAAa,QAEjB9Y,SAAS,EACTC,UAAU,IAGtB,CAEQ,iBAAAsZ,CAAkB5jB,EAAcf,GACpCnJ,KAAKyU,cACD,IAAIL,YAAY,SAAU,CACtBC,OAAQ,CACJlK,KAAM,CAAED,OAAMf,QAAOc,IAAK,GAC1BojB,YAAa,SAEjB9Y,SAAS,EACTC,UAAU,IAGtB,GC5ZJ,SAAwBma,GAAyBC,GAC7C,IAAIC,EAAM,EACNC,EAAQ,EACRC,EAAO,EAGX,IAAKH,IAAUA,EAAM3I,OACjB,MAAO,CAAC,mBAAoB,cAIhC,MAEM+I,GAFkBJ,EAAM1oB,WAAW,KAAO0oB,EAAQ,IAAIA,KAGvD3K,QAAQ,mCAAoC,CAACgL,EAAIlvB,EAAGoX,EAAGtR,IAAM,IAAI9F,IAAIA,IAAIoX,IAAIA,IAAItR,IAAIA,KACrFwb,UAAU,GACV/c,MAAM,SAEX,IAAK0qB,GAA8B,IAAnBA,EAAQ/sB,OAEpB,MAAO,CAAC,mBAAoB,cAGhC,IAEI,IADC4sB,EAAKC,EAAOC,GAAQC,EAAQtsB,IAAKuD,GAAM8kB,SAAS9kB,EAAG,KAChD+V,MAAM6S,IAAQ7S,MAAM8S,IAAU9S,MAAM+S,GACpC,MAAO,CAAC,mBAAoB,aAEpC,CAAA,MACI,MAAO,CAAC,mBAAoB,aAChC,CAGA,MAAMG,GAAoB,IAANL,EAAoB,IAARC,EAAqB,IAAPC,GAAc,IAY5D,MAAO,CANiB,OAAOF,KAAOC,KAASC,KAE3C9Q,KAAKyD,IAAIwN,OAA0BjR,KAAKyD,IAAIwN,KACtC,qBACA,eAGd,CDvCqB/B,GAsBD3gB,OAASC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MApBzBC,GAAA,CADCC,EAAS,CAAEC,KAAM1K,UADDirB,GAEjBnpB,UAAA,aAAA,GAMA0I,GAAA,CADCC,EAAS,CAAEC,KAAM7F,UAPDomB,GAQjBnpB,UAAA,iBAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,UAVDsgB,GAWjBnpB,UAAA,SAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAM1K,UAbDirB,GAcjBnpB,UAAA,gBAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,UAhBDsgB,GAiBjBnpB,UAAA,cAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,UAnBDsgB,GAoBjBnpB,UAAA,cAAA,GApBiBmpB,GAArBzgB,GAAA,CADCI,EAAc,sBACMqgB,IEqBd,MAAMgC,GAGT,WAAA7vB,CAAYI,EAAuD,IAC/DM,KAAKN,OAAS,CACV0vB,aAAc1vB,EAAO0vB,cAAgB,EACrCC,eAAgB3vB,EAAO2vB,gBAAkB,GAEjD,CAEA,eAAAC,CAAgBZ,GACZ,MAAMa,EAAYvvB,KAAKwvB,kBAAkBd,GACnCe,EAAUzvB,KAAK0vB,iBAAiBH,GAGtC,MAAO,CAAEI,MAFK3vB,KAAK4vB,eAAelB,EAAQe,GAG9C,CAEQ,iBAAAD,CAAkBd,GACtB,OAAOA,EAAOhsB,IAAKgU,IAAA,CACf9D,MAA8B,GAAvB8D,EAAMmZ,UAAU9kB,KAAY2L,EAAMmZ,UAAU7kB,OACnD8H,IAA0B,GAArB4D,EAAMoZ,QAAQ/kB,KAAY2L,EAAMoZ,QAAQ9kB,SAErD,CAEQ,gBAAA0kB,CACJH,GAEA,MAAME,EAAkE,GAqCxE,OAnCezvB,KAAK+vB,kBAAkBR,GAE/B/qB,QAAQ,CAACwrB,EAAcC,KAC1B,GAA4B,IAAxBD,EAAa/tB,OACbwtB,EAAQ1sB,KAAK,CACTF,MAAOmtB,EAAa,GACpBE,MAAO,EACPC,MAAOF,QAER,CACH,MAAMG,EAAiBJ,EAAattB,IAAKvC,IAAAA,IAClCovB,EAAUpvB,GACbkwB,cAAelwB,KAGbmwB,EAAeF,EAAelrB,OAAO,CAACqrB,EAAShlB,IACzBA,EAAQuH,IAAMvH,EAAQqH,MACtB2d,EAAQzd,IAAMyd,EAAQ3d,MACHrH,EAAUglB,GAGzD,IAAIC,EAAY,EAChBJ,EAAe5rB,QAAS4V,IACpB,MACM8V,EADiB9V,EAASiW,gBAAkBC,EAAaD,cAChC,EAAIG,IACnCf,EAAQ1sB,KAAK,CACTF,MAAOuX,EAASiW,cAChBH,QACAC,MAAOF,KAGnB,IAGJR,EAAQxrB,KAAK,CAACxB,EAAGoD,IAAMpD,EAAEI,MAAQgD,EAAEhD,OAC5B4sB,CACX,CAEQ,iBAAAM,CAAkBR,GACtB,MAAMkB,EAA0B,GAC1BC,qBAAezwB,IA6BrB,OA3BAsvB,EAAU/qB,QAAQ,CAACmsB,EAAW9tB,KAC1B,GAAI6tB,EAASzJ,IAAIpkB,GAAQ,OAEzB,MAAMstB,EAAQ,CAACttB,GACf6tB,EAAStwB,IAAIyC,GAEb,IAAImkB,GAAU,EACd,KAAOA,GACHA,GAAU,EACVuI,EAAU/qB,QAAQ,CAACosB,EAAeC,KAC9B,GAAIH,EAASzJ,IAAI4J,GAAa,OAEJV,EAAM3qB,KAAMsrB,GAClC9wB,KAAK+wB,iBAAiBxB,EAAUuB,GAAaF,MAI7CT,EAAMptB,KAAK8tB,GACXH,EAAStwB,IAAIywB,GACb7J,GAAU,KAKtByJ,EAAO1tB,KAAKotB,KAGTM,CACX,CAEQ,gBAAAM,CACJtuB,EACAoD,GAEA,OAAOpD,EAAEmQ,MAAQ/M,EAAEiN,KAAOjN,EAAE+M,MAAQnQ,EAAEqQ,GAC1C,CAEQ,cAAA8c,CACJlB,EACAe,GAEA,MAAMuB,qBAAoBjoB,IAiB1B,OARA2lB,EAAOlqB,QAAQ,CAACkS,EAAO7T,KACnB,MAAMouB,EAAQxB,EAAQ5sB,IAAU,CAAEqtB,MAAO,EAAGC,MAAOttB,GAC9CmuB,EAAc/J,IAAIgK,EAAMd,QACzBa,EAAcpnB,IAAIqnB,EAAMd,MAAO,IAEnCa,EAAc1nB,IAAI2nB,EAAMd,OAAQptB,KAAK,CAAE2T,QAAO7T,QAAOouB,YAGlDvC,EAAOhsB,IAAI,CAACgU,EAAO7T,KACtB,MAAMouB,EAAQxB,EAAQ5sB,IAAU,CAAEqtB,MAAO,EAAGC,MAAOttB,GAC7CgR,EAAqC,GAAvB6C,EAAMmZ,UAAU9kB,KAAY2L,EAAMmZ,UAAU7kB,OAE1DwM,EADiC,GAArBd,EAAMoZ,QAAQ/kB,KAAY2L,EAAMoZ,QAAQ9kB,OAC7B6I,EAEvBqd,EAAcF,EAAc1nB,IAAI2nB,EAAMd,QAAU,GAChDgB,EAAkBlT,KAAKoK,OAAO6I,EAAYxuB,IAAKyU,GAAMA,EAAE8Z,MAAMf,QAEnE,IAAIlI,EACA/hB,EAEJ,GAA2B,IAAvBirB,EAAYjvB,OACZ+lB,EAAQ,IACR/hB,EAAI,MACD,CACH,MACMmrB,EAAW,IADQ,GAGL,IAAhBH,EAAMf,OACNjqB,EAAI,EACJ+hB,EAAQ,MAER/hB,EAAIkrB,EAAkB,EAAKF,EAAMf,MAAQiB,EAAmBC,EAAW,EACvEpJ,EAAQ,IAAM/hB,EAEtB,CAEA,MACMorB,EADa,IACSJ,EAAMf,MAElC,MAAO,CACHrgB,GAAI6G,EAAM7G,GACV5J,EAAAA,EACAR,EAAGoO,EAAc7T,KAAKN,OAAO0vB,aAC7BpH,QACAE,OAAQjK,KAAKoK,IAAI7Q,EAAWxX,KAAKN,OAAO0vB,aAAcpvB,KAAKN,OAAO2vB,gBAClEa,MAAOe,EAAMf,MACbC,MAAOc,EAAMd,MACbmB,QAAyB,IAAhBL,EAAMf,MAAc,IAAOjS,KAAKoK,IAAI,IAAM,IAAqB,IAAd4I,EAAMf,OAChEmB,WAGZ,ECkJG,MAAME,GAAc,IA9RpB,MAAA,WAAAjyB,GAEHU,KAAQwxB,gBAGG,IAAA,CAKJ,iBAAAC,CAAkB/xB,GACrB,MAAMgW,SAAEA,EAAAvL,KAAUA,EAAAoI,KAAMA,EAAAmf,SAAMA,GAAahyB,EAE3C,OAAQgW,GACJ,IAAK,MACD,OAAO1V,KAAK2xB,sBAAsBxnB,EAAMoI,EAAMmf,GAClD,IAAK,OACD,OAAO1xB,KAAK4xB,uBAAuBznB,EAAMzK,EAAO4L,WAAaiH,EAAMmf,EAAUhyB,EAAO0M,eAAgB1M,EAAOutB,WAC/G,IAAK,QACD,OAAOjtB,KAAK6xB,wBAAwB1nB,GACxC,QACI,MAAM,IAAI7H,MAAM,0BAA0BoT,KAEtD,CAKO,mBAAAoc,CACHC,EACAC,EACAzf,GAEA,GAAIwf,EAASE,qBAAuB1f,EAAM,CAEtC,MAAMsB,EAAgC,GAAlBtB,EAAKK,MAAM7H,KAAYwH,EAAKK,MAAM5H,OAChD+I,EAA4B,GAAhBxB,EAAKO,IAAI/H,KAAYwH,EAAKO,IAAI9H,OAEhD,MAAO,CACH,qBACA,aAAa6I,4BACb,gBAJaoK,KAAKoK,IAAItU,EAAYF,EAAa,8BAK/C,UAAUme,EAAOhK,SACjB,SAASgK,EAAO/rB,KAChB,YAAY+rB,EAAOX,SACnB,YAAYW,EAAOV,UACnB,iBACA,qBACA,mBACFzW,KAAK,KACX,CAEA,GAAIkX,EAASG,cAET,MAAO,gBAAgBH,EAASI,YAAc,gBAAgBJ,EAASK,SAAW,uBAAuBJ,EAAOhK,gCAAgCgK,EAAO/rB,wBAAwB+rB,EAAOX,4BAA4BW,EAAOV,WAIzN,MAAO,iBADW/e,EAAOvS,KAAKqyB,mBAAmB9f,GAAQ,uBACJyf,EAAOhK,gCAAgCgK,EAAO/rB,wBAAwB+rB,EAAOX,4BAA4BW,EAAOV,UAE7K,CAKQ,qBAAAK,CACJ3I,EACAzW,EACAmf,GAEA,GAAIA,EACA,MAAO,CACHY,SAAU,UACVJ,eAAe,GAIvB,IAAK3f,EACD,MAAM,IAAIjQ,MAAM,+CAGpB,MAAO,CACHgwB,SAAU,QACVJ,eAAe,EACfD,qBAAqB,EAE7B,CAKQ,sBAAAL,CACJznB,EACAmB,EACAiH,EACAmf,EACAtlB,EACA6gB,GAIA,MAAMsF,EAAiBtF,EACjBjtB,KAAKwyB,gBAAgBroB,EAAM8iB,GAC3BjtB,KAAKyyB,gBAAgBtoB,EAAMmB,EAAYc,GAAkB,GACzD+lB,EAAaI,EAAiB,EAEpC,GAAIb,EACA,MAAO,CACHY,SAAU,WAAWnoB,EAAKD,QAAQC,EAAKhB,SAASgB,EAAKF,MACrDkoB,aACAC,QAAS,SACTF,eAAe,EACfR,UAAU,EACVgB,SAAUH,GAIlB,IAAKhgB,EACD,MAAM,IAAIjQ,MAAM,sDAGpB,MAAO,CACHgwB,SAAU,SAASnoB,EAAKD,QAAQC,EAAKhB,SAASgB,EAAKF,MACnDioB,eAAe,EACfD,qBAAqB,EACrBS,SAAUH,EAElB,CAKQ,uBAAAV,CAAwB1nB,GAC5B,MAAO,CACHmoB,SAAU,GAAGnoB,EAAKD,QAAQC,EAAKhB,SAASgB,EAAKF,MAC7CioB,eAAe,EAEvB,CAMO,QAAAS,CAASC,EAAYC,GACxB,MAAMzD,EAAe0D,WACjBC,iBAAiBF,GAAQG,iBAAiB,qBACzC,GACCC,EAAehV,KAAKC,MAAM0U,EAAKxD,GAC/B8D,EAAUjV,KAAKoK,IAAI,EAAGpK,KAAK4B,IAAIoT,EAAc,OACnD,MAAO,CAAEloB,KAAMkT,KAAKkV,MAAMD,EAAU,IAAKloB,OAAQkoB,EAAU,GAC/D,CAOO,eAAAT,CACHW,EACA9nB,EACAc,EAAiC,GAEjC,MAAMinB,EAAW,GAAG/nB,EAAWpB,QAAQoB,EAAWnC,SAASmC,EAAWrB,OAAOmC,IAC7E,IAAKpM,KAAKwxB,iBAAmBxxB,KAAKwxB,gBAAgBpoB,MAAQiqB,EAAU,CAChE,MAAMpG,EAAY5hB,GAAaC,EAAYc,GACrC1J,qBAAUqG,IAChBkkB,EAAUzoB,QAAQ,CAACc,EAAGnF,IAAMuC,EAAIkH,IAAI,GAAGtE,EAAE4E,QAAQ5E,EAAE6D,SAAS7D,EAAE2E,MAAO9J,IACrEH,KAAKwxB,gBAAkB,CAAEpoB,IAAKiqB,EAAU3wB,MAC5C,CAKA,OAJY1C,KAAKwxB,gBAAgB9uB,IAAI4G,IACjC,GAAG8pB,EAAUlpB,QAAQkpB,EAAUjqB,SAASiqB,EAAUnpB,QAGxC,CAClB,CAKO,eAAAuoB,CAAgBroB,EAAoBmpB,GACvC,MAAMC,EAAMD,EAAME,UACbluB,GAAMA,EAAE4E,OAASC,EAAKD,MAAQ5E,EAAE6D,QAAUgB,EAAKhB,OAAS7D,EAAE2E,MAAQE,EAAKF,KAE5E,OAAOspB,GAAO,EAAIA,EAAM,CAC5B,CAKQ,kBAAAlB,EAAmBzf,MAAEA,EAAAE,IAAOA,IAChC,MAAM2gB,EAAwB,GAAb7gB,EAAM7H,MAAa6H,EAAM5H,OAAS,GAC7C0oB,EAASD,GAAuB,GAAX3gB,EAAI/H,KAAY+H,EAAI9H,OAASyoB,GAExD,OAAIA,IAAaC,EACN,GAAGD,KAAYC,EAAS,IAG5B,GAAGD,KAAYC,GAC1B,CAKO,sBAAAC,CAAuBj0B,GAC1B,MAAMgW,SAAEA,EAAAvL,KAAUA,EAAAoI,KAAMA,EAAAmf,SAAMA,EAAAtlB,eAAUA,GAAmB1M,EAE3D,IAAIyT,EAAW,EAEf,GAAiB,SAAbuC,GAAuBnD,IAASmf,EAAU,CAE1Cve,EAAW,IAAoB,IADbnT,KAAKyyB,gBAAgBtoB,EAAMzK,EAAO4L,WAAac,GAAkB,GAC1B,IAAlBmG,EAAKK,MAAM7H,KAAawH,EAAKK,MAAM5H,MAC9E,MAAA,GAAwB,QAAb0K,GAAsBnD,IAASmf,EACtCve,EAA6B,GAAlBZ,EAAKK,MAAM7H,KAAYwH,EAAKK,MAAM5H,eACtC0mB,EACP,GAAiB,SAAbhc,EAAqB,CAErBvC,EAAW,IADOnT,KAAKyyB,gBAAgBtoB,EAAMzK,EAAO4L,WAAac,GAAkB,EAEvF,MACI+G,EAAW,EAInB,MAAO,CACHA,WACA+H,KAAM,SACN5H,UAAWtT,KAAK4zB,mBAAmBl0B,GAE3C,CAKQ,kBAAAk0B,CAAmBl0B,GACvB,MAAMyK,KAAEA,EAAAoI,KAAMA,EAAAmf,SAAMA,GAAahyB,EAiBjC,MAAO,qBAdS,GAAGyK,EAAKhB,SAASgB,EAAKF,OAAOE,EAAKD,WAI9CwnB,IAAanf,EACP,UACA,GAAG1F,OAAO0F,EAAKK,MAAM7H,MAAM8oB,SAAS,EAAG,QAAQhnB,OAAO0F,EAAKK,MAAM5H,QAAQ6oB,SACrE,EACA,WACIhnB,OAAO0F,EAAKO,IAAI/H,MAAM8oB,SAC1B,EACA,QACChnB,OAAO0F,EAAKO,IAAI9H,QAAQ6oB,SAAS,EAAG,+CAGvD,CAKO,sBAAAC,CAAuBp0B,GAC1B,MAAMqyB,EAAW/xB,KAAKyxB,kBAAkB/xB,GAExC,OAAIqyB,EAASG,cACF,uBAAuBH,EAASI,mBAAmBJ,EAASK,UAE5D,UAAUL,EAASO,WAElC,CAKO,gBAAAyB,CAAiBr0B,GAIpB,IAEI,OADAM,KAAKyxB,kBAAkB/xB,GAChB,CAAEs0B,OAAO,EACpB,OAASvI,GACL,MAAO,CACHuI,OAAO,EACPvI,MAAOA,aAAiBnpB,MAAQmpB,EAAMwI,QAAU,2BAExD,CACJ,GCzVG,MAAMC,GAKT,WAAA50B,CAAY60B,GAHZn0B,KAAQo0B,UAAsB,QAI1Bp0B,KAAKq0B,MAAQF,EACbA,EAAKxzB,cAAcX,MAEnB,MAAMwW,qBAAYpM,KAClBpK,KAAKs0B,YAAc,CACfrqB,IAAKuM,EAAM5K,UACXzC,MAAOqN,EAAM3K,WAAa,EAC1B3B,KAAMsM,EAAM1K,cAEpB,CAEA,aAAA/K,GAAuB,CAEvB,YAAI2U,GACA,OAAO1V,KAAKo0B,SAChB,CAEA,cAAI9oB,GACA,OAAOtL,KAAKs0B,WAChB,CAEA,gBAAIC,GACA,MAA0B,QAAnBv0B,KAAKo0B,UAAsBp0B,KAAKs0B,iBAAc,CACzD,CAEA,WAAAE,CAAYC,GACRz0B,KAAKo0B,UAAYK,EACjBz0B,KAAKq0B,MAAM3zB,eACf,CAEA,aAAAg0B,CAAcvqB,GACVnK,KAAKs0B,YAAcnqB,EACnBnK,KAAKq0B,MAAM3zB,eACf,CAEA,YAAAi0B,GACI,MAAMppB,EAAUvL,KAAKs0B,YAErB,GAAuB,UAAnBt0B,KAAKo0B,UAAuB,CAC5B,MAAM5I,EAAY,IAAIphB,KAAKmB,EAAQrB,KAAMqB,EAAQpC,MAAO,GACxDnJ,KAAK00B,cAAc,CACfzqB,IAAK,EACLd,MAAOqiB,EAAU3f,WAAa,EAC9B3B,KAAMshB,EAAU1f,eAExB,MAAA,GAA8B,SAAnB9L,KAAKo0B,UAAsB,CAClC,MAAMQ,EAAiB,IAAIxqB,KAAKmB,EAAQrB,KAAMqB,EAAQpC,MAAQ,EAAGoC,EAAQtB,KACzE2qB,EAAejpB,QAAQipB,EAAehpB,UAAY,GAClD5L,KAAK00B,cAAc,CACfzqB,IAAK2qB,EAAehpB,UACpBzC,MAAOyrB,EAAe/oB,WAAa,EACnC3B,KAAM0qB,EAAe9oB,eAE7B,MAAA,GAA8B,QAAnB9L,KAAKo0B,UAAqB,CACjC,MAAMS,EAAU,IAAIzqB,KAAKmB,EAAQrB,KAAMqB,EAAQpC,MAAQ,EAAGoC,EAAQtB,IAAM,GACxEjK,KAAK00B,cAAc,CACfzqB,IAAK4qB,EAAQjpB,UACbzC,MAAO0rB,EAAQhpB,WAAa,EAC5B3B,KAAM2qB,EAAQ/oB,eAEtB,MAAA,GAA8B,SAAnB9L,KAAKo0B,UAAsB,CAClC,MAAMU,EAAW,IAAI1qB,KAAKmB,EAAQrB,KAAO,EAAGqB,EAAQpC,MAAQ,EAAG,GACzD+pB,EAAU,IAAI9oB,KAAK0qB,EAAShpB,cAAeP,EAAQpC,MAAQ,EAAGoC,EAAQtB,KAExEipB,EAAQrnB,aAAeN,EAAQpC,MAAQ,GACvC+pB,EAAQvnB,QAAQ,GAEpB3L,KAAK00B,cAAc,CACfzqB,IAAKipB,EAAQtnB,UACbzC,MAAO+pB,EAAQrnB,WAAa,EAC5B3B,KAAMgpB,EAAQpnB,eAEtB,CACJ,CAEA,gBAAAipB,GACI,MAAMxpB,EAAUvL,KAAKs0B,YAErB,GAAuB,UAAnBt0B,KAAKo0B,UAAuB,CAC5B,MAAMY,EAAY,IAAI5qB,KAAKmB,EAAQrB,KAAMqB,EAAQpC,MAAQ,EAAG,GAC5DnJ,KAAK00B,cAAc,CACfzqB,IAAK,EACLd,MAAO6rB,EAAUnpB,WAAa,EAC9B3B,KAAM8qB,EAAUlpB,eAExB,MAAA,GAA8B,SAAnB9L,KAAKo0B,UAAsB,CAClC,MAAMQ,EAAiB,IAAIxqB,KAAKmB,EAAQrB,KAAMqB,EAAQpC,MAAQ,EAAGoC,EAAQtB,KACzE2qB,EAAejpB,QAAQipB,EAAehpB,UAAY,GAClD5L,KAAK00B,cAAc,CACfzqB,IAAK2qB,EAAehpB,UACpBzC,MAAOyrB,EAAe/oB,WAAa,EACnC3B,KAAM0qB,EAAe9oB,eAE7B,MAAA,GAA8B,QAAnB9L,KAAKo0B,UAAqB,CACjC,MAAMa,EAAU,IAAI7qB,KAAKmB,EAAQrB,KAAMqB,EAAQpC,MAAQ,EAAGoC,EAAQtB,IAAM,GACxEjK,KAAK00B,cAAc,CACfzqB,IAAKgrB,EAAQrpB,UACbzC,MAAO8rB,EAAQppB,WAAa,EAC5B3B,KAAM+qB,EAAQnpB,eAEtB,MAAA,GAA8B,SAAnB9L,KAAKo0B,UAAsB,CAClC,MAAMc,EAAW,IAAI9qB,KAAKmB,EAAQrB,KAAO,EAAGqB,EAAQpC,MAAQ,EAAG,GACzD+pB,EAAU,IAAI9oB,KAAK8qB,EAASppB,cAAeP,EAAQpC,MAAQ,EAAGoC,EAAQtB,KAExEipB,EAAQrnB,aAAeN,EAAQpC,MAAQ,GACvC+pB,EAAQvnB,QAAQ,GAEpB3L,KAAK00B,cAAc,CACfzqB,IAAKipB,EAAQtnB,UACbzC,MAAO+pB,EAAQrnB,WAAa,EAC5B3B,KAAMgpB,EAAQpnB,eAEtB,CACJ,CAEA,WAAAqpB,GACI,MAAM3e,qBAAYpM,KAClBpK,KAAK00B,cAAc,CACfzqB,IAAKuM,EAAM5K,UACXzC,MAAOqN,EAAM3K,WAAa,EAC1B3B,KAAMsM,EAAM1K,eAEpB,CAEA,iBAAAspB,GACIp1B,KAAKw0B,YAAY,QACrB,CAEA,gBAAAa,GACIr1B,KAAKw0B,YAAY,OACrB,CAEA,eAAA/H,GACIzsB,KAAKw0B,YAAY,MACrB,CAEA,gBAAAc,GACIt1B,KAAKw0B,YAAY,OACrB,ECzHJ,SAASe,GAAa1C,EAAiB2C,EAActkB,GACjD,OAAO6hB,iBAAiBF,GAAQG,iBAAiBwC,GAAMvP,QAAU/U,CACrE,CAKA,SAASukB,GAAM30B,EAAe+e,EAAawI,GACvC,OAAOpK,KAAKoK,IAAIxI,EAAK5B,KAAK4B,IAAIwI,EAAKvnB,GACvC,CA8BO,SAAS40B,GACZpqB,EACAc,EACAupB,EACA9C,GAGA,MAAM+C,EAAU7K,SAASwK,GAAa1C,EAAQ,mBAAoB,KAAM,IAClEgD,EAAYJ,GAAM1uB,OAAOiV,MAAM4Z,GAAW,EAAIA,EAAS,EAAG,GAC1DE,EAAY/K,SAASwK,GAAa1C,EAAQ,0BAA2B,KAAM,IAC3EkD,EAAcN,GAAM1uB,OAAOiV,MAAM8Z,GAAa,EAAIA,EAAW,EAAG,GAChEE,EAAgBjL,SAASwK,GAAa1C,EAAQ,2BAA4B,OAAQ,IAIlFoD,EAAiBN,GAHJ5uB,OAAOiV,MAAMga,GAAiB,IAAMA,GAGHD,EAAcF,EAG5D5I,EAAY5hB,GAAaC,EAAYc,GAG3C,GAAI6pB,GAAkB,EAClB,MAAO,CACHhJ,YACAlB,aAAckB,EACdtB,kBAAmB,EACnBC,cAAe,EACfsK,aAAa,EACbC,YAAa,2CAKrB,MAAMC,EA1DV,SAA6BnJ,EAA2B3hB,GACpD,MAAMioB,EAAMtG,EAAUuG,UACjBluB,GAAMA,EAAE4E,OAASoB,EAAWpB,MAAQ5E,EAAE6D,QAAUmC,EAAWnC,OAAS7D,EAAE2E,MAAQqB,EAAWrB,KAE9F,OAAOspB,GAAO,EAAIA,EAAM,CAC5B,CAqDwB8C,CAAoBpJ,EAAW3hB,GAC7CqgB,EAhDV,SAA6ByK,EAAqBlc,GAG9C,OAAOub,GADYW,EAAcnY,KAAKkV,OAAOjZ,EAAQ,GAAK,GACjC,EAAG,EAAIA,EACpC,CA4C8Boc,CAAoBF,EAAaH,GACrDlK,EAAekB,EAAU5pB,MAAMsoB,EAAmBA,EAAoBsK,GAE5E,MAAO,CACHhJ,YACAlB,eACAJ,oBACAC,cAAeqK,EACfC,aAAa,EACbC,YAAa,mCAAmCF,UAExD,sMC9DA,IAAqBM,GAArB,cAAyCpqB,EAAzC,WAAA7M,GAAAgC,SAAAC,WAKIvB,KAAAoM,eAAiC,EAGjCpM,KAAA6I,OAA8B,oBAAbyd,UAA4BA,SAASkQ,gBAAgBC,MAAS,KAG/Ez2B,KAAA02B,gBAA+B,QAG/B12B,KAAA22B,gBAA+B,MAE/B32B,KAAQ42B,WAAa,IAAI1C,GAAoBl0B,MAW7CA,KAAAkD,QAA2B,GAG3BlD,KAAA4uB,MAAQ,UAMC5uB,KAAA62B,eAA4C,oBAAXv2B,QAA0BA,OAAOw2B,YAAe,KAEjF92B,KAAA+2B,WAAY,EAWrB/2B,KAAQg3B,kBAAqC,GAO7Ch3B,KAAQi3B,iBAA4C,GAGpDj3B,KAAQk3B,iBAIH,GAGLl3B,KAAQm3B,eAAyC,CAAA,EAGjDn3B,KAAQo3B,sCAAyBruB,IAGjC/I,KAAQq3B,gCAAmBtuB,IAG3B/I,KAAQs3B,sCAAyBvuB,IASjC/I,KAAQu3B,kBAAoB,IAAIpI,GAAiB,CAC7CqI,gBAAiB,GACjBpI,aAAc,EACdC,eAAgB,GAChBoI,cAAe,GACfC,YAAa,KAGjB13B,KAAQ23B,cAAiBz0B,IACrB,MAAO00B,GAAO10B,EAEdlD,KAAK62B,eAAiBe,EAAIC,YAAY7P,OAAShoB,KAAK62B,gBAGxD72B,KAAQ83B,kBAA4C,IAAIC,EAAuB/3B,KAAM,CACjFR,OAAQ,KACRI,SAAUI,KAAK23B,cACf73B,aAAa,IAiQjBE,KAAQg4B,oBAAuBn4B,IAC3B,IAAKG,KAAK+2B,UAAW,OAErB,MAAMkB,EAAOp4B,EAAEq4B,eACTC,EAASn4B,KAAKgqB,YAAY3C,cAAc,YAExC+Q,EAAoBD,GAAUF,EAAK3xB,SAAS6xB,GAC5CE,EAAiBJ,EAAKzyB,KACvB8yB,GAAOA,aAAcvhB,aAA8B,uBAAfuhB,EAAGC,SAGvCH,GAAsBC,GACvBr4B,KAAKw4B,gCAIbx4B,KAAQy4B,cAAiB54B,IACP,WAAVA,EAAEuJ,KAAoBpJ,KAAK+2B,WAC3B/2B,KAAKw4B,+BAEb,CAxWA,cAAIltB,GACA,OAAOtL,KAAK42B,WAAWtrB,UAC3B,CAEA,cAAIA,CAAWxK,GACXd,KAAK42B,WAAWlC,cAAc5zB,EAClC,CAQA,iBAAI43B,GACA,OAAO14B,KAAK42B,WAAWrC,YAC3B,CA+SS,oBAAAoE,GACLr3B,MAAMq3B,uBAENrS,SAAShR,oBAAoB,QAAStV,KAAKg4B,qBAAqB,GAChE1R,SAAShR,oBAAoB,UAAWtV,KAAKy4B,cACjD,CAEmB,OAAAvlB,CACf0lB,GAEIA,EAAkB3R,IAAI,eAClBjnB,KAAK+2B,WACLzQ,SAAS1U,iBAAiB,QAAS5R,KAAKg4B,qBAAqB,GAC7D1R,SAAS1U,iBAAiB,UAAW5R,KAAKy4B,iBAE1CnS,SAAShR,oBAAoB,QAAStV,KAAKg4B,qBAAqB,GAChE1R,SAAShR,oBAAoB,UAAWtV,KAAKy4B,gBAGzD,CAwBQ,4BAAAD,GACJx4B,KAAK+2B,WAAY,EACjB/2B,KAAK64B,uBAAoB,EACzB74B,KAAK84B,wBACL94B,KAAKgqB,YAAY9E,iBAAiB,sBAAsB1gB,QAASu0B,IAC5DA,EAA2B9kB,kBAEpC,CAEQ,qBAAA6kB,GACA94B,KAAKg5B,oBACLh5B,KAAKg5B,kBAAkBxT,QACvBxlB,KAAKg5B,uBAAoB,EAEjC,CAEmB,YAAAC,CACfC,GAEA,MAAMC,EAAoBn5B,KAAKgqB,YAAYmP,kBACtCA,GAILn5B,KAAK83B,kBAAkB92B,QAAQm4B,EACnC,CAWmB,UAAAC,CACfR,GAEA,GAAKA,EAAkB3R,IAAI,WAA3B,CAIA,IAAKjnB,KAAKkD,QAAQjB,OAGd,OAFAjC,KAAKg3B,kBAAoB,QACzBh3B,KAAKq5B,oBAITr5B,KAAKg3B,kBAAoBsC,EACrBt5B,KAAKkD,Q7C/diE,YAAc3D,GAAG,OAAOM,EAAEE,EAAER,EAAEY,EAAE,C6CgetGo5B,CAAUR,IAEDA,EAAMxmB,MACJinB,EAASC,cACZ/vB,EAASmM,WAAW6jB,EAAQX,EAAM5uB,KAAKyI,MAAOmmB,EAAMxmB,KAAKK,QACzDlJ,EAASmM,WAAW6jB,EAAQX,EAAM5uB,KAAK2I,IAAKimB,EAAMxmB,KAAKO,OACzDiW,SzCteiB,YAAcxpB,GAAG,OAAOM,EAAEmC,EAAEzC,EAAE,CyCwerDo6B,CAAO,CAACl3B,EAAGoD,KACP,MAAM+zB,EAAQn3B,EAAE8P,MAAMK,MAAM7H,MAAQ,EAC9B8uB,EAAQh0B,EAAE0M,MAAMK,MAAM7H,MAAQ,EAC9B+uB,EAAOr3B,EAAE8P,MAAMK,MAAM5H,QAAU,EAC/B+uB,EAAOl0B,EAAE0M,MAAMK,MAAM5H,QAAU,EACrC,OAAO4uB,EAAQC,GAASC,EAAOC,KAIvC/5B,KAAKg6B,qBA3BL,CA4BJ,CAMQ,iBAAAX,GACJr5B,KAAKi3B,iBAAmB,GACxBj3B,KAAKk3B,iBAAmB,GACxBl3B,KAAKm3B,eAAiB,CAAA,EACtBn3B,KAAKo3B,mBAAmB6C,QACxBj6B,KAAKq3B,aAAa4C,QAClBj6B,KAAKs3B,mBAAmB2C,OAC5B,CAEQ,mBAAAD,GAIJh6B,KAAKi3B,iBAAmBj3B,KAAKg3B,kBAAkBpY,QAAQ,CAACma,EAAOl2B,IAC3D7C,KAAKk6B,kBAAkB,CACnBnB,QACAvU,MAAOxkB,KAAKm6B,cAAcpB,EAAM5uB,MAChCkmB,cAAextB,KAKvB7C,KAAKo3B,mBAAmB6C,QACxB,IAAA,MAAWlB,KAAS/4B,KAAKi3B,iBAAkB,CACvC,MAAM/sB,KAAEA,EAAAf,MAAMA,EAAAc,IAAOA,GAAQ8uB,EAAM5uB,KAAKyI,MAClCxJ,EAAM,GAAGc,KAAQ2C,OAAO1D,GAAO0qB,SAAS,EAAG,QAAQhnB,OAAO5C,GAAK4pB,SAAS,EAAG,OACjF,IAAIuG,EAASp6B,KAAKo3B,mBAAmB9tB,IAAIF,GACpCgxB,IACDA,EAAS,GACTp6B,KAAKo3B,mBAAmBxtB,IAAIR,EAAKgxB,IAErCA,EAAOr3B,KAAKg2B,EAChB,CAGA/4B,KAAKk3B,iBAAmBoC,EACpBt5B,KAAKi3B,iBxC5hBiC,YAAc13B,GAAG,OAAOM,EAAEmC,EAAEzC,EAAE,CwC6hBpE86B,CAAUtB,GACaA,EAAMuB,cAAcrT,MAAO,EAC1B8R,EAAM1I,cAAgB,IAAO0I,EAAM1I,e3C/hBpC,YAAc9wB,GAAG,OAAOM,EAAEmC,EAAEzC,EAAEQ,EAAE,C2CiiBvDw6B,CAAOxB,IACH,MAAOyB,GAAc7L,GAAyBoK,EAAMnK,OACpD,MAAO,CAAEmK,QAAOyB,aAAYnK,cAAe0I,EAAM1I,kBAKzDrwB,KAAKm3B,eAAiB,CAAA,EACtB,IAAA,MAAW4B,KAAS/4B,KAAKi3B,iBAAkB,CACvC,MAAM7tB,EAAM,GAAG2vB,EAAM5uB,KAAKyI,MAAM1I,QAAQ6uB,EAAM5uB,KAAKyI,MAAMzJ,SAAS4vB,EAAM5uB,KAAKyI,MAAM3I,MACnFjK,KAAKm3B,eAAe/tB,IAAQpJ,KAAKm3B,eAAe/tB,IAAQ,GAAK,CACjE,CAGApJ,KAAKq3B,aAAa4C,QAClBj6B,KAAKs3B,mBAAmB2C,OAC5B,CAES,MAAAx4B,GACL,MAAMiU,EAAW1V,KAAK42B,WAAWlhB,SAC3B+kB,EAAoBz6B,KAAK42B,WAAWtrB,WAE1C,OAAOgB,CAAA;;;;sCAIuBtM,KAAK06B;sCACL16B,KAAK26B;qCACN36B,KAAK46B;mCACP56B,KAAKoR;sCACFqpB;oCACF/kB;wCACiB,QAAbA,EAAqB+kB,OAAoB;kCAC/Cz6B,KAAK6I;;;;;qEAK8B8H,GAAY3Q,KAAK6I,QAAQ6M,MAAa/E,GAAY3Q,KAAK6I,QAAQgyB,oBAAoBC,EAAuB,SAAbplB,EAAsB;sBAEnJ,UAAbA,EACMpJ,CAAA;;oDAEsBtM,KAAKoM;4CACbpM,KAAK6I;;;;4CAIL7I,KAAK+6B;+CACF/6B,KAAKg7B;4DACQh7B,KAAKi7B;gDACjBR;oDACIz6B,KAAKoM;4CACbpM,KAAK6I;;oCAGX7I,KAAK62B,eAAiB,IAChB72B,KAAKk7B,yBACLl7B,KAAKm7B;;4BAInB7tB;sBAGO,SAAboI,QAEU,MAAM0lB,EAAM1F,GACR+E,EACAz6B,KAAKoM,eACLpM,KAAK62B,eACL72B,MAEEq7B,EAASr7B,KAAKs7B,qBAAqBF,GACzC,OAAO9uB,CAAA;;oDAEWtM,KAAK+6B;2DACE/6B,KAAK6sB;uDACT7sB,KAAKg7B;oEACQh7B,KAAKi7B;wDACjBR;4DACIY,EAAOnuB;4DACPlN,KAAKoM;oDACbpM,KAAK6I;0DACCuyB,EAAIrP;+DACCqP,EAAIzP;2DACRyP,EAAIxP;kDACb2P,EAAS,CACb,+BAAgCH,EAAIjF;;4CAGtCkF,EAAOG;;mCAGrB,KACAluB;sBAGO,QAAboI,QAEU,MAAM2lB,EAASr7B,KAAKs7B,uBACpB,OAAOhvB,CAAA;;uDAEctM,KAAKg7B;oEACQh7B,KAAKi7B;4DACbI,EAAOnuB;oDACflN,KAAK6I;;4CAEbwyB,EAAOG;;mCAGrB,KACAluB;sBAGO,SAAboI,EACMpJ,CAAA;;4CAEctM,KAAK+6B;gDACDN;oDACIz6B,KAAKoM;4CACbpM,KAAK6I;mDACE7I,KAAKm3B;iDACPn3B,KAAK02B;iDACL12B,KAAK22B;;4BAGxBrpB;;;;4BAKFtN,KAAK+2B;oCAET/2B,KAAK64B,mBAAqB,CACtBznB,QAAS,GACTY,QAAS,GACTgD,YAAa;kCAGPhV,KAAK64B,mBAAmB3jB;8BAC5BlV,KAAK6I;kCACD7I,KAAKy7B;;;SAInC,CAEQ,iBAAAf,CAAkB76B,GACK,SAAvBA,EAAEwU,OAAOuC,UACT5W,KAAK42B,WAAWjC,eACc,aAAvB90B,EAAEwU,OAAOuC,WAChB5W,KAAK42B,WAAW7B,kBAExB,CAEQ,iBAAA4F,CAAkB96B,GACtB,OAAOyE,GAAMzE,EAAEwU,OAAO2C,MACjB/E,KAAK,MAAO,IAAMjS,KAAK42B,WAAWnK,mBAClCxa,KAAK,OAAQ,IAAMjS,KAAK42B,WAAWvB,oBACnCpjB,KAAK,QAAS,IAAMjS,KAAK42B,WAAWxB,qBACpCnjB,KAAK,OAAQ,IAAMjS,KAAK42B,WAAWtB,oBACnCjtB,UAAU,OACnB,CAEQ,gBAAAuyB,CAAiB1mB,GACrBlU,KAAK42B,WAAWzB,aACpB,CAEQ,mBAAAtI,CAAoBhtB,GAExBG,KAAK42B,WAAWlC,cAAc70B,EAAEwU,OAAOlK,KAC3C,CAEQ,aAAA4wB,CAAcl7B,GAClBG,KAAK42B,WAAWlC,cAAc70B,EAAEwU,OAAOlK,MACvC,MAAM3K,EAASK,EAAEwU,OAAOgZ,aAAe,MACxB,UAAX7tB,EACAQ,KAAK42B,WAAWxB,oBACE,SAAX51B,EACPQ,KAAK42B,WAAWvB,mBAEhBr1B,KAAK42B,WAAWnK,iBAExB,CAEQ,eAAAuO,CAAgBn7B,GAGpB,MAAM67B,EAAe77B,EAAEL,OACvBQ,KAAKgqB,YAAY9E,iBAAiB,sBAAsB1gB,QAASu0B,IACzDA,IAAU2C,GACT3C,EAA2B9kB,mBAGpCjU,KAAKg5B,kBAAoB0C,EACzB17B,KAAK27B,SAAS97B,EAAEwU,OACpB,CAEQ,2BAAA4mB,CAA4Bp7B,GAEhC,MAAM+7B,EAAe/7B,EAAEwU,OAAOC,YAC9BtU,KAAKgqB,YAAY9E,iBAAiB,sBAAsB1gB,QAASu0B,IACzDA,IAAU6C,GACT7C,EAA2B9kB,kBAGxC,CAEQ,gBAAAwnB,GACJz7B,KAAK+2B,WAAY,EACjB/2B,KAAK64B,uBAAoB,EACzB74B,KAAK84B,uBACT,CAEO,QAAA6C,CAAS9mB,GAQZ7U,KAAK64B,kBAAoBhkB,EACzB7U,KAAK+2B,WAAY,CACrB,CAEQ,aAAA8E,EAAch5B,MAClBA,EAAAi5B,KACAA,EAAAC,YACAA,EAAAhD,MACAA,EAAA1nB,eACAA,GAAiB,EAAAC,QACjBA,EAAAC,YACAA,EAAc,UAAAC,UACdA,GAAY,EAAAwqB,UACZA,IAmBA,MAAMC,EAAoB3qB,GAAWtR,KAAKk8B,kBAAkBnD,cAAkB,GAE9E,OAAOzsB,CAAA;;wBAES,IAAIzJ,IAAQm5B,EAAY,IAAIA,IAAc;uBAC3CF;wBACCC;wBACAhD,EAAMxmB;2BACHwmB,EAAM3nB,SAAW;2BACjB2nB,EAAM/mB;kCACCX,IAAkB;wBAC5B0nB,EAAM5uB;2BACH8xB;+BACI1qB;6BACFC;iCACIunB,EAAM3lB;0BACbpT,KAAK6I;;;SAI3B,CAEQ,iBAAAqzB,CACJnD,EACAtJ,EACA5sB,GAEA,IAAKk2B,EAAMxmB,KAAM,MAAO,UAIxB,GAAIkd,QAAqB,IAAV5sB,GAAuB4sB,EAAQ5sB,GAK1C,MAAO,WAGX,MAAMs5B,EAC8C,IAA/CpD,EAAMxmB,KAAKO,IAAI/H,KAAOguB,EAAMxmB,KAAKK,MAAM7H,OACvCguB,EAAMxmB,KAAKO,IAAI9H,OAAS+tB,EAAMxmB,KAAKK,MAAM5H,QAG9C,OAAImxB,EAAkB,GACX,UAGPA,EAAkB,KAAOpD,EAAM/mB,QACxB,OAGJ,UACX,CAIQ,iBAAAkoB,EAAkBnB,MACtBA,EAAAvU,MACAA,EAAA6L,cACAA,IAMA,OAAO3sB,MAAM8F,KAAK,CAAEvH,OAAQuiB,EAAM,IAAM,CAAC/a,EAAG5G,KACxC,MAAMu5B,EAAmB1yB,EAAS2yB,WAAW7X,EAAM,IAAI4E,KAAK,CACxD3N,KAAM5Y,IAEJy5B,EAAiBF,EAAiBhT,KAAK,CAAE3N,KAAM,IAAK8gB,MAAM,CAAE3gB,QAAS,IAmB3E,MAlBqB,IACdmd,EACH5uB,KAAM,CACFyI,MAAOwpB,EAAiBI,WACxB1pB,IAAKwpB,EAAeE,YAExBnrB,eAAgBxO,EAAQ,EACxBy3B,aAAc,CACVrT,IAAKzC,EAAM,GAAK,EAChB1f,GAAIjC,EAAQ,EACZA,QACA45B,MAAOjY,EAAM,IAGjBkY,kBAAmB3D,EAAM5uB,MAAMyI,MAC/Byd,kBAKZ,CAEQ,wBAAAsM,CACJ5D,GAQA,MAIM6D,EAJgB7D,EAIS2D,mBAAqB3D,EAAM5uB,MAAMyI,MAEhE,OAAKgqB,EAKE,GAAG7D,EAAM3nB,SAAW,aAAawrB,EAAS1yB,QAC7C0yB,EAASzzB,SACTyzB,EAAS3yB,OAAO8uB,EAAMxmB,MAAMK,MAAM7H,MAAQ,KAAKguB,EAAMxmB,MAAMK,MAAM5H,QAAU,IANpE,GAAG+tB,EAAM3nB,SAAW,oBAOnC,CAEQ,cAAA+pB,GACJ,OAAKn7B,KAAKk3B,iBAAiBj1B,OAMpBjC,KAAKk3B,iBAAiBx0B,IAAI,EAAGq2B,QAAOyB,aAAYnK,oBACnD,MACMwM,EADa9D,EAAM1nB,gBAAkB0nB,EAAMuB,cAAcrT,MAAO,EACtC,WAAa,GAE7C,OAAOjnB,KAAK67B,cAAc,CACtBh5B,MAAOwtB,EACPyL,KAAM,GAAGe,IAAa9D,EAAM5uB,KAAKyI,MAAM1I,QAAQ6uB,EAAM5uB,KAAKyI,MAAMzJ,SAAS4vB,EAAM5uB,KAAKyI,MAAM3I,MAC1F8xB,YAAa,kBAAkBvB,gCAAyCA,eAAwB,IAAMnK,IACtG0I,MAAO,CACHxmB,KAAMwmB,EAAMxmB,KACZnB,QAAS2nB,EAAM3nB,QACfY,QAAS+mB,EAAM/mB,QACf7H,KAAM4uB,EAAM5uB,KACZkH,eAAgB0nB,EAAM1nB,iBAAkB,EACxCipB,aAAcvB,EAAMuB,cAExBhpB,QAAStR,KAAKk8B,kBACV,CACI3pB,KAAMwmB,EAAMxmB,KACZnB,QAAS2nB,EAAM3nB,QACfY,QAAS+mB,EAAM/mB,cAEnB,OACA,GAEJT,YAAa,gBA9BVjE,CAiCf,CAEQ,oBAAAguB,CAAqBwB,GACzB,MAAMrC,EAAoBz6B,KAAK42B,WAAWtrB,WACpCoK,EAAW1V,KAAK42B,WAAWlhB,SAEjC,GAAiB,QAAbA,GAAmC,SAAbA,EACtB,MAAO,CAAE8lB,SAAUluB,EAASJ,eAAgB,GAIhD,IAAI6vB,EAEJ,GAAiB,QAAbrnB,EAAoB,CACpB,MAAMtM,EAAM,GAAGqxB,EAAkBvwB,QAAQ2C,OAAO4tB,EAAkBtxB,OAAO0qB,SAAS,EAAG,QAAQhnB,OAAO4tB,EAAkBxwB,KAAK4pB,SAAS,EAAG,OACvIkJ,EAAoB/8B,KAAKo3B,mBAAmB9tB,IAAIF,IAAQ,EAC5D,KAAO,CAIH2zB,GADID,GAAS/Q,cAAgB1gB,GAAaovB,EAAmBz6B,KAAKoM,iBAChCwS,QAASmP,IACvC,MAAM3kB,EAAM,GAAG2kB,EAAG7jB,QAAQ2C,OAAOkhB,EAAG5kB,OAAO0qB,SAAS,EAAG,QAAQhnB,OAAOkhB,EAAG9jB,KAAK4pB,SAAS,EAAG,OAC1F,OAAO7zB,KAAKo3B,mBAAmB9tB,IAAIF,IAAQ,IAEnD,CAGA,MAAM4zB,EAAyC,GACzCC,EAAyC,GAC/C,IAAA,MAAWlE,KAASgE,GACf/8B,KAAKk9B,qBAAqBnE,GAASiE,EAAgBC,GAAel6B,KAAKg2B,GAG5E,OAAKkE,EAAch7B,QAAW+6B,EAAc/6B,OAKrCjC,KAAKm9B,8BACRznB,EACA+kB,EACAuC,EACAC,EACAH,GATO,CAAEtB,SAAUluB,EAASJ,eAAgB,EAWpD,CAEQ,6BAAAiwB,CACJznB,EACA+kB,EACAuC,EACAC,EACAH,GAEA,MAAMM,EAAuD,GAG7D,GAAIH,EAAch7B,OAAS,EAAG,CAE1B,MAAMo7B,EAAiB,IAAIt0B,IAAIk0B,EAAcv6B,IAAI,CAACq2B,EAAO54B,IAAM,CAAC44B,EAAO54B,KAEvE,GAAiB,SAAbuV,EAAqB,CAErB,MAAM4nB,E5Cx/Ba,YAAc/9B,GAAG,OAAOM,EAAEmC,EAAEzC,EAAE,C4Cw/B5Bg+B,CACjBN,EACClE,GACG,GAAGA,EAAM5uB,KAAKyI,MAAM1I,QAAQ6uB,EAAM5uB,KAAKyI,MAAMzJ,SAAS4vB,EAAM5uB,KAAKyI,MAAM3I,OAGzEuzB,EAAiBV,GAAS5G,YAAc4G,EAAQ/Q,kBAAe,EAG/DI,EACFqR,GAAkBnyB,GAAaovB,EAAmBz6B,KAAKoM,gBAE3D,IAAA,MAAW2hB,KAAM5B,EAAe,CAC5B,MAAMsR,EAAaH,EAAa,GAAGvP,EAAG7jB,QAAQ6jB,EAAG5kB,SAAS4kB,EAAG9jB,OAC7D,IAAKwzB,GAAYx7B,OAAQ,SAEzB,MAAMy7B,EAAc19B,KAAK29B,iCACrBF,EACA/nB,EACA+kB,EACA4C,EACAG,GAEJJ,EAAYr6B,QAAQ26B,EACxB,CACJ,KAAO,CAEH,MAAMA,EAAc19B,KAAK29B,iCACrBV,EACAvnB,EACA+kB,EACA4C,GAEJD,EAAYr6B,QAAQ26B,EACxB,CACJ,CAGA,MAAME,EAA0Bd,GAAS5G,YAAc4G,EAAQ/Q,kBAAe,EACxE8R,EACW,SAAbnoB,EACM,GAAG+kB,EAAkBvwB,QAAQuwB,EAAkBtxB,SAASsxB,EAAkBxwB,OAAOjK,KAAKoM,kBAAkB0wB,GAASnR,mBAAqB,KAAKmR,GAASlR,eAAiB,IACrK,OAAO6O,EAAkBvwB,QAAQuwB,EAAkBtxB,SAASsxB,EAAkBxwB,MAExF,IAAI6zB,EAAe99B,KAAKs3B,mBAAmBhuB,IAAIu0B,GAC/C,IAAKC,EAAc,CACf,MAAMC,EAAoCf,EAAct6B,IAAKq2B,IAYlD,CACHlpB,GAZY7P,KAAK28B,yBAAyB5D,GAa1Ctd,KAAM,CAXO,SAAb/F,EACMkoB,EACIrM,GAAYiB,gBAAgBuG,EAAM5uB,KAAKyI,MAAOgrB,GAC9CrM,GAAYkB,gBACRsG,EAAM5uB,KAAKyI,MACX6nB,EACAz6B,KAAKoM,gBAEb,GAINqH,WAAYslB,EAAMuB,cAAcx1B,IAAMi0B,EAAMuB,cAAcrT,MAAO,KAInE+W,qBAAmBj1B,IACzBg1B,EAAmBv5B,QAASkS,IACxB,MAAMunB,EAAWD,EAAa10B,IAAIoN,EAAM7G,IACpCouB,EACAA,EAASxiB,KAAK1Y,QAAQ2T,EAAM+E,MAE5BuiB,EAAap0B,IAAI8M,EAAM7G,GAAI,IAAK6G,EAAO+E,KAAM,IAAI/E,EAAM+E,UAI/D,MAAQyiB,eAAAA,EAAgBC,UAAAA,GCpjC7B,SAA4BzP,GAC/B,MAAM0P,qBAAgBr1B,IAEtB,GAAsB,IAAlB2lB,EAAOzsB,OACP,MAAO,CAAEi8B,eAAgBE,EAAWD,UAAW,GAGnD,MAAME,EAAgC,GAChCC,EAAiC,GAEvC5P,EAAOlqB,QAASkS,IACRA,EAAMjD,WACN4qB,EAAet7B,KAAK2T,GAEpB4nB,EAAgBv7B,KAAK2T,KAK7B2nB,EAAep6B,KAAK,CAACxB,EAAGoD,KACpB,MAAM04B,EAAUtgB,KAAK4B,OAAOpd,EAAEgZ,MACxB+iB,EAAUvgB,KAAK4B,OAAOha,EAAE4V,MAC9B,OAAI8iB,IAAYC,EAAgBD,EAAUC,EACnC/7B,EAAEoN,GAAG4uB,cAAc54B,EAAEgK,MAIhCyuB,EAAgBr6B,KAAK,CAACxB,EAAGoD,IACRoY,KAAK4B,OAAOpd,EAAEgZ,MACdwC,KAAK4B,OAAOha,EAAE4V,OAK/B,MAAMijB,qBAAmB31B,IACzB,IAAA,IAASkB,EAAM,EAAGA,EAAM,EAAGA,IACvBy0B,EAAa90B,IAAIK,iBAAK,IAAIhK,KAI9Bo+B,EAAe75B,QAASkS,IACpB,IAAIioB,EAAc,EACdC,GAAW,EAEf,MAAQA,GAAU,CACd,IAAIC,GAAe,EACnB,IAAA,MAAW50B,KAAOyM,EAAM+E,KACpB,GAAIijB,EAAap1B,IAAIW,IAAMgd,IAAI0X,GAAc,CACzCE,GAAe,EACf,KACJ,CAGJ,GAAIA,EAAc,CACdD,GAAW,EACXR,EAAUx0B,IAAI8M,EAAM7G,GAAI8uB,GACxB,IAAA,MAAW10B,KAAOyM,EAAM+E,KACpBijB,EAAap1B,IAAIW,IAAM7J,IAAIu+B,EAEnC,MACIA,GAER,IAIJL,EAAgB95B,QAASkS,IACrB,MAAMzM,EAAMyM,EAAM+E,KAAK,GACvB,IAAIkjB,EAAc,EAElB,KAAOD,EAAap1B,IAAIW,IAAMgd,IAAI0X,IAC9BA,IAGJP,EAAUx0B,IAAI8M,EAAM7G,GAAI8uB,GACxBD,EAAap1B,IAAIW,IAAM7J,IAAIu+B,KAI/B,IAAIG,EAAU,EAKd,OAJAJ,EAAal6B,QAASu6B,IAClBD,EAAU7gB,KAAKoK,IAAIyW,EAASC,EAAKC,QAG9B,CAAEd,eAAgBE,EAAWD,UAAWW,EACnD,CD+9BkDG,CAClCv7B,MAAM8F,KAAKw0B,EAAa/4B,WAG5B64B,EAAe,CAAEI,eAAAA,EAAgBF,aAAAA,EAAcG,UAAAA,GAC/Cn+B,KAAKs3B,mBAAmB1tB,IAAIi0B,EAAWC,EAC3C,CAEA,MAAMI,eAAEA,EAAAF,aAAgBA,EAAAG,UAAcA,GAAcL,EAqEpD,MAAO,CAAEtC,SAAU,IAlEIwB,EAAct6B,IAAI,CAACq2B,EAAOl2B,KAC7C,MAAO23B,EAAY0E,GAAQvQ,GAAyBoK,EAAMnK,OACpDuQ,EAAUn/B,KAAK28B,yBAAyB5D,GAExCqG,EAAiC,CACnC1pB,WACAvL,KAAM4uB,EAAM5uB,KAAKyI,MACjB8e,UAAU,EACVpmB,WAAYmvB,EACZruB,eAAgBpM,KAAKoM,eACrB6gB,UAAW2Q,GAGT7L,EAAWR,GAAYE,kBAAkB2N,GACzChsB,EAAgBme,GAAYoC,uBAAuByL,GACnDC,EAAMnB,EAAe50B,IAAI61B,IAAY,EACrCG,EAAqC,CACvCtX,MAAO,IACP/hB,EAAG,EACHorB,OAAQ,IAAMgO,EACd/N,QAAS,GAGPiO,EAAchO,GAAYO,oBAAoBC,EAAUuN,GAGxDhF,EAAgBvB,EACjBuB,aAEL,IAAI0B,EAAY,aAChB,IAFmB1B,GAAcrT,KAAOqT,GAAcx1B,KAAM,IAE1Cw1B,EAAc,CAC5B,MAAMkF,EAAcxB,EAAa10B,IAAI61B,GAE/BM,EAAa,IADCD,GAAa/jB,MAAQ,IACLxX,KAAK,CAACxB,EAAGoD,IAAMpD,EAAIoD,GACjD6sB,EACW,SAAbhd,EACMkoB,EACIrM,GAAYiB,gBAAgBuG,EAAM5uB,KAAKyI,MAAOgrB,GAC9CrM,GAAYkB,gBACRsG,EAAM5uB,KAAKyI,MACX6nB,EACAz6B,KAAKoM,gBAEb,EACV4vB,ECjhCT,SAA0BjD,GAM7B,MAAM2G,kBAAEA,EAAAC,UAAmBA,EAAAhU,kBAAWA,EAAAiU,gBAAmBA,GAAoB7G,EAE7E,GAAI4G,GAAa,EACb,MAAO,aAGX,MAAME,EAAUH,IAAsB/T,EAChCmU,EAASJ,IAAsBE,EAErC,OAAIC,GAAWC,EACJ,aAEPD,EACO,YAEPC,EACO,WAEJ,YACX,CDw/B4BC,CAAiB,CACzBL,kBAAmBhN,EACnBiN,UAAWrF,EAAamC,MACxB9Q,kBAAmB8T,EAAW,IAAM/M,EACpCkN,gBAAiBH,EAAWA,EAAWx9B,OAAS,IAAMywB,GAE9D,CAEA,OAAO1yB,KAAK67B,cAAc,CACtBh5B,MAAOA,EAAQo6B,EAAch7B,OAC7B65B,KAAM/J,EAASO,SACfyJ,YAAa,6BAA6BvB,qBAA8B0E,aAAgBG,MAAQE,IAChGxG,MAAO,IACAA,EACH3lB,iBAEJ9B,QAAS,WACTE,WAAW,EACXwqB,mBAIkCoB,GAAclwB,eAAgBixB,EAC5E,CAEQ,gCAAAR,CACJF,EACA/nB,EACA+kB,EACA4C,EACAG,GAGA,MAAMrY,EAAQsY,EAAW,GACnBpK,EAAW,GAAGlO,EAAMhb,KAAKyI,MAAM1I,QAAQ2C,OAAOsY,EAAMhb,KAAKyI,MAAMzJ,OAAO0qB,SAAS,EAAG,QAAQhnB,OAAOsY,EAAMhb,KAAKyI,MAAM3I,KAAK4pB,SAAS,EAAG,OAGzI,IAAI7B,EAAShyB,KAAKq3B,aAAa/tB,IAAI+pB,GACnC,IAAKrB,EAAQ,CACT,MAAMgO,EAAevC,EAAW/6B,IAAI,CAACq2B,EAAOl2B,KAAA,CACxCgN,GAAIhD,OAAOhK,GACXuO,QAAS2nB,EAAM3nB,SAAW,GAC1Bye,UAAW,CACP9kB,KAAMguB,EAAMxmB,KAAMK,MAAM7H,KACxBC,OAAQ+tB,EAAMxmB,KAAMK,MAAM5H,QAE9B8kB,QAAS,CACL/kB,KAAMguB,EAAMxmB,KAAMO,IAAI/H,KACtBC,OAAQ+tB,EAAMxmB,KAAMO,IAAI9H,QAE5B4jB,MAAOmK,EAAMnK,OAAS,aAE1BoD,EAAShyB,KAAKu3B,kBAAkBjI,gBAAgB0Q,GAChDhgC,KAAKq3B,aAAaztB,IAAIypB,EAAUrB,EACpC,CAGA,OAAOyL,EAAW/6B,IAAI,CAACq2B,EAAOl2B,KAC1B,MAAMo9B,EAAYjO,EAAOrC,MAAM9sB,GACzBq9B,EAAc7C,EAAe/zB,IAAIyvB,IAAUl2B,EAG3Cu8B,EAAiC,CACnC1pB,WACAvL,KAAM4uB,EAAM5uB,KAAKyI,MACjBL,KAAMwmB,EAAMxmB,KACZjH,WAAYmvB,EACZ/I,SAAUqH,EAAM1nB,gBAAkBrR,KAAKmgC,eAAepH,GACtD3sB,eAAgBpM,KAAKoM,eACrB6gB,UAAWuQ,GAGTzL,EAAWR,GAAYE,kBAAkB2N,GACzChsB,EAAgBme,GAAYoC,uBAAuByL,GACnDE,EAAqC,CACvCtX,MAAOiY,EAAUjY,MACjB/hB,EAAGg6B,EAAUh6B,EACborB,OAAQ4O,EAAU5O,OAClBC,QAAS2O,EAAU3O,QACnBpJ,OAAQ+X,EAAU/X,QAGhBqX,EAAchO,GAAYO,oBAC5BC,EACAuN,EACAvG,EAAMxmB,MAGJ6tB,EAAcpgC,KAAKqgC,gBAAgBtH,EAAOkH,EAAU/X,OAAQ+X,EAAUjY,MAAO,CAC/EkI,MAAO+P,EAAU/P,MACjBoB,QAAS2O,EAAU3O,UAGvB,OAAOtxB,KAAK67B,cAAc,CACtBh5B,MAAOq9B,EACPpE,KAAM/J,EAASO,SACfyJ,YAAa,iJAAiJhD,EAAMnK,OAAS,kIAAkIwR,MAAgBb,IAC/TxG,MAAO,IACAA,EAEH3lB,iBAEJ9B,QAAS,WACTE,WAAW,KAGvB,CAEQ,sBAAA0pB,GAEJ,MAAMh4B,EAAUhB,OAAOgB,QAAQlD,KAAKm3B,gBACpC,OAAKj0B,EAAQjB,OAENiB,EAAQR,IAAI,EAAE0G,EAAKtI,GAAQ+B,IAC9B7C,KAAK67B,cAAc,CACfh5B,QACAi5B,KAAM1yB,EACN2yB,YAAa,0DACbhD,MAAO,CACH3nB,QAAS,GAAGtQ,KAAS6P,GAAY3Q,KAAK6I,QAAQ6lB,UAElDnd,YAAa,eAVOjE,CAahC,CAEQ,eAAA+yB,CACJtH,EACA7Q,EACAoY,EACAL,GAEA,IAAKlH,EAAMxmB,KAAM,MAAO,MAKxB,KAHsB0tB,GAAaA,EAAU/P,MAAQ,GAIjD,MAAO,MAMX,OAAOhI,GADiB,GACW,SAAW,KAClD,CAEQ,aAAAiS,CAAchwB,GAClB,MAAMyI,MAAEA,EAAAE,IAAOA,GAAQ3I,EACjBo2B,EAAY,IAAIn2B,KAAKwI,EAAM1I,KAAM0I,EAAMzJ,MAAQ,EAAGyJ,EAAM3I,KACxDu2B,EAAU,IAAIp2B,KAAK0I,EAAI5I,KAAM4I,EAAI3J,MAAQ,EAAG2J,EAAI7I,KAEtD,MAAO,CACHs2B,EACAC,GACCA,EAAQrkB,UAAYokB,EAAUpkB,iBAAkC,EAEzE,CAEQ,oBAAA+gB,CAAqBnE,GACzB,OAAKA,EAAMxmB,OACPxL,OAAOgyB,EAAMxmB,KAAKO,IAAI/H,MAAQhE,OAAOgyB,EAAMxmB,KAAKK,MAAM7H,OAAS,OAC/DguB,EAAMuB,cAAcx1B,KAAMi0B,EAAMuB,cAAcrT,KAEtD,CAEQ,cAAAkZ,CAAepH,GAEnB,IAAKA,EAAMxmB,KAAM,OAAO,EAExB,MAAMK,MAAEA,EAAAE,IAAOA,GAAQimB,EAAMxmB,KAC7B,OAAsB,IAAfK,EAAM7H,MAA+B,IAAjB6H,EAAM5H,QAA6B,KAAb8H,EAAI/H,MAA8B,KAAf+H,EAAI9H,MAC5E,GArvCiBurB,GAwGD/pB,OAASC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAtGzBC,GAAA,CADCC,EAAS,CAAEC,KAAMC,UADD0pB,GAEjBvyB,UAAA,UAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAM7F,OAAQwO,UAAW,uBAJpBghB,GAKjBvyB,UAAA,iBAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,UAPD0pB,GAQjBvyB,UAAA,SAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,OAAQ0I,UAAW,uBAVpBghB,GAWjBvyB,UAAA,kBAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,OAAQ0I,UAAW,uBAbpBghB,GAcjBvyB,UAAA,kBAAA,GAaA0I,GAAA,CADCC,EAAS,CAAEC,KAAMlJ,SA1BD6yB,GA2BjBvyB,UAAA,UAAA,GAGA0I,GAAA,CADCC,EAAS,CAAEC,KAAMC,UA7BD0pB,GA8BjBvyB,UAAA,QAAA,GAMS0I,GAAA,CAARvE,KApCgBouB,GAoCRvyB,UAAA,iBAAA,GAEA0I,GAAA,CAARvE,KAtCgBouB,GAsCRvyB,UAAA,YAAA,GACA0I,GAAA,CAARvE,KAvCgBouB,GAuCRvyB,UAAA,oBAAA,GAvCQuyB,GAArB7pB,GAAA,CADCI,EAAc,iBACMypB","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,40]}