{"version":3,"file":"facet-2b644ef6.js","sources":["../../../../src/scripts/coveo/components/facet-breadcrumbs.tsx","../../../../src/scripts/coveo/components/facet.tsx"],"sourcesContent":["import React, { useEffect, useState, useContext } from 'react';\nimport {\n  facetBreadcrumb,\n  facetLabelsProps,\n  facetsLabels\n} from '../controllers/controller';\nimport {\n  BreadcrumbManager,\n  BreadcrumbValue,\n  FacetBreadcrumb,\n  FacetValue,\n  NumericFacetBreadcrumb,\n  NumericFacetValue,\n  CategoryFacetBreadcrumb\n} from '@coveo/headless';\nimport Clear from './clear';\nimport SecondCall from './second-call-context';\nimport { createDataLayerString } from '../../helpers/helpers';\ntype FacetBreadcrumbsProps = {\n  extraClasses?: string;\n  clearLabel: string;\n};\n\nfunction FacetBreadcrumbs({ extraClasses, clearLabel }: FacetBreadcrumbsProps) {\n  const [state, setState] = useState(\n    (facetBreadcrumb as BreadcrumbManager).state\n  );\n  const secondCallContext = useContext(SecondCall);\n\n  useEffect(() => {\n    (facetBreadcrumb as BreadcrumbManager).subscribe(() =>\n      setState((facetBreadcrumb as BreadcrumbManager).state)\n    );\n  }, []);\n\n  const handleFacetClick = (breadcrumb: CategoryFacetBreadcrumb) => {\n    if (breadcrumb.path.length > 1) {\n      window.dispatchEvent(\n        new CustomEvent('deselectFacetTree', {\n          detail: {\n            value: breadcrumb.path[breadcrumb.path.length - 2]\n          }\n        })\n      );\n    } else {\n      breadcrumb.deselect();\n    }\n  };\n\n  const renderCategoryFacetBreadcrumbs = (\n    breadcrumbs: CategoryFacetBreadcrumb[]\n  ) => {\n    return (\n      <>\n        {breadcrumbs.map(breadcrumb =>\n          breadcrumb.path.map((facet, index) => {\n            return (\n              <li key={index}>\n                <button\n                  className=\"btn btn--secondary btn--facet\"\n                  type=\"button\"\n                  onClick={() => handleFacetClick(breadcrumb)}\n                >\n                  {facet.value}\n                </button>\n              </li>\n            );\n          })\n        )}\n      </>\n    );\n  };\n  const getRangeFacetLabel = (obj: { start: number; end: number }) => {\n    const rangeFacets = facetsLabels.filter((el: facetLabelsProps) => el.range);\n    let parentEl: facetLabelsProps | undefined = undefined,\n      el: number | undefined = undefined;\n\n    rangeFacets.find((rangeObj: facetLabelsProps) => {\n      rangeObj.rangeValues.forEach((range, index) => {\n        if (range.start === obj.start && range.end === obj.end) {\n          parentEl = rangeObj;\n          el = index;\n          return;\n        }\n      });\n    });\n\n    if (!parentEl || el === undefined) return '';\n    const parentLabels = parentEl as facetLabelsProps;\n    if (parentLabels?.rangeStars) {\n      return `${parentLabels.rangeStars[el]} ${parentLabels.rangeLabels[el]}`;\n    } else {\n      return parentLabels.rangeLabels[el];\n    }\n  };\n  const renderSecondFacets = (\n    value: string | { start: number; end: number },\n    index: number\n  ) => {\n    return (\n      <li key={index}>\n        <button\n          className=\"btn btn--secondary btn--facet\"\n          type=\"button\"\n          onClick={() => {\n            if (secondCallContext.setSelectedFacets === undefined) return;\n            secondCallContext.setSelectedFacets(facets =>\n              facets.filter(facet => facet.value !== value)\n            );\n          }}\n        >\n          {!(value as { start: number }).start ? (\n            <>{value}</>\n          ) : (\n            <>{getRangeFacetLabel(value as { start: number; end: number })}</>\n          )}\n        </button>\n      </li>\n    );\n  };\n\n  const renderFacetBreadcrumbs = (\n    breadcrumbs: FacetBreadcrumb[] | NumericFacetBreadcrumb[]\n  ) => {\n    return (\n      <>\n        {breadcrumbs.map((breadcrumb, index) => (\n          <React.Fragment key={index}>\n            {breadcrumb.values.map((val, index) => {\n              const value = val as BreadcrumbValue<FacetValue> &\n                BreadcrumbValue<NumericFacetValue>;\n              return (\n                <li key={index}>\n                  <button\n                    className=\"btn btn--secondary btn--facet\"\n                    type=\"button\"\n                    onClick={() => value.deselect()}\n                  >\n                    {value.value.value ? (\n                      <>{value.value.value}</>\n                    ) : (\n                      <>{getRangeFacetLabel(value.value)}</>\n                    )}\n                  </button>\n                </li>\n              );\n            })}\n          </React.Fragment>\n        ))}\n      </>\n    );\n  };\n\n  if (secondCallContext.secondCall) {\n    return (\n      <>\n        {secondCallContext.selectedFacets.length > 0 ? (\n          <ul className={`facet-breadcrumbs ${extraClasses || ''}`}>\n            <button\n              data-layer={createDataLayerString([\n                {\n                  event: 'clear_all_filters',\n                  event_category: 'refinement usage',\n                  event_action: 'clear all filters'\n                }\n              ])}\n              className=\"btn btn--primary btn--clear-all-filters\"\n              onClick={() => {\n                if (secondCallContext.setSelectedFacets === undefined) return;\n                secondCallContext?.setSelectedFacets(() => []);\n              }}\n              type=\"button\"\n            >\n              {clearLabel}\n            </button>\n            {secondCallContext.selectedFacets.map((facet, index) =>\n              renderSecondFacets(facet.value, index)\n            )}\n          </ul>\n        ) : null}\n      </>\n    );\n  }\n  return (\n    <>\n      {state.hasBreadcrumbs ? (\n        <ul className={`facet-breadcrumbs ${extraClasses || ''}`}>\n          <li>\n            <Clear label={clearLabel} />\n          </li>\n          {renderFacetBreadcrumbs(state.numericFacetBreadcrumbs)}\n          {renderFacetBreadcrumbs(state.facetBreadcrumbs)}\n          {renderCategoryFacetBreadcrumbs(state.categoryFacetBreadcrumbs)}\n        </ul>\n      ) : null}\n    </>\n  );\n}\n\nexport default FacetBreadcrumbs;\n","import React, { useId, useState, useEffect, useRef, useContext } from 'react';\nimport {\n  FacetState,\n  Facet as FacetType,\n  FacetValue,\n  NumericFacet,\n  NumericFacetState,\n  NumericFacetValue\n} from '@coveo/headless';\nimport RatingStars from '../../react-components/rating-stars';\nimport { disableBodyScroll, clearAllBodyScrollLocks } from 'body-scroll-lock';\nimport type { BodyScrollOptions } from 'body-scroll-lock';\nimport { createDataLayerString } from '../../helpers/helpers';\nimport SecondCall from './second-call-context';\n\nconst FACET_EVENTS = Object.freeze({\n  expand: 'facet:expand',\n  collapse: 'facet:collapse'\n});\n\ntype FacetBreadcrumbsProps = {\n  title: string;\n  controller: FacetType | NumericFacet;\n  certificationsLabel?: string;\n  rangeLabels?: string[];\n  rangeStarLabels?: string[];\n  customOrder?: {\n    facetName: string;\n    iconUrl: string;\n  }[];\n  colors?: { value: string; color_value: string }[];\n  defaultExpanded?: boolean;\n  showMoreLabel?: string;\n  showLessLabel?: string;\n  isPrice?: boolean;\n  warranties?: boolean;\n};\n\nfunction Facet({\n  title,\n  controller,\n  certificationsLabel,\n  rangeLabels,\n  customOrder,\n  defaultExpanded,\n  showMoreLabel,\n  showLessLabel,\n  rangeStarLabels,\n  warranties,\n  isPrice,\n  colors\n}: FacetBreadcrumbsProps) {\n  const id = useId();\n  const [state, setState] = useState<FacetState | NumericFacetState>(\n    controller.state\n  );\n  const [expanded, setExpanded] = useState<boolean>(\n    defaultExpanded !== undefined ? defaultExpanded : true\n  );\n  const [panelHeight, setPanelHeight] = useState('100%');\n  const [counter, setCounter] = useState(0);\n  const panelRef = useRef<HTMLDivElement>(null);\n  const tooltipButtonRef = useRef<HTMLButtonElement>(null);\n  const facetTitleRef = useRef<HTMLSpanElement>(null);\n  const secondCallContext = useContext(SecondCall);\n\n  const calculateStyles = () => {\n    if (panelRef.current) {\n      setPanelHeight(`${panelRef.current.scrollHeight}px`);\n    }\n\n    if (tooltipButtonRef.current && facetTitleRef.current) {\n      const facetTitleWidth = facetTitleRef.current.clientWidth;\n\n      tooltipButtonRef.current.style.setProperty(\n        'inset-inline-start',\n        `${facetTitleWidth + 4}px`\n      );\n    }\n  };\n\n  const modal = warranties\n    ? document.querySelector<HTMLElement>('.warranty-modal')\n    : document.querySelector<HTMLElement>('.certifications-modal');\n  const modalCloseButton = modal?.querySelector<HTMLElement>(\n    '.modal__close-button'\n  );\n\n  const handleOpenModal = () => {\n    const options = {\n      reserveScrollBarGap: true,\n      allowTouchMove: (el: HTMLElement) => {\n        return el.classList.contains('modal');\n      }\n    } as BodyScrollOptions;\n    (modal as HTMLDialogElement)?.showModal();\n    disableBodyScroll(modal as HTMLElement, options);\n  };\n\n  const handleCloseModal = () => {\n    (modal as HTMLDialogElement)?.close();\n    clearAllBodyScrollLocks();\n  };\n\n  const expandFacet = () => {\n    setExpanded(true);\n  };\n\n  const collapseFacet = () => {\n    setExpanded(false);\n  };\n\n  useEffect(() => {\n    const handleResize = () => {\n      calculateStyles();\n    };\n\n    window.addEventListener('resize', handleResize);\n    window.addEventListener(FACET_EVENTS.expand, expandFacet);\n    window.addEventListener(FACET_EVENTS.collapse, collapseFacet);\n\n    if (modalCloseButton) {\n      modalCloseButton.addEventListener('click', handleCloseModal);\n    }\n\n    return () => {\n      window.removeEventListener('resize', handleResize);\n      window.removeEventListener(FACET_EVENTS.expand, expandFacet);\n      window.removeEventListener(FACET_EVENTS.collapse, collapseFacet);\n\n      if (modalCloseButton) {\n        modalCloseButton.removeEventListener('click', handleCloseModal);\n      }\n    };\n  }, []);\n\n  useEffect(() => {\n    calculateStyles();\n  }, [state]);\n\n  useEffect(() => {\n    controller.subscribe(() => setState(controller.state));\n  }, [controller]);\n\n  const handleTriggerClick = () => {\n    setExpanded(!expanded);\n  };\n\n  const handleShowMoreClick = () => {\n    (controller as FacetType).showMoreValues();\n    setCounter(counter + 1);\n  };\n\n  const handleShowLessClick = () => {\n    for (let i = 0; i < counter; i++) {\n      (controller as FacetType).showLessValues();\n    }\n\n    setCounter(0);\n  };\n\n  const secondCallFacetNumber = (\n    value: string,\n    numbers: { start: number; end: number }\n  ) => {\n    const results = secondCallContext.filteredResults.filter(result => {\n      if (Array.isArray(result.raw[state.facetId])) {\n        return (result.raw[state.facetId] as string[]).includes(\n          value as string\n        );\n      } else {\n        const number = result.raw[state.facetId] as number;\n        return number >= numbers.start && number <= numbers.end;\n      }\n    });\n\n    return results.length;\n  };\n\n  const renderList = () => {\n    let values = [...state.values];\n\n    if (customOrder) {\n      values = values.sort((a, b) => {\n        const aIndex = customOrder.findIndex(\n          item => item.facetName === (a as FacetValue & NumericFacetValue).value\n        );\n\n        const bIndex = customOrder.findIndex(\n          item => item.facetName === (b as FacetValue & NumericFacetValue).value\n        );\n\n        if (aIndex === -1) {\n          return 1;\n        }\n\n        if (bIndex === -1) {\n          return -1;\n        }\n\n        return aIndex - bIndex;\n      });\n    }\n\n    const secondCallFilterResults = (\n      value: string,\n      facetValue: { start: number; end: number }\n    ) => {\n      if (\n        secondCallContext.setFilteredResults === undefined ||\n        secondCallContext.setSelectedPage === undefined ||\n        secondCallContext.setSelectedFacets === undefined\n      )\n        return;\n\n      if (\n        secondCallContext.selectedFacets.findIndex(\n          (facet: {\n            facetId: string;\n            value: string | { start: number; end: number };\n          }) => {\n            if ((facet.value as { start: number }).start) {\n              return (\n                (facet.value as { start: number }).start === facetValue.start &&\n                facet.facetId === state.facetId\n              );\n            } else {\n              return facet.value === value && facet.facetId === state.facetId;\n            }\n          }\n        ) > -1\n      ) {\n        secondCallContext.setSelectedFacets(\n          (\n            facets: {\n              facetId: string;\n              value: string | { start: number; end: number };\n            }[]\n          ) =>\n            facets.filter(facet =>\n              facet.facetId === state.facetId && facetValue\n                ? (facet.value as { start: number }).start !== facetValue.start\n                : facet.value !== value\n            )\n        );\n        secondCallContext.setSelectedPage(1);\n      } else {\n        secondCallContext.setSelectedFacets(facets => [\n          ...facets,\n          { facetId: state.facetId, value: value ? value : facetValue }\n        ]);\n        secondCallContext.setSelectedPage(1);\n      }\n    };\n\n    return (\n      <ul role=\"list\" className={colors ? 'facet__colors' : ''}>\n        {values.map((val, index) => {\n          const value = val as FacetValue & NumericFacetValue;\n          if (colors) {\n            let colorIndex = colors.findIndex(\n              item => item.value === value.value\n            );\n            if (colorIndex === -1) {\n              colorIndex = 0;\n            }\n\n            return (\n              <li key={index}>\n                <div className=\"field field--color\">\n                  <input\n                    data-layer={\n                      value.state !== 'selected'\n                        ? createDataLayerString([\n                            {\n                              event: 'refinement_added',\n                              event_category: 'refinement usage'\n                            }\n                          ])\n                        : undefined\n                    }\n                    className=\"field__color-input\"\n                    type=\"checkbox\"\n                    name={`checkbox-${id}-${index}`}\n                    id={`checkbox-${id}-${index}`}\n                    checked={\n                      secondCallContext.secondCall\n                        ? secondCallContext.selectedFacets.findIndex(facet => {\n                            if ((facet.value as { start: number }).start) {\n                              return (\n                                (facet.value as { start: number }).start ===\n                                value.start\n                              );\n                            } else {\n                              return facet.value === value.value;\n                            }\n                          }) > -1\n                        : value.state === 'selected'\n                    }\n                    onChange={() =>\n                      secondCallContext.secondCall\n                        ? secondCallFilterResults(value.value, value)\n                        : controller.toggleSelect(value)\n                    }\n                    disabled={\n                      state.isLoading ||\n                      (rangeStarLabels && value.numberOfResults < 1)\n                    }\n                  />\n                  <div\n                    className=\"field__checkbox-color\"\n                    style={{ background: colors[colorIndex].color_value }}\n                  />\n\n                  <div className=\"field__checkbox-label-wrapper\">\n                    <label\n                      className=\"field__checkbox-label\"\n                      htmlFor={`checkbox-${id}-${index}`}\n                    >\n                      <span>{value.value}</span>\n                      <span>\n                        {secondCallContext.secondCall\n                          ? secondCallFacetNumber(value.value, value)\n                          : value.numberOfResults}\n                        <span className=\"sr-only\">results</span>\n                      </span>\n                    </label>\n                  </div>\n                </div>\n              </li>\n            );\n          }\n          return (\n            <li key={index}>\n              <div className=\"field field--checkbox \">\n                <input\n                  data-layer={\n                    value.state !== 'selected'\n                      ? createDataLayerString([\n                          {\n                            event: 'refinement_added',\n                            event_category: 'refinement usage'\n                          }\n                        ])\n                      : undefined\n                  }\n                  className=\"field__checkbox-input\"\n                  type=\"checkbox\"\n                  name={`checkbox-${id}-${index}`}\n                  id={`checkbox-${id}-${index}`}\n                  checked={\n                    secondCallContext.secondCall\n                      ? secondCallContext.selectedFacets.findIndex(facet => {\n                          if ((facet.value as { start: number }).start) {\n                            return (\n                              (facet.value as { start: number }).start ===\n                              value.start\n                            );\n                          } else {\n                            return facet.value === value.value;\n                          }\n                        }) > -1\n                      : value.state === 'selected'\n                  }\n                  onChange={() =>\n                    secondCallContext.secondCall\n                      ? secondCallFilterResults(value.value, value)\n                      : controller.toggleSelect(value)\n                  }\n                  disabled={state.isLoading || value.numberOfResults < 1}\n                />\n                <div className=\"field__checkbox-label-wrapper\">\n                  <label\n                    className=\"field__checkbox-label\"\n                    htmlFor={`checkbox-${id}-${index}`}\n                  >\n                    {isPrice && rangeLabels && (\n                      <span>{rangeLabels[index]}</span>\n                    )}\n                    {rangeStarLabels && rangeLabels ? (\n                      <div className=\"facet__stars-container\">\n                        <RatingStars\n                          rating={value.start}\n                          hideRating={true}\n                          additionalClasses=\"facet__stars\"\n                        />\n                        {rangeStarLabels && (\n                          <span className=\"sr-only\">\n                            {rangeStarLabels[index]} {rangeLabels[index]}\n                          </span>\n                        )}\n                        <span aria-hidden={true}>{rangeLabels[index]}</span>\n                      </div>\n                    ) : (\n                      <span>\n                        {value.value}\n                        {certificationsLabel && !warranties && (\n                          <img\n                            className=\"facet__certification-icon\"\n                            src={\n                              customOrder?.find(\n                                item => item.facetName === value.value\n                              )?.iconUrl\n                            }\n                            alt=\"\"\n                            role=\"presentation\"\n                            loading=\"lazy\"\n                            width=\"20\"\n                            height=\"20\"\n                          />\n                        )}\n                      </span>\n                    )}\n                    <span>\n                      {secondCallContext.secondCall\n                        ? secondCallFacetNumber(value.value, value)\n                        : value.numberOfResults}\n                      <span className=\"sr-only\">results</span>\n                    </span>\n                  </label>\n                </div>\n              </div>\n            </li>\n          );\n        })}\n        <div className=\"facet__control-buttons\">\n          {!rangeStarLabels && (state as FacetState).canShowLessValues && (\n            <button\n              className=\"link--inline facet__show-less\"\n              onClick={handleShowLessClick}\n              data-layer={createDataLayerString([\n                {\n                  event: 'refinement_value_accordion',\n                  event_category: 'refinement usage',\n                  event_action: 'show less'\n                }\n              ])}\n              aria-label={showLessLabel}\n            >\n              <span>{showLessLabel}</span>\n            </button>\n          )}\n          {!rangeStarLabels && (state as FacetState).canShowMoreValues && (\n            <button\n              className=\"link--inline facet__show-more\"\n              onClick={handleShowMoreClick}\n              data-layer={createDataLayerString([\n                {\n                  event: 'refinement_value_accordion',\n                  event_category: 'refinement usage',\n                  event_action: 'show more'\n                }\n              ])}\n              aria-label={showMoreLabel}\n            >\n              <span>{showMoreLabel}</span>\n            </button>\n          )}\n        </div>\n      </ul>\n    );\n  };\n\n  return (\n    <>\n      {state.values.length > 0 && (\n        <div className=\"facet\">\n          <button\n            data-layer={\n              expanded\n                ? createDataLayerString([\n                    {\n                      event: 'accordion_interaction',\n                      event_category: 'accordion usage',\n                      event_action: 'expand accordion'\n                    }\n                  ])\n                : createDataLayerString([\n                    {\n                      event: 'accordion_interaction',\n                      event_category: 'accordion usage',\n                      event_action: 'collapse accordion'\n                    }\n                  ])\n            }\n            className=\"facet__trigger\"\n            aria-expanded={expanded}\n            id={`trigger-${id}`}\n            aria-controls={`panel-${id}`}\n            onClick={handleTriggerClick}\n          >\n            <span className=\"facet__title\" ref={facetTitleRef}>\n              {title}\n            </span>\n          </button>\n          {certificationsLabel && (\n            <button\n              ref={tooltipButtonRef}\n              type=\"button\"\n              className=\"facet__tooltip btn--tooltip btn--tooltip-alt\"\n              title={certificationsLabel}\n              onClick={handleOpenModal}\n              data-layer={createDataLayerString([\n                {\n                  event: 'modal_view',\n                  event_category: 'modal overlay',\n                  event_action: 'view',\n                  event_attributes: {\n                    modalName: 'certifications'\n                  }\n                }\n              ])}\n            >\n              <span className=\"sr-only\">{certificationsLabel}</span>\n            </button>\n          )}\n          <div\n            aria-hidden={!expanded}\n            id={`panel-${id}`}\n            role=\"region\"\n            aria-labelledby={`trigger-${id}`}\n            className=\"facet__panel\"\n            ref={panelRef}\n            style={{ maxBlockSize: expanded ? panelHeight : 0 }}\n          >\n            {state.values.length > 0 && renderList()}\n          </div>\n        </div>\n      )}\n    </>\n  );\n}\n\nexport default Facet;\n"],"names":["FacetBreadcrumbs","extraClasses","clearLabel","state","setState","useState","facetBreadcrumb","secondCallContext","useContext","SecondCall","useEffect","handleFacetClick","breadcrumb","renderCategoryFacetBreadcrumbs","breadcrumbs","facet","index","React","getRangeFacetLabel","obj","rangeFacets","facetsLabels","el","parentEl","rangeObj","range","parentLabels","renderSecondFacets","value","facets","renderFacetBreadcrumbs","val","createDataLayerString","Clear","FACET_EVENTS","Facet","title","controller","certificationsLabel","rangeLabels","customOrder","defaultExpanded","showMoreLabel","showLessLabel","rangeStarLabels","warranties","isPrice","colors","id","useId","expanded","setExpanded","panelHeight","setPanelHeight","counter","setCounter","panelRef","useRef","tooltipButtonRef","facetTitleRef","calculateStyles","facetTitleWidth","modal","modalCloseButton","handleOpenModal","options","disableBodyScroll","handleCloseModal","clearAllBodyScrollLocks","expandFacet","collapseFacet","handleResize","handleTriggerClick","handleShowMoreClick","handleShowLessClick","i","secondCallFacetNumber","numbers","result","number","renderList","values","a","b","aIndex","item","bIndex","secondCallFilterResults","facetValue","colorIndex","RatingStars","_a"],"mappings":"mWAuBA,SAASA,GAAiB,CAAE,aAAAC,EAAc,WAAAC,GAAqC,CACvE,KAAA,CAACC,EAAOC,CAAQ,EAAIC,EAAA,SACvBC,EAAsC,KAAA,EAEnCC,EAAoBC,aAAWC,CAAU,EAE/CC,EAAAA,UAAU,IAAM,CACbJ,EAAsC,UAAU,IAC/CF,EAAUE,EAAsC,KAAK,CAAA,CAEzD,EAAG,CAAE,CAAA,EAEC,MAAAK,EAAoBC,GAAwC,CAC5DA,EAAW,KAAK,OAAS,EACpB,OAAA,cACL,IAAI,YAAY,oBAAqB,CACnC,OAAQ,CACN,MAAOA,EAAW,KAAKA,EAAW,KAAK,OAAS,CAAC,CACnD,CAAA,CACD,CAAA,EAGHA,EAAW,SAAS,CACtB,EAGIC,EACJC,mCAIKA,EAAY,OACXF,EAAW,KAAK,IAAI,CAACG,EAAOC,IAExBC,EAAA,cAAC,KAAG,CAAA,IAAKD,CACP,EAAAC,EAAA,cAAC,SAAA,CACC,UAAU,gCACV,KAAK,SACL,QAAS,IAAMN,EAAiBC,CAAU,CAAA,EAEzCG,EAAM,KAAA,CAEX,CAEH,CAAA,CAEL,EAGEG,EAAsBC,GAAwC,CAClE,MAAMC,EAAcC,EAAa,OAAQC,GAAyBA,EAAG,KAAK,EACtE,IAAAC,EACFD,EAYE,GAVQF,EAAA,KAAMI,GAA+B,CAC/CA,EAAS,YAAY,QAAQ,CAACC,EAAOT,IAAU,CAC7C,GAAIS,EAAM,QAAUN,EAAI,OAASM,EAAM,MAAQN,EAAI,IAAK,CAC3CI,EAAAC,EACNF,EAAAN,EACL,OACF,CACD,CAAA,CACF,EAEG,CAACO,GAAYD,IAAO,OAAkB,MAAA,GAC1C,MAAMI,EAAeH,EACrB,OAAIG,GAAA,MAAAA,EAAc,WACT,GAAGA,EAAa,WAAWJ,CAAE,KAAKI,EAAa,YAAYJ,CAAE,IAE7DI,EAAa,YAAYJ,CAAE,CACpC,EAEIK,EAAqB,CACzBC,EACAZ,IAGEC,EAAA,cAAC,KAAG,CAAA,IAAKD,CACP,EAAAC,EAAA,cAAC,SAAA,CACC,UAAU,gCACV,KAAK,SACL,QAAS,IAAM,CACTV,EAAkB,oBAAsB,QAC1BA,EAAA,qBAChBsB,EAAO,OAAgBd,GAAAA,EAAM,QAAUa,CAAK,CAAA,CAEhD,CAAA,EAEGA,EAA4B,MAG7BX,EAAA,cAAAA,EAAA,SAAA,KAAGC,EAAmBU,CAAuC,CAAE,EAF/DX,EAAA,cAAAA,EAAA,SAAA,KAAGW,CAAM,CAEsD,CAGrE,EAIEE,EACJhB,mCAIKA,EAAY,IAAI,CAACF,EAAYI,IAC3BC,EAAA,cAAAA,EAAM,SAAN,CAAe,IAAKD,CAClB,EAAAJ,EAAW,OAAO,IAAI,CAACmB,EAAKf,IAAU,CACrC,MAAMY,EAAQG,EAGZ,OAAAd,EAAA,cAAC,KAAG,CAAA,IAAKD,CACP,EAAAC,EAAA,cAAC,SAAA,CACC,UAAU,gCACV,KAAK,SACL,QAAS,IAAMW,EAAM,SAAS,CAAA,EAE7BA,EAAM,MAAM,MACXX,EAAA,cAAAA,EAAA,SAAA,KAAGW,EAAM,MAAM,KAAM,EAElBX,EAAA,cAAAA,EAAA,SAAA,KAAAC,EAAmBU,EAAM,KAAK,CAAE,CAAA,CAGzC,CAAA,CAEH,CACH,CACD,CACH,EAIJ,OAAIrB,EAAkB,WAElBU,EAAA,cAAAA,EAAA,SAAA,KACGV,EAAkB,eAAe,OAAS,kBACxC,KAAG,CAAA,UAAW,qBAAqBN,GAAgB,MAClDgB,EAAA,cAAC,SAAA,CACC,aAAYe,EAAsB,CAChC,CACE,MAAO,oBACP,eAAgB,mBAChB,aAAc,mBAChB,CAAA,CACD,EACD,UAAU,0CACV,QAAS,IAAM,CACTzB,EAAkB,oBAAsB,SACzBA,GAAA,MAAAA,EAAA,kBAAkB,IAAM,CAAA,GAC7C,EACA,KAAK,QAAA,EAEJL,CAAA,EAEFK,EAAkB,eAAe,IAAI,CAACQ,EAAOC,IAC5CW,EAAmBZ,EAAM,MAAOC,CAAK,CAAA,CAEzC,EACE,IACN,EAKCC,EAAA,cAAAA,EAAA,SAAA,KAAAd,EAAM,eACLc,EAAA,cAAC,KAAG,CAAA,UAAW,qBAAqBhB,GAAgB,IAClD,EAAAgB,EAAA,cAAC,KACC,KAAAA,EAAA,cAACgB,GAAM,MAAO/B,EAAY,CAC5B,EACC4B,EAAuB3B,EAAM,uBAAuB,EACpD2B,EAAuB3B,EAAM,gBAAgB,EAC7CU,EAA+BV,EAAM,wBAAwB,CAChE,EACE,IACN,CAEJ,CCtLA,MAAM+B,EAAe,OAAO,OAAO,CACjC,OAAQ,eACR,SAAU,gBACZ,CAAC,EAoBD,SAASC,GAAM,CACb,MAAAC,EACA,WAAAC,EACA,oBAAAC,EACA,YAAAC,EACA,YAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,cAAAC,EACA,gBAAAC,EACA,WAAAC,EACA,QAAAC,EACA,OAAAC,CACF,EAA0B,CACxB,MAAMC,EAAKC,EAAAA,QACL,CAAC9C,EAAOC,CAAQ,EAAIC,EAAA,SACxBgC,EAAW,KAAA,EAEP,CAACa,EAAUC,CAAW,EAAI9C,EAAA,SAC9BoC,IAAoB,OAAYA,EAAkB,EAAA,EAE9C,CAACW,EAAaC,CAAc,EAAIhD,WAAS,MAAM,EAC/C,CAACiD,EAASC,CAAU,EAAIlD,WAAS,CAAC,EAClCmD,EAAWC,SAAuB,IAAI,EACtCC,EAAmBD,SAA0B,IAAI,EACjDE,EAAgBF,SAAwB,IAAI,EAC5ClD,EAAoBC,aAAWC,CAAU,EAEzCmD,EAAkB,IAAM,CAKxB,GAJAJ,EAAS,SACIH,EAAA,GAAGG,EAAS,QAAQ,gBAAgB,EAGjDE,EAAiB,SAAWC,EAAc,QAAS,CAC/C,MAAAE,EAAkBF,EAAc,QAAQ,YAE9CD,EAAiB,QAAQ,MAAM,YAC7B,qBACA,GAAGG,EAAkB,KAAA,EAEzB,EAGIC,EAAQjB,EACV,SAAS,cAA2B,iBAAiB,EACrD,SAAS,cAA2B,uBAAuB,EACzDkB,EAAmBD,GAAA,YAAAA,EAAO,cAC9B,wBAGIE,EAAkB,IAAM,CAC5B,MAAMC,EAAU,CACd,oBAAqB,GACrB,eAAiB3C,GACRA,EAAG,UAAU,SAAS,OAAO,CACtC,EAEDwC,GAAA,MAAAA,EAA6B,YAC9BI,GAAkBJ,EAAsBG,CAAO,CAAA,EAG3CE,EAAmB,IAAM,CAC5BL,GAAA,MAAAA,EAA6B,QACNM,IAAA,EAGpBC,EAAc,IAAM,CACxBlB,EAAY,EAAI,CAAA,EAGZmB,EAAgB,IAAM,CAC1BnB,EAAY,EAAK,CAAA,EAGnBzC,EAAAA,UAAU,IAAM,CACd,MAAM6D,EAAe,IAAM,CACTX,GAAA,EAGX,cAAA,iBAAiB,SAAUW,CAAY,EACvC,OAAA,iBAAiBrC,EAAa,OAAQmC,CAAW,EACjD,OAAA,iBAAiBnC,EAAa,SAAUoC,CAAa,EAExDP,GACeA,EAAA,iBAAiB,QAASI,CAAgB,EAGtD,IAAM,CACJ,OAAA,oBAAoB,SAAUI,CAAY,EAC1C,OAAA,oBAAoBrC,EAAa,OAAQmC,CAAW,EACpD,OAAA,oBAAoBnC,EAAa,SAAUoC,CAAa,EAE3DP,GACeA,EAAA,oBAAoB,QAASI,CAAgB,CAChE,CAEJ,EAAG,CAAE,CAAA,EAELzD,EAAAA,UAAU,IAAM,CACEkD,GAAA,EACf,CAACzD,CAAK,CAAC,EAEVO,EAAAA,UAAU,IAAM,CACd2B,EAAW,UAAU,IAAMjC,EAASiC,EAAW,KAAK,CAAC,CAAA,EACpD,CAACA,CAAU,CAAC,EAEf,MAAMmC,EAAqB,IAAM,CAC/BrB,EAAY,CAACD,CAAQ,CAAA,EAGjBuB,EAAsB,IAAM,CAC/BpC,EAAyB,eAAe,EACzCkB,EAAWD,EAAU,CAAC,CAAA,EAGlBoB,EAAsB,IAAM,CAChC,QAASC,EAAI,EAAGA,EAAIrB,EAASqB,IAC1BtC,EAAyB,eAAe,EAG3CkB,EAAW,CAAC,CAAA,EAGRqB,EAAwB,CAC5BhD,EACAiD,IAEgBtE,EAAkB,gBAAgB,OAAiBuE,GAAA,CACjE,GAAI,MAAM,QAAQA,EAAO,IAAI3E,EAAM,OAAO,CAAC,EACzC,OAAQ2E,EAAO,IAAI3E,EAAM,OAAO,EAAe,SAC7CyB,CAAA,EAEG,CACL,MAAMmD,EAASD,EAAO,IAAI3E,EAAM,OAAO,EACvC,OAAO4E,GAAUF,EAAQ,OAASE,GAAUF,EAAQ,IACtD,CACD,EAEc,OAGXG,EAAa,IAAM,CACvB,IAAIC,EAAS,CAAC,GAAG9E,EAAM,MAAM,EAEzBqC,IACFyC,EAASA,EAAO,KAAK,CAACC,EAAGC,IAAM,CAC7B,MAAMC,EAAS5C,EAAY,UACzB6C,GAAQA,EAAK,YAAeH,EAAqC,KAAA,EAG7DI,EAAS9C,EAAY,UACzB6C,GAAQA,EAAK,YAAeF,EAAqC,KAAA,EAGnE,OAAIC,IAAW,GACN,EAGLE,IAAW,GACN,GAGFF,EAASE,CAAA,CACjB,GAGG,MAAAC,EAA0B,CAC9B3D,EACA4D,IACG,CAEDjF,EAAkB,qBAAuB,QACzCA,EAAkB,kBAAoB,QACtCA,EAAkB,oBAAsB,SAKxCA,EAAkB,eAAe,UAC9BQ,GAIMA,EAAM,MAA4B,MAElCA,EAAM,MAA4B,QAAUyE,EAAW,OACxDzE,EAAM,UAAYZ,EAAM,QAGnBY,EAAM,QAAUa,GAASb,EAAM,UAAYZ,EAAM,SAG1D,IAEcI,EAAA,kBAEdsB,GAKAA,EAAO,OACLd,GAAAA,EAAM,UAAYZ,EAAM,SAAWqF,EAC9BzE,EAAM,MAA4B,QAAUyE,EAAW,MACxDzE,EAAM,QAAUa,CACtB,CAAA,EAEJrB,EAAkB,gBAAgB,CAAC,IAEnCA,EAAkB,kBAA4BsB,GAAA,CAC5C,GAAGA,EACH,CAAE,QAAS1B,EAAM,QAAS,MAAOyB,GAAgB4D,CAAW,CAAA,CAC7D,EACDjF,EAAkB,gBAAgB,CAAC,GACrC,EAGF,OACGU,EAAA,cAAA,KAAA,CAAG,KAAK,OAAO,UAAW8B,EAAS,gBAAkB,EAAA,EACnDkC,EAAO,IAAI,CAAClD,EAAKf,IAAU,OAC1B,MAAMY,EAAQG,EACd,GAAIgB,EAAQ,CACV,IAAI0C,EAAa1C,EAAO,UACtBsC,GAAQA,EAAK,QAAUzD,EAAM,KAAA,EAE/B,OAAI6D,IAAe,KACJA,EAAA,mBAIZ,KAAG,CAAA,IAAKzE,GACNC,EAAA,cAAA,MAAA,CAAI,UAAU,oBACb,EAAAA,EAAA,cAAC,QAAA,CACC,aACEW,EAAM,QAAU,WACZI,EAAsB,CACpB,CACE,MAAO,mBACP,eAAgB,kBAClB,CACD,CAAA,EACD,OAEN,UAAU,qBACV,KAAK,WACL,KAAM,YAAYgB,KAAMhC,IACxB,GAAI,YAAYgC,KAAMhC,IACtB,QACET,EAAkB,WACdA,EAAkB,eAAe,UAAmBQ,GAC7CA,EAAM,MAA4B,MAElCA,EAAM,MAA4B,QACnCa,EAAM,MAGDb,EAAM,QAAUa,EAAM,KAEhC,EAAI,GACLA,EAAM,QAAU,WAEtB,SAAU,IACRrB,EAAkB,WACdgF,EAAwB3D,EAAM,MAAOA,CAAK,EAC1CS,EAAW,aAAaT,CAAK,EAEnC,SACEzB,EAAM,WACLyC,GAAmBhB,EAAM,gBAAkB,CAAA,CAGhD,EAAAX,EAAA,cAAC,MAAA,CACC,UAAU,wBACV,MAAO,CAAE,WAAY8B,EAAO0C,CAAU,EAAE,WAAY,CAAA,CAAA,EAGtDxE,EAAA,cAAC,MAAI,CAAA,UAAU,+BACb,EAAAA,EAAA,cAAC,QAAA,CACC,UAAU,wBACV,QAAS,YAAY+B,KAAMhC,GAAA,EAE3BC,EAAA,cAAC,OAAM,KAAAW,EAAM,KAAM,kBAClB,OACE,KAAArB,EAAkB,WACfqE,EAAsBhD,EAAM,MAAOA,CAAK,EACxCA,EAAM,gBACTX,EAAA,cAAA,OAAA,CAAK,UAAU,WAAU,SAAO,CACnC,CAEJ,CAAA,CACF,CACF,EAGJ,uBACG,KAAG,CAAA,IAAKD,GACNC,EAAA,cAAA,MAAA,CAAI,UAAU,wBACb,EAAAA,EAAA,cAAC,QAAA,CACC,aACEW,EAAM,QAAU,WACZI,EAAsB,CACpB,CACE,MAAO,mBACP,eAAgB,kBAClB,CACD,CAAA,EACD,OAEN,UAAU,wBACV,KAAK,WACL,KAAM,YAAYgB,KAAMhC,IACxB,GAAI,YAAYgC,KAAMhC,IACtB,QACET,EAAkB,WACdA,EAAkB,eAAe,UAAmBQ,GAC7CA,EAAM,MAA4B,MAElCA,EAAM,MAA4B,QACnCa,EAAM,MAGDb,EAAM,QAAUa,EAAM,KAEhC,EAAI,GACLA,EAAM,QAAU,WAEtB,SAAU,IACRrB,EAAkB,WACdgF,EAAwB3D,EAAM,MAAOA,CAAK,EAC1CS,EAAW,aAAaT,CAAK,EAEnC,SAAUzB,EAAM,WAAayB,EAAM,gBAAkB,CAAA,CAAA,EAEvDX,EAAA,cAAC,MAAI,CAAA,UAAU,+BACb,EAAAA,EAAA,cAAC,QAAA,CACC,UAAU,wBACV,QAAS,YAAY+B,KAAMhC,GAAA,EAE1B8B,GAAWP,GACVtB,EAAA,cAAC,OAAM,KAAAsB,EAAYvB,CAAK,CAAE,EAE3B4B,GAAmBL,EACjBtB,EAAA,cAAA,MAAA,CAAI,UAAU,0BACbA,EAAA,cAACyE,EAAA,CACC,OAAQ9D,EAAM,MACd,WAAY,GACZ,kBAAkB,cAAA,CAAA,EAEnBgB,GACE3B,EAAA,cAAA,OAAA,CAAK,UAAU,SAAA,EACb2B,EAAgB5B,CAAK,EAAE,IAAEuB,EAAYvB,CAAK,CAC7C,EAEDC,EAAA,cAAA,OAAA,CAAK,cAAa,EAAA,EAAOsB,EAAYvB,CAAK,CAAE,CAC/C,EAEAC,EAAA,cAAC,OACE,KAAAW,EAAM,MACNU,GAAuB,CAACO,GACvB5B,EAAA,cAAC,MAAA,CACC,UAAU,4BACV,KACE0E,EAAAnD,GAAA,YAAAA,EAAa,KACX6C,GAAQA,EAAK,YAAczD,EAAM,SADnC,YAAA+D,EAEG,QAEL,IAAI,GACJ,KAAK,eACL,QAAQ,OACR,MAAM,KACN,OAAO,IAAA,CAAA,CAGb,kBAED,OACE,KAAApF,EAAkB,WACfqE,EAAsBhD,EAAM,MAAOA,CAAK,EACxCA,EAAM,gBACTX,EAAA,cAAA,OAAA,CAAK,UAAU,WAAU,SAAO,CACnC,CAEJ,CAAA,CACF,CACF,CAEH,CAAA,EACAA,EAAA,cAAA,MAAA,CAAI,UAAU,wBACZ,EAAA,CAAC2B,GAAoBzC,EAAqB,mBACzCc,EAAA,cAAC,SAAA,CACC,UAAU,gCACV,QAASyD,EACT,aAAY1C,EAAsB,CAChC,CACE,MAAO,6BACP,eAAgB,mBAChB,aAAc,WAChB,CAAA,CACD,EACD,aAAYW,CAAA,EAEZ1B,EAAA,cAAC,YAAM0B,CAAc,CAGxB,EAAA,CAACC,GAAoBzC,EAAqB,mBACzCc,EAAA,cAAC,SAAA,CACC,UAAU,gCACV,QAASwD,EACT,aAAYzC,EAAsB,CAChC,CACE,MAAO,6BACP,eAAgB,mBAChB,aAAc,WAChB,CAAA,CACD,EACD,aAAYU,CAAA,EAEZzB,EAAA,cAAC,YAAMyB,CAAc,CAG3B,CAAA,CACF,CAAA,EAKF,OAAAzB,EAAA,cAAAA,EAAA,SAAA,KACGd,EAAM,OAAO,OAAS,GACpBc,EAAA,cAAA,MAAA,CAAI,UAAU,OACb,EAAAA,EAAA,cAAC,SAAA,CACC,aACEiC,EACIlB,EAAsB,CACpB,CACE,MAAO,wBACP,eAAgB,kBAChB,aAAc,kBAChB,CACD,CAAA,EACDA,EAAsB,CACpB,CACE,MAAO,wBACP,eAAgB,kBAChB,aAAc,oBAChB,CAAA,CACD,EAEP,UAAU,iBACV,gBAAekB,EACf,GAAI,WAAWF,IACf,gBAAe,SAASA,IACxB,QAASwB,CAAA,kBAER,OAAK,CAAA,UAAU,eAAe,IAAKb,GACjCvB,CACH,CAAA,EAEDE,GACCrB,EAAA,cAAC,SAAA,CACC,IAAKyC,EACL,KAAK,SACL,UAAU,+CACV,MAAOpB,EACP,QAAS0B,EACT,aAAYhC,EAAsB,CAChC,CACE,MAAO,aACP,eAAgB,gBAChB,aAAc,OACd,iBAAkB,CAChB,UAAW,gBACb,CACF,CAAA,CACD,CAAA,EAEAf,EAAA,cAAA,OAAA,CAAK,UAAU,SAAA,EAAWqB,CAAoB,CAGnD,EAAArB,EAAA,cAAC,MAAA,CACC,cAAa,CAACiC,EACd,GAAI,SAASF,IACb,KAAK,SACL,kBAAiB,WAAWA,IAC5B,UAAU,eACV,IAAKQ,EACL,MAAO,CAAE,aAAcN,EAAWE,EAAc,CAAE,CAAA,EAEjDjD,EAAM,OAAO,OAAS,GAAK6E,EAAW,CAE3C,CAAA,CAEJ,CAEJ"}