@ainelo/form-engine 1.0.3
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.
- package/dist/index.d.mts +453 -0
- package/dist/index.d.ts +453 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +42 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../form-engine/types/displayRules.ts","../form-engine/types/formUtils.ts","../form-engine/hooks/useFormNavigation.ts","../form-engine/context/FormThemeContext.tsx","../form-engine/types/repeatRules.ts","../form-engine/store/useFormStore.ts","../form-engine/types/validation.ts","../form-engine/store/useOTPTokenStore.ts","../form-engine/components/core/hooks/useFormReset.ts","../form-engine/components/core/hooks/useFormNavigationActions.ts","../form-engine/hooks/useFormValidation.ts","../form-engine/components/Tooltip.tsx","../form-engine/FormFieldWrapper.tsx","../form-engine/components/core/hooks/useFormPageValidation.ts","../form-engine/components/core/hooks/useFormSubmission.ts","../form-engine/hooks/useDynamicFiltering.ts","../form-engine/components/core/FormSyncComponent.tsx","../form-engine/internal/text/PContent.tsx","../form-engine/components/FormProgressBar.tsx","../form-engine/components/FormHeader.tsx","../form-engine/lib/utils.ts","../form-engine/internal/button/useButtonSize.ts","../form-engine/internal/button/ValidationBtn.tsx","../form-engine/components/ButtonTooltip.tsx","../form-engine/components/ui/switch.tsx","../form-engine/components/ui/label.tsx","../form-engine/ui/BoolFormField.tsx","../form-engine/components/ui/checkbox.tsx","../form-engine/ui/CheckboxFormField.tsx","../form-engine/components/ui/popover.tsx","../form-engine/components/ui/calendar.tsx","../form-engine/ui/DateFormField.tsx","../form-engine/components/ui/select.tsx","../form-engine/components/ui/input.tsx","../form-engine/ui/DropdownFormField.tsx","../form-engine/utils/fileName.ts","../form-engine/hooks/useFileBucketManager.ts","../form-engine/ui/FileFormField.tsx","../form-engine/ui/NumberFormField.tsx","../form-engine/ui/PasswordFormField.tsx","../form-engine/components/ui/radio-group.tsx","../form-engine/ui/RadioFormField.tsx","../form-engine/components/ui/textarea.tsx","../form-engine/ui/TextareaFormField.tsx","../form-engine/hooks/useEmailOTPTrigger.ts","../form-engine/ui/TextFormField.tsx","../form-engine/ui/special/ImageFormField.tsx","../form-engine/ui/special/VideoFormField.tsx","../form-engine/ui/special/AudioFormField.tsx","../form-engine/ui/special/PDFFormField.tsx","../form-engine/ui/special/VoiceFormField.tsx","../form-engine/ui/special/DocumentFormField.tsx","../form-engine/ui/special/TipTapFormField.tsx","../form-engine/FieldRenderer.tsx","../form-engine/repeat-groupe-renderer/components/ModalHeader.tsx","../form-engine/hooks/useAutoOtherField.ts","../form-engine/hooks/useDetailInfos.ts","../form-engine/repeat-groupe-renderer/components/SeriesItem.tsx","../form-engine/internal/button/CancelBtn.tsx","../form-engine/internal/button/Button.tsx","../form-engine/repeat-groupe-renderer/components/ModalFooter.tsx","../form-engine/repeat-groupe-renderer/hooks/useSeriesAnimations.ts","../form-engine/repeat-groupe-renderer/components/RepeatGroupModal.tsx","../form-engine/repeat-groupe-renderer/hooks/useRepeatGroupLogic.ts","../form-engine/repeat-groupe-renderer/hooks/useModalLogic.ts","../form-engine/repeat-groupe-renderer/RepeatGroupRenderer.tsx","../form-engine/ui/special/OTPFormField.tsx","../form-engine/components/OTPModal.tsx","../form-engine/hooks/useOTPHandler.ts","../form-engine/components/OTPRenderer.tsx","../form-engine/internal/text/H4Title.tsx","../form-engine/components/FormSection.tsx","../form-engine/components/FormNavigation.tsx","../form-engine/components/core/FormEngineContent.tsx","../form-engine/components/core/FormEngine.tsx","../form-engine/types/formTypeStructure.ts"],"names":["normalizeToArray","input","shouldDisplayFormField","field","allResponseInForms","evaluateConditionalDisplay","shouldDisplaySection","section","display","evaluateConditionalDisplayGroup","group","evaluations","rule","fieldName","formFieldId","value","operator","numeric_compare_to","typeComputation","fieldKeys","values","k","v","finalValue","convertToNumber","acc","curr","evaluateCondition","parsed","finalStr","valueStr","numValue","compareValue","numValueLess","compareValueLess","extractAllFields","form","getDefaultValueForField","prepareFormDataBeforeSubmit","data","sections","filled","key","hasOTPField","getOTPField","flattenOTPFields","flattened","fieldValue","findSectionIndexForField","allSections","i","f","findLinkedEmailField","otpField","otpSectionIndex","emailFieldName","emailField","findLinkedOTPField","emailSectionIndex","otpFieldName","useFormNavigation","fieldsPerPage","paginationMode","sectionVisibility","pageVisibility","sectionIndex","setSectionIndex","useState","fieldPage","setFieldPage","sectionChangeCounter","useRef","currentPaginationMode","currentSection","fields","isOTPSection","useMemo","totalVisibleStepsForSection","visible","currentVisibleStepForSection","step","totalFieldPages","pagedFields","effectiveFieldPage","totalVisibleSteps","sum","pages","count","currentVisibleStep","visiblePages","pageIdx","currentStep","s","navigationState","isFirstSection","isLastSection","pagedFieldsBySection","totalSteps","goToPrevious","goToNext","goToFirst","goToLast","lastSectionIndex","goToStep","targetSectionIndex","_targetFieldPage","goToPreviousVisible","sectionIdx","goToNextVisible","prevSection","prevHasOTP","prevFields","lastSection","lastSectionFields","lastFieldPage","targetFieldPage","targetSection","targetFields","maxFieldPage","currentPages","DEFAULT_PRIMARY","hexToRgb","hex","m","deriveThemeVars","primaryColor","rgb","r","g","b","light","dark","FormThemeContext","React","FormThemeProvider","children","jsx","normalizeFormData","flatData","result","usedKeys","markUsedKeysForGroup","groupFieldName","storedGroupValue","instance","normalizedInstance","childField","nestedGroupFieldName","nestedValue","nestedEntry","normalizedNestedEntry","nestedField","useFormStore","create","persist","set","get","formId","state","newForms","useFormPersistence","formStore","savedValues","syncFormData","useCallback","watchedValues","normalizedValues","createZodSchema","formFields","schema","zodSchema","z","val","errMsg","getDefaultErrorMessage","maxSize","validateSize","entry","allowedTypes","allowedExtensions","type","cleaned","ext","matchesAllowedType","mime","matchesAllowedExtension","lowerValue","target","filenameFromQuery","url","queryTarget","validateType","validationType","useOTPTokenStore","token","formTokens","_","rest","useFormReset","methods","allFields","navigation","defaultValues","toast","error","useFormReset_default","buildAbsoluteUrl","serverDns","endpoint","base","path","getNextSectionIndex","currentSectionIndex","currentFieldPage","totalFields","sendOTPBeforeNavigation","formValues","options","sendConfig","linkedEmailField","mergedPayload","headers","controller","timeoutMs","fetchPromise","timeoutId","response","responseData","text","errorMessage","useFormNavigationActions","validatePage","_isValidating","setIsValidating","otpValue","otpLength","nextSectionIndex","nextSection","err","message","useFormNavigationActions_default","useFormValidation","trigger","formState","useFormContext","fieldNames","valid","Tooltip","tooltipContent","helpTextContent","position","className","isVisible","setIsVisible","tooltipId","Fragment","positionClasses","arrowClasses","jsxs","Tooltip_default","getLocalizedText","currentLang","extractErrorMessages","e","FormFieldWrapper","showLabel","tooltipPosition","isRequired","getFieldState","getByPath","obj","part","fieldState","errorMessages","showError","tooltipText","MessageCircle","AlertCircle","msg","idx","useFormPageValidation","isValidating","validateFields","currentPageFields","currentStepInfo","fieldLabel","visibleCurrentPageFields","sectionVisible","shouldDisplay","repeatFieldsForCurrentPage","instanceCount","repeatedFields","baseField","repeatedField","allFieldsToCheck","isValid","fieldsMap","requiredFields","allRequiredFieldsTouched","isTouched","allRequiredFieldsFilled","allFieldsTouched","invalidFields","messages","untouchedRequiredFields","emptyRequiredFields","useFormPageValidation_default","useFormSubmission","onSubmit","completedData","flattenedData","normalizedData","useFormSubmission_default","useSectionDynamicFiltering","sectionFields","watch","setValue","getValues","filteredSectionFields","setFilteredSectionFields","previousValuesRef","findDependentFields","resetCascade","dependentField","applyDynamicFilter","dependentFieldName","dataSource","dependentValue","filteredOptions","applyFiltersToSectionFields","useEffect","initialValues","subscription","changedFieldName","currentFormValues","updatedFields","changedField","previousValue","currentValue","useRepeatGroupDynamicFiltering","repeatGroupFields","repeatGroupName","index","filteredRepeatGroupFields","setFilteredRepeatGroupFields","getTempFieldValue","baseFieldName","getValuesFn","tempFieldName","getTempFieldName","applyRepeatGroupDynamicFilter","normalizedValue","hasExactMatch","matchingKey","finalKey","applyFiltersToRepeatGroupFields","FormSyncComponent","setAllFormValues","FormSyncComponent_default","PContent","forwardRef","props","ref","PContent_default","DefaultStepProgressBar","progress","LinearProgressBar","PastelProgressBar","stepNumber","isCompleted","isActive","CustomProgressBar","colors","backgroundColor","foregroundColor","SectionBubbleProgressBar","visibleSectionsWithIndex","originalIndex","visibleSections","item","visibleSectionIndex","currentVisibleIndex","SectionBubblePastelProgressBar","FormProgressBar","progressBarType","shouldRender","effectiveType","FormProgressBar_default","FormHeader","headerOptions","FormHeader_default","cn","inputs","twMerge","clsx","WIDTH_MOBILE","SCREEN_MOBILE","WIDTH_DESKTOP","SCREEN_DESKTOP","useButtonSize","width","setWidth","height","setHeight","borderRadius","setBorderRadius","pressed","setPressed","isHovered","setIsHovered","isMobile","setIsMobile","update","sw","a","w","h","ValidationBtn","onClick","transform","handlers","content","ValidationBtn_default","ButtonTooltip","ButtonTooltip_default","Switch","so","Label","io","BoolFormField","name","label","switchId","checked","BoolFormField_default","Checkbox","co","Check","CheckboxFormField","selectedValues","toggleValue","optionValue","newValues","option","inputId","isChecked","CheckboxFormField_default","Popover","PopoverTrigger","PopoverContent","po","align","sideOffset","MONTHS_FR","MONTHS_EN","DAYS_FR","DAYS_EN","getDaysInMonth","date","year","month","firstDay","start","days","d","Calendar","onChange","currentMonth","setCurrentMonth","ho","months","daysOfWeek","todayLabel","navigate","dir","prev","todayStr","selectedStr","ChevronLeft","ChevronRight","isCurrentMonth","isToday","isSelected","t","formatDate","lang","DateFormField","defaultValue","register","open","setOpen","selectedDate","setSelectedDate","handleSelect","placeholder","CalendarIcon","ChevronDown","DateFormField_default","Select","SelectValue","SelectTrigger","Ze","SelectContent","SelectLabel","SelectItem","SelectSeparator","Input","To","createSlug","DropdownFormField","dependentFieldNameTransformed","dependentFieldNameToWatch","dependentValueFromWatch","dependentValueFromGetValues","isDisabled","effectivePlaceholder","isOpen","setIsOpen","searchQuery","setSearchQuery","setFilteredOptions","selectedOption","setSelectedOption","hoveredOptionIndex","setHoveredOptionIndex","dropdownPosition","setDropdownPosition","dropdownRef","inputRef","opt","updateDropdownPosition","rect","scrollTop","scrollLeft","querySlug","handleClickOutside","event","handleOptionSelect","handleInputChange","createPortal","DropdownFormField_default","extractFileNameFromUrl","decodeSafe","extractFromPath","sanitized","segments","candidateParamKeys","paramValue","normalized","pathSegments","isMap","payload","normalizePayload","appendFormDataValue","formData","pickFilename","fallbackUrl","fallbackFile","candidates","derivedFromUrl","prepareFileInstance","file","fallbackFilename","withTimeout","promise","timeout","callUploadEndpoint","params","fileToSend","fileUrl","callDeleteEndpoint","basePayload","overridePayload","isDeleteByUrl","inferred","useFileBucketManager","config","isUploading","setIsUploading","isDeleting","setIsDeleting","setError","uploadOption","deleteOption","uploadFile","deleteFile","resetError","generateId","formatFileSize","bytes","sizes","getFileIcon","fileType","FileFormField","dragActive","setDragActive","uploadedFiles","setUploadedFiles","componentError","setComponentError","fileInputRef","isMultiple","bucketError","hasUploadSupport","hasDeleteSupport","effectiveError","didInitRef","urls","updateFilesState","producer","next","successfulUrls","handleDrag","handleDrop","handleFiles","files","selectedFiles","id","baseEntry","removeFile","UploadCloud","ExternalLink","Loader2","Trash2","FileFormField_default","NumberFormField","displayValue","setDisplayValue","formatNumber","parseFormattedValue","formattedValue","formatted","inputValue","numericValue","NumberFormField_default","PasswordFormField","showPassword","setShowPassword","EyeOff","Eye","PasswordFormField_default","RadioGroup","sr","RadioGroupItem","RadioFormField","newValue","RadioFormField_default","Textarea","Bo","TextareaFormField","TextareaFormField_default","useEmailOTPTrigger","onOTPSent","isSendingOTP","setIsSendingOTP","otpSent","setOtpSent","lastSentEmail","setLastSentEmail","debounceTimerRef","isProcessingRef","emailValue","linkedOTPField","sendOTP","email","errorText","TextFormField","hasEmailValidation","shouldTriggerOTP","emailOTPTrigger","handleChange","TextFormField_default","ImageFormField","uploadedImage","setUploadedImage","localPreviewUrl","setLocalPreviewUrl","setErrorMessage","handleFile","localUrl","removeImage","ImageFormField_default","VideoFormField","uploadedVideo","setUploadedVideo","removeVideo","Video","VideoFormField_default","AudioFormField","uploadedAudio","setUploadedAudio","isPlaying","setIsPlaying","audioRef","removeAudio","handlePlayPause","Music","Pause","Play","AudioFormField_default","PDFFormField","uploadedPDF","setUploadedPDF","previewUrl","setPreviewUrl","previewStatus","setPreviewStatus","previewMessage","setPreviewMessage","previousPreviewRef","clearPreview","setPreviewFromBlob","blob","objectUrl","loadPreviewFromRemote","contentTypeHeader","blobType","fileName","normalizedBlob","removePDF","FileText","PDFFormField_default","VoiceFormField","isRecording","setIsRecording","audioUrl","setAudioUrl","remoteInfo","setRemoteInfo","duration","setDuration","mediaRecorderRef","chunksRef","intervalRef","stopTimer","formatDuration","seconds","mins","secs","startRecording","stream","mediaRecorder","track","stopRecording","removeRecording","Mic","MicOff","audio","VoiceFormField_default","DocumentFormField","uploadedDocument","setUploadedDocument","removeDocument","DocumentFormField_default","TipTapFormField","editor","useEditor","StarterKit","Image","Link","Placeholder","html","addImage","setLink","previousUrl","Bold","Italic","Underline","Heading1","Heading2","List","ListOrdered","LinkIcon","ImageIcon","EditorContent","TipTapFormField_default","FieldRenderer","showControlButtons","hasFilledData","basedOnValue","onOpenModal","onOpenEdit","onOpenView","fieldKey","renderControlButtons","ArrowRight","Edit","FieldRenderer_default","ModalHeader","isViewMode","onClose","onExpandAll","onCollapseAll","getIcon","Plus","getTitle","X","ChevronUp","ModalHeader_default","useAutoOtherField","eligibleFields","autoOtherFields","generatedFields","parentField","parentFieldName","parentValue","otherFieldName","shouldShowOtherField","parentLabel","otherLabel","validations","otherField","shouldHaveOtherField","useDetailInfos","detailInfosGroups","generatedGroups","groups","detailConfig","groupLabel","detailFields","detailField","detailFieldName","currentOptionValue","SeriesItem","repeatGroup","existingGroupData","buildTempFieldName","buildNestedGroupFieldName","buildNestedChildFieldName","isExpanded","onToggle","seriesRef","fieldsWithTransformedNames","subField","fieldsWithAutoOtherAndDetails","tempName","adaptedOtherField","detailGroups","adaptedDetailFields","isOtherField","isDetailGroup","detailGroup","originalFieldName","detailFieldOriginalName","detailDataKey","detailFieldValue","detailFieldFormValues","dataKey","fieldSpecificFormValues","nestedCount","nestedGroupName","nestedExistingData","nestedIndex","childKey","childFormValues","nestedGroupBaseName","SeriesItem_default","CancelBtn","CancelBtn_default","Button","variant","intent","effectiveVariant","isCancel","isRedFlag","Button_default","ModalFooter","onClear","onSave","Save","ModalFooter_default","useSeriesAnimations","expandedSeries","seriesRefs","animateSeriesToggle","isExpanding","el","targetHeight","anim","currentHeight","animateExpandAll","stagger","animateCollapseAll","RepeatGroupModal","isModalOpen","modalRef","overlayRef","contentRef","filledSeries","onToggleSeries","setExpandedSeries","seriesToRender","visibleIndices","handleToggleSeries","handleExpandAll","allIndices","handleCollapseAll","RepeatGroupModal_default","useRepeatGroupLogic","watchedValue","childFieldName","childGroupFieldName","newExpanded","series","groupData","otherFieldKey","detailFieldKey","nestedData","rawValue","otherFieldValue","detailValue","nestedEntries","useModalLogic","setIsModalOpen","setIsViewMode","manuallyClosed","setManuallyClosed","openModal","viewMode","allowAutoOpen","closeModal","isManualClose","contentAnim","RepeatGroupRenderer","toggleSeries","prefillTempFields","saveGroups","clearGroups","RepeatGroupRenderer_default","OTPFormField","onOTPComplete","otpValues","setOtpValues","inputRefs","otpString","timer","lastChar","updateOTPValue","handleKeyDown","handlePaste","char","lastFilledIndex","OTPFormField_default","OTPModal","serverResponse","isSending","isResending","resendCooldown","otpValidated","onSendOTP","onValidateOTP","onResendOTP","onCallbackRedirect","onNext","linkedEmail","hasCallbackUrl","OTPModal_default","extractAuthToken","tokenKey","tokenValue","authToken","useOTPHandler","setIsSending","setOtpValidated","setServerResponse","setResendCooldown","setIsResending","setOTPToken","handleCallbackRedirect","clearForm","validateOTP","otpCode","CORRECT_OTP","resolve","success","resetOTPSentState","resendOTP","cooldown","errorData","interval","reset","OTPRenderer","onClearForm","handleSendOTP","handleValidateOTP","clearAllOTPTokens","handleCallbackRedirectWrapper","autoValidate","handleOTPComplete","OTPRenderer_default","H4Title","H4Title_default","FormSection","fadeKey","debugInfo","onConditionalChange","onConditionalError","sectionContainerStyles","responses","currentFields","currentFormId","valuesToKeep","sectionKey","shouldShowSection","visibleFields","evaluationErrors","errors","fieldStats","visibleFieldsCount","hiddenFields","vf","requiredVisibleFields","requiredHiddenFields","getFieldWidthClass","renderFieldOrRepeat","uniqueKey","defaultBorderColor","defaultBorderWidth","defaultBackgroundColor","sectionBorderColor","sectionBorderWidth","sectionBackgroundColor","FormSection_default","FormNavigation","onPrevious","onPreviousVisible","onNextVisible","onClearAll","onSubmitButtonText","showStepNavigation","displayDeleteButton","handlePrevious","handleNext","showDeleteModal","setShowDeleteModal","submitLabel","handleClearAll","DeleteConfirmationModal","AlertTriangle","FormNavigation_default","FormEngineContent","handleFieldChange","submitButtonText","containerStyles","rawFormValues","handleSubmitWithValidation","filteredPagedFields","nextVisible","previousVisible","pageCounts","nextPage","counts","nextPageIndex","lastPage","FormEngineContent_default","FormEngine","effectivePaginationMode","totalPages","pageIndex","formKey","useForm","zodResolver","themeVars","FormProvider","FormEngine_default","SpecialField"],"mappings":"8wCAgBA,SAASA,EAAAA,CAAoBC,CAAAA,CAAsB,CACjD,OAAIA,CAAAA,GAAU,MAAA,CAAkB,EAAC,CAC1B,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CAAIA,CAAAA,CAAQ,CAACA,CAAK,CAC9C,CAEO,SAASC,EAAAA,CAAuBC,CAAAA,CAAkBC,CAAAA,CAA6D,CAIpH,OAFeC,EAAAA,CAA2BD,CAAAA,CAAoBD,CAAAA,CAAM,kBAAkB,CAGxF,CASO,SAASG,EAAAA,CAAqBC,CAAAA,CAAkBH,CAAAA,CAA6D,CAOlH,OAHeC,EAAAA,CAA2BD,CAAAA,CAAoBG,CAAAA,CAAQ,kBAAkB,CAI1F,CAIA,SAASF,EAAAA,CACPD,CAAAA,CACAI,EACS,CACT,OAAKA,CAAAA,CAIEC,EAAAA,CAAgCD,CAAAA,CAASJ,CAAkB,CAAA,CAHzD,IAIX,CAEA,SAASK,EAAAA,CACPC,CAAAA,CACAN,CAAAA,CACS,CAMT,IAAMO,CAAAA,CADQX,EAAAA,CAAiBU,CAAAA,CAAM,KAAK,CAAA,CAChB,GAAA,CAAKE,CAAAA,EAAS,CAGtC,GAAM,CAAE,SAAA,CAAAC,CAAAA,CAAW,WAAA,CAAAC,CAAAA,CAAa,KAAA,CAAAC,CAAAA,CAAO,QAAA,CAAAC,EAAU,kBAAA,CAAAC,CAAAA,CAAoB,eAAA,CAAAC,CAAgB,CAAA,CAAIN,CAAAA,CAGnFO,CAAAA,CAAsBnB,EAAAA,CAAiBa,CAAS,CAAA,CAAE,MAAA,CAAS,CAAA,CAC7Db,EAAAA,CAAiBa,CAAS,CAAA,CAC1Bb,EAAAA,CAAiBc,CAAW,CAAA,CAKhC,GAAIK,CAAAA,CAAU,MAAA,GAAW,CAAA,CAEvB,OAAO,MAAA,CAIT,IAAMC,CAAAA,CAA4CD,CAAAA,CAC/C,GAAA,CAAIE,CAAAA,EACcjB,CAAAA,CAAmBiB,CAAC,CAAA,EACb,aAGzB,CAAA,CACA,MAAA,CAAOC,CAAAA,EACYA,CAAAA,GAAM,MAGzB,CAAA,CAKH,GAAIF,CAAAA,CAAO,MAAA,GAAW,CAAA,CAEpB,OAAO,MAAA,CAGT,IAAIG,CAAAA,CAA8CH,CAAAA,CAAO,CAAC,CAAA,EAAK,IAAA,CAI/D,OAAIA,CAAAA,CAAO,MAAA,CAAS,CAAA,EAAKF,CAAAA,GAGnBA,CAAAA,GAAoB,OAAA,CAMtBK,CAAAA,CALsBH,CAAAA,CAAO,GAAA,CAAIE,CAAAA,EACnBE,EAAAA,CAAgBF,CAAC,CAG9B,EAC0B,MAAA,CAAO,CAACG,CAAAA,CAAKC,CAAAA,GAE/BD,CAAAA,CAAMC,CAAAA,CACZ,CAAC,CAAA,CACKR,CAAAA,GAAoB,gBAAA,GAM7BK,CAAAA,CALsBH,CAAAA,CAAO,GAAA,CAAIE,CAAAA,EACnBE,EAAAA,CAAgBF,CAAC,CAG9B,CAAA,CAC0B,MAAA,CAAO,CAACG,CAAAA,CAAKC,CAAAA,GAE/BD,CAAAA,CAAMC,CAAAA,CACZ,CAAC,CAAA,CAAA,CAAA,CAaOC,EAAAA,CAAkBJ,CAAAA,CAAYP,CAAAA,CAAiCD,CAAAA,CAAOE,CAAkB,CAIzG,CAAC,CAAA,CAWD,OAPoBP,CAAAA,CAAM,KAAA,GAAU,KAAA,CAChCC,CAAAA,CAAY,KAAA,CAAM,OAAO,CAAA,CACzBA,CAAAA,CAAY,IAAA,CAAK,OAAO,CAM9B,CAKA,SAASa,EAAAA,CAAgBT,CAAAA,CAA8G,CAGrI,GAAI,OAAOA,CAAAA,EAAU,QAAA,CAEnB,OAAOA,CAAAA,CAGT,GAAI,OAAOA,CAAAA,EAAU,QAAA,CAAU,CAC7B,IAAMa,CAAAA,CAAS,UAAA,CAAWb,CAAK,CAAA,CAG/B,OAFe,KAAA,CAAMa,CAAM,CAAA,CAAI,CAAA,CAAIA,CAGrC,CAEA,OAAI,OAAOb,CAAAA,EAAU,SAAA,CACJA,CAAAA,CAAQ,CAAA,CAAI,CAAA,CAKzB,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CAEdA,CAAAA,CAAM,MAAA,CAIR,CACT,CAKA,SAASY,EAAAA,CACPJ,CAAAA,CACAP,CAAAA,CACAD,CAAAA,CACAE,CAAAA,CACS,CAOT,GAAI,CAACD,EAEH,OAAO,KAAA,CAGT,OAAQA,CAAAA,EACN,KAAK,IAAA,CAAM,CACT,IAAMa,CAAAA,CAAW,MAAA,CAAON,CAAU,CAAA,CAC5BO,CAAAA,CAAW,MAAA,CAAOf,CAAK,CAAA,CAG7B,OAFec,CAAAA,GAAaC,CAG9B,CAEA,KAAK,IAAA,CAAM,CACT,IAAMD,CAAAA,CAAW,MAAA,CAAON,CAAU,CAAA,CAC5BO,CAAAA,CAAW,MAAA,CAAOf,CAAK,CAAA,CAG7B,OAFec,CAAAA,GAAaC,CAG9B,CAEA,KAAK,GAAA,CAAK,CACR,IAAMC,CAAAA,CAAWP,EAAAA,CAAgBD,CAAU,CAAA,CACrCS,CAAAA,CAAef,CAAAA,EAAsBO,EAAAA,CAAgBT,CAAK,CAAA,CAGhE,OAFegB,CAAAA,CAAWC,CAG5B,CAEA,KAAK,GAAA,CAAK,CACR,IAAMC,CAAAA,CAAeT,EAAAA,CAAgBD,CAAU,CAAA,CACzCW,CAAAA,CAAmBjB,CAAAA,EAAsBO,GAAgBT,CAAK,CAAA,CAGpE,OAFekB,CAAAA,CAAeC,CAGhC,CAEA,KAAK,IAAA,CACH,OAAK,KAAA,CAAM,OAAA,CAAQnB,CAAK,CAAA,CAITA,CAAAA,CAAM,IAAA,CAAKO,CAAAA,EAAK,MAAA,CAAOA,CAAC,CAAA,GAAM,MAAA,CAAOC,CAAU,CAAC,CAAA,CAFtD,KAAA,CAOX,KAAK,QAAA,CACH,OAAK,KAAA,CAAM,OAAA,CAAQR,CAAK,CAAA,CAIT,CAACA,EAAM,IAAA,CAAKO,CAAAA,EAAK,MAAA,CAAOA,CAAC,CAAA,GAAM,MAAA,CAAOC,CAAU,CAAC,CAAA,CAFvD,KAAA,CAOX,KAAK,UAAA,CACH,OAAK,KAAA,CAAM,OAAA,CAAQA,CAAU,CAAA,CAIdA,CAAAA,CAAW,IAAA,CAAKD,CAAAA,EAAK,MAAA,CAAOA,CAAC,CAAA,GAAM,MAAA,CAAOP,CAAK,CAAC,CAAA,CAFtD,KAAA,CAOX,KAAK,cAAA,CACH,OAAK,KAAA,CAAM,QAAQQ,CAAU,CAAA,CAId,CAACA,CAAAA,CAAW,IAAA,CAAKD,CAAAA,EAAK,MAAA,CAAOA,CAAC,CAAA,GAAM,MAAA,CAAOP,CAAK,CAAC,CAAA,CAFvD,KAAA,CAOX,QAEE,OAAO,MACX,CACF,CC7RO,SAASoB,EAAAA,CAAiBC,CAAAA,CAAkC,CACjE,OAAOA,CAAAA,CAAK,QAAA,CAAS,OAAA,CAAS7B,CAAAA,EAAqBA,CAAAA,CAAQ,UAAA,EAAc,EAAE,CAC7E,CAWO,SAAS8B,EAAAA,CAAwBlC,CAAAA,CAAuB,CAC7D,OAAQA,CAAAA,CAAM,SAAA,EACZ,KAAK,MAAA,CACL,KAAK,UAAA,CACL,KAAK,OAAA,CACL,KAAK,UAAA,CACL,KAAK,QAAA,CACH,OAAO,EAAA,CACT,KAAK,UAAA,CACH,OAAO,EAAC,CACV,KAAK,MAAA,CACH,OAAO,IAAA,CACT,QACE,OAAO,EACX,CACF,CAEO,SAASmC,EAAAA,CACdC,CAAAA,CACAC,CAAAA,CACqB,CACrB,IAAMC,CAAAA,CAAS,CAAE,GAAGF,CAAK,CAAA,CAEnBnC,CAAAA,CAAqD,EAAC,CAC5D,MAAA,CAAO,OAAA,CAAQmC,CAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAACG,CAAAA,CAAK3B,CAAK,CAAA,GAAM,CAC7CX,CAAAA,CAAmBsC,CAAG,CAAA,CAAI,CAAE,aAAA,CAAe3B,CAAM,EACnD,CAAC,CAAA,CAED,IAAA,IAAWR,CAAAA,IAAWiC,CAAAA,CACpB,IAAA,IAAWrC,CAAAA,IAASI,CAAAA,CAAQ,UAAA,CAEtB,CADYL,EAAAA,CAAuBC,CAAAA,CAAOC,CAAkB,CAAA,EAChDqC,CAAAA,CAAOtC,CAAAA,CAAM,SAAS,CAAA,GAAM,MAAA,GAC1CsC,CAAAA,CAAOtC,CAAAA,CAAM,SAAS,CAAA,CAAIkC,EAAAA,CAAwBlC,CAAK,CAAA,CAAA,CAK7D,OAAOsC,CACT,CAKO,SAASE,EAAAA,CAAYpC,EAA2B,CACrD,OAAOA,CAAAA,CAAQ,UAAA,EAAY,IAAA,CACxBJ,CAAAA,EAAUA,CAAAA,CAAM,SAAA,GAAc,KACjC,CAAA,EAAK,KACP,CAKO,SAASyC,EAAAA,CAAYrC,CAAAA,CAAyC,CACnE,OAAOA,CAAAA,CAAQ,UAAA,EAAY,IAAA,CAAMJ,CAAAA,EAAUA,CAAAA,CAAM,SAAA,GAAc,KAAK,CACtE,CAMO,SAAS0C,EAAAA,CACdN,CAAAA,CACAC,CAAAA,CACqB,CACrB,IAAMM,CAAAA,CAAY,CAAE,GAAGP,CAAK,CAAA,CAE5B,IAAA,IAAWhC,CAAAA,IAAWiC,CAAAA,CACpB,IAAA,IAAWrC,CAAAA,IAASI,CAAAA,CAAQ,UAAA,EAAc,EAAC,CACzC,GAAIJ,CAAAA,CAAM,SAAA,GAAc,KAAA,CAAO,CAC7B,IAAMU,CAAAA,CAAYV,CAAAA,CAAM,SAAA,CAClB4C,CAAAA,CAAaD,CAAAA,CAAUjC,CAAS,CAAA,CAGtC,GAAIV,CAAAA,CAAM,eAAA,GAAoB,KAAA,CAC5B,SAMA4C,GAAe,IAAA,EACf,OAAOA,CAAAA,EAAe,QAAA,EACtB,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAU,CAAA,GAGzB,MAAA,CAAO,OAAA,CAAQA,CAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,CAACL,CAAAA,CAAK3B,CAAK,CAAA,GAAM,CACnD+B,CAAAA,CAAUJ,CAAG,CAAA,CAAI3B,EACnB,CAAC,CAAA,CAGD,OAAO+B,CAAAA,CAAUjC,CAAS,CAAA,EAI9B,CAIJ,OAAOiC,CACT,CAKO,SAASE,EAAAA,CACdnC,CAAAA,CACAoC,CAAAA,CACQ,CACR,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAID,CAAAA,CAAY,MAAA,CAAQC,CAAAA,EAAAA,CAKtC,GAJgBD,CAAAA,CAAYC,CAAC,CAAA,CACP,UAAA,EAAY,IAAA,CAC/BC,CAAAA,EAAMA,CAAAA,CAAE,SAAA,GAActC,CACzB,CAAA,CAEE,OAAOqC,CAAAA,CAGX,OAAO,GACT,CAMO,SAASE,EAAAA,CACdC,CAAAA,CACAJ,EACAK,CAAAA,CACuB,CACvB,GAAI,CAACD,CAAAA,CAAS,uBAAA,EAAyB,oBAAA,CACrC,OAGF,IAAME,CAAAA,CAAiBF,CAAAA,CAAS,uBAAA,CAAwB,oBAAA,CAGxD,IAAA,IAASH,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAII,CAAAA,CAAiBJ,CAAAA,EAAAA,CAAK,CAExC,IAAMM,CAAAA,CADUP,CAAAA,CAAYC,CAAC,CAAA,CACF,UAAA,EAAY,IAAA,CACpC/C,CAAAA,EAAUA,CAAAA,CAAM,SAAA,GAAcoD,CACjC,CAAA,CAEA,GAAIC,CAAAA,EAEyBA,CAAAA,CAAW,WAAA,EAAa,IAAA,CAChDlC,CAAAA,EAAMA,CAAAA,CAAE,cAAA,GAAmB,OAC9B,CAAA,CAGE,OAAOkC,CAGb,CAGF,CAMO,SAASC,EAAAA,CACdD,CAAAA,CACAP,CAAAA,CACAS,CAAAA,CACuB,CACvB,GAAI,CAACF,CAAAA,CAAW,yBAAA,EAA2B,kBAAA,CACzC,OAGF,IAAMG,CAAAA,CAAeH,CAAAA,CAAW,yBAAA,CAA0B,kBAAA,CAG1D,IAAA,IAASN,CAAAA,CAAIQ,EAAoB,CAAA,CAAGR,CAAAA,CAAID,CAAAA,CAAY,MAAA,CAAQC,CAAAA,EAAAA,CAAK,CAE/D,IAAMG,CAAAA,CADUJ,CAAAA,CAAYC,CAAC,CAAA,CACJ,UAAA,EAAY,IAAA,CAClC/C,CAAAA,EAAUA,CAAAA,CAAM,SAAA,GAAcwD,CAAAA,EAAgBxD,CAAAA,CAAM,SAAA,GAAc,KACrE,CAAA,CAEA,GAAIkD,CAAAA,CACF,OAAOA,CAEX,CAGF,CClMO,IAAMO,EAAAA,CAAoB,CAAC,CAChC,IAAA,CAAAxB,EACA,aAAA,CAAAyB,CAAAA,CAAgB,CAAA,CAChB,cAAA,CAAAC,CAAAA,CAAiB,UAAA,CACjB,iBAAA,CAAAC,CAAAA,CACA,cAAA,CAAAC,CACF,CAAA,GAA8B,CAC5B,GAAM,CAACC,CAAAA,CAAcC,CAAe,CAAA,CAAIC,QAAAA,CAAS,CAAC,CAAA,CAC5C,CAACC,CAAAA,CAAWC,CAAY,CAAA,CAAIF,QAAAA,CAAS,CAAC,CAAA,CAGtCG,CAAAA,CAAuBC,MAAAA,CAAO,CAAC,CAAA,CAG/BC,CAAAA,CAAwBV,EAExBW,CAAAA,CAAsCrC,CAAAA,CAAK,QAAA,CAAS6B,CAAY,CAAA,CAChES,CAAAA,CAAsBD,CAAAA,EAAgB,UAAA,EAAc,EAAC,CAGrDE,CAAAA,CAAeC,OAAAA,CAAQ,IACpBH,CAAAA,CAAiB9B,EAAAA,CAAY8B,CAAc,CAAA,CAAI,KAAA,CACrD,CAACA,CAAc,CAAC,CAAA,CAIbI,CAAAA,CAA8BD,OAAAA,CAAQ,IACtCb,CAAAA,EAAqBA,CAAAA,CAAkB,MAAA,CAAS,CAAA,CAE3CA,CAAAA,CAAkB,MAAA,CAAOe,CAAAA,EAAWA,CAAO,CAAA,CAAE,MAAA,EAAU,CAAA,CAGzD1C,CAAAA,CAAK,QAAA,CAAS,MAAA,CACpB,CAAC2B,CAAAA,CAAmB3B,CAAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA,CAEtC2C,CAAAA,CAA+BH,OAAAA,CAAQ,IAAM,CACjD,GAAIb,CAAAA,EAAqBA,CAAAA,CAAkB,MAAA,CAAS,CAAA,CAAG,CAErD,IAAIiB,CAAAA,CAAO,CAAA,CACX,IAAA,IAAS9B,CAAAA,CAAI,CAAA,CAAGA,CAAAA,EAAKe,CAAAA,EAAgBf,CAAAA,CAAIa,EAAkB,MAAA,CAAQb,CAAAA,EAAAA,CAC7Da,CAAAA,CAAkBb,CAAC,CAAA,GACrB8B,CAAAA,EAAQ,CAAA,CAAA,CAGZ,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGA,CAAI,CACzB,CAEA,OAAOf,CAAAA,CAAe,CACxB,CAAA,CAAG,CAACF,CAAAA,CAAmBE,CAAY,CAAC,CAAA,CAI9BgB,CAAAA,CAAkBN,CAAAA,CACpB,CAAA,CACA,IAAA,CAAK,IAAA,CAAKD,CAAAA,CAAO,MAAA,CAASb,CAAa,CAAA,CAErCqB,EAAcP,CAAAA,CAChBD,CAAAA,CACAA,CAAAA,CAAO,KAAA,CACTN,CAAAA,CAAYP,CAAAA,CAAAA,CACXO,CAAAA,CAAY,CAAA,EAAKP,CACpB,CAAA,CAGMsB,CAAAA,CAAqBR,CAAAA,CAAe,CAAA,CAAIP,CAAAA,CAGxCgB,CAAAA,CAAoBR,OAAAA,CAAQ,IAC5BZ,CAAAA,EAAkBA,CAAAA,CAAe,MAAA,CAAS,CAAA,CAErCA,CAAAA,CAAe,MAAA,CAAO,CAACqB,CAAAA,CAAKC,CAAAA,GAC1BD,CAAAA,CAAMC,CAAAA,CAAM,MAAA,CAAOC,CAAAA,EAASA,CAAAA,CAAQ,CAAC,EAAE,MAAA,CAC7C,CAAC,CAAA,EAAK,CAAA,CAGJnD,CAAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAACX,CAAAA,CAAKlB,CAAAA,GACzBkB,CAAAA,CAAM,IAAA,CAAK,IAAA,CAAA,CAAMlB,CAAAA,CAAQ,UAAA,EAAY,MAAA,EAAU,CAAA,EAAKsD,CAAa,CAAA,CACvE,CAAC,CAAA,CACH,CAACG,CAAAA,CAAgB5B,CAAAA,CAAK,QAAA,CAAUyB,CAAa,CAAC,CAAA,CAE3C2B,CAAAA,CAAqBZ,OAAAA,CAAQ,IAAM,CACvC,GAAIZ,CAAAA,EAAkBA,CAAAA,CAAe,MAAA,CAAS,CAAA,CAAG,CAC/C,IAAIgB,CAAAA,CAAO,CAAA,CACX,IAAA,IAAS9B,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIc,CAAAA,CAAe,MAAA,CAAQd,CAAAA,EAAAA,CAAK,CAC9C,IAAMoC,CAAAA,CAAQtB,CAAAA,CAAed,CAAC,CAAA,EAAK,EAAC,CAE9BuC,CAAAA,CAAeH,CAAAA,CAAM,MAAA,CAAQC,CAAAA,EAAUA,CAAAA,CAAQ,CAAC,CAAA,CAEtD,GAAIrC,CAAAA,CAAIe,EAENe,CAAAA,EAAQS,CAAAA,CAAa,MAAA,CAAA,KAAA,GACZvC,CAAAA,GAAMe,CAAAA,CAAc,CAE7B,IAAA,IAASyB,CAAAA,CAAU,CAAA,CAAGA,CAAAA,EAAWP,CAAAA,EAAsBO,CAAAA,CAAUJ,CAAAA,CAAM,MAAA,CAAQI,CAAAA,EAAAA,CACzEJ,CAAAA,CAAMI,CAAO,CAAA,CAAI,CAAA,GACnBV,CAAAA,EAAQ,CAAA,CAAA,CAGZ,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGA,CAAI,CACzB,CACF,CACA,OAAO,CACT,CAEA,IAAIW,CAAAA,CAAc,CAAA,CAClB,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI3B,CAAAA,CAAc2B,CAAAA,EAAAA,CAAK,CACrC,IAAMrF,CAAAA,CAAU6B,CAAAA,CAAK,QAAA,CAASwD,CAAC,CAAA,CAAA,CACTrF,CAAAA,CAAUoC,EAAAA,CAAYpC,CAAO,CAAA,CAAI,KAAA,EAErDoF,CAAAA,EAAe,CAAA,CAEfA,CAAAA,EAAe,IAAA,CAAK,IAAA,CAAA,CAAMpF,CAAAA,EAAS,UAAA,EAAY,MAAA,EAAU,CAAA,EAAKsD,CAAa,EAE/E,CACA,OAAA8B,CAAAA,EAAeR,CAAAA,CAAqB,CAAA,CAC7BQ,CACT,CAAA,CAAG,CAAC3B,CAAAA,CAAgBC,CAAAA,CAAckB,CAAAA,CAAoB/C,CAAAA,CAAK,QAAA,CAAUyB,CAAa,CAAC,CAAA,CAE7EgC,CAAAA,CAAkBjB,OAAAA,CAAQ,IAAM,CACpC,IAAMkB,CAAAA,CAAiB7B,CAAAA,GAAiB,CAAA,EAAKkB,CAAAA,GAAuB,CAAA,CAC9DY,CAAAA,CACJ9B,CAAAA,GAAiB7B,CAAAA,CAAK,QAAA,CAAS,MAAA,CAAS,CAAA,EACxC+C,CAAAA,GAAuBF,CAAAA,CAAkB,CAAA,CAM3C,OAAO,CACL,cAAA,CAAAa,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,UAAA,CANiBX,CAAAA,CAOjB,WAAA,CANkBI,CAAAA,CAQlB,OAAA,CAAUvB,CAAAA,CAAe,GAAA,CAAUK,CAAAA,CAAqB,OAAA,CAAU,GAAA,CAAQa,CAAAA,CAC1E,YAAA,CAAAR,CACF,CACF,CAAA,CAAG,CAACV,CAAAA,CAAckB,CAAAA,CAAoB/C,CAAAA,CAAK,QAAA,CAAU6C,CAAAA,CAAiBpB,CAAAA,CAAec,CAAAA,CAAcS,CAAAA,CAAmBI,CAAkB,CAAC,CAAA,CAGzI,GAAIhB,CAAAA,GAA0B,WAAA,CAAa,CACzC,IAAMwB,CAAAA,CAAuBtB,CAAAA,CAEvBuB,CAAAA,CAAapB,CAAAA,CACbc,CAAAA,CAAcZ,CAAAA,CACde,CAAAA,CAAiB7B,CAAAA,GAAiB,CAAA,CAClC8B,CAAAA,CAAgB9B,CAAAA,GAAiB7B,CAAAA,CAAK,QAAA,CAAS,MAAA,CAAS,CAAA,CAExD8D,CAAAA,CAAe,IAAM,CACrBjC,CAAAA,CAAe,CAAA,GACjBK,CAAAA,CAAqB,OAAA,EAAW,CAAA,CAChCJ,CAAAA,CAAgBD,CAAAA,CAAe,CAAC,GAEpC,CAAA,CAEMkC,CAAAA,CAAW,IAAM,CACjBlC,CAAAA,CAAe7B,CAAAA,CAAK,QAAA,CAAS,MAAA,CAAS,CAAA,GACxCkC,CAAAA,CAAqB,OAAA,EAAW,CAAA,CAChCJ,CAAAA,CAAgBD,CAAAA,CAAe,CAAC,CAAA,EAEpC,CAAA,CAEMmC,CAAAA,CAAY,IAAM,CACtB9B,CAAAA,CAAqB,OAAA,EAAW,CAAA,CAChCJ,CAAAA,CAAgB,CAAC,EACnB,CAAA,CAEMmC,CAAAA,CAAW,IAAM,CACrB/B,CAAAA,CAAqB,OAAA,EAAW,EAChC,IAAMgC,CAAAA,CAAmBlE,CAAAA,CAAK,QAAA,CAAS,MAAA,CAAS,CAAA,CAChD8B,CAAAA,CAAgBoC,CAAgB,EAClC,CAAA,CAEMC,CAAAA,CAAW,CAACC,CAAAA,CAA4BC,EAAAA,CAA2B,CAAA,GAAM,CACzED,CAAAA,EAAsB,CAAA,EAAKA,CAAAA,CAAqBpE,CAAAA,CAAK,QAAA,CAAS,MAAA,GAC5DoE,CAAAA,GAAuBvC,CAAAA,GACzBK,CAAAA,CAAqB,OAAA,EAAW,CAAA,CAAA,CAElCJ,CAAAA,CAAgBsC,CAAkB,CAAA,EAEtC,CAAA,CAGME,CAAAA,CAAsB,IAAM,CAChC,GAAI3C,CAAAA,EAAqBA,CAAAA,CAAkB,MAAA,CAAS,CAAA,CAAA,CAClD,IAAA,IAAS4C,CAAAA,CAAa1C,CAAAA,CAAe,CAAA,CAAG0C,CAAAA,EAAc,CAAA,CAAGA,CAAAA,EAAAA,CACvD,GAAI5C,CAAAA,CAAkB4C,CAAU,CAAA,CAAG,CACjCJ,CAAAA,CAASI,CAAAA,CAAY,CAAC,CAAA,CACtB,MACF,CAAA,CAAA,KAGFT,CAAAA,GAEJ,CAAA,CAEMU,CAAAA,CAAkB,IAAM,CAC5B,GAAI7C,CAAAA,EAAqBA,EAAkB,MAAA,CAAS,CAAA,CAAA,CAClD,IAAA,IAAS4C,CAAAA,CAAa1C,CAAAA,CAAe,CAAA,CAAG0C,CAAAA,CAAa5C,CAAAA,CAAkB,MAAA,CAAQ4C,CAAAA,EAAAA,CAC7E,GAAI5C,CAAAA,CAAkB4C,CAAU,CAAA,CAAG,CACjCJ,CAAAA,CAASI,CAAAA,CAAY,CAAC,CAAA,CACtB,MACF,CAAA,CAAA,KAGFR,CAAAA,GAEJ,CAAA,CAEA,OAAO,CACL,YAAA,CAAAlC,CAAAA,CACA,SAAA,CAAW,CAAA,CACX,cAAA,CAAAQ,CAAAA,CACA,YAAauB,CAAAA,CACb,cAAA,CAAAF,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,UAAA,CAAAE,CAAAA,CACA,WAAA,CAAAN,CAAAA,CACA,iBAAA,CAAmBd,CAAAA,CACnB,kBAAA,CAAoBE,CAAAA,CACpB,OAAA,CAAUd,CAAAA,CAAe,GAAA,CAAUK,CAAAA,CAAqB,OAAA,CAAU,GAAA,CAClE,YAAA,CAAA4B,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,mBAAA,CAAAO,CAAAA,CACA,eAAA,CAAAE,CAAAA,CACA,SAAA,CAAAR,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAAE,EACA,iBAAA,CAAAxC,CAAAA,CACA,cAAA,CAAAC,CAAAA,CACA,SAAA,CAAW,CACT,YAAA,CAAc5B,CAAAA,CAAK,QAAA,CAAS,MAAA,CAC5B,eAAA,CAAiB,CAAA,CACjB,mBAAA,CAAqB4D,CAAAA,CAAqB,MAC5C,CACF,CACF,CAGA,IAAME,CAAAA,CAAe,IAAM,CAEzB,GAAIvB,CAAAA,CAAAA,CACF,GAAIV,CAAAA,CAAe,CAAA,CAAG,CACpBK,CAAAA,CAAqB,OAAA,EAAW,CAAA,CAChCJ,CAAAA,CAAgBD,CAAAA,CAAe,CAAC,CAAA,CAChC,IAAM4C,CAAAA,CAAczE,CAAAA,CAAK,QAAA,CAAS6B,CAAAA,CAAe,CAAC,CAAA,CAClD,GAAI4C,CAAAA,CAAa,CACf,IAAMC,CAAAA,CAAanE,EAAAA,CAAYkE,CAAW,CAAA,CAC1CxC,CAAAA,CAAayC,CAAAA,CAAa,CAAA,CAAI,IAAA,CAAK,IAAA,CAAA,CAAMD,CAAAA,CAAY,UAAA,EAAY,MAAA,EAAU,CAAA,EAAKhD,CAAa,CAAA,CAAI,CAAC,EACpG,CACF,UACSO,CAAAA,CAAY,CAAA,CACrBC,CAAAA,CAAaD,CAAAA,CAAY,CAAC,CAAA,CAAA,KAAA,GACjBH,CAAAA,CAAe,CAAA,CAAG,CAC3B,IAAM4C,CAAAA,CAAczE,CAAAA,CAAK,QAAA,CAAS6B,CAAAA,CAAe,CAAC,CAAA,CAClD,GAAI4C,CAAAA,CAAa,CACf3C,CAAAA,CAAgBD,CAAAA,CAAe,CAAC,CAAA,CAChC,IAAM8C,CAAAA,CAAaF,CAAAA,CAAY,UAAA,EAAc,EAAC,CACxCC,CAAAA,CAAanE,EAAAA,CAAYkE,CAAW,EAC1CxC,CAAAA,CAAayC,CAAAA,CAAa,CAAA,CAAI,IAAA,CAAK,IAAA,CAAKC,CAAAA,CAAW,MAAA,CAASlD,CAAa,CAAA,CAAI,CAAC,EAChF,CACF,CACF,CAAA,CAEMsC,CAAAA,CAAW,IAAM,CAEjBxB,CAAAA,CACEV,CAAAA,CAAe7B,CAAAA,CAAK,QAAA,CAAS,MAAA,CAAS,CAAA,GACxCkC,CAAAA,CAAqB,OAAA,EAAW,CAAA,CAChCJ,CAAAA,CAAgBD,CAAAA,CAAe,CAAC,CAAA,CAChCI,CAAAA,CAAa,CAAC,GAEPD,CAAAA,CAAYa,CAAAA,CAAkB,CAAA,CACvCZ,CAAAA,CAAaD,CAAAA,CAAY,CAAC,CAAA,CACjBH,CAAAA,CAAe7B,CAAAA,CAAK,QAAA,CAAS,MAAA,CAAS,CAAA,GAE/CkC,CAAAA,CAAqB,OAAA,EAAW,CAAA,CAChCJ,CAAAA,CAAgBD,CAAAA,CAAe,CAAC,CAAA,CAChCI,CAAAA,CAAa,CAAC,CAAA,EAElB,CAAA,CAGM+B,CAAAA,CAAY,IAAM,CAEtB9B,CAAAA,CAAqB,OAAA,EAAW,CAAA,CAChCJ,CAAAA,CAAgB,CAAC,CAAA,CACjBG,EAAa,CAAC,EAChB,CAAA,CAGMgC,CAAAA,CAAW,IAAM,CAErB/B,CAAAA,CAAqB,OAAA,EAAW,CAAA,CAChC,IAAMgC,CAAAA,CAAmBlE,CAAAA,CAAK,QAAA,CAAS,MAAA,CAAS,CAAA,CAChD8B,CAAAA,CAAgBoC,CAAgB,CAAA,CAEhC,IAAMU,CAAAA,CAAc5E,CAAAA,CAAK,QAAA,CAASkE,CAAgB,CAAA,CAClD,GAAIU,CAAAA,CAAa,CACf,IAAMC,CAAAA,CAAoBD,CAAAA,CAAY,UAAA,EAAc,GAC9CE,CAAAA,CAAgB,IAAA,CAAK,IAAA,CAAKD,CAAAA,CAAkB,MAAA,CAASpD,CAAa,CAAA,CAAI,CAAA,CAC5EQ,CAAAA,CAAa,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG6C,CAAa,CAAC,EACzC,CACF,CAAA,CAGMX,CAAAA,CAAW,CAACC,CAAAA,CAA4BW,CAAAA,CAA0B,CAAA,GAAM,CAC5E,GAAIX,CAAAA,EAAsB,CAAA,EAAKA,CAAAA,CAAqBpE,CAAAA,CAAK,QAAA,CAAS,MAAA,CAAQ,CAEpEoE,CAAAA,GAAuBvC,IACzBK,CAAAA,CAAqB,OAAA,EAAW,CAAA,CAAA,CAGlCJ,CAAAA,CAAgBsC,CAAkB,CAAA,CAElC,IAAMY,CAAAA,CAAgBhF,CAAAA,CAAK,QAAA,CAASoE,CAAkB,CAAA,CACtD,GAAIY,CAAAA,CAEF,GADqBzE,EAAAA,CAAYyE,CAAa,CAAA,CAE5C/C,CAAAA,CAAa,CAAC,CAAA,CAAA,KACT,CACP,IAAMgD,CAAAA,CAAeD,CAAAA,CAAc,UAAA,EAAc,EAAC,CAC5CE,CAAAA,CAAe,IAAA,CAAK,IAAA,CAAKD,CAAAA,CAAa,OAASxD,CAAa,CAAA,CAAI,CAAA,CACtEQ,CAAAA,CAAa,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,GAAA,CAAI8C,CAAAA,CAAiBG,CAAY,CAAC,CAAC,EACjE,CAEJ,CACF,CAAA,CA6FA,OAAO,CACL,YAAA,CAAArD,CAAAA,CACA,SAAA,CAAWkB,CAAAA,CACX,cAAA,CAAAV,CAAAA,CACA,WAAA,CAAAS,CAAAA,CAGA,GAAGW,CAAAA,CACH,iBAAA,CAAAT,CAAAA,CACA,kBAAA,CAAAI,CAAAA,CAGA,YAAA,CAAAU,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,mBAAA,CAxG0B,IAAM,CAEhC,GADarC,CAAAA,GACA,WAAA,CAEX,GAAIC,CAAAA,EAAqBA,CAAAA,CAAkB,MAAA,CAAS,CAAA,CAAA,CAClD,IAAA,IAAS4C,CAAAA,CAAa1C,CAAAA,CAAe,CAAA,CAAG0C,CAAAA,EAAc,CAAA,CAAGA,CAAAA,EAAAA,CACvD,GAAI5C,CAAAA,CAAkB4C,CAAU,CAAA,CAAG,CACjCJ,CAAAA,CAASI,CAAAA,CAAY,CAAC,CAAA,CACtB,MACF,CAAA,CAAA,KAIFT,CAAAA,EAAa,CAAA,KAAA,GAIXlC,CAAAA,EAAkBA,CAAAA,CAAe,MAAA,CAAS,CAAA,CAAG,CAC/C,IAAMuD,CAAAA,CAAevD,CAAAA,CAAeC,CAAY,CAAA,EAAK,EAAC,CAGtD,IAAA,IAASyB,CAAAA,CAAUP,CAAAA,CAAqB,CAAA,CAAGO,CAAAA,EAAW,CAAA,CAAGA,CAAAA,EAAAA,CACvD,GAAI6B,CAAAA,CAAa7B,CAAO,CAAA,CAAI,CAAA,CAAG,CAC7Ba,CAAAA,CAAStC,CAAAA,CAAcyB,CAAO,CAAA,CAC9B,MACF,CAIF,IAAA,IAASiB,CAAAA,CAAa1C,CAAAA,CAAe,CAAA,CAAG0C,CAAAA,EAAc,CAAA,CAAGA,CAAAA,EAAAA,CAAc,CACrE,IAAMrB,CAAAA,CAAQtB,CAAAA,CAAe2C,CAAU,CAAA,EAAK,EAAC,CAC7C,IAAA,IAASjB,CAAAA,CAAUJ,CAAAA,CAAM,MAAA,CAAS,CAAA,CAAGI,CAAAA,EAAW,CAAA,CAAGA,CAAAA,EAAAA,CACjD,GAAIJ,CAAAA,CAAMI,CAAO,CAAA,CAAI,CAAA,CAAG,CACtBa,CAAAA,CAASI,CAAAA,CAAYjB,CAAO,CAAA,CAC5B,MACF,CAEJ,CACF,CAAA,KAEEQ,CAAAA,GAGN,CAAA,CA8DE,eAAA,CA5DsB,IAAM,CAE5B,GADapC,CAAAA,GACA,WAAA,CAEX,GAAIC,CAAAA,EAAqBA,CAAAA,CAAkB,MAAA,CAAS,CAAA,CAAA,CAClD,IAAA,IAAS4C,CAAAA,CAAa1C,CAAAA,CAAe,CAAA,CAAG0C,CAAAA,CAAa5C,CAAAA,CAAkB,MAAA,CAAQ4C,CAAAA,EAAAA,CAC7E,GAAI5C,CAAAA,CAAkB4C,CAAU,CAAA,CAAG,CACjCJ,EAASI,CAAAA,CAAY,CAAC,CAAA,CACtB,MACF,CAAA,CAAA,KAIFR,CAAAA,EAAS,CAAA,KAAA,GAIPnC,CAAAA,EAAkBA,CAAAA,CAAe,MAAA,CAAS,CAAA,CAAG,CAC/C,IAAMuD,CAAAA,CAAevD,CAAAA,CAAeC,CAAY,CAAA,EAAK,EAAC,CAGtD,IAAA,IAASyB,CAAAA,CAAUP,CAAAA,CAAqB,CAAA,CAAGO,CAAAA,CAAU6B,CAAAA,CAAa,MAAA,CAAQ7B,CAAAA,EAAAA,CACxE,GAAI6B,CAAAA,CAAa7B,CAAO,CAAA,CAAI,CAAA,CAAG,CAC7Ba,CAAAA,CAAStC,CAAAA,CAAcyB,CAAO,CAAA,CAC9B,MACF,CAIF,IAAA,IAASiB,CAAAA,CAAa1C,CAAAA,CAAe,CAAA,CAAG0C,CAAAA,CAAa3C,CAAAA,CAAe,MAAA,CAAQ2C,CAAAA,EAAAA,CAAc,CACxF,IAAMrB,CAAAA,CAAQtB,CAAAA,CAAe2C,CAAU,CAAA,EAAK,EAAC,CAC7C,IAAA,IAASjB,CAAAA,CAAU,CAAA,CAAGA,CAAAA,CAAUJ,CAAAA,CAAM,MAAA,CAAQI,CAAAA,EAAAA,CAC5C,GAAIJ,CAAAA,CAAMI,CAAO,EAAI,CAAA,CAAG,CACtBa,CAAAA,CAASI,CAAAA,CAAYjB,CAAO,CAAA,CAC5B,MACF,CAEJ,CACF,CAAA,KAEES,CAAAA,GAGN,CAAA,CAkBE,SAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAAE,CAAAA,CAGA,iBAAA,CAAAxC,CAAAA,CACA,cAAA,CAAAC,CAAAA,CAGA,SAAA,CAAW,CACT,YAAA,CAAc5B,CAAAA,CAAK,QAAA,CAAS,MAAA,CAC5B,eAAA,CAAA6C,CAAAA,CACA,mBAAA,CAAqBC,EAAY,MACnC,CACF,CACF,CAAA,CC9cO,IAAMsC,EAAAA,CAAkB,SAAA,CAE/B,SAASC,EAAAA,CAASC,CAAAA,CAA8C,CAC9D,IAAMC,CAAAA,CAAI,2CAAA,CAA4C,IAAA,CAAKD,CAAG,CAAA,CAC9D,OAAOC,CAAAA,CACH,CAAC,QAAA,CAASA,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAE,CAAA,CAAG,SAASA,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAE,CAAA,CAAG,QAAA,CAASA,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAE,CAAC,CAAA,CAC3D,IACN,CAGO,SAASC,EAAAA,CAAgBC,CAAAA,CAA2C,CACzE,IAAMC,CAAAA,CAAML,EAAAA,CAASI,CAAY,CAAA,CACjC,GAAI,CAACC,CAAAA,CACH,OAAO,CACL,cAAA,CAAgBN,EAAAA,CAChB,oBAAA,CAAsB,SAAA,CACtB,oBAAqB,SACvB,CAAA,CAEF,GAAM,CAACO,CAAAA,CAAGC,CAAAA,CAAGC,CAAC,CAAA,CAAIH,CAAAA,CAEZI,CAAAA,CAAQ,CAAA,IAAA,EAAO,IAAA,CAAK,KAAA,CAAMH,CAAAA,CAAAA,CAAK,GAAA,CAAMA,CAAAA,EAAK,EAAG,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAMC,CAAAA,CAAAA,CAAK,GAAA,CAAMA,CAAAA,EAAK,EAAG,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAMC,CAAAA,CAAAA,CAAK,GAAA,CAAMA,CAAAA,EAAK,EAAG,CAAC,CAAA,CAAA,CAAA,CAEpHE,CAAAA,CAAO,CAAA,IAAA,EAAO,IAAA,CAAK,KAAA,CAAMJ,CAAAA,CAAI,GAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAMC,CAAAA,CAAI,GAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAMC,CAAAA,CAAI,GAAI,CAAC,CAAA,CAAA,CAAA,CACxF,OAAO,CACL,cAAA,CAAgBJ,CAAAA,CAChB,oBAAA,CAAsBK,CAAAA,CACtB,mBAAA,CAAqBC,CACvB,CACF,CAMA,IAAMC,EAAAA,CAAmBC,WAAAA,CAAM,aAAA,CAAqC,CAClE,YAAA,CAAcb,EAChB,CAAC,CAAA,CASM,IAAMc,EAAAA,CAAsD,CAAC,CAClE,YAAA,CAAAT,CAAAA,CAAeL,EAAAA,CACf,QAAA,CAAAe,CACF,CAAA,GACEC,GAAAA,CAACJ,EAAAA,CAAiB,QAAA,CAAjB,CAA0B,KAAA,CAAO,CAAE,YAAA,CAAAP,CAAa,CAAA,CAC9C,QAAA,CAAAU,CAAAA,CACH,CAAA,CC3CK,SAASE,EAAAA,CACdC,CAAAA,CACAlG,CAAAA,CACqB,CACrB,IAAMmG,CAAAA,CAA8B,EAAC,CAC/BC,CAAAA,CAAW,IAAI,GAAA,CAEfC,CAAAA,CAAwBC,CAAAA,EAA2B,CACvDF,CAAAA,CAAS,GAAA,CAAIE,CAAc,CAAA,CAC3B,IAAA,IAAWpG,CAAAA,IAAO,MAAA,CAAO,IAAA,CAAKgG,CAAQ,CAAA,CAAA,CAChChG,CAAAA,GAAQoG,CAAAA,EAAkBpG,CAAAA,CAAI,UAAA,CAAW,CAAA,EAAGoG,CAAc,CAAA,CAAA,CAAG,CAAA,GAC/DF,CAAAA,CAAS,GAAA,CAAIlG,CAAG,EAGtB,CAAA,CAEA,IAAA,IAAWnC,CAAAA,IAAWiC,CAAAA,CACpB,IAAA,IAAWrC,CAAAA,IAASI,CAAAA,CAAQ,UAAA,CAAY,CACtC,IAAMG,CAAAA,CAAQP,CAAAA,CAAM,WAAA,CAEpB,GAAIO,CAAAA,CAAO,CACT,IAAMqI,CAAAA,CAAmBL,CAAAA,CAAShI,EAAM,SAAS,CAAA,CAE7C,KAAA,CAAM,OAAA,CAAQqI,CAAgB,CAAA,CAChCJ,CAAAA,CAAOjI,CAAAA,CAAM,SAAS,CAAA,CAAIqI,CAAAA,CAAiB,GAAA,CAAKC,CAAAA,EAAa,CAC3D,GAAI,CAACA,CAAAA,EAAY,OAAOA,CAAAA,EAAa,QAAA,CACnC,OAAOA,CAAAA,CAGT,IAAMC,CAAAA,CAA0C,EAAC,CAEjD,IAAA,IAAWC,CAAAA,IAAcxI,CAAAA,CAAM,UAAA,CAAY,CACzC,IAAMK,EAAQiI,CAAAA,CAASE,CAAAA,CAAW,SAAS,CAAA,CAE3C,GAAIA,CAAAA,CAAW,WAAA,CAAa,CAC1B,IAAMC,CAAAA,CAAuBD,CAAAA,CAAW,WAAA,CAAY,SAAA,CAC9CE,CAAAA,CAAcJ,CAAAA,CAASG,CAAoB,CAAA,CAE7C,KAAA,CAAM,OAAA,CAAQC,CAAW,CAAA,GAC3BH,CAAAA,CAAmBE,CAAoB,CAAA,CAAIC,CAAAA,CAAY,GAAA,CAAKC,CAAAA,EAAgB,CAC1E,GAAI,CAACA,CAAAA,EAAe,OAAOA,CAAAA,EAAgB,QAAA,CACzC,OAAOA,CAAAA,CAGT,IAAMC,CAAAA,CAA6C,EAAC,CAEpD,OAAAJ,CAAAA,CAAW,WAAA,CAAa,UAAA,CAAW,OAAA,CAASK,CAAAA,EAAgB,CACtDF,CAAAA,CAAYE,CAAAA,CAAY,SAAS,CAAA,GAAM,MAAA,GACzCD,CAAAA,CAAsBC,CAAAA,CAAY,SAAS,CAAA,CAAIF,CAAAA,CAAYE,CAAAA,CAAY,SAAS,CAAA,EAEpF,CAAC,CAAA,CAEMD,CACT,CAAC,EAEDT,CAAAA,CAAqBM,CAAoB,CAAA,CAAA,CAGvCpI,CAAAA,GAAU,MAAA,GACZkI,CAAAA,CAAmBC,CAAAA,CAAW,SAAS,CAAA,CAAInI,CAAAA,EAE/C,CAAA,KAAWA,CAAAA,GAAU,MAAA,GACnBkI,CAAAA,CAAmBC,CAAAA,CAAW,SAAS,CAAA,CAAInI,CAAAA,EAE/C,CAEA,OAAOkI,CACT,CAAC,CAAA,CAEDN,CAAAA,CAAOjI,CAAAA,CAAM,SAAS,CAAA,CAAI,EAAC,CAG7BmI,CAAAA,CAAqBnI,CAAAA,CAAM,SAAS,EACpC,QACF,CAEI,CAACkI,CAAAA,CAAS,GAAA,CAAIzI,CAAAA,CAAM,SAAS,CAAA,EAAKuI,CAAAA,CAASvI,CAAAA,CAAM,SAAS,CAAA,GAAM,MAAA,GAClEwI,CAAAA,CAAOxI,CAAAA,CAAM,SAAS,CAAA,CAAIuI,CAAAA,CAASvI,CAAAA,CAAM,SAAS,CAAA,CAClDyI,CAAAA,CAAS,GAAA,CAAIzI,CAAAA,CAAM,SAAS,CAAA,EAEhC,CAIF,IAAA,GAAW,CAACuC,CAAAA,CAAK3B,CAAK,CAAA,GAAK,OAAO,OAAA,CAAQ2H,CAAQ,CAAA,CAC3CE,CAAAA,CAAS,GAAA,CAAIlG,CAAG,CAAA,GACnBiG,CAAAA,CAAOjG,CAAG,CAAA,CAAI3B,CAAAA,CAAAA,CAIlB,OAAO4H,CACT,CCtFO,IAAMa,EAAAA,CAAeC,MAAAA,EAAkB,CAC5CC,OAAAA,CACE,CAACC,CAAAA,CAAKC,CAAAA,IAAS,CACb,KAAA,CAAO,EAAC,CACR,YAAA,CAAc,CAACC,CAAAA,CAAQhJ,CAAAA,CAAWE,CAAAA,GAChC4I,CAAAA,CAAKG,IAAW,CACd,KAAA,CAAO,CACL,GAAGA,CAAAA,CAAM,KAAA,CACT,CAACD,CAAM,EAAG,CACR,GAAGC,CAAAA,CAAM,KAAA,CAAMD,CAAM,CAAA,CACrB,CAAChJ,CAAS,EAAGE,CACf,CACF,CACF,CAAA,CAAE,CAAA,CAEJ,gBAAA,CAAkB,CAAC8I,CAAAA,CAAQzI,CAAAA,GACzBuI,CAAAA,CAAKG,CAAAA,GAAW,CACd,KAAA,CAAO,CACL,GAAGA,CAAAA,CAAM,KAAA,CACT,CAACD,CAAM,EAAGzI,CACZ,CACF,CAAA,CAAE,CAAA,CAEJ,aAAA,CAAgByI,CAAAA,EAAWD,CAAAA,EAAI,CAAE,KAAA,CAAMC,CAAM,CAAA,EAAK,EAAC,CAEnD,SAAA,CAAYA,CAAAA,EACVF,CAAAA,CAAKG,CAAAA,EAAU,CACb,IAAMC,CAAAA,CAAW,CAAE,GAAGD,CAAAA,CAAM,KAAM,CAAA,CAClC,OAAA,OAAOC,CAAAA,CAASF,CAAM,CAAA,CACf,CAAE,KAAA,CAAOE,CAAS,CAC3B,CAAC,CAAA,CAEH,QAAA,CAAU,IAAMJ,CAAAA,CAAI,CAAE,KAAA,CAAO,EAAG,CAAC,CACnC,CAAA,CAAA,CACA,CACE,IAAA,CAAM,mBACR,CACF,CACF,CAAA,CAGaK,EAAAA,CAAqB,CAChCH,CAAAA,CACArH,CAAAA,GACG,CACH,IAAMyH,CAAAA,CAAYT,EAAAA,EAAa,CAEzBU,EAAcD,CAAAA,CAAU,aAAA,CAAcJ,CAAM,CAAA,CAE5CM,CAAAA,CAAeC,WAAAA,CAClBC,CAAAA,EAAuC,CACtC,IAAMC,CAAAA,CAAmB7B,EAAAA,CAAkB4B,CAAAA,CAAe7H,CAAQ,CAAA,CAClEyH,CAAAA,CAAU,gBAAA,CAAiBJ,CAAAA,CAAQS,CAAgB,EACrD,CAAA,CACA,CAACT,CAAAA,CAAQrH,CAAQ,CACnB,CAAA,CAEA,OAAO,CACL,WAAA,CAAA0H,CAAAA,CACA,YAAA,CAAAC,CACF,CACF,CAAA,CCxEO,IAAMI,EAAAA,CAAmBC,CAAAA,EAA4B,CACxD,IAAMC,CAAAA,CAA8B,EAAC,CAErC,OAAAD,CAAAA,CAAW,OAAA,CAASrK,CAAAA,EAAU,CAC1B,IAAIuK,CAAAA,CAGJ,OAAQvK,CAAAA,CAAM,SAAA,EACV,KAAK,MAAA,CACL,KAAK,UAAA,CACL,KAAK,OAAA,CACDuK,CAAAA,CAAYC,CAAAA,CAAE,QAAO,CACrB,MACJ,KAAK,UAAA,CACDD,CAAAA,CAAYC,CAAAA,CAAE,MAAA,EAAO,CACrB,MACJ,KAAK,MAAA,CACDD,CAAAA,CAAYC,CAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAQC,CAAAA,EAAQ,CAAC,KAAA,CAAM,IAAA,CAAK,KAAA,CAAMA,CAAG,CAAC,CAAA,CAAG,CAC5D,OAAA,CAAS,eACb,CAAC,CAAA,CACD,MACJ,KAAK,QAAA,CACDF,EAAYC,CAAAA,CAAE,MAAA,CAAO,MAAA,EAAO,CAC5B,MACJ,KAAK,MAAA,CACDD,CAAAA,CAAYC,CAAAA,CAAE,OAAA,EAAQ,CACtB,MACJ,KAAK,UAAA,CACDD,CAAAA,CAAYC,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CACzC,MACJ,KAAK,MAAA,CAEDD,CAAAA,CAAYC,CAAAA,CAAE,KAAA,CAAM,CAChBA,CAAAA,CAAE,UAAA,CAAW,IAAI,CAAA,CACjBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,UAAA,CAAW,IAAI,CAAC,CAAA,CAC1BA,CAAAA,CAAE,IAAA,EAAK,CACPA,CAAAA,CAAE,SAAA,EACN,CAAC,CAAA,CACD,MACJ,QACID,CAAAA,CAAYC,CAAAA,CAAE,MAAA,GACtB,CAGAxK,CAAAA,CAAM,WAAA,EAAa,OAAA,CAASS,CAAAA,EAAS,CAEjC,IAAIiK,CAAAA,CAeJ,OAbIjK,CAAAA,CAAK,OACTiK,CAAAA,CAASjK,CAAAA,CAAK,MAAA,CACHA,CAAAA,CAAK,cAAA,CAChBiK,CAAAA,CAASC,EAAAA,CAAuBlK,CAAAA,CAAK,cAAA,CAAgBA,CAAAA,CAAK,KAAK,CAAA,CAE/DiK,CAAAA,CAAS,0BAAA,CAQDjK,CAAAA,CAAK,cAAA,EACT,KAAK,UAAA,CACGT,CAAAA,CAAM,SAAA,GAAc,MAAA,EAAUA,CAAAA,CAAM,SAAA,GAAc,UAAA,EAAcA,CAAAA,CAAM,SAAA,GAAc,UAAA,EAAcA,CAAAA,CAAM,SAAA,GAAc,OAAA,CACtHuK,CAAAA,CAAYA,EAAU,GAAA,CAAI,CAAA,CAAGG,CAAM,CAAA,CAC5B1K,CAAAA,CAAM,SAAA,GAAc,UAAA,CAC3BuK,CAAAA,CAAYC,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAA,CAAGE,CAAM,CAAA,CACtC1K,CAAAA,CAAM,SAAA,GAAc,MAAA,CAC3BuK,CAAAA,CAAYA,CAAAA,CAAU,MAAA,CAAQE,CAAAA,EAAiBA,CAAAA,GAAQ,IAAA,CAAM,CAAE,OAAA,CAASC,CAAO,CAAC,CAAA,CACzE1K,EAAM,SAAA,GAAc,QAAA,CAC3BuK,CAAAA,CAAYA,CAAAA,CAAU,MAAA,CAAQE,CAAAA,EAAgBA,CAAAA,EAAQ,IAAA,CAA2B,CAAE,OAAA,CAASC,CAAO,CAAC,CAAA,CAC7F1K,CAAAA,CAAM,SAAA,GAAc,MAAA,GAC3BuK,CAAAA,CAAYA,CAAAA,CAAU,MAAA,CACjBE,CAAAA,EAEOA,CAAAA,YAAe,IAAA,CAAa,IAAA,CAC5B,KAAA,CAAM,OAAA,CAAQA,CAAG,CAAA,CAAUA,CAAAA,CAAI,MAAA,CAAS,CAAA,EAAKA,CAAAA,CAAI,KAAA,CAAMzH,GAAKA,CAAAA,YAAa,IAAI,CAAA,CAC7EyH,CAAAA,EAAO,OAAOA,CAAAA,CAAI,MAAA,EAAW,QAAA,CAAiBA,CAAAA,CAAI,MAAA,CAAS,CAAA,CACxD,KAAA,CAEX,CAAE,OAAA,CAASC,CAAO,CACtB,CAAA,CAAA,CAEJ,MACJ,KAAK,WAAA,CACGH,CAAAA,YAAqBC,CAAAA,CAAE,SAAA,GACvBD,CAAAA,CAAYA,CAAAA,CAAU,GAAA,CAAI9J,CAAAA,CAAK,KAAA,CAAiBiK,CAAM,CAAA,CAAA,CAE1D,MACJ,KAAK,WAAA,CACGH,CAAAA,YAAqBC,CAAAA,CAAE,SAAA,GACvBD,CAAAA,CAAYA,CAAAA,CAAU,GAAA,CAAI9J,CAAAA,CAAK,KAAA,CAAiBiK,CAAM,CAAA,CAAA,CAE1D,MACJ,KAAK,OAAA,CACGH,CAAAA,YAAqBC,CAAAA,CAAE,SAAA,GACvBD,CAAAA,CAAYA,CAAAA,CAAU,KAAA,CAAM,IAAI,MAAA,CAAO9J,CAAAA,CAAK,KAAe,CAAA,CAAGiK,CAAM,CAAA,CAAA,CAExE,MACJ,KAAK,OAAA,CACGH,CAAAA,YAAqBC,CAAAA,CAAE,YACvBD,CAAAA,CAAYA,CAAAA,CAAU,KAAA,CAAMG,CAAM,CAAA,CAAA,CAEtC,MACJ,KAAK,QAAA,CACDH,CAAAA,CAAYC,CAAAA,CAAE,MAAA,CAAO,MAAA,EAAO,CAAE,MAAA,CAAQC,CAAAA,EAAQ,CAAC,KAAA,CAAMA,CAAG,CAAA,CAAG,CACvD,OAAA,CAASC,CACb,CAAC,CAAA,CACD,MACJ,KAAK,cAAA,CACGH,CAAAA,YAAqBC,CAAAA,CAAE,SAAA,GACvBD,CAAAA,CAAYA,CAAAA,CAAU,MAClB,oBAAA,CACAG,CACJ,CAAA,CAAA,CAEJ,MACJ,KAAK,UAAA,CACL,KAAK,UAAA,CACD,GAAIH,CAAAA,YAAqBC,CAAAA,CAAE,OAAA,CACvB,GAAI/J,CAAAA,CAAK,cAAA,GAAmB,UAAA,CAAY,CACpC,IAAMmK,CAAAA,CAAU,MAAA,CAAOnK,CAAAA,CAAK,KAAK,CAAA,CAC3BoK,CAAAA,CAAgB/K,CAAAA,EACdA,CAAAA,EAAS,IAAA,EAAQA,CAAAA,GAAU,EAAA,CACpB,IAAA,CAEP,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CACZA,CAAAA,CAAM,KAAA,CAAOgL,CAAAA,EAAUD,CAAAA,CAAaC,CAAK,CAAC,CAAA,CAEjDhL,CAAAA,YAAiB,IAAA,CACVA,CAAAA,CAAM,IAAA,EAAQ8K,CAAAA,CAGlB,IAAA,CAEXL,CAAAA,CAAYA,CAAAA,CAAU,MAAA,CAAOM,CAAAA,CAAcH,CAAM,EACrD,CAAA,KAAO,CACH,IAAMK,CAAAA,CAAe,KAAA,CAAM,OAAA,CAAQtK,CAAAA,CAAK,KAAK,CAAA,CACtCA,CAAAA,CAAK,KAAA,CACN,GAEAuK,CAAAA,CAAoBD,CAAAA,CACrB,GAAA,CAAKE,CAAAA,EAAS,CACX,GAAI,CAACA,CAAAA,CAAM,OAAO,IAAA,CAClB,IAAMC,CAAAA,CAAUD,CAAAA,CAAK,WAAA,EAAY,CACjC,OAAIC,CAAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,CACbA,CAAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,EAAK,IAAA,CAEhCA,CAAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,CACvBA,CAAAA,CAAQ,MAAM,CAAC,CAAA,CACfA,CACV,CAAC,CAAA,CACA,MAAA,CAAQC,CAAAA,EAAuB,CAAA,CAAQA,CAAI,CAAA,CAE1CC,CAAAA,CAAsBC,CAAAA,EACpBN,CAAAA,CAAa,MAAA,GAAW,CAAA,CACjB,IAAA,CAENM,CAAAA,CAGEN,CAAAA,CAAa,QAAA,CAASM,CAAI,CAAA,CAFtB,KAAA,CAKTC,CAAAA,CAA2B1K,CAAAA,EAAuC,CACpE,GAAImK,CAAAA,CAAa,MAAA,GAAW,CAAA,CACxB,OAAO,KAAA,CAEX,GAAI,CAACnK,CAAAA,CAAO,OAAO,MAAA,CACnB,IAAM2K,CAAAA,CAAa3K,CAAAA,CAAM,WAAA,EAAY,CAEjC4K,CAAAA,CAASD,CAAAA,CACTE,CAAAA,CAAmC,IAAA,CACvC,GAAI,CACA,IAAMC,CAAAA,CAAM,IAAI,GAAA,CAAIH,CAAU,CAAA,CAC9BC,CAAAA,CAASE,CAAAA,CAAI,QAAA,CAAS,WAAA,EAAY,CAClCD,CAAAA,CACIC,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA,EAC/BA,CAAAA,CAAI,aAAa,GAAA,CAAI,MAAM,CAAA,EAC3BA,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,WAAW,CAAA,EAChC,KACR,CAAA,KAAQ,CACJF,CAAAA,CAASD,EACb,CACA,IAAMI,CAAAA,CAAcF,CAAAA,CACdA,CAAAA,CAAkB,WAAA,EAAY,CAC9B,IAAA,CAEN,OAAOT,CAAAA,CAAkB,IAAA,CAAMG,CAAAA,EACvB,CAAA,EAAAK,CAAAA,CAAO,QAAA,CAAS,CAAA,CAAA,EAAIL,CAAG,CAAA,CAAE,CAAA,EAGzBQ,GAAeA,CAAAA,CAAY,QAAA,CAAS,CAAA,CAAA,EAAIR,CAAG,CAAA,CAAE,CAAA,CAIpD,CACL,CAAA,CAEMS,CAAAA,CAAgB9L,CAAAA,EACdA,CAAAA,EAAS,IAAA,EAAQA,CAAAA,GAAU,EAAA,CACpB,IAAA,CAEP,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CACZA,CAAAA,CAAM,KAAA,CAAOgL,CAAAA,EAAUc,CAAAA,CAAad,CAAK,CAAC,CAAA,CAEjDhL,CAAAA,YAAiB,IAAA,CACVsL,CAAAA,CAAmBtL,CAAAA,CAAM,IAAI,CAAA,CAEpC,OAAOA,CAAAA,EAAU,QAAA,CAEVwL,CAAAA,CAAwBxL,CAAK,CAAA,EAAKiL,CAAAA,CAAa,MAAA,GAAW,CAAA,CAE9D,IAAA,CAGXR,CAAAA,CAAYA,CAAAA,CAAU,MAAA,CAAOqB,CAAAA,CAAclB,CAAM,EACrD,CAEJ,KACR,CACJ,CAAC,CAAA,CAGmB1K,CAAAA,CAAM,WAAA,EAAa,IAAA,CAAKmB,CAAAA,EAAKA,CAAAA,CAAE,cAAA,GAAmB,UAAU,CAAA,GAE5EoJ,CAAAA,CAAYA,CAAAA,CAAU,QAAA,EAAS,CAAA,CAGnCD,EAAOtK,CAAAA,CAAM,SAAS,CAAA,CAAIuK,EAC9B,CAAC,CAAA,CAEMC,CAAAA,CAAE,MAAA,CAAOF,CAAM,CAC1B,CAAA,CAGA,SAASK,EAAAA,CAAuBkB,CAAAA,CAAwBjL,CAAAA,CAAqB,CACzE,OAAQiL,CAAAA,EACJ,KAAK,UAAA,CAAY,OAAO,0BAAA,CACxB,KAAK,WAAA,CAAa,OAAO,CAAA,QAAA,EAAWjL,CAAK,CAAA,cAAA,CAAA,CACzC,KAAK,WAAA,CAAa,OAAO,WAAWA,CAAK,CAAA,cAAA,CAAA,CACzC,KAAK,OAAA,CAAS,OAAO,iBAAA,CACrB,KAAK,OAAA,CAAS,OAAO,gBAAA,CACrB,KAAK,QAAA,CAAU,OAAO,iBAAA,CACtB,KAAK,UAAA,CAAY,OAAO,yBAAA,CACxB,KAAK,UAAA,CAAY,OAAO,iCAAA,CACxB,KAAK,cAAA,CAAgB,OAAO,uCAAA,CAC5B,QAAS,OAAO,iBACpB,CACJ,CChPO,IAAMkL,EAAAA,CAAmBxC,MAAAA,EAAsB,CACpDC,OAAAA,CACE,CAACC,CAAAA,CAAKC,CAAAA,IAAS,CACb,MAAA,CAAQ,EAAC,CAET,YAAa,CAACC,CAAAA,CAAQhJ,CAAAA,CAAWqL,CAAAA,GAC/BvC,CAAAA,CAAKG,CAAAA,GAAW,CACd,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAM,MAAA,CACT,CAACD,CAAM,EAAG,CACR,GAAGC,CAAAA,CAAM,MAAA,CAAOD,CAAM,CAAA,CACtB,CAAChJ,CAAS,EAAGqL,CACf,CACF,CACF,CAAA,CAAE,CAAA,CAEJ,WAAA,CAAa,CAACrC,CAAAA,CAAQhJ,IACN+I,CAAAA,EAAI,CACL,MAAA,CAAOC,CAAM,CAAA,GAAIhJ,CAAS,CAAA,CAGzC,aAAA,CAAe,CAACgJ,CAAAA,CAAQhJ,CAAAA,GACtB8I,CAAAA,CAAKG,CAAAA,EAAU,CACb,IAAMqC,CAAAA,CAAarC,CAAAA,CAAM,MAAA,CAAOD,CAAM,CAAA,CACtC,GAAI,CAACsC,CAAAA,CAAY,OAAOrC,CAAAA,CAExB,GAAM,CAAE,CAACjJ,CAAS,EAAGuL,CAAAA,CAAG,GAAGC,CAAK,CAAA,CAAIF,CAAAA,CACpC,OAAO,CACL,MAAA,CAAQ,CACN,GAAGrC,CAAAA,CAAM,MAAA,CACT,CAACD,CAAM,EAAGwC,CACZ,CACF,CACF,CAAC,CAAA,CAEH,iBAAA,CAAoBxC,CAAAA,EAClBF,CAAAA,CAAKG,CAAAA,EAAU,CACb,GAAID,CAAAA,CAAQ,CACV,GAAM,CAAE,CAACA,CAAM,EAAGuC,CAAAA,CAAG,GAAGC,CAAK,CAAA,CAAIvC,CAAAA,CAAM,MAAA,CACvC,OAAO,CAAE,MAAA,CAAQuC,CAAK,CACxB,CACA,OAAO,CAAE,MAAA,CAAQ,EAAG,CACtB,CAAC,CACL,CAAA,CAAA,CACA,CACE,IAAA,CAAM,iBACR,CACF,CACF,CAAA,CCtDA,IAAMC,EAAAA,CAAe,CACnBC,CAAAA,CACAC,EACA3C,CAAAA,CACA4C,CAAAA,IAoDO,CAAE,cAAA,CAlDcrC,WAAAA,CAAY,IAAM,CACvC,GAAI,CAEF,IAAMsC,CAAAA,CAAgB,MAAA,CAAO,WAAA,CAC3BF,CAAAA,CAAU,GAAA,CAAKrM,CAAAA,EAAU,CAACA,CAAAA,CAAM,SAAA,CAAW,EAAE,CAAC,CAChD,CAAA,CACAoM,CAAAA,CAAQ,KAAA,CAAMG,CAAa,CAAA,CAG3B,YAAA,CAAa,UAAA,CAAW,CAAA,KAAA,EAAQ7C,CAAM,CAAA,CAAE,EAGxCL,EAAAA,CAAa,QAAA,EAAS,CAAE,SAAA,CAAUK,CAAM,CAAA,CAGxCoC,EAAAA,CAAiB,QAAA,EAAS,CAAE,iBAAA,CAAkBpC,CAAM,CAAA,CAGpD,UAAA,CAAW,IAAM,CACf4C,CAAAA,CAAW,SAAA,GACb,CAAA,CAAG,CAAC,CAAA,CAGJE,EAAAA,CAAM,OAAA,CAAQ,qEAAA,CAA+C,CAC3D,QAAA,CAAU,GAAA,CACV,QAAA,CAAU,YAAA,CACV,KAAA,CAAO,CACL,UAAA,CAAY,UACZ,KAAA,CAAO,OAAA,CACP,UAAA,CAAY,MACd,CAAA,CACA,IAAA,CAAM,QACR,CAAC,CAAA,CAED,OAAA,CAAQ,GAAA,CAAI,mCAAA,CAAgC9C,CAAM,EACpD,CAAA,MAAS+C,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,6BAAA,CAA0BA,CAAK,CAAA,CAC7CD,EAAAA,CAAM,KAAA,CAAM,8CAAA,CAA6C,CACvD,QAAA,CAAU,GAAA,CACV,QAAA,CAAU,YAAA,CACV,KAAA,CAAO,CACL,WAAY,SAAA,CACZ,KAAA,CAAO,OAAA,CACP,UAAA,CAAY,MACd,CAAA,CACA,IAAA,CAAM,QACR,CAAC,EACH,CACF,CAAA,CAAG,CAACJ,CAAAA,CAASC,CAAAA,CAAW3C,CAAAA,CAAQ4C,CAAU,CAAC,CAEnB,CAAA,CAAA,CAGnBI,EAAAA,CAAQP,EAAAA,CCzDf,IAAMQ,GAAmB,CAACC,CAAAA,CAAmBC,CAAAA,GAA6B,CACxE,IAAMC,CAAAA,CAAOF,CAAAA,CAAU,OAAA,CAAQ,MAAA,CAAQ,EAAE,CAAA,CACzC,GAAI,eAAA,CAAgB,IAAA,CAAKC,CAAQ,CAAA,CAC/B,OAAOA,CAAAA,CAET,IAAME,CAAAA,CAAOF,CAAAA,CAAS,OAAA,CAAQ,MAAA,CAAQ,EAAE,CAAA,CACxC,OAAO,CAAA,EAAGC,CAAI,CAAA,CAAA,EAAIC,CAAI,CAAA,CACxB,CAAA,CAEMC,GAAsB,CAC1BC,CAAAA,CACAC,CAAAA,CACAjL,CAAAA,CACA0B,CAAAA,CACAD,CAAAA,CAAwB,CAAA,GACb,CACX,GAAIC,CAAAA,GAAmB,WAAA,CACrB,OAAIsJ,CAAAA,CAAsBhL,CAAAA,CAAK,QAAA,CAAS,MAAA,CAAS,CAAA,CACxCgL,CAAAA,CAAsB,CAAA,CAExB,EAAA,CAIT,IAAME,CAAAA,CADiBlL,CAAAA,CAAK,QAAA,CAASgL,CAAmB,CAAA,CACrB,UAAA,EAAY,MAAA,EAAU,CAAA,CACnDnI,CAAAA,CAAkB,IAAA,CAAK,IAAA,CAAKqI,EAAczJ,CAAa,CAAA,CAE7D,OAAIwJ,CAAAA,CAAmBpI,CAAAA,CAAkB,CAAA,CAChCmI,CAAAA,CAELA,CAAAA,CAAsBhL,CAAAA,CAAK,QAAA,CAAS,MAAA,CAAS,CAAA,CACxCgL,CAAAA,CAAsB,CAAA,CAExB,EACT,CAAA,CAEMG,EAAAA,CAA0B,MAC9BlK,CAAAA,CACAmK,CAAAA,CACAvK,CAAAA,GACkB,CAClB,IAAMwK,CAAAA,CAAUpK,CAAAA,CAAS,uBAAA,CACzB,GAAI,CAACoK,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAAA,CAGjE,IAAMC,CAAAA,CAAaD,CAAAA,CAAQ,gBAAA,EAAoB,CAC7C,SAAA,CAAWA,CAAAA,CAAQ,SAAA,CACnB,eAAA,CAAiBA,CAAAA,CAAQ,eAAA,CACzB,OAAA,CAASA,CAAAA,CAAQ,OAAA,CACjB,YAAA,CAAcA,CAAAA,CAAQ,YAAA,CACtB,MAAA,CAAQA,CAAAA,CAAQ,MAClB,CAAA,CAEMnK,CAAAA,CAAkBN,EAAAA,CAAyBK,CAAAA,CAAS,SAAA,CAAWJ,CAAW,CAAA,CAC1E0K,CAAAA,CAAmBvK,EAAAA,CAAqBC,CAAAA,CAAUJ,CAAAA,CAAaK,CAAe,CAAA,CAEpF,GAAI,CAACqK,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyCtK,CAAAA,CAAS,SAAS,CAAA,CAAE,CAAA,CAI/E,GAAI,CADqBmK,CAAAA,CAAWG,CAAAA,CAAiB,SAAS,CAAA,CAE5D,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAiBA,CAAAA,CAAiB,SAAS,CAAA,UAAA,CAAY,CAAA,CAGzE,IAAM9B,CAAAA,CAAMiB,EAAAA,CAAiBY,CAAAA,CAAW,SAAA,CAAWA,CAAAA,CAAW,eAAe,CAAA,CAGvEE,CAAAA,CAAgB,CACpB,GAFkBF,CAAAA,CAAW,OAAA,EAAW,EAAC,CAGzC,GAAGF,CACL,CAAA,CAEMK,CAAAA,CAAkC,CACtC,cAAA,CAAgB,kBAAA,CAChB,GAAIH,CAAAA,CAAW,YAAA,EAAgB,EACjC,CAAA,CACIA,CAAAA,CAAW,MAAA,GACbG,CAAAA,CAAQ,aAAA,CAAgB,CAAA,OAAA,EAAUH,CAAAA,CAAW,MAAM,CAAA,CAAA,CAAA,CAGrD,IAAMI,CAAAA,CAAa,IAAI,gBACjBC,CAAAA,CAAYN,CAAAA,CAAQ,SAAA,EAAa,IAAA,CAEjCO,CAAAA,CAAe,KAAA,CAAMnC,CAAAA,CAAK,CAC9B,MAAA,CAAQ,MAAA,CACR,OAAA,CAAAgC,CAAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUD,CAAa,CAAA,CAClC,MAAA,CAAQE,CAAAA,CAAW,MACrB,CAAC,CAAA,CAEKG,CAAAA,CAAY,UAAA,CAAW,IAAMH,CAAAA,CAAW,KAAA,EAAM,CAAGC,CAAS,CAAA,CAEhE,GAAI,CACF,IAAMG,CAAAA,CAAW,MAAMF,CAAAA,CACvB,YAAA,CAAaC,CAAS,CAAA,CAEtB,IAAIE,CAAAA,CAAoB,IAAA,CACxB,GAAI,CACFA,CAAAA,CAAe,MAAMD,CAAAA,CAAS,IAAA,GAChC,CAAA,KAAQ,CACN,IAAME,CAAAA,CAAO,MAAMF,CAAAA,CAAS,IAAA,EAAK,CACjC,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAAyBE,CAAI,CAAA,CAAE,CACjD,CAEA,GAAI,CAACF,CAAAA,CAAS,EAAA,CAAI,CAChB,IAAMG,CAAAA,CACJF,CAAAA,EAAc,OAAA,EACd,CAAA,+BAAA,EAAkCD,CAAAA,CAAS,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAS,UAAU,CAAA,CAAA,CAC1E,MAAM,IAAI,KAAA,CAAMG,CAAY,CAC9B,CAGA,GADgBF,CAAAA,EAAc,OAAA,GACd,CAAA,CAAA,EAASD,CAAAA,CAAS,MAAA,GAAW,GAAA,CAC3C,MAAM,IAAI,KAAA,CAAMC,CAAAA,EAAc,SAAW,iCAA8B,CAE3E,CAAA,MAASvB,CAAAA,CAAY,CAEnB,MADA,YAAA,CAAaqB,CAAS,CAAA,CAClBrB,CAAAA,CAAM,IAAA,GAAS,YAAA,CACX,IAAI,KAAA,CAAM,yDAA6C,CAAA,CAEzDA,CACR,CACF,CAAA,CAEM0B,EAAAA,CAA2B,CAC/B7B,CAAAA,CACA8B,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACArM,CAAAA,CACAoL,CAAAA,CACA1J,CAAAA,CACAD,CAAAA,CAAwB,CAAA,IAoGjB,CAAE,UAAA,CAlGU,SAAY,CAC7B4K,CAAAA,CAAgB,IAAI,CAAA,CACpB,GAAI,CACF,IAAM9F,CAAAA,CAAS,MAAM4F,CAAAA,EAAa,CAElC,GAAI5F,CAAAA,CAAO,aAAA,EAAiBA,CAAAA,CAAO,aAAA,CAAc,MAAA,CAAS,CAAA,CAAG,CAC3DA,CAAAA,CAAO,aAAA,CAAc,OAAA,CAASxI,CAAAA,EAAU,CACtCA,CAAAA,CAAM,MAAA,CAAO,OAAA,CAASyM,CAAAA,EAAU,CAC9BD,EAAAA,CAAM,KAAA,CAAM,CAAA,EAAGxM,CAAAA,CAAM,UAAU,CAAA,GAAA,EAAMyM,CAAK,CAAA,CAAE,EAC9C,CAAC,EACH,CAAC,CAAA,CACD,MACF,CAEA,GAAIjE,CAAAA,CAAO,mBAAA,EAAuBA,CAAAA,CAAO,mBAAA,CAAoB,MAAA,CAAS,CAAA,CAAG,CACvEA,CAAAA,CAAO,mBAAA,CAAoB,OAAA,CAASxI,CAAAA,EAAU,CAC5CwM,EAAAA,CAAM,KAAA,CAAM,CAAA,EAAGxM,CAAAA,CAAM,UAAU,CAAA,GAAA,EAAMA,CAAAA,CAAM,OAAO,CAAC,CAAC,CAAA,CAAE,EACxD,CAAC,CAAA,CACD,MACF,CAEA,GAAIwI,CAAAA,CAAO,uBAAA,EAA2BA,CAAAA,CAAO,uBAAA,CAAwB,MAAA,CAAS,CAAA,CAAG,CAC/EA,CAAAA,CAAO,uBAAA,CAAwB,OAAA,CAASxI,CAAAA,EAAU,CAChDwM,EAAAA,CAAM,KAAA,CAAM,CAAA,EAAGxM,CAAAA,CAAM,UAAU,CAAA,GAAA,EAAMA,CAAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,EACxD,CAAC,CAAA,CACD,MACF,CAIA,IAAMsE,CAAAA,CAAiBrC,CAAAA,CAAK,QAAA,CAASqK,CAAAA,CAAW,YAAY,CAAA,CAC5D,GAAIhI,CAAAA,EAAkB9B,EAAAA,CAAY8B,CAAc,CAAA,CAAG,CACjD,IAAMpB,CAAAA,CAAWT,EAAAA,CAAY6B,CAAc,CAAA,CAC3C,GAAIpB,CAAAA,CAAU,CACZ,IAAMqL,CAAAA,CAAWlB,CAAAA,CAAWnK,CAAAA,CAAS,SAAS,CAAA,CACxCsL,CAAAA,CAAYtL,EAAS,uBAAA,EAAyB,SAAA,EAAa,CAAA,CAMjE,GALsBA,CAAAA,CAAS,WAAA,EAAa,IAAA,CACzC/B,CAAAA,EAAMA,CAAAA,CAAE,cAAA,GAAmB,UAC9B,CAAA,GAKI,CAACoN,CAAAA,EACD,OAAOA,CAAAA,EAAa,QAAA,EACpBA,CAAAA,CAAS,MAAA,GAAWC,CAAAA,CAAAA,CACpB,CACAhC,EAAAA,CAAM,KAAA,CACJ,CAAA,+FAAA,EAAwFgC,CAAS,CAAA,UAAA,CACnG,CAAA,CACA,MACF,CAKJ,CACF,CAEA,IAAMC,EAAmBzB,EAAAA,CACvBV,CAAAA,CAAW,YAAA,CACXA,CAAAA,CAAW,SAAA,CACXrK,CAAAA,CACA0B,CAAAA,CACAD,CACF,CAAA,CAEA,GAAI+K,CAAAA,GAAqB,CAAA,CAAA,CAAI,CAC3B,IAAMC,CAAAA,CAAczM,CAAAA,CAAK,QAAA,CAASwM,CAAgB,CAAA,CAClD,GAAIjM,EAAAA,CAAYkM,CAAW,CAAA,CAAG,CAC5B,IAAMxL,CAAAA,CAAWT,EAAAA,CAAYiM,CAAW,CAAA,CACxC,GAAIxL,CAAAA,CACF,GAAI,CACF,MAAMkK,EAAAA,CAAwBlK,CAAAA,CAAUmK,CAAAA,CAAYpL,CAAAA,CAAK,QAAQ,CAAA,CACjEuK,EAAAA,CAAM,OAAA,CAAQ,qCAA+B,EAC/C,CAAA,MAASmC,CAAAA,CAAU,CACjB,IAAMC,CAAAA,CACJD,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,oCAAA,CACvCnC,EAAAA,CAAM,KAAA,CAAMoC,CAAO,CAAA,CACnB,MACF,CAEJ,CACF,CAEItC,CAAAA,CAAW,eAAA,CACbA,CAAAA,CAAW,iBAAgB,CAE3BA,CAAAA,CAAW,QAAA,EAAS,CAEtBE,EAAAA,CAAM,OAAA,CACJ,CAAA,oCAAA,EAAgChE,CAAAA,CAAO,mBAAmB,CAAA,CAAA,EAAIA,CAAAA,CAAO,kBAAkB,CAAA,eAAA,CACzF,EACF,CAAA,OAAE,CACA8F,CAAAA,CAAgB,KAAK,EACvB,CACF,CAEoB,CAAA,CAAA,CAGfO,EAAAA,CAAQV,EAAAA,CCpPR,IAAMW,EAAAA,CAAoB,IAAM,CACrC,GAAM,CAAE,OAAA,CAAAC,CAAAA,CAAS,SAAA,CAAAC,CAAU,CAAA,CAAIC,cAAAA,EAAe,CAsB9C,OAAO,CACL,cAAA,CArBqB,MAAO1K,CAAAA,EAA0C,CAEtE,IAAM2K,CAAAA,CAAa3K,CAAAA,CAAO,GAAA,CAAIvB,CAAAA,EAAKA,CAAAA,CAAE,SAAmB,CAAA,CAExD,GAAIkM,CAAAA,CAAW,MAAA,GAAW,CAAA,CACxB,OAAO,KAAA,CAGT,GAAI,CACF,IAAMC,CAAAA,CAAQ,MAAMJ,CAAAA,CAAQG,CAAU,CAAA,CACtC,OAAKC,CAAAA,EACH,OAAA,CAAQ,GAAA,CAAI,oCAAA,CAAgCH,CAAAA,CAAU,MAAM,CAAA,CAEvDG,CACT,CAAA,MAAS1C,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,+BAAA,CAAiCA,CAAK,CAAA,CAC7C,KACT,CACF,CAAA,CAIE,SAAA,CAAAuC,CACF,CACF,CAAA,CC5BA,IAAMI,EAAAA,CAMD,CAAC,CAAE,cAAA,CAAAC,CAAAA,CAAiB,EAAA,CAAI,gBAAAC,CAAAA,CAAkB,EAAA,CAAI,QAAA,CAAAlH,CAAAA,CAAU,QAAA,CAAAmH,CAAAA,CAAW,KAAA,CAAO,SAAA,CAAAC,CAAAA,CAAY,EAAG,CAAA,GAAM,CAClG,GAAM,CAACC,CAAAA,CAAWC,CAAY,CAAA,CAAI1L,QAAAA,CAAS,KAAK,CAAA,CAC1C,CAAC2L,CAAS,CAAA,CAAI3L,QAAAA,CAAS,IAAM,CAAA,QAAA,EAAW,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,OAAO,CAAA,CAAG,CAAC,CAAC,CAAA,CAAE,CAAA,CAIvF,GAAI,EAFeqL,CAAAA,CAAe,IAAA,EAAK,EAAKC,CAAAA,CAAgB,IAAA,EAAK,CAAA,CAEhD,OAAOjH,GAAAA,CAAAuH,QAAAA,CAAA,CAAG,QAAA,CAAAxH,CAAAA,CAAS,CAAA,CAEpC,IAAMyH,CAAAA,CAAkB,CACtB,GAAA,CAAK,sDAAA,CACL,MAAA,CAAQ,mDAAA,CACR,IAAA,CAAM,oDAAA,CACN,KAAA,CAAO,mDACT,CAAA,CAEMC,EAAe,CACnB,GAAA,CAAK,wJAAA,CACL,MAAA,CAAQ,2JAAA,CACR,IAAA,CAAM,wJAAA,CACN,KAAA,CAAO,yJACT,CAAA,CAEA,OACEC,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,sBAAA,EAAyBP,CAAS,CAAA,CAAA,CAC7C,YAAA,CAAc,IAAME,CAAAA,CAAa,IAAI,CAAA,CACrC,YAAA,CAAc,IAAMA,CAAAA,CAAa,KAAK,CAAA,CACtC,OAAA,CAAS,IAAMA,CAAAA,CAAa,IAAI,CAAA,CAChC,OAAQ,IAAMA,CAAAA,CAAa,KAAK,CAAA,CAE/B,QAAA,CAAA,CAAAtH,CAAAA,CAEAqH,CAAAA,EACCM,IAAAA,CAAC,KAAA,CAAA,CACC,EAAA,CAAIJ,CAAAA,CACJ,IAAA,CAAK,SAAA,CACL,SAAA,CAAW,CAAA,sJAAA,EAAyJE,CAAAA,CAAgBN,CAAQ,CAAC,CAAA,CAAA,CAC7L,KAAA,CAAO,CACL,SAAA,CAAW,kDAAA,CACX,UAAA,CAAY,KAAA,CACZ,QAAA,CAAU,YAAA,CACV,OAAA,CAAS,MACX,CAAA,CAEA,QAAA,CAAA,CAAAlH,GAAAA,CAAC,OAAI,SAAA,CAAU,oBAAA,CACb,QAAA,CAAA0H,IAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,iCAAA,CACX,QAAA,CAAA,CAAAV,CAAAA,EAAkBhH,GAAAA,CAAC,IAAA,CAAA,CAAI,QAAA,CAAAgH,CAAAA,CAAe,CAAA,CACtCC,CAAAA,EAAmBjH,GAAAA,CAAC,IAAA,CAAA,CAAI,QAAA,CAAAiH,CAAAA,CAAgB,CAAA,CAAA,CAC3C,CAAA,CAEF,CAAA,CACEjH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW,CAAA,iBAAA,EAAoByH,CAAAA,CAAaP,CAAQ,CAAC,CAAA,CAAA,CAAI,CAAA,CAAA,CAClE,CAAA,CAGFlH,IAAC,OAAA,CAAA,CAAO,QAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,CAWN,CAAA,CAAA,CACJ,CAEJ,CAAA,CAEO2H,EAAAA,CAAQZ,EAAAA,CCuCR,IAAMa,CAAAA,CAAmB,CAC9BhC,CAAAA,CACAiC,CAAAA,CAAsB,IAAA,GAEjBjC,CAAAA,CACD,OAAOA,CAAAA,EAAS,QAAA,CAAiBA,CAAAA,CAC9BA,CAAAA,CAAKiC,CAAW,CAAA,EAAKjC,CAAAA,CAAK,EAAA,EAASA,CAAAA,CAAK,EAAA,EAAS,OAAO,MAAA,CAAOA,CAAI,CAAA,CAAE,CAAC,CAAA,EAAK,EAAA,CAFhE,EAAA,CAYb,IAAMkC,EAAAA,CAAwBxB,CAAAA,EAAuB,CAC1D,GAAI,CAACA,CAAAA,CAAK,OAAO,GAGjB,GAAI,KAAA,CAAM,OAAA,CAAQA,CAAG,CAAA,CACnB,OAAOA,CAAAA,CAAI,OAAA,CAAQyB,CAAAA,EAAKD,EAAAA,CAAqBC,CAAC,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAIjE,GAAI,OAAOzB,CAAAA,EAAQ,QAAA,EAAYA,CAAAA,GAAQ,IAAA,CAAM,CAC3C,GAAI,OAAOA,CAAAA,CAAI,OAAA,EAAY,QAAA,EAAYA,CAAAA,CAAI,OAAA,CAAQ,IAAA,EAAK,CACtD,OAAO,CAACA,CAAAA,CAAI,OAAO,CAAA,CAGrB,GAAIA,CAAAA,CAAI,IAAA,EAAQ,OAAOA,CAAAA,CAAI,IAAA,EAAS,QAAA,CAClC,OAAO,CAACA,CAAAA,CAAI,IAAI,CAEpB,CAGA,OAAI,OAAOA,CAAAA,EAAQ,QAAA,EAAYA,CAAAA,CAAI,IAAA,EAAK,CAC/B,CAACA,CAAG,CAAA,CAGN,EACT,CAAA,CAIa0B,CAAAA,CAMR,CAAC,CAAE,MAAArQ,CAAAA,CAAO,WAAA,CAAAkQ,CAAAA,CAAc,IAAA,CAAM,SAAA,CAAAI,CAAAA,CAAY,IAAA,CAAM,QAAA,CAAAlI,CAAAA,CAAU,eAAA,CAAAmI,CAAAA,CAAkB,OAAQ,CAAA,GAAM,CAG7F,IAAMC,CAAAA,CAAaxQ,EAAM,WAAA,EAAa,IAAA,CAAKmB,CAAAA,EAAKA,CAAAA,CAAE,cAAA,GAAmB,UAAU,CAAA,CACzE,CAAE,SAAA,CAAA6N,CAAAA,CAAW,aAAA,CAAAyB,CAAc,CAAA,CAAIxB,cAAAA,EAAe,CAGpD,SAASyB,CAAAA,CAAUC,CAAAA,CAAU5D,CAAAA,CAAmB,CAC9C,GAAI,EAAA,CAAC4D,CAAAA,EAAO,CAAC5D,CAAAA,CAAAA,CACb,OAAOA,CAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAACzL,EAAKsP,CAAAA,GAAS,CAC3C,GAAKtP,CAAAA,CACL,OAAI,KAAA,CAAM,OAAA,CAAQA,CAAG,CAAA,CAAUA,CAAAA,CAAI,MAAA,CAAOsP,CAAI,CAAC,CAAA,CACxCtP,CAAAA,CAAIsP,CAAI,CACjB,CAAA,CAAGD,CAAG,CACR,CAGE,IAAMjQ,CAAAA,CAAYV,CAAAA,CAAM,SAAA,EAAW,QAAA,EAAS,EAAK,EAAA,CAC7CyM,CAAAA,CAAQiE,CAAAA,CAAU1B,CAAAA,CAAU,MAAA,CAAQtO,CAAS,EAC7CmQ,CAAAA,CAAaJ,CAAAA,CAAc/P,CAAAA,CAAWsO,CAAS,CAAA,CAE/C8B,CAAAA,CAAgBX,EAAAA,CAAqB1D,CAAK,CAAA,CAG1CsE,CAAAA,CAAYD,CAAAA,CAAc,MAAA,CAAS,CAAA,GAEtCD,CAAAA,CAAW,SAAA,EAAaA,CAAAA,CAAW,OAAA,EAEpC7B,CAAAA,CAAU,WAAA,EAEVA,CAAAA,CAAU,WAAA,CAAc,CAAA,CAAA,CAIpBgC,CAAAA,CAAcf,CAAAA,CAAiBjQ,CAAAA,CAAM,OAAA,CAASkQ,CAAW,CAAA,CAE/D,OACEH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,OACZ,QAAA,CAAA,CAAAO,CAAAA,EACCP,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CAEX,QAAA,CAAA,CAAA,CAAAiB,CAAAA,EAAehR,CAAAA,CAAM,QAAA,GACrBqI,GAAAA,CAAC2H,EAAAA,CAAA,CACC,cAAA,CAAgBgB,CAAAA,CAChB,eAAA,CACEhR,EAAM,QAAA,CACFiQ,CAAAA,CAAiBjQ,CAAAA,CAAM,QAAA,CAAUkQ,CAAW,CAAA,CAC5C,EAAA,CAEN,QAAA,CAAUK,CAAAA,CACV,SAAA,CAAU,MAAA,CAEV,QAAA,CAAAlI,GAAAA,CAAC4I,aAAAA,CAAA,CACC,IAAA,CAAM,GACN,SAAA,CAAU,8EAAA,CACV,QAAA,CAAU,CAAA,CACV,YAAA,CAAW,+BAAA,CACb,CAAA,CACF,CAAA,CAGFlB,IAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,yCAAA,CACd,QAAA,CAAA,CAAAE,CAAAA,CAAiBjQ,CAAAA,CAAM,KAAA,CAAOkQ,CAAW,CAAA,CACzCM,CAAAA,EACCnI,GAAAA,CAAC6I,WAAAA,CAAA,CAAY,IAAA,CAAM,EAAA,CAAI,SAAA,CAAU,0BAAA,CAA2B,CAAA,CAAA,CAEhE,CAAA,CAAA,CAIF,CAAA,CAGD9I,CAAAA,CAIA2I,CAAAA,EAAaD,CAAAA,CAAc,IAAI,CAACK,CAAAA,CAAKC,CAAAA,GACpC/I,GAAAA,CAAC,GAAA,CAAA,CAAY,SAAA,CAAU,2BAAA,CACpB,QAAA,CAAA,OAAO8I,CAAAA,EAAQ,QAAA,EAAYA,CAAAA,CAAI,IAAA,EAAK,CAAIA,CAAAA,CAAM,gBAAA,CAAA,CADzCC,CAER,CACD,CAAA,CAEApR,CAAAA,CAAM,OAAA,EACL+P,IAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,8CAAA,CAA+C,QAAA,CAAA,CAAA,WAAA,CAChDE,CAAAA,CAAiBjQ,CAAAA,CAAM,OAAA,CAASkQ,CAAW,CAAA,CAAA,CACvD,CAAA,CAAA,CAEJ,CAEJ,CAAA,CC1PA,IAAMmB,EAAAA,CAAwB,CAAC/E,CAAAA,CAAiBF,CAAAA,CAAwB8D,CAAAA,CAAsB,IAAA,CAAMvM,CAAAA,CAA2C,UAAA,GAAe,CAC1J,GAAM,CAAC2N,CAAAA,CAAchD,CAAe,CAAA,CAAItK,QAAAA,CAAS,KAAK,CAAA,CAChD,CAAE,cAAA,CAAAuN,CAA0B,CAAA,CAAIzC,EAAAA,EAAkB,CAiQxD,OAAO,CAAE,YAAA,CA/PY,SAA2C,CAC5DR,CAAAA,CAAgB,IAAI,EAEpB,GAAI,CACA,IAAMrN,CAAAA,CAASmL,CAAAA,CAAQ,SAAA,EAAU,CAG3BnM,CAAAA,CAAqD,EAAC,CAC5D,MAAA,CAAO,OAAA,CAAQgB,CAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAACsB,CAAAA,CAAK3B,CAAK,CAAA,GAAM,CAC7CX,CAAAA,CAAmBsC,CAAG,CAAA,CAAI,CAAE,aAAA,CAAe3B,CAAM,EACrD,CAAC,CAAA,CAGD,IAAM4Q,CAAAA,CAAoBlF,CAAAA,CAAW,aAAe,EAAC,CAC/ChI,CAAAA,CAAiBgI,CAAAA,CAAW,cAAA,CAE5BmF,CAAAA,CAAkB9N,CAAAA,GAAmB,WAAA,CACrC,CAAA,QAAA,EAAW2I,CAAAA,CAAW,YAAA,CAAe,CAAC,CAAA,CAAA,CACtC,CAAA,QAAA,EAAWA,CAAAA,CAAW,YAAA,CAAe,CAAC,CAAA,OAAA,EAAUA,CAAAA,CAAW,SAAA,CAAY,CAAC,CAAA,CAAA,CAKxE9H,CAAAA,CAAeF,CAAAA,CAAiB9B,EAAAA,CAAY8B,CAAc,CAAA,CAAI,CAAA,CAAA,CAC9DpB,CAAAA,CAAWsB,CAAAA,EAAgBF,CAAAA,CAAiB7B,EAAAA,CAAY6B,CAAc,CAAA,CAAI,KAAA,CAAA,CAGhF,GAAIE,CAAAA,EAAgBtB,CAAAA,CAAU,CAC1B,IAAMqL,CAAAA,CAAWtN,CAAAA,CAAOiC,CAAAA,CAAS,SAAS,CAAA,CACpCsL,CAAAA,CAAYtL,CAAAA,CAAS,uBAAA,EAAyB,SAAA,EAAa,EAGjE,GAAI,CAACqL,CAAAA,EAAY,OAAOA,CAAAA,EAAa,QAAA,EAAYA,CAAAA,CAAS,MAAA,GAAWC,CAAAA,CAAW,CAC5E,IAAMkD,CAAAA,CAAazB,CAAAA,CAAiB/M,CAAAA,CAAS,KAAA,CAAOgN,CAAW,EAC/D,OAAO,CACH,OAAA,CAAS,CAAA,CAAA,CACT,OAAA,CAAS,CAAA,CAAA,CACT,uBAAA,CAAyB,CAAA,CAAA,CACzB,kBAAA,CAAoB,CAAA,CACpB,mBAAA,CAAqB,CAAC,CAClB,SAAA,CAAWhN,CAAAA,CAAS,SAAA,CACpB,UAAA,CAAAwO,CAAAA,CACA,MAAA,CAAQ,CAAC,CAAA,0BAAA,EAA6BlD,CAAS,CAAA,SAAA,CAAW,CAC9D,CAAC,CAAA,CACD,aAAA,CAAe,EAAC,CAChB,uBAAA,CAAyB,EAAC,CAC1B,oBAAqB,CACzB,CACJ,CAGA,OAAO,CACH,OAAA,CAAS,CAAA,CAAA,CACT,OAAA,CAAS,CAAA,CAAA,CACT,uBAAA,CAAyB,CAAA,CAAA,CACzB,kBAAA,CAAoB,CAAA,CACpB,mBAAA,CAAqB,EAAC,CACtB,cAAe,EAAC,CAChB,uBAAA,CAAyB,EAAC,CAC1B,mBAAA,CAAqB,CACzB,CACJ,CAGA,IAAMmD,CAAAA,CAA2BH,CAAAA,CAAkB,MAAA,CAAQxR,CAAAA,EAAqB,CAE5E,IAAM4R,EAAiBzR,EAAAA,CAAqBmE,CAAAA,CAAgBrE,CAAkB,CAAA,CAGxE4R,CAAAA,CAAgB9R,EAAAA,CAAuBC,CAAAA,CAAOC,CAAkB,CAAA,CAEhEwP,CAAAA,CAAYmC,CAAAA,EAAkBC,CAAAA,CAQpC,OAAOpC,CACX,CAAC,CAAA,CAGKqC,CAAAA,CAA6BH,CAAAA,CAC9B,MAAA,CAAQ3O,CAAAA,EAAiBA,CAAAA,CAAE,WAAW,CAAA,CACtC,OAAA,CAASA,CAAAA,EAAiB,CACvB,IAAMzC,CAAAA,CAAQyC,CAAAA,CAAE,WAAA,CACV+O,CAAAA,CAAgB9Q,CAAAA,CAAOV,EAAM,SAAS,CAAA,EAAG,MAAA,EAAU,CAAA,CAEnDyR,CAAAA,CAA8B,EAAC,CAErC,IAAA,IAASjP,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIgP,CAAAA,CAAehP,CAAAA,EAAAA,CAC/B,IAAA,IAAWkP,CAAAA,IAAa1R,CAAAA,CAAM,WAAY,CACtC,IAAM2R,CAAAA,CAAgB,CAClB,GAAGD,CAAAA,CACH,SAAA,CAAW,CAAA,EAAG1R,CAAAA,CAAM,SAAS,CAAA,CAAA,EAAI0R,CAAAA,CAAU,SAAS,CAAA,CAAA,EAAIlP,CAAC,CAAA,CAC7D,EAEIhD,EAAAA,CAAuBmS,CAAAA,CAAejS,CAAkB,CAAA,EACxD+R,CAAAA,CAAe,IAAA,CAAKE,CAAa,EAEzC,CAGJ,OAAOF,CACX,CAAC,CAAA,CAGCG,CAAAA,CAAmB,CAAC,GAAGR,CAAAA,CAA0B,GAAGG,CAA0B,CAAA,CAQ9EM,CAAAA,CAAU,MAAMb,CAAAA,CAAeY,CAAgB,CAAA,CAG/CE,CAAAA,CAAY,IAAI,GAAA,CAAIF,CAAAA,CAAiB,GAAA,CAAInP,CAAAA,EAAK,CAACA,EAAE,SAAA,CAAWA,CAAC,CAAC,CAAC,CAAA,CAG/DsP,CAAAA,CAAiBH,CAAAA,CAAiB,MAAA,CAAQnS,CAAAA,EAAU,CACtD,IAAMwQ,CAAAA,CAAaxQ,CAAAA,CAAM,WAAA,EAAa,IAAA,CACjCmB,CAAAA,EAAsBA,EAAE,cAAA,GAAmB,UAChD,CAAA,CAIA,OAAOqP,CACX,CAAC,CAAA,CAGK+B,CAAAA,CAA2BD,CAAAA,CAAe,KAAA,CAAOtS,CAAAA,EAAU,CAC7D,IAAMwS,CAAAA,CAAY,CAAC,CAACpG,EAAQ,SAAA,CAAU,aAAA,GAAgBpM,CAAAA,CAAM,SAAS,CAAA,CACrE,OAAKwS,CAAAA,EACD,OAAA,CAAQ,IAAA,CAAK,CAAA,4CAAA,EAAyCxS,CAAAA,CAAM,SAAS,CAAA,CAAE,CAAA,CAEpEwS,CACX,CAAC,CAAA,CAGKC,CAAAA,CAA0BH,CAAAA,CAAe,KAAA,CAAOtS,CAAAA,EAAU,CAC5D,IAAM4C,CAAAA,CAAa3B,CAAAA,CAAOjB,CAAAA,CAAM,SAAS,CAAA,CACnCsC,CAAAA,CAAS,KAAA,CAAM,OAAA,CAAQM,CAAU,EACjCA,CAAAA,CAAW,MAAA,CAAS,CAAA,CACQA,CAAAA,EAAe,IAAA,EAAQA,CAAAA,GAAe,EAAA,CAExE,OAAKN,CAAAA,EACD,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAAmCtC,CAAAA,CAAM,SAAS,CAAA,OAAA,CAAA,CAAM4C,CAAU,EAK5EN,CACX,CAAC,CAAA,CAGKoQ,CAAAA,CAAmBP,CAAAA,CAAiB,KAAA,CAAOnS,CAAAA,EACtC,CAAC,CAACoM,CAAAA,CAAQ,SAAA,CAAU,aAAA,GAAgBpM,CAAAA,CAAM,SAAS,CAC7D,CAAA,CAIK2S,EAAwC,EAAC,CAC3CvG,CAAAA,CAAQ,SAAA,CAAU,MAAA,EAClB,MAAA,CAAO,OAAA,CAAQA,CAAAA,CAAQ,SAAA,CAAU,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC1L,CAAAA,CAAW+L,CAAK,CAAA,GAAM,CACrE,IAAMzM,CAAAA,CAAQqS,CAAAA,CAAU,GAAA,CAAI3R,CAAS,CAAA,CACrC,GAAIV,CAAAA,EAASyM,CAAAA,CAAO,CAChB,IAAMmG,CAAAA,CAAWzC,EAAAA,CAAqB1D,CAAK,EACvCmG,CAAAA,CAAS,MAAA,CAAS,CAAA,EAClBD,CAAAA,CAAc,IAAA,CAAK,CACf,SAAA,CAAAjS,CAAAA,CACA,UAAA,CAAYuP,CAAAA,CAAiBjQ,CAAAA,CAAM,KAAA,CAAOkQ,CAAW,CAAA,CACrD,MAAA,CAAQ0C,CACZ,CAAC,EAET,CACJ,CAAC,CAAA,CAIL,IAAMC,CAAAA,CAAkD,EAAC,CACzDP,CAAAA,CAAe,OAAA,CAAQtS,CAAAA,EAAS,CACRoM,CAAAA,CAAQ,SAAA,CAAU,aAAA,GAAgBpM,CAAAA,CAAM,SAAS,CAAA,EAEjE6S,CAAAA,CAAwB,IAAA,CAAK,CACzB,SAAA,CAAW7S,CAAAA,CAAM,SAAA,CACjB,UAAA,CAAYiQ,CAAAA,CAAiBjQ,CAAAA,CAAM,KAAA,CAAOkQ,CAAW,CAAA,CACrD,MAAA,CAAQ,CAAC,yBAAyB,CACtC,CAAC,EAET,CAAC,CAAA,CAGD,IAAM4C,CAAAA,CAA8C,EAAC,CACrD,OAAAR,CAAAA,CAAe,OAAA,CAAQtS,CAAAA,EAAS,CAC5B,IAAMY,CAAAA,CAAQK,EAAOjB,CAAAA,CAAM,SAAS,CAAA,CAAA,CACrB,KAAA,CAAM,OAAA,CAAQY,CAAK,CAAA,CAC5BA,CAAAA,CAAM,MAAA,CAAS,CAAA,CACQA,CAAAA,EAAU,IAAA,EAAQA,CAAAA,GAAU,EAAA,GAErDkS,CAAAA,CAAoB,IAAA,CAAK,CACrB,SAAA,CAAW9S,CAAAA,CAAM,SAAA,CACjB,UAAA,CAAYiQ,CAAAA,CAAiBjQ,CAAAA,CAAM,KAAA,CAAOkQ,CAAW,CAAA,CACrD,MAAA,CAAQ,CAAC,cAAc,CAC3B,CAAC,EAET,CAAC,EAEc,CACX,OAAA,CAASkC,CAAAA,EAAWK,CAAAA,CACpB,OAAA,CAASF,CAAAA,CACT,uBAAA,CAAAE,CAAAA,CACA,kBAAA,CAAoBN,CAAAA,CAAiB,MAAA,CACrC,mBAAA,CAAqBG,CAAAA,CAAe,MAAA,CAEpC,WAAA,CAAab,CAAAA,CACb,YAAA,CAAcnF,CAAAA,CAAW,YAAA,CACzB,SAAA,CAAWA,CAAAA,CAAW,SAAA,CACtB,gBAAA,CAAAoG,CAAAA,CACA,UAAA,CAAYP,CAAAA,CAAiB,GAAA,CAAInP,CAAAA,EAAKA,CAAAA,CAAE,SAAS,CAAA,CAEjD,aAAA,CAAA2P,EACA,uBAAA,CAAAE,CAAAA,CACA,mBAAA,CAAAC,CACJ,CAYJ,CAAA,MAASrG,CAAAA,CAAO,CACZ,OAAA,OAAA,CAAQ,KAAA,CAAM,0CAAA,CAA4CA,CAAK,CAAA,CACxD,CACH,OAAA,CAAS,KAAA,CACT,QAAS,KAAA,CACT,uBAAA,CAAyB,KAAA,CACzB,kBAAA,CAAoB,CAAA,CACpB,mBAAA,CAAqB,CAAA,CACrB,aAAA,CAAe,EAAC,CAChB,uBAAA,CAAyB,EAAC,CAC1B,mBAAA,CAAqB,EACzB,CACJ,CAAA,OAAE,CACE6B,CAAAA,CAAgB,KAAK,EACzB,CACJ,CAAA,CAEuB,YAAA,CAAAgD,CAAAA,CAAc,eAAA,CAAAhD,CAAgB,CACzD,CAAA,CAEOyE,EAAAA,CAAQ1B,EAAAA,CCxQf,IAAM2B,EAAAA,CAAoB,CACxB5G,CAAAA,CACAnK,CAAAA,CACAmM,CAAAA,CACA6E,CAAAA,CACA3E,CAAAA,IA4CO,CAAE,0BAAA,CA1C0B,SAAY,CAC7CA,CAAAA,CAAgB,IAAI,EACpB,GAAI,CACF,IAAM9F,CAAAA,CAAS,MAAM4F,CAAAA,EAAa,CAGlC,GAAI5F,CAAAA,CAAO,aAAA,EAAiBA,CAAAA,CAAO,aAAA,CAAc,MAAA,CAAS,CAAA,CAAG,CAC3DA,CAAAA,CAAO,cAAc,OAAA,CAAQxI,CAAAA,EAAS,CACpCA,CAAAA,CAAM,MAAA,CAAO,OAAA,CAAQyM,CAAAA,EAAS,CAC5BD,EAAAA,CAAM,KAAA,CAAM,CAAA,EAAGxM,CAAAA,CAAM,UAAU,CAAA,GAAA,EAAMyM,CAAK,CAAA,CAAE,EAC9C,CAAC,EACH,CAAC,CAAA,CACD,MACF,CAEA,GAAIjE,CAAAA,CAAO,mBAAA,EAAuBA,CAAAA,CAAO,mBAAA,CAAoB,MAAA,CAAS,CAAA,CAAG,CACvEA,CAAAA,CAAO,mBAAA,CAAoB,QAAQxI,CAAAA,EAAS,CAC1CwM,EAAAA,CAAM,KAAA,CAAM,CAAA,EAAGxM,CAAAA,CAAM,UAAU,CAAA,GAAA,EAAMA,CAAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,EACxD,CAAC,CAAA,CACD,MACF,CAEA,GAAIwI,CAAAA,CAAO,uBAAA,EAA2BA,CAAAA,CAAO,uBAAA,CAAwB,MAAA,CAAS,CAAA,CAAG,CAC/EA,CAAAA,CAAO,uBAAA,CAAwB,OAAA,CAAQxI,CAAAA,EAAS,CAC9CwM,EAAAA,CAAM,KAAA,CAAM,GAAGxM,CAAAA,CAAM,UAAU,CAAA,GAAA,EAAMA,CAAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,EACxD,CAAC,CAAA,CACD,MACF,CAEA,IAAMoC,CAAAA,CAAOgK,CAAAA,CAAQ,WAAU,CACzB8G,CAAAA,CAAgB/Q,EAAAA,CAA4BC,CAAAA,CAAMH,CAAAA,CAAK,QAAQ,CAAA,CAC/DkR,CAAAA,CAAgBzQ,EAAAA,CAAiBwQ,CAAAA,CAAejR,CAAAA,CAAK,QAAQ,CAAA,CAC7DmR,CAAAA,CAAiB9K,EAAAA,CAAkB6K,CAAAA,CAAelR,CAAAA,CAAK,QAAQ,CAAA,CAErEgR,CAAAA,CAASG,CAAc,CAAA,CAEvB5G,EAAAA,CAAM,OAAA,CAAQ,CAAA,8CAAA,EAAuChE,CAAAA,CAAO,mBAAmB,CAAA,0BAAA,CAAyB,EAC1G,CAAA,OAAE,CACA8F,CAAAA,CAAgB,KAAK,EACvB,CACF,CAEoC,CAAA,CAAA,CAG/B+E,EAAAA,CAAQL,EAAAA,CCgFR,IAAMM,EAAAA,CAA8BC,CAAAA,EAA+B,CACxE,GAAM,CAAE,KAAA,CAAAC,CAAAA,CAAO,QAAA,CAAAC,CAAAA,CAAU,SAAA,CAAAC,CAAU,CAAA,CAAIzE,gBAAe,CAChD,CAAC0E,CAAAA,CAAuBC,CAAwB,CAAA,CAAI5P,QAAAA,CAAsBuP,CAAa,CAAA,CACvFM,CAAAA,CAAoBzP,MAAAA,CAA4B,EAAE,CAAA,CAGlD0P,CAAAA,CAAsB7J,WAAAA,CAAavJ,CAAAA,EAChC6S,CAAAA,CAAc,MAAA,CAAOvT,CAAAA,EAC1BA,CAAAA,CAAM,iBAAA,EAAmB,kBAAA,GAAuBU,CAClD,CAAA,CACC,CAAC6S,CAAa,CAAC,CAAA,CAGZQ,CAAAA,CAAe9J,WAAAA,CAAY,CAC/BvJ,CAAAA,CACA2M,IACG,CACqByG,CAAAA,CAAoBpT,CAAS,CAAA,CAErC,OAAA,CAAQsT,CAAAA,EAAkB,CACnB3G,CAAAA,CAAW2G,CAAAA,CAAe,SAAS,CAAA,EAGtDP,CAAAA,CAASO,CAAAA,CAAe,SAAA,CAAW,EAAA,CAAI,CAAE,eAAgB,KAAM,CAAC,CAAA,CAIlED,CAAAA,CAAaC,CAAAA,CAAe,SAAA,CAAW3G,CAAU,EACnD,CAAC,EACH,CAAA,CAAG,CAACyG,CAAAA,CAAqBL,CAAQ,CAAC,CAAA,CAG5BQ,EAAqBhK,WAAAA,CAAY,CAACjK,CAAAA,CAAkBqN,CAAAA,GAA+C,CACvG,GAAI,CAACrN,CAAAA,CAAM,iBAAA,EAAqBA,CAAAA,CAAM,SAAA,GAAc,UAAA,CAClD,OAAOA,CAAAA,CAGT,GAAM,CAAE,kBAAA,CAAAkU,CAAAA,CAAoB,UAAA,CAAAC,CAAW,CAAA,CAAInU,CAAAA,CAAM,iBAAA,CAC3CoU,CAAAA,CAAiB/G,CAAAA,CAAW6G,CAAkB,CAAA,CAUpD,GAAI,CAACE,CAAAA,EAAkB,CAACD,CAAAA,CAAW,KAAKC,CAAc,CAAA,CAEpD,OAAO,CACL,GAAGpU,CAAAA,CACH,aAAA,CAAe,EACjB,CAAA,CAGF,IAAMqU,CAAAA,CAAkBF,CAAAA,CAAW,IAAA,CAAKC,CAAc,CAAA,CAOtD,OAAO,CACL,GAAGpU,CAAAA,CACH,aAAA,CAAeqU,CACjB,CACF,CAAA,CAAG,EAAE,CAAA,CAGCC,CAAAA,CAA8BrK,WAAAA,CAAY,CAAC1F,CAAAA,CAAqB8I,CAAAA,GAC7D9I,CAAAA,CAAO,IAAIvE,CAAAA,EAASiU,CAAAA,CAAmBjU,CAAAA,CAAOqN,CAAU,CAAC,CAAA,CAC/D,CAAC4G,CAAkB,CAAC,CAAA,CAGvB,OAAAM,SAAAA,CAAU,IAAM,CAEd,IAAMC,CAAAA,CAAgBhB,CAAAA,EAAM,CAC5BK,CAAAA,CAAkB,OAAA,CAAU,CAAE,GAAGW,CAAc,CAAA,CAE/C,IAAMC,CAAAA,CAAejB,CAAAA,CAAM,CAACnG,CAAAA,CAAY,CAAE,IAAA,CAAMqH,CAAiB,IAAM,CAKrE,qBAAA,CAAsB,IAAM,CAC1B,UAAA,CAAW,IAAM,CAIf,IAAMC,CAAAA,CAAoBjB,CAAAA,EAAU,CAG9BkB,CAAAA,CAAgBN,CAAAA,CAA4Bf,CAAAA,CAAeoB,CAAiB,CAAA,CAUlF,GAJAf,CAAAA,CAAyBgB,CAAa,CAAA,CAIlCF,CAAAA,CAAkB,CACpB,IAAMG,CAAAA,CAAetB,CAAAA,CAAc,IAAA,CAAKvQ,CAAAA,EAAKA,CAAAA,CAAE,SAAA,GAAc0R,CAAgB,CAAA,CACvEI,CAAAA,CAAgBjB,CAAAA,CAAkB,QAAQa,CAAgB,CAAA,CAC1DK,CAAAA,CAAeJ,CAAAA,CAAkBD,CAAgB,CAAA,CAGnDG,CAAAA,EAAgB,CAACA,CAAAA,CAAa,iBAAA,EAAqBC,CAAAA,GAAkBC,CAAAA,GAGnE,CAACA,CAAAA,EAAgDD,CAAAA,EAAkB,IAAA,EAAQA,CAAAA,GAAkB,EAAA,CAAA,EAM/F,UAAA,CAAW,IAAM,CACff,CAAAA,CAAaW,CAAAA,CAAkBC,CAAiB,EAClD,CAAA,CAAG,CAAC,CAAA,CAORd,CAAAA,CAAkB,OAAA,CAAU,CAAE,GAAGc,CAAkB,EACrD,CACF,CAAA,CAAG,EAAE,EACP,CAAC,EACH,CAAC,CAAA,CAED,OAAO,IAAMF,CAAAA,CAAa,WAAA,EAC5B,CAAA,CAAG,CAACjB,EAAOE,CAAAA,CAAWH,CAAAA,CAAee,CAAAA,CAA6BP,CAAY,CAAC,CAAA,CAExEJ,CACT,CAAA,CAMaqB,EAAAA,CAAiC,CAACC,CAAAA,CAAgCC,CAAAA,CAAyBC,CAAAA,CAAgB,CAAA,GAAM,CAC5H,GAAM,CAAE,KAAA,CAAA3B,CAAAA,CAAO,QAAA,CAAAC,CAAAA,CAAU,SAAA,CAAAC,CAAU,CAAA,CAAIzE,cAAAA,EAAe,CAChD,CAACmG,CAAAA,CAA2BC,CAA4B,CAAA,CAAIrR,QAAAA,CAAsBiR,CAAiB,CAAA,CACnGpB,CAAAA,CAAoBzP,MAAAA,CAA4B,EAAE,CAAA,CAQlDkR,CAAAA,CAAoBrL,WAAAA,CAAY,CAACoD,CAAAA,CAAiCkI,CAAAA,CAAuBJ,CAAAA,CAAeK,CAAAA,GAAgE,CAC5K,IAAMC,CAAAA,CAAgB,CAAA,EAAGP,CAAe,CAAA,CAAA,EAAIK,CAAa,CAAA,CAAA,EAAIJ,CAAK,CAAA,CAAA,CAK5DR,CAAAA,CAAoBa,CAAAA,CAAcA,CAAAA,EAAY,CAAI,IAAA,CAexD,OAdcb,CAAAA,CAAoBA,CAAAA,CAAkBc,CAAa,CAAA,CAAIjC,CAAAA,CAAMiC,CAAa,CAe1F,CAAA,CAAG,CAACP,CAAAA,CAAiB1B,CAAK,CAAC,CAAA,CAGrBkC,CAAAA,CAAmBzL,WAAAA,CAAY,CAACsL,CAAAA,CAAuBJ,CAAAA,GACpD,CAAA,EAAGD,CAAe,CAAA,CAAA,EAAIK,CAAa,IAAIJ,CAAK,CAAA,CAAA,CAClD,CAACD,CAAe,CAAC,CAAA,CAGdpB,CAAAA,CAAsB7J,WAAAA,CAAavJ,CAAAA,EAChCuU,CAAAA,CAAkB,MAAA,CAAOjV,CAAAA,EAC9BA,CAAAA,CAAM,iBAAA,EAAmB,kBAAA,GAAuBU,CAClD,CAAA,CACC,CAACuU,CAAiB,CAAC,CAAA,CAGhBlB,CAAAA,CAAe9J,WAAAA,CAAY,CAC/BvJ,CAAAA,CACA2M,CAAAA,GACG,CACqByG,CAAAA,CAAoBpT,CAAS,CAAA,CAErC,OAAA,CAAQsT,CAAAA,EAAkB,CACxC,IAAMyB,CAAAA,CAAgBC,CAAAA,CAAiB1B,CAAAA,CAAe,SAAA,CAAWmB,CAAK,CAAA,CACjD9H,CAAAA,CAAWoI,CAAa,CAAA,EAG3ChC,CAAAA,CAASgC,CAAAA,CAAe,EAAA,CAAI,CAAE,cAAA,CAAgB,KAAM,CAAC,CAAA,CAIvD1B,CAAAA,CAAaC,CAAAA,CAAe,SAAA,CAAW3G,CAAU,EACnD,CAAC,EACH,CAAA,CAAG,CAACyG,CAAAA,CAAqBL,CAAAA,CAAUiC,CAAAA,CAAkBP,CAAK,CAAC,CAAA,CAKrDQ,EAAgC1L,WAAAA,CAAY,CAACjK,CAAAA,CAAkBqN,CAAAA,CAAiC8H,CAAAA,CAAeK,CAAAA,GAAuD,CAC1K,GAAI,CAACxV,CAAAA,CAAM,iBAAA,EAAqBA,CAAAA,CAAM,SAAA,GAAc,UAAA,CAClD,OAAOA,CAAAA,CAGT,GAAM,CAAE,kBAAA,CAAAkU,CAAAA,CAAoB,UAAA,CAAAC,CAAW,CAAA,CAAInU,CAAAA,CAAM,iBAAA,CAI3CoU,CAAAA,CAAiBkB,CAAAA,CAAkBjI,CAAAA,CAAY6G,CAAAA,CAAoBiB,CAAAA,CAAOK,CAAW,CAAA,CAarFI,EAAkBxB,CAAAA,CAAiB,MAAA,CAAOA,CAAc,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY,CAAI,EAAA,CACjFyB,CAAAA,CAAgBzB,CAAAA,EAAkBD,CAAAA,CAAW,IAAA,CAAKC,CAAc,CAAA,CAGlE0B,CAAAA,CAAc1B,EAOlB,GANI,CAACyB,CAAAA,EAAiBD,CAAAA,GACpBE,CAAAA,CAAc,MAAA,CAAO,IAAA,CAAK3B,CAAAA,CAAW,IAAA,EAAQ,EAAE,CAAA,CAAE,IAAA,CAAK5R,CAAAA,EACpDA,CAAAA,CAAI,WAAA,KAAkBqT,CACxB,CAAA,EAAKxB,CAAAA,CAAAA,CAGH,CAACA,CAAAA,EAAkBA,CAAAA,GAAmB,EAAA,EAAM,CAACD,CAAAA,CAAW,IAAA,CAAK2B,CAAW,CAAA,CAc1E,OAAO,CACL,GAAG9V,CAAAA,CACH,aAAA,CAAe,EACjB,CAAA,CAIF,IAAM+V,CAAAA,CAAWD,CAAAA,CAEXzB,CAAAA,CAAkBF,CAAAA,CAAW,IAAA,CAAK4B,CAAQ,CAAA,CAChD,OAAK,KAAA,CAAM,OAAA,CAAQ1B,CAAe,EAuB3B,CACL,GAAGrU,CAAAA,CACH,aAAA,CAAeqU,CACjB,CAAA,EAzBE,OAAA,CAAQ,KAAA,CAAM,sFAAA,CAAgF,CAC5F,SAAA,CAAWrU,CAAAA,CAAM,SAAA,CACjB,cAAA,CAAAoU,CAAAA,CACA,QAAA,CAAA2B,EACA,eAAA,CAAA1B,CAAAA,CACA,IAAA,CAAM,OAAOA,CACf,CAAC,CAAA,CACM,CACL,GAAGrU,CAAAA,CACH,aAAA,CAAe,EACjB,CAAA,CAgBJ,CAAA,CAAG,CAACsV,EAAmBJ,CAAe,CAAC,CAAA,CAGjCc,CAAAA,CAAkC/L,WAAAA,CAAY,CAAC1F,CAAAA,CAAqB8I,CAAAA,CAAiC8H,CAAAA,CAAeK,CAAAA,GACjHjR,CAAAA,CAAO,GAAA,CAAIvE,CAAAA,EAAS2V,CAAAA,CAA8B3V,CAAAA,CAAOqN,CAAAA,CAAY8H,CAAAA,CAAOK,CAAW,CAAC,CAAA,CAC9F,CAACG,CAA6B,CAAC,CAAA,CAGlC,OAAApB,SAAAA,CAAU,IAAM,CAEd,IAAMC,CAAAA,CAAgBhB,CAAAA,EAAM,CAC5BK,EAAkB,OAAA,CAAU,CAAE,GAAGW,CAAc,CAAA,CAE/C,IAAMC,CAAAA,CAAejB,CAAAA,CAAM,CAACnG,CAAAA,CAAY,CAAE,IAAA,CAAMqH,CAAiB,CAAA,GAAM,CAEhD,MAAA,CAAO,IAAA,CAAKrH,CAAU,CAAA,CAAE,MAAA,CAAOnM,CAAAA,EAAKA,CAAAA,CAAE,UAAA,CAAW,CAAA,EAAGgU,CAAe,CAAA,CAAA,CAAG,CAAA,EAAKhU,CAAAA,CAAE,QAAA,CAAS,CAAA,CAAA,EAAIiU,CAAK,EAAE,CAAC,CAAA,CACnF,MAAA,CAAO,CAAC7T,CAAAA,CAAKiB,CAAAA,IAC/CjB,CAAAA,CAAIiB,CAAG,CAAA,CAAI8K,CAAAA,CAAW9K,CAAG,CAAA,CAClBjB,CAAAA,CAAAA,CACN,EAAyB,EAuC5B,GA5BA,qBAAA,CAAsB,IAAM,CAG1B,UAAA,CAAW,IAAM,CASf,IAAMqT,CAAAA,CAAoBjB,CAAAA,EAAU,CAC9BkB,CAAAA,CAAgBoB,CAAAA,CAAgCf,CAAAA,CAAmB5H,CAAAA,CAAY8H,CAAAA,CAAO,IAAMR,CAAiB,CAAA,CASnHU,CAAAA,CAA6BT,CAAa,EAC5C,CAAA,CAAG,EAAE,EACP,CAAC,CAAA,CAIGF,CAAAA,EAE0BA,CAAAA,CAAiB,UAAA,CAAW,CAAA,EAAGQ,CAAe,CAAA,CAAA,CAAG,GAChDR,CAAAA,CAAiB,QAAA,CAAS,CAAA,CAAA,EAAIS,CAAK,CAAA,CAAE,CAAA,CAEzC,CAEvB,IAAMI,CAAAA,CAAgBb,CAAAA,CAAiB,OAAA,CAAQ,CAAA,EAAGQ,CAAe,CAAA,CAAA,CAAA,CAAK,EAAE,CAAA,CAAE,QAAQ,CAAA,CAAA,EAAIC,CAAK,CAAA,CAAA,CAAI,EAAE,CAAA,CAC3FN,CAAAA,CAAeI,CAAAA,CAAkB,IAAA,CAAKjS,CAAAA,EAAKA,CAAAA,CAAE,SAAA,GAAcuS,CAAa,CAAA,CACxET,CAAAA,CAAgBjB,CAAAA,CAAkB,OAAA,CAAQa,CAAgB,CAAA,CAC1DK,CAAAA,CAAe1H,CAAAA,CAAWqH,CAAgB,CAAA,CAc5CG,CAAAA,EAAgB,CAACA,CAAAA,CAAa,iBAAA,EAERC,CAAAA,GAAkBC,CAAAA,GAKpC,CAACA,CAAAA,EAAgDD,CAAAA,EAAkB,IAAA,EAAQA,IAAkB,EAAA,CAAA,EAO/F,UAAA,CAAW,IAAM,CACff,CAAAA,CAAawB,CAAAA,CAAelI,CAAU,EACxC,CAAA,CAAG,CAAC,CAAA,CAaVwG,CAAAA,CAAkB,OAAA,CAAU,CAAE,GAAGA,CAAAA,CAAkB,QAAS,CAACa,CAAgB,EAAGK,CAAa,EAC/F,CAMJ,CAAC,CAAA,CAED,OAAO,IAAMN,CAAAA,CAAa,WAAA,EAC5B,CAAA,CAAG,CAACjB,CAAAA,CAAOE,EAAWuB,CAAAA,CAAmBC,CAAAA,CAAiBC,CAAAA,CAAOa,CAAAA,CAAiCjC,CAAAA,CAAcuB,CAAAA,CAAmBI,CAAgB,CAAC,CAAA,CAE7IN,CACT,CAAA,CCviBA,IAAMa,EAAAA,CAGD,CAAC,CAAE,MAAA,CAAAvM,CAAAA,CAAQ,QAAA,CAAArH,CAAS,CAAA,GAAM,CAC7B,GAAM,CAAE,KAAA,CAAAmR,CAAM,CAAA,CAAIvE,cAAAA,EAAe,CAC3BiH,CAAAA,CAAmB7M,EAAAA,CAAaM,CAAAA,EAASA,CAAAA,CAAM,gBAAgB,CAAA,CAE/DK,CAAAA,CAAeC,WAAAA,CAAa7H,CAAAA,EAA8B,CAC9D,IAAMgR,EAAiB9K,EAAAA,CAAkBlG,CAAAA,CAAMC,CAAQ,CAAA,CACvD6T,CAAAA,CAAiBxM,CAAAA,CAAQ0J,CAAc,EACzC,CAAA,CAAG,CAAC1J,CAAAA,CAAQrH,CAAAA,CAAU6T,CAAgB,CAAC,CAAA,CAEvC,OAAA3B,UAAU,IAAM,CACd,IAAME,CAAAA,CAAejB,CAAAA,CAAMxJ,CAAY,CAAA,CAGvC,OAAO,IAAMyK,CAAAA,CAAa,WAAA,EAC5B,CAAA,CAAG,CAACjB,CAAAA,CAAOxJ,CAAY,CAAC,CAAA,CAEjB,IACT,CAAA,CAEOmM,EAAAA,CAAQF,EAAAA,CCzBf,IAAMG,EAAAA,CAAWC,UAAAA,CACf,CAAC,CAAE,QAAA,CAAAjO,CAAAA,CAAU,SAAA,CAAAoH,CAAAA,CAAW,GAAG8G,CAAM,CAAA,CAAGC,CAAAA,GAClClO,GAAAA,CAAC,GAAA,CAAA,CAAE,GAAA,CAAKkO,CAAAA,CAAK,UAAW/G,CAAAA,CAAY,GAAG8G,CAAAA,CACpC,QAAA,CAAAlO,CAAAA,CACH,CAEJ,CAAA,CAEAgO,EAAAA,CAAS,WAAA,CAAc,UAAA,CACvB,IAAOI,EAAAA,CAAQJ,EAAAA,CCDf,IAAMK,EAAAA,CAAgF,CAAC,CAAE,WAAA,CAAAjR,CAAAA,CAAa,UAAA,CAAAM,CAAW,CAAA,GAAM,CACrH,IAAM4Q,CAAAA,CAAYlR,CAAAA,CAAcM,CAAAA,CAAc,GAAA,CAE9C,OACEiK,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,iDAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGqO,CAAQ,CAAA,CAAA,CAAI,CAAA,CACjC,CAAA,CACF,CAAA,CACA3G,IAAAA,CAACyG,EAAAA,CAAA,CAAS,SAAA,CAAU,qDAAA,CAAsD,QAAA,CAAA,CAAA,WAAA,CACjEhR,CAAAA,CAAY,KAAA,CAAIM,CAAAA,CAAAA,CACzB,GACF,CAEJ,CAAA,CAGM6Q,EAAAA,CAA2E,CAAC,CAAE,WAAA,CAAAnR,CAAAA,CAAa,UAAA,CAAAM,CAAW,CAAA,GAAM,CAChH,IAAM4Q,CAAAA,CAAYlR,CAAAA,CAAcM,CAAAA,CAAc,GAAA,CAE9C,OACEuC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,iDAAA,CACV,KAAA,CAAO,CAAE,MAAO,CAAA,EAAGqO,CAAQ,CAAA,CAAA,CAAI,CAAA,CACjC,CAAA,CACF,CAAA,CACF,CAEJ,CAAA,CAGME,EAAAA,CAA2E,CAAC,CAAE,WAAA,CAAApR,CAAAA,CAAa,UAAA,CAAAM,CAAW,CAAA,GAExGiK,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACZ,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQvC,CAAW,CAAA,CAAG,CAACmG,CAAAA,CAAGkJ,IAAU,CAChD,IAAM0B,CAAAA,CAAa1B,CAAAA,CAAQ,CAAA,CACrB2B,CAAAA,CAAcD,CAAAA,CAAarR,CAAAA,CAC3BuR,CAAAA,CAAWF,CAAAA,GAAerR,CAAAA,CAGhC,OACE6C,GAAAA,CAAC,OAEC,SAAA,CAAW;AAAA;AAAA,gBAAA,EAEPyO,CAAAA,CACE,aAAA,CACAC,CAAAA,CACA,gDAAA,CACA,aACJ;AAAA,cAAA,CAAA,CAEF,KAAA,CAAO,CACL,QAAA,CAAU,MACZ,GAZKF,CAaP,CAEJ,CAAC,CAAA,CACH,CAAA,CACA9G,KAACyG,EAAAA,CAAA,CAAS,UAAU,qDAAA,CAAsD,QAAA,CAAA,CAAA,WAAA,CACjEhR,EAAY,KAAA,CAAIM,CAAAA,CAAAA,CACzB,GACF,CAAA,CAKEkR,EAAAA,CAID,CAAC,CAAE,WAAA,CAAAxR,EAAa,UAAA,CAAAM,CAAAA,CAAY,OAAAmR,CAAO,CAAA,GAAM,CAC5C,IAAMP,CAAAA,CAAYlR,EAAcM,CAAAA,CAAc,GAAA,CAGxCoR,EAAkBD,CAAAA,EAAQ,UAAA,EAAc,UACxCE,CAAAA,CAAkBF,CAAAA,EAAQ,YAAc,SAAA,CAE9C,OACElH,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,OACC,SAAA,CAAU,kCAAA,CACV,MAAO,CAAE,eAAA,CAAA6O,CAAgB,CAAA,CAEzB,QAAA,CAAA7O,IAAC,KAAA,CAAA,CACC,SAAA,CAAU,qCACV,KAAA,CAAO,CACL,MAAO,CAAA,EAAGqO,CAAQ,IAClB,eAAA,CAAiBS,CACnB,EACF,CAAA,CACF,CAAA,CACApH,KAACyG,EAAAA,CAAA,CAAS,UAAU,qDAAA,CAAsD,QAAA,CAAA,CAAA,WAAA,CACjEhR,EAAY,KAAA,CAAIM,CAAAA,CAAAA,CACzB,GACF,CAEJ,CAAA,CAGMsR,GAID,CAAC,CAAE,SAAA/U,CAAAA,CAAU,iBAAA,CAAAuB,EAAmB,mBAAA,CAAAqJ,CAAoB,IAAM,CAE7D,IAAMoK,EAA2BhV,CAAAA,CAC9B,GAAA,CAAI,CAACjC,CAAAA,CAAS+U,CAAAA,IAAW,CAAE,OAAA,CAAA/U,CAAAA,CAAS,cAAe+U,CAAM,CAAA,CAAE,EAC3D,MAAA,CAAO,CAAC,CAAE,aAAA,CAAAmC,CAAc,IACvB,CAAC1T,CAAAA,EAAqBA,EAAkB0T,CAAa,CACvD,EAEIC,CAAAA,CAAkBF,CAAAA,CAAyB,IAAIG,CAAAA,EAAQA,CAAAA,CAAK,OAAO,CAAA,CAGnEC,CAAAA,CAAsBJ,EAAyB,SAAA,CACnD,CAAC,CAAE,aAAA,CAAAC,CAAc,IAAMA,CAAAA,GAAkBrK,CAC3C,EAGMyK,CAAAA,CAAsBD,CAAAA,EAAuB,EAAIA,CAAAA,CAAsB,CAAA,CAE7E,OACE1H,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,4BAAA,CACb,QAAA,CAAA,CAAA1H,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCACZ,QAAA,CAAAkP,CAAAA,CAAgB,IAAI,CAACnX,CAAAA,CAAS+U,IAAU,CACvC,IAAM2B,EAAc3B,CAAAA,CAAQuC,CAAAA,CACtBX,EAAW5B,CAAAA,GAAUuC,CAAAA,CAG3B,OACErP,GAAAA,CAACH,WAAAA,CAAM,SAAN,CAEC,QAAA,CAAA6H,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oBACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,OACC,SAAA,CAAW;AAAA;AAAA;AAAA,oBAAA,EAGPyO,CAAAA,CACE,yBAAA,CACAC,CAAAA,CACA,mDAAA,CACA,iDACJ;AAAA,kBAAA,CAAA,CAGD,QAAA,CAAA5B,CAAAA,CAAQ,CAAA,CACX,CAAA,CAECA,CAAAA,CAAQoC,EAAgB,MAAA,CAAS,CAAA,EAChClP,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW;AAAA;AAAA,sBAAA,EAEP8M,CAAAA,CAAQuC,CAAAA,CACN,cAAA,CACA,aACJ;AAAA,oBAAA,CAAA,CAEJ,CAAA,CAAA,CAEJ,CAAA,CAAA,CA7BmBtX,CAAAA,CAAQ,SAAA,EAAa+U,CA8B1C,CAEJ,CAAC,CAAA,CACH,CAAA,CACApF,IAAAA,CAACyG,EAAAA,CAAA,CAAS,SAAA,CAAU,sDAAA,CAAuD,QAAA,CAAA,CAAA,UAAA,CAChEkB,CAAAA,CAAsB,CAAA,CAAE,KAAA,CAAIH,CAAAA,CAAgB,MAAA,CAAA,CACvD,CAAA,CAAA,CACF,CAEJ,CAAA,CAGMI,EAAAA,CAID,CAAC,CAAE,QAAA,CAAAtV,CAAAA,CAAU,iBAAA,CAAAuB,CAAAA,CAAmB,mBAAA,CAAAqJ,CAAoB,CAAA,GAAM,CAE7D,IAAMoK,CAAAA,CAA2BhV,CAAAA,CAC9B,GAAA,CAAI,CAACjC,CAAAA,CAAS+U,CAAAA,IAAW,CAAE,OAAA,CAAA/U,CAAAA,CAAS,aAAA,CAAe+U,CAAM,CAAA,CAAE,CAAA,CAC3D,MAAA,CAAO,CAAC,CAAE,aAAA,CAAAmC,CAAc,CAAA,GACvB,CAAC1T,CAAAA,EAAqBA,CAAAA,CAAkB0T,CAAa,CACvD,CAAA,CAEIC,CAAAA,CAAkBF,CAAAA,CAAyB,GAAA,CAAIG,CAAAA,EAAQA,CAAAA,CAAK,OAAO,CAAA,CAGnEC,CAAAA,CAAsBJ,CAAAA,CAAyB,SAAA,CACnD,CAAC,CAAE,aAAA,CAAAC,CAAc,CAAA,GAAMA,CAAAA,GAAkBrK,CAC3C,CAAA,CAGMyK,CAAAA,CAAsBD,CAAAA,EAAuB,CAAA,CAAIA,CAAAA,CAAsB,CAAA,CAE7E,OACE1H,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACZ,QAAA,CAAAkP,CAAAA,CAAgB,GAAA,CAAI,CAACnX,CAAAA,CAAS+U,CAAAA,GAAU,CACvC,IAAM2B,CAAAA,CAAc3B,CAAAA,CAAQuC,CAAAA,CACtBX,CAAAA,CAAW5B,CAAAA,GAAUuC,CAAAA,CAG3B,OACErP,GAAAA,CAACH,WAAAA,CAAM,QAAA,CAAN,CAEC,QAAA,CAAA6H,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mBAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW;AAAA;AAAA;AAAA,oBAAA,EAGPyO,CAAAA,CACE,wBAAA,CACAC,CAAAA,CACA,iDAAA,CACA,iDACJ;AAAA,kBAAA,CAAA,CAGD,QAAA,CAAA5B,CAAAA,CAAQ,CAAA,CACX,CAAA,CAECA,CAAAA,CAAQoC,EAAgB,MAAA,CAAS,CAAA,EAChClP,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW;AAAA;AAAA,sBAAA,EAEP8M,CAAAA,CAAQuC,CAAAA,CACN,aAAA,CACA,aACJ;AAAA,oBAAA,CAAA,CAEJ,GAEJ,CAAA,CAAA,CA7BmBtX,CAAAA,CAAQ,WAAa+U,CA8B1C,CAEJ,CAAC,CAAA,CACH,CAAA,CACApF,IAAAA,CAACyG,EAAAA,CAAA,CAAS,SAAA,CAAU,sDAAA,CAAuD,qBAChEkB,CAAAA,CAAsB,CAAA,CAAE,MAAIH,CAAAA,CAAgB,MAAA,CAAA,CACvD,CAAA,CAAA,CACF,CAEJ,EAEMK,EAAAA,CAAkD,CAAC,CACvD,WAAA,CAAApS,CAAAA,CACA,WAAAM,CAAAA,CACA,eAAA,CAAA+R,CAAAA,CACA,QAAA,CAAAxV,EACA,iBAAA,CAAAuB,CAAAA,CACA,oBAAAqJ,CACF,CAAA,GAAM,CAIJ,IAAM6K,CAAAA,CAAeD,CAAAA,EAAiB,OAAA,GAAY,MAG5C5M,CAAAA,CAAO4M,CAAAA,EAAiB,MAAQ,cAAA,CAIhCE,CAAAA,CAAAA,CAAiB9M,IAAS,gBAAA,EAAoBA,CAAAA,GAAS,uBAAA,IACvD,CAAC5I,GAAYA,CAAAA,CAAS,MAAA,GAAW,GAAK4K,CAAAA,GAAwB,MAAA,CAAA,CAChE,eACAhC,CAAAA,CAIJ,GAAI,CAAC6M,CAAAA,CACH,OAAOzP,GAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,OAAA,CAAS,MAAO,CAAA,CAAG,CAAA,CAI1C,OAAQ0P,CAAAA,EACN,KAAK,cAAA,CACH,OAAO1P,IAACoO,EAAAA,CAAA,CAAuB,YAAajR,CAAAA,CAAa,UAAA,CAAYM,CAAAA,CAAY,CAAA,CAEnF,KAAK,QAAA,CACH,OAAOuC,IAACsO,EAAAA,CAAA,CAAkB,YAAanR,CAAAA,CAAa,UAAA,CAAYM,CAAAA,CAAY,CAAA,CAE9E,KAAK,QAAA,CACH,OAAOuC,IAACuO,EAAAA,CAAA,CAAkB,YAAapR,CAAAA,CAAa,UAAA,CAAYM,CAAAA,CAAY,CAAA,CAE9E,KAAK,QAAA,CACH,OACEuC,IAAC2O,EAAAA,CAAA,CACC,YAAaxR,CAAAA,CACb,UAAA,CAAYM,EACZ,MAAA,CAAQ+R,CAAAA,EAAiB,OAC3B,CAAA,CAGJ,KAAK,iBACH,OACExP,GAAAA,CAAC+O,GAAA,CACC,QAAA,CAAU/U,CAAAA,CACV,iBAAA,CAAmBuB,EACnB,mBAAA,CAAqBqJ,CAAAA,CACvB,EAGJ,KAAK,uBAAA,CACH,OACE5E,GAAAA,CAACsP,EAAAA,CAAA,CACC,QAAA,CAAUtV,EACV,iBAAA,CAAmBuB,CAAAA,CACnB,oBAAqBqJ,CAAAA,CACvB,CAAA,CAGJ,QACE,OAAO5E,GAAAA,CAACoO,EAAAA,CAAA,CAAuB,YAAajR,CAAAA,CAAa,UAAA,CAAYM,EAAY,CACrF,CACF,EAEOkS,EAAAA,CAAQJ,EAAAA,CCtUf,IAAMK,EAAAA,CAAwC,CAAC,CAAE,IAAA,CAAAhW,CAAAA,CAAM,WAAA,CAAAiO,EAAa,aAAA,CAAAgI,CAAc,IAE5EA,CAAAA,EAAe,OAAA,GAAY,MACtB,IAAA,CAILA,CAAAA,EAAe,IAAA,GAAS,QAAA,EAAYA,GAAe,YAAA,CAC9C7P,GAAAA,CAAAuH,SAAA,CAAG,QAAA,CAAAsI,EAAc,YAAA,CAAa,CAAA,CAKrCnI,IAAAA,CAAC,KAAA,CAAA,CACC,UAAU,2DAAA,CACV,KAAA,CAAO,CAAE,eAAA,CAAiB,mBAAoB,EAE9C,QAAA,CAAA,CAAA1H,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,0BACX,QAAA,CAAA4H,CAAAA,CAAiBhO,EAAK,IAAA,CAAMiO,CAAW,EAC1C,CAAA,CACA7H,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,qBACV,QAAA,CAAA4H,CAAAA,CAAiBhO,EAAK,WAAA,CAAaiO,CAAW,EACjD,CAAA,CACAH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+BACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,QAAK,SAAA,CAAU,0CAAA,CAA2C,0BAC3C9N,CAAAA,CAAK,QAAA,CAAA,CACrB,CAAA,CACA8N,IAAAA,CAAC,QAAK,SAAA,CAAU,0CAAA,CAA2C,qBAChD9N,CAAAA,CAAK,MAAA,CAAA,CAChB,EACCA,CAAAA,CAAK,OAAA,EACJ8N,KAAC,MAAA,CAAA,CAAK,SAAA,CAAU,2CAA2C,QAAA,CAAA,CAAA,WAAA,CAC/C9N,CAAAA,CAAK,SACjB,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,EAIGkW,EAAAA,CAAQF,EAAAA,CC/CR,SAASG,CAAAA,CAAAA,GAAMC,CAAAA,CAAsB,CAC1C,OAAOC,QAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CCHA,IAAMG,EAAAA,CAAe,GAAA,CACfC,GAAgB,GAAA,CAChBC,EAAAA,CAAgB,IAChBC,EAAAA,CAAiB,IAAA,CAEhB,SAASC,EAAAA,EAAgB,CAC9B,GAAM,CAACC,EAAOC,CAAQ,CAAA,CAAI9U,SAAS,GAAG,CAAA,CAChC,CAAC+U,CAAAA,CAAQC,CAAS,CAAA,CAAIhV,QAAAA,CAAS,EAAE,CAAA,CACjC,CAACiV,EAAcC,CAAe,CAAA,CAAIlV,QAAAA,CAAS,EAAE,EAC7C,CAACmV,CAAAA,CAASC,CAAU,CAAA,CAAIpV,QAAAA,CAAS,KAAK,CAAA,CACtC,CAACqV,EAAWC,CAAY,CAAA,CAAItV,SAAS,KAAK,CAAA,CAC1C,CAACuV,CAAAA,CAAUC,CAAW,EAAIxV,QAAAA,CAAS,KAAK,CAAA,CAE9C,OAAAuQ,UAAU,IAAM,CACd,IAAMkF,CAAAA,CAAS,IAAM,CACnB,IAAMC,CAAAA,CAAK,MAAA,CAAO,UAAA,CACZC,GAAKjB,EAAAA,CAAgBF,EAAAA,GAAiBG,GAAiBF,EAAAA,CAAAA,CACvD3Q,CAAAA,CAAI0Q,GAAemB,CAAAA,CAAIlB,EAAAA,CACvBmB,CAAAA,CAAID,CAAAA,CAAID,EAAK5R,CAAAA,CACb+R,CAAAA,CAAID,EAAI,EAAA,CACdd,CAAAA,CAASc,CAAC,CAAA,CACVZ,CAAAA,CAAUa,CAAC,CAAA,CACXX,EAAgBW,CAAAA,CAAK,kBAAQ,EAC7BL,CAAAA,CAAYE,CAAAA,CAAK,IAAI,EACvB,CAAA,CACA,OAAAD,CAAAA,GACA,MAAA,CAAO,gBAAA,CAAiB,SAAUA,CAAM,CAAA,CACjC,IAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,CAAUA,CAAM,CAC1D,CAAA,CAAG,EAAE,CAAA,CAoBE,CAAE,MAAAZ,CAAAA,CAAO,MAAA,CAAAE,CAAAA,CAAQ,YAAA,CAAAE,EAAc,OAAA,CAAAE,CAAAA,CAAS,UAAAE,CAAAA,CAAW,QAAA,CAAAE,EAAU,SAAA,CAlBlDJ,CAAAA,CACd,cACAE,CAAAA,EAAa,CAACE,EACd,aAAA,CACA,UAAA,CAc2E,SAZ9D,CACf,WAAA,CAAa,IAAMH,CAAAA,CAAW,IAAI,CAAA,CAClC,SAAA,CAAW,IAAMA,CAAAA,CAAW,KAAK,EACjC,YAAA,CAAc,IAAME,EAAa,IAAI,CAAA,CACrC,YAAA,CAAc,IAAM,CAClBF,CAAAA,CAAW,KAAK,EAChBE,CAAAA,CAAa,KAAK,EACpB,CAAA,CACA,YAAA,CAAc,IAAMC,CAAAA,EAAYH,EAAW,IAAI,CAAA,CAC/C,WAAY,IAAMG,CAAAA,EAAYH,EAAW,KAAK,CAChD,CAEwF,CAC1F,CC7CA,IAAMU,GAAuC,CAAC,CAAE,QAAA,CAAA1R,CAAAA,CAAU,UAAAoH,CAAAA,CAAW,OAAA,CAAAuK,EAAS,GAAGzD,CAAM,IAAM,CAC3F,GAAM,CAAE,KAAA,CAAAuC,EAAO,MAAA,CAAAE,CAAAA,CAAQ,aAAAE,CAAAA,CAAc,OAAA,CAAAE,EAAS,QAAA,CAAAI,CAAAA,CAAU,SAAA,CAAAS,CAAAA,CAAW,SAAAC,CAAS,CAAA,CAAIrB,IAAc,CAExFsB,CAAAA,CACJ7R,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+EACb,QAAA,CAAAD,CAAAA,CACH,EAGF,OACEC,GAAAA,CAAC,UACC,KAAA,CAAO,CACL,MAAO,CAAA,EAAGwQ,CAAK,CAAA,EAAA,CAAA,CACf,MAAA,CAAQ,GAAGE,CAAM,CAAA,EAAA,CAAA,CACjB,aAAc,CAAA,EAAGE,CAAY,KAC7B,eAAA,CAAiB,mBAAA,CACjB,SAAA,CAAAe,CAAAA,CACA,WAAY,yCAAA,CACZ,UAAA,CAAY,OACZ,uBAAA,CAAyB,aAC3B,EACA,SAAA,CAAW5B,CAAAA,CACT,8CAAA,CACA,uCAAA,CACA,YACA,oHAAA,CACA,kDAAA,CACA,gDACA,kBAAA,CACA5I,CACF,EACC,GAAGyK,CAAAA,CACJ,OAAA,CAASF,CAAAA,CACR,GAAGzD,CAAAA,CAEJ,QAAA,CAAAvG,KAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0EACd,QAAA,CAAA,CAAA1H,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAW+P,EACT,kFAAA,CACA,CAACmB,GAAY,8BACf,CAAA,CACA,MAAOA,CAAAA,CAAW,CAAE,SAAA,CAAWJ,CAAAA,CAAU,mBAAqB,eAAgB,CAAA,CAAI,EAAC,CAElF,QAAA,CAAAe,EACH,CAAA,CACA7R,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAW+P,EACT,iGAAA,CACA,CAACmB,GAAY,gCACf,CAAA,CACA,MAAO,CACL,IAAA,CAAM,QACN,GAAIA,CAAAA,CAAW,CAAE,SAAA,CAAWJ,CAAAA,CAAU,mBAAqB,eAAgB,CAAA,CAAI,EACjF,CAAA,CAEC,QAAA,CAAAe,CAAAA,CACH,GACF,CAAA,CACF,CAEJ,EAEOC,EAAAA,CAAQL,EAAAA,CClEf,IAAMM,EAAAA,CAGD,CAAC,CAAE,OAAA,CAAAF,EAAS,QAAA,CAAA9R,CAAS,IAAM,CAC9B,GAAM,CAACqH,CAAAA,CAAWC,CAAY,EAAI1L,QAAAA,CAAS,KAAK,EAEhD,OAAKkW,CAAAA,CAAQ,MAAK,CAGhBnK,IAAAA,CAAC,OACC,SAAA,CAAU,uBAAA,CACV,YAAA,CAAc,IAAML,EAAa,IAAI,CAAA,CACrC,aAAc,IAAMA,CAAAA,CAAa,KAAK,CAAA,CACtC,OAAA,CAAS,IAAMA,CAAAA,CAAa,IAAI,CAAA,CAChC,MAAA,CAAQ,IAAMA,CAAAA,CAAa,KAAK,EAE/B,QAAA,CAAA,CAAAtH,CAAAA,CAEAqH,CAAAA,EACCM,IAAAA,CAAC,OACC,IAAA,CAAK,SAAA,CACL,UAAU,6JAAA,CACV,KAAA,CAAO,CACL,SAAA,CAAW,uBACb,EAEC,QAAA,CAAA,CAAAmK,CAAAA,CAED7R,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6JAA6J,CAAA,CAAA,CAC9K,CAAA,CAGFA,IAAC,OAAA,CAAA,CAAO,QAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,CAWN,GACJ,CAAA,CAtC0BA,GAAAA,CAAAuH,QAAAA,CAAA,CAAG,SAAAxH,CAAAA,CAAS,CAwC1C,CAAA,CAEOiS,EAAAA,CAAQD,GC9Cf,IAAME,EAAAA,CAAeC,EAAA,CAAA,UAAA,CAGnB,CAAC,CAAE,UAAA/K,CAAAA,CAAW,GAAG8G,CAAM,CAAA,CAAGC,IAC1BlO,GAAAA,CAAiB,EAAA,CAAA,IAAA,CAAhB,CACC,SAAA,CAAW+P,CAAAA,CACT,0GACA,sIAAA,CACA,iDAAA,CACA,iFAAA,CACA5I,CACF,EACC,GAAG8G,CAAAA,CACJ,GAAA,CAAKC,CAAAA,CAEL,SAAAlO,GAAAA,CAAiB,EAAA,CAAA,KAAA,CAAhB,CACC,SAAA,CAAW+P,EACT,+FAAA,CACA,yEACF,CAAA,CACF,CAAA,CACF,CACD,CAAA,CACDkC,EAAAA,CAAO,WAAA,CAA8B,EAAA,CAAA,IAAA,CAAK,YCvB1C,IAAME,EAAAA,CAAcC,EAAA,CAAA,UAAA,CAGlB,CAAC,CAAE,SAAA,CAAAjL,EAAW,GAAG8G,CAAM,CAAA,CAAGC,CAAAA,GAC1BlO,IAAgB,EAAA,CAAA,IAAA,CAAf,CACC,GAAA,CAAKkO,CAAAA,CACL,UAAW6B,CAAAA,CACT,iDAAA,CACA,2DAAA,CACA5I,CACF,EACC,GAAG8G,CAAAA,CACN,CACD,CAAA,CACDkE,GAAM,WAAA,CAA6B,EAAA,CAAA,IAAA,CAAK,WAAA,CCCxC,IAAME,GAA8C,CAAC,CACnD,MAAA1a,CAAAA,CACA,IAAA,CAAA2a,EACA,WAAA,CAAAzK,CAAAA,CAAc,IAAA,CACd,SAAA,CAAAV,EAAY,EACd,CAAA,GAAM,CACJ,GAAM,CAAE,QAAA,CAAAiE,CAAAA,CAAU,KAAA,CAAAD,CAAM,EAAIvE,cAAAA,EAAe,CACrCvO,EAAYia,CAAAA,EAAQ3a,CAAAA,CAAM,UAAU,QAAA,EAAS,CAC7C4a,CAAAA,CAAQ3K,CAAAA,CAAiBjQ,EAAM,KAAA,CAAOkQ,CAAW,CAAA,CACjDM,CAAAA,CAAaxQ,EAAM,WAAA,EAAa,IAAA,CAAMmB,CAAAA,EAAMA,CAAAA,CAAE,iBAAmB,UAAU,CAAA,CAC3E4T,EAAe,CAAA,CAAQvB,CAAAA,CAAM9S,CAAS,CAAA,CACtCma,CAAAA,CAAW,CAAA,OAAA,EAAUna,CAAS,GAEpC,OACE2H,GAAAA,CAACgI,CAAAA,CAAA,CAAiB,MAAOrQ,CAAAA,CAAO,WAAA,CAAakQ,CAAAA,CAAa,SAAA,CAAW,MACnE,QAAA,CAAAH,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,6GACTgF,CAAAA,CAAe,+BAAA,CAAkC,EACnD,CAAA,CAAA,EAAIvF,CAAS,CAAA,CAAA,CAEb,QAAA,CAAA,CAAAO,IAAAA,CAACyK,EAAAA,CAAA,CAAM,OAAA,CAASK,CAAAA,CAAU,SAAA,CAAU,uDAAA,CACjC,UAAAD,CAAAA,CACApK,CAAAA,EAAcnI,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oBAAoB,QAAA,CAAA,GAAA,CAAC,CAAA,CAAA,CACtD,CAAA,CACAA,GAAAA,CAACiS,GAAA,CACC,EAAA,CAAIO,CAAAA,CACJ,OAAA,CAAS9F,EACT,eAAA,CAAkB+F,CAAAA,EAChBrH,CAAAA,CAAS/S,CAAAA,CAAWoa,EAAS,CAAE,cAAA,CAAgB,IAAA,CAAM,WAAA,CAAa,IAAK,CAAC,CAAA,CAE5E,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CAAA,CAEOC,EAAAA,CAAQL,EAAAA,CClDf,IAAMM,EAAAA,CAAiBC,EAAA,CAAA,UAAA,CAGrB,CAAC,CAAE,SAAA,CAAAzL,CAAAA,CAAW,GAAG8G,CAAM,EAAGC,CAAAA,GAC1BlO,GAAAA,CAAmB,EAAA,CAAA,IAAA,CAAlB,CACC,IAAKkO,CAAAA,CACL,SAAA,CAAW6B,CAAAA,CACT,mEAAA,CACA,qHACA,iDAAA,CACA,6HAAA,CACA5I,CACF,CAAA,CACC,GAAG8G,CAAAA,CAEJ,QAAA,CAAAjO,GAAAA,CAAmB,EAAA,CAAA,SAAA,CAAlB,CAA4B,SAAA,CAAU,+CAAA,CACrC,QAAA,CAAAA,GAAAA,CAAC6S,MAAA,CAAM,SAAA,CAAU,qBAAqB,CAAA,CACxC,CAAA,CACF,CACD,CAAA,CACDF,EAAAA,CAAS,WAAA,CAAgC,EAAA,CAAA,IAAA,CAAK,YCL9C,IAAMG,EAAAA,CAAsD,CAAC,CAC3D,KAAA,CAAAnb,EACA,IAAA,CAAA2a,CAAAA,CACA,WAAA,CAAAzK,CAAAA,CAAc,KACd,SAAA,CAAAV,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,KAAA,CAAAgE,CAAAA,CAAO,QAAA,CAAAC,CAAS,CAAA,CAAIxE,cAAAA,GACtBvO,CAAAA,CAAYia,CAAAA,EAAQ3a,EAAM,SAAA,CAAU,QAAA,EAAS,CAC7Cob,CAAAA,CAA2B5H,EAAM9S,CAAS,CAAA,EAAK,EAAC,CAEhD2a,EAAc,CAACC,CAAAA,CAAqBR,CAAAA,GAAqB,CAC7D,IAAMS,CAAAA,CAAYT,CAAAA,CACd,CAAC,GAAGM,EAAgBE,CAAW,CAAA,CAC/BF,CAAAA,CAAe,MAAA,CAAQja,GAAMA,CAAAA,GAAMma,CAAW,CAAA,CAClD7H,CAAAA,CAAS/S,EAAW6a,CAAAA,CAAW,CAAE,cAAA,CAAgB,IAAA,CAAM,YAAa,IAAK,CAAC,EAC5E,CAAA,CAEA,OACElT,IAACgI,CAAAA,CAAA,CAAiB,KAAA,CAAOrQ,CAAAA,CAAO,YAAakQ,CAAAA,CAC3C,QAAA,CAAA7H,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAW,CAAA,oBAAA,EAAuBmH,CAAAA,EAAa,EAAE,CAAA,CAAA,CACnD,SAAAxP,CAAAA,CAAM,aAAA,EAAe,GAAA,CAAI,CAACwb,EAAQpK,CAAAA,GAAQ,CACzC,IAAMqK,CAAAA,CAAU,GAAG/a,CAAS,CAAA,CAAA,EAAI8a,CAAAA,CAAO,KAAK,IAAIpK,CAAG,CAAA,CAAA,CAC7CsK,CAAAA,CAAYN,CAAAA,CAAe,SAASI,CAAAA,CAAO,KAAK,EAEtD,OACEzL,IAAAA,CAAC,OAEC,SAAA,CAAU,8EAAA,CAEV,QAAA,CAAA,CAAA1H,GAAAA,CAAC2S,GAAA,CACC,EAAA,CAAIS,CAAAA,CACJ,OAAA,CAASC,EACT,eAAA,CAAkBZ,CAAAA,EAAYO,CAAAA,CAAYG,CAAAA,CAAO,MAAO,CAAC,CAACV,CAAO,CAAA,CACnE,EACAzS,GAAAA,CAACmS,EAAAA,CAAA,CAAM,OAAA,CAASiB,EAAS,SAAA,CAAU,2CAAA,CAChC,QAAA,CAAAxL,CAAAA,CAAiBuL,EAAO,KAAA,CAAOtL,CAAW,CAAA,CAC7C,CAAA,CAAA,CAAA,CAVKsL,EAAO,KAWd,CAEJ,CAAC,CAAA,CACH,CAAA,CACF,CAEJ,CAAA,CAEOG,EAAAA,CAAQR,EAAAA,CC7Df,IAAMS,EAAAA,CAA2B,EAAA,CAAA,IAAA,CAC3BC,GAAkC,EAAA,CAAA,OAAA,CAGxC,IAAMC,EAAAA,CAAuBC,EAAA,CAAA,UAAA,CAG3B,CAAC,CAAE,SAAA,CAAAvM,CAAAA,CAAW,KAAA,CAAAwM,EAAQ,OAAA,CAAS,UAAA,CAAAC,EAAa,CAAA,CAAG,GAAG3F,CAAM,CAAA,CAAGC,CAAAA,GAC3DlO,GAAAA,CAAkB,EAAA,CAAA,MAAA,CAAjB,CACC,QAAA,CAAAA,GAAAA,CAAkB,EAAA,CAAA,OAAA,CAAjB,CACC,IAAKkO,CAAAA,CACL,KAAA,CAAOyF,CAAAA,CACP,UAAA,CAAYC,EACZ,SAAA,CAAW7D,CAAAA,CACT,oFAAA,CACA,8DAAA,CACA,6DACA,8DAAA,CACA,+EAAA,CACA5I,CACF,CAAA,CACC,GAAG8G,CAAAA,CACN,CAAA,CACF,CACD,CAAA,CACDwF,GAAe,WAAA,CAA+B,EAAA,CAAA,OAAA,CAAQ,WAAA,CClBtD,IAAMI,EAAAA,CAAY,CAChB,UAAW,YAAA,CAAW,MAAA,CAAQ,OAAA,CAAS,KAAA,CAAO,OAC9C,SAAA,CAAW,SAAA,CAAQ,WAAA,CAAa,SAAA,CAAW,WAAY,aACzD,CAAA,CACMC,EAAAA,CAAY,CAChB,UAAW,UAAA,CAAY,OAAA,CAAS,OAAA,CAAS,KAAA,CAAO,OAChD,MAAA,CAAQ,QAAA,CAAU,WAAA,CAAa,SAAA,CAAW,WAAY,UACxD,CAAA,CACMC,GAAU,CAAC,KAAA,CAAO,MAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAK,CAAA,CAC1DC,EAAAA,CAAU,CAAC,KAAA,CAAO,MAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAK,CAAA,CAEhE,SAASC,EAAAA,CAAeC,CAAAA,CAAoB,CAC1C,IAAMC,CAAAA,CAAOD,CAAAA,CAAK,WAAA,GACZE,CAAAA,CAAQF,CAAAA,CAAK,QAAA,EAAS,CACtBG,EAAW,IAAI,IAAA,CAAKF,CAAAA,CAAMC,CAAAA,CAAO,CAAC,CAAA,CAClCE,CAAAA,CAAQ,IAAI,IAAA,CAAKD,CAAQ,EAC/BC,CAAAA,CAAM,OAAA,CAAQA,CAAAA,CAAM,OAAA,GAAYD,CAAAA,CAAS,MAAA,EAAQ,CAAA,CACjD,IAAME,CAAAA,CAAe,EAAC,CACtB,IAAA,IAAS7Z,EAAI,CAAA,CAAGA,CAAAA,CAAI,GAAIA,CAAAA,EAAAA,CAAK,CAC3B,IAAM8Z,CAAAA,CAAI,IAAI,IAAA,CAAKF,CAAK,EACxBE,CAAAA,CAAE,OAAA,CAAQF,CAAAA,CAAM,OAAA,GAAY5Z,CAAC,CAAA,CAC7B6Z,CAAAA,CAAK,IAAA,CAAKC,CAAC,EACb,CACA,OAAOD,CACT,CAEA,IAAME,EAAAA,CAAoC,CAAC,CACzC,KAAA,CAAAlc,EACA,QAAA,CAAAmc,CAAAA,CACA,WAAA,CAAA7M,CAAAA,CAAc,KACd,SAAA,CAAAV,CACF,CAAA,GAAM,CACJ,GAAM,CAACwN,CAAAA,CAAcC,CAAe,CAAA,CAAUC,YAAStc,CAAAA,EAAS,IAAI,IAAM,CAAA,CAEpEuc,EAASjN,CAAAA,GAAgB,IAAA,CAAOgM,EAAAA,CAAYC,EAAAA,CAC5CiB,EAAalN,CAAAA,GAAgB,IAAA,CAAOkM,EAAAA,CAAUC,EAAAA,CAC9CgB,EAAanN,CAAAA,GAAgB,IAAA,CAAO,cAAgB,OAAA,CAEpDoN,CAAAA,CAAYC,GAAyB,CACzCN,CAAAA,CAAiBO,CAAAA,EAAS,CACxB,IAAMX,CAAAA,CAAI,IAAI,IAAA,CAAKW,CAAI,EACvB,OAAAX,CAAAA,CAAE,QAAA,CAASW,CAAAA,CAAK,UAAS,EAAKD,CAAAA,GAAQ,MAAA,CAAS,CAAA,CAAI,GAAG,CAAA,CAC/CV,CACT,CAAC,EACH,EAGMY,CAAAA,CADQ,IAAI,IAAA,EAAK,CACA,cAAa,CAC9BC,CAAAA,CAAc9c,CAAAA,EAAO,YAAA,GAE3B,OACEmP,IAAAA,CAAC,OAAI,SAAA,CAAWqI,CAAAA,CAAG,mBAAoB5I,CAAS,CAAA,CAE9C,QAAA,CAAA,CAAAO,IAAAA,CAAC,OAAI,SAAA,CAAU,oGAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMiV,EAAS,MAAM,CAAA,CAC9B,SAAA,CAAU,oFAAA,CAEV,SAAAjV,GAAAA,CAACsV,WAAAA,CAAA,CAAY,SAAA,CAAU,UAAU,CAAA,CACnC,CAAA,CACA5N,IAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,qDAAA,CACb,QAAA,CAAA,CAAAoN,CAAAA,CAAOH,CAAAA,CAAa,UAAU,CAAA,CAAE,IAAEA,CAAAA,CAAa,WAAA,IAClD,CAAA,CACA3U,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAS,IAAMiV,CAAAA,CAAS,MAAM,EAC9B,SAAA,CAAU,oFAAA,CAEV,QAAA,CAAAjV,GAAAA,CAACuV,aAAA,CAAa,SAAA,CAAU,UAAU,CAAA,CACpC,CAAA,CAAA,CACF,EAGAvV,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wDAAA,CACZ,SAAA+U,CAAAA,CAAW,GAAA,CAAKP,CAAAA,EACfxU,GAAAA,CAAC,OAAY,SAAA,CAAU,qDAAA,CACpB,QAAA,CAAAwU,CAAAA,CAAAA,CADOA,CAEV,CACD,CAAA,CACH,EAGAxU,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,8BAAA,CACZ,QAAA,CAAAiU,EAAAA,CAAeU,CAAY,EAAE,GAAA,CAAI,CAACT,CAAAA,CAAMxZ,CAAAA,GAAM,CAC7C,IAAM8a,CAAAA,CAAiBtB,CAAAA,CAAK,QAAA,KAAeS,CAAAA,CAAa,QAAA,EAAS,CAC3Dc,CAAAA,CAAUvB,EAAK,YAAA,EAAa,GAAMkB,CAAAA,CAClCM,CAAAA,CAAaL,GAAenB,CAAAA,CAAK,YAAA,EAAa,GAAMmB,CAAAA,CAE1D,OACErV,GAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,QAAS,IAAM0U,CAAAA,CAASR,CAAI,CAAA,CAC5B,SAAA,CAAWnE,EACT,oFAAA,CACA,CAACyF,CAAAA,EAAkB,gBAAA,CACnBA,GAAkB,CAACE,CAAAA,EAAc,CAACD,CAAAA,EAAW,oCAC7CA,CAAAA,EAAW,CAACC,CAAAA,EAAc,sCAAA,CAC1BA,GAAc,2DAChB,CAAA,CAEC,QAAA,CAAAxB,CAAAA,CAAK,SAAQ,CAAA,CAXTxZ,CAYP,CAEJ,CAAC,EACH,CAAA,CAGAsF,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCACb,QAAA,CAAAA,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAS,IAAM,CACb,IAAM2V,CAAAA,CAAI,IAAI,IAAA,CACdf,CAAAA,CAAgBe,CAAC,CAAA,CACjBjB,EAASiB,CAAC,EACZ,CAAA,CACA,SAAA,CAAU,kIAET,QAAA,CAAAX,CAAAA,CACH,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAAA,CClHA,IAAMY,EAAAA,CAAa,CAAC1B,CAAAA,CAAY2B,IAC9B3B,CAAAA,CAAK,kBAAA,CAAmB2B,CAAAA,GAAS,IAAA,CAAO,QAAU,OAAA,CAAS,CACzD,IAAK,SAAA,CACL,KAAA,CAAO,OACP,IAAA,CAAM,SACR,CAAC,CAAA,CAEGC,GAA8C,CAAC,CACnD,KAAA,CAAAne,CAAAA,CACA,KAAA2a,CAAAA,CACA,YAAA,CAAAyD,CAAAA,CACA,WAAA,CAAAlO,EAAc,IAAA,CACd,SAAA,CAAAV,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,QAAA,CAAA6O,CAAAA,CAAU,QAAA,CAAA5K,CAAS,CAAA,CAAIxE,cAAAA,EAAe,CACxCvO,CAAAA,CAAYia,GAAQ3a,CAAAA,CAAM,SAAA,CAAU,QAAA,EAAS,CAE7C,CAACse,CAAAA,CAAMC,CAAO,EAAIva,QAAAA,CAAS,KAAK,EAChC,CAACwa,CAAAA,CAAcC,CAAe,CAAA,CAAIza,SACtCoa,CAAAA,CAAe,IAAI,IAAA,CAAKA,CAAY,EAAI,IAC1C,CAAA,CAEMM,CAAAA,CAAgBnC,CAAAA,EAAe,CACnCkC,CAAAA,CAAgBlC,CAAI,CAAA,CACpB9I,CAAAA,CAAS/S,EAAW6b,CAAAA,CAAK,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAG,CACpD,eAAgB,IAAA,CAChB,WAAA,CAAa,IACf,CAAC,EACDgC,CAAAA,CAAQ,KAAK,EACf,CAAA,CAEMI,CAAAA,CAAczO,IAAgB,IAAA,CAAO,0BAAA,CAA0B,eAAA,CAErE,OACEH,KAACM,CAAAA,CAAA,CAAiB,KAAA,CAAOrQ,CAAAA,CAAO,YAAakQ,CAAAA,CAC3C,QAAA,CAAA,CAAA7H,GAAAA,CAAC,OAAA,CAAA,CAAM,KAAK,QAAA,CAAU,GAAGgW,CAAAA,CAAS3d,CAAS,EAAG,CAAA,CAC9CqP,IAAAA,CAAC6L,EAAAA,CAAA,CAAQ,KAAM0C,CAAAA,CAAM,YAAA,CAAcC,CAAAA,CACjC,QAAA,CAAA,CAAAlW,IAACwT,EAAAA,CAAA,CAAe,OAAA,CAAO,IAAA,CACrB,SAAA9L,IAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,SAAA,CAAWqI,EACT,qGAAA,CACA,2BAAA,CACA,qHAAA,CACA,iDAAA,CACAkG,GAAQ,0EAAA,CACRE,CAAAA,CAAe,gBAAA,CAAmB,gBAAA,CAClChP,CACF,CAAA,CAEA,QAAA,CAAA,CAAAO,IAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,yBAAA,CACd,QAAA,CAAA,CAAA1H,GAAAA,CAACuW,YAAAA,CAAA,CAAa,SAAA,CAAU,iCAAA,CAAkC,CAAA,CACzDJ,CAAAA,CAAeP,GAAWO,CAAAA,CAActO,CAAW,CAAA,CAAIyO,CAAAA,CAAAA,CAC1D,EACAtW,GAAAA,CAACwW,WAAAA,CAAA,CACC,SAAA,CAAWzG,EACT,sDAAA,CACAkG,CAAAA,EAAQ,YACV,CAAA,CACF,CAAA,CAAA,CACF,EACF,CAAA,CACAjW,GAAAA,CAACyT,EAAAA,CAAA,CAAe,UAAU,qBAAA,CACxB,QAAA,CAAAzT,GAAAA,CAACyU,EAAAA,CAAA,CACC,KAAA,CAAO0B,CAAAA,CACP,QAAA,CAAUE,CAAAA,CACV,YAAaxO,CAAAA,CACf,CAAA,CACF,GACF,CAAA,CAAA,CACF,CAEJ,EAEO4O,EAAAA,CAAQX,EAAAA,CC1Ff,IAAMY,EAAAA,CAAyB,CAAA,CAAA,IAAA,CAE/B,IAAMC,GAA8B,CAAA,CAAA,KAAA,CAE9BC,EAAAA,CAAsBC,EAAA,CAAA,UAAA,CAG1B,CAAC,CAAE,SAAA,CAAA1P,CAAAA,CAAW,QAAA,CAAApH,CAAAA,CAAU,GAAGkO,CAAM,CAAA,CAAGC,CAAAA,GACpCxG,IAAAA,CAAiB,UAAhB,CACC,GAAA,CAAKwG,EACL,SAAA,CAAW6B,CAAAA,CACT,sGACA,mDAAA,CACA,qHAAA,CACA,iDAAA,CACA,yCAAA,CACA5I,CACF,CAAA,CACC,GAAG8G,CAAAA,CAEH,QAAA,CAAA,CAAAlO,EACDC,GAAAA,CAAiB,CAAA,CAAA,IAAA,CAAhB,CAAqB,OAAA,CAAO,KAC3B,QAAA,CAAAA,GAAAA,CAACwW,WAAAA,CAAA,CAAY,UAAU,sCAAA,CAAuC,CAAA,CAChE,CAAA,CAAA,CACF,CACD,EACDI,EAAAA,CAAc,WAAA,CAA8B,CAAA,CAAA,OAAA,CAAQ,WAAA,CAEpD,IAAME,EAAAA,CAAsBD,EAAA,CAAA,UAAA,CAG1B,CAAC,CAAE,UAAA1P,CAAAA,CAAW,QAAA,CAAApH,EAAU,QAAA,CAAAmH,CAAAA,CAAW,SAAU,GAAG+G,CAAM,CAAA,CAAGC,CAAAA,GACzDlO,IAAiB,CAAA,CAAA,MAAA,CAAhB,CACC,QAAA,CAAAA,GAAAA,CAAiB,UAAhB,CACC,GAAA,CAAKkO,CAAAA,CACL,SAAA,CAAW6B,EACT,iHAAA,CACA7I,CAAAA,GAAa,QAAA,EAAY,gDAAA,CACzBC,CACF,CAAA,CACA,QAAA,CAAUD,CAAAA,CACT,GAAG+G,EAEJ,QAAA,CAAAjO,GAAAA,CAAiB,CAAA,CAAA,QAAA,CAAhB,CAAyB,UAAU,KAAA,CACjC,QAAA,CAAAD,CAAAA,CACH,CAAA,CACF,EACF,CACD,CAAA,CACD+W,GAAc,WAAA,CAA8B,CAAA,CAAA,OAAA,CAAQ,YAEpD,IAAMC,EAAAA,CAAoBF,EAAA,CAAA,UAAA,CAGxB,CAAC,CAAE,SAAA,CAAA1P,CAAAA,CAAW,GAAG8G,CAAM,EAAGC,CAAAA,GAC1BlO,GAAAA,CAAiB,CAAA,CAAA,KAAA,CAAhB,CACC,IAAKkO,CAAAA,CACL,SAAA,CAAW6B,EAAG,uDAAA,CAAyD5I,CAAS,EAC/E,GAAG8G,CAAAA,CACN,CACD,CAAA,CACD8I,GAAY,WAAA,CAA8B,CAAA,CAAA,KAAA,CAAM,WAAA,CAEhD,IAAMC,GAAmBH,EAAA,CAAA,UAAA,CAGvB,CAAC,CAAE,SAAA,CAAA1P,EAAW,QAAA,CAAApH,CAAAA,CAAU,GAAGkO,CAAM,CAAA,CAAGC,IACpCxG,IAAAA,CAAiB,CAAA,CAAA,IAAA,CAAhB,CACC,GAAA,CAAKwG,EACL,SAAA,CAAW6B,CAAAA,CACT,iHAAA,CACA,qFAAA,CACA,iEACA,gFAAA,CACA5I,CACF,CAAA,CACC,GAAG8G,EAEJ,QAAA,CAAA,CAAAjO,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+DACd,QAAA,CAAAA,GAAAA,CAAiB,CAAA,CAAA,aAAA,CAAhB,CACC,SAAAA,GAAAA,CAAC6S,KAAAA,CAAA,CAAM,SAAA,CAAU,mCAAmC,CAAA,CACtD,CAAA,CACF,CAAA,CACA7S,GAAAA,CAAiB,WAAhB,CAA0B,QAAA,CAAAD,EAAS,CAAA,CAAA,CACtC,CACD,EACDiX,EAAAA,CAAW,WAAA,CAA8B,CAAA,CAAA,IAAA,CAAK,WAAA,CAE9C,IAAMC,EAAAA,CAAwBJ,EAAA,CAAA,UAAA,CAG5B,CAAC,CAAE,UAAA1P,CAAAA,CAAW,GAAG8G,CAAM,CAAA,CAAGC,IAC1BlO,GAAAA,CAAiB,CAAA,CAAA,SAAA,CAAhB,CACC,GAAA,CAAKkO,EACL,SAAA,CAAW6B,CAAAA,CAAG,8BAAA,CAAgC5I,CAAS,EACtD,GAAG8G,CAAAA,CACN,CACD,CAAA,CACDgJ,GAAgB,WAAA,CAA8B,CAAA,CAAA,SAAA,CAAU,WAAA,CClGxD,IAAMC,GAAcC,EAAA,CAAA,UAAA,CAClB,CAAC,CAAE,SAAA,CAAAhQ,EAAW,IAAA,CAAAvE,CAAAA,CAAM,GAAGqL,CAAM,EAAGC,CAAAA,GAC9BlO,GAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAM4C,EACN,SAAA,CAAWmN,CAAAA,CACT,+FAAA,CACA,4BAAA,CACA,8JACA,iDAAA,CACA,mBAAA,CACA5I,CACF,CAAA,CACA,IAAK+G,CAAAA,CACJ,GAAGD,CAAAA,CACN,CAEJ,EACAiJ,EAAAA,CAAM,WAAA,CAAc,OAAA,CCSpB,IAAME,EAAAA,CAAcxR,GAClBA,CAAAA,CACG,WAAA,EAAY,CACZ,SAAA,CAAU,KAAK,CAAA,CACf,OAAA,CAAQ,QAAA,CAAU,EAAE,EACpB,OAAA,CAAQ,eAAA,CAAiB,EAAE,CAAA,CAC3B,OAAA,CAAQ,OAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,KAAA,CAAO,GAAG,CAAA,CAClB,IAAA,EAAK,CACL,OAAA,CAAQ,WAAY,EAAE,CAAA,CAErByR,EAAAA,CAAsD,CAAC,CAC3D,KAAA,CAAA1f,CAAAA,CACA,KAAA2a,CAAAA,CACA,YAAA,CAAAyD,EACA,WAAA,CAAAlO,CAAAA,CAAc,IAAA,CACd,SAAA,CAAAV,EACA,6BAAA,CAAAmQ,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,QAAA,CAAAlM,CAAAA,CAAU,KAAA,CAAAD,EAAO,SAAA,CAAAE,CAAU,CAAA,CAAIzE,cAAAA,GACjCvO,CAAAA,CAAYia,CAAAA,EAAQ3a,CAAAA,CAAM,SAAA,CAAU,UAAS,CAC7C+U,CAAAA,CAAevB,CAAAA,CAAM9S,CAAS,EAE9Bkf,CAAAA,CAA4B5f,CAAAA,CAAM,iBAAA,CACpC2f,CAAAA,EAAiC3f,EAAM,iBAAA,CAAkB,kBAAA,CACzD,KACE6f,CAAAA,CAA0BD,CAAAA,CAC5BpM,EAAMoM,CAAyB,CAAA,CAC/B,IAAA,CACEE,CAAAA,CAA8BF,EAChClM,CAAAA,CAAUkM,CAAyB,CAAA,CACnC,IAAA,CACExL,EACJyL,CAAAA,EAA2B,IAAA,EAAQA,CAAAA,GAA4B,EAAA,CAC3DA,EACAC,CAAAA,EAA+B,IAAA,EAAQA,CAAAA,GAAgC,EAAA,CACvEA,EACA,IAAA,CAEAC,CAAAA,CACJ/f,CAAAA,CAAM,iBAAA,GAAsB,CAACoU,CAAAA,EAAkB,CAACpU,CAAAA,CAAM,aAAA,EAAe,QAEjE2e,CAAAA,CAAc1O,CAAAA,CAAiBjQ,CAAAA,CAAM,WAAA,CAAakQ,CAAW,CAAA,CAC7D0K,CAAAA,CAAQ3K,EAAiBjQ,CAAAA,CAAM,KAAA,CAAOkQ,CAAW,CAAA,CACjD8P,CAAAA,CACJD,CAAAA,EAAc/f,CAAAA,CAAM,kBAChB,kDAAA,CACA2e,CAAAA,EAAe,CAAA,gBAAA,EAAgB/D,CAAK,GAGpC,CAACqF,CAAAA,CAAQC,CAAS,CAAA,CAAIlc,SAAS,KAAK,CAAA,CACpC,CAACmc,CAAAA,CAAaC,CAAc,CAAA,CAAIpc,QAAAA,CAAS,EAAE,CAAA,CAC3C,CAACqQ,CAAAA,CAAiBgM,CAAkB,CAAA,CAAIrc,QAAAA,CAAShE,EAAM,aAAA,EAAiB,EAAE,CAAA,CAC1E,CAACsgB,CAAAA,CAAgBC,CAAiB,EAAIvc,QAAAA,CAA8B,IAAI,EACxE,CAACwc,CAAAA,CAAoBC,CAAqB,CAAA,CAAIzc,SAAwB,IAAI,CAAA,CAC1E,CAAC0c,CAAAA,CAAkBC,CAAmB,CAAA,CAAI3c,QAAAA,CAItC,IAAI,CAAA,CACR4c,EAAcxc,MAAAA,CAAuB,IAAI,EACzCyc,CAAAA,CAAWzc,MAAAA,CAAyB,IAAI,CAAA,CAE9CmQ,SAAAA,CAAU,IAAM,CACd,GAAI6J,CAAAA,CAAc,CAChB,IAAM5C,CAAAA,CAASxb,EAAM,aAAA,EAAe,IAAA,CAAM8gB,CAAAA,EAAQA,CAAAA,CAAI,QAAU1C,CAAY,CAAA,CACxE5C,IACF+E,CAAAA,CAAkB/E,CAAM,EACxB4E,CAAAA,CAAenQ,CAAAA,CAAiBuL,CAAAA,CAAO,KAAA,CAAOtL,CAAW,CAAC,CAAA,EAE9D,CACF,CAAA,CAAG,CAACkO,CAAAA,CAAcpe,CAAAA,CAAM,aAAA,CAAekQ,CAAW,CAAC,CAAA,CAEnDqE,SAAAA,CAAU,IAAM,CACd,GAAIQ,CAAAA,EAAgBA,CAAAA,GAAiBuL,CAAAA,EAAgB,KAAA,CAAO,CAC1D,IAAM9E,CAAAA,CAASxb,CAAAA,CAAM,aAAA,EAAe,KAAM8gB,CAAAA,EAAQA,CAAAA,CAAI,KAAA,GAAU/L,CAAY,EACxEyG,CAAAA,GACF+E,CAAAA,CAAkB/E,CAAM,CAAA,CACxB4E,CAAAA,CAAenQ,EAAiBuL,CAAAA,CAAO,KAAA,CAAOtL,CAAW,CAAC,GAE9D,CAAA,KAAW,CAAC6E,CAAAA,EAAgBuL,CAAAA,GAC1BC,EAAkB,IAAI,CAAA,CACtBH,CAAAA,CAAe,EAAE,GAErB,CAAA,CAAG,CAACrL,CAAAA,CAAc/U,CAAAA,CAAM,cAAekQ,CAAAA,CAAaoQ,CAAc,CAAC,CAAA,CAEnE,IAAMS,CAAAA,CAAyB,IAAM,CACnC,GAAI,CAACF,CAAAA,CAAS,OAAA,CAAS,OACvB,IAAMG,EAAOH,CAAAA,CAAS,OAAA,CAAQ,uBAAsB,CAC9CI,CAAAA,CAAY,OAAO,WAAA,EAAe,QAAA,CAAS,eAAA,CAAgB,SAAA,CAC3DC,EAAa,MAAA,CAAO,WAAA,EAAe,QAAA,CAAS,eAAA,CAAgB,WAClEP,CAAAA,CAAoB,CAAE,GAAA,CAAKK,CAAAA,CAAK,OAASC,CAAAA,CAAW,IAAA,CAAMD,CAAAA,CAAK,IAAA,CAAOE,EAAY,KAAA,CAAOF,CAAAA,CAAK,KAAM,CAAC,EACvG,CAAA,CAEAzM,SAAAA,CAAU,IAAM,CACd,GAAI0L,CAAAA,EAAUjgB,CAAAA,CAAM,YAAA,CAClB,OAAA+gB,GAAuB,CACvB,MAAA,CAAO,iBAAiB,QAAA,CAAUA,CAAAA,CAAwB,IAAI,CAAA,CAC9D,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAUA,CAAsB,CAAA,CACjD,IAAM,CACX,MAAA,CAAO,oBAAoB,QAAA,CAAUA,CAAAA,CAAwB,IAAI,CAAA,CACjE,OAAO,mBAAA,CAAoB,QAAA,CAAUA,CAAsB,EAC7D,CAEJ,EAAG,CAACd,CAAAA,CAAQjgB,CAAAA,CAAM,YAAY,CAAC,CAAA,CAE/BuU,SAAAA,CAAU,IAAM,CACd,GAAI,CAACvU,CAAAA,CAAM,YAAA,CAAc,CACvBqgB,EAAmBrgB,CAAAA,CAAM,aAAA,EAAiB,EAAE,CAAA,CAC5C,MACF,CACA,GAAI,CAACmgB,CAAAA,CAAY,MAAK,CAAG,CACvBE,CAAAA,CAAmBrgB,CAAAA,CAAM,eAAiB,EAAE,CAAA,CAC5C,MACF,CACA,IAAMmhB,CAAAA,CAAY1B,EAAAA,CAAWU,CAAW,EACxCE,CAAAA,CACErgB,CAAAA,CAAM,aAAA,EAAe,MAAA,CAAQwb,GAC3BiE,EAAAA,CAAWxP,CAAAA,CAAiBuL,CAAAA,CAAO,KAAA,CAAOtL,CAAW,CAAC,CAAA,CAAE,QAAA,CAASiR,CAAS,CAC5E,CAAA,EAAK,EACP,EACF,CAAA,CAAG,CAAChB,CAAAA,CAAangB,CAAAA,CAAM,aAAA,CAAeA,CAAAA,CAAM,aAAckQ,CAAW,CAAC,CAAA,CAEtEqE,SAAAA,CAAU,IAAM,CACd,IAAM6M,CAAAA,CAAsBC,CAAAA,EAAsB,CAChD,IAAM7V,CAAAA,CAAS6V,CAAAA,CAAM,MAAA,CACjBT,EAAY,OAAA,EAAS,QAAA,CAASpV,CAAM,CAAA,EACpCxL,EAAM,YAAA,EAAgBigB,CAAAA,EACD,QAAA,CAAS,aAAA,CAAc,+BAA+B,CAAA,EACzD,QAAA,CAASzU,CAAM,CAAA,GAErC0U,EAAU,KAAK,CAAA,CACfO,EAAsB,IAAI,CAAA,CACtBH,GAAkBtgB,CAAAA,CAAM,YAAA,EAC1BogB,CAAAA,CAAenQ,CAAAA,CAAiBqQ,EAAe,KAAA,CAAOpQ,CAAW,CAAC,CAAA,EAEtE,EACA,OAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,CAAakR,CAAkB,EAClD,IAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,CAAaA,CAAkB,CAC3E,CAAA,CAAG,CAACd,CAAAA,CAAgBpQ,EAAalQ,CAAAA,CAAM,YAAA,CAAcigB,CAAM,CAAC,EAE5D,IAAMqB,CAAAA,CAAsB9F,CAAAA,EAAyB,CACnD+E,EAAkB/E,CAAM,CAAA,CACxB4E,EAAenQ,CAAAA,CAAiBuL,CAAAA,CAAO,MAAOtL,CAAW,CAAC,CAAA,CAC1DuD,CAAAA,CAAS/S,EAAW8a,CAAAA,CAAO,KAAA,CAAO,CAAE,cAAA,CAAgB,KAAM,WAAA,CAAa,IAAK,CAAC,CAAA,CAC7E0E,EAAU,KAAK,CAAA,CACfO,EAAsB,IAAI,EAC5B,EAEMc,CAAAA,CAAqBnR,CAAAA,EAA2C,CACpE,IAAMxP,EAAQwP,CAAAA,CAAE,MAAA,CAAO,KAAA,CACvBgQ,CAAAA,CAAexf,CAAK,CAAA,CAChBZ,CAAAA,CAAM,YAAA,GACRkgB,CAAAA,CAAU,IAAI,CAAA,CACdO,CAAAA,CAAsB,IAAI,CAAA,CACtB,CAAC7f,EAAM,IAAA,EAAK,EAAK0f,CAAAA,GACnBC,CAAAA,CAAkB,IAAI,CAAA,CACtB9M,CAAAA,CAAS/S,CAAAA,CAAW,EAAA,CAAI,CAAE,cAAA,CAAgB,IAAA,CAAM,WAAA,CAAa,IAAK,CAAC,CAAA,CAAA,EAGzE,CAAA,CAGA,OAAKV,CAAAA,CAAM,aA2BTqI,GAAAA,CAACgI,CAAAA,CAAA,CAAiB,KAAA,CAAOrQ,EAAO,WAAA,CAAakQ,CAAAA,CAC3C,QAAA,CAAAH,IAAAA,CAAC,OAAI,GAAA,CAAK6Q,CAAAA,CAAa,SAAA,CAAU,UAAA,CAC/B,UAAAvY,GAAAA,CAACkX,EAAAA,CAAA,CACC,GAAA,CAAKsB,CAAAA,CACL,KAAK,MAAA,CACL,KAAA,CAAOV,CAAAA,CACP,QAAA,CAAUoB,EACV,OAAA,CAAS,IAAM,CACTxB,CAAAA,GACJG,EAAW/e,CAAAA,EAAM,CAACA,CAAC,CAAA,CACfmf,GAAkB,CAACL,CAAAA,EAAQG,CAAAA,CAAe,EAAE,GAClD,CAAA,CACA,SAAA,CAAYhQ,CAAAA,EAAM,CACZ2P,IACA3P,CAAAA,CAAE,GAAA,GAAQ,QAAA,EACZ8P,CAAAA,CAAU,KAAK,CAAA,CACXI,CAAAA,EAAgBF,CAAAA,CAAenQ,CAAAA,CAAiBqQ,EAAe,KAAA,CAAOpQ,CAAW,CAAC,CAAA,EAC7EE,CAAAA,CAAE,MAAQ,OAAA,EACnBA,CAAAA,CAAE,cAAA,EAAe,CACbiE,EAAgB,MAAA,GAAW,CAAA,EAAKA,CAAAA,CAAgB,CAAC,GACnDiN,CAAAA,CAAmBjN,CAAAA,CAAgB,CAAC,CAAC,GAE9BjE,CAAAA,CAAE,GAAA,GAAQ,WAAA,GACnBA,CAAAA,CAAE,gBAAe,CACjB8P,CAAAA,CAAU,IAAI,CAAA,CAAA,EAElB,EACA,WAAA,CAAaF,CAAAA,CACb,YAAA,CAAa,KAAA,CACb,SAAU,CAAC,CAACD,CAAAA,CACZ,SAAA,CAAW3H,EAAG,OAAA,CAAS5I,CAAS,EAClC,CAAA,CACAnH,GAAAA,CAACwW,YAAA,CACC,SAAA,CAAWzG,CAAAA,CACT,2GAAA,CACA6H,GAAU,YACZ,CAAA,CACF,CAAA,CAECA,CAAAA,EAAUS,GACTc,YAAAA,CACEnZ,GAAAA,CAAC,KAAA,CAAA,CACC,sBAAA,CAAqB,OACrB,KAAA,CAAO,CACL,SAAU,UAAA,CACV,GAAA,CAAKqY,EAAiB,GAAA,CACtB,IAAA,CAAMA,CAAAA,CAAiB,IAAA,CACvB,MAAOA,CAAAA,CAAiB,KAAA,CACxB,MAAA,CAAQ,MACV,EACA,SAAA,CAAU,gFAAA,CACV,WAAA,CAActQ,CAAAA,EAAMA,EAAE,eAAA,EAAgB,CAErC,SAAAiE,CAAAA,CAAgB,MAAA,GAAW,EAC1BhM,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yCAAA,CAA0C,uCAEzD,CAAA,CAEAgM,CAAAA,CAAgB,GAAA,CAAI,CAACmH,EAAQrG,CAAAA,GAC3B9M,GAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAW+P,EACT,4FAAA,CACAoI,CAAAA,GAAuBrL,CAAAA,CAAQ,0BAAA,CAA6B,iBAC5DmL,CAAAA,EAAgB,KAAA,GAAU9E,CAAAA,CAAO,KAAA,EAAS,2BAC5C,CAAA,CACA,WAAA,CAAcpL,CAAAA,EAAM,CACd2P,IACJ3P,CAAAA,CAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,iBAAgB,CAClBkR,CAAAA,CAAmB9F,CAAM,CAAA,EAC3B,CAAA,CACA,aAAc,IAAMiF,CAAAA,CAAsBtL,CAAK,CAAA,CAC/C,aAAc,IAAMsL,CAAAA,CAAsB,IAAI,CAAA,CAE7C,SAAAxQ,CAAAA,CAAiBuL,CAAAA,CAAO,KAAA,CAAOtL,CAAW,GAftC,CAAA,EAAGsL,CAAAA,CAAO,KAAK,CAAA,CAAA,EAAIrG,CAAK,CAAA,CAgB/B,CACD,CAAA,CAEL,CAAA,CACA,SAAS,IACX,CAAA,CAAA,CACJ,CAAA,CACF,CAAA,CA5GE9M,IAACgI,CAAAA,CAAA,CAAiB,KAAA,CAAOrQ,CAAAA,CAAO,YAAakQ,CAAAA,CAC3C,QAAA,CAAAH,KAACgP,EAAAA,CAAA,CACC,MAAOhK,CAAAA,EAAgB,EAAA,CACvB,aAAA,CAAgBtK,CAAAA,EACdgJ,EAAS/S,CAAAA,CAAW+J,CAAAA,CAAK,CAAE,cAAA,CAAgB,KAAM,WAAA,CAAa,IAAK,CAAC,CAAA,CAEtE,SAAU,CAAC,CAACsV,CAAAA,CAEZ,QAAA,CAAA,CAAA1X,IAAC4W,EAAAA,CAAA,CAAc,SAAA,CAAW7G,CAAAA,CAAG,SAAU5I,CAAS,CAAA,CAC9C,QAAA,CAAAnH,GAAAA,CAAC2W,GAAA,CAAY,WAAA,CAAagB,CAAAA,CAAsB,CAAA,CAClD,EACA3X,GAAAA,CAAC8W,EAAAA,CAAA,CACE,QAAA,CAAAnf,CAAAA,CAAM,eAAe,GAAA,CAAI,CAACwb,CAAAA,CAAQrG,CAAAA,GACjC9M,IAACgX,EAAAA,CAAA,CAA4C,KAAA,CAAO7D,CAAAA,CAAO,MACxD,QAAA,CAAAvL,CAAAA,CAAiBuL,CAAAA,CAAO,KAAA,CAAOtL,CAAW,CAAA,CAAA,CAD5B,CAAA,EAAGsL,EAAO,KAAK,CAAA,CAAA,EAAIrG,CAAK,CAAA,CAEzC,CACD,CAAA,CACH,CAAA,CAAA,CACF,EACF,CA2FN,CAAA,CAEOsM,EAAAA,CAAQ/B,EAAAA,CCpTR,IAAMgC,CAAAA,CACX9gB,CAAAA,EACuB,CACvB,GAAI,CAACA,CAAAA,CACH,OAGF,IAAM+gB,EAAc7hB,CAAAA,EAA0B,CAC5C,GAAI,CACF,OAAO,kBAAA,CAAmBA,CAAK,CACjC,CAAA,KAAQ,CACN,OAAOA,CACT,CACF,CAAA,CAEM8hB,CAAAA,CAAmB9hB,GAAsC,CAC7D,IAAM+hB,CAAAA,CAAY/hB,CAAAA,CAAM,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAC9BgiB,EAAWD,CAAAA,CAAU,KAAA,CAAM,OAAO,CAAA,CAAE,OAAO,OAAO,CAAA,CACxD,OAAIC,CAAAA,CAAS,SAAW,CAAA,CACfD,CAAAA,CAAYF,CAAAA,CAAWE,CAAS,EAAI,MAAA,CAEtCF,CAAAA,CAAWG,CAAAA,CAASA,CAAAA,CAAS,OAAS,CAAC,CAAC,CACjD,CAAA,CAEA,GAAI,CACF,IAAMpW,CAAAA,CAAM,IAAI,GAAA,CAAI9K,CAAK,CAAA,CACnBmhB,CAAAA,CAAqB,CAAC,UAAA,CAAY,OAAQ,WAAA,CAAa,MAAM,CAAA,CAEnE,IAAA,IAAWxf,KAAOwf,CAAAA,CAAoB,CACpC,IAAMC,CAAAA,CAAatW,EAAI,YAAA,CAAa,GAAA,CAAInJ,CAAG,CAAA,CAC3C,GAAIyf,CAAAA,CAAY,CACd,IAAMC,CAAAA,CAAaD,EAAW,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,IAASA,CAAAA,CAClE,OAAOL,EAAWM,CAAU,CAC9B,CACF,CAEA,IAAMC,CAAAA,CAAexW,CAAAA,CAAI,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAC3D,GAAIwW,CAAAA,CAAa,MAAA,CAAS,EACxB,OAAOP,CAAAA,CAAWO,EAAaA,CAAAA,CAAa,MAAA,CAAS,CAAC,CAAC,CAE3D,CAAA,KAAQ,CAER,CAEA,OAAON,EAAgBhhB,CAAK,CAC9B,CAAA,CCFA,IAAMuhB,GACJC,CAAAA,EACoCA,CAAAA,YAAmB,IAEnDC,EAAAA,CACJD,CAAAA,EAEKA,EAGDD,EAAAA,CAAMC,CAAO,CAAA,CACR,MAAA,CAAO,YAAYA,CAAAA,CAAQ,OAAA,EAAS,CAAA,CAEtC,CAAE,GAAGA,CAAQ,CAAA,CALX,GAQLzV,EAAAA,CAAmB,CAACC,CAAAA,CAAmBC,CAAAA,GAA6B,CACxE,IAAMC,CAAAA,CAAOF,CAAAA,CAAU,OAAA,CAAQ,OAAQ,EAAE,CAAA,CACzC,GAAI,eAAA,CAAgB,KAAKC,CAAQ,CAAA,CAC/B,OAAOA,CAAAA,CAET,IAAME,CAAAA,CAAOF,CAAAA,CAAS,QAAQ,MAAA,CAAQ,EAAE,EACxC,OAAO,CAAA,EAAGC,CAAI,CAAA,CAAA,EAAIC,CAAI,CAAA,CACxB,CAAA,CAEMuV,EAAAA,CAAsB,CAC1BC,EACAhgB,CAAAA,CACA3B,CAAAA,GACG,CACH,GAA2BA,GAAU,IAAA,CAIrC,CAAA,GAAIA,aAAiB,IAAA,EAAQA,CAAAA,YAAiB,KAAM,CAClD2hB,CAAAA,CAAS,MAAA,CAAOhgB,CAAAA,CAAK3B,CAAK,CAAA,CAC1B,MACF,CAEA,GAAI,MAAM,OAAA,CAAQA,CAAK,CAAA,CAAG,CACxBA,EAAM,OAAA,CAASkK,CAAAA,EAAUwX,GAAoBC,CAAAA,CAAUhgB,CAAAA,CAAKuI,CAAK,CAAC,CAAA,CAClE,MACF,CAEA,GAAI,OAAOlK,CAAAA,EAAU,QAAA,CAAU,CAC7B2hB,EAAS,MAAA,CAAOhgB,CAAAA,CAAK,IAAA,CAAK,SAAA,CAAU3B,CAAK,CAAC,CAAA,CAC1C,MACF,CAEA2hB,EAAS,MAAA,CAAOhgB,CAAAA,CAAK,MAAA,CAAO3B,CAAK,CAAC,EAAA,CACpC,CAAA,CAEM4hB,EAAAA,CAAe,CACnBpgB,EACAqgB,CAAAA,CACAC,CAAAA,GACuB,CACvB,IAAMC,EAAa,CACjBvgB,CAAAA,EAAM,SACNA,CAAAA,EAAM,QAAA,CACNA,GAAM,iBAAA,CACNA,CAAAA,EAAM,iBAAA,CACNA,CAAAA,EAAM,mBACNA,CAAAA,EAAM,cAAA,CACNA,CAAAA,EAAM,cAAA,CACNA,GAAM,IACR,CAAA,CAAE,MAAA,CAAQxB,CAAAA,EAAU,OAAOA,CAAAA,EAAU,QAAA,EAAYA,EAAM,IAAA,EAAK,CAAE,OAAS,CAAC,CAAA,CAExE,GAAI+hB,CAAAA,CAAW,OAAS,CAAA,CACtB,OAAOA,CAAAA,CAAW,CAAC,EAGrB,IAAMC,CAAAA,CAAiBlB,CAAAA,CAAuBe,CAAW,EACzD,OAAIG,CAAAA,EAIGF,GAAc,IACvB,CAAA,CAEMG,GAAsB,CAC1BC,CAAAA,CACAC,CAAAA,GACS,CACT,GAAID,CAAAA,YAAgB,IAAA,CAClB,OAAOA,CAAAA,CAET,IAAMnI,CAAAA,CACJoI,CAAAA,EAAoB,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA,EAAA,CAAKD,CAAAA,CAAK,IAAA,EAAQ,OAAO,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,IAAS,KAAK,CAAA,CAAA,CAC5F,OAAO,IAAI,KAAK,CAACA,CAAI,CAAA,CAAGnI,CAAAA,CAAM,CAAE,IAAA,CAAMmI,CAAAA,CAAK,MAAQ,0BAA2B,CAAC,CACjF,CAAA,CAEME,EAAAA,CAAc,CAClBC,CAAAA,CACArV,EACAD,CAAAA,GACe,CACf,GAAI,CAACC,GAAaA,CAAAA,EAAa,CAAA,EAAK,CAACD,CAAAA,CACnC,OAAOsV,CAAAA,CAGT,IAAMC,CAAAA,CAAU,UAAA,CAAW,IAAMvV,CAAAA,CAAW,KAAA,EAAM,CAAGC,CAAS,EAE9D,OAAOqV,CAAAA,CAAQ,OAAA,CAAQ,IAAM,CAC3B,YAAA,CAAaC,CAAO,EACtB,CAAC,CACH,CAAA,CAEMC,EAAAA,CAAqB,MACzB3H,CAAAA,CACA4H,CAAAA,GAC2B,CAC3B,IAAMzV,CAAAA,CAAa,IAAI,eAAA,CACjBjC,EAAMiB,EAAAA,CAAiB6O,CAAAA,CAAO,SAAA,CAAWA,CAAAA,CAAO,eAAe,CAAA,CAE/D/N,CAAAA,CAAmC,CACvC,GAFkB4U,GAAiB7G,CAAAA,CAAO,OAAO,CAAA,CAGjD,GAAI4H,EAAO,gBAAA,EAAoB,EACjC,CAAA,CAEMC,EAAaR,EAAAA,CAAoBO,CAAAA,CAAO,IAAA,CAAMA,CAAAA,CAAO,gBAAgB,CAAA,CACrEb,CAAAA,CAAW,IAAI,QAAA,CAErB,OAAO,OAAA,CAAQ9U,CAAa,EAAE,OAAA,CAAQ,CAAC,CAAClL,CAAAA,CAAK3B,CAAK,CAAA,GAAM,CAClD2B,IAAQ,MAAA,EAGZ+f,EAAAA,CAAoBC,CAAAA,CAAUhgB,CAAAA,CAAK3B,CAAK,EAC1C,CAAC,CAAA,CAED2hB,CAAAA,CAAS,OAAO,MAAA,CAAQc,CAAU,EAElC,IAAM3V,CAAAA,CAAkC,CACtC,GAAI8N,CAAAA,CAAO,YAAA,EAAgB,EAC7B,CAAA,CAEIA,CAAAA,CAAO,MAAA,GACT9N,CAAAA,CAAQ,cAAgB,CAAA,OAAA,EAAU8N,CAAAA,CAAO,MAAM,CAAA,CAAA,CAAA,CAGjD,IAAM3N,CAAAA,CAAe,KAAA,CAAMnC,EAAK,CAC9B,MAAA,CAAQ,OACR,OAAA,CAAAgC,CAAAA,CACA,IAAA,CAAM6U,CAAAA,CACN,OAAQ5U,CAAAA,CAAW,MACrB,CAAC,CAAA,CAEKI,EAAW,MAAMiV,EAAAA,CACrBnV,CAAAA,CACA2N,CAAAA,CAAO,UACP7N,CACF,CAAA,CAEA,GAAI6N,CAAAA,CAAO,WACT,GAAI,CACF,MAAMA,CAAAA,CAAO,WAAWzN,CAAAA,CAAS,KAAA,EAAO,EAC1C,OAASY,CAAAA,CAAK,CACZ,OAAA,CAAQ,IAAA,CAAK,4CAA6CA,CAAG,EAC/D,CAGF,IAAIyT,CAAAA,CAAe,KACnB,GAAI,CACFA,CAAAA,CAAU,MAAMrU,EAAS,KAAA,EAAM,CAAE,IAAA,GACnC,MAAQ,CAER,CAEA,GAAI,CAACA,EAAS,EAAA,CAAI,CAChB,IAAMa,CAAAA,CACJwT,GAAS,OAAA,EACT,CAAA,0BAAA,EAA6BrU,CAAAA,CAAS,MAAM,IAAIA,CAAAA,CAAS,UAAU,CAAA,CAAA,CACrE,MAAM,IAAI,KAAA,CAAMa,CAAO,CACzB,CAEA,GAAIwT,CAAAA,EAAS,OAAA,GAAY,MACvB,MAAM,IAAI,MAAMA,CAAAA,EAAS,OAAA,EAAW,eAAe,CAAA,CAGrD,IAAMhgB,CAAAA,CAAOggB,CAAAA,EAAS,IAAA,EAAQ,GACxBkB,CAAAA,CACJlhB,CAAAA,CAAK,GAAA,EAAOA,CAAAA,CAAK,UAAYA,CAAAA,CAAK,WAAA,EAAeA,CAAAA,CAAK,IAAA,EAAQ,KAEhE,GAAI,CAACkhB,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,+DACF,CAAA,CAGF,OAAO,CACL,GAAA,CAAKA,CAAAA,CACL,QAAA,CAAUd,EAAAA,CAAapgB,EAAMkhB,CAAAA,CAASD,CAAU,EAChD,YAAA,CAAcjhB,CAAAA,CAAK,cAAgBA,CAAAA,CAAK,YAAA,EAAgB,MAAA,CACxD,MAAA,CAAQA,EAAK,MAAA,EAAUA,CAAAA,CAAK,WAAA,EAAe,MAAA,CAC3C,IAAKggB,CACP,CACF,CAAA,CAEMmB,EAAAA,CAAqB,MACzB/H,CAAAA,CACA4H,CAAAA,GAC2B,CAC3B,IAAMzV,CAAAA,CAAa,IAAI,eAAA,CACjBjC,CAAAA,CAAMiB,EAAAA,CAAiB6O,CAAAA,CAAO,UAAWA,CAAAA,CAAO,iBAAiB,CAAA,CAEjEgI,CAAAA,CAAcnB,GAAiB7G,CAAAA,CAAO,OAAO,CAAA,CAC7CiI,CAAAA,CAAkBpB,GAAiBe,CAAAA,EAAQ,gBAAgB,EAE7DA,CAAAA,EAAQ,QAAA,GACVK,EAAgB,QAAA,CAAWL,CAAAA,CAAO,QAAA,CAAA,CAGhCA,CAAAA,EAAQ,UACVK,CAAAA,CAAgB,QAAA,CAAWL,CAAAA,CAAO,OAAA,CAAA,CAGpC,IAAM3V,CAAAA,CAAmC,CACvC,GAAG+V,CAAAA,CACH,GAAGC,CACL,CAAA,CAEMC,CAAAA,CAAgBlI,CAAAA,CAAO,kBAAkB,QAAA,CAAS,oBAAoB,CAAA,CAG5E,GAF2BA,EAAO,iBAAA,CAAkB,QAAA,CAAS,aAAa,CAAA,EAAK,CAACkI,CAAAA,EAI9E,CAACjW,CAAAA,CAAc,QAAA,EACf,OAAOA,CAAAA,CAAc,QAAA,EAAa,SAClC,CACA,IAAMkW,EAAWjC,CAAAA,CAAuBjU,CAAAA,CAAc,QAAQ,CAAA,CAC1DkW,IACFlW,CAAAA,CAAc,QAAA,CAAWkW,CAAAA,EAE7B,CAEA,IAAMjW,CAAAA,CAAkC,CACtC,cAAA,CAAgB,kBAAA,CAChB,GAAI8N,CAAAA,CAAO,YAAA,EAAgB,EAC7B,EAEIA,CAAAA,CAAO,MAAA,GACT9N,CAAAA,CAAQ,aAAA,CAAgB,UAAU8N,CAAAA,CAAO,MAAM,CAAA,CAAA,CAAA,CAGjD,IAAM3N,EAAe,KAAA,CAAMnC,CAAAA,CAAK,CAC9B,MAAA,CAAQ,SACR,OAAA,CAAAgC,CAAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUD,CAAa,CAAA,CAClC,MAAA,CAAQE,CAAAA,CAAW,MACrB,CAAC,CAAA,CAEKI,CAAAA,CAAW,MAAMiV,EAAAA,CACrBnV,EACA2N,CAAAA,CAAO,SAAA,CACP7N,CACF,CAAA,CAEA,GAAI6N,CAAAA,CAAO,UAAA,CACT,GAAI,CACF,MAAMA,CAAAA,CAAO,UAAA,CAAWzN,CAAAA,CAAS,KAAA,EAAO,EAC1C,CAAA,MAASY,CAAAA,CAAK,CACZ,QAAQ,IAAA,CAAK,2CAAA,CAA6CA,CAAG,EAC/D,CAGF,IAAIyT,CAAAA,CAAe,KACnB,GAAI,CACFA,EAAU,MAAMrU,CAAAA,CAAS,KAAA,EAAM,CAAE,OACnC,CAAA,KAAQ,CAER,CAEA,GAAI,CAACA,CAAAA,CAAS,EAAA,CAAI,CAChB,IAAMa,CAAAA,CACJwT,CAAAA,EAAS,SACT,CAAA,0BAAA,EAA6BrU,CAAAA,CAAS,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAS,UAAU,CAAA,CAAA,CACrE,MAAM,IAAI,KAAA,CAAMa,CAAO,CACzB,CAEA,GAAIwT,CAAAA,EAAS,OAAA,GAAY,KAAA,CACvB,MAAM,IAAI,KAAA,CAAMA,GAAS,OAAA,EAAW,eAAe,EAGrD,OAAO,CACL,OAAA,CAAS,IAAA,CACT,IAAKA,CACP,CACF,CAAA,CAEawB,EAAAA,CAAwBC,GAAgC,CACnE,GAAM,CAACC,CAAAA,CAAaC,CAAc,CAAA,CAAI/f,QAAAA,CAAS,KAAK,CAAA,CAC9C,CAACggB,CAAAA,CAAYC,CAAa,CAAA,CAAIjgB,QAAAA,CAAS,KAAK,CAAA,CAC5C,CAACyI,CAAAA,CAAOyX,CAAQ,EAAIlgB,QAAAA,CAAwB,IAAI,CAAA,CAEhDmgB,CAAAA,CAAeN,GAAQ,YAAA,CACvBO,CAAAA,CAAeP,GAAQ,YAAA,CAEvBQ,CAAAA,CAAapa,YACjB,MAAOmZ,CAAAA,EAAqD,CAC1D,GAAI,CAACe,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,2FACF,CAAA,CAEFJ,CAAAA,CAAe,IAAI,CAAA,CACnBG,EAAS,IAAI,CAAA,CACb,GAAI,CACF,OAAO,MAAMf,EAAAA,CAAmBgB,CAAAA,CAAcf,CAAM,CACtD,CAAA,MAASzU,CAAAA,CAAK,CACZ,IAAMC,EACJD,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,0BACvC,MAAAuV,CAAAA,CAAStV,CAAO,CAAA,CACVD,CACR,QAAE,CACAoV,CAAAA,CAAe,KAAK,EACtB,CACF,CAAA,CACA,CAACI,CAAY,CACf,EAEMG,CAAAA,CAAara,WAAAA,CACjB,MAAOmZ,CAAAA,EAAsD,CAC3D,GAAI,CAACgB,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,2FACF,CAAA,CAEFH,CAAAA,CAAc,IAAI,CAAA,CAClBC,CAAAA,CAAS,IAAI,CAAA,CACb,GAAI,CACF,OAAO,MAAMX,EAAAA,CAAmBa,EAAchB,CAAM,CACtD,OAASzU,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CACJD,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,QAAU,yBAAA,CACvC,MAAAuV,CAAAA,CAAStV,CAAO,EACVD,CACR,CAAA,OAAE,CACAsV,CAAAA,CAAc,KAAK,EACrB,CACF,EACA,CAACG,CAAY,CACf,CAAA,CAEMG,CAAAA,CAAata,WAAAA,CAAY,IAAMia,EAAS,IAAI,CAAA,CAAG,EAAE,EAEvD,OAAOzf,OAAAA,CACL,KAAO,CACL,WAAA4f,CAAAA,CACA,UAAA,CAAAC,EACA,WAAA,CAAAR,CAAAA,CACA,WAAAE,CAAAA,CACA,KAAA,CAAAvX,CAAAA,CACA,UAAA,CAAA8X,EACA,gBAAA,CAAkB,CAAA,CAAQJ,CAAAA,CAC1B,gBAAA,CAAkB,EAAQC,CAC5B,CAAA,CAAA,CACA,CACEC,CAAAA,CACAC,EACAR,CAAAA,CACAE,CAAAA,CACAvX,CAAAA,CACA8X,CAAAA,CACAJ,EACAC,CACF,CACF,CACF,CAAA,CCzXA,IAAMI,EAAAA,CAAa,IAAM,MAAA,CAAO,UAAA,MAAkB,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAC,CAAA,CAE9EC,EAAAA,CAAkBC,GAAkB,CACxC,GAAI,CAACA,CAAAA,CAAO,OAAO,SAAA,CACnB,IAAMxjB,CAAAA,CAAI,IAAA,CACJyjB,EAAQ,CAAC,OAAA,CAAS,IAAA,CAAM,IAAA,CAAM,IAAI,CAAA,CAClC5hB,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,CAAI2hB,CAAK,CAAA,CAAI,IAAA,CAAK,IAAIxjB,CAAC,CAAC,CAAA,CAClD,OAAO,GAAG,UAAA,CAAA,CAAYwjB,CAAAA,CAAQ,KAAK,GAAA,CAAIxjB,CAAAA,CAAG6B,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI4hB,CAAAA,CAAM5hB,CAAC,CAAC,EACvE,CAAA,CAEM6hB,EAAAA,CAAeC,CAAAA,EACfA,CAAAA,CAAS,WAAW,QAAQ,CAAA,CAAU,iBAAA,CACtCA,CAAAA,CAAS,WAAW,QAAQ,CAAA,CAAU,WAAA,CACtCA,CAAAA,CAAS,WAAW,QAAQ,CAAA,CAAU,WAAA,CACtCA,CAAAA,CAAS,SAAS,KAAK,CAAA,CAAU,WAAA,CACjCA,CAAAA,CAAS,SAAS,MAAM,CAAA,CAAU,YAClCA,CAAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAKA,CAAAA,CAAS,QAAA,CAAS,OAAO,EAAU,WAAA,CAC9D,WAAA,CAGHC,EAAAA,CAA8C,CAAC,CACnD,KAAA,CAAA9kB,CAAAA,CACA,IAAA,CAAA2a,CAAAA,CACA,YAAAzK,CAAAA,CAAc,IAAA,CACd,UAAAV,CAAAA,CACA,YAAA,CAAA4O,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,SAAA3K,CAAS,CAAA,CAAIxE,cAAAA,EAAe,CAC9B,CAAC8V,CAAAA,CAAYC,CAAa,CAAA,CAAIhhB,QAAAA,CAAS,KAAK,CAAA,CAC5C,CAACihB,EAAeC,CAAgB,CAAA,CAAIlhB,SAA6B,IACjE,OAAOoa,CAAAA,EAAiB,QAAA,EAAYA,EAAa,IAAA,EAAK,CAAE,MAAA,CAAS,CAAA,CAC5D,CACL,CACE,EAAA,CAAIoG,EAAAA,EAAW,CACf,KAAM9C,CAAAA,CAAuBtD,CAAY,CAAA,EAAKA,CAAAA,CAC9C,KAAM,CAAA,CACN,IAAA,CAAM,EAAA,CACN,GAAA,CAAKA,EACL,QAAA,CAAUsD,CAAAA,CAAuBtD,CAAY,CAAA,EAAK,OAClD,SAAA,CAAW,KAAA,CACX,KAAA,CAAO,IACT,CACF,CAAA,CAEE,KAAA,CAAM,QAAQA,CAAY,CAAA,CACrBA,EACJ,MAAA,CAAQ1S,CAAAA,EAAQ,OAAOA,CAAAA,EAAQ,UAAYA,CAAAA,CAAI,IAAA,EAAK,CAAE,MAAA,CAAS,CAAC,CAAA,CAChE,GAAA,CAAKA,CAAAA,GAAS,CACb,GAAI8Y,EAAAA,EAAW,CACf,IAAA,CAAM9C,CAAAA,CAAuBhW,CAAG,CAAA,EAAKA,CAAAA,CACrC,IAAA,CAAM,CAAA,CACN,KAAM,EAAA,CACN,GAAA,CAAAA,CAAAA,CACA,QAAA,CAAUgW,EAAuBhW,CAAG,CAAA,EAAK,MAAA,CACzC,SAAA,CAAW,MACX,KAAA,CAAO,IACT,EAAE,CAAA,CAEC,EACR,CAAA,CACK,CAACyZ,CAAAA,CAAgBC,CAAiB,EAAIphB,QAAAA,CAAwB,IAAI,CAAA,CAClEqhB,CAAAA,CAAejhB,OAAyB,IAAI,CAAA,CAC5C1D,CAAAA,CAAYia,CAAAA,EAAQ3a,EAAM,SAAA,CAAU,QAAA,EAAS,CAC7CslB,CAAAA,CAAa7gB,QACjB,IAAM,KAAA,CAAM,OAAA,CAAQzE,CAAAA,CAAM,UAAU,aAAa,CAAA,EAAK,KAAA,CAAM,OAAA,CAAQoe,CAAY,CAAA,CAChF,CAACpe,CAAAA,CAAM,QAAA,EAAU,cAAeoe,CAAY,CAC9C,EACM,CACJ,UAAA,CAAAiG,EACA,UAAA,CAAAC,CAAAA,CACA,WAAA,CAAAR,CAAAA,CACA,WAAAE,CAAAA,CACA,KAAA,CAAOuB,CAAAA,CACP,UAAA,CAAAhB,EACA,gBAAA,CAAAiB,CAAAA,CACA,gBAAA,CAAAC,CACF,EAAI7B,EAAAA,CAAqB5jB,CAAAA,CAAM,kBAAkB,CAAA,CAE3C0lB,CAAAA,CAAiBP,GAAkBI,CAAAA,EAAe,IAAA,CAClDI,CAAAA,CAAavhB,MAAAA,CAAO,KAAK,CAAA,CAE/BmQ,SAAAA,CAAU,IAAM,CACd,GAAI,CAAAoR,CAAAA,CAAW,OAAA,GACfA,CAAAA,CAAW,QAAU,IAAA,CACjBV,CAAAA,CAAc,OAAS,CAAA,CAAA,CAAG,CAC5B,IAAMW,CAAAA,CAAOX,CAAAA,CACV,MAAA,CAAQjiB,CAAAA,EAAMA,EAAE,GAAA,EAAO,CAACA,CAAAA,CAAE,KAAK,EAC/B,GAAA,CAAKA,CAAAA,EAAMA,CAAAA,CAAE,GAAI,GAAK,EAAC,CAC1ByQ,CAAAA,CACE/S,CAAAA,CACA4kB,EAAaM,CAAAA,CAAOA,CAAAA,CAAK,CAAC,CAAA,EAAK,KAC/B,CAAE,cAAA,CAAgB,KAAA,CAAO,WAAA,CAAa,KAAM,CAC9C,EACF,CACF,CAAA,CAAG,CAACX,CAAAA,CAAevkB,CAAAA,CAAW4kB,EAAY7R,CAAQ,CAAC,EAEnD,IAAMoS,CAAAA,CACJC,CAAAA,EACG,CACHZ,EAAkB1H,CAAAA,EAAS,CACzB,IAAMuI,CAAAA,CAAOD,EAAStI,CAAI,CAAA,CACpBwI,CAAAA,CAAiBD,CAAAA,CAAK,OAAQ/iB,CAAAA,EAAMA,CAAAA,CAAE,GAAA,EAAO,CAACA,EAAE,KAAK,CAAA,CAAE,GAAA,CAAKA,CAAAA,EAAMA,EAAE,GAAI,CAAA,EAAK,EAAC,CACpF,OAAAyQ,CAAAA,CACE/S,CAAAA,CACA4kB,CAAAA,CAAaU,CAAAA,CAAiBA,EAAe,CAAC,CAAA,EAAK,KACnD,CAAE,cAAA,CAAgB,KAAM,WAAA,CAAa,IAAK,CAC5C,CAAA,CACOD,CACT,CAAC,EACH,CAAA,CAEME,CAAAA,CAAc7V,GAAuB,CACzCA,CAAAA,CAAE,cAAA,EAAe,CACjBA,EAAE,eAAA,EAAgB,CAClB4U,CAAAA,CAAc5U,CAAAA,CAAE,OAAS,WAAA,EAAeA,CAAAA,CAAE,IAAA,GAAS,UAAU,EAC/D,CAAA,CAEM8V,CAAAA,CAAc9V,CAAAA,EAAuB,CACzCA,EAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,eAAA,GACF4U,CAAAA,CAAc,KAAK,EACf5U,CAAAA,CAAE,YAAA,CAAa,OAASA,CAAAA,CAAE,YAAA,CAAa,KAAA,CAAM,MAAA,CAAS,GACnD+V,CAAAA,CAAY/V,CAAAA,CAAE,YAAA,CAAa,KAAK,EAEzC,CAAA,CAEM+V,CAAAA,CAAc,MAAOC,CAAAA,EAAoB,CAC7C,GAAI,CAACZ,EAAkB,CACrBJ,CAAAA,CACE,sEACF,CAAA,CACA,MACF,CAEAb,CAAAA,GACAa,CAAAA,CAAkB,IAAI,CAAA,CAEtB,IAAMiB,EAAgB,KAAA,CAAM,IAAA,CAAKD,CAAK,CAAA,CAEjCd,GACHO,CAAAA,CAAiB,IAAM,EAAE,CAAA,CAG3B,MAAM,OAAA,CAAQ,GAAA,CACZQ,CAAAA,CAAc,GAAA,CAAI,MAAOvD,CAAAA,EAAS,CAChC,IAAMwD,CAAAA,CAAK9B,IAAW,CACtBqB,CAAAA,CAAkBrI,CAAAA,EAAS,CACzB,IAAM+I,CAAAA,CAA8B,CAClC,EAAA,CAAAD,CAAAA,CACA,KAAMxD,CAAAA,CAAK,IAAA,CACX,IAAA,CAAMA,CAAAA,CAAK,KACX,IAAA,CAAMA,CAAAA,CAAK,IAAA,CACX,SAAA,CAAW,KACX,GAAA,CAAK,MAAA,CACL,QAAA,CAAU,MAAA,CACV,MAAO,IACT,CAAA,CACA,OAAIwC,CAAAA,CACK,CAAC,GAAG9H,CAAAA,CAAM+I,CAAS,CAAA,CAErB,CAACA,CAAS,CACnB,CAAC,CAAA,CAED,GAAI,CACF,IAAM/d,CAAAA,CAAS,MAAM6b,CAAAA,CAAW,CAAE,IAAA,CAAAvB,CAAK,CAAC,CAAA,CACxC+C,CAAAA,CAAkBrI,GAChBA,CAAAA,CAAK,GAAA,CAAK1S,CAAAA,EACRA,CAAAA,CAAM,KAAOwb,CAAAA,CACT,CACE,GAAGxb,CAAAA,CACH,UAAW,CAAA,CAAA,CACX,GAAA,CAAKtC,CAAAA,CAAO,GAAA,CACZ,KACEA,CAAAA,CAAO,YAAA,EACPA,EAAO,QAAA,EACPkZ,CAAAA,CAAuBlZ,EAAO,GAAG,CAAA,EACjCsC,CAAAA,CAAM,IAAA,CACR,SAAUtC,CAAAA,CAAO,QAAA,EAAYkZ,CAAAA,CAAuBlZ,CAAAA,CAAO,GAAG,CAAA,CAC9D,KAAA,CAAO,IACT,CAAA,CACAsC,CACN,CACF,EACF,CAAA,MAAS6D,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CACJD,CAAAA,YAAe,KAAA,CAAQA,EAAI,OAAA,CAAU,6CAAA,CACvCkX,CAAAA,CAAkBrI,CAAAA,EAChBA,EAAK,GAAA,CAAK1S,CAAAA,EACRA,CAAAA,CAAM,EAAA,GAAOwb,EACT,CACE,GAAGxb,EACH,SAAA,CAAW,KAAA,CACX,MAAO8D,CACT,CAAA,CACA9D,CACN,CACF,EACF,CACF,CAAC,CACH,CAAA,CAEIua,EAAa,OAAA,GACfA,CAAAA,CAAa,OAAA,CAAQ,KAAA,CAAQ,IAEjC,CAAA,CAEM9D,CAAAA,CAAqBnR,GAA2C,CAChEA,CAAAA,CAAE,OAAO,KAAA,EAASA,CAAAA,CAAE,MAAA,CAAO,KAAA,CAAM,OAAS,CAAA,EACvC+V,CAAAA,CAAY/V,CAAAA,CAAE,MAAA,CAAO,KAAK,EAEnC,CAAA,CAEMoW,CAAAA,CAAa,MAAOF,GAAe,CACvC/B,CAAAA,GACAa,CAAAA,CAAkB,IAAI,EAEtB,IAAM5Z,CAAAA,CAASyZ,CAAAA,CAAc,IAAA,CAAMnC,GAASA,CAAAA,CAAK,EAAA,GAAOwD,CAAE,CAAA,CAC1D,GAAK9a,CAAAA,CAEL,CAAA,GAAIA,CAAAA,CAAO,GAAA,EAAOia,EAChB,GAAI,CACF,MAAMnB,CAAAA,CAAW,CACf,QAAA,CAAU9Y,CAAAA,CAAO,QAAA,EAAYkW,CAAAA,CAAuBlW,EAAO,GAAA,EAAO,EAAE,CAAA,CACpE,OAAA,CAASA,EAAO,GAClB,CAAC,EACH,CAAA,MAASmD,EAAK,CACZ,IAAMC,EACJD,CAAAA,YAAe,KAAA,CACXA,EAAI,OAAA,CACJ,gDAAA,CACNkX,CAAAA,CAAkBrI,CAAAA,EAChBA,EAAK,GAAA,CAAK1S,CAAAA,EACRA,CAAAA,CAAM,EAAA,GAAOwb,EAAK,CAAE,GAAGxb,CAAAA,CAAO,KAAA,CAAO8D,CAAQ,CAAA,CAAI9D,CACnD,CACF,CAAA,CACA,MACF,CAGF+a,CAAAA,CAAkBrI,CAAAA,EAASA,CAAAA,CAAK,OAAQ1S,CAAAA,EAAUA,CAAAA,CAAM,EAAA,GAAOwb,CAAE,CAAC,EAAA,CACpE,CAAA,CAEA,OACEvW,IAAAA,CAACM,EAAA,CAAiB,KAAA,CAAOrQ,EAAO,WAAA,CAAakQ,CAAAA,CAC3C,UAAAH,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWqI,CAAAA,CACT,oGACA2M,CAAAA,CACI,yCAAA,CACA,wDAAA,CACJvV,CAAAA,CACAsU,GAAe,gCACjB,CAAA,CACA,WAAA,CAAamC,CAAAA,CACb,YAAaA,CAAAA,CACb,UAAA,CAAYA,CAAAA,CACZ,MAAA,CAAQC,EACR,OAAA,CAAS,IAAMb,CAAAA,CAAa,OAAA,EAAS,OAAM,CAE3C,QAAA,CAAA,CAAAhd,GAAAA,CAAC,OAAA,CAAA,CACC,KAAK,MAAA,CACL,QAAA,CAAUid,CAAAA,CACV,GAAA,CAAKD,EACL,QAAA,CAAU9D,CAAAA,CACV,UAAU,QAAA,CACZ,CAAA,CAEAlZ,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iBAAA,CACb,QAAA,CAAA0H,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sCAAA,CACb,QAAA,CAAA,CAAA1H,IAAC,KAAA,CAAA,CACC,SAAA,CAAW+P,CAAAA,CACT,6BAAA,CACA2M,EACI,wBAAA,CACA,6CACN,EAEA,QAAA,CAAA1c,GAAAA,CAACoe,YAAA,CAAY,IAAA,CAAM,EAAA,CAAI,CAAA,CACzB,EAEF1W,IAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAA1H,GAAAA,CAAC,KAAE,SAAA,CAAU,0CAAA,CACV,QAAA,CAAA0c,CAAAA,CACG,8BACA,iCAAA,CACN,CAAA,CACAhV,KAAC,GAAA,CAAA,CAAE,SAAA,CAAU,wBAAwB,QAAA,CAAA,CAAA,IAAA,CAChC,GAAA,CACH1H,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,2CAAA,CAA4C,QAAA,CAAA,wBAAA,CAE5D,CAAA,CAAA,CACF,CAAA,CACAA,IAAC,GAAA,CAAA,CAAE,SAAA,CAAU,4BAAA,CAA6B,QAAA,CAAA,sFAAA,CAE1C,GACF,CAAA,CAAA,CACF,CAAA,CACA,CAAA,CAAA,CACF,CAAA,CAEC4c,EAAc,MAAA,CAAS,CAAA,EACtBlV,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gBAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wCAAA,CAAyC,QAAA,CAAA,CAAA,cAAA,CACzCkV,CAAAA,CAAc,MAAA,CAAO,OACpC,CAAA,CACCA,CAAAA,CAAc,IAAKnC,CAAAA,EAClB/S,IAAAA,CAAC,OAEC,SAAA,CAAWqI,CAAAA,CACT,oHAAA,CACA0K,CAAAA,CAAK,OAAS,gBAChB,CAAA,CAEA,QAAA,CAAA,CAAA/S,IAAAA,CAAC,OAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,OAAI,SAAA,CAAU,SAAA,CAAW,QAAA,CAAAuc,EAAAA,CAAY9B,EAAK,IAAI,CAAA,CAAE,CAAA,CACjD/S,IAAAA,CAAC,OAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,KAAE,SAAA,CAAU,oCAAA,CACV,QAAA,CAAAya,CAAAA,CAAK,KACR,CAAA,CACAza,GAAAA,CAAC,KAAE,SAAA,CAAU,uBAAA,CACV,SAAAya,CAAAA,CAAK,IAAA,CAAO2B,EAAAA,CAAe3B,CAAAA,CAAK,IAAI,CAAA,CAAI,UAAA,CAC3C,CAAA,CACCA,CAAAA,CAAK,OACJza,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,2BAAA,CAA6B,SAAAya,CAAAA,CAAK,KAAA,CAAM,CAAA,CAAA,CAEzD,CAAA,CAAA,CACF,EACA/S,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,UAAA+S,CAAAA,CAAK,GAAA,EAAO,CAACA,CAAAA,CAAK,WACjBza,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAM,MAAA,CAAO,KAAKya,CAAAA,CAAK,GAAA,CAAK,QAAQ,CAAA,CAC7C,SAAA,CAAU,qDAAA,CAEV,QAAA,CAAAza,IAACqe,YAAAA,CAAA,CAAa,IAAA,CAAM,EAAA,CAAI,UAAU,eAAA,CAAgB,CAAA,CACpD,CAAA,CAED5D,CAAAA,CAAK,WACJza,GAAAA,CAACse,OAAAA,CAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,UAAU,4BAAA,CAA6B,CAAA,CAE5Dte,GAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAAS,IAAG,CAAQme,EAAW1D,CAAAA,CAAK,EAAE,EAAA,CAAA,CACtC,SAAA,CAAU,wDACV,QAAA,CAAUA,CAAAA,CAAK,WAAakB,CAAAA,CAE3B,QAAA,CAAAA,EACC3b,GAAAA,CAACse,OAAAA,CAAA,CAAQ,IAAA,CAAM,GAAI,SAAA,CAAU,2BAAA,CAA4B,CAAA,CAEzDte,GAAAA,CAACue,OAAA,CAAO,IAAA,CAAM,EAAA,CAAI,SAAA,CAAU,eAAe,CAAA,CAE/C,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CA7CK9D,CAAAA,CAAK,EA8CZ,CACD,CAAA,CAAA,CACH,CAAA,CAGD4C,CAAAA,EACCrd,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gFAAA,CACZ,QAAA,CAAAqd,EACH,CAAA,CAAA,CAEJ,CAEJ,CAAA,CAEOmB,EAAAA,CAAQ/B,GC9Xf,IAAMgC,EAAAA,CAAkD,CAAC,CACvD,KAAA,CAAA9mB,CAAAA,CACA,IAAA,CAAA2a,EACA,YAAA,CAAAyD,CAAAA,CACA,WAAA,CAAAlO,CAAAA,CAAc,KACd,SAAA,CAAAV,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,QAAA,CAAAiE,CAAAA,CAAU,KAAA,CAAAD,CAAM,CAAA,CAAIvE,cAAAA,EAAe,CACrC0P,CAAAA,CAAc1O,EAAiBjQ,CAAAA,CAAM,WAAA,CAAakQ,CAAW,CAAA,CAC7DxP,CAAAA,CAAYia,GAAQ3a,CAAAA,CAAM,SAAA,CAAU,QAAA,EAAS,CAE7C,CAAC+mB,CAAAA,CAAcC,CAAe,CAAA,CAAIhjB,QAAAA,CAAiB,EAAE,CAAA,CAErDijB,CAAAA,CAAgBrmB,CAAAA,EAAmC,CACvD,GAAIA,CAAAA,EAAU,IAAA,EAA+BA,CAAAA,GAAU,EAAA,CAAI,OAAO,EAAA,CAClE,IAAMgB,CAAAA,CAAW,OAAOhB,GAAU,QAAA,CAAW,UAAA,CAAWA,CAAK,CAAA,CAAIA,EACjE,OAAI,KAAA,CAAMgB,CAAQ,CAAA,CAAU,GACrBA,CAAAA,CAAS,cAAA,CAAe,QAAS,CACtC,qBAAA,CAAuB,EACvB,qBAAA,CAAuB,CACzB,CAAC,CACH,EAEMslB,CAAAA,CAAuBC,CAAAA,EACtBA,CAAAA,EACE,UAAA,CAAWA,EAAe,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAC,GAAK,CAAA,CAG1D5S,SAAAA,CAAU,IAAM,CACV6J,CAAAA,EAAgB,MAAQ,CAAC,KAAA,CAAM,MAAA,CAAOA,CAAY,CAAC,CAAA,EACrD4I,CAAAA,CAAgBC,CAAAA,CAAa,MAAA,CAAO7I,CAAY,CAAC,CAAC,EAEtD,CAAA,CAAG,CAACA,CAAY,CAAC,EAEjB,IAAMrJ,CAAAA,CAAevB,EAAM9S,CAAS,CAAA,CACpC,OAAA6T,SAAAA,CAAU,IAAM,CACd,GAAkCQ,CAAAA,EAAiB,IAAA,EAAQ,CAAC,KAAA,CAAM,MAAA,CAAOA,CAAY,CAAC,EAAG,CACvF,IAAMqS,CAAAA,CAAYH,CAAAA,CAAa,OAAOlS,CAAY,CAAC,CAAA,CAC/CqS,CAAAA,GAAcL,GAAcC,CAAAA,CAAgBI,CAAS,EAC3D,CACF,EAAG,CAACrS,CAAY,CAAC,CAAA,CAkBf1M,IAACgI,CAAAA,CAAA,CAAiB,MAAOrQ,CAAAA,CAAO,WAAA,CAAakQ,EAC3C,QAAA,CAAA7H,GAAAA,CAACkX,EAAAA,CAAA,CACC,KAAK,MAAA,CACL,IAAA,CAAM7e,CAAAA,CACN,WAAA,CAAaie,EACb,KAAA,CAAOoI,CAAAA,CACP,QAAA,CAtBqB3W,CAAAA,EAA2C,CACpE,IAAMiX,CAAAA,CAAajX,CAAAA,CAAE,MAAA,CAAO,MACvB,YAAA,CAAa,IAAA,CAAKiX,CAAU,CAAA,GACjCL,EAAgBK,CAAU,CAAA,CAC1B5T,CAAAA,CAAS/S,CAAAA,CAAWwmB,EAAoBG,CAAU,CAAA,CAAG,CACnD,cAAA,CAAgB,KAChB,WAAA,CAAa,IACf,CAAC,CAAA,EACH,CAAA,CAeM,OAba,IAAM,CACvB,IAAMC,CAAAA,CAAeJ,EAAoBH,CAAY,CAAA,CAChD,KAAA,CAAMO,CAAY,GAAGN,CAAAA,CAAgBC,CAAAA,CAAaK,CAAY,CAAC,EACtE,CAAA,CAWM,SAAA,CAAW9X,CAAAA,CACb,CAAA,CACF,CAEJ,CAAA,CAEO+X,EAAAA,CAAQT,EAAAA,CCvEf,IAAMU,EAAAA,CAAsD,CAAC,CAC3D,KAAA,CAAAxnB,CAAAA,CACA,IAAA,CAAA2a,EACA,YAAA,CAAAyD,CAAAA,CACA,WAAA,CAAAlO,CAAAA,CAAc,KACd,SAAA,CAAAV,CACF,IAAM,CACJ,GAAM,CAAE,QAAA,CAAAiE,CAAAA,CAAU,KAAA,CAAAD,CAAM,EAAIvE,cAAAA,EAAe,CACrC,CAACwY,CAAAA,CAAcC,CAAe,CAAA,CAAI1jB,QAAAA,CAAS,KAAK,CAAA,CAChD2a,EAAc1O,CAAAA,CAAiBjQ,CAAAA,CAAM,YAAakQ,CAAW,CAAA,CAC7DxP,EAAYia,CAAAA,EAAQ3a,CAAAA,CAAM,SAAA,CAAU,QAAA,GAEpC+U,CAAAA,CAAevB,CAAAA,CAAM9S,CAAS,CAAA,EAAK0d,GAAgB,EAAA,CAMzD,OACE/V,GAAAA,CAACgI,CAAAA,CAAA,CAAiB,KAAA,CAAOrQ,CAAAA,CAAO,WAAA,CAAakQ,CAAAA,CAC3C,SAAAH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,UAAA,CACb,UAAA1H,GAAAA,CAACkX,EAAAA,CAAA,CACC,IAAA,CAAMkI,EAAe,MAAA,CAAS,UAAA,CAC9B,IAAA,CAAM/mB,CAAAA,CACN,MAAOqU,CAAAA,CACP,WAAA,CAAa4J,EACb,QAAA,CAZcvO,CAAAA,EAA2C,CAC/DqD,CAAAA,CAAS/S,CAAAA,CAAW0P,CAAAA,CAAE,MAAA,CAAO,MAAO,CAAE,cAAA,CAAgB,IAAA,CAAM,WAAA,CAAa,IAAK,CAAC,EACjF,CAAA,CAWQ,SAAA,CAAWZ,EACb,CAAA,CACAnH,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAS,IAAMqf,CAAAA,CAAiBvmB,CAAAA,EAAM,CAACA,CAAC,CAAA,CACxC,SAAA,CAAU,kGAAA,CACV,SAAU,EAAA,CAET,QAAA,CAAAsmB,CAAAA,CAAepf,GAAAA,CAACsf,OAAA,CAAO,SAAA,CAAU,UAAU,CAAA,CAAKtf,GAAAA,CAACuf,IAAA,CAAI,SAAA,CAAU,SAAA,CAAU,CAAA,CAC5E,GACF,CAAA,CACF,CAEJ,CAAA,CAEOC,EAAAA,CAAQL,GCzDf,IAAMM,EAAAA,CAAmBC,EAAA,CAAA,UAAA,CAGvB,CAAC,CAAE,UAAAvY,CAAAA,CAAW,GAAG8G,CAAM,CAAA,CAAGC,IAC1BlO,GAAAA,CAAqB,EAAA,CAAA,IAAA,CAApB,CACC,SAAA,CAAW+P,EAAG,YAAA,CAAc5I,CAAS,EACpC,GAAG8G,CAAAA,CACJ,IAAKC,CAAAA,CACP,CACD,CAAA,CACDuR,EAAAA,CAAW,YAAkC,EAAA,CAAA,IAAA,CAAK,WAAA,CAElD,IAAME,EAAAA,CAAuBD,cAG3B,CAAC,CAAE,SAAA,CAAAvY,CAAAA,CAAW,GAAG8G,CAAM,CAAA,CAAGC,IAC1BlO,GAAAA,CAAqB,EAAA,CAAA,IAAA,CAApB,CACC,GAAA,CAAKkO,CAAAA,CACL,SAAA,CAAW6B,CAAAA,CACT,sEACA,4GAAA,CACA,iDAAA,CACA,iDAAA,CACA5I,CACF,EACC,GAAG8G,CAAAA,CAEJ,QAAA,CAAAjO,GAAAA,CAAqB,aAApB,CAA8B,SAAA,CAAU,mCACvC,QAAA,CAAAA,GAAAA,CAAC,OAAI,SAAA,CAAU,iDAAA,CAAkD,CAAA,CACnE,CAAA,CACF,CACD,CAAA,CACD2f,EAAAA,CAAe,WAAA,CAAkC,EAAA,CAAA,IAAA,CAAK,YCjBtD,IAAMC,EAAAA,CAAgD,CAAC,CACrD,KAAA,CAAAjoB,EACA,IAAA,CAAA2a,CAAAA,CACA,YAAA,CAAAyD,CAAAA,CACA,YAAAlO,CAAAA,CAAc,IAAA,CACd,SAAA,CAAAV,CACF,IAAM,CACJ,GAAM,CAAE,QAAA,CAAAiE,CAAAA,CAAU,QAAA1E,CAAAA,CAAS,KAAA,CAAAyE,CAAM,CAAA,CAAIvE,gBAAe,CAC9CvO,CAAAA,CAAYia,CAAAA,EAAQ3a,CAAAA,CAAM,UAAU,QAAA,EAAS,CAC7C+U,CAAAA,CAAevB,CAAAA,CAAM9S,CAAS,CAAA,EAAK0d,CAAAA,EAAgB,EAAA,CAYzD,OACE/V,IAACgI,CAAAA,CAAA,CAAiB,KAAA,CAAOrQ,CAAAA,CAAO,YAAakQ,CAAAA,CAC3C,QAAA,CAAA7H,GAAAA,CAACyf,EAAAA,CAAA,CACC,KAAA,CAAO/S,CAAAA,CACP,aAAA,CAdoB,MAAOmT,GAAqB,CACpDzU,CAAAA,CAAS/S,EAAWwnB,CAAAA,CAAU,CAC5B,eAAgB,IAAA,CAChB,WAAA,CAAa,IAAA,CACb,WAAA,CAAa,IACf,CAAC,CAAA,CACD,MAAMnZ,CAAAA,CAAQrO,CAAS,CAAA,CACvB,UAAA,CAAW,IAAMqO,CAAAA,GAAW,CAAC,EAC/B,CAAA,CAOM,SAAA,CAAW,uBAAuBS,CAAAA,EAAa,EAAE,CAAA,CAAA,CAEhD,QAAA,CAAAxP,EAAM,aAAA,EAAe,GAAA,CAAI,CAACwb,CAAAA,CAAQpK,IAAQ,CACzC,IAAMqK,CAAAA,CAAU,CAAA,EAAGzb,EAAM,WAAW,CAAA,CAAA,EAAIwb,EAAO,KAAK,CAAA,CAAA,EAAIpK,CAAG,CAAA,CAAA,CAC3D,OACErB,IAAAA,CAAC,KAAA,CAAA,CAEC,UAAU,8EAAA,CAEV,QAAA,CAAA,CAAA1H,GAAAA,CAAC2f,EAAAA,CAAA,CAAe,KAAA,CAAOxM,CAAAA,CAAO,KAAA,CAAO,EAAA,CAAIC,EAAS,CAAA,CAClD1L,IAAAA,CAACyK,GAAA,CAAM,OAAA,CAASiB,EAAS,SAAA,CAAU,uDAAA,CAChC,QAAA,CAAA,CAAAD,CAAAA,CAAO,MAAQnT,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAmT,CAAAA,CAAO,KAAK,CAAA,CAClCvL,CAAAA,CAAiBuL,CAAAA,CAAO,KAAA,CAAOtL,CAAW,CAAA,CAAA,CAC7C,CAAA,CAAA,CAAA,CAPKsL,EAAO,KAQd,CAEJ,CAAC,CAAA,CACH,CAAA,CACF,CAEJ,CAAA,CAEO2M,GAAQF,EAAAA,CC9Df,IAAMG,GAAiBC,EAAA,CAAA,UAAA,CACrB,CAAC,CAAE,SAAA,CAAA7Y,EAAW,GAAG8G,CAAM,CAAA,CAAGC,CAAAA,GACxBlO,IAAC,UAAA,CAAA,CACC,SAAA,CAAW+P,CAAAA,CACT,wGAAA,CACA,6BACA,6JAAA,CACA,iDAAA,CACA,6BACA5I,CACF,CAAA,CACA,IAAK+G,CAAAA,CACJ,GAAGD,CAAAA,CACN,CAEJ,EACA8R,EAAAA,CAAS,WAAA,CAAc,UAAA,CCHvB,IAAME,EAAAA,CAAsD,CAAC,CAC3D,MAAAtoB,CAAAA,CACA,IAAA,CAAA2a,CAAAA,CACA,YAAA,CAAAyD,EACA,WAAA,CAAAlO,CAAAA,CAAc,IAAA,CACd,SAAA,CAAAV,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,SAAAiE,CAAAA,CAAU,KAAA,CAAAD,CAAM,CAAA,CAAIvE,cAAAA,GACtB0P,CAAAA,CAAc1O,CAAAA,CAAiBjQ,CAAAA,CAAM,WAAA,CAAakQ,CAAW,CAAA,CAC7DxP,CAAAA,CAAYia,CAAAA,EAAQ3a,CAAAA,CAAM,UAAU,QAAA,EAAS,CAE7C,CAAC+mB,CAAAA,CAAcC,CAAe,CAAA,CAAIhjB,QAAAA,CAAiBoa,CAAAA,EAAgB,EAAE,EAE3E7J,SAAAA,CAAU,IAAM,CACV6J,CAAAA,GAAiB,QAAW4I,CAAAA,CAAgB5I,CAAY,EAC9D,CAAA,CAAG,CAACA,CAAY,CAAC,CAAA,CAEjB,IAAMrJ,EAAevB,CAAAA,CAAM9S,CAAS,EACpC,OAAA6T,SAAAA,CAAU,IAAM,CACVQ,CAAAA,GAAiB,MAAA,EAAaA,CAAAA,GAAiBgS,GACjDC,CAAAA,CAAgBjS,CAAY,EAEhC,CAAA,CAAG,CAACA,CAAAA,CAAcgS,CAAY,CAAC,CAAA,CAS7B1e,IAACgI,CAAAA,CAAA,CAAiB,MAAOrQ,CAAAA,CAAO,WAAA,CAAakQ,EAC3C,QAAA,CAAA7H,GAAAA,CAAC+f,EAAAA,CAAA,CACC,KAAM1nB,CAAAA,CACN,KAAA,CAAOqmB,CAAAA,CACP,WAAA,CAAapI,EACb,QAAA,CAZgBvO,CAAAA,EAA8C,CAClE,IAAM8X,EAAW9X,CAAAA,CAAE,MAAA,CAAO,MAC1B4W,CAAAA,CAAgBkB,CAAQ,EACxBzU,CAAAA,CAAS/S,CAAAA,CAAWwnB,CAAAA,CAAU,CAAE,eAAgB,IAAA,CAAM,WAAA,CAAa,IAAK,CAAC,EAC3E,CAAA,CASM,SAAA,CAAW1Y,CAAAA,CACb,CAAA,CACF,CAEJ,CAAA,CAEO+Y,EAAAA,CAAQD,EAAAA,CChDf,IAAMnG,EAAAA,CACJC,CAAAA,EACoCA,CAAAA,YAAmB,GAAA,CAEnDC,GACJD,CAAAA,EAEKA,CAAAA,CAGDD,EAAAA,CAAMC,CAAO,EACR,MAAA,CAAO,WAAA,CAAYA,EAAQ,OAAA,EAAS,EAEtC,CAAE,GAAGA,CAAQ,CAAA,CALX,EAAC,CAQCoG,EAAAA,CAAqB,CAAC,CACjC,WAAAnlB,CAAAA,CACA,WAAA,CAAAP,CAAAA,CACA,mBAAA,CAAAmK,EACA,SAAA,CAAAwb,CACF,IAA+B,CAC7B,GAAM,CAAE,KAAA,CAAAjV,CAAAA,CAAO,OAAA,CAAAzE,CAAAA,CAAS,UAAAC,CAAU,CAAA,CAAIC,cAAAA,EAAe,CAC/C,CAACyZ,CAAAA,CAAcC,CAAe,CAAA,CAAI3kB,QAAAA,CAAS,KAAK,CAAA,CAChD,CAAC4kB,CAAAA,CAASC,CAAU,EAAI7kB,QAAAA,CAAS,KAAK,CAAA,CACtC,CAACyI,EAAOyX,CAAQ,CAAA,CAAIlgB,QAAAA,CAAwB,IAAI,EAChD,CAAC8kB,CAAAA,CAAeC,CAAgB,CAAA,CAAI/kB,SAAwB,IAAI,CAAA,CAEhEglB,EAAmB5kB,MAAAA,CAA8B,IAAI,EACrD6kB,CAAAA,CAAkB7kB,MAAAA,CAAO,KAAK,CAAA,CAE9B8kB,EAAa1V,CAAAA,CAAMnQ,CAAAA,CAAW,SAAS,CAAA,CAGvC8lB,EAAiB7lB,EAAAA,CACrBD,CAAAA,CACAP,CAAAA,CACAmK,CACF,EAEMmc,CAAAA,CAAUnf,WAAAA,CAAY,MAAOof,CAAAA,EAAkB,CACnD,GAAI,CAAChmB,CAAAA,CAAW,yBAAA,EAA2B,gBAAA,CAAkB,CAC3D,OAAA,CAAQ,IAAA,CAAK,sDAAsD,CAAA,CACnE,MACF,CAGA,GAAI4lB,CAAAA,CAAgB,OAAA,CAClB,OAGF,IAAMpF,CAAAA,CAASxgB,EAAW,yBAAA,CAA0B,gBAAA,CACpDslB,EAAgB,IAAI,CAAA,CACpBzE,CAAAA,CAAS,IAAI,EACb+E,CAAAA,CAAgB,OAAA,CAAU,IAAA,CAE1B,GAAI,CACF,IAAMvd,CAAAA,CAAM,CAAA,EAAGmY,CAAAA,CAAO,SAAS,CAAA,EAAGA,CAAAA,CAAO,eAAe,CAAA,CAAA,CAElDzB,EAAU,CACd,GAFkBC,EAAAA,CAAiBwB,CAAAA,CAAO,OAAO,CAAA,CAGjD,KAAA,CAAAwF,CACF,CAAA,CAEM3b,EAAkC,CACtC,cAAA,CAAgB,kBAAA,CAChB,GAAImW,EAAO,YAAA,EAAgB,EAC7B,CAAA,CAEIA,CAAAA,CAAO,SACTnW,CAAAA,CAAQ,aAAA,CAAgB,CAAA,OAAA,EAAUmW,CAAAA,CAAO,MAAM,CAAA,CAAA,CAAA,CAGjD,IAAM9V,CAAAA,CAAW,MAAM,MAAMrC,CAAAA,CAAK,CAChC,MAAA,CAAQ,MAAA,CACR,QAAAgC,CAAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU0U,CAAO,CAC9B,CAAC,CAAA,CAED,GAAI,CAACrU,CAAAA,CAAS,EAAA,CAAI,CAChB,IAAMub,EAAY,MAAMvb,CAAAA,CAAS,IAAA,EAAK,CAAE,MAAM,IAAMA,CAAAA,CAAS,UAAU,CAAA,CACvE,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoBA,CAAAA,CAAS,MAAM,IAAIub,CAAS,CAAA,CAAE,CACpE,CAEA,IAAM9gB,CAAAA,CAAS,MAAMuF,CAAAA,CAAS,IAAA,GAC9B,OAAA8a,CAAAA,CAAW,CAAA,CAAI,CAAA,CACfE,EAAiBM,CAAK,CAAA,CACtBZ,CAAAA,GAAYY,CAAK,EAEjB7c,EAAAA,CAAM,OAAA,CAAQ,CAAA,wBAAA,EAAqB6c,CAAK,GAAI,CAC1C,QAAA,CAAU,GAAA,CACV,QAAA,CAAU,YACZ,CAAC,CAAA,CAED,QAAQ,GAAA,CAAI,CAAA,0BAAA,EAAkBA,CAAK,CAAA,CAAA,CAAI7gB,CAAM,CAAA,CACtCA,CACT,OAASmG,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CAAUD,aAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,oBAAA,CACrD,MAAAuV,CAAAA,CAAStV,CAAO,EAChBpC,EAAAA,CAAM,KAAA,CAAM,oCAAoCoC,CAAO,CAAA,CAAA,CAAI,CACzD,QAAA,CAAU,IACV,QAAA,CAAU,YACZ,CAAC,CAAA,CACKD,CACR,CAAA,OAAE,CACAga,CAAAA,CAAgB,KAAK,EACrBM,CAAAA,CAAgB,OAAA,CAAU,MAC5B,CACF,CAAA,CAAG,CAAC5lB,CAAAA,CAAYolB,CAAS,CAAC,CAAA,CAG1B,OAAAlU,SAAAA,CAAU,IAAM,CAEVyU,CAAAA,CAAiB,SACnB,YAAA,CAAaA,CAAAA,CAAiB,OAAO,CAAA,CAIvC,IAAMK,CAAAA,CAAQH,CAAAA,CAGd,GAAI,EAAA,CAACG,GAAS,OAAOA,CAAAA,EAAU,QAAA,EAAYA,CAAAA,CAAM,MAAK,GAAM,EAAA,CAAA,EAKvDhmB,CAAAA,CAAW,yBAAA,EAA2B,gBAKtC8lB,CAAAA,EAKD,EAAAE,CAAAA,GAAUP,CAAAA,EAAiBF,GAK/B,OAAAI,CAAAA,CAAiB,QAAU,UAAA,CAAW,SAAY,CAChD,GAAI,CAGF,GAAI,CADY,MAAMja,CAAAA,CAAQ1L,CAAAA,CAAW,SAAS,CAAA,CACpC,CACZ,OAAA,CAAQ,GAAA,CAAI,0CAA0C,CAAA,CACtD,MACF,CAGIgmB,CAAAA,GAAUP,CAAAA,GACZD,CAAAA,CAAW,EAAK,CAAA,CAChB3E,CAAAA,CAAS,IAAI,CAAA,CAAA,CAIf,MAAMkF,CAAAA,CAAQC,CAAK,EACrB,CAAA,MAAS1a,EAAK,CACZ,OAAA,CAAQ,KAAA,CAAM,8CAAA,CAAgDA,CAAG,EACnE,CACF,EAAG,GAAG,CAAA,CAEC,IAAM,CACPqa,CAAAA,CAAiB,OAAA,EACnB,YAAA,CAAaA,EAAiB,OAAO,EAEzC,CACF,CAAA,CAAG,CACDE,CAAAA,CACA7lB,CAAAA,CACA0L,CAAAA,CACA6Z,CAAAA,CACAQ,EACAD,CAAAA,CACAL,CACF,CAAC,CAAA,CAGDvU,UAAU,IAAM,CACV2U,CAAAA,GAAeJ,CAAAA,EAAiBA,IAAkB,IAAA,GACpDD,CAAAA,CAAW,KAAK,CAAA,CAChB3E,EAAS,IAAI,CAAA,EAEjB,CAAA,CAAG,CAACgF,EAAYJ,CAAa,CAAC,EAEvB,CACL,YAAA,CAAAJ,EACA,OAAA,CAAAE,CAAAA,CACA,KAAA,CAAAnc,CAAAA,CACA,QAAA2c,CAAAA,CACA,cAAA,CAAAD,CAAAA,CACA,aAAA,CAAAL,CACF,CACF,CAAA,CC1LA,IAAMS,EAAAA,CAA8C,CAAC,CACnD,KAAA,CAAAvpB,CAAAA,CACA,IAAA,CAAA2a,EACA,YAAA,CAAAyD,CAAAA,CACA,WAAA,CAAAlO,CAAAA,CAAc,KACd,SAAA,CAAAV,CAAAA,CACA,WAAA,CAAA1M,CAAAA,CAAc,EAAC,CACf,mBAAA,CAAAmK,EAAsB,CACxB,CAAA,GAAM,CACJ,GAAM,CAAE,QAAA,CAAAwG,CAAAA,CAAU,MAAAD,CAAM,CAAA,CAAIvE,cAAAA,EAAe,CACrC0P,EAAc1O,CAAAA,CAAiBjQ,CAAAA,CAAM,WAAA,CAAakQ,CAAW,EAC7DxP,CAAAA,CAAYia,CAAAA,EAAQ3a,CAAAA,CAAM,SAAA,CAAU,UAAS,CAE7CwpB,CAAAA,CAAqBxpB,CAAAA,CAAM,WAAA,EAAa,KAC3CmB,CAAAA,EAAMA,CAAAA,CAAE,cAAA,GAAmB,OAC9B,EACMsoB,CAAAA,CAAmBzpB,CAAAA,CAAM,yBAAA,EAA2B,cAAA,GAAmB,KAEvE0pB,CAAAA,CAAkBlB,EAAAA,CAAmB,CACzC,UAAA,CAAYxoB,CAAAA,CACZ,YAAA8C,CAAAA,CACA,mBAAA,CAAAmK,CAAAA,CACA,SAAA,CAAYoc,GAAU,CACpB,OAAA,CAAQ,GAAA,CAAI,CAAA,0CAAA,EAAkCA,CAAK,CAAA,CAAE,EACvD,CACF,CAAC,EAEK,CAACtC,CAAAA,CAAcC,CAAe,CAAA,CAAIhjB,SAAiBoa,CAAAA,EAAgB,EAAE,CAAA,CAE3E7J,SAAAA,CAAU,IAAM,CACV6J,CAAAA,GAAiB,MAAA,EAAW4I,CAAAA,CAAgB5I,CAAY,EAC9D,CAAA,CAAG,CAACA,CAAY,CAAC,CAAA,CAEjB,IAAMrJ,EAAevB,CAAAA,CAAM9S,CAAS,EACpC6T,SAAAA,CAAU,IAAM,CACVQ,CAAAA,GAAiB,QAAaA,CAAAA,GAAiBgS,CAAAA,EACjDC,CAAAA,CAAgBjS,CAAY,EAEhC,CAAA,CAAG,CAACA,CAAAA,CAAcgS,CAAY,CAAC,CAAA,CAE/B,IAAM4C,CAAAA,CAAgBvZ,CAAAA,EAA2C,CAC/D,IAAM8X,CAAAA,CAAW9X,CAAAA,CAAE,MAAA,CAAO,MAC1B4W,CAAAA,CAAgBkB,CAAQ,CAAA,CACxBzU,CAAAA,CAAS/S,EAAWwnB,CAAAA,CAAU,CAAE,cAAA,CAAgB,IAAA,CAAM,YAAa,IAAK,CAAC,EAC3E,CAAA,CAEA,OACEnY,KAACM,CAAAA,CAAA,CAAiB,KAAA,CAAOrQ,CAAAA,CAAO,YAAakQ,CAAAA,CAC1C,QAAA,CAAA,CAAAsZ,CAAAA,EAAsBC,CAAAA,EAAoBC,EAAgB,YAAA,EACzD3Z,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qDACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,OAAI,SAAA,CAAU,8DAAA,CAA+D,EAC9EA,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,+BAAA,CAA6B,CAAA,CAAA,CACrC,EAEDmhB,CAAAA,EAAsBC,CAAAA,EAAoBC,CAAAA,CAAgB,OAAA,EAAW,CAACA,CAAAA,CAAgB,YAAA,EACrFrhB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,6BAAA,CAA8B,QAAA,CAAA,0CAAA,CAA6B,EAE3EmhB,CAAAA,EAAsBC,CAAAA,EAAoBC,EAAgB,KAAA,EACzD3Z,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAA4B,QAAA,CAAA,CAAA,iBAAA,CAAW2Z,CAAAA,CAAgB,KAAA,CAAA,CAAM,CAAA,CAE9ErhB,IAACkX,EAAAA,CAAA,CACC,IAAA,CAAK,MAAA,CACL,KAAM7e,CAAAA,CACN,KAAA,CAAOqmB,CAAAA,CACP,WAAA,CAAapI,EACb,QAAA,CAAUgL,CAAAA,CACV,SAAA,CAAWna,CAAAA,CACb,GACF,CAEJ,CAAA,CAEOoa,EAAAA,CAAQL,EAAAA,CC/Df,IAAMM,EAAAA,CAAgD,CAAC,CACrD,MAAA7pB,CAAAA,CACA,IAAA,CAAA2a,CAAAA,CACA,WAAA,CAAAzK,EAAc,IAAA,CACd,SAAA,CAAAV,CAAAA,CACA,YAAA,CAAA4O,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,SAAA3K,CAAS,CAAA,CAAIxE,gBAAe,CAC9B,CAAC8V,EAAYC,CAAa,CAAA,CAAIhhB,QAAAA,CAAS,KAAK,EAC5C,CAAC8lB,CAAAA,CAAeC,CAAgB,CAAA,CAAI/lB,SACxC,IACF,CAAA,CACM,CAACgmB,CAAAA,CAAiBC,CAAkB,CAAA,CAAIjmB,QAAAA,CAAwB,IAAI,CAAA,CACpE,CAACkK,CAAAA,CAAcgc,CAAe,CAAA,CAAIlmB,QAAAA,CAAwB,IAAI,CAAA,CAC9DqhB,CAAAA,CAAejhB,MAAAA,CAAyB,IAAI,EAC5C1D,CAAAA,CAAYia,CAAAA,EAAQ3a,CAAAA,CAAM,SAAA,CAAU,UAAS,CAC7C2lB,CAAAA,CAAavhB,OAAO,KAAK,CAAA,CACzB,CACJ,UAAA,CAAAigB,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,YAAAR,CAAAA,CACA,UAAA,CAAAE,CAAAA,CACA,KAAA,CAAOuB,EACP,UAAA,CAAAhB,CAAAA,CACA,gBAAA,CAAAiB,CAAAA,CACA,iBAAAC,CACF,CAAA,CAAI7B,GAAqB5jB,CAAAA,CAAM,kBAAkB,EAE3C0lB,CAAAA,CAAiBxX,CAAAA,EAAgBqX,CAAAA,EAAe,IAAA,CAEtDhR,UAAU,IAAM,CACV,OAAO6J,CAAAA,EAAiB,UAAYA,CAAAA,CAAa,IAAA,EAAK,CAAE,MAAA,CAAS,IACnE2L,CAAAA,CAAiB,CACf,IAAK3L,CAAAA,CACL,IAAA,CAAMsD,EAAuBtD,CAAY,CAAA,EAAKA,CAAAA,CAC9C,cAAA,CAAgBsD,EAAuBtD,CAAY,CAAA,EAAK,MAC1D,CAAC,EACIuH,CAAAA,CAAW,OAAA,GACdlS,CAAAA,CAAS/S,CAAAA,CAAW0d,EAAc,CAChC,cAAA,CAAgB,KAAA,CAChB,WAAA,CAAa,KACf,CAAC,CAAA,CACDuH,CAAAA,CAAW,OAAA,CAAU,OAG3B,CAAA,CAAG,CAACvH,CAAAA,CAAc1d,CAAAA,CAAW+S,CAAQ,CAAC,CAAA,CAEtC,IAAMgR,CAAAA,CAAkBC,GAAkB,CACxC,GAAIA,IAAU,CAAA,CAAG,OAAO,UACxB,IAAMxjB,CAAAA,CAAI,IAAA,CACJyjB,CAAAA,CAAQ,CAAC,OAAA,CAAS,IAAA,CAAM,IAAA,CAAM,IAAI,EAClC5hB,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI2hB,CAAK,CAAA,CAAI,IAAA,CAAK,GAAA,CAAIxjB,CAAC,CAAC,CAAA,CAClD,OAAO,UAAA,CAAA,CAAYwjB,EAAQ,IAAA,CAAK,GAAA,CAAIxjB,CAAAA,CAAG6B,CAAC,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAI,IAAM4hB,CAAAA,CAAM5hB,CAAC,CACxE,CAAA,CAEMkjB,CAAAA,CAAc7V,GAAuB,CACzCA,CAAAA,CAAE,cAAA,EAAe,CACjBA,EAAE,eAAA,EAAgB,CAClB4U,CAAAA,CAAc5U,CAAAA,CAAE,OAAS,WAAA,EAAeA,CAAAA,CAAE,IAAA,GAAS,UAAU,EAC/D,CAAA,CAEM8V,CAAAA,CAAc9V,CAAAA,EAAuB,CACzCA,EAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,eAAA,GACF4U,CAAAA,CAAc,KAAK,CAAA,CACf5U,CAAAA,CAAE,aAAa,KAAA,EAASA,CAAAA,CAAE,YAAA,CAAa,KAAA,CAAM,OAAS,CAAA,EACnD+Z,CAAAA,CAAW/Z,EAAE,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,EAE3C,CAAA,CAEM+Z,CAAAA,CAAa,MAAOrH,CAAAA,EAAe,CAEvC,GAAI,CAACA,EAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,CAAG,CACnC,KAAA,CAAM,kDAA+C,EACrD,MACF,CAEA,GAAI,CAAC0C,CAAAA,CAAkB,CACrB0E,CAAAA,CACE,sEACF,CAAA,CACA,MACF,CAEA3F,CAAAA,GACA2F,CAAAA,CAAgB,IAAI,CAAA,CAEpB,IAAME,EAAW,GAAA,CAAI,eAAA,CAAgBtH,CAAI,CAAA,CACzCmH,CAAAA,CAAmBG,CAAQ,CAAA,CAE3B,GAAI,CACF,IAAM5hB,EAAS,MAAM6b,CAAAA,CAAW,CAAE,IAAA,CAAAvB,CAAK,CAAC,CAAA,CACxCiH,CAAAA,CAAiB,CACf,IAAKvhB,CAAAA,CAAO,GAAA,CACZ,IAAA,CACEA,CAAAA,CAAO,cACPA,CAAAA,CAAO,QAAA,EACPkZ,CAAAA,CAAuBlZ,CAAAA,CAAO,GAAG,CAAA,EACjCsa,CAAAA,CAAK,IAAA,CACP,IAAA,CAAMA,EAAK,IAAA,CACX,IAAA,CAAMA,CAAAA,CAAK,IAAA,CACX,eAAgBta,CAAAA,CAAO,QAAA,EAAYkZ,EAAuBlZ,CAAAA,CAAO,GAAG,CACtE,CAAC,CAAA,CACDiL,CAAAA,CAAS/S,CAAAA,CAAW8H,EAAO,GAAA,CAAK,CAC9B,cAAA,CAAgB,CAAA,CAAA,CAChB,YAAa,CAAA,CACf,CAAC,EACH,CAAA,MAASmG,EAAK,CACZ,IAAMC,CAAAA,CACJD,CAAAA,YAAe,MAAQA,CAAAA,CAAI,OAAA,CAAU,kCAAA,CACvCub,CAAAA,CAAgBtb,CAAO,EACzB,CAAA,OAAE,CACA,GAAA,CAAI,gBAAgBwb,CAAQ,CAAA,CAC5BH,CAAAA,CAAmB,IAAI,EACzB,CACF,CAAA,CAEM1I,EAAqBnR,CAAAA,EAA2C,CAChEA,EAAE,MAAA,CAAO,KAAA,EAASA,CAAAA,CAAE,MAAA,CAAO,MAAM,MAAA,CAAS,CAAA,EACvC+Z,CAAAA,CAAW/Z,CAAAA,CAAE,OAAO,KAAA,CAAM,CAAC,CAAC,EAErC,EAEMia,CAAAA,CAAc,SAAY,CAI9B,GAHA9F,GAAW,CACX2F,CAAAA,CAAgB,IAAI,CAAA,CAEhBJ,GAAiBrE,CAAAA,CACnB,GAAI,CACF,MAAMnB,EAAW,CACf,QAAA,CACEwF,CAAAA,CAAc,cAAA,EACdpI,EAAuBoI,CAAAA,CAAc,GAAA,EAAO,EAAE,CAAA,EAC9C,KAAA,CAAA,CACF,QAASA,CAAAA,CAAc,GACzB,CAAC,EACH,OAASnb,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CACJD,aAAe,KAAA,CACXA,CAAAA,CAAI,OAAA,CACJ,gDAAA,CACNub,EAAgBtb,CAAO,CAAA,CACvB,MACF,CAGFmb,CAAAA,CAAiB,IAAI,CAAA,CACrBtW,CAAAA,CAAS/S,CAAAA,CAAW,IAAA,CAAM,CACxB,cAAA,CAAgB,IAAA,CAChB,WAAA,CAAa,IACf,CAAC,CAAA,CACG2kB,CAAAA,CAAa,OAAA,GACfA,CAAAA,CAAa,QAAQ,KAAA,CAAQ,EAAA,EAEjC,EAEA,OACEhd,GAAAA,CAACgI,EAAA,CAAiB,KAAA,CAAOrQ,CAAAA,CAAO,WAAA,CAAakQ,EAC3C,QAAA,CAAAH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YAEZ,QAAA,CAAA,CAAA,CAAC+Z,CAAAA,EAAiB,CAACE,CAAAA,EAClBja,KAAC,KAAA,CAAA,CACC,SAAA,CAAWqI,CAAAA,CACT,mGAAA,CACA2M,EACI,yCAAA,CACA,wDAAA,CACJvV,CAAAA,CACAsU,CAAAA,EAAe,gCACjB,CAAA,CACA,WAAA,CAAamC,CAAAA,CACb,WAAA,CAAaA,EACb,UAAA,CAAYA,CAAAA,CACZ,MAAA,CAAQC,CAAAA,CACR,QAAS,IAAMb,CAAAA,CAAa,SAAS,KAAA,EAAM,CAE3C,UAAAhd,GAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,MAAA,CACL,OAAO,SAAA,CACP,GAAA,CAAKgd,CAAAA,CACL,QAAA,CAAU9D,EACV,SAAA,CAAU,QAAA,CACZ,CAAA,CAEAlZ,GAAAA,CAAC,OAAI,SAAA,CAAU,iBAAA,CACb,QAAA,CAAA0H,IAAAA,CAAC,OAAI,SAAA,CAAU,sCAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,OACC,SAAA,CAAW+P,CAAAA,CACT,6BAAA,CACA2M,CAAAA,CACI,yBACA,6CACN,CAAA,CAEA,QAAA,CAAA1c,GAAAA,CAACoe,YAAA,CAAY,IAAA,CAAM,GAAI,CAAA,CACzB,CAAA,CAEA1W,KAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAA1H,GAAAA,CAAC,GAAA,CAAA,CAAE,UAAU,0CAAA,CACV,QAAA,CAAA0c,CAAAA,CACG,4BAAA,CACA,iCACN,CAAA,CACAhV,IAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,wBAAwB,QAAA,CAAA,CAAA,IAAA,CAChC,GAAA,CACH1H,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,2CAAA,CAA4C,QAAA,CAAA,wBAAA,CAE5D,CAAA,CAAA,CACF,CAAA,CACAA,IAAC,GAAA,CAAA,CAAE,SAAA,CAAU,4BAAA,CAA6B,QAAA,CAAA,2CAAA,CAE1C,GACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAIAyhB,GAAiBE,CAAAA,GACjBja,IAAAA,CAAC,OAAI,SAAA,CAAU,uEAAA,CACb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,UAAA1H,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK2hB,CAAAA,EAAmBF,GAAe,GAAA,EAAO,EAAA,CAC9C,GAAA,CAAI,WAAA,CACJ,UAAU,uCAAA,CACZ,CAAA,CAEAzhB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kKACb,QAAA,CAAA0H,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iBACZ,QAAA,CAAA,CAAA+Z,CAAAA,EACCzhB,GAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAAS,IAAM,MAAA,CAAO,KAAKyhB,CAAAA,CAAc,GAAA,CAAK,QAAQ,CAAA,CACtD,SAAA,CAAU,gEAEV,QAAA,CAAAzhB,GAAAA,CAACuf,GAAAA,CAAA,CAAI,KAAM,EAAA,CAAI,SAAA,CAAU,eAAA,CAAgB,CAAA,CAC3C,EAEFvf,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAG,CAAQgiB,CAAAA,GAAY,CAAA,CAChC,UAAU,kFAAA,CACV,QAAA,CAAUrG,CAAAA,CAET,QAAA,CAAAA,EACC3b,GAAAA,CAACse,OAAAA,CAAA,CAAQ,IAAA,CAAM,GAAI,SAAA,CAAU,2BAAA,CAA4B,CAAA,CAEzDte,GAAAA,CAACue,OAAA,CAAO,IAAA,CAAM,GAAI,SAAA,CAAU,cAAA,CAAe,EAE/C,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEAve,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uCAAA,CACb,QAAA,CAAA0H,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAA1H,IAAC,GAAA,CAAA,CAAE,SAAA,CAAU,oCAAA,CACV,QAAA,CAAAyhB,GAAe,IAAA,CAClB,CAAA,CAAA,CACEA,CAAAA,EAAe,IAAA,EAAQE,IACvB3hB,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,uBAAA,CACV,SAAAyhB,CAAAA,EAAe,IAAA,CACZrF,EAAeqF,CAAAA,CAAc,IAAI,EACjC,EAAA,CACN,CAAA,CAAA,CAEJ,CAAA,CACChG,CAAAA,EACCzb,IAACse,OAAAA,CAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,UAAU,4BAAA,CAA6B,CAAA,CAAA,CAE9D,CAAA,CACF,CAAA,CAAA,CACF,EAGDjB,CAAAA,EACCrd,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4EACZ,QAAA,CAAAqd,CAAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,CAAA,CAEO4E,EAAAA,CAAQT,EAAAA,CC/Rf,IAAMU,EAAAA,CAAgD,CAAC,CACrD,KAAA,CAAAvqB,EACA,IAAA,CAAA2a,CAAAA,CACA,YAAAzK,CAAAA,CAAc,IAAA,CACd,SAAA,CAAAV,CAAAA,CACA,aAAA4O,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,QAAA,CAAA3K,CAAS,CAAA,CAAIxE,cAAAA,GACf,CAAC8V,CAAAA,CAAYC,CAAa,CAAA,CAAIhhB,QAAAA,CAAS,KAAK,CAAA,CAC5C,CAACwmB,CAAAA,CAAeC,CAAgB,EAAIzmB,QAAAA,CACxC,IACF,CAAA,CACM,CAACgmB,EAAiBC,CAAkB,CAAA,CAAIjmB,QAAAA,CAAwB,IAAI,EACpE,CAACkK,CAAAA,CAAcgc,CAAe,CAAA,CAAIlmB,SAAwB,IAAI,CAAA,CAC9DqhB,CAAAA,CAAejhB,MAAAA,CAAyB,IAAI,CAAA,CAC5C1D,CAAAA,CAAYia,CAAAA,EAAQ3a,CAAAA,CAAM,UAAU,QAAA,EAAS,CAC7C2lB,CAAAA,CAAavhB,MAAAA,CAAO,KAAK,CAAA,CACzB,CACJ,WAAAigB,CAAAA,CACA,UAAA,CAAAC,EACA,WAAA,CAAAR,CAAAA,CACA,UAAA,CAAAE,CAAAA,CACA,MAAOuB,CAAAA,CACP,UAAA,CAAAhB,CAAAA,CACA,gBAAA,CAAAiB,EACA,gBAAA,CAAAC,CACF,CAAA,CAAI7B,EAAAA,CAAqB5jB,EAAM,kBAAkB,CAAA,CAE3C0lB,CAAAA,CAAiBxX,CAAAA,EAAgBqX,GAAe,IAAA,CAEtDhR,SAAAA,CAAU,IAAM,CACV,OAAO6J,CAAAA,EAAiB,QAAA,EAAYA,CAAAA,CAAa,IAAA,GAAO,MAAA,CAAS,CAAA,GACnEqM,CAAAA,CAAiB,CACf,IAAKrM,CAAAA,CACL,IAAA,CAAMsD,EAAuBtD,CAAY,CAAA,EAAKA,EAC9C,cAAA,CAAgBsD,CAAAA,CAAuBtD,CAAY,CAAA,EAAK,MAC1D,CAAC,CAAA,CACIuH,CAAAA,CAAW,OAAA,GACdlS,EAAS/S,CAAAA,CAAW0d,CAAAA,CAAc,CAChC,cAAA,CAAgB,MAChB,WAAA,CAAa,KACf,CAAC,CAAA,CACDuH,EAAW,OAAA,CAAU,IAAA,CAAA,EAG3B,CAAA,CAAG,CAACvH,EAAc1d,CAAAA,CAAW+S,CAAQ,CAAC,CAAA,CAEtC,IAAMgR,CAAAA,CAAkBC,CAAAA,EAAkB,CACxC,GAAIA,IAAU,CAAA,CAAG,OAAO,UACxB,IAAMxjB,CAAAA,CAAI,KACJyjB,CAAAA,CAAQ,CAAC,OAAA,CAAS,IAAA,CAAM,KAAM,IAAI,CAAA,CAClC5hB,CAAAA,CAAI,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,CAAI2hB,CAAK,CAAA,CAAI,KAAK,GAAA,CAAIxjB,CAAC,CAAC,CAAA,CAClD,OAAO,YAAYwjB,CAAAA,CAAQ,IAAA,CAAK,GAAA,CAAIxjB,CAAAA,CAAG6B,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,EAAI,GAAA,CAAM4hB,CAAAA,CAAM5hB,CAAC,CACxE,EAEMkjB,CAAAA,CAAc7V,CAAAA,EAAuB,CACzCA,CAAAA,CAAE,cAAA,GACFA,CAAAA,CAAE,eAAA,EAAgB,CAClB4U,CAAAA,CAAc5U,EAAE,IAAA,GAAS,WAAA,EAAeA,CAAAA,CAAE,IAAA,GAAS,UAAU,EAC/D,CAAA,CAEM8V,CAAAA,CAAc9V,CAAAA,EAAuB,CACzCA,CAAAA,CAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,iBAAgB,CAClB4U,CAAAA,CAAc,KAAK,CAAA,CACf5U,EAAE,YAAA,CAAa,KAAA,EAASA,CAAAA,CAAE,YAAA,CAAa,MAAM,MAAA,CAAS,CAAA,EACnD+Z,CAAAA,CAAW/Z,CAAAA,CAAE,aAAa,KAAA,CAAM,CAAC,CAAC,EAE3C,CAAA,CAEM+Z,EAAa,MAAOrH,CAAAA,EAAe,CACvC,GAAI,CAACA,CAAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,EAAG,CACnC,KAAA,CAAM,qDAA+C,CAAA,CACrD,MACF,CAEA,GAAI,CAAC0C,CAAAA,CAAkB,CACrB0E,CAAAA,CACE,sEACF,CAAA,CACA,MACF,CAEA3F,CAAAA,EAAW,CACX2F,CAAAA,CAAgB,IAAI,EAEpB,IAAME,CAAAA,CAAW,GAAA,CAAI,eAAA,CAAgBtH,CAAI,CAAA,CACzCmH,CAAAA,CAAmBG,CAAQ,CAAA,CAE3B,GAAI,CACF,IAAM5hB,CAAAA,CAAS,MAAM6b,CAAAA,CAAW,CAAE,IAAA,CAAAvB,CAAK,CAAC,CAAA,CACxC2H,EAAiB,CACf,GAAA,CAAKjiB,CAAAA,CAAO,GAAA,CACZ,KACEA,CAAAA,CAAO,YAAA,EACPA,CAAAA,CAAO,QAAA,EACPkZ,EAAuBlZ,CAAAA,CAAO,GAAG,CAAA,EACjCsa,CAAAA,CAAK,KACP,IAAA,CAAMA,CAAAA,CAAK,IAAA,CACX,IAAA,CAAMA,EAAK,IAAA,CACX,cAAA,CAAgBta,CAAAA,CAAO,QAAA,EAAYkZ,EAAuBlZ,CAAAA,CAAO,GAAG,CACtE,CAAC,CAAA,CACDiL,EAAS/S,CAAAA,CAAW8H,CAAAA,CAAO,GAAA,CAAK,CAC9B,eAAgB,CAAA,CAAA,CAChB,WAAA,CAAa,CAAA,CACf,CAAC,EACH,CAAA,MAASmG,CAAAA,CAAK,CACZ,IAAMC,EACJD,CAAAA,YAAe,KAAA,CAAQA,EAAI,OAAA,CAAU,sCAAA,CACvCub,EAAgBtb,CAAO,EACzB,CAAA,OAAE,CACA,IAAI,eAAA,CAAgBwb,CAAQ,CAAA,CAC5BH,CAAAA,CAAmB,IAAI,EACzB,CACF,CAAA,CAEM1I,CAAAA,CAAqBnR,GAA2C,CAChEA,CAAAA,CAAE,OAAO,KAAA,EAASA,CAAAA,CAAE,OAAO,KAAA,CAAM,MAAA,CAAS,CAAA,EACvC+Z,CAAAA,CAAW/Z,EAAE,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,EAErC,CAAA,CAEMsa,CAAAA,CAAc,SAAY,CAI9B,GAHAnG,CAAAA,EAAW,CACX2F,CAAAA,CAAgB,IAAI,EAEhBM,CAAAA,EAAiB/E,CAAAA,CACnB,GAAI,CACF,MAAMnB,CAAAA,CAAW,CACf,QAAA,CACEkG,CAAAA,CAAc,gBACd9I,CAAAA,CAAuB8I,CAAAA,CAAc,GAAA,EAAO,EAAE,GAC9C,KAAA,CAAA,CACF,OAAA,CAASA,EAAc,GACzB,CAAC,EACH,CAAA,MAAS7b,CAAAA,CAAK,CACZ,IAAMC,EACJD,CAAAA,YAAe,KAAA,CACXA,CAAAA,CAAI,OAAA,CACJ,iDACNub,CAAAA,CAAgBtb,CAAO,CAAA,CACvB,MACF,CAGF6b,CAAAA,CAAiB,IAAI,CAAA,CACrBR,CAAAA,CAAmB,IAAI,CAAA,CACvBxW,CAAAA,CAAS/S,CAAAA,CAAW,IAAA,CAAM,CACxB,cAAA,CAAgB,IAAA,CAChB,WAAA,CAAa,IACf,CAAC,CAAA,CACG2kB,CAAAA,CAAa,OAAA,GACfA,CAAAA,CAAa,QAAQ,KAAA,CAAQ,EAAA,EAEjC,EAEA,OACEhd,GAAAA,CAACgI,EAAA,CAAiB,KAAA,CAAOrQ,CAAAA,CAAO,WAAA,CAAakQ,EAC3C,QAAA,CAAAH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWqI,EACT,mGAAA,CACA2M,CAAAA,CACI,yCAAA,CACA,wDAAA,CAAA,CACHyF,GAAiBR,CAAAA,GAAoB,QAAA,CACtCxa,CAAAA,CACAsU,CAAAA,EAAe,gCACjB,CAAA,CACA,WAAA,CAAamC,CAAAA,CACb,WAAA,CAAaA,EACb,UAAA,CAAYA,CAAAA,CACZ,MAAA,CAAQC,CAAAA,CACR,QAAS,IAAMb,CAAAA,CAAa,SAAS,KAAA,EAAM,CAE3C,UAAAhd,GAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,MAAA,CACL,OAAO,SAAA,CACP,GAAA,CAAKgd,CAAAA,CACL,QAAA,CAAU9D,EACV,SAAA,CAAU,QAAA,CACZ,CAAA,CAEAlZ,GAAAA,CAAC,OAAI,SAAA,CAAU,iBAAA,CACb,SAAA0H,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,sCAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,KAAA,CAAA,CACC,UAAW+P,CAAAA,CACT,6BAAA,CACA2M,CAAAA,CACI,wBAAA,CACA,6CACN,CAAA,CAEA,QAAA,CAAA1c,GAAAA,CAACsiB,KAAAA,CAAA,CAAM,IAAA,CAAM,EAAA,CAAI,EACnB,CAAA,CAEA5a,IAAAA,CAAC,OACC,QAAA,CAAA,CAAA1H,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,2CACV,QAAA,CAAA0c,CAAAA,CACG,+BAAA,CACA,mCAAA,CACN,EACAhV,IAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,uBAAA,CAAwB,eAChC,GAAA,CACH1H,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4CAA4C,QAAA,CAAA,wBAAA,CAE5D,CAAA,CAAA,CACF,CAAA,CACAA,GAAAA,CAAC,KAAE,SAAA,CAAU,4BAAA,CAA6B,QAAA,CAAA,4CAAA,CAE1C,CAAA,CAAA,CACF,GACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAEEmiB,CAAAA,EAAiBR,IACjBja,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,WAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kFAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAA,CAAA1H,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAAA,IAACsiB,KAAAA,CAAA,CAAM,IAAA,CAAM,EAAA,CAAI,UAAU,iBAAA,CAAkB,CAAA,CAC/C,CAAA,CACA5a,IAAAA,CAAC,OAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,KAAE,SAAA,CAAU,oCAAA,CACV,QAAA,CAAAmiB,CAAAA,EAAe,KAClB,CAAA,CACCA,CAAAA,EAAe,MACdniB,GAAAA,CAAC,GAAA,CAAA,CAAE,UAAU,uBAAA,CACV,QAAA,CAAAoc,CAAAA,CAAe+F,CAAAA,CAAc,IAAI,CAAA,CACpC,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACAniB,IAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAG,CAAQqiB,CAAAA,GAAY,CAAA,CAChC,SAAA,CAAU,uEACV,QAAA,CAAU1G,CAAAA,CAET,QAAA,CAAAA,CAAAA,CACC3b,IAACse,OAAAA,CAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,UAAU,2BAAA,CAA4B,CAAA,CAEzDte,GAAAA,CAACue,MAAAA,CAAA,CAAO,IAAA,CAAM,EAAA,CAAI,UAAU,cAAA,CAAe,CAAA,CAE/C,GACF,CAAA,CAEAve,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+DACb,QAAA,CAAAA,GAAAA,CAAC,OAAA,CAAA,CACC,GAAA,CAAK2hB,GAAmBQ,CAAAA,EAAe,GAAA,EAAO,MAAA,CAC9C,QAAA,CAAQ,KACR,SAAA,CAAU,eAAA,CACV,MAAO,CAAE,SAAA,CAAW,OAAQ,CAAA,CAC9B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGD9E,GACCrd,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2EAAA,CACZ,SAAAqd,CAAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,EAEOkF,EAAAA,CAAQL,EAAAA,CC7Qf,IAAMM,EAAAA,CAAgD,CAAC,CACrD,MAAA7qB,CAAAA,CACA,IAAA,CAAA2a,CAAAA,CACA,WAAA,CAAAzK,EAAc,IAAA,CACd,SAAA,CAAAV,EACA,YAAA,CAAA4O,CACF,IAAM,CACJ,GAAM,CAAE,QAAA,CAAA3K,CAAS,CAAA,CAAIxE,cAAAA,EAAe,CAC9B,CAAC8V,EAAYC,CAAa,CAAA,CAAIhhB,QAAAA,CAAS,KAAK,EAC5C,CAAC8mB,CAAAA,CAAeC,CAAgB,CAAA,CAAI/mB,SACxC,IACF,CAAA,CACM,CAACgmB,CAAAA,CAAiBC,CAAkB,CAAA,CAAIjmB,QAAAA,CAAwB,IAAI,CAAA,CACpE,CAACkK,CAAAA,CAAcgc,CAAe,CAAA,CAAIlmB,QAAAA,CAAwB,IAAI,CAAA,CAC9D,CAACgnB,EAAWC,CAAY,CAAA,CAAIjnB,SAAS,KAAK,CAAA,CAC1CqhB,CAAAA,CAAejhB,MAAAA,CAAyB,IAAI,CAAA,CAC5C8mB,CAAAA,CAAW9mB,MAAAA,CAAgC,IAAI,EAC/C1D,CAAAA,CAAYia,CAAAA,EAAQ3a,CAAAA,CAAM,SAAA,CAAU,UAAS,CAC7C2lB,CAAAA,CAAavhB,MAAAA,CAAO,KAAK,EACzB,CACJ,UAAA,CAAAigB,CAAAA,CACA,UAAA,CAAAC,EACA,WAAA,CAAAR,CAAAA,CACA,UAAA,CAAAE,CAAAA,CACA,MAAOuB,CAAAA,CACP,UAAA,CAAAhB,CAAAA,CACA,gBAAA,CAAAiB,EACA,gBAAA,CAAAC,CACF,EAAI7B,EAAAA,CAAqB5jB,CAAAA,CAAM,kBAAkB,CAAA,CAE3C0lB,CAAAA,CAAiBxX,CAAAA,EAAgBqX,CAAAA,EAAe,KAEtDhR,SAAAA,CAAU,IAAM,CACV,OAAO6J,GAAiB,QAAA,EAAYA,CAAAA,CAAa,IAAA,EAAK,CAAE,OAAS,CAAA,GACnE2M,CAAAA,CAAiB,CACf,GAAA,CAAK3M,CAAAA,CACL,KAAMsD,CAAAA,CAAuBtD,CAAY,CAAA,EAAKA,CAAAA,CAC9C,eAAgBsD,CAAAA,CAAuBtD,CAAY,CAAA,EAAK,MAC1D,CAAC,CAAA,CACIuH,CAAAA,CAAW,OAAA,GACdlS,CAAAA,CAAS/S,EAAW0d,CAAAA,CAAc,CAChC,eAAgB,KAAA,CAChB,WAAA,CAAa,KACf,CAAC,CAAA,CACDuH,CAAAA,CAAW,OAAA,CAAU,OAG3B,CAAA,CAAG,CAACvH,CAAAA,CAAc1d,CAAAA,CAAW+S,CAAQ,CAAC,CAAA,CAEtC,IAAMgR,CAAAA,CAAkBC,GAAkB,CACxC,GAAIA,CAAAA,GAAU,CAAA,CAAG,OAAO,SAAA,CACxB,IAAMxjB,CAAAA,CAAI,IAAA,CACJyjB,EAAQ,CAAC,OAAA,CAAS,IAAA,CAAM,IAAA,CAAM,IAAI,CAAA,CAClC5hB,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,CAAI2hB,CAAK,EAAI,IAAA,CAAK,GAAA,CAAIxjB,CAAC,CAAC,CAAA,CAClD,OAAO,UAAA,CAAA,CAAYwjB,EAAQ,IAAA,CAAK,GAAA,CAAIxjB,CAAAA,CAAG6B,CAAC,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAI,IAAM4hB,CAAAA,CAAM5hB,CAAC,CACxE,CAAA,CAEMkjB,EAAc7V,CAAAA,EAAuB,CACzCA,CAAAA,CAAE,cAAA,GACFA,CAAAA,CAAE,eAAA,EAAgB,CAClB4U,CAAAA,CAAc5U,EAAE,IAAA,GAAS,WAAA,EAAeA,CAAAA,CAAE,IAAA,GAAS,UAAU,EAC/D,CAAA,CAEM8V,EAAc9V,CAAAA,EAAuB,CACzCA,EAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,eAAA,GACF4U,CAAAA,CAAc,KAAK,CAAA,CACf5U,CAAAA,CAAE,aAAa,KAAA,EAASA,CAAAA,CAAE,YAAA,CAAa,KAAA,CAAM,OAAS,CAAA,EACnD+Z,CAAAA,CAAW/Z,CAAAA,CAAE,YAAA,CAAa,MAAM,CAAC,CAAC,EAE3C,CAAA,CAEM+Z,EAAa,MAAOrH,CAAAA,EAAe,CACvC,GAAI,CAACA,CAAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,EAAG,CACnC,KAAA,CAAM,kDAA+C,CAAA,CACrD,MACF,CAEA,GAAI,CAAC0C,CAAAA,CAAkB,CACrB0E,EACE,sEACF,CAAA,CACA,MACF,CAEA3F,GAAW,CACX2F,CAAAA,CAAgB,IAAI,CAAA,CAEpB,IAAME,CAAAA,CAAW,GAAA,CAAI,gBAAgBtH,CAAI,CAAA,CACzCmH,EAAmBG,CAAQ,CAAA,CAE3B,GAAI,CACF,IAAM5hB,CAAAA,CAAS,MAAM6b,CAAAA,CAAW,CAAE,KAAAvB,CAAK,CAAC,CAAA,CACxCiI,CAAAA,CAAiB,CACf,GAAA,CAAKviB,CAAAA,CAAO,IACZ,IAAA,CACEA,CAAAA,CAAO,cACPA,CAAAA,CAAO,QAAA,EACPkZ,CAAAA,CAAuBlZ,CAAAA,CAAO,GAAG,CAAA,EACjCsa,CAAAA,CAAK,IAAA,CACP,IAAA,CAAMA,EAAK,IAAA,CACX,IAAA,CAAMA,CAAAA,CAAK,IAAA,CACX,eAAgBta,CAAAA,CAAO,QAAA,EAAYkZ,CAAAA,CAAuBlZ,CAAAA,CAAO,GAAG,CACtE,CAAC,CAAA,CACDiL,CAAAA,CAAS/S,EAAW8H,CAAAA,CAAO,GAAA,CAAK,CAC9B,cAAA,CAAgB,GAChB,WAAA,CAAa,CAAA,CACf,CAAC,EACH,OAASmG,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CACJD,CAAAA,YAAe,MAAQA,CAAAA,CAAI,OAAA,CAAU,wCAAA,CACvCub,CAAAA,CAAgBtb,CAAO,EACzB,CAAA,OAAE,CACA,GAAA,CAAI,gBAAgBwb,CAAQ,CAAA,CAC5BH,CAAAA,CAAmB,IAAI,EACzB,CACF,CAAA,CAEM1I,CAAAA,CAAqBnR,CAAAA,EAA2C,CAChEA,CAAAA,CAAE,MAAA,CAAO,KAAA,EAASA,CAAAA,CAAE,OAAO,KAAA,CAAM,MAAA,CAAS,CAAA,EACvC+Z,CAAAA,CAAW/Z,EAAE,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,EAErC,CAAA,CAEM+a,CAAAA,CAAc,SAAY,CAI9B,GAHA5G,GAAW,CACX2F,CAAAA,CAAgB,IAAI,CAAA,CAEhBY,GAAiBrF,CAAAA,CACnB,GAAI,CACF,MAAMnB,EAAW,CACf,QAAA,CACEwG,CAAAA,CAAc,cAAA,EACdpJ,EAAuBoJ,CAAAA,CAAc,GAAA,EAAO,EAAE,CAAA,EAC9C,OACF,OAAA,CAASA,CAAAA,CAAc,GACzB,CAAC,EACH,CAAA,MAASnc,CAAAA,CAAK,CACZ,IAAMC,EACJD,CAAAA,YAAe,KAAA,CACXA,CAAAA,CAAI,OAAA,CACJ,iDACNub,CAAAA,CAAgBtb,CAAO,EACvB,MACF,CAGFmc,EAAiB,IAAI,CAAA,CACrBd,CAAAA,CAAmB,IAAI,EACvBgB,CAAAA,CAAa,KAAK,CAAA,CAClBxX,CAAAA,CAAS/S,EAAW,IAAA,CAAM,CACxB,cAAA,CAAgB,IAAA,CAChB,YAAa,IACf,CAAC,EACG2kB,CAAAA,CAAa,OAAA,GACfA,EAAa,OAAA,CAAQ,KAAA,CAAQ,EAAA,EAEjC,CAAA,CAEM+F,EAAkB,IAAM,CACxBF,CAAAA,CAAS,OAAA,GACPF,EACFE,CAAAA,CAAS,OAAA,CAAQ,KAAA,EAAM,CAEvBA,EAAS,OAAA,CAAQ,IAAA,GAEnBD,CAAAA,CAAa,CAACD,CAAS,CAAA,EAE3B,CAAA,CAEA,OACE3iB,GAAAA,CAACgI,EAAA,CAAiB,KAAA,CAAOrQ,CAAAA,CAAO,WAAA,CAAakQ,EAC3C,QAAA,CAAAH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWqI,EACT,mGAAA,CACA2M,CAAAA,CACI,yCAAA,CACA,wDAAA,CAAA,CACH+F,GAAiBd,CAAAA,GAAoB,QAAA,CACtCxa,CAAAA,CACAsU,CAAAA,EAAe,gCACjB,CAAA,CACA,WAAA,CAAamC,CAAAA,CACb,WAAA,CAAaA,EACb,UAAA,CAAYA,CAAAA,CACZ,OAAQC,CAAAA,CACR,OAAA,CAAS,IAAMb,CAAAA,CAAa,OAAA,EAAS,KAAA,EAAM,CAE3C,UAAAhd,GAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,MAAA,CACL,OAAO,SAAA,CACP,GAAA,CAAKgd,CAAAA,CACL,QAAA,CAAU9D,EACV,SAAA,CAAU,QAAA,CACZ,EAEAlZ,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,iBAAA,CACb,QAAA,CAAA0H,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,sCAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,KAAA,CAAA,CACC,UAAW+P,CAAAA,CACT,6BAAA,CACA2M,CAAAA,CACI,wBAAA,CACA,6CACN,CAAA,CAEA,QAAA,CAAA1c,IAACgjB,KAAAA,CAAA,CAAM,KAAM,EAAA,CAAI,CAAA,CACnB,CAAA,CAEAtb,IAAAA,CAAC,OACC,QAAA,CAAA,CAAA1H,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,2CACV,QAAA,CAAA0c,CAAAA,CACG,4BAAA,CACA,gCAAA,CACN,EACAhV,IAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,uBAAA,CAAwB,eAChC,GAAA,CACH1H,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4CAA4C,QAAA,CAAA,wBAAA,CAE5D,CAAA,CAAA,CACF,CAAA,CACAA,GAAAA,CAAC,KAAE,SAAA,CAAU,4BAAA,CAA6B,QAAA,CAAA,2CAAA,CAE1C,CAAA,CAAA,CACF,GACF,CAAA,CACF,CAAA,CAAA,CACF,GAEEyiB,CAAAA,EAAiBd,CAAAA,GACjBja,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kFAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAA,CAAA1H,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BACb,QAAA,CAAAA,GAAAA,CAACgjB,MAAA,CAAM,IAAA,CAAM,EAAA,CAAI,SAAA,CAAU,iBAAiB,CAAA,CAC9C,CAAA,CACAtb,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gBAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,GAAA,CAAA,CAAE,UAAU,oCAAA,CACV,QAAA,CAAAyiB,GAAe,IAAA,CAClB,CAAA,CACCA,GAAe,IAAA,EACdziB,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,wBACV,QAAA,CAAAoc,CAAAA,CAAeqG,CAAAA,CAAc,IAAI,EACpC,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACAziB,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAG,CAAQ8iB,CAAAA,GAAY,CAAA,CAChC,SAAA,CAAU,sEAAA,CACV,SAAUnH,CAAAA,CAET,QAAA,CAAAA,CAAAA,CACC3b,GAAAA,CAACse,QAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,SAAA,CAAU,4BAA4B,CAAA,CAEzDte,GAAAA,CAACue,OAAA,CAAO,IAAA,CAAM,GAAI,SAAA,CAAU,cAAA,CAAe,CAAA,CAE/C,CAAA,CAAA,CACF,EAEAve,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8DAAA,CACb,SAAA0H,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CACb,UAAA1H,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS+iB,CAAAA,CACT,SAAA,CAAU,iGAAA,CACV,QAAA,CAAU,EAAEN,CAAAA,EAAiBd,CAAAA,CAAAA,CAE5B,QAAA,CAAAgB,CAAAA,CAAY3iB,IAACijB,KAAAA,CAAA,CAAM,IAAA,CAAM,EAAA,CAAI,EAAKjjB,GAAAA,CAACkjB,IAAAA,CAAA,CAAK,IAAA,CAAM,EAAA,CAAI,EACrD,CAAA,CACAljB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SACb,QAAA,CAAAA,GAAAA,CAAC,OAAA,CAAA,CACC,GAAA,CAAK6iB,EACL,GAAA,CAAKlB,CAAAA,EAAmBc,CAAAA,EAAe,GAAA,EAAO,OAC9C,OAAA,CAAS,IAAMG,CAAAA,CAAa,KAAK,EACnC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,EAGDvF,CAAAA,EACCrd,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4EACZ,QAAA,CAAAqd,CAAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,CAAA,CAEO8F,EAAAA,CAAQX,GCvSf,IAAMY,EAAAA,CAA4C,CAAC,CACjD,MAAAzrB,CAAAA,CACA,IAAA,CAAA2a,CAAAA,CACA,WAAA,CAAAzK,EAAc,IAAA,CACd,SAAA,CAAAV,EACA,YAAA,CAAA4O,CACF,IAAM,CACJ,GAAM,CAAE,QAAA,CAAA3K,CAAS,CAAA,CAAIxE,cAAAA,EAAe,CAC9B,CAAC8V,EAAYC,CAAa,CAAA,CAAIhhB,QAAAA,CAAS,KAAK,EAC5C,CAAC0nB,CAAAA,CAAaC,CAAc,CAAA,CAAI3nB,SAAiC,IAAI,CAAA,CACrE,CAAC4nB,CAAAA,CAAYC,CAAa,CAAA,CAAI7nB,QAAAA,CAAwB,IAAI,CAAA,CAC1D,CAAC8nB,CAAAA,CAAeC,CAAgB,CAAA,CAAI/nB,QAAAA,CAExC,MAAM,CAAA,CACF,CAACgoB,EAAgBC,CAAiB,CAAA,CAAIjoB,SAAwB,IAAI,CAAA,CAClE,CAACkK,CAAAA,CAAcgc,CAAe,CAAA,CAAIlmB,QAAAA,CAAwB,IAAI,CAAA,CAC9DqhB,EAAejhB,MAAAA,CAAyB,IAAI,CAAA,CAC5C1D,CAAAA,CAAYia,GAAQ3a,CAAAA,CAAM,SAAA,CAAU,QAAA,EAAS,CAC7C2lB,EAAavhB,MAAAA,CAAO,KAAK,CAAA,CACzB8nB,CAAAA,CAAqB9nB,OAAsB,IAAI,CAAA,CAC/C,CACJ,UAAA,CAAAigB,EACA,UAAA,CAAAC,CAAAA,CACA,WAAA,CAAAR,CAAAA,CACA,WAAAE,CAAAA,CACA,KAAA,CAAOuB,EACP,UAAA,CAAAhB,CAAAA,CACA,iBAAAiB,CAAAA,CACA,gBAAA,CAAAC,CACF,CAAA,CAAI7B,GAAqB5jB,CAAAA,CAAM,kBAAkB,CAAA,CAE3C0lB,CAAAA,CAAiBxX,GAAgBqX,CAAAA,EAAe,IAAA,CAEhD4G,CAAAA,CAAeliB,WAAAA,CAAY,IAAM,CAEnCiiB,CAAAA,CAAmB,OAAA,EACnBA,CAAAA,CAAmB,QAAQ,UAAA,CAAW,OAAO,CAAA,EAE7C,GAAA,CAAI,gBAAgBA,CAAAA,CAAmB,OAAO,CAAA,CAEhDA,CAAAA,CAAmB,QAAU,IAAA,CAC7BL,CAAAA,CAAc,IAAI,CAAA,CAClBE,EAAiB,MAAM,CAAA,CACvBE,EAAkB,IAAI,EACxB,EAAG,EAAE,CAAA,CAECG,CAAAA,CAAqBniB,YACxBoiB,CAAAA,EAAe,CACdF,CAAAA,EAAa,CACb,IAAMG,CAAAA,CAAY,GAAA,CAAI,eAAA,CAAgBD,CAAI,EAC1CH,CAAAA,CAAmB,OAAA,CAAUI,EAC7BT,CAAAA,CAAcS,CAAS,EACvBP,CAAAA,CAAiB,OAAO,CAAA,CACxBE,CAAAA,CAAkB,IAAI,EACxB,CAAA,CACA,CAACE,CAAY,CACf,CAAA,CAEMI,CAAAA,CAAwBtiB,WAAAA,CAC5B,MAAOyB,GAAgB,CACrB,GAAI,CAACA,CAAAA,CAAK,CACRygB,GAAa,CACb,MACF,CACAJ,CAAAA,CAAiB,SAAS,CAAA,CAC1BE,CAAAA,CAAkB,IAAI,CAAA,CACtB,GAAI,CACF,IAAMle,CAAAA,CAAW,MAAM,MAAMrC,CAAAA,CAAK,CAAE,IAAA,CAAM,MAAO,CAAC,CAAA,CAClD,GAAI,CAACqC,CAAAA,CAAS,GACZ,MAAM,IAAI,KAAA,CAAMA,CAAAA,CAAS,UAAU,CAAA,CAErC,IAAMse,EAAAA,CAAO,MAAMte,EAAS,IAAA,EAAK,CAC3Bye,GACJze,CAAAA,CAAS,OAAA,CAAQ,IAAI,cAAc,CAAA,EAAG,WAAA,EAAY,EAAK,GACnD0e,EAAAA,CAAWJ,EAAAA,CAAK,IAAA,EAAM,WAAA,IAAiB,EAAA,CACvCK,EAAAA,CACJhL,CAAAA,CAAuBhW,CAAG,GAAG,WAAA,EAAY,EACzCA,CAAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,GAOpB,GAAI,EAJF8gB,EAAAA,CAAkB,QAAA,CAAS,KAAK,CAAA,EAChCC,EAAAA,CAAS,QAAA,CAAS,KAAK,GACvBC,EAAAA,CAAS,QAAA,CAAS,MAAM,CAAA,CAAA,CAGxB,MAAM,IAAI,KAAA,CAAM,sCAAsC,CAAA,CAGxD,IAAMC,GAAiBF,EAAAA,CAAS,QAAA,CAAS,KAAK,CAAA,CAC1CJ,GACA,IAAI,IAAA,CAAK,CAACA,EAAI,EAAG,CAAE,IAAA,CAAM,iBAAkB,CAAC,EAEhDD,CAAAA,CAAmBO,EAAc,EACnC,CAAA,MAASlgB,EAAO,CACd0f,CAAAA,EAAa,CACbJ,CAAAA,CAAiB,OAAO,CAAA,CACxBE,CAAAA,CACE,4FACF,CAAA,CACA,QAAQ,IAAA,CAAK,sCAAA,CAAwCxf,CAAK,EAC5D,CACF,EACA,CAAC0f,CAAAA,CAAcC,CAAkB,CACnC,EAEA7X,SAAAA,CAAU,IAAM,CACV,OAAO6J,GAAiB,QAAA,EAAYA,CAAAA,CAAa,IAAA,EAAK,CAAE,OAAS,CAAA,EACnEuN,CAAAA,CAAe,CACb,GAAA,CAAKvN,CAAAA,CACL,KAAMsD,CAAAA,CAAuBtD,CAAY,CAAA,EAAKA,CAAAA,CAC9C,eAAgBsD,CAAAA,CAAuBtD,CAAY,CAAA,EAAK,MAC1D,CAAC,CAAA,CACD2N,CAAAA,CAAiB,SAAS,CAAA,CAC1BE,EAAkB,IAAI,CAAA,CACjBM,EAAsBnO,CAAY,CAAA,CAClCuH,EAAW,OAAA,GACdlS,CAAAA,CAAS/S,CAAAA,CAAW0d,CAAAA,CAAc,CAChC,cAAA,CAAgB,KAAA,CAChB,WAAA,CAAa,KACf,CAAC,CAAA,CACDuH,CAAAA,CAAW,OAAA,CAAU,IAAA,CAAA,GAGvBwG,GAAa,CACbR,CAAAA,CAAe,IAAI,CAAA,EAEvB,EAAG,CAACvN,CAAAA,CAAc1d,CAAAA,CAAW6rB,CAAAA,CAAuB9Y,EAAU0Y,CAAY,CAAC,CAAA,CAE3E5X,SAAAA,CAAU,IACD,IAAM,CACP2X,CAAAA,CAAmB,OAAA,EAAWA,EAAmB,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAC7E,GAAA,CAAI,gBAAgBA,CAAAA,CAAmB,OAAO,EAElD,CAAA,CACC,EAAE,CAAA,CAEL,IAAMzH,CAAAA,CAAkBC,GAAkB,CACxC,GAAIA,CAAAA,GAAU,CAAA,CAAG,OAAO,SAAA,CACxB,IAAMxjB,CAAAA,CAAI,IAAA,CACJyjB,GAAQ,CAAC,OAAA,CAAS,IAAA,CAAM,IAAA,CAAM,IAAI,CAAA,CAClC5hB,EAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,CAAI2hB,CAAK,CAAA,CAAI,IAAA,CAAK,IAAIxjB,CAAC,CAAC,EAClD,OAAO,UAAA,CAAA,CAAYwjB,EAAQ,IAAA,CAAK,GAAA,CAAIxjB,CAAAA,CAAG6B,EAAC,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAI,IAAM4hB,EAAAA,CAAM5hB,EAAC,CACxE,CAAA,CAEMkjB,EAAc7V,CAAAA,EAAuB,CACzCA,CAAAA,CAAE,cAAA,GACFA,CAAAA,CAAE,eAAA,EAAgB,CAClB4U,CAAAA,CAAc5U,EAAE,IAAA,GAAS,WAAA,EAAeA,CAAAA,CAAE,IAAA,GAAS,UAAU,EAC/D,CAAA,CAEM8V,CAAAA,CAAc9V,CAAAA,EAAuB,CACzCA,CAAAA,CAAE,cAAA,GACFA,CAAAA,CAAE,eAAA,GACF4U,CAAAA,CAAc,KAAK,CAAA,CACf5U,CAAAA,CAAE,aAAa,KAAA,EAASA,CAAAA,CAAE,YAAA,CAAa,KAAA,CAAM,OAAS,CAAA,EACnD+Z,CAAAA,CAAW/Z,CAAAA,CAAE,YAAA,CAAa,MAAM,CAAC,CAAC,EAE3C,CAAA,CAEM+Z,CAAAA,CAAa,MAAOrH,CAAAA,EAAe,CAEvC,GAAIA,CAAAA,CAAK,OAAS,iBAAA,CAAmB,CACnC,KAAA,CAAM,gDAA6C,EACnD,MACF,CAEA,GAAI,CAAC0C,EAAkB,CACrB0E,CAAAA,CACE,sEACF,CAAA,CACA,MACF,CAEA3F,CAAAA,EAAW,CACX2F,CAAAA,CAAgB,IAAI,EAEpBkC,CAAAA,CAAmBtJ,CAAI,CAAA,CACvBiJ,CAAAA,CAAiB,OAAO,CAAA,CACxBE,CAAAA,CAAkB,IAAI,CAAA,CAEtB,GAAI,CACF,IAAMzjB,CAAAA,CAAS,MAAM6b,EAAW,CAAE,IAAA,CAAAvB,CAAK,CAAC,EACxC6I,CAAAA,CAAe,CACb,GAAA,CAAKnjB,CAAAA,CAAO,IACZ,IAAA,CACEA,CAAAA,CAAO,YAAA,EACPA,CAAAA,CAAO,UACPkZ,CAAAA,CAAuBlZ,CAAAA,CAAO,GAAG,CAAA,EACjCsa,CAAAA,CAAK,KACP,IAAA,CAAMA,CAAAA,CAAK,IAAA,CACX,cAAA,CAAgBta,EAAO,QAAA,EAAYkZ,CAAAA,CAAuBlZ,CAAAA,CAAO,GAAG,CACtE,CAAC,CAAA,CACDiL,CAAAA,CAAS/S,CAAAA,CAAW8H,EAAO,GAAA,CAAK,CAC9B,cAAA,CAAgB,CAAA,CAAA,CAChB,YAAa,CAAA,CACf,CAAC,EACH,CAAA,MAASmG,EAAK,CACZ,IAAMC,EAAAA,CACJD,CAAAA,YAAe,MAAQA,CAAAA,CAAI,OAAA,CAAU,8BAAA,CACvCub,CAAAA,CAAgBtb,EAAO,CAAA,CACvBud,CAAAA,GACF,CACF,CAAA,CAEM5K,EAAqBnR,CAAAA,EAA2C,CAChEA,CAAAA,CAAE,MAAA,CAAO,OAASA,CAAAA,CAAE,MAAA,CAAO,KAAA,CAAM,MAAA,CAAS,GACvC+Z,CAAAA,CAAW/Z,CAAAA,CAAE,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,EAErC,CAAA,CAEMwc,CAAAA,CAAY,SAAY,CAI5B,GAHArI,CAAAA,EAAW,CACX2F,EAAgB,IAAI,CAAA,CAEhBwB,CAAAA,EAAejG,CAAAA,CACjB,GAAI,CACF,MAAMnB,CAAAA,CAAW,CACf,SACEoH,CAAAA,CAAY,cAAA,EACZhK,EAAuBgK,CAAAA,CAAY,GAAA,EAAO,EAAE,CAAA,EAC5C,KAAA,CAAA,CACF,OAAA,CAASA,CAAAA,CAAY,GACvB,CAAC,EACH,CAAA,MAAS/c,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CACJD,CAAAA,YAAe,KAAA,CACXA,EAAI,OAAA,CACJ,gDAAA,CACNub,EAAgBtb,CAAO,CAAA,CACvB,MACF,CAGF+c,CAAAA,CAAe,IAAI,CAAA,CACfC,GAAcA,CAAAA,CAAW,UAAA,CAAW,OAAO,CAAA,EAC7C,IAAI,eAAA,CAAgBA,CAAU,CAAA,CAEhCC,CAAAA,CAAc,IAAI,CAAA,CAClBK,CAAAA,CAAmB,QAAU,IAAA,CAC7BzY,CAAAA,CAAS/S,EAAW,IAAA,CAAM,CACxB,cAAA,CAAgB,IAAA,CAChB,YAAa,IACf,CAAC,CAAA,CACG2kB,CAAAA,CAAa,UACfA,CAAAA,CAAa,OAAA,CAAQ,KAAA,CAAQ,EAAA,EAEjC,EAEA,OACEhd,GAAAA,CAACgI,CAAAA,CAAA,CAAiB,MAAOrQ,CAAAA,CAAO,WAAA,CAAakQ,CAAAA,CAC3C,QAAA,CAAAH,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CAEZ,QAAA,CAAA,CAAA,CAAC2b,GAAe,CAACE,CAAAA,EAChB7b,IAAAA,CAAC,KAAA,CAAA,CACC,UAAWqI,CAAAA,CACT,mGAAA,CACA2M,EACI,yCAAA,CACA,wDAAA,CACJvV,EACAsU,CAAAA,EAAe,gCACjB,CAAA,CACA,WAAA,CAAamC,EACb,WAAA,CAAaA,CAAAA,CACb,UAAA,CAAYA,CAAAA,CACZ,OAAQC,CAAAA,CACR,OAAA,CAAS,IAAMb,CAAAA,CAAa,SAAS,KAAA,EAAM,CAE3C,QAAA,CAAA,CAAAhd,GAAAA,CAAC,SACC,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,iBAAA,CACP,IAAKgd,CAAAA,CACL,QAAA,CAAU9D,CAAAA,CACV,SAAA,CAAU,SACZ,CAAA,CAEAlZ,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBACb,QAAA,CAAA0H,IAAAA,CAAC,OAAI,SAAA,CAAU,sCAAA,CACb,UAAA1H,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW+P,CAAAA,CACT,8BACA2M,CAAAA,CACI,wBAAA,CACA,6CACN,CAAA,CAEA,SAAA1c,GAAAA,CAACwkB,QAAAA,CAAA,CAAS,IAAA,CAAM,GAAI,CAAA,CACtB,CAAA,CAEA9c,IAAAA,CAAC,KAAA,CAAA,CACC,UAAA1H,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,0CAAA,CACV,SAAA0c,CAAAA,CACG,0BAAA,CACA,8BAAA,CACN,CAAA,CACAhV,KAAC,GAAA,CAAA,CAAE,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,CAAA,IAAA,CAChC,IACH1H,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,2CAAA,CAA4C,QAAA,CAAA,wBAAA,CAE5D,GACF,CAAA,CACAA,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,6BAA6B,QAAA,CAAA,oCAAA,CAE1C,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,GACF,CAAA,CAAA,CAIAqjB,CAAAA,EACAE,CAAAA,EACAE,CAAAA,GAAkB,WAClBA,CAAAA,GAAkB,OAAA,GAClB/b,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YAEb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mFACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8BACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BACb,QAAA,CAAAA,GAAAA,CAACwkB,SAAA,CAAS,IAAA,CAAM,GAAI,SAAA,CAAU,cAAA,CAAe,CAAA,CAC/C,CAAA,CACA9c,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAA1H,IAAC,GAAA,CAAA,CAAE,SAAA,CAAU,oCAAA,CACV,QAAA,CAAAqjB,GAAa,IAAA,CAChB,CAAA,CAAA,CACEA,CAAAA,EAAa,IAAA,EAAQE,IACrBvjB,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,uBAAA,CACV,SAAAqjB,CAAAA,EAAa,IAAA,CACVjH,CAAAA,CAAeiH,CAAAA,CAAY,IAAI,CAAA,CAC/B,EAAA,CACN,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,EACA3b,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gBAAA,CACZ,QAAA,CAAA,CAAA2b,GACCrjB,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAM,MAAA,CAAO,IAAA,CAAKqjB,CAAAA,CAAY,IAAK,QAAQ,CAAA,CACpD,SAAA,CAAU,mDAAA,CACV,MAAM,8BAAA,CAEN,QAAA,CAAArjB,GAAAA,CAACuf,GAAAA,CAAA,CAAI,IAAA,CAAM,EAAA,CAAI,SAAA,CAAU,eAAA,CAAgB,EAC3C,CAAA,CAEFvf,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAS,IAAG,CAAQukB,CAAAA,KACpB,SAAA,CAAU,sEAAA,CACV,MAAM,WAAA,CACN,QAAA,CAAU5I,EAET,QAAA,CAAAA,CAAAA,CACC3b,GAAAA,CAACse,OAAAA,CAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,SAAA,CAAU,2BAAA,CAA4B,EAEzDte,GAAAA,CAACue,MAAAA,CAAA,CAAO,IAAA,CAAM,GAAI,SAAA,CAAU,cAAA,CAAe,CAAA,CAE/C,CAAA,CAAA,CACF,GACF,CAAA,CAECkF,CAAAA,GAAkB,SAAA,CACjB/b,IAAAA,CAAC,OAAI,SAAA,CAAU,iIAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAACse,QAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,SAAA,CAAU,6BAA6B,CAAA,CAC1Dte,GAAAA,CAAC,QAAK,QAAA,CAAA,gDAAA,CAAgC,CAAA,CAAA,CACxC,EACEujB,CAAAA,CACFvjB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+DACb,QAAA,CAAAA,GAAAA,CAAC,QAAA,CAAA,CACC,GAAA,CAAKujB,EACL,SAAA,CAAU,aAAA,CACV,KAAA,CAAM,eAAA,CACR,EACF,CAAA,CAEAvjB,GAAAA,CAAC,OAAI,SAAA,CAAU,gGAAA,CACZ,SAAA2jB,CAAAA,EACC,oFAAA,CACJ,CAAA,CAAA,CAEJ,CAAA,CAGDtG,GACCrd,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2EAAA,CACZ,SAAAqd,CAAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,EAEOoH,EAAAA,CAAQrB,EAAAA,CC3Yf,IAAMsB,EAAAA,CAAgD,CAAC,CACrD,MAAA/sB,CAAAA,CACA,IAAA,CAAA2a,CAAAA,CACA,WAAA,CAAAzK,EAAc,IAAA,CACd,SAAA,CAAAV,EACA,YAAA,CAAA4O,CACF,IAAM,CACJ,GAAM,CAAE,QAAA,CAAA3K,CAAS,CAAA,CAAIxE,cAAAA,EAAe,CAC9B,CAAC+d,EAAaC,CAAc,CAAA,CAAIjpB,QAAAA,CAAS,KAAK,EAC9C,CAACkpB,CAAAA,CAAUC,CAAW,CAAA,CAAInpB,QAAAA,CAAwB,IAAI,CAAA,CACtD,CAACopB,CAAAA,CAAYC,CAAa,EAAIrpB,QAAAA,CAAmC,IAAI,CAAA,CACrE,CAACspB,EAAUC,CAAW,CAAA,CAAIvpB,QAAAA,CAAS,CAAC,EACpC,CAACkK,CAAAA,CAAcgc,CAAe,CAAA,CAAIlmB,QAAAA,CAAwB,IAAI,CAAA,CAC9DwpB,CAAAA,CAAmBppB,MAAAA,CAA6B,IAAI,EACpD8mB,CAAAA,CAAW9mB,MAAAA,CAAgC,IAAI,CAAA,CAC/CqpB,EAAYrpB,MAAAA,CAAe,EAAE,CAAA,CAC7BspB,EAActpB,MAAAA,CAA8B,IAAI,CAAA,CAChD1D,CAAAA,CAAYia,GAAQ3a,CAAAA,CAAM,SAAA,CAAU,QAAA,EAAS,CAC7C2lB,EAAavhB,MAAAA,CAAO,KAAK,CAAA,CACzB,CACJ,WAAAigB,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,WAAA,CAAAR,EACA,UAAA,CAAAE,CAAAA,CACA,MAAOuB,CAAAA,CACP,UAAA,CAAAhB,EACA,gBAAA,CAAAiB,CAAAA,CACA,gBAAA,CAAAC,CACF,EAAI7B,EAAAA,CAAqB5jB,CAAAA,CAAM,kBAAkB,CAAA,CAE3C0lB,EAAiBxX,CAAAA,EAAgBqX,CAAAA,EAAe,IAAA,CAEtDhR,SAAAA,CAAU,IAAM,CACV,OAAO6J,GAAiB,QAAA,EAAYA,CAAAA,CAAa,MAAK,CAAE,MAAA,CAAS,CAAA,GACnE+O,CAAAA,CAAY/O,CAAY,CAAA,CACxBiP,CAAAA,CAAc,CACZ,GAAA,CAAKjP,EACL,QAAA,CAAUsD,CAAAA,CAAuBtD,CAAY,CAC/C,CAAC,CAAA,CACIuH,CAAAA,CAAW,UACdlS,CAAAA,CAAS/S,CAAAA,CAAW0d,EAAc,CAChC,cAAA,CAAgB,KAAA,CAChB,WAAA,CAAa,KACf,CAAC,CAAA,CACDuH,CAAAA,CAAW,OAAA,CAAU,OAG3B,CAAA,CAAG,CAACvH,CAAAA,CAAc1d,CAAAA,CAAW+S,CAAQ,CAAC,CAAA,CAEtCc,SAAAA,CAAU,IACD,IAAM,CACXoZ,CAAAA,EAAU,CACNH,CAAAA,CAAiB,SAAWA,CAAAA,CAAiB,OAAA,CAAQ,KAAA,GAAU,UAAA,EACjEA,EAAiB,OAAA,CAAQ,IAAA,EAAK,CAE5BtC,CAAAA,CAAS,SACXA,CAAAA,CAAS,OAAA,CAAQ,QAErB,CAAA,CAEC,EAAE,CAAA,CAEL,IAAMyC,CAAAA,CAAY,IAAM,CAClBD,CAAAA,CAAY,OAAA,GACd,aAAA,CAAcA,EAAY,OAAO,CAAA,CACjCA,CAAAA,CAAY,OAAA,CAAU,MAE1B,CAAA,CAEME,CAAAA,CAAkBC,CAAAA,EAAoB,CAC1C,IAAMC,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMD,CAAAA,CAAU,EAAE,CAAA,CAC9BE,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMF,EAAU,EAAE,CAAA,CACpC,OAAO,CAAA,EAAGC,CAAI,CAAA,CAAA,EAAIC,CAAAA,CAAK,UAAS,CAAE,QAAA,CAAS,EAAG,GAAG,CAAC,CAAA,CACpD,CAAA,CAEMC,EAAiB,SAAY,CACjC,GACE,OAAO,UAAc,GAAA,EACrB,CAAC,SAAA,CAAU,YAAA,EACX,CAAC,SAAA,CAAU,YAAA,CAAa,YAAA,CACxB,CACA,QAAQ,KAAA,CACN,wEACF,CAAA,CACA,KAAA,CACE,qGACF,CAAA,CACA,MACF,CAEAzJ,CAAAA,GACA2F,CAAAA,CAAgB,IAAI,CAAA,CAEpB,GAAI,CACF,IAAM+D,CAAAA,CAAS,MAAM,SAAA,CAAU,YAAA,CAAa,aAAa,CAAE,KAAA,CAAO,CAAA,CAAK,CAAC,EAClEC,CAAAA,CAAgB,IAAI,aAAA,CAAcD,CAAM,EAC9CT,CAAAA,CAAiB,OAAA,CAAUU,CAAAA,CAC3BT,CAAAA,CAAU,QAAU,EAAC,CAErBS,EAAc,eAAA,CAAmB9d,CAAAA,EAAM,CACjCA,CAAAA,CAAE,IAAA,CAAK,IAAA,CAAO,CAAA,EAChBqd,EAAU,OAAA,CAAQ,IAAA,CAAKrd,CAAAA,CAAE,IAAI,EAEjC,CAAA,CAEA8d,CAAAA,CAAc,MAAA,CAAS,SAAY,CACjC,IAAM7B,CAAAA,CAAO,IAAI,IAAA,CAAKoB,CAAAA,CAAU,QAAS,CAAE,IAAA,CAAM,YAAa,CAAC,EAE/D,GAAI,CAACjI,CAAAA,CAAkB,CACrB0E,EACE,sEACF,CAAA,CACA+D,CAAAA,CAAO,SAAA,GAAY,OAAA,CAASE,CAAAA,EAAUA,CAAAA,CAAM,IAAA,EAAM,CAAA,CAClDR,CAAAA,EAAU,CACV,MACF,CAEA,IAAMvD,CAAAA,CAAW,GAAA,CAAI,eAAA,CAAgBiC,CAAI,CAAA,CACzCc,CAAAA,CAAY/C,CAAQ,CAAA,CACpBiD,EAAc,IAAI,CAAA,CAElB,GAAI,CACF,IAAM7kB,EAAS,MAAM6b,CAAAA,CAAW,CAC9B,IAAA,CAAMgI,EACN,gBAAA,CAAkB,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,KAAA,CACvC,CAAC,CAAA,CACDc,CAAAA,CAAY3kB,EAAO,GAAG,CAAA,CACtB6kB,CAAAA,CAAc,CACZ,IAAK7kB,CAAAA,CAAO,GAAA,CACZ,QAAA,CAAUA,CAAAA,CAAO,UAAYkZ,CAAAA,CAAuBlZ,CAAAA,CAAO,GAAG,CAChE,CAAC,CAAA,CACDiL,CAAAA,CAAS/S,CAAAA,CAAW8H,CAAAA,CAAO,IAAK,CAC9B,cAAA,CAAgB,GAChB,WAAA,CAAa,CAAA,CACf,CAAC,CAAA,CACD,GAAA,CAAI,eAAA,CAAgB4hB,CAAQ,EAC9B,CAAA,MAASzb,CAAAA,CAAK,CACZ,IAAMC,GACJD,CAAAA,YAAe,KAAA,CACXA,CAAAA,CAAI,OAAA,CACJ,uDACNub,CAAAA,CAAgBtb,EAAO,EACzB,CAEAqf,EAAO,SAAA,EAAU,CAAE,OAAA,CAASE,CAAAA,EAAUA,EAAM,IAAA,EAAM,CAAA,CAClDR,CAAAA,GACF,CAAA,CAEAO,CAAAA,CAAc,KAAA,EAAM,CACpBjB,EAAe,CAAA,CAAI,CAAA,CACnBM,EAAY,CAAC,CAAA,CAEbG,EAAY,OAAA,CAAU,WAAA,CAAY,IAAM,CACtCH,EAAa/P,CAAAA,EAASA,CAAAA,CAAO,CAAC,EAChC,EAAG,GAAI,EACT,CAAA,MAAS/Q,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,mCAAiCA,CAAK,CAAA,CACpD,MAAM,qEAA+D,EACvE,CACF,CAAA,CAEM2hB,EAAgB,IAAM,CACtBZ,CAAAA,CAAiB,OAAA,EAAWR,IAC9BQ,CAAAA,CAAiB,OAAA,CAAQ,IAAA,EAAK,CAC9BP,EAAe,KAAK,CAAA,CACpBU,GAAU,EAEd,CAAA,CAEMU,EAAkB,SAAY,CAIlC,GAHA9J,CAAAA,GACA2F,CAAAA,CAAgB,IAAI,CAAA,CAEhBkD,CAAAA,EAAc3H,EAChB,GAAI,CACF,MAAMnB,CAAAA,CAAW,CACf,QAAA,CACE8I,CAAAA,CAAW,QAAA,EAAY1L,CAAAA,CAAuB0L,EAAW,GAAA,EAAO,EAAE,CAAA,CACpE,OAAA,CAASA,EAAW,GACtB,CAAC,EACH,CAAA,MAASze,EAAK,CACZ,IAAMC,CAAAA,CACJD,CAAAA,YAAe,MACXA,CAAAA,CAAI,OAAA,CACJ,0DACNub,CAAAA,CAAgBtb,CAAO,EACvB,MACF,CAGEse,CAAAA,EAAYA,CAAAA,CAAS,WAAW,OAAO,CAAA,EACzC,GAAA,CAAI,eAAA,CAAgBA,CAAQ,CAAA,CAG9BC,CAAAA,CAAY,IAAI,CAAA,CAChBE,EAAc,IAAI,CAAA,CAClBE,CAAAA,CAAY,CAAC,EACb9Z,CAAAA,CAAS/S,CAAAA,CAAW,IAAA,CAAM,CACxB,eAAgB,IAAA,CAChB,WAAA,CAAa,IACf,CAAC,EACH,CAAA,CAEM0qB,CAAAA,CAAkB,IAAM,CACxBF,EAAS,OAAA,GACPA,CAAAA,CAAS,QAAQ,MAAA,CACnBA,CAAAA,CAAS,QAAQ,IAAA,EAAK,CAEtBA,CAAAA,CAAS,OAAA,CAAQ,OAAM,EAG7B,CAAA,CAEA,OACE7iB,GAAAA,CAACgI,EAAA,CAAiB,KAAA,CAAOrQ,CAAAA,CAAO,WAAA,CAAakQ,EAC3C,QAAA,CAAAH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YACZ,QAAA,CAAA,CAAA,CAACmd,CAAAA,EACA7kB,GAAAA,CAAC,KAAA,CAAA,CACC,UAAW+P,CAAAA,CACT,mGAAA,CACA4U,CAAAA,CACI,0BAAA,CACA,yDACJxd,CACF,CAAA,CAEA,QAAA,CAAAnH,GAAAA,CAAC,OAAI,SAAA,CAAU,iBAAA,CACb,SAAA0H,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,sCAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAAS2kB,CAAAA,CAAcoB,CAAAA,CAAgBJ,EACvC,SAAA,CAAW5V,CAAAA,CACT,8CAAA,CACA4U,CAAAA,CACI,sCACA,0CACN,CAAA,CACA,SAAUlJ,CAAAA,CAET,QAAA,CAAAkJ,EAAc3kB,GAAAA,CAACimB,GAAAA,CAAA,CAAI,IAAA,CAAM,GAAI,CAAA,CAAKjmB,GAAAA,CAACkmB,MAAAA,CAAA,CAAO,KAAM,EAAA,CAAI,CAAA,CACvD,CAAA,CAEAxe,IAAAA,CAAC,OACC,QAAA,CAAA,CAAA1H,GAAAA,CAAC,KAAE,SAAA,CAAU,0CAAA,CACV,SAAA2kB,CAAAA,CACG,4BAAA,CACA,8BAAA,CACN,CAAA,CACCA,GACC3kB,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,gCAAA,CACV,SAAAulB,CAAAA,CAAeN,CAAQ,CAAA,CAC1B,CAAA,CAED,CAACN,CAAAA,EACA3kB,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,wBAAwB,QAAA,CAAA,sCAAA,CAErC,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACF,EACF,CAAA,CAGD6kB,CAAAA,EACC7kB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,WAAA,CACb,QAAA,CAAA0H,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,kFAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8BACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAS+iB,CAAAA,CACT,SAAA,CAAU,iGAAA,CACV,SAAU,CAAC8B,CAAAA,CAEX,QAAA,CAAA7kB,GAAAA,CAACkjB,KAAA,CAAK,IAAA,CAAM,EAAA,CAAI,CAAA,CAClB,EACAljB,GAAAA,CAAC,OAAA,CAAA,CACC,GAAA,CAAK6iB,CAAAA,CACL,IAAKgC,CAAAA,EAAY,MAAA,CACjB,YAAA,CAAe9c,CAAAA,EAAM,CACnB,IAAMoe,CAAAA,CAAQpe,CAAAA,CAAE,aAAA,CACZoe,EAAM,QAAA,EACRjB,CAAAA,CAAYiB,EAAM,WAAW,EAEjC,EACF,CAAA,CACAnmB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oCACb,QAAA,CAAAulB,CAAAA,CAAeN,CAAQ,CAAA,CAC1B,GACF,CAAA,CACAvd,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BACZ,QAAA,CAAA,CAAA+T,CAAAA,EACCzb,GAAAA,CAACse,OAAAA,CAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,SAAA,CAAU,4BAAA,CAA6B,EAE5Dte,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAG,CAAQgmB,CAAAA,GAAgB,CAAA,CACpC,UAAU,sEAAA,CACV,QAAA,CAAUrK,EAET,QAAA,CAAAA,CAAAA,CACC3b,IAACse,OAAAA,CAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,UAAU,2BAAA,CAA4B,CAAA,CAEzDte,GAAAA,CAACue,MAAAA,CAAA,CAAO,IAAA,CAAM,EAAA,CAAI,SAAA,CAAU,cAAA,CAAe,EAE/C,CAAA,CAAA,CACF,CAAA,CAAA,CACF,EACF,CAAA,CAGDlB,CAAAA,EACCrd,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2EAAA,CACZ,QAAA,CAAAqd,EACH,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,CAAA,CAEO+I,GAAQ1B,EAAAA,CCzTf,IAAM2B,EAAAA,CAAsD,CAAC,CAC3D,KAAA,CAAA1uB,CAAAA,CACA,IAAA,CAAA2a,EACA,WAAA,CAAAzK,CAAAA,CAAc,IAAA,CACd,SAAA,CAAAV,EACA,YAAA,CAAA4O,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,QAAA,CAAA3K,CAAS,CAAA,CAAIxE,cAAAA,GACf,CAAC8V,CAAAA,CAAYC,CAAa,CAAA,CAAIhhB,SAAS,KAAK,CAAA,CAC5C,CAAC2qB,CAAAA,CAAkBC,CAAmB,CAAA,CAC1C5qB,QAAAA,CAAsC,IAAI,CAAA,CACtC,CAACkK,CAAAA,CAAcgc,CAAe,CAAA,CAAIlmB,QAAAA,CAAwB,IAAI,CAAA,CAC9DqhB,CAAAA,CAAejhB,MAAAA,CAAyB,IAAI,EAC5C1D,CAAAA,CAAYia,CAAAA,EAAQ3a,CAAAA,CAAM,SAAA,CAAU,UAAS,CAC7C2lB,CAAAA,CAAavhB,MAAAA,CAAO,KAAK,EACzB,CACJ,UAAA,CAAAigB,EACA,UAAA,CAAAC,CAAAA,CACA,YAAAR,CAAAA,CACA,UAAA,CAAAE,CAAAA,CACA,KAAA,CAAOuB,EACP,UAAA,CAAAhB,CAAAA,CACA,gBAAA,CAAAiB,CAAAA,CACA,iBAAAC,CACF,CAAA,CAAI7B,EAAAA,CAAqB5jB,CAAAA,CAAM,kBAAkB,CAAA,CAE3C0lB,CAAAA,CAAiBxX,CAAAA,EAAgBqX,CAAAA,EAAe,KAEtDhR,SAAAA,CAAU,IAAM,CACV,OAAO6J,GAAiB,QAAA,EAAYA,CAAAA,CAAa,IAAA,EAAK,CAAE,OAAS,CAAA,GACnEwQ,CAAAA,CAAoB,CAClB,GAAA,CAAKxQ,EACL,IAAA,CAAMsD,CAAAA,CAAuBtD,CAAY,CAAA,EAAKA,CAAAA,CAC9C,eAAgBsD,CAAAA,CAAuBtD,CAAY,CAAA,EAAK,MAC1D,CAAC,CAAA,CACIuH,CAAAA,CAAW,OAAA,GACdlS,CAAAA,CAAS/S,EAAW0d,CAAAA,CAAc,CAChC,cAAA,CAAgB,KAAA,CAChB,YAAa,KACf,CAAC,EACDuH,CAAAA,CAAW,OAAA,CAAU,OAG3B,CAAA,CAAG,CAACvH,CAAAA,CAAc1d,CAAAA,CAAW+S,CAAQ,CAAC,CAAA,CAEtC,IAAMgR,CAAAA,CAAkBC,GAAkB,CACxC,GAAIA,CAAAA,GAAU,CAAA,CAAG,OAAO,SAAA,CACxB,IAAMxjB,EAAI,IAAA,CACJyjB,CAAAA,CAAQ,CAAC,OAAA,CAAS,IAAA,CAAM,IAAA,CAAM,IAAI,EAClC5hB,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI2hB,CAAK,CAAA,CAAI,IAAA,CAAK,GAAA,CAAIxjB,CAAC,CAAC,CAAA,CAClD,OAAO,UAAA,CAAA,CAAYwjB,EAAQ,IAAA,CAAK,GAAA,CAAIxjB,CAAAA,CAAG6B,CAAC,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAI,IAAM4hB,CAAAA,CAAM5hB,CAAC,CACxE,CAAA,CAEM6hB,EAAe8H,CAAAA,EAAqB,CAExC,OADkBA,CAAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,EAAG,WAAA,IAE3C,KAAK,KAAA,CACL,KAAK,OACH,OAAO,WAAA,CACT,KAAK,KAAA,CACL,KAAK,MAAA,CACH,OAAO,WAAA,CACT,KAAK,MACL,KAAK,MAAA,CACH,OAAO,WAAA,CACT,QACE,OAAO,WACX,CACF,CAAA,CAEMzG,EAAc7V,CAAAA,EAAuB,CACzCA,CAAAA,CAAE,cAAA,GACFA,CAAAA,CAAE,eAAA,GACF4U,CAAAA,CAAc5U,CAAAA,CAAE,OAAS,WAAA,EAAeA,CAAAA,CAAE,IAAA,GAAS,UAAU,EAC/D,CAAA,CAEM8V,CAAAA,CAAc9V,CAAAA,EAAuB,CACzCA,EAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,eAAA,GACF4U,CAAAA,CAAc,KAAK,CAAA,CACf5U,CAAAA,CAAE,aAAa,KAAA,EAASA,CAAAA,CAAE,YAAA,CAAa,KAAA,CAAM,OAAS,CAAA,EACnD+Z,CAAAA,CAAW/Z,CAAAA,CAAE,YAAA,CAAa,MAAM,CAAC,CAAC,EAE3C,CAAA,CAEM+Z,EAAa,MAAOrH,CAAAA,EAAe,CACvC,GAAI,CAAC0C,EAAkB,CACrB0E,CAAAA,CACE,sEACF,CAAA,CACA,MACF,CAEA3F,CAAAA,EAAW,CACX2F,CAAAA,CAAgB,IAAI,CAAA,CAEpB,GAAI,CACF,IAAM1hB,EAAS,MAAM6b,CAAAA,CAAW,CAAE,IAAA,CAAAvB,CAAK,CAAC,CAAA,CACxC8L,CAAAA,CAAoB,CAClB,GAAA,CAAKpmB,EAAO,GAAA,CACZ,IAAA,CACEA,CAAAA,CAAO,YAAA,EACPA,EAAO,QAAA,EACPkZ,CAAAA,CAAuBlZ,CAAAA,CAAO,GAAG,GACjCsa,CAAAA,CAAK,IAAA,CACP,KAAMA,CAAAA,CAAK,IAAA,CACX,KAAMA,CAAAA,CAAK,IAAA,CACX,cAAA,CAAgBta,CAAAA,CAAO,UAAYkZ,CAAAA,CAAuBlZ,CAAAA,CAAO,GAAG,CACtE,CAAC,CAAA,CACDiL,CAAAA,CAAS/S,CAAAA,CAAW8H,CAAAA,CAAO,IAAK,CAC9B,cAAA,CAAgB,CAAA,CAAA,CAChB,WAAA,CAAa,EACf,CAAC,EACH,CAAA,MAASmG,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CACJD,CAAAA,YAAe,KAAA,CAAQA,EAAI,OAAA,CAAU,mCAAA,CACvCub,CAAAA,CAAgBtb,CAAO,EACzB,CACF,CAAA,CAEM2S,EAAqBnR,CAAAA,EAA2C,CAChEA,EAAE,MAAA,CAAO,KAAA,EAASA,CAAAA,CAAE,MAAA,CAAO,MAAM,MAAA,CAAS,CAAA,EACvC+Z,CAAAA,CAAW/Z,CAAAA,CAAE,OAAO,KAAA,CAAM,CAAC,CAAC,EAErC,EAEMye,CAAAA,CAAiB,SAAY,CAIjC,GAHAtK,GAAW,CACX2F,CAAAA,CAAgB,IAAI,CAAA,CAEhByE,GAAoBlJ,CAAAA,CACtB,GAAI,CACF,MAAMnB,EAAW,CACf,QAAA,CACEqK,CAAAA,CAAiB,cAAA,EACjBjN,EAAuBiN,CAAAA,CAAiB,GAAA,EAAO,EAAE,CAAA,EACjD,KAAA,CAAA,CACF,QAASA,CAAAA,CAAiB,GAC5B,CAAC,EACH,OAAShgB,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CACJD,aAAe,KAAA,CACXA,CAAAA,CAAI,OAAA,CACJ,gDAAA,CACNub,EAAgBtb,CAAO,CAAA,CACvB,MACF,CAGFggB,EAAoB,IAAI,CAAA,CACxBnb,CAAAA,CAAS/S,CAAAA,CAAW,KAAM,CACxB,cAAA,CAAgB,IAAA,CAChB,WAAA,CAAa,IACf,CAAC,CAAA,CACG2kB,CAAAA,CAAa,OAAA,GACfA,EAAa,OAAA,CAAQ,KAAA,CAAQ,IAEjC,CAAA,CAEA,OACEhd,IAACgI,CAAAA,CAAA,CAAiB,KAAA,CAAOrQ,CAAAA,CAAO,YAAakQ,CAAAA,CAC3C,QAAA,CAAAH,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,WAAA,CAEZ,QAAA,CAAA,CAAA,CAAC4e,CAAAA,EACA5e,IAAAA,CAAC,OACC,SAAA,CAAWqI,CAAAA,CACT,oGACA2M,CAAAA,CACI,yCAAA,CACA,yDACJvV,CAAAA,CACAsU,CAAAA,EAAe,gCACjB,CAAA,CACA,YAAamC,CAAAA,CACb,WAAA,CAAaA,CAAAA,CACb,UAAA,CAAYA,EACZ,MAAA,CAAQC,CAAAA,CACR,OAAA,CAAS,IAAMb,EAAa,OAAA,EAAS,KAAA,GAErC,QAAA,CAAA,CAAAhd,GAAAA,CAAC,SACC,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,4CAAA,CACP,IAAKgd,CAAAA,CACL,QAAA,CAAU9D,CAAAA,CACV,SAAA,CAAU,SACZ,CAAA,CAEAlZ,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBACb,QAAA,CAAA0H,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uCACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW+P,EACT,6BAAA,CACA2M,CAAAA,CACI,wBAAA,CACA,6CACN,EAEA,QAAA,CAAA1c,GAAAA,CAACoe,WAAAA,CAAA,CAAY,KAAM,EAAA,CAAI,CAAA,CACzB,EAEA1W,IAAAA,CAAC,KAAA,CAAA,CACC,UAAA1H,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,0CAAA,CACV,SAAA0c,CAAAA,CACG,+BAAA,CACA,mCAAA,CACN,CAAA,CACAhV,KAAC,GAAA,CAAA,CAAE,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,CAAA,IAAA,CAChC,IACH1H,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,2CAAA,CAA4C,QAAA,CAAA,wBAAA,CAE5D,GACF,CAAA,CACAA,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,6BAA6B,QAAA,CAAA,yDAAA,CAE1C,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,GACF,CAAA,CAIDsmB,CAAAA,EACC5e,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,oHAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8BACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WACZ,QAAA,CAAAuc,CAAAA,CAAY+J,CAAAA,CAAiB,IAAI,EACpC,CAAA,CACA5e,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iBACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,qCACV,QAAA,CAAAsmB,CAAAA,CAAiB,IAAA,CACpB,CAAA,CACCA,EAAiB,IAAA,EAChBtmB,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,wBACV,QAAA,CAAAoc,CAAAA,CAAekK,CAAAA,CAAiB,IAAI,EACvC,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,EACA5e,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,yBAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAAS,IAAM,MAAA,CAAO,KAAKsmB,CAAAA,CAAiB,GAAA,CAAK,QAAQ,CAAA,CACzD,UAAU,qDAAA,CAEV,QAAA,CAAAtmB,IAACqe,YAAAA,CAAA,CAAa,KAAM,EAAA,CAAI,SAAA,CAAU,eAAA,CAAgB,CAAA,CACpD,EACAre,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAG,CAAQwmB,CAAAA,GAAe,CAAA,CACnC,UAAU,yEAAA,CACV,QAAA,CAAU7K,EAET,QAAA,CAAAA,CAAAA,CACC3b,IAACse,OAAAA,CAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,UAAU,2BAAA,CAA4B,CAAA,CAEzDte,GAAAA,CAACue,MAAAA,CAAA,CAAO,IAAA,CAAM,EAAA,CAAI,SAAA,CAAU,cAAA,CAAe,EAE/C,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGDlB,CAAAA,EACCrd,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2EAAA,CACZ,QAAA,CAAAqd,EACH,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,CAAA,CAEOoJ,GAAQJ,EAAAA,CCnRf,IAAMK,EAAAA,CAAkD,CAAC,CACvD,KAAA,CAAA/uB,CAAAA,CACA,IAAA,CAAA2a,CAAAA,CACA,YAAAzK,CAAAA,CAAc,IAAA,CACd,SAAA,CAAAV,CAAAA,CACA,aAAA4O,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,QAAA,CAAA3K,CAAS,CAAA,CAAIxE,cAAAA,GACfvO,CAAAA,CAAYia,CAAAA,EAAQ3a,CAAAA,CAAM,SAAA,CAAU,UAAS,CAE7CgvB,CAAAA,CAASC,SAAAA,CAAU,CACvB,WAAY,CACVC,EAAAA,CAAW,UAAU,CACnB,OAAA,CAAS,CACP,MAAA,CAAQ,CAAC,CAAA,CAAG,CAAA,CAAG,CAAC,CAClB,CACF,CAAC,CAAA,CACDC,GAAM,SAAA,CAAU,CACd,MAAA,CAAQ,IAAA,CACR,YAAa,IACf,CAAC,EACDC,EAAAA,CAAK,SAAA,CAAU,CACb,WAAA,CAAa,KAAA,CACb,cAAA,CAAgB,CACd,OAAQ,QAAA,CACR,GAAA,CAAK,qBACP,CACF,CAAC,CAAA,CACDC,EAAAA,CAAY,SAAA,CAAU,CACpB,YAAa,gEACf,CAAC,CACH,CAAA,CACA,OAAA,CAASjR,GAAgB,EAAA,CACzB,QAAA,CAAU,CAAC,CAAE,OAAA4Q,CAAO,CAAA,GAAM,CACxB,IAAMM,EAAON,CAAAA,CAAO,OAAA,EAAQ,CAC5Bvb,CAAAA,CAAS/S,EAAW4uB,CAAAA,CAAM,CACxB,cAAA,CAAgB,IAAA,CAChB,YAAa,IACf,CAAC,EACH,CACF,CAAC,CAAA,CAEKC,CAAAA,CAAWtlB,WAAAA,CAAY,IAAM,CACjC,IAAMyB,CAAAA,CAAM,MAAA,CAAO,MAAA,CAAO,0BAA4B,CAAA,CAClDA,CAAAA,EAAOsjB,GACTA,CAAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,QAAA,CAAS,CAAE,IAAKtjB,CAAI,CAAC,CAAA,CAAE,GAAA,GAElD,CAAA,CAAG,CAACsjB,CAAM,CAAC,EAELQ,CAAAA,CAAUvlB,WAAAA,CAAY,IAAM,CAChC,GAAI,CAAC+kB,CAAAA,CAAQ,OAEb,IAAMS,EAAcT,CAAAA,CAAO,aAAA,CAAc,MAAM,CAAA,CAAE,KAC3CtjB,CAAAA,CAAM,MAAA,CAAO,MAAA,CAAO,cAAA,CAAgB+jB,CAAW,CAAA,CAErD,GAAI/jB,IAAQ,IAAA,CAIZ,CAAA,GAAIA,IAAQ,EAAA,CAAI,CACdsjB,CAAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,eAAA,CAAgB,MAAM,EAAE,SAAA,EAAU,CAAE,GAAA,EAAI,CAC/D,MACF,CAEAA,CAAAA,CAAO,KAAA,EAAM,CAAE,OAAM,CAAE,eAAA,CAAgB,MAAM,CAAA,CAAE,QAAQ,CAAE,IAAA,CAAMtjB,CAAI,CAAC,EAAE,GAAA,GAAI,CAC5E,CAAA,CAAG,CAACsjB,CAAM,CAAC,CAAA,CAEX,OAAKA,CAAAA,CAKH3mB,GAAAA,CAACgI,EAAA,CAAiB,KAAA,CAAOrQ,CAAAA,CAAO,WAAA,CAAakQ,EAC3C,QAAA,CAAAH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW,gEAAgEP,CAAAA,EAAa,EAAE,CAAA,CAAA,CAE7F,QAAA,CAAA,CAAAO,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gFAEb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAM2mB,EAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,YAAW,CAAE,GAAA,EAAI,CACvD,SAAA,CAAW,mDACTA,CAAAA,CAAO,QAAA,CAAS,MAAM,CAAA,CAAI,2BAAA,CAA8B,eAC1D,CAAA,CAAA,CAEA,QAAA,CAAA3mB,GAAAA,CAACqnB,IAAAA,CAAA,CAAK,IAAA,CAAM,EAAA,CAAI,CAAA,CAClB,CAAA,CAGArnB,IAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAM2mB,CAAAA,CAAO,KAAA,EAAM,CAAE,KAAA,GAAQ,YAAA,EAAa,CAAE,GAAA,EAAI,CACzD,UAAW,CAAA,gDAAA,EACTA,CAAAA,CAAO,QAAA,CAAS,QAAQ,EAAI,2BAAA,CAA8B,eAC5D,CAAA,CAAA,CAEA,QAAA,CAAA3mB,IAACsnB,MAAAA,CAAA,CAAO,KAAM,EAAA,CAAI,CAAA,CACpB,EAGAtnB,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAM2mB,CAAAA,CAAO,KAAA,EAAM,CAAE,OAAM,CAAE,YAAA,EAAa,CAAE,GAAA,GACrD,SAAA,CAAW,CAAA,gDAAA,EACTA,CAAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,CAAI,2BAAA,CAA8B,eAC5D,CAAA,CAAA,CAEA,SAAA3mB,GAAAA,CAACunB,SAAAA,CAAA,CAAU,IAAA,CAAM,GAAI,CAAA,CACvB,CAAA,CAGAvnB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,2BAAA,CAA4B,CAAA,CAG3CA,IAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAS,IAAM2mB,CAAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,aAAA,CAAc,CAAE,MAAO,CAAE,CAAC,CAAA,CAAE,GAAA,GAClE,SAAA,CAAW,CAAA,gDAAA,EACTA,CAAAA,CAAO,QAAA,CAAS,UAAW,CAAE,KAAA,CAAO,CAAE,CAAC,EAAI,2BAAA,CAA8B,eAC3E,CAAA,CAAA,CAEA,QAAA,CAAA3mB,IAACwnB,QAAAA,CAAA,CAAS,IAAA,CAAM,EAAA,CAAI,EACtB,CAAA,CAEAxnB,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAM2mB,CAAAA,CAAO,KAAA,EAAM,CAAE,OAAM,CAAE,aAAA,CAAc,CAAE,KAAA,CAAO,CAAE,CAAC,CAAA,CAAE,GAAA,EAAI,CACtE,UAAW,CAAA,gDAAA,EACTA,CAAAA,CAAO,SAAS,SAAA,CAAW,CAAE,MAAO,CAAE,CAAC,CAAA,CAAI,2BAAA,CAA8B,eAC3E,CAAA,CAAA,CAEA,QAAA,CAAA3mB,GAAAA,CAACynB,QAAAA,CAAA,CAAS,IAAA,CAAM,EAAA,CAAI,CAAA,CACtB,CAAA,CAGAznB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAA4B,CAAA,CAG3CA,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAM2mB,EAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,kBAAiB,CAAE,GAAA,EAAI,CAC7D,SAAA,CAAW,mDACTA,CAAAA,CAAO,QAAA,CAAS,YAAY,CAAA,CAAI,4BAA8B,eAChE,CAAA,CAAA,CAEA,QAAA,CAAA3mB,GAAAA,CAAC0nB,KAAA,CAAK,IAAA,CAAM,EAAA,CAAI,CAAA,CAClB,EAEA1nB,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAM2mB,CAAAA,CAAO,OAAM,CAAE,KAAA,GAAQ,iBAAA,EAAkB,CAAE,GAAA,EAAI,CAC9D,UAAW,CAAA,gDAAA,EACTA,CAAAA,CAAO,QAAA,CAAS,aAAa,EAAI,2BAAA,CAA8B,eACjE,CAAA,CAAA,CAEA,QAAA,CAAA3mB,IAAC2nB,WAAAA,CAAA,CAAY,IAAA,CAAM,EAAA,CAAI,EACzB,CAAA,CAGA3nB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAA4B,CAAA,CAG3CA,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAASmnB,CAAAA,CACT,SAAA,CAAW,CAAA,gDAAA,EACTR,EAAO,QAAA,CAAS,MAAM,EAAI,2BAAA,CAA8B,eAC1D,GAEA,QAAA,CAAA3mB,GAAAA,CAAC4nB,IAAAA,CAAA,CAAS,KAAM,EAAA,CAAI,CAAA,CACtB,CAAA,CAGA5nB,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASknB,CAAAA,CACT,UAAU,+DAAA,CAEV,QAAA,CAAAlnB,GAAAA,CAAC6nB,KAAAA,CAAA,CAAU,IAAA,CAAM,EAAA,CAAI,CAAA,CACvB,CAAA,CAAA,CACF,EAGA7nB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,SAAAA,GAAAA,CAAC8nB,aAAAA,CAAA,CACC,MAAA,CAAQnB,EACR,SAAA,CAAU,gGAAA,CACZ,EACF,CAAA,CAAA,CACF,CAAA,CACF,EAzHO,IA2HX,CAAA,CAEOoB,EAAAA,CAAQrB,EAAAA,CCnLf,IAAMsB,EAAAA,CAA8C,CAAC,CACnD,KAAA,CAAArwB,EACA,WAAA,CAAAkQ,CAAAA,CAAc,KACd,SAAA,CAAAV,CAAAA,CAAY,EAAA,CACZ,IAAA,CAAAmL,EACA,UAAA,CAAAtN,CAAAA,CACA,WAAA,CAAAvK,CAAAA,CAAc,EAAC,CACf,mBAAA,CAAAmK,CAAAA,CAAsB,CAAA,CACtB,mBAAAqjB,CAAAA,CAAqB,KAAA,CACrB,cAAAC,CAAAA,CAAgB,KAAA,CAChB,aAAAC,CAAAA,CAAe,CAAA,CACf,WAAA,CAAAC,CAAAA,CACA,WAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,6BAAA,CAAAhR,CACF,CAAA,GAAM,CACJ,IAAMiR,CAAAA,CAAWjW,GAAQ3a,CAAAA,CAAM,SAAA,CACzBoe,CAAAA,CAAe/Q,CAAAA,GAAaujB,CAAQ,CAAA,CAGpCC,CAAAA,CAAuB,IACtBP,CAAAA,CAGHjoB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACZ,QAAA,CAAA,CAACkoB,GAAiBC,CAAAA,CAAe,CAAA,CAEhCnoB,GAAAA,CAACgS,EAAAA,CAAA,CAAc,OAAA,CAAQ,8CAAA,CACrB,SAAAtK,IAAAA,CAACoK,EAAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAW,EAAA,CACX,QAAU/J,CAAAA,EAAM,CACdA,CAAAA,CAAE,cAAA,GACFA,CAAAA,CAAE,eAAA,EAAgB,CAClBqgB,CAAAA,KACF,CAAA,CACD,QAAA,CAAA,CAAA,SAAA,CAECpoB,GAAAA,CAACyoB,UAAAA,CAAA,CAAW,IAAA,CAAM,EAAA,CAAI,CAAA,CAAA,CACxB,CAAA,CACF,EACEP,CAAAA,CAEFxgB,IAAAA,CAAAH,QAAAA,CAAA,CACE,UAAAvH,GAAAA,CAACgS,EAAAA,CAAA,CAAc,OAAA,CAAQ,oCACrB,QAAA,CAAAhS,GAAAA,CAAC8R,GAAA,CACC,IAAA,CAAK,SACL,SAAA,CAAW,EAAA,CACX,OAAA,CAAU/J,CAAAA,EAAM,CACdA,CAAAA,CAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,iBAAgB,CAClBsgB,CAAAA,KACF,CAAA,CAEA,SAAAroB,GAAAA,CAAC0oB,IAAAA,CAAA,CAAK,IAAA,CAAM,GAAI,CAAA,CAClB,CAAA,CACF,CAAA,CACA1oB,GAAAA,CAACgS,GAAA,CAAc,OAAA,CAAQ,sCAAA,CACrB,QAAA,CAAAhS,IAAC8R,EAAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,UAAW,EAAA,CACX,OAAA,CAAU/J,GAAM,CACdA,CAAAA,CAAE,gBAAe,CACjBA,CAAAA,CAAE,eAAA,EAAgB,CAClBugB,MACF,CAAA,CAEA,QAAA,CAAAtoB,GAAAA,CAACuf,IAAA,CAAI,IAAA,CAAM,EAAA,CAAI,CAAA,CACjB,EACF,CAAA,CAAA,CACF,CAAA,CACE,KACN,CAAA,CAnD8B,IAAA,CAsRlC,OACE7X,IAAAA,CAAC,KAAA,CAAA,CAIE,QAAA,CAAA,CAAA,CAlOe,IAAM,CACxB,OAAQ/P,CAAAA,CAAM,SAAA,EACZ,KAAK,MAAA,CACH,OACEqI,GAAAA,CAACuhB,EAAAA,CAAA,CACC,KAAA,CAAO5pB,CAAAA,CACP,YAAakQ,CAAAA,CACb,SAAA,CAAWV,EACX,IAAA,CAAMmL,CAAAA,CACN,YAAA,CAAcyD,CAAAA,CACd,YAAatb,CAAAA,CACb,mBAAA,CAAqBmK,CAAAA,CACvB,CAAA,CAGJ,KAAK,UAAA,CACH,OACE5E,GAAAA,CAACkgB,EAAAA,CAAA,CACC,KAAA,CAAOvoB,CAAAA,CACP,WAAA,CAAakQ,CAAAA,CACb,UAAWV,CAAAA,CACX,IAAA,CAAMmL,CAAAA,CACN,YAAA,CAAcyD,EAChB,CAAA,CAGJ,KAAK,UAAA,CACH,OACE/V,IAACwf,EAAAA,CAAA,CACC,KAAA,CAAO7nB,CAAAA,CACP,YAAakQ,CAAAA,CACb,SAAA,CAAWV,EACX,IAAA,CAAMmL,CAAAA,CACN,aAAcyD,CAAAA,CAChB,CAAA,CAGJ,KAAK,QAAA,CACH,OACE/V,GAAAA,CAACkf,EAAAA,CAAA,CACC,KAAA,CAAOvnB,EACP,WAAA,CAAakQ,CAAAA,CACb,SAAA,CAAWV,CAAAA,CACX,KAAMmL,CAAAA,CACN,YAAA,CAAcyD,CAAAA,CAChB,CAAA,CAGJ,KAAK,OAAA,CACH,OACE/V,GAAAA,CAAC8f,EAAAA,CAAA,CACC,KAAA,CAAOnoB,CAAAA,CACP,WAAA,CAAakQ,CAAAA,CACb,UAAWV,CAAAA,CACX,IAAA,CAAMmL,CAAAA,CACN,YAAA,CAAcyD,EAChB,CAAA,CAGJ,KAAK,WACH,OACE/V,GAAAA,CAACsT,GAAA,CACC,KAAA,CAAO,CACL,GAAI3b,EACJ,aAAA,CAAgBA,CAAAA,CAAc,aAAA,EAAiB,EACjD,CAAA,CACA,WAAA,CAAakQ,CAAAA,CACb,SAAA,CAAWV,EACX,IAAA,CAAMmL,CAAAA,CACN,YAAA,CAAcyD,CAAAA,CAChB,EAGJ,KAAK,MAAA,CACH,OACE/V,GAAAA,CAAC0S,GAAA,CACC,KAAA,CAAO/a,CAAAA,CACP,WAAA,CAAakQ,EACb,SAAA,CAAWV,CAAAA,CACX,IAAA,CAAMmL,CAAAA,CACN,aAAcyD,CAAAA,CAChB,CAAA,CAGJ,KAAK,UAAA,CAWH,OACE/V,IAACoZ,EAAAA,CAAA,CACC,KAAA,CAAO,CACL,GAAIzhB,CAAAA,CACJ,aAAA,CAAgBA,CAAAA,CAAc,aAAA,EAAiB,EAEjD,CAAA,CACA,WAAA,CAAakQ,CAAAA,CACb,UAAWV,CAAAA,CACX,IAAA,CAAMmL,EACN,YAAA,CAAcyD,CAAAA,CACd,8BAA+BuB,CAAAA,CACjC,CAAA,CAGJ,KAAK,MAAA,CACH,OACEtX,GAAAA,CAACwe,EAAAA,CAAA,CACC,KAAA,CAAO7mB,EACP,WAAA,CAAakQ,CAAAA,CACb,SAAA,CAAWV,CAAAA,CACX,KAAMmL,CAAAA,CACN,YAAA,CAAcyD,EAChB,CAAA,CAGJ,KAAK,OACH,OACE/V,GAAAA,CAACyW,EAAAA,CAAA,CACC,MAAO9e,CAAAA,CACP,WAAA,CAAakQ,CAAAA,CACb,SAAA,CAAWV,EACX,IAAA,CAAMmL,CAAAA,CACN,YAAA,CAAcyD,CAAAA,CAChB,EAIJ,KAAK,OAAA,CACH,OACE/V,GAAAA,CAACiiB,GAAA,CACC,KAAA,CAAOtqB,CAAAA,CACP,WAAA,CAAakQ,EACb,SAAA,CAAWV,CAAAA,CACX,IAAA,CAAMmL,CAAAA,CACN,aAAcyD,CAAAA,CAChB,CAAA,CAGJ,KAAK,OAAA,CACH,OACE/V,GAAAA,CAACuiB,EAAAA,CAAA,CACC,KAAA,CAAO5qB,CAAAA,CACP,YAAakQ,CAAAA,CACb,SAAA,CAAWV,CAAAA,CACX,IAAA,CAAMmL,EACN,YAAA,CAAcyD,CAAAA,CAChB,CAAA,CAGJ,KAAK,QACH,OACE/V,GAAAA,CAACmjB,EAAAA,CAAA,CACC,MAAOxrB,CAAAA,CACP,WAAA,CAAakQ,CAAAA,CACb,SAAA,CAAWV,EACX,IAAA,CAAMmL,CAAAA,CACN,YAAA,CAAcyD,CAAAA,CAChB,EAGJ,KAAK,KAAA,CACH,OACE/V,GAAAA,CAACykB,GAAA,CACC,KAAA,CAAO9sB,CAAAA,CACP,WAAA,CAAakQ,EACb,SAAA,CAAWV,CAAAA,CACX,KAAMmL,CAAAA,CACN,YAAA,CAAcyD,EAChB,CAAA,CAGJ,KAAK,OAAA,CACH,OACE/V,IAAComB,EAAAA,CAAA,CACC,KAAA,CAAOzuB,CAAAA,CACP,YAAakQ,CAAAA,CACb,SAAA,CAAWV,CAAAA,CACX,IAAA,CAAMmL,EACN,YAAA,CAAcyD,CAAAA,CAChB,CAAA,CAGJ,KAAK,WACH,OACE/V,GAAAA,CAACymB,EAAAA,CAAA,CACC,MAAO9uB,CAAAA,CACP,WAAA,CAAakQ,CAAAA,CACb,SAAA,CAAWV,EACX,IAAA,CAAMmL,CAAAA,CACN,YAAA,CAAcyD,CAAAA,CAChB,EAGJ,KAAK,kBAAA,CACH,OACE/V,GAAAA,CAAC+nB,EAAAA,CAAA,CACC,KAAA,CAAOpwB,CAAAA,CACP,WAAA,CAAakQ,CAAAA,CACb,UAAWV,CAAAA,CACX,IAAA,CAAMmL,CAAAA,CACN,YAAA,CAAcyD,EAChB,CAAA,CAGJ,QACE,OACErO,IAAAA,CAAC,OAAI,SAAA,CAAU,4BAAA,CAA6B,qCACrB1H,GAAAA,CAAC,MAAA,CAAA,CAAM,SAAArI,CAAAA,CAAM,SAAA,CAAU,CAAA,CAAA,CAC9C,CAEN,CACF,CAAA,GASiB,CAEZ6wB,CAAAA,EAAqB,CAAA,CACxB,CAEJ,CAAA,CAEOG,EAAAA,CAAQX,EAAAA,CC1Vf,IAAMY,EAAAA,CAA0C,CAAC,CAC/C,UAAA,CAAAC,CAAAA,CACA,aAAA,CAAAX,CAAAA,CACA,UAAA7vB,CAAAA,CACA,YAAA,CAAA8vB,CAAAA,CACA,OAAA,CAAAW,EACA,WAAA,CAAAC,CAAAA,CACA,cAAAC,CACF,CAAA,GAAM,CACJ,IAAMC,CAAAA,CAAU,IACVJ,CAAAA,CAAmB7oB,IAACuf,GAAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CAAwB,EAC1D2I,CAAAA,CAAsBloB,GAAAA,CAAC0oB,IAAAA,CAAA,CAAK,UAAU,uBAAA,CAAwB,CAAA,CAC3D1oB,GAAAA,CAACkpB,IAAAA,CAAA,CAAK,SAAA,CAAU,uBAAA,CAAwB,CAAA,CAG3CC,CAAAA,CAAW,IACXN,CAAAA,CAAmB,eAAA,CACnBX,CAAAA,CAAsB,UAAA,CACnB,UAGT,OACExgB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qEACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,OAAI,SAAA,CAAU,mCAAA,CACb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CACb,UAAA1H,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qCAAA,CACZ,SAAAipB,CAAAA,EAAQ,CACX,CAAA,CACAvhB,IAAAA,CAAC,OACC,QAAA,CAAA,CAAAA,IAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,+BACX,QAAA,CAAA,CAAAyhB,CAAAA,EAAS,CAAE,GAAA,CAAE9wB,GAChB,CAAA,CACAqP,IAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,mCACV,QAAA,CAAA,CAAAygB,CAAAA,CAAa,WAAA,CAAOA,CAAAA,CAAe,EAAI,GAAA,CAAM,EAAA,CAAG,SAAIU,CAAAA,CAAa,YAAA,CAAe,gBACnF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACA7oB,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS8oB,CAAAA,CACT,UAAU,6DAAA,CAEV,QAAA,CAAA9oB,GAAAA,CAACopB,CAAAA,CAAA,CAAE,SAAA,CAAU,uBAAA,CAAwB,EACvC,CAAA,CAAA,CACF,CAAA,CAEA1hB,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,QAAA,CAAA,CAAAA,KAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASqhB,EACT,SAAA,CAAU,wHAAA,CAEV,QAAA,CAAA,CAAA/oB,GAAAA,CAACwW,YAAA,CAAY,SAAA,CAAU,UAAU,CAAA,CACjCxW,GAAAA,CAAC,QAAK,QAAA,CAAA,aAAA,CAAW,CAAA,CAAA,CACnB,CAAA,CACA0H,IAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASshB,CAAAA,CACT,UAAU,wHAAA,CAEV,QAAA,CAAA,CAAAhpB,GAAAA,CAACqpB,SAAAA,CAAA,CAAU,SAAA,CAAU,SAAA,CAAU,CAAA,CAC/BrpB,GAAAA,CAAC,QAAK,QAAA,CAAA,aAAA,CAAW,CAAA,CAAA,CACnB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAAA,CAGOspB,EAAAA,CAAQV,EAAAA,CCzER,IAAMW,EAAAA,CAAoB,CAC/BrtB,EACA2L,CAAAA,CAAsB,IAAA,GACQ,CAC9B,GAAM,CAAE,KAAA,CAAAsD,CAAAA,CAAO,QAAA,CAAAC,CAAS,EAAIxE,cAAAA,EAAe,CAGrC5B,CAAAA,CAAamG,CAAAA,GAGbqe,CAAAA,CAAiBptB,OAAAA,CAAQ,IACtBF,CAAAA,CAAO,OAAOvE,CAAAA,EAAAA,CAClBA,CAAAA,CAAM,YAAc,UAAA,EACpBA,CAAAA,CAAM,YAAc,OAAA,EACpBA,CAAAA,CAAM,SAAA,GAAc,UAAA,GACrBA,EAAM,aAAA,EAAe,IAAA,CAAK8gB,CAAAA,EAAO,CAC/B,IAAMxF,CAAAA,CAAc,OAAOwF,CAAAA,CAAI,KAAA,EAAU,SAAWA,CAAAA,CAAI,KAAA,CAAQ,MAAA,CAAOA,CAAAA,CAAI,KAAK,CAAA,CAChF,OAAOxF,CAAAA,GAAgB,OAAA,EAAWA,IAAgB,QACpD,CAAC,CACH,CAAA,CACC,CAAC/W,CAAM,CAAC,CAAA,CAGLutB,CAAAA,CAAkBrtB,QAAQ,IAAM,CACpC,IAAMstB,CAAAA,CAA6C,GAEnD,OAAAF,CAAAA,CAAe,OAAA,CAAQG,CAAAA,EAAe,CACpC,IAAMC,CAAAA,CAAkBD,CAAAA,CAAY,SAAA,CAC9BE,EAAc7kB,CAAAA,CAAW4kB,CAAe,CAAA,CACxCE,CAAAA,CAAiB,SAASF,CAAe,CAAA,CAAA,CAG3CG,EAAuB,KAAA,CAY3B,GAVIJ,EAAY,SAAA,GAAc,UAAA,CAExB,KAAA,CAAM,OAAA,CAAQE,CAAW,CAAA,GAC3BE,CAAAA,CAAuBF,CAAAA,CAAY,QAAA,CAAS,OAAO,CAAA,EAAKA,CAAAA,CAAY,QAAA,CAAS,QAAQ,GAIvFE,CAAAA,CAAuBF,CAAAA,GAAgB,SAAWA,CAAAA,GAAgB,QAAA,CAGhEE,EAAsB,CAExB,IAAMC,CAAAA,CAAcpiB,CAAAA,CAAiB+hB,EAAY,KAAA,CAAO9hB,CAAW,CAAA,CAC7DoiB,CAAAA,CAAa,OAAON,CAAAA,CAAY,KAAA,EAAU,QAAA,CAC5C,CAAA,MAAA,EAASK,CAAW,CAAA,CAAA,CACpB,MAAA,CAAO,IAAA,CAAKL,CAAAA,CAAY,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC1wB,CAAAA,CAAK4c,KAC1C5c,CAAAA,CAAI4c,CAAI,CAAA,CAAI,CAAA,MAAA,EAASjO,EAAiB+hB,CAAAA,CAAY,KAAA,CAAO9T,CAAI,CAAC,GACvD5c,CAAAA,CAAAA,CACN,EAAgC,CAAA,CAGjCixB,CAAAA,CAAgC,EAAC,CAChBP,CAAAA,CAAY,WAAA,EAAa,IAAA,CAC9C7wB,GAAKA,CAAAA,CAAE,cAAA,GAAmB,UAC5B,CAAA,EAGEoxB,EAAY,IAAA,CAAK,CACf,cAAA,CAAgB,UAAA,CAChB,OAAQ,kCACV,CAAC,CAAA,CAIH,IAAMC,EAAwB,CAC5B,WAAA,CAAa,CAAA,MAAA,EAASR,CAAAA,CAAY,WAAW,CAAA,CAAA,CAC7C,SAAA,CAAWG,CAAAA,CACX,SAAA,CAAW,OACX,KAAA,CAAOG,CAAAA,CACP,QAAA,CAAU,CAAE,cAAejlB,CAAAA,CAAW8kB,CAAc,GAAK,EAAG,CAAA,CAC5D,YAAaI,CAAAA,CAAY,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAc,OACpD,WAAA,CAAaP,CAAAA,CAAY,WAAA,CACzB,KAAA,CAAOA,EAAY,KAAA,EAAS,MAC9B,CAAA,CAEAD,CAAAA,CAAgBE,CAAe,CAAA,CAAIO,EACrC,CACF,CAAC,EAEMT,CACT,CAAA,CAAG,CAACF,CAAAA,CAAgBxkB,EAAY6C,CAAW,CAAC,CAAA,CAG5C,OAAAqE,UAAU,IAAM,CACdsd,CAAAA,CAAe,OAAA,CAAQG,GAAe,CACpC,IAAMC,EAAkBD,CAAAA,CAAY,SAAA,CAC9BE,EAAc7kB,CAAAA,CAAW4kB,CAAe,CAAA,CACxCE,CAAAA,CAAiB,SAASF,CAAe,CAAA,CAAA,CAG3CQ,CAAAA,CAAuB,KAAA,CAEvBT,EAAY,SAAA,GAAc,UAAA,CACxB,KAAA,CAAM,OAAA,CAAQE,CAAW,CAAA,GAC3BO,CAAAA,CAAuBP,EAAY,QAAA,CAAS,OAAO,GAAKA,CAAAA,CAAY,QAAA,CAAS,QAAQ,CAAA,CAAA,CAGvFO,EAAuBP,CAAAA,GAAgB,OAAA,EAAWA,CAAAA,GAAgB,QAAA,CAIhE,CAACO,CAAAA,EAAwBplB,CAAAA,CAAW8kB,CAAc,CAAA,EACpD1e,EAAS0e,CAAAA,CAAgB,EAAA,CAAI,CAAE,cAAA,CAAgB,KAAA,CAAO,YAAa,KAAM,CAAC,EAE9E,CAAC,EACH,CAAA,CAAG,CAAC9kB,CAAAA,CAAYwkB,CAAAA,CAAgBpe,CAAQ,CAAC,CAAA,CAElCqe,CACT,CAAA,CCvGO,IAAMY,EAAAA,CAAiB,CAC5BnuB,CAAAA,CACA2L,CAAAA,CAAsB,OACgB,CACtC,GAAM,CAAE,KAAA,CAAAsD,EAAO,QAAA,CAAAC,CAAS,EAAIxE,cAAAA,EAAe,CAGrC5B,EAAamG,CAAAA,EAAM,CAGnBqe,CAAAA,CAAiBptB,OAAAA,CAAQ,IACtBF,CAAAA,CAAO,MAAA,CAAOvE,CAAAA,EAAAA,CAClBA,CAAAA,CAAM,YAAc,UAAA,EACpBA,CAAAA,CAAM,SAAA,GAAc,OAAA,EACpBA,EAAM,SAAA,GAAc,UAAA,GACrBA,CAAAA,CAAM,WAAA,EACN,OAAO,IAAA,CAAKA,CAAAA,CAAM,WAAW,CAAA,CAAE,OAAS,CAC1C,CAAA,CACC,CAACuE,CAAM,CAAC,CAAA,CAGLouB,CAAAA,CAAoBluB,OAAAA,CAAQ,IAAM,CACtC,IAAMmuB,CAAAA,CAAqD,EAAC,CAE5D,OAAAf,EAAe,OAAA,CAAQG,CAAAA,EAAe,CACpC,IAAMC,EAAkBD,CAAAA,CAAY,SAAA,CAC9BE,CAAAA,CAAc7kB,CAAAA,CAAW4kB,CAAe,CAAA,CACxCY,CAAAA,CAA4B,EAAC,CAEnC,GAAKb,CAAAA,CAAY,WAAA,CAEjB,CAAA,GAAIA,CAAAA,CAAY,YAAc,UAAA,CAExB,KAAA,CAAM,OAAA,CAAQE,CAAW,GAC3BA,CAAAA,CAAY,OAAA,CAAS5W,CAAAA,EAAwB,CAC3C,IAAMwX,CAAAA,CAAed,CAAAA,CAAY,WAAA,CAAa1W,CAAW,EACzD,GAAIwX,CAAAA,CAAc,CAChB,IAAMC,CAAAA,CAAaD,EAAa,KAAA,CAC5B7iB,CAAAA,CAAiB6iB,CAAAA,CAAa,KAAA,CAAO5iB,CAAW,CAAA,CAChD,MAAA,CAGE8iB,CAAAA,CAA4BF,CAAAA,CAAa,WAAW,GAAA,CAAIG,CAAAA,EAAe,CAC3E,IAAMC,EAAkB,CAAA,EAAGjB,CAAe,IAAI3W,CAAW,CAAA,CAAA,EAAI2X,EAAY,SAAS,CAAA,CAAA,CAClF,OAAO,CACL,GAAGA,CAAAA,CACH,WAAA,CAAa,CAAA,EAAGjB,CAAAA,CAAY,WAAW,CAAA,CAAA,EAAI1W,CAAW,CAAA,CAAA,EAAI2X,CAAAA,CAAY,WAAW,CAAA,CAAA,CACjF,SAAA,CAAWC,EACX,QAAA,CAAU,CACR,cAAe7lB,CAAAA,CAAW6lB,CAAe,CAAA,GAAMD,CAAAA,CAAY,UAAU,aAAA,EAAiB,EAAA,CACxF,CAAA,CACA,KAAA,CAAOA,EAAY,KAAA,EAASjB,CAAAA,CAAY,KAAA,EAAS,MACnD,CACF,CAAC,CAAA,CAEDa,CAAAA,CAAO,IAAA,CAAK,CACV,UAAA,CAAAE,CAAAA,CACA,MAAA,CAAQC,CAAAA,CACR,YAAA1X,CACF,CAAC,EACH,CACF,CAAC,CAAA,CAAA,KAAA,GAIC4W,CAAAA,EAAe,OAAOA,CAAAA,EAAgB,SAAU,CAClD,IAAMY,EAAed,CAAAA,CAAY,WAAA,CAAaE,CAAW,CAAA,CACzD,GAAIY,CAAAA,CAAc,CAChB,IAAMC,CAAAA,CAAaD,CAAAA,CAAa,KAAA,CAC5B7iB,CAAAA,CAAiB6iB,EAAa,KAAA,CAAO5iB,CAAW,CAAA,CAChD,MAAA,CAGE8iB,EAA4BF,CAAAA,CAAa,UAAA,CAAW,GAAA,CAAIG,CAAAA,EAAe,CAC3E,IAAMC,CAAAA,CAAkB,CAAA,EAAGjB,CAAe,IAAIC,CAAW,CAAA,CAAA,EAAIe,CAAAA,CAAY,SAAS,GAClF,OAAO,CACL,GAAGA,CAAAA,CACH,YAAa,CAAA,EAAGjB,CAAAA,CAAY,WAAW,CAAA,CAAA,EAAIE,CAAW,IAAIe,CAAAA,CAAY,WAAW,CAAA,CAAA,CACjF,SAAA,CAAWC,EACX,QAAA,CAAU,CACR,aAAA,CAAe7lB,CAAAA,CAAW6lB,CAAe,CAAA,GAAMD,CAAAA,CAAY,QAAA,EAAU,aAAA,EAAiB,GACxF,CAAA,CACA,KAAA,CAAOA,CAAAA,CAAY,KAAA,EAASjB,EAAY,KAAA,EAAS,MACnD,CACF,CAAC,EAEDa,CAAAA,CAAO,IAAA,CAAK,CACV,UAAA,CAAAE,EACA,MAAA,CAAQC,CAAAA,CACR,WAAA,CAAad,CACf,CAAC,EACH,CACF,CAGEW,CAAAA,CAAO,MAAA,CAAS,IAClBD,CAAAA,CAAgBX,CAAe,CAAA,CAAIY,CAAAA,EAAAA,CAEvC,CAAC,CAAA,CAEMD,CACT,CAAA,CAAG,CAACf,EAAgBxkB,CAAAA,CAAY6C,CAAW,CAAC,CAAA,CAG5C,OAAAqE,SAAAA,CAAU,IAAM,CACdsd,CAAAA,CAAe,OAAA,CAAQG,GAAe,CACpC,IAAMC,CAAAA,CAAkBD,CAAAA,CAAY,UAC9BE,CAAAA,CAAc7kB,CAAAA,CAAW4kB,CAAe,CAAA,CAE9C,GAAKD,CAAAA,CAAY,WAAA,CAEjB,GAAIA,CAAAA,CAAY,YAAc,UAAA,CAExB,KAAA,CAAM,QAAQE,CAAW,CAAA,CAC3B,OAAO,IAAA,CAAKF,CAAAA,CAAY,WAAW,CAAA,CAAE,QAAQ1W,CAAAA,EAAe,CAC1D,GAAI,CAAC4W,EAAY,QAAA,CAAS5W,CAAW,CAAA,CAAG,CAEtC,IAAMwX,CAAAA,CAAed,CAAAA,CAAY,WAAA,CAAa1W,CAAW,EACrDwX,CAAAA,EACFA,CAAAA,CAAa,UAAA,CAAW,OAAA,CAAQG,GAAe,CAC7C,IAAMC,CAAAA,CAAkB,CAAA,EAAGjB,CAAe,CAAA,CAAA,EAAI3W,CAAW,CAAA,CAAA,EAAI2X,CAAAA,CAAY,SAAS,CAAA,CAAA,CAC9E5lB,CAAAA,CAAW6lB,CAAe,CAAA,EAC5Bzf,CAAAA,CAASyf,EAAiB,EAAA,CAAI,CAAE,cAAA,CAAgB,KAAA,CAAO,YAAa,KAAM,CAAC,EAE/E,CAAC,EAEL,CACF,CAAC,CAAA,CAGD,MAAA,CAAO,KAAKlB,CAAAA,CAAY,WAAW,CAAA,CAAE,OAAA,CAAQ1W,GAAe,CAC1D,IAAMwX,CAAAA,CAAed,CAAAA,CAAY,YAAa1W,CAAW,CAAA,CACrDwX,CAAAA,EACFA,CAAAA,CAAa,WAAW,OAAA,CAAQG,CAAAA,EAAe,CAC7C,IAAMC,EAAkB,CAAA,EAAGjB,CAAe,IAAI3W,CAAW,CAAA,CAAA,EAAI2X,EAAY,SAAS,CAAA,CAAA,CAC9E5lB,CAAAA,CAAW6lB,CAAe,GAC5Bzf,CAAAA,CAASyf,CAAAA,CAAiB,EAAA,CAAI,CAAE,eAAgB,KAAA,CAAO,WAAA,CAAa,KAAM,CAAC,EAE/E,CAAC,EAEL,CAAC,CAAA,CAAA,KAEE,CAEL,IAAMC,CAAAA,CAAqBjB,CAAAA,EAAe,OAAOA,GAAgB,QAAA,CAAWA,CAAAA,CAAc,IAAA,CAC1F,MAAA,CAAO,KAAKF,CAAAA,CAAY,WAAW,CAAA,CAAE,OAAA,CAAQ1W,GAAe,CAC1D,GAAIA,IAAgB6X,CAAAA,CAAoB,CAEtC,IAAML,CAAAA,CAAed,CAAAA,CAAY,WAAA,CAAa1W,CAAW,EACrDwX,CAAAA,EACFA,CAAAA,CAAa,UAAA,CAAW,OAAA,CAAQG,GAAe,CAC7C,IAAMC,CAAAA,CAAkB,CAAA,EAAGjB,CAAe,CAAA,CAAA,EAAI3W,CAAW,IAAI2X,CAAAA,CAAY,SAAS,GAC9E5lB,CAAAA,CAAW6lB,CAAe,CAAA,EAC5Bzf,CAAAA,CAASyf,EAAiB,EAAA,CAAI,CAAE,cAAA,CAAgB,KAAA,CAAO,YAAa,KAAM,CAAC,EAE/E,CAAC,EAEL,CACF,CAAC,EACH,CACF,CAAC,EACH,CAAA,CAAG,CAAC7lB,CAAAA,CAAYwkB,CAAAA,CAAgBpe,CAAQ,CAAC,CAAA,CAElCkf,CACT,CAAA,CCzJA,IAAMS,EAAAA,CAAwC,CAAC,CAC7C,MAAAje,CAAAA,CACA,WAAA,CAAAke,CAAAA,CACA,iBAAA,CAAAC,EACA,kBAAA,CAAAC,CAAAA,CACA,yBAAA,CAAAC,CAAAA,CACA,0BAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,UAAA,CAAAxC,EACA,WAAA,CAAAhhB,CAAAA,CACA,WAAA7C,CAAAA,CACA,QAAA,CAAAsmB,EACA,SAAA,CAAAC,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,SAAA,CAAAlgB,CAAAA,CAAW,KAAA,CAAAF,CAAM,CAAA,CAAIvE,cAAAA,EAAe,CAGtCmG,CAAAA,CAA4BJ,GAChCqe,CAAAA,CAAY,UAAA,CACZA,CAAAA,CAAY,SAAA,CACZle,CACF,CAAA,CAIM0e,CAAAA,CAA6BpvB,OAAAA,CAAQ,IAClC2Q,EAA0B,GAAA,CAAI0e,CAAAA,GAAa,CAChD,GAAGA,EACH,SAAA,CAAWP,CAAAA,CAAmBO,CAAAA,CAAS,SAAA,CAAW3e,CAAK,CAAA,CAEvD,WAAA,CAAa,GAAG2e,CAAAA,CAAS,WAAW,IAAI3e,CAAK,CAAA,CAC/C,CAAA,CAAE,CAAA,CACD,CAACC,CAAAA,CAA2BD,CAAAA,CAAOoe,CAAkB,CAAC,EAEnDzB,CAAAA,CAAkBF,EAAAA,CAAkBiC,CAAAA,CAA4B3jB,CAAW,EAG3EyiB,CAAAA,CAAoBD,EAAAA,CAAemB,CAAAA,CAA4B3jB,CAAW,EAG1E6jB,CAAAA,CAAgCtvB,OAAAA,CAAQ,IAAM,CAClD,IAAM+D,CAAAA,CAMD,EAAC,CAEN,OAAA4M,EAA0B,OAAA,CAAQ0e,CAAAA,EAAY,CAC5C,IAAME,EAAWT,CAAAA,CAAmBO,CAAAA,CAAS,UAAW3e,CAAK,CAAA,CAG7D3M,EAAO,IAAA,CAAK,CAAE,KAAA,CAAOsrB,CAAAA,CAAU,aAAc,KAAM,CAAC,CAAA,CAIpD,IAAMtB,EAAaV,CAAAA,CAAgBkC,CAAQ,CAAA,CAC3C,GAAIxB,EAAY,CAEd,IAAMyB,EAA+B,CACnC,GAAGzB,EACH,SAAA,CAAW,CAAA,MAAA,EAASwB,CAAQ,CAAA,CAC9B,EACAxrB,CAAAA,CAAO,IAAA,CAAK,CACV,KAAA,CAAOyrB,EACP,YAAA,CAAc,IAAA,CACd,iBAAA,CAAmBH,CAAAA,CAAS,SAC9B,CAAC,EACH,CAGA,IAAMI,CAAAA,CAAevB,EAAkBqB,CAAQ,CAAA,CAC3CE,CAAAA,EAAgBA,CAAAA,CAAa,OAAS,CAAA,EACxCA,CAAAA,CAAa,OAAA,CAAQ3zB,CAAAA,EAAS,CAE5B,IAAM4zB,CAAAA,CAAmC5zB,CAAAA,CAAM,MAAA,CAAO,IAAI0yB,CAAAA,GAGjD,CACL,GAAGA,CAEL,EACD,CAAA,CAEDzqB,CAAAA,CAAO,IAAA,CAAK,CACV,MAAOsrB,CAAAA,CACP,YAAA,CAAc,KAAA,CACd,aAAA,CAAe,KACf,WAAA,CAAa,CACX,GAAGvzB,CAAAA,CACH,OAAQ4zB,CACV,CAAA,CACA,kBAAmBL,CAAAA,CAAS,SAC9B,CAAC,EACH,CAAC,EAEL,CAAC,EAEMtrB,CACT,CAAA,CAAG,CAAC4M,CAAAA,CAA2B0c,EAAiBa,CAAAA,CAAmBxd,CAAAA,CAAOoe,CAAkB,CAAC,EAE7F,OACExjB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+KACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAS,IAAM4jB,CAAAA,CAASxe,CAAK,EAC7B,SAAA,CAAU,8HAAA,CAEV,QAAA,CAAA,CAAApF,IAAAA,CAAC,OAAI,SAAA,CAAU,6BAAA,CACb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,mIAAA,CAAoI,QAAA,CAAA,CAAA,WAAA,CAC1IoF,CAAAA,CAAQ,CAAA,CAAA,CACjB,EACA9M,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mCAAA,CACb,SAAAqrB,CAAAA,CAAa,qBAAA,CAAwB,qBAAA,CACxC,CAAA,CAAA,CACF,EACArrB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CACZ,SAAAqrB,CAAAA,CACCrrB,GAAAA,CAACqpB,SAAAA,CAAA,CAAU,UAAU,SAAA,CAAU,CAAA,CAE/BrpB,GAAAA,CAACwW,WAAAA,CAAA,CAAY,SAAA,CAAU,SAAA,CAAU,CAAA,CAErC,CAAA,CAAA,CACF,EAEAxW,GAAAA,CAAC,KAAA,CAAA,CACC,IAAKurB,CAAAA,CACL,SAAA,CAAW,GAAIF,CAAAA,CAA+B,EAAA,CAAlB,eAAoB,CAAA,gBAAA,CAAA,CAEhD,SAAArrB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACZ,SAAA0rB,CAAAA,CAA8B,GAAA,CAAI,CAAC,CAAE,MAAOD,CAAAA,CAAU,YAAA,CAAAM,EAAc,aAAA,CAAAC,CAAAA,CAAe,YAAAC,CAAAA,CAAa,iBAAA,CAAAC,CAAkB,CAAA,GAAM,CAEvH,GAAIF,CAAAA,EAAiBC,CAAAA,CACnB,OACEvkB,KAAC,KAAA,CAAA,CAEC,SAAA,CAAU,gFAAA,CAET,QAAA,CAAA,CAAAukB,EAAY,UAAA,EACXjsB,GAAAA,CAAC,MAAG,SAAA,CAAU,0CAAA,CACX,SAAAisB,CAAAA,CAAY,UAAA,CACf,CAAA,CAEFjsB,GAAAA,CAAC,OAAI,SAAA,CAAU,uCAAA,CACZ,QAAA,CAAAisB,CAAAA,CAAY,OAAO,GAAA,CAAKrB,CAAAA,EAAgB,CACvC,IAAMC,EAAkBD,CAAAA,CAAY,SAAA,CAI9BuB,CAAAA,CAA0BvB,CAAAA,CAAY,UAAU,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,CAAE,CAAC,CAAA,CACtEwB,CAAAA,CAAgBF,EAClB,CAAA,EAAGA,CAAiB,CAAA,CAAA,EAAID,CAAAA,CAAY,WAAW,CAAA,CAAA,EAAIE,CAAuB,GAC1EtB,CAAAA,CACEwB,CAAAA,CAAmBpB,EAAkBmB,CAAa,CAAA,EAAK,EAAA,CAEvDE,CAAAA,CAAwB,CAC5B,GAAGtnB,CAAAA,CACH,CAAC6lB,CAAe,EAAGwB,CACrB,CAAA,CAEA,OACErsB,GAAAA,CAAC,OAA0B,SAAA,CAAU,WAAA,CAClC,SAAA6oB,CAAAA,CACCnhB,IAAAA,CAAC,OAAI,SAAA,CAAU,oEAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,OAAI,SAAA,CAAU,mDAAA,CACZ,QAAA,CAAA4qB,CAAAA,CAAY,UACf,CAAA,CACA5qB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iDACZ,QAAA,CAAAqL,CAAAA,CAAUwf,CAAe,CAAA,EAAK7qB,GAAAA,CAAC,QAAK,SAAA,CAAU,sBAAA,CAAuB,QAAA,CAAA,kBAAA,CAAa,CAAA,CACrF,GACF,CAAA,CAEAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gGACb,QAAA,CAAAA,GAAAA,CAAC2oB,EAAAA,CAAA,CACC,MAAOiC,CAAAA,CACP,IAAA,CAAMC,CAAAA,CACN,WAAA,CAAahjB,EACb,UAAA,CAAYykB,CAAAA,CACZ,kBAAA,CAAoB,KAAA,CACtB,EACF,CAAA,CAAA,CAnBMzB,CAqBV,CAEJ,CAAC,EACH,CAAA,CAAA,CAAA,CAlDK,CAAA,aAAA,EAAgBoB,CAAAA,CAAY,WAAW,IAAInf,CAAK,CAAA,CAmDvD,EAMJ,IAAM6e,CAAAA,CAAWI,EACbN,CAAAA,CAAS,SAAA,CACTP,CAAAA,CAAmBO,CAAAA,CAAS,UAAW3e,CAAK,CAAA,CAI1Cyf,CAAAA,CAAUR,CAAAA,EAAgBG,EAC5B,CAAA,MAAA,EAASA,CAAiB,CAAA,CAAA,CAC1BT,CAAAA,CAAS,UAGPlxB,CAAAA,CAAawxB,CAAAA,EAAgBG,EAC9BjB,CAAAA,CAAkB,CAAA,MAAA,EAASiB,CAAiB,CAAA,CAAE,CAAA,EAAK,EAAA,CACnDjB,CAAAA,CAAkBsB,CAAO,CAAA,EAAK,EAAA,CAE7BC,CAAAA,CAA0B,CAC9B,GAAGxnB,CAAAA,CACH,CAAC2mB,CAAQ,EAAGpxB,CACd,CAAA,CAIM+c,CAAAA,CAAgC,CAACyU,CAAAA,EAAgBN,CAAAA,CAAS,kBAC5DP,CAAAA,CAAmBO,CAAAA,CAAS,iBAAA,CAAkB,kBAAA,CAAoB3e,CAAK,CAAA,CACvE,MAAA,CAGJ,GAAI,CAACif,GAAgBN,CAAAA,CAAS,WAAA,EAAeA,CAAAA,CAAS,UAAA,CAAY,CAChE,IAAMgB,CAAAA,CAAc,IAAA,CAAK,GAAA,CAAI,EAAG,MAAA,CAAOthB,CAAAA,CAAMwgB,CAAQ,CAAC,GAAK,CAAC,CAAA,CACtDe,CAAAA,CAAkBvB,CAAAA,CAA0BM,EAAS,WAAA,CAAY,SAAA,CAAW3e,CAAK,CAAA,CACjF6f,EAAqB,KAAA,CAAM,OAAA,CAAQ1B,EAAkBQ,CAAAA,CAAS,WAAA,CAAY,SAAS,CAAC,CAAA,CACtFR,CAAAA,CAAkBQ,CAAAA,CAAS,YAAY,SAAS,CAAA,CAChD,EAAC,CAEL,OACE/jB,IAAAA,CAAC,KAAA,CAAA,CAA+B,SAAA,CAAU,yBAAA,CACxC,UAAA1H,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+FAAA,CACb,SAAAA,GAAAA,CAAC2oB,EAAAA,CAAA,CACC,KAAA,CAAO8C,EACP,IAAA,CAAME,CAAAA,CACN,WAAA,CAAa9jB,CAAAA,CACb,WAAY2kB,CAAAA,CACZ,kBAAA,CAAoB,KAAA,CACpB,6BAAA,CAA+BlV,EACjC,CAAA,CACF,CAAA,CAECmV,EAAc,CAAA,EACbzsB,GAAAA,CAAC,OAAI,SAAA,CAAU,WAAA,CACZ,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQysB,CAAY,CAAA,CAAG,CAAC7oB,EAAGgpB,CAAAA,GAAgB,CACvD,IAAM/rB,CAAAA,CAAc8rB,EAAmBC,CAAW,CAAA,EAAK,EAAC,CACxD,OACEllB,IAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAU,yDAAA,CAEV,UAAA1H,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wGAAA,CACZ,SAAA6H,CAAAA,GAAgB,IAAA,CAAO,CAAA,aAAA,EAAa+kB,CAAAA,CAAc,CAAC,CAAA,CAAA,CAAK,CAAA,UAAA,EAAaA,EAAc,CAAC,CAAA,CAAA,CACvF,EACA5sB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACZ,SAAAyrB,CAAAA,CAAS,WAAA,CAAa,UAAA,CAAW,GAAA,CAAK/qB,GAA0B,CAC/D,IAAMmsB,CAAAA,CAAWzB,CAAAA,CACfK,EAAS,WAAA,CAAa,SAAA,CACtB3e,EACApM,CAAAA,CAAW,SAAA,CACXksB,CACF,CAAA,CACME,CAAAA,CAAkB,CACtB,GAAG9nB,EACH,CAAC6nB,CAAQ,EAAGhsB,CAAAA,GAAcH,EAAW,SAAS,CAAA,EAAK,EACrD,CAAA,CAIMqsB,EAAsB5B,CAAAA,CAA0BM,CAAAA,CAAS,YAAa,SAAA,CAAW3e,CAAK,EACtFwK,CAAAA,CAAgC5W,CAAAA,CAAW,iBAAA,CAC7C,CAAA,EAAGqsB,CAAmB,CAAA,CAAA,EAAIrsB,CAAAA,CAAW,iBAAA,CAAkB,kBAAkB,IAAIksB,CAAW,CAAA,CAAA,CACxF,MAAA,CAEJ,OACE5sB,IAAC,KAAA,CAAA,CAAmB,SAAA,CAAU,WAAA,CAC3B,QAAA,CAAA6oB,EACCnhB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oEAAA,CACb,UAAA1H,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mDAAA,CACZ,SAAAU,CAAAA,CAAW,SAAA,CACd,CAAA,CACAV,GAAAA,CAAC,OAAI,SAAA,CAAU,gDAAA,CACZ,SAAAqL,CAAAA,CAAUwhB,CAAQ,GAAK7sB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sBAAA,CAAuB,4BAAa,CAAA,CAC9E,CAAA,CAAA,CACF,CAAA,CAEAA,GAAAA,CAAC,OAAI,SAAA,CAAU,+FAAA,CACb,QAAA,CAAAA,GAAAA,CAAC2oB,GAAA,CACC,KAAA,CAAOjoB,CAAAA,CACP,IAAA,CAAMmsB,EACN,WAAA,CAAahlB,CAAAA,CACb,UAAA,CAAYilB,CAAAA,CACZ,mBAAoB,KAAA,CACpB,6BAAA,CAA+BxV,CAAAA,CACjC,CAAA,CACF,GApBMuV,CAsBV,CAEJ,CAAC,CAAA,CACH,IApDK,CAAA,EAAGH,CAAe,QAAQE,CAAW,CAAA,CAqD5C,CAEJ,CAAC,CAAA,CACH,CAAA,CAAA,CAAA,CA1EM,CAAA,EAAGjB,CAAQ,CAAA,OAAA,CA4ErB,CAEJ,CAEA,OACE3rB,IAAC,KAAA,CAAA,CAAmB,SAAA,CAAU,WAAA,CAC3B,QAAA,CAAA6oB,EACCnhB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oEAAA,CACb,UAAA1H,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mDAAA,CACZ,SAAAyrB,CAAAA,CAAS,SAAA,CACZ,CAAA,CACAzrB,GAAAA,CAAC,OAAI,SAAA,CAAU,gDAAA,CACZ,QAAA,CAAAqL,CAAAA,CAAUsgB,CAAQ,CAAA,EAAK3rB,GAAAA,CAAC,QAAK,SAAA,CAAU,sBAAA,CAAuB,4BAAa,CAAA,CAC9E,CAAA,CAAA,CACF,CAAA,CAEAA,GAAAA,CAAC,OAAI,SAAA,CAAU,+FAAA,CACb,QAAA,CAAAA,GAAAA,CAAC2oB,GAAA,CACC,KAAA,CAAO8C,CAAAA,CACP,IAAA,CAAME,EACN,WAAA,CAAa9jB,CAAAA,CACb,WAAY2kB,CAAAA,CACZ,kBAAA,CAAoB,MACpB,6BAAA,CAA+BlV,CAAAA,CACjC,CAAA,CACF,CAAA,CAAA,CApBMqU,CAsBV,CAEJ,CAAC,CAAA,CACH,CAAA,CACF,GACF,CAEJ,CAAA,CAEOqB,EAAAA,CAAQjC,EAAAA,CC3Wf,IAAMkC,EAAAA,CAAmC,CAAC,CAAE,QAAA,CAAAltB,CAAAA,CAAU,SAAA,CAAAoH,EAAW,OAAA,CAAAuK,CAAAA,CAAS,GAAGzD,CAAM,IAAM,CACvF,GAAM,CAAE,KAAA,CAAAuC,EAAO,MAAA,CAAAE,CAAAA,CAAQ,YAAA,CAAAE,CAAAA,CAAc,QAAAE,CAAAA,CAAS,QAAA,CAAAI,CAAAA,CAAU,SAAA,CAAAS,EAAW,QAAA,CAAAC,CAAS,CAAA,CAAIrB,EAAAA,GAE1EsB,CAAAA,CACJ7R,GAAAA,CAAC,QACC,SAAA,CAAU,mEAAA,CACV,MAAO,CAAE,KAAA,CAAO,mBAAoB,CAAA,CAEnC,SAAAD,CAAAA,CACH,CAAA,CAGF,OACEC,GAAAA,CAAC,UACC,KAAA,CAAO,CACL,KAAA,CAAO,CAAA,EAAGwQ,CAAK,CAAA,EAAA,CAAA,CACf,MAAA,CAAQ,CAAA,EAAGE,CAAM,KACjB,YAAA,CAAc,CAAA,EAAGE,CAAY,CAAA,EAAA,CAAA,CAC7B,YAAa,mBAAA,CACb,SAAA,CAAAe,CAAAA,CACA,UAAA,CAAY,mDACZ,UAAA,CAAY,MAAA,CACZ,uBAAA,CAAyB,aAC3B,EACA,SAAA,CAAW5B,CAAAA,CACT,+CACA,uDAAA,CACA,WAAA,CACA,qHACA,kDAAA,CACA,+CAAA,CACA,oCAAA,CACA5I,CACF,EACC,GAAGyK,CAAAA,CACJ,OAAA,CAASF,CAAAA,CACR,GAAGzD,CAAAA,CAEJ,QAAA,CAAAvG,IAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,yEAAA,CACd,QAAA,CAAA,CAAA1H,GAAAA,CAAC,MAAA,CAAA,CACC,UAAW+P,CAAAA,CACT,kFAAA,CACA,CAACmB,CAAAA,EAAY,8BACf,CAAA,CACA,KAAA,CAAOA,CAAAA,CAAW,CAAE,UAAWJ,CAAAA,CAAU,kBAAA,CAAqB,eAAgB,CAAA,CAAI,EAAC,CAElF,QAAA,CAAAe,EACH,CAAA,CACA7R,GAAAA,CAAC,QACC,SAAA,CAAW+P,CAAAA,CACT,iGAAA,CACA,CAACmB,GAAY,gCACf,CAAA,CACA,KAAA,CAAO,CACL,KAAM,OAAA,CACN,GAAIA,CAAAA,CAAW,CAAE,UAAWJ,CAAAA,CAAU,kBAAA,CAAqB,eAAgB,CAAA,CAAI,EACjF,CAAA,CAEC,QAAA,CAAAe,CAAAA,CACH,CAAA,CAAA,CACF,EACF,CAEJ,CAAA,CAEOqb,EAAAA,CAAQD,EAAAA,CC5Df,IAAME,EAAAA,CAAgC,CAAC,CACrC,QAAA,CAAAptB,EACA,SAAA,CAAAoH,CAAAA,CACA,QAAAimB,CAAAA,CAAU,YAAA,CACV,MAAA,CAAAC,CAAAA,CACA,QAAA3b,CAAAA,CACA,GAAGzD,CACL,CAAA,GAAM,CACJ,IAAMqf,CAAAA,CACJD,CAAAA,GAAW,QAAA,CAAW,SAAWA,CAAAA,GAAW,YAAA,CAAe,YAAA,CAAeD,CAAAA,CAEtE,CAAE,MAAA,CAAA1c,CAAAA,CAAQ,YAAA,CAAAE,CAAAA,CAAc,UAAAe,CAAAA,CAAW,QAAA,CAAAC,CAAS,CAAA,CAAIrB,IAAc,CAE9Dgd,CAAAA,CAAWD,CAAAA,GAAqB,QAAA,CAChCE,EAAYF,CAAAA,GAAqB,UAAA,CAEvC,OACEttB,GAAAA,CAAC,QAAA,CAAA,CACC,MAAO,CACL,MAAA,CAAQ,CAAA,EAAG0Q,CAAM,KACjB,YAAA,CAAc,CAAA,EAAGE,CAAY,CAAA,EAAA,CAAA,CAC7B,GAAI2c,CAAAA,CACA,CAAE,WAAA,CAAa,mBAAoB,EAClCC,CAAAA,CAED,EAAC,CADD,CAAE,gBAAiB,mBAAoB,CAAA,CAE3C,SAAA,CAAA7b,CAAAA,CACA,WAAY,sEAAA,CACZ,UAAA,CAAY,MAAA,CACZ,uBAAA,CAAyB,aAC3B,CAAA,CACA,SAAA,CAAW5B,CAAAA,CACT,8CAAA,CACA,wCACA,WAAA,CACA,6EAAA,CACA,mDACA,yCAAA,CACAwd,CAAAA,EAAY,CACV,iBAAA,CACA,wCAAA,CACA,oCACF,CAAA,CACA,CAACA,CAAAA,EAAY,CAACC,CAAAA,EAAa,CACzB,aACA,wCAAA,CACA,kBACF,CAAA,CACAA,CAAAA,EAAa,CACX,uBAAA,CACA,4BAAA,CACA,kBACF,CAAA,CACArmB,CACF,CAAA,CACC,GAAGyK,CAAAA,CACJ,OAAA,CAASF,EACR,GAAGzD,CAAAA,CAEJ,QAAA,CAAAjO,GAAAA,CAAC,QACC,KAAA,CAAOutB,CAAAA,CAAW,CAAE,KAAA,CAAO,mBAAoB,CAAA,CAAI,MAAA,CACnD,UAAU,+CAAA,CAET,QAAA,CAAAxtB,EACH,CAAA,CACF,CAEJ,CAAA,CAEO0tB,EAAAA,CAAQN,GClEf,IAAMO,GAA0C,CAAC,CAC/C,WAAA7E,CAAAA,CACA,OAAA,CAAAC,EACA,OAAA,CAAA6E,CAAAA,CACA,MAAA,CAAAC,CACF,IAEI5tB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CACb,SAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2EAAA,CACZ,SAAA6oB,CAAAA,CACC7oB,GAAAA,CAACktB,GAAA,CACC,IAAA,CAAK,SACL,OAAA,CAASpE,CAAAA,CACT,SAAA,CAAU,mKAAA,CACX,kBAED,CAAA,CAEAphB,IAAAA,CAAAH,QAAAA,CAAA,CACG,UAAAomB,CAAAA,EACC3tB,GAAAA,CAACytB,EAAAA,CAAA,CACC,QAAQ,UAAA,CACR,IAAA,CAAK,QAAA,CACL,OAAA,CAASE,EACT,SAAA,CAAU,sCAAA,CACX,QAAA,CAAA,cAAA,CAED,CAAA,CAEFjmB,KAACoK,EAAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS8b,CAAAA,CACT,SAAA,CAAU,sQAAA,CAEV,QAAA,CAAA,CAAA5tB,IAAC6tB,IAAAA,CAAA,CAAK,UAAU,SAAA,CAAU,CAAA,CAC1B7tB,IAAC,MAAA,CAAA,CAAK,QAAA,CAAA,aAAA,CAAW,CAAA,CAAA,CACnB,CAAA,CAAA,CACF,EAEJ,CAAA,CACF,CAAA,CAKG8tB,EAAAA,CAAQJ,EAAAA,CCzDR,IAAMK,EAAAA,CAAsB,CAACC,CAAAA,CAA6B7F,IAAyB,CACxF,IAAM8F,CAAAA,CAAalyB,MAAAA,CAAiD,EAAE,CAAA,CAEhEmyB,CAAAA,CAAsBtsB,WAAAA,CAAY,CAACkL,CAAAA,CAAeqhB,CAAAA,GAAyB,CAC/E,IAAMC,EAAKH,CAAAA,CAAW,OAAA,CAAQnhB,CAAK,CAAA,CACnC,GAAI,CAACshB,CAAAA,CAAI,OAET,IAAMnJ,CAAAA,CAAW,OAAO,UAAA,CAAa,GAAA,CAAM,GAAA,CAAM,GAAA,CAEjD,GAAIkJ,CAAAA,CAAa,CACf,IAAME,CAAAA,CAAeD,EAAG,YAAA,CAClBE,CAAAA,CAAOF,CAAAA,CAAG,OAAA,CACd,CACE,CAAE,MAAA,CAAQ,KAAA,CAAO,OAAA,CAAS,GAAI,CAAA,CAC9B,CAAE,MAAA,CAAQ,CAAA,EAAGC,CAAY,CAAA,EAAA,CAAA,CAAM,OAAA,CAAS,GAAI,CAC9C,EACA,CAAE,QAAA,CAAApJ,EAAU,MAAA,CAAQ,UAAA,CAAY,KAAM,UAAW,CACnD,CAAA,CACAqJ,CAAAA,CAAK,SAAW,IAAM,CAAEF,CAAAA,CAAG,KAAA,CAAM,OAAS,OAAQ,EACpD,CAAA,KAAO,CACL,IAAMG,CAAAA,CAAgBH,CAAAA,CAAG,aACzBA,CAAAA,CAAG,OAAA,CACD,CACE,CAAE,MAAA,CAAQ,CAAA,EAAGG,CAAa,KAAM,OAAA,CAAS,GAAI,CAAA,CAC7C,CAAE,OAAQ,KAAA,CAAO,OAAA,CAAS,GAAI,CAChC,EACA,CAAE,QAAA,CAAAtJ,EAAU,MAAA,CAAQ,aAAA,CAAe,KAAM,UAAW,CACtD,EACF,CACF,EAAG,EAAE,CAAA,CAECuJ,CAAAA,CAAmB5sB,YAAY,IAAM,CACzC,IAAMsP,CAAAA,CAAW,OAAO,UAAA,CAAa,GAAA,CAC/B+T,CAAAA,CAAW/T,CAAAA,CAAW,IAAM,GAAA,CAC5Bud,CAAAA,CAAUvd,CAAAA,CAAW,EAAA,CAAK,IAEhC,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQiX,CAAa,CAAA,CAAG,CAACvkB,CAAAA,CAAGlJ,CAAAA,GAAMA,CAAC,CAAA,CAAE,OAAA,CAAQ,CAACoS,CAAAA,CAAOpS,CAAAA,GAAM,CACtE,IAAM0zB,CAAAA,CAAKH,CAAAA,CAAW,OAAA,CAAQnhB,CAAK,CAAA,CACnC,GAAIshB,CAAAA,EAAM,CAACJ,EAAe,GAAA,CAAIlhB,CAAK,CAAA,CAAG,CACpC,IAAMuhB,CAAAA,CAAeD,CAAAA,CAAG,YAAA,CAClBE,CAAAA,CAAOF,EAAG,OAAA,CACd,CACE,CAAE,MAAA,CAAQ,MAAO,OAAA,CAAS,GAAI,CAAA,CAC9B,CAAE,OAAQ,CAAA,EAAGC,CAAY,CAAA,EAAA,CAAA,CAAM,OAAA,CAAS,GAAI,CAC9C,CAAA,CACA,CAAE,QAAA,CAAApJ,CAAAA,CAAU,MAAOvqB,CAAAA,CAAI+zB,CAAAA,CAAS,MAAA,CAAQ,UAAA,CAAY,KAAM,UAAW,CACvE,CAAA,CACAH,CAAAA,CAAK,SAAW,IAAM,CAAEF,CAAAA,CAAG,KAAA,CAAM,OAAS,OAAQ,EACpD,CACF,CAAC,EACH,CAAA,CAAG,CAACjG,CAAAA,CAAc6F,CAAc,CAAC,CAAA,CAE3BU,CAAAA,CAAqB9sB,WAAAA,CAAY,IAAM,CAC3C,IAAMsP,CAAAA,CAAW,MAAA,CAAO,UAAA,CAAa,IAC/B+T,CAAAA,CAAW/T,CAAAA,CAAW,IAAM,GAAA,CAC5Bud,CAAAA,CAAUvd,EAAW,EAAA,CAAK,GAAA,CAEhC8c,CAAAA,CAAe,OAAA,CAAQ,CAAClhB,CAAAA,CAAOpS,CAAAA,GAAM,CACnC,IAAM0zB,EAAKH,CAAAA,CAAW,OAAA,CAAQnhB,CAAK,CAAA,CACnC,GAAIshB,CAAAA,CAAI,CACN,IAAMG,CAAAA,CAAgBH,CAAAA,CAAG,aACzBA,CAAAA,CAAG,OAAA,CACD,CACE,CAAE,OAAQ,CAAA,EAAGG,CAAa,CAAA,EAAA,CAAA,CAAM,OAAA,CAAS,GAAI,CAAA,CAC7C,CAAE,MAAA,CAAQ,KAAA,CAAO,QAAS,GAAI,CAChC,EACA,CAAE,QAAA,CAAAtJ,EAAU,KAAA,CAAOvqB,CAAAA,CAAI+zB,CAAAA,CAAS,MAAA,CAAQ,cAAe,IAAA,CAAM,UAAW,CAC1E,EACF,CACF,CAAC,EACH,CAAA,CAAG,CAACT,CAAc,CAAC,CAAA,CAEnB,OAAO,CACL,WAAAC,CAAAA,CACA,mBAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAM,EACA,kBAAA,CAAAE,CACF,CACF,CAAA,CC9CA,IAAMC,EAAAA,CAAoD,CAAC,CACzD,WAAA,CAAAC,CAAAA,CACA,WAAA/F,CAAAA,CACA,QAAA,CAAAgG,CAAAA,CACA,UAAA,CAAAC,EACA,UAAA,CAAAC,CAAAA,CACA,cAAA,CAAAf,CAAAA,CACA,aAAA7F,CAAAA,CACA,aAAA,CAAAD,CAAAA,CACA,WAAA,CAAA8C,EACA,WAAA,CAAAnjB,CAAAA,CACA,UAAA,CAAA7C,CAAAA,CACA,aAAAgqB,CAAAA,CACA,kBAAA,CAAA9D,CAAAA,CACA,yBAAA,CAAAC,EACA,yBAAA,CAAAC,CAAAA,CACA,OAAA,CAAAtC,CAAAA,CACA,QAAA6E,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,cAAA,CAAAqB,EACA,iBAAA,CAAAC,CACF,IAAM,CACJ,GAAM,CAAE,UAAA,CAAAjB,CAAAA,CAAY,mBAAA,CAAAC,CAAAA,CAAqB,iBAAAM,CAAAA,CAAkB,kBAAA,CAAAE,CAAmB,CAAA,CAC5EX,GAAoBC,CAAAA,CAAgB7F,CAAY,CAAA,CAG5CgH,CAAAA,CAAiB/yB,QAAQ,IAAM,CACnC,GAAI,CAACwyB,EAAa,OAAO,EAAC,CAI1B,IAAMQ,EAAiB,IAAI,GAAA,CAE3B,IAAA,IAAS10B,CAAAA,CAAI,EAAGA,CAAAA,CAAIytB,CAAAA,CAAcztB,CAAAA,EAAAA,CAChC00B,CAAAA,CAAe,IAAI10B,CAAC,CAAA,CAGtB,OAAO,KAAA,CAAM,IAAA,CAAK00B,CAAc,CAAA,CAAE,IAAA,CAAK,CAAC9d,CAAAA,CAAG7R,IAAM6R,CAAAA,CAAI7R,CAAC,CACxD,CAAA,CAAG,CAACmvB,CAAAA,CAAazG,CAAY,CAAC,CAAA,CAE9Bjc,UAAU,IAAM,CACV0iB,GAEFM,CAAAA,CAAkB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,EAElC,CAAA,CAAG,CAACN,CAAAA,CAAaM,CAAiB,CAAC,CAAA,CAEnC,IAAMG,CAAAA,CAAsBviB,CAAAA,EAAkB,CACxB,CAACkhB,CAAAA,CAAe,IAAIlhB,CAAK,CAAA,EAI3CmiB,EAAeniB,CAAK,CAAA,CAEpB,UAAA,CAAW,IAAM,CACfohB,CAAAA,CAAoBphB,CAAAA,CAAO,IAAI,EACjC,EAAG,EAAE,CAAA,GAELohB,CAAAA,CAAoBphB,CAAAA,CAAO,KAAK,CAAA,CAChC,UAAA,CAAW,IAAMmiB,CAAAA,CAAeniB,CAAK,CAAA,CAAG,GAAG,CAAA,EAE/C,CAAA,CAEMwiB,EAAkB,IAAM,CAE5B,IAAMC,CAAAA,CAAa,MAAM,IAAA,CAAK,CAAE,MAAA,CAAQpH,CAAa,EAAG,CAACvkB,CAAAA,CAAGlJ,IAAMA,CAAC,CAAA,CACnEw0B,EAAkB,IAAI,GAAA,CAAIK,CAAU,CAAC,EAGrC,UAAA,CAAW,IAAM,CACff,CAAAA,GACF,CAAA,CAAG,GAAG,EACR,CAAA,CAEMgB,EAAoB,IAAM,CAC9Bd,GAAmB,CACnB,UAAA,CAAW,IAAM,CACfQ,CAAAA,CAAkB,IAAI,GAAK,EAC7B,CAAA,CAAG,GAAG,EACR,CAAA,CAEA,OAAKN,CAAAA,CAGHlnB,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKmnB,EACL,SAAA,CAAU,mEAAA,CAGV,UAAA7uB,GAAAA,CAAC,KAAA,CAAA,CACC,IAAK8uB,CAAAA,CACL,SAAA,CAAU,0EAAA,CACV,OAAA,CAAShG,EACX,CAAA,CAGAphB,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKqnB,EACL,SAAA,CAAU,oIAAA,CAEV,QAAA,CAAA,CAAA/uB,GAAAA,CAACspB,GAAA,CACC,UAAA,CAAYT,CAAAA,CACZ,aAAA,CAAeX,EACf,SAAA,CAAW8C,CAAAA,CAAY,SAAA,CACvB,YAAA,CAAc7C,EACd,OAAA,CAASW,CAAAA,CACT,WAAA,CAAawG,CAAAA,CACb,cAAeE,CAAAA,CACjB,CAAA,CAGAxvB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,oDAAA,CACb,QAAA,CAAAA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YACZ,QAAA,CAAAmvB,CAAAA,CAAe,GAAA,CAAKriB,CAAAA,EACnB9M,IAACgtB,EAAAA,CAAA,CAEC,KAAA,CAAOlgB,CAAAA,CACP,YAAake,CAAAA,CACb,iBAAA,CAAmBgE,CAAAA,CAAaliB,CAAK,GAAK,EAAC,CAC3C,mBAAoBoe,CAAAA,CACpB,yBAAA,CAA2BC,EAC3B,yBAAA,CAA2BC,CAAAA,CAC3B,UAAA,CAAY4C,CAAAA,CAAe,IAAIlhB,CAAK,CAAA,CACpC,UAAA,CAAY+b,CAAAA,CACZ,YAAahhB,CAAAA,CACb,UAAA,CAAY7C,CAAAA,CACZ,QAAA,CAAUqqB,EACV,SAAA,CAAYjB,CAAAA,EAAO,CAAEH,CAAAA,CAAW,OAAA,CAAQnhB,CAAK,CAAA,CAAIshB,EAAI,CAAA,CAAA,CAZhDthB,CAaP,CACD,CAAA,CACH,CAAA,CACF,CAAA,CAEA9M,GAAAA,CAAC8tB,GAAA,CACC,UAAA,CAAYjF,CAAAA,CACZ,OAAA,CAASC,EACT,OAAA,CAAS6E,CAAAA,CACT,MAAA,CAAQC,CAAAA,CACV,GACF,CAAA,CAAA,CACF,CAAA,CA3DuB,IA6D3B,CAAA,CAEO6B,GAAQd,EAAAA,CC9KR,IAAMe,EAAAA,CAAsB,CAAC/3B,EAAkBqN,CAAAA,GAAoC,CACxF,GAAM,CAAE,SAAA,CAAAqG,CAAAA,CAAW,QAAA,CAAAD,EAAU,KAAA,CAAAD,CAAM,CAAA,CAAIvE,cAAAA,GACjC,CAAConB,CAAAA,CAAgBkB,CAAiB,CAAA,CAAIvzB,SAAsB,IAAI,GAAK,CAAA,CAErEqvB,CAAAA,CAAcrzB,EAAM,WAAA,CACpBg4B,CAAAA,CAAexkB,CAAAA,CAAMxT,CAAAA,CAAM,SAAS,CAAA,CACpCwwB,CAAAA,CAAe,MAAA,CAAOwH,CAAY,GAAK,CAAA,CACvCX,CAAAA,CAAehqB,CAAAA,GAAagmB,CAAAA,CAAY,SAAS,CAAA,EAAK,GAEtDE,CAAAA,CAAqB,CAAC0E,EAAwB9iB,CAAAA,GAClD,CAAA,EAAGke,CAAAA,CAAY,SAAS,IAAI4E,CAAc,CAAA,CAAA,EAAI9iB,CAAK,CAAA,CAAA,CAE/Cqe,EAA4B,CAAC0E,CAAAA,CAA6B/iB,CAAAA,GAC9D,CAAA,EAAGke,EAAY,SAAS,CAAA,CAAA,EAAI6E,CAAmB,CAAA,CAAA,EAAI/iB,CAAK,CAAA,CAAA,CAEpDse,CAAAA,CAA4B,CAChCyE,CAAAA,CACA/iB,EACA8iB,CAAAA,CACAhD,CAAAA,GACG,CAAA,EAAGzB,CAAAA,CAA0B0E,EAAqB/iB,CAAK,CAAC,CAAA,CAAA,EAAI8iB,CAAc,IAAIhD,CAAW,CAAA,CAAA,CAExF1E,EAAgB8G,CAAAA,CAAa,IAAA,CAAM92B,GACvC,MAAA,CAAO,MAAA,CAAOA,CAAAA,EAAS,EAAE,CAAA,CAAE,IAAA,CAAMY,CAAAA,EAAMA,CAAAA,GAAM,IAAMA,CAAAA,GAAM,IAAA,EAAQA,CAAAA,GAAM,MAAS,CAClF,CAAA,CAoQA,OAAO,CACL,cAAA,CAAAk1B,CAAAA,CACA,kBAAAkB,CAAAA,CACA,YAAA,CAAA/G,CAAAA,CACA,YAAA,CAAA6G,EACA,YAAA,CAAAW,CAAAA,CACA,aAAA,CAAAzH,CAAAA,CACA,YAAA8C,CAAAA,CACA,YAAA,CA1QoBle,CAAAA,EAAkB,CACtC,IAAMgjB,CAAAA,CAAc,IAAI,IAAI9B,CAAc,CAAA,CACtC8B,EAAY,GAAA,CAAIhjB,CAAK,CAAA,CACvBgjB,CAAAA,CAAY,OAAOhjB,CAAK,CAAA,CAExBgjB,CAAAA,CAAY,GAAA,CAAIhjB,CAAK,CAAA,CAEvBoiB,CAAAA,CAAkBY,CAAW,EAC/B,EAmQE,SAAA,CAjQgB,IAAM,CACtB,IAAMP,EAAa,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQpH,CAAa,CAAA,CAAG,CAACvkB,CAAAA,CAAGlJ,CAAAA,GAAMA,CAAC,CAAA,CACnEw0B,CAAAA,CAAkB,IAAI,GAAA,CAAIK,CAAU,CAAC,EACvC,EA+PE,WAAA,CA7PkB,IAAM,CACxBL,CAAAA,CAAkB,IAAI,GAAK,EAC7B,EA4PE,iBAAA,CA1PyBa,CAAAA,EAAkB,CAC3C,IAAA,IAASr1B,EAAI,CAAA,CAAGA,CAAAA,CAAIytB,CAAAA,CAAcztB,CAAAA,EAAAA,CAAK,CACrC,IAAMs1B,CAAAA,CAAYD,CAAAA,CAAOr1B,CAAC,GAAK,EAAC,CAChCswB,CAAAA,CAAY,UAAA,CAAW,QAASS,CAAAA,EAAa,CAC3C,IAAMlD,CAAAA,CAAW2C,EAAmBO,CAAAA,CAAS,SAAA,CAAW/wB,CAAC,CAAA,CACnDgS,EAAesjB,CAAAA,CAAUvE,CAAAA,CAAS,SAAS,CAAA,CACjDrgB,CAAAA,CAASmd,EAAU7b,CAAAA,EAAgB,EAAA,CAAI,CACrC,cAAA,CAAgB,KAChB,WAAA,CAAa,IACf,CAAC,CAAA,CAGD,IAAMujB,CAAAA,CAAgB,CAAA,MAAA,EAAS1H,CAAQ,CAAA,CAAA,CACjCuB,EAAiB,CAAA,MAAA,EAAS2B,CAAAA,CAAS,SAAS,CAAA,CAAA,CASlD,GARIuE,CAAAA,CAAUlG,CAAc,CAAA,GAAM,MAAA,EAChC1e,EAAS6kB,CAAAA,CAAeD,CAAAA,CAAUlG,CAAc,CAAA,EAAK,GAAI,CACvD,cAAA,CAAgB,IAAA,CAChB,WAAA,CAAa,IACf,CAAC,CAAA,CAIC2B,EAAS,WAAA,CAAa,CACxB,IAAM5B,CAAAA,CAAcmG,CAAAA,CAAUvE,CAAAA,CAAS,SAAS,EAChD,GAAI5B,CAAAA,CAEF,GAAI,OAAOA,GAAgB,QAAA,CAAU,CACnC,IAAMY,CAAAA,CAAegB,EAAS,WAAA,CAAY5B,CAAW,EACjDY,CAAAA,EACFA,CAAAA,CAAa,WAAW,OAAA,CAAQG,CAAAA,EAAe,CAC7C,IAAMwB,EAAgB,CAAA,EAAGX,CAAAA,CAAS,SAAS,CAAA,CAAA,EAAI5B,CAAW,CAAA,CAAA,EAAIe,CAAAA,CAAY,SAAS,CAAA,CAAA,CAC7EsF,EAAiB,CAAA,EAAG3H,CAAQ,IAAIsB,CAAW,CAAA,CAAA,EAAIe,EAAY,SAAS,CAAA,CAAA,CACtEoF,CAAAA,CAAU5D,CAAa,IAAM,MAAA,EAC/BhhB,CAAAA,CAAS8kB,CAAAA,CAAgBF,CAAAA,CAAU5D,CAAa,CAAA,EAAK,EAAA,CAAI,CACvD,cAAA,CAAgB,KAChB,WAAA,CAAa,IACf,CAAC,EAEL,CAAC,EAEL,CAAA,KAES,KAAA,CAAM,OAAA,CAAQvC,CAAW,CAAA,EAChCA,CAAAA,CAAY,OAAA,CAAS5W,CAAAA,EAAwB,CAC3C,IAAMwX,CAAAA,CAAegB,CAAAA,CAAS,WAAA,CAAYxY,CAAW,CAAA,CACjDwX,CAAAA,EACFA,EAAa,UAAA,CAAW,OAAA,CAAQG,GAAe,CAC7C,IAAMwB,CAAAA,CAAgB,CAAA,EAAGX,EAAS,SAAS,CAAA,CAAA,EAAIxY,CAAW,CAAA,CAAA,EAAI2X,EAAY,SAAS,CAAA,CAAA,CAC7EsF,CAAAA,CAAiB,CAAA,EAAG3H,CAAQ,CAAA,CAAA,EAAItV,CAAW,CAAA,CAAA,EAAI2X,CAAAA,CAAY,SAAS,CAAA,CAAA,CACtEoF,CAAAA,CAAU5D,CAAa,CAAA,GAAM,QAC/BhhB,CAAAA,CAAS8kB,CAAAA,CAAgBF,CAAAA,CAAU5D,CAAa,GAAK,EAAA,CAAI,CACvD,cAAA,CAAgB,IAAA,CAChB,YAAa,IACf,CAAC,EAEL,CAAC,EAEL,CAAC,EAGP,CAEA,GAAIX,CAAAA,CAAS,YAAa,CACxB,IAAM0E,CAAAA,CAAa,KAAA,CAAM,QAAQH,CAAAA,CAAUvE,CAAAA,CAAS,WAAA,CAAY,SAAS,CAAC,CAAA,CACtEuE,CAAAA,CAAUvE,CAAAA,CAAS,WAAA,CAAY,SAAS,CAAA,CACxC,EAAC,CAAA,CAE8B/e,CAAAA,EAAiB,MAAQA,CAAAA,GAAiB,EAAA,GAAOyjB,CAAAA,CAAW,MAAA,CAAS,GACtG/kB,CAAAA,CAASmd,CAAAA,CAAU4H,CAAAA,CAAW,MAAA,CAAQ,CACpC,cAAA,CAAgB,IAAA,CAChB,YAAa,IACf,CAAC,EAGHA,CAAAA,CAAW,OAAA,CAAQ,CAACtvB,CAAAA,CAAmC,EAAC,CAAG+rB,CAAAA,GAAwB,CACjFnB,CAAAA,CAAS,YAAa,UAAA,CAAW,OAAA,CAAS/qB,CAAAA,EAAe,CACvD,IAAMmsB,CAAAA,CAAWzB,CAAAA,CACfK,EAAS,WAAA,CAAa,SAAA,CACtB/wB,EACAgG,CAAAA,CAAW,SAAA,CACXksB,CACF,CAAA,CACAxhB,EAASyhB,CAAAA,CAAUhsB,CAAAA,GAAcH,CAAAA,CAAW,SAAS,GAAK,EAAA,CAAI,CAC5D,cAAA,CAAgB,IAAA,CAChB,YAAa,IACf,CAAC,EACH,CAAC,EACH,CAAC,EACH,CACF,CAAC,EACH,CACF,CAAA,CAgKE,UAAA,CA9JiB,IAAM,CACvB,IAAM8pB,CAAAA,CAAgC,EAAC,CACvC,IAAA,IAAS9vB,EAAI,CAAA,CAAGA,CAAAA,CAAIytB,CAAAA,CAAcztB,CAAAA,EAAAA,CAAK,CACrC,IAAMxC,CAAAA,CAA6B,EAAC,CACpC8yB,EAAY,UAAA,CAAW,OAAA,CAASS,CAAAA,EAAa,CAC3C,IAAMlD,CAAAA,CAAW2C,CAAAA,CAAmBO,CAAAA,CAAS,SAAA,CAAW/wB,CAAC,CAAA,CACnD01B,CAAAA,CAAW/kB,EAAUkd,CAAQ,CAAA,CACnCrwB,EAAMuzB,CAAAA,CAAS,SAAS,CAAA,CAAI2E,CAAAA,CAG5B,IAAMH,CAAAA,CAAgB,CAAA,MAAA,EAAS1H,CAAQ,CAAA,CAAA,CACjC8H,EAAkBhlB,CAAAA,CAAU4kB,CAAa,CAAA,CAM/C,GALqCI,GAAoB,IAAA,EAAQA,CAAAA,GAAoB,EAAA,GACnFn4B,CAAAA,CAAM,SAASuzB,CAAAA,CAAS,SAAS,CAAA,CAAE,CAAA,CAAI4E,GAIrC5E,CAAAA,CAAS,WAAA,CAAA,CACX,GAAIA,CAAAA,CAAS,YAAc,UAAA,EAAc,KAAA,CAAM,OAAA,CAAQ2E,CAAQ,EAE7DA,CAAAA,CAAS,OAAA,CAASnd,GAAwB,CACxC,IAAMwX,EAAegB,CAAAA,CAAS,WAAA,CAAaxY,CAAW,CAAA,CAClDwX,GACFA,CAAAA,CAAa,UAAA,CAAW,OAAA,CAAQG,CAAAA,EAAe,CAC7C,IAAMsF,CAAAA,CAAiB,CAAA,EAAG3H,CAAQ,IAAItV,CAAW,CAAA,CAAA,EAAI2X,CAAAA,CAAY,SAAS,GACpE0F,CAAAA,CAAcjlB,CAAAA,CAAU6kB,CAAc,CAAA,CACXI,GAAgB,IAAA,EAAQA,CAAAA,GAAgB,EAAA,GACvEp4B,CAAAA,CAAM,GAAGuzB,CAAAA,CAAS,SAAS,CAAA,CAAA,EAAIxY,CAAW,IAAI2X,CAAAA,CAAY,SAAS,EAAE,CAAA,CAAI0F,CAAAA,EAE7E,CAAC,EAEL,CAAC,CAAA,CAAA,KAAA,GACQ,OAAOF,GAAa,QAAA,EAAYA,CAAAA,CAAU,CAEnD,IAAM3F,EAAegB,CAAAA,CAAS,WAAA,CAAY2E,CAAQ,CAAA,CAC9C3F,GACFA,CAAAA,CAAa,UAAA,CAAW,QAAQG,CAAAA,EAAe,CAC7C,IAAMsF,CAAAA,CAAiB,CAAA,EAAG3H,CAAQ,CAAA,CAAA,EAAI6H,CAAQ,CAAA,CAAA,EAAIxF,CAAAA,CAAY,SAAS,CAAA,CAAA,CACjE0F,EAAcjlB,CAAAA,CAAU6kB,CAAc,CAAA,CACXI,CAAAA,EAAgB,MAAQA,CAAAA,GAAgB,EAAA,GACvEp4B,EAAM,CAAA,EAAGuzB,CAAAA,CAAS,SAAS,CAAA,CAAA,EAAI2E,CAAQ,CAAA,CAAA,EAAIxF,CAAAA,CAAY,SAAS,CAAA,CAAE,CAAA,CAAI0F,CAAAA,EAE1E,CAAC,EAEL,CAAA,CAGF,GAAI7E,CAAAA,CAAS,WAAA,CAAa,CACxB,IAAMgB,CAAAA,CAAc,IAAA,CAAK,GAAA,CAAI,EAAG,MAAA,CAAO2D,CAAQ,CAAA,EAAK,CAAC,EAC/CG,CAAAA,CAAuC,EAAC,CAE9C,IAAA,IAAS3D,EAAc,CAAA,CAAGA,CAAAA,CAAcH,CAAAA,CAAaG,CAAAA,EAAAA,CAAe,CAClE,IAAM/rB,CAAAA,CAAmC,EAAC,CAC1C4qB,CAAAA,CAAS,YAAY,UAAA,CAAW,OAAA,CAAS/qB,CAAAA,EAAe,CACtD,IAAMmsB,CAAAA,CAAWzB,CAAAA,CACfK,CAAAA,CAAS,WAAA,CAAa,UACtB/wB,CAAAA,CACAgG,CAAAA,CAAW,SAAA,CACXksB,CACF,EACA/rB,CAAAA,CAAYH,CAAAA,CAAW,SAAS,CAAA,CAAI2K,EAAUwhB,CAAQ,EACxD,CAAC,CAAA,CACD0D,EAAc,IAAA,CAAK1vB,CAAW,EAChC,CAEA3I,EAAMuzB,CAAAA,CAAS,WAAA,CAAY,SAAS,CAAA,CAAI8E,EAC1C,CACF,CAAC,EACD/F,CAAAA,CAAO,IAAA,CAAKtyB,CAAK,EACnB,CAEAkT,CAAAA,CAAS4f,CAAAA,CAAY,UAAWR,CAAAA,CAAQ,CACtC,cAAA,CAAgB,IAAA,CAChB,YAAa,IACf,CAAC,EACH,CAAA,CAoFE,YAlFkB,IAAM,CACxB,IAAA,IAAS9vB,CAAAA,CAAI,EAAGA,CAAAA,CAAIytB,CAAAA,CAAcztB,CAAAA,EAAAA,CAChCswB,CAAAA,CAAY,WAAW,OAAA,CAASS,CAAAA,EAAa,CAC3C,IAAMlD,EAAW2C,CAAAA,CAAmBO,CAAAA,CAAS,SAAA,CAAW/wB,CAAC,EACnDgS,CAAAA,CAAerB,CAAAA,CAAUkd,CAAQ,CAAA,CAGjC0H,CAAAA,CAAgB,SAAS1H,CAAQ,CAAA,CAAA,CAsBvC,GArBAnd,CAAAA,CAAS6kB,EAAe,EAAA,CAAI,CAC1B,cAAA,CAAgB,IAAA,CAChB,YAAa,IACf,CAAC,CAAA,CAGGxE,CAAAA,CAAS,aACX,MAAA,CAAO,IAAA,CAAKA,EAAS,WAAW,CAAA,CAAE,QAAQxY,CAAAA,EAAe,CACvD,IAAMwX,CAAAA,CAAegB,EAAS,WAAA,CAAaxY,CAAW,CAAA,CAClDwX,CAAAA,EACFA,EAAa,UAAA,CAAW,OAAA,CAAQG,CAAAA,EAAe,CAC7C,IAAMsF,CAAAA,CAAiB,CAAA,EAAG3H,CAAQ,CAAA,CAAA,EAAItV,CAAW,IAAI2X,CAAAA,CAAY,SAAS,CAAA,CAAA,CAC1Exf,CAAAA,CAAS8kB,EAAgB,EAAA,CAAI,CAC3B,cAAA,CAAgB,IAAA,CAChB,YAAa,IACf,CAAC,EACH,CAAC,EAEL,CAAC,CAAA,CAGCzE,CAAAA,CAAS,WAAA,CAAa,CACxB,IAAMgB,CAAAA,CAAc,IAAA,CAAK,GAAA,CAAI,EAAG,MAAA,CAAO/f,CAAY,CAAA,EAAK,CAAC,EACzD,IAAA,IAASkgB,CAAAA,CAAc,CAAA,CAAGA,CAAAA,CAAcH,EAAaG,CAAAA,EAAAA,CACnDnB,CAAAA,CAAS,YAAY,UAAA,CAAW,OAAA,CAAS/qB,GAAe,CACtD,IAAMmsB,CAAAA,CAAWzB,CAAAA,CACfK,EAAS,WAAA,CAAa,SAAA,CACtB/wB,CAAAA,CACAgG,CAAAA,CAAW,UACXksB,CACF,CAAA,CACAxhB,CAAAA,CAASyhB,CAAAA,CAAU,GAAI,CACrB,cAAA,CAAgB,IAAA,CAChB,WAAA,CAAa,IACf,CAAC,EACH,CAAC,CAAA,CAEHzhB,EAAS+f,CAAAA,CAA0BM,CAAAA,CAAS,WAAA,CAAY,SAAA,CAAW/wB,CAAC,CAAA,CAAG,EAAC,CAAG,CACzE,eAAgB,IAAA,CAChB,WAAA,CAAa,IACf,CAAC,EACH,CAEA0Q,CAAAA,CAASmd,CAAAA,CAAU,EAAA,CAAI,CACrB,eAAgB,IAAA,CAChB,WAAA,CAAa,IACf,CAAC,EACH,CAAC,CAAA,CAGHnd,CAAAA,CAAS4f,CAAAA,CAAY,UAAW,EAAC,CAAG,CAClC,cAAA,CAAgB,KAChB,WAAA,CAAa,IACf,CAAC,CAAA,CAED5f,EAASzT,CAAAA,CAAM,SAAA,CAAW,CAAA,CAAG,CAC3B,eAAgB,IAAA,CAChB,WAAA,CAAa,IACf,CAAC,EACH,CAAA,CAgBE,kBAAA,CAAAuzB,EACA,yBAAA,CAAAC,CAAAA,CACA,0BAAAC,CACF,CACF,CAAA,CChTO,IAAMoF,EAAAA,CAAgB,IAAM,CACjC,GAAM,CAAC5B,EAAa6B,CAAc,CAAA,CAAI90B,SAAS,KAAK,CAAA,CAC9C,CAACktB,CAAAA,CAAY6H,CAAa,CAAA,CAAI/0B,QAAAA,CAAS,KAAK,CAAA,CAC5C,CAACg1B,CAAAA,CAAgBC,CAAiB,CAAA,CAAIj1B,QAAAA,CAAS,KAAK,CAAA,CAEpDkzB,CAAAA,CAAW9yB,OAAuB,IAAI,CAAA,CACtC+yB,EAAa/yB,MAAAA,CAAuB,IAAI,CAAA,CACxCgzB,CAAAA,CAAahzB,OAAuB,IAAI,CAAA,CAExC80B,CAAAA,CAAY,CAACC,EAAoB,KAAA,CAAOC,CAAAA,CAAyB,IAAA,GAAS,CAC1E,CAACA,CAAAA,EAAiBJ,CAAAA,GACtBD,CAAAA,CAAcI,CAAQ,EACtBL,CAAAA,CAAe,IAAI,CAAA,CACfM,CAAAA,EAAeH,EAAkB,KAAK,CAAA,EAC5C,CAAA,CAEMI,CAAAA,CAAa,CAACC,CAAAA,CAAyB,KAAA,GAAU,CACrD,GAAI,CAAClC,CAAAA,CAAW,OAAA,EAAW,CAACD,CAAAA,CAAW,OAAA,CAAS,OAC5CmC,CAAAA,EAAeL,CAAAA,CAAkB,IAAI,CAAA,CAEzC,IAAMM,CAAAA,CAAcnC,CAAAA,CAAW,OAAA,CAAQ,OAAA,CACrC,CACE,CAAE,OAAA,CAAS,GAAA,CAAK,SAAA,CAAW,0BAA2B,CAAA,CACtD,CAAE,OAAA,CAAS,GAAA,CAAK,UAAW,6BAA8B,CAC3D,CAAA,CACA,CAAE,SAAU,GAAA,CAAK,MAAA,CAAQ,SAAA,CAAW,IAAA,CAAM,UAAW,CACvD,CAAA,CAEAD,CAAAA,CAAW,OAAA,CAAQ,QACjB,CAAC,CAAE,QAAS,GAAI,CAAA,CAAG,CAAE,OAAA,CAAS,GAAI,CAAC,CAAA,CACnC,CAAE,QAAA,CAAU,GAAA,CAAK,KAAA,CAAO,EAAA,CAAI,OAAQ,SAAA,CAAW,IAAA,CAAM,UAAW,CAClE,EAEAoC,CAAAA,CAAY,QAAA,CAAW,IAAM,CAC3BT,EAAe,KAAK,CAAA,CACpBC,CAAAA,CAAc,KAAK,EACrB,EACF,CAAA,CAGA,OAAAxkB,SAAAA,CAAU,IAAM,CACV0iB,CAAAA,EAAeE,CAAAA,CAAW,OAAA,EAAWC,EAAW,OAAA,GAClDD,CAAAA,CAAW,QAAQ,OAAA,CACjB,CAAC,CAAE,OAAA,CAAS,GAAI,CAAA,CAAG,CAAE,QAAS,GAAI,CAAC,CAAA,CACnC,CAAE,SAAU,GAAA,CAAK,MAAA,CAAQ,UAAA,CAAY,IAAA,CAAM,UAAW,CACxD,CAAA,CAEAC,EAAW,OAAA,CAAQ,OAAA,CACjB,CACE,CAAE,OAAA,CAAS,GAAA,CAAK,SAAA,CAAW,6BAA8B,CAAA,CACzD,CAAE,OAAA,CAAS,GAAA,CAAK,UAAW,0BAA2B,CACxD,CAAA,CACA,CAAE,SAAU,GAAA,CAAK,KAAA,CAAO,GAAI,MAAA,CAAQ,UAAA,CAAY,KAAM,UAAW,CACnE,CAAA,EAEJ,CAAA,CAAG,CAACH,CAAW,CAAC,CAAA,CAEhB1iB,SAAAA,CAAU,KACR,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAW0iB,EAAc,QAAA,CAAW,EAAA,CACjD,IAAM,CAAE,SAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAW,GAAI,GACjD,CAACA,CAAW,CAAC,CAAA,CAET,CACL,WAAA,CAAAA,CAAAA,CACA,UAAA,CAAA/F,CAAAA,CACA,SAAAgG,CAAAA,CACA,UAAA,CAAAC,EACA,UAAA,CAAAC,CAAAA,CACA,UAAA8B,CAAAA,CACA,UAAA,CAAAG,CAAAA,CACA,cAAA,CAAAL,CACF,CACF,CAAA,CC7DA,IAAMQ,GAA0D,CAAC,CAC/D,MAAAx5B,CAAAA,CACA,UAAA,CAAAqN,EACA,WAAA,CAAA6C,CAAAA,CAAc,IAChB,CAAA,GAAM,CACJ,GAAM,CACJ,cAAA,CAAAmmB,CAAAA,CACA,kBAAAkB,CAAAA,CACA,YAAA,CAAA/G,CAAAA,CACA,YAAA,CAAA6G,EACA,YAAA,CAAAW,CAAAA,CACA,cAAAzH,CAAAA,CACA,WAAA,CAAA8C,EACA,YAAA,CAAAoG,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CACA,WAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,kBAAA,CAAArG,EACA,yBAAA,CAAAC,CAAAA,CACA,yBAAA,CAAAC,CACF,EAAIsE,EAAAA,CAAoB/3B,CAAAA,CAAOqN,CAAU,CAAA,CAEnC,CACJ,WAAA,CAAA4pB,CAAAA,CACA,UAAA,CAAA/F,CAAAA,CACA,SAAAgG,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,EACA,SAAA,CAAA8B,CAAAA,CACA,UAAA,CAAAG,CAEF,CAAA,CAAIR,IAAc,CAGlB,OAAAtkB,UAAU,IAAM,CACd,IAAMQ,CAAAA,CAAe,OAAOijB,CAAY,CAAA,EAAK,CAAA,CAEzCjjB,CAAAA,CAAe,GAAK,CAACwb,CAAAA,EAAiB,CAAC0G,CAAAA,CACzC,WAAW,IAAM,CACfiC,EAAU,KAAA,CAAO,KAAK,EACxB,CAAA,CAAG,GAAG,CAAA,CACGnkB,CAAAA,GAAiB,GAC1BskB,CAAAA,CAAW,KAAK,EAEpB,CAAA,CAAG,CAACrB,CAAAA,CAAczH,CAAAA,CAAe0G,CAAAA,CAAaiC,CAAAA,CAAWG,CAAU,CAAC,CAAA,CA2BlEtpB,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC2oB,EAAAA,CAAA,CACC,MAAOhxB,CAAAA,CACP,WAAA,CAAakQ,CAAAA,CACb,UAAA,CAAY7C,EACZ,kBAAA,CAAoB,IAAA,CACpB,aAAA,CAAekjB,CAAAA,CACf,aAAcC,CAAAA,CACd,WAAA,CAAa,IAAM0I,CAAAA,CAAU,MAAO,IAAI,CAAA,CACxC,UAAA,CAlCiB,IAAM,CAC3BQ,CAAAA,CAAkBrC,CAAY,CAAA,CAC9B6B,CAAAA,CAAU,MAAO,IAAI,EACvB,CAAA,CAgCM,UAAA,CA9BiB,IAAM,CAC3BQ,CAAAA,CAAkBrC,CAAY,CAAA,CAC9B6B,CAAAA,CAAU,KAAM,IAAI,EACtB,CAAA,CA4BI,CAAA,CAEA7wB,IAACyvB,EAAAA,CAAA,CACC,WAAA,CAAab,CAAAA,CACb,WAAY/F,CAAAA,CACZ,QAAA,CAAUgG,CAAAA,CACV,UAAA,CAAYC,EACZ,UAAA,CAAYC,CAAAA,CACZ,cAAA,CAAgBf,CAAAA,CAChB,aAAc7F,CAAAA,CACd,aAAA,CAAeD,CAAAA,CACf,WAAA,CAAa8C,EACb,WAAA,CAAanjB,CAAAA,CACb,UAAA,CAAY7C,CAAAA,CACZ,aAAcgqB,CAAAA,CACd,kBAAA,CAAoB9D,CAAAA,CACpB,yBAAA,CAA2BC,EAC3B,yBAAA,CAA2BC,CAAAA,CAC3B,QAvCc,IAAM,CACxB4F,EAAW,IAAI,EACjB,CAAA,CAsCM,OAAA,CApCc,IAAM,CACxBO,CAAAA,EAAY,CACZP,CAAAA,CAAW,KAAK,EAClB,CAAA,CAkCM,MAAA,CA9Ca,IAAM,CACvBM,CAAAA,EAAW,CACXN,CAAAA,CAAW,IAAI,EACjB,CAAA,CA4CM,cAAA,CAAgBI,CAAAA,CAChB,iBAAA,CAAmBlC,EACrB,CAAA,CAAA,CACF,CAEJ,CAAA,CAEOsC,EAAAA,CAAQL,GCxGf,IAAMM,EAAAA,CAA4C,CAAC,CACjD,KAAA,CAAA95B,CAAAA,CACA,IAAA,CAAA2a,CAAAA,CACA,YAAAzK,CAAAA,CAAc,IAAA,CACd,UAAAV,CAAAA,CACA,YAAA,CAAA4O,EAAe,EAAA,CACf,aAAA,CAAA2b,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,QAAA,CAAAtmB,CAAAA,CAAU,MAAAD,CAAM,CAAA,CAAIvE,cAAAA,EAAe,CACrCvO,EAAYia,CAAAA,EAAQ3a,CAAAA,CAAM,SAAA,CAAU,QAAA,GACpCwO,CAAAA,CAAYxO,CAAAA,CAAM,uBAAA,EAAyB,SAAA,EAAa,EAGxD,CAACg6B,CAAAA,CAAWC,CAAY,CAAA,CAAIj2B,SAChC,KAAA,CAAMwK,CAAS,CAAA,CAAE,IAAA,CAAK,EAAE,CAC1B,CAAA,CAGM0rB,EAAY91B,MAAAA,CAAoC,EAAE,CAAA,CAGlD2Q,CAAAA,CAAevB,CAAAA,CAAM9S,CAAS,EACpC6T,SAAAA,CAAU,IAAM,CACd,GAAIQ,GAAgB,OAAOA,CAAAA,EAAiB,QAAA,EAAYA,CAAAA,CAAa,SAAWvG,CAAAA,CAAW,CACzF,IAAMvN,CAAAA,CAAS8T,EAAa,KAAA,CAAM,EAAE,CAAA,CAAE,KAAA,CAAM,EAAGvG,CAAS,CAAA,CACxDyrB,CAAAA,CAAah5B,CAAM,EACrB,CAAA,KAAA,GAAWmd,CAAAA,EAAgBA,CAAAA,CAAa,MAAA,GAAW5P,EAAW,CAC5D,IAAMvN,EAASmd,CAAAA,CAAa,KAAA,CAAM,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG5P,CAAS,EACxDyrB,CAAAA,CAAah5B,CAAM,EACrB,CACF,EAAG,CAAC8T,CAAAA,CAAcqJ,CAAAA,CAAc5P,CAAS,CAAC,CAAA,CAG1C+F,SAAAA,CAAU,IAAM,CACd,IAAM4lB,CAAAA,CAAYH,CAAAA,CAAU,IAAA,CAAK,EAAE,EAC/BG,CAAAA,CAAU,MAAA,GAAW3rB,CAAAA,CACvBiF,CAAAA,CAAS/S,EAAWy5B,CAAAA,CAAW,CAC7B,cAAA,CAAgB,IAAA,CAChB,YAAa,IACf,CAAC,EAED1mB,CAAAA,CAAS/S,CAAAA,CAAWy5B,EAAW,CAC7B,cAAA,CAAgB,KAAA,CAChB,WAAA,CAAa,IACf,CAAC,EAEL,CAAA,CAAG,CAACH,EAAWt5B,CAAAA,CAAW+S,CAAAA,CAAUjF,CAAS,CAAC,EAG9C+F,SAAAA,CAAU,IAAM,CACd,IAAM4lB,CAAAA,CAAYH,EAAU,IAAA,CAAK,EAAE,CAAA,CACnC,GAAIG,EAAU,MAAA,GAAW3rB,CAAAA,EAAaurB,CAAAA,CAAe,CAEnD,IAAMK,CAAAA,CAAQ,UAAA,CAAW,IAAM,CAC7BL,EAAcI,CAAS,EACzB,EAAG,GAAG,CAAA,CACN,OAAO,IAAM,YAAA,CAAaC,CAAK,CACjC,CACF,CAAA,CAAG,CAACJ,CAAAA,CAAWxrB,CAAAA,CAAWurB,CAAa,CAAC,CAAA,CAExC,IAAMpQ,CAAAA,CAAe,CAACxU,CAAAA,CAAevU,CAAAA,GAAkB,CAErD,IAAM0mB,EAAe1mB,CAAAA,CAAM,OAAA,CAAQ,KAAA,CAAO,EAAE,EAE5C,GAAI0mB,CAAAA,CAAa,MAAA,CAAS,CAAA,CAAG,CAE3B,IAAM+S,CAAAA,CAAW/S,CAAAA,CAAa,KAAA,CAAM,EAAE,CAAA,CACtCgT,CAAAA,CAAenlB,EAAOklB,CAAQ,EAChC,MAAW/S,CAAAA,CAAa,MAAA,GAAW,CAAA,CACjCgT,CAAAA,CAAenlB,EAAOmS,CAAY,CAAA,CAElCgT,CAAAA,CAAenlB,CAAAA,CAAO,EAAE,EAE5B,CAAA,CAEMmlB,CAAAA,CAAiB,CAACnlB,EAAevU,CAAAA,GAAkB,CACvD,IAAM2a,CAAAA,CAAY,CAAC,GAAGye,CAAS,CAAA,CAC/Bze,CAAAA,CAAUpG,CAAK,CAAA,CAAIvU,CAAAA,CACnBq5B,CAAAA,CAAa1e,CAAS,EAGlB3a,CAAAA,EAASuU,CAAAA,CAAQ3G,CAAAA,CAAY,CAAA,EAC/B,WAAW,IAAM,CACf0rB,EAAU,OAAA,CAAQ/kB,CAAAA,CAAQ,CAAC,CAAA,EAAG,KAAA,GAChC,CAAA,CAAG,EAAE,EAET,CAAA,CAEMolB,CAAAA,CAAgB,CAACplB,EAAe/E,CAAAA,GAA6C,CAE7EA,CAAAA,CAAE,GAAA,GAAQ,aAAe+E,CAAAA,CAAQ,CAAA,EACnC/E,CAAAA,CAAE,cAAA,GACF8pB,CAAAA,CAAU,OAAA,CAAQ/kB,CAAAA,CAAQ,CAAC,GAAG,KAAA,EAAM,EAC3B/E,CAAAA,CAAE,GAAA,GAAQ,cAAgB+E,CAAAA,CAAQ3G,CAAAA,CAAY,CAAA,GACvD4B,CAAAA,CAAE,gBAAe,CACjB8pB,CAAAA,CAAU,QAAQ/kB,CAAAA,CAAQ,CAAC,GAAG,KAAA,EAAM,CAAA,CAIlC/E,CAAAA,CAAE,GAAA,GAAQ,aAAe,CAAC4pB,CAAAA,CAAU7kB,CAAK,CAAA,EAAKA,EAAQ,CAAA,GACxD/E,CAAAA,CAAE,cAAA,EAAe,CACjB8pB,EAAU,OAAA,CAAQ/kB,CAAAA,CAAQ,CAAC,CAAA,EAAG,KAAA,IAI5B/E,CAAAA,CAAE,GAAA,GAAQ,QAAA,EACZkqB,CAAAA,CAAenlB,EAAO,EAAE,EAE5B,CAAA,CAEMqlB,CAAAA,CAAepqB,GAA8C,CACjEA,CAAAA,CAAE,cAAA,EAAe,CAEjB,IAAMnP,CAAAA,CADamP,CAAAA,CAAE,cAAc,OAAA,CAAQ,MAAM,EAAE,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAC1C,MAAM,CAAA,CAAG5B,CAAS,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,CAEhD+M,CAAAA,CAAY,CAAC,GAAGye,CAAS,CAAA,CAC/B/4B,CAAAA,CAAO,OAAA,CAAQ,CAACw5B,EAAM13B,CAAAA,GAAM,CACtBA,CAAAA,CAAIyL,CAAAA,GACN+M,EAAUxY,CAAC,CAAA,CAAI03B,CAAAA,EAEnB,CAAC,EAEDR,CAAAA,CAAa1e,CAAS,CAAA,CAGtB,IAAMmf,EAAkB,IAAA,CAAK,GAAA,CAAIz5B,EAAO,MAAA,CAAS,CAAA,CAAGuN,EAAY,CAAC,CAAA,CACjE,UAAA,CAAW,IAAM,CACf0rB,CAAAA,CAAU,OAAA,CAAQQ,CAAe,CAAA,EAAG,QACtC,CAAA,CAAG,EAAE,EACP,EAEA,OACEryB,GAAAA,CAACgI,CAAAA,CAAA,CAAiB,MAAOrQ,CAAAA,CAAO,WAAA,CAAakQ,CAAAA,CAC3C,QAAA,CAAA7H,IAAC,KAAA,CAAA,CAAI,SAAA,CAAW,CAAA,0BAAA,EAA6BmH,CAAAA,EAAa,EAAE,CAAA,CAAA,CACzD,QAAA,CAAAwqB,CAAAA,CAAU,GAAA,CAAI,CAACp5B,CAAAA,CAAOuU,CAAAA,GACrB9M,IAAC,OAAA,CAAA,CAEC,GAAA,CAAMouB,GAAO,CACXyD,CAAAA,CAAU,OAAA,CAAQ/kB,CAAK,EAAIshB,EAC7B,CAAA,CACA,IAAA,CAAK,MAAA,CACL,UAAU,SAAA,CACV,SAAA,CAAW,CAAA,CACX,KAAA,CAAO71B,EACP,QAAA,CAAWwP,CAAAA,EAAMuZ,CAAAA,CAAaxU,CAAAA,CAAO/E,EAAE,MAAA,CAAO,KAAK,CAAA,CACnD,SAAA,CAAYA,GAAMmqB,CAAAA,CAAcplB,CAAAA,CAAO/E,CAAC,CAAA,CACxC,QAASoqB,CAAAA,CACT,SAAA,CAAU,wLAAA,CACV,SAAA,CAAWrlB,IAAU,CAAA,EAAK,CAAC6kB,EAAU,IAAA,CAAK74B,CAAAA,EAAKA,CAAC,CAAA,CAAA,CAZ3CgU,CAaP,CACD,CAAA,CACH,EACF,CAEJ,CAAA,CAEOwlB,EAAAA,CAAQb,EAAAA,CCjJf,IAAMc,EAAAA,CAAoC,CAAC,CACzC,MAAA,CAAA3a,CAAAA,CACA,MAAAjgB,CAAAA,CACA,WAAA,CAAAkQ,CAAAA,CACA,UAAA,CAAA7C,EACA,cAAA,CAAAwtB,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,YAAAC,CAAAA,CAAc,KAAA,CACd,cAAA,CAAAC,CAAAA,CAAiB,EACjB,YAAA,CAAAC,CAAAA,CAAe,MACf,OAAA,CAAA9J,CAAAA,CACA,UAAA+J,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,EACA,kBAAA,CAAAC,CAAAA,CACA,QAAA,CAAApoB,CAAAA,CACA,OAAAqoB,CAAAA,CACA,aAAA,CAAA11B,CAAAA,CAAgB,KAAA,CAChB,YAAA21B,CAAAA,CACA,aAAA,CAAAxB,CACF,CAAA,GAAM,CACJ,IAAM7C,CAAAA,CAAWhvB,WAAAA,CAAM,MAAA,CAAuB,IAAI,CAAA,CAC5CivB,CAAAA,CAAajvB,WAAAA,CAAM,MAAA,CAAuB,IAAI,CAAA,CAC9CkvB,CAAAA,CAAalvB,WAAAA,CAAM,MAAA,CAAuB,IAAI,CAAA,CA+BpD,GA5BAA,YAAM,SAAA,CAAU,IAAM,CAChB+X,CAAAA,EAAUkX,CAAAA,CAAW,OAAA,EAAWC,CAAAA,CAAW,UAC7CD,CAAAA,CAAW,OAAA,CAAQ,OAAA,CACjB,CAAC,CAAE,OAAA,CAAS,GAAI,CAAA,CAAG,CAAE,QAAS,GAAI,CAAC,CAAA,CACnC,CAAE,SAAU,GAAA,CAAK,MAAA,CAAQ,UAAA,CAAY,IAAA,CAAM,UAAW,CACxD,CAAA,CACAC,CAAAA,CAAW,OAAA,CAAQ,QACjB,CACE,CAAE,OAAA,CAAS,GAAA,CAAK,UAAW,6BAA8B,CAAA,CACzD,CAAE,OAAA,CAAS,GAAA,CAAK,UAAW,0BAA2B,CACxD,CAAA,CACA,CAAE,SAAU,GAAA,CAAK,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,WAAY,IAAA,CAAM,UAAW,CACnE,CAAA,EAEJ,EAAG,CAACnX,CAAM,CAAC,CAAA,CAGX/X,YAAM,SAAA,CAAU,KACV+X,CAAAA,CACF,QAAA,CAAS,KAAK,KAAA,CAAM,QAAA,CAAW,QAAA,CAE/B,QAAA,CAAS,KAAK,KAAA,CAAM,QAAA,CAAW,EAAA,CAE1B,IAAM,CACX,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,CAAW,GACjC,GACC,CAACA,CAAM,CAAC,CAAA,CAEP,CAACA,CAAAA,CAAQ,OAAO,IAAA,CAEpB,IAAMub,EAAiBX,CAAAA,EAAgB,aAAA,EAAiBA,CAAAA,EAAgB,aAAA,CAAc,MAAK,GAAM,EAAA,CAEjG,OACE9qB,IAAAA,CAAC,KAAA,CAAA,CACC,IAAKmnB,CAAAA,CACL,SAAA,CAAU,mEAAA,CACV,KAAA,CAAO,CAAE,OAAA,CAASjX,CAAAA,CAAS,MAAA,CAAS,MAAO,EAG3C,QAAA,CAAA,CAAA5X,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK8uB,EACL,SAAA,CAAU,0EAAA,CACV,QAAShG,CAAAA,CACX,CAAA,CAGAphB,KAAC,KAAA,CAAA,CACC,GAAA,CAAKqnB,CAAAA,CACL,SAAA,CAAU,oIAGV,QAAA,CAAA,CAAArnB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iEACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,sCACX,QAAA,CAAA,OAAOrI,CAAAA,CAAM,KAAA,EAAU,QAAA,CAAWA,EAAM,KAAA,CAAQA,CAAAA,CAAM,KAAA,CAAMkQ,CAAW,GAAKlQ,CAAAA,CAAM,KAAA,CAAM,EAAA,EAAS,qBAAA,CACpG,EACAqI,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS8oB,CAAAA,CACT,SAAA,CAAU,sDAEV,QAAA,CAAA9oB,GAAAA,CAACopB,EAAA,CAAE,IAAA,CAAM,EAAA,CAAI,CAAA,CACf,GACF,CAAA,CAGA1hB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CACZ,QAAA,CAAA,CAAA/P,CAAAA,CAAM,QAAA,EACLqI,GAAAA,CAAC,KAAE,SAAA,CAAU,4BAAA,CACV,QAAA,CAAA,OAAOrI,CAAAA,CAAM,UAAa,QAAA,CACvBA,CAAAA,CAAM,QAAA,CACNA,CAAAA,CAAM,SAASkQ,CAAW,CAAA,EAAKlQ,CAAAA,CAAM,QAAA,CAAS,IAAS,EAAA,CAC7D,CAAA,CAIDu7B,CAAAA,EACClzB,GAAAA,CAAC,OAAI,SAAA,CAAU,uDAAA,CACb,SAAA0H,IAAAA,CAAC,GAAA,CAAA,CAAE,UAAU,uBAAA,CAAwB,QAAA,CAAA,CAAA,wBAAA,CACnB1H,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,eAAA,CAAiB,QAAA,CAAAkzB,CAAAA,CAAY,CAAA,CAAA,CAC/D,EACF,CAAA,CAGFlzB,GAAAA,CAACsyB,EAAAA,CAAA,CACC,MAAO36B,CAAAA,CACP,WAAA,CAAakQ,CAAAA,CACb,aAAA,CAAe6pB,EACjB,CAAA,CAGC/5B,CAAAA,CAAM,uBAAA,EAAyB,YAAA,GAAiB,OAAS,CAACi7B,CAAAA,EAAgBM,CAAAA,EAAeH,CAAAA,EACxFrrB,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6CAAA,CACb,QAAA,CAAA,CAAA1H,IAAC,GAAA,CAAA,CAAE,SAAA,CAAU,wBAAwB,QAAA,CAAA,mCAAA,CAErC,CAAA,CACAA,IAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS+yB,EACT,QAAA,CAAUL,CAAAA,EAAeC,CAAAA,CAAiB,CAAA,CAC1C,UAAU,sIAAA,CAET,QAAA,CAAAD,CAAAA,CACG,mBAAA,CACAC,EAAiB,CAAA,CACf,CAAA,UAAA,EAAaA,CAAc,CAAA,EAAA,CAAA,CAC3B,kBAAA,CACR,GACF,CAAA,CAIDH,CAAAA,EAAgB,OAAA,EACfxyB,GAAAA,CAAC,OAAI,SAAA,CAAW,CAAA,oBAAA,EACdwyB,CAAAA,CAAe,OAAA,CACX,qDACA,8CACN,CAAA,CAAA,CACE,QAAA,CAAAxyB,GAAAA,CAAC,KAAE,SAAA,CAAU,SAAA,CAAW,SAAAwyB,CAAAA,CAAe,OAAA,CAAQ,EACjD,CAAA,CAIDW,CAAAA,EACCzrB,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,uDAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,GAAA,CAAA,CAAE,UAAU,4BAAA,CAA6B,QAAA,CAAA,iBAAA,CAE1C,CAAA,CACA0H,IAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMsrB,EAAmBR,CAAAA,CAAgB,aAAc,CAAA,CAChE,SAAA,CAAU,0FAEV,QAAA,CAAA,CAAAxyB,GAAAA,CAACqe,YAAAA,CAAA,CAAa,KAAM,EAAA,CAAI,CAAA,CACxBre,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,qBAAA,CAAuB,QAAA,CAAAwyB,EAAgB,aAAA,CAAc,CAAA,CAAA,CACvE,GACF,CAAA,CAAA,CAEJ,CAAA,CAGA9qB,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gEAAA,CACZ,QAAA,CAAA,CAAA,CAACkrB,CAAAA,EACA5yB,GAAAA,CAACktB,GAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASpE,EACV,QAAA,CAAA,SAAA,CAED,CAAA,CAGDqK,CAAAA,EACCnzB,GAAAA,CAAC8R,GAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMkhB,CAAAA,CAAmBR,CAAAA,CAAgB,aAAc,CAAA,CACjE,yBAED,CAAA,CAGD,CAACW,CAAAA,EAAkB,CAACP,GACnB5yB,GAAAA,CAAC8R,EAAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAASghB,CAAAA,CACT,QAAA,CAAUL,CAAAA,CAET,QAAA,CAAAA,EAAY,wBAAA,CAA2B,aAAA,CAC1C,CAAA,CAGD,CAACU,GAAkBP,CAAAA,EAClB5yB,GAAAA,CAAC8R,EAAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAASvU,CAAAA,EAAiBqN,CAAAA,CAAWA,EAAWqoB,CAAAA,CAE/C,QAAA,CAAA11B,CAAAA,CAAgB,yBAAA,CAA4B,YAC/C,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,EAEO61B,EAAAA,CAAQb,EAAAA,CCxNf,IAAMzY,EAAAA,CACJC,GACoCA,CAAAA,YAAmB,GAAA,CAEnDC,EAAAA,CACJD,CAAAA,EAEKA,EAGDD,EAAAA,CAAMC,CAAO,CAAA,CACR,MAAA,CAAO,YAAYA,CAAAA,CAAQ,OAAA,EAAS,CAAA,CAEtC,CAAE,GAAGA,CAAQ,EALX,EAAC,CAQNzV,GAAmB,CAACC,CAAAA,CAAmBC,CAAAA,GAA6B,CACxE,IAAMC,CAAAA,CAAOF,CAAAA,CAAU,OAAA,CAAQ,MAAA,CAAQ,EAAE,CAAA,CACzC,GAAI,eAAA,CAAgB,IAAA,CAAKC,CAAQ,CAAA,CAC/B,OAAOA,EAET,IAAME,CAAAA,CAAOF,EAAS,OAAA,CAAQ,MAAA,CAAQ,EAAE,CAAA,CACxC,OAAO,CAAA,EAAGC,CAAI,CAAA,CAAA,EAAIC,CAAI,EACxB,CAAA,CAEMiW,EAAAA,CAAc,CAClBC,CAAAA,CACArV,EACAD,CAAAA,GACe,CACf,GAAI,CAACC,GAAaA,CAAAA,EAAa,CAAA,EAAK,CAACD,CAAAA,CACnC,OAAOsV,CAAAA,CAGT,IAAMC,CAAAA,CAAU,UAAA,CAAW,IAAMvV,CAAAA,CAAW,KAAA,EAAM,CAAGC,CAAS,EAE9D,OAAOqV,CAAAA,CAAQ,QAAQ,IAAM,CAC3B,aAAaC,CAAO,EACtB,CAAC,CACH,EAGMwY,EAAAA,CAAoB1tB,CAAAA,EAA2D,CAEnF,IAAM2tB,EAAW,MAAA,CAAO,IAAA,CAAK3tB,CAAY,CAAA,CAAE,KACxCzL,CAAAA,EAAQA,CAAAA,CAAI,WAAA,EAAY,CAAE,SAAS,OAAO,CAAA,EAAK,OAAOyL,CAAAA,CAAazL,CAAG,CAAA,EAAM,QAC/E,CAAA,CAEA,GAAI,CAACo5B,CAAAA,CACH,OAAO,IAAA,CAGT,IAAMC,EAAa5tB,CAAAA,CAAa2tB,CAAQ,EACxC,GAAI,CAACC,GAAc,OAAOA,CAAAA,EAAe,QAAA,CACvC,OAAO,KAIT,IAAMC,CAAAA,CAA0B,CAC9B,YAAA,CAAcD,EACd,UAAA,CAAY5tB,CAAAA,CAAa,UAAA,EAAcA,CAAAA,CAAa,WAAa,QAAA,CACjE,UAAA,CAAYA,CAAAA,CAAa,UAAA,EAAcA,EAAa,SACtD,CAAA,CAGA,OAAI6tB,CAAAA,CAAU,aACZA,CAAAA,CAAU,UAAA,CAAa,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,CAAI,GAAI,CAAA,CAAIA,EAAU,UAAA,CAAA,CAG5DA,CACT,EAEaC,EAAAA,CAAgB,CAC3BxuB,EACA5D,CAAAA,CACAhJ,CAAAA,GACG,CACH,GAAM,CAACo6B,CAAAA,CAAWiB,CAAY,CAAA,CAAI/3B,QAAAA,CAAS,KAAK,CAAA,CAC1C,CAAC4kB,CAAAA,CAASC,CAAU,EAAI7kB,QAAAA,CAAS,KAAK,EACtC,CAACi3B,CAAAA,CAAce,CAAe,CAAA,CAAIh4B,QAAAA,CAAS,KAAK,CAAA,CAChD,CAAC62B,CAAAA,CAAgBoB,CAAiB,CAAA,CAAIj4B,QAAAA,CAAmC,IAAI,CAAA,CAC7E,CAACyI,CAAAA,CAAOyX,CAAQ,EAAIlgB,QAAAA,CAAwB,IAAI,EAChD,CAACg3B,CAAAA,CAAgBkB,CAAiB,CAAA,CAAIl4B,QAAAA,CAAiB,CAAC,CAAA,CACxD,CAAC+2B,CAAAA,CAAaoB,CAAc,CAAA,CAAIn4B,QAAAA,CAAS,KAAK,CAAA,CAE9Co4B,CAAAA,CAActwB,EAAAA,CAAkBnC,CAAAA,EAAUA,EAAM,WAAW,CAAA,CAE3Dyf,CAAAA,CAAUnf,WAAAA,CACd,MAAOsY,CAAAA,EAA8D,CACnE,GAAI,CAACjV,EACH,MAAM,IAAI,KAAA,CAAM,+CAA+C,EAGjEyuB,CAAAA,CAAa,IAAI,CAAA,CACjB7X,CAAAA,CAAS,IAAI,CAAA,CAEb,GAAI,CACF,IAAMvW,CAAAA,CAAa,IAAI,eAAA,CACjBjC,CAAAA,CAAMiB,EAAAA,CAAiBW,CAAAA,CAAQ,UAAWA,CAAAA,CAAQ,eAAe,CAAA,CAIjEG,CAAAA,CAAgB,CACpB,GAFkB4U,EAAAA,CAAiB/U,CAAAA,CAAQ,OAAO,EAGlD,GAAGiV,CACL,CAAA,CAGM7U,CAAAA,CAAkC,CACtC,cAAA,CAAgB,kBAAA,CAChB,GAAIJ,CAAAA,CAAQ,cAAgB,EAC9B,CAAA,CAEIA,CAAAA,CAAQ,SACVI,CAAAA,CAAQ,aAAA,CAAgB,CAAA,OAAA,EAAUJ,CAAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,CAIlD,IAAMO,EAAe,KAAA,CAAMnC,CAAAA,CAAK,CAC9B,MAAA,CAAQ,MAAA,CACR,OAAA,CAAAgC,CAAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUD,CAAa,CAAA,CAClC,OAAQE,CAAAA,CAAW,MACrB,CAAC,CAAA,CAEKI,EAAW,MAAMiV,EAAAA,CACrBnV,CAAAA,CACAP,CAAAA,CAAQ,UACRK,CACF,CAAA,CAEIyU,CAAAA,CAAe,IAAA,CACnB,GAAI,CACFA,CAAAA,CAAU,MAAMrU,CAAAA,CAAS,OAC3B,CAAA,KAAQ,CAEN,IAAME,EAAO,MAAMF,CAAAA,CAAS,MAAK,CACjC,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0BE,CAAI,CAAA,CAAE,CAClD,CAEA,GAAI,CAACF,CAAAA,CAAS,GAAI,CAChB,IAAMa,CAAAA,CACJwT,CAAAA,EAAS,SACT,CAAA,+BAAA,EAAkCrU,CAAAA,CAAS,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAS,UAAU,CAAA,CAAA,CAC1E,MAAM,IAAI,KAAA,CAAMa,CAAO,CACzB,CAIA,IAAIZ,CAAAA,CAAeoU,EASnB,GARIA,CAAAA,EAAS,IAAA,GAEXpU,CAAAA,CAAeoU,EAAQ,IAAA,CAAA,CAKP1W,CAAAA,CAAI,SAAS,aAAa,CAAA,CAC7B,CAUb,IAAMmvB,CAAAA,CAAoC,CACxC,OAAA,CAAS,GACT,OAAA,CAAS,uDACX,CAAA,CAEA,OAAAhS,EAAW,CAAA,CAAI,CAAA,CACfoT,CAAAA,CAAkBpB,CAAc,EACzBA,CACT,CAGA,IAAMA,CAAAA,CAAoC,CACxC,OAAA,CAAS7sB,CAAAA,EAAc,OAAA,EAAW,CAAA,CAAA,CAClC,cAAeA,CAAAA,EAAc,aAAA,EAAiBA,CAAAA,EAAc,YAAA,EAAgBA,GAAc,WAAA,CAC1F,OAAA,CAASA,CAAAA,EAAc,OACzB,EAEA,OAAA6a,CAAAA,CAAW,EAAI,CAAA,CACfoT,CAAAA,CAAkBpB,CAAc,CAAA,CAEzBA,CACT,CAAA,MAASlsB,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CACJD,CAAAA,YAAe,KAAA,CAAQA,EAAI,OAAA,CAAU,sBAAA,CACvC,MAAAuV,CAAAA,CAAStV,CAAO,CAAA,CACVD,CACR,CAAA,OAAE,CACAotB,EAAa,KAAK,EACpB,CACF,CAAA,CACA,CAACzuB,CAAO,CACV,CAAA,CAEM+uB,CAAAA,CAAyBpyB,YAC7B,CAACyB,CAAAA,CAAa4wB,CAAAA,GAA0B,CAEtCA,GAAU,CAGV,MAAA,CAAO,SAAS,IAAA,CAAO5wB,EACzB,EACA,EACF,CAAA,CAGM6wB,CAAAA,CAActyB,YAClB,MAAOuyB,CAAAA,CAAiBja,CAAAA,GAA8D,CACpF,GAAI,CAACjV,CAAAA,CACH,MAAM,IAAI,MAAM,+CAA+C,CAAA,CAGjEyuB,CAAAA,CAAa,IAAI,EACjB7X,CAAAA,CAAS,IAAI,CAAA,CAEb,GAAI,CAEF,IAAMuY,CAAAA,CAAc,QAAA,CAKpB,GAFA,MAAM,IAAI,OAAA,CAAQC,CAAAA,EAAW,UAAA,CAAWA,EAAS,GAAG,CAAC,EAEjDF,CAAAA,GAAYC,CAAAA,CAAa,CAC3B,IAAMvuB,CAAAA,CAAe,2CAAA,CACrB,MAAAgW,EAAShW,CAAY,CAAA,CACf,IAAI,KAAA,CAAMA,CAAY,CAC9B,CAGA,IAAMP,CAAAA,CAAa,IAAI,eAAA,CACjBjC,CAAAA,CAAMiB,GAAiBW,CAAAA,CAAQ,SAAA,CAAWA,EAAQ,eAAe,CAAA,CAIjEG,CAAAA,CAAgB,CACpB,GAFkB4U,EAAAA,CAAiB/U,CAAAA,CAAQ,OAAO,CAAA,CAGlD,GAAGiV,CAAAA,CACH,OAAA,CAAAia,CACF,CAAA,CAGM9uB,EAAkC,CACtC,cAAA,CAAgB,mBAChB,GAAIJ,CAAAA,CAAQ,cAAgB,EAC9B,CAAA,CAEIA,CAAAA,CAAQ,SACVI,CAAAA,CAAQ,aAAA,CAAgB,CAAA,OAAA,EAAUJ,CAAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,CAIlD,IAAMO,CAAAA,CAAe,KAAA,CAAMnC,EAAK,CAC9B,MAAA,CAAQ,MAAA,CACR,OAAA,CAAAgC,EACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUD,CAAa,EAClC,MAAA,CAAQE,CAAAA,CAAW,MACrB,CAAC,EAEKI,CAAAA,CAAW,MAAMiV,EAAAA,CACrBnV,CAAAA,CACAP,EAAQ,SAAA,CACRK,CACF,EAEIyU,CAAAA,CAAe,IAAA,CACnB,GAAI,CACFA,CAAAA,CAAU,MAAMrU,CAAAA,CAAS,OAC3B,CAAA,KAAQ,CACN,IAAME,EAAO,MAAMF,CAAAA,CAAS,IAAA,EAAK,CACjC,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0BE,CAAI,EAAE,CAClD,CAEA,GAAI,CAACF,EAAS,EAAA,CAAI,CAChB,IAAMa,CAAAA,CACJwT,GAAS,OAAA,EACT,CAAA,kCAAA,EAAqCrU,CAAAA,CAAS,MAAM,IAAIA,CAAAA,CAAS,UAAU,GAC7E,MAAM,IAAI,MAAMa,CAAO,CACzB,CAGA,IAAIZ,EAAeoU,CAAAA,CAMnB,GALIA,CAAAA,EAAS,IAAA,GACXpU,EAAeoU,CAAAA,CAAQ,IAAA,CAAA,CAGP1W,CAAAA,CAAI,QAAA,CAAS,aAAa,CAAA,CAC7B,CAGb,IAAMmwB,CAAAA,CAAYH,GAAiB1tB,CAAY,CAAA,CAEzC6sB,CAAAA,CAAoC,CACxC,QAAS,CAAA,CAAA,CACT,OAAA,CAAS,mCAAA,CACT,SAAA,CAAWgB,GAAa,KAAA,CAAA,CACxB,YAAA,CAAc7tB,CAAAA,EAAc,YAAA,EAAgBA,GAAc,WAAA,CAC1D,UAAA,CAAYA,GAAc,UAAA,EAAcA,CAAAA,EAAc,UACtD,UAAA,CAAYA,CAAAA,EAAc,UAAA,EAAcA,CAAAA,EAAc,SACxD,CAAA,CAGA,OAAI6tB,CAAAA,EAAanyB,CAAAA,EAAUhJ,IACzB07B,CAAAA,CAAY1yB,CAAAA,CAAQhJ,CAAAA,CAAWm7B,CAAS,EACxC,OAAA,CAAQ,GAAA,CAAI,6DAAuD,CAAE,MAAA,CAAAnyB,EAAQ,SAAA,CAAAhJ,CAAU,CAAC,CAAA,CAAA,CAG1Fs7B,EAAgB,CAAA,CAAI,CAAA,CACpBnT,CAAAA,CAAW,CAAA,CAAI,EACfoT,CAAAA,CAAkBpB,CAAc,CAAA,CACzBA,CACT,CAGA,IAAM8B,CAAAA,CAAU3uB,GAAc,OAAA,EAAW,CAAA,CAAA,CAGnC6tB,EAAYH,EAAAA,CAAiB1tB,CAAY,CAAA,CAEzC6sB,CAAAA,CAAoC,CACxC,OAAA,CAAA8B,CAAAA,CACA,aAAA,CAAe3uB,CAAAA,EAAc,eAAiBA,CAAAA,EAAc,YAAA,EAAgBA,CAAAA,EAAc,WAAA,CAC1F,QAASA,CAAAA,EAAc,OAAA,EAAW,mCAAA,CAClC,SAAA,CAAW6tB,GAAa,KAAA,CAAA,CAExB,YAAA,CAAc7tB,CAAAA,EAAc,YAAA,EAAgBA,GAAc,WAAA,CAC1D,UAAA,CAAYA,CAAAA,EAAc,UAAA,EAAcA,GAAc,SAAA,CACtD,UAAA,CAAYA,CAAAA,EAAc,UAAA,EAAcA,GAAc,SACxD,CAAA,CAGA,GAAI2uB,CAAAA,GAAY,CAAA,CAAA,CAAO,CACrB,IAAMzuB,CAAAA,CAAeF,CAAAA,EAAc,OAAA,EAAW,4CAC9C,MAAAkW,CAAAA,CAAShW,CAAY,CAAA,CACf,IAAI,KAAA,CAAMA,CAAY,CAC9B,CAGA,OAAI2tB,CAAAA,EAAanyB,CAAAA,EAAUhJ,CAAAA,GACzB07B,CAAAA,CAAY1yB,EAAQhJ,CAAAA,CAAWm7B,CAAS,CAAA,CACxC,OAAA,CAAQ,IAAI,kDAAA,CAA6C,CAAE,MAAA,CAAAnyB,CAAAA,CAAQ,UAAAhJ,CAAU,CAAC,CAAA,CAAA,CAGhFs7B,CAAAA,CAAgB,EAAI,CAAA,CACpBnT,CAAAA,CAAW,EAAI,CAAA,CACfoT,CAAAA,CAAkBpB,CAAc,CAAA,CAEzBA,CACT,CAAA,MAASlsB,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CACJD,CAAAA,YAAe,KAAA,CAAQA,EAAI,OAAA,CAAU,uCAAA,CACvC,MAAAuV,CAAAA,CAAStV,CAAO,CAAA,CACVD,CACR,CAAA,OAAE,CACAotB,EAAa,KAAK,EACpB,CACF,CAAA,CACA,CAACzuB,CAAAA,CAAS5D,CAAAA,CAAQhJ,CAAAA,CAAW07B,CAAW,CAC1C,CAAA,CAGMQ,CAAAA,CAAoB3yB,WAAAA,CAAY,IAAM,CAC1C4e,CAAAA,CAAW,KAAK,EAChBoT,CAAAA,CAAkB,IAAI,EACtB/X,CAAAA,CAAS,IAAI,CAAA,CACb8X,CAAAA,CAAgB,KAAK,EACvB,CAAA,CAAG,EAAE,EAGCa,CAAAA,CAAY5yB,WAAAA,CAChB,MAAOsY,CAAAA,EAA8D,CACnE,GAAI,CAACjV,EACH,MAAM,IAAI,MAAM,+CAA+C,CAAA,CAGjE,IAAMwvB,CAAAA,CAAWxvB,EAAQ,qBAAA,EAAyB,EAAA,CAElD,GAAI0tB,CAAAA,CAAiB,EACnB,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqBA,CAAc,CAAA,mCAAA,CAAqC,CAAA,CAG1FmB,EAAe,IAAI,CAAA,CACnBjY,EAAS,IAAI,CAAA,CAEb,GAAI,CAEF,IAAM3W,CAAAA,CAAaD,CAAAA,CAAQ,gBAAA,EAAoB,CAC7C,UAAWA,CAAAA,CAAQ,SAAA,CACnB,eAAA,CAAiBA,CAAAA,CAAQ,gBACzB,OAAA,CAASA,CAAAA,CAAQ,OAAA,CACjB,YAAA,CAAcA,EAAQ,YAAA,CACtB,MAAA,CAAQA,CAAAA,CAAQ,MAClB,EAEMK,CAAAA,CAAa,IAAI,eAAA,CACjBjC,CAAAA,CAAMiB,GAAiBY,CAAAA,CAAW,SAAA,CAAWA,CAAAA,CAAW,eAAe,EAGvEE,CAAAA,CAAgB,CACpB,GAFkB4U,EAAAA,CAAiB9U,CAAAA,CAAW,OAAO,CAAA,CAGrD,GAAGgV,CACL,CAAA,CAEM7U,EAAkC,CACtC,cAAA,CAAgB,kBAAA,CAChB,GAAIH,EAAW,YAAA,EAAgB,EACjC,CAAA,CAEIA,EAAW,MAAA,GACbG,CAAAA,CAAQ,aAAA,CAAgB,CAAA,OAAA,EAAUH,EAAW,MAAM,CAAA,CAAA,CAAA,CAGrD,IAAMM,CAAAA,CAAe,MAAMnC,CAAAA,CAAK,CAC9B,MAAA,CAAQ,MAAA,CACR,QAAAgC,CAAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUD,CAAa,CAAA,CAClC,MAAA,CAAQE,EAAW,MACrB,CAAC,EAEKI,CAAAA,CAAW,MAAMiV,EAAAA,CACrBnV,CAAAA,CACAP,EAAQ,SAAA,CACRK,CACF,CAAA,CAEA,GAAI,CAACI,CAAAA,CAAS,EAAA,CAAI,CAChB,IAAMgvB,EAAY,MAAMhvB,CAAAA,CAAS,IAAA,EAAK,CAAE,MAAM,KAAO,CAAE,OAAA,CAASA,CAAAA,CAAS,UAAW,CAAA,CAAE,CAAA,CACtF,MAAM,IAAI,MAAMgvB,CAAAA,CAAU,OAAA,EAAW,CAAA,8BAAA,EAAiChvB,CAAAA,CAAS,MAAM,CAAA,CAAE,CACzF,CAEA,IAAMvF,CAAAA,CAAS,MAAMuF,CAAAA,CAAS,IAAA,EAAK,CAGnCmuB,CAAAA,CAAkBY,CAAQ,CAAA,CAC1B,IAAME,CAAAA,CAAW,WAAA,CAAY,IAAM,CACjCd,CAAAA,CAAmB1e,CAAAA,EACbA,CAAAA,EAAQ,GACV,aAAA,CAAcwf,CAAQ,EACf,CAAA,EAEFxf,CAAAA,CAAO,CACf,EACH,CAAA,CAAG,GAAI,CAAA,CAEP,OAAAqL,CAAAA,CAAW,CAAA,CAAI,CAAA,CACR,CAAE,QAAS,CAAA,CAAA,CAAM,OAAA,CAAS,oCAA+B,CAClE,OAASla,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CAAUD,CAAAA,YAAe,MAAQA,CAAAA,CAAI,OAAA,CAAU,+BAAA,CACrD,MAAAuV,EAAStV,CAAO,CAAA,CACVD,CACR,CAAA,OAAE,CACAwtB,CAAAA,CAAe,KAAK,EACtB,CACF,EACA,CAAC7uB,CAAAA,CAAS0tB,CAAc,CAC1B,EAEMiC,CAAAA,CAAQhzB,WAAAA,CAAY,IAAM,CAC9B8xB,EAAa,KAAK,CAAA,CAClBlT,CAAAA,CAAW,KAAK,EAChBmT,CAAAA,CAAgB,KAAK,CAAA,CACrBC,CAAAA,CAAkB,IAAI,CAAA,CACtB/X,CAAAA,CAAS,IAAI,CAAA,CACbgY,CAAAA,CAAkB,CAAC,CAAA,CACnBC,CAAAA,CAAe,KAAK,EACtB,EAAG,EAAE,CAAA,CAEL,OAAO,CACL,OAAA,CAAA/S,CAAAA,CACA,WAAA,CAAAmT,CAAAA,CACA,UAAAM,CAAAA,CACA,iBAAA,CAAAD,CAAAA,CACA,sBAAA,CAAAP,EACA,SAAA,CAAAvB,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,eAAAC,CAAAA,CACA,OAAA,CAAApS,CAAAA,CACA,YAAA,CAAAqS,EACA,cAAA,CAAAJ,CAAAA,CACA,KAAA,CAAApuB,CAAAA,CACA,MAAAwwB,CACF,CACF,EC1eA,IAAMC,EAAAA,CAA0C,CAAC,CAC/C,MAAAl9B,CAAAA,CACA,UAAA,CAAAqN,CAAAA,CACA,MAAA,CAAA3D,EACA,WAAA,CAAAwG,CAAAA,CAAc,IAAA,CACd,WAAA,CAAAitB,EACA,WAAA,CAAAr6B,CAAAA,CAAc,EAAC,CACf,SAAAmQ,CAAAA,CACA,MAAA,CAAAqoB,CAAAA,CACA,aAAA,CAAA11B,EAAgB,KAClB,CAAA,GAAM,CACJ,GAAM,CAAE,SAAA,CAAA8N,CAAAA,CAAW,KAAA,CAAAF,CAAM,EAAIvE,cAAAA,EAAe,CACtC,CAACgoB,CAAAA,CAAa6B,CAAc,EAAI5wB,WAAAA,CAAM,QAAA,CAAS,KAAK,CAAA,CAGpDqG,EAAWiF,CAAAA,CAAMxT,CAAAA,CAAM,SAAS,CAAA,CAGhCmD,EAAkBsB,OAAAA,CAAQ,IACvB5B,EAAAA,CAAyB7C,CAAAA,CAAM,UAAW8C,CAAW,CAAA,CAC3D,CAAC9C,CAAAA,CAAM,SAAA,CAAW8C,CAAW,CAAC,CAAA,CAE3B0K,CAAAA,CAAmB/I,OAAAA,CAAQ,IAAM,CACrC,GAAItB,CAAAA,GAAoB,EAAA,CACxB,OAAOF,EAAAA,CAAqBjD,CAAAA,CAAO8C,CAAAA,CAAaK,CAAe,CACjE,CAAA,CAAG,CAACnD,EAAO8C,CAAAA,CAAaK,CAAe,CAAC,CAAA,CAElCo4B,CAAAA,CAAc/tB,CAAAA,CAChBH,CAAAA,CAAWG,EAAiB,SAAS,CAAA,CACrC,IAAA,CAEE,CACJ,QAAA4b,CAAAA,CACA,WAAA,CAAAmT,CAAAA,CACA,SAAA,CAAAM,EACA,iBAAA,CAAAD,CAAAA,CACA,sBAAA,CAAAP,CAAAA,CACA,UAAAvB,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,cAAA,CAAAC,EAEA,YAAA,CAAAC,CAAAA,CACA,eAAAJ,CAEF,CAAA,CAAIiB,GAAc97B,CAAAA,CAAM,uBAAA,CAAyB0J,EAAQ1J,CAAAA,CAAM,SAAS,EAGxEuU,SAAAA,CAAU,IAAM,CACT0iB,CAAAA,EACH,WAAW,IAAM,CACf6B,CAAAA,CAAe,IAAI,EACrB,CAAA,CAAG,GAAG,EAEV,CAAA,CAAG,CAAC7B,CAAW,CAAC,CAAA,CAEhB,IAAMoC,EAAa,IAAM,CACvBP,CAAAA,CAAe,KAAK,EACtB,CAAA,CAEMsE,CAAAA,CAAgB,SAAY,CAChC,GAAI,CACF,IAAM7a,CAAAA,CAAW7O,CAAAA,GACjB,MAAM0V,CAAAA,CAAQ7G,CAAQ,EACxB,CAAA,MAAS5T,EAAK,CACZ,OAAA,CAAQ,KAAA,CAAM,kCAAA,CAAoCA,CAAG,EACvD,CACF,CAAA,CAEM0uB,CAAAA,CAAoB,SAAY,CACpC,GAAI,CACF,IAAM9a,EAAW7O,CAAAA,EAAU,CAEvB8oB,CAAAA,CAAU,EAAA,CACV,OAAOjuB,CAAAA,EAAa,QAAA,CACtBiuB,CAAAA,CAAUjuB,CAAAA,CACDA,GAAY,OAAOA,CAAAA,EAAa,QAAA,EAAYA,CAAAA,CAAS,IAC9DiuB,CAAAA,CAAUjuB,CAAAA,CAAS,GAAA,EAGnBiuB,CAAAA,CAAUnvB,EAAWrN,CAAAA,CAAM,SAAS,GAAK,EAAA,CACrC,OAAOw8B,GAAY,QAAA,GACrBA,CAAAA,CAAU,EAAA,CAAA,CAAA,CAId,IAAMhuB,EAAYxO,CAAAA,CAAM,uBAAA,EAAyB,SAAA,EAAa,CAAA,CAC9D,GAAI,CAACw8B,CAAAA,EAAWA,CAAAA,CAAQ,MAAA,GAAWhuB,EAAW,CAC5ChC,EAAAA,CAAM,MAAM,CAAA,0CAAA,EAA6CgC,CAAS,YAAY,CAAA,CAC9E,MACF,CAEA,MAAM+tB,EAAYC,CAAAA,CAASja,CAAQ,EAErC,CAAA,MAAS5T,EAAK,CACZ,IAAMT,CAAAA,CAAeS,CAAAA,YAAe,MAAQA,CAAAA,CAAI,OAAA,CAAU,wCAC1DnC,EAAAA,CAAM,KAAA,CAAM,UAAK0B,CAAY,CAAA,CAAE,CAAA,CAC/B,OAAA,CAAQ,MAAM,wCAAA,CAA0CS,CAAG,EAC7D,CACF,EAEM2uB,CAAAA,CAAoBxxB,EAAAA,CAAkBnC,CAAAA,EAAUA,CAAAA,CAAM,iBAAiB,CAAA,CAEvE4zB,CAAAA,CAAiC7xB,CAAAA,EAAgB,CAEjDhC,GACF4zB,CAAAA,CAAkB5zB,CAAM,CAAA,CAE1B2yB,CAAAA,CAAuB3wB,EAAKyxB,CAAW,EACzC,CAAA,CAGMK,CAAAA,CAAex9B,EAAM,uBAAA,EAAyB,YAAA,EAAgB,KAAA,CAE9Dy9B,CAAAA,CAAoBv1B,YAAM,WAAA,CAAY,MAAOs0B,GAAoB,CACrE,GAAIgB,GAAgB,CAACvC,CAAAA,EAAgB,CAACH,CAAAA,CACpC,GAAI,CACF,IAAMvY,CAAAA,CAAW7O,CAAAA,GACjB,MAAM6oB,CAAAA,CAAYC,CAAAA,CAASja,CAAQ,EAErC,CAAA,MAAS5T,CAAAA,CAAK,CACZ,IAAMT,CAAAA,CAAeS,aAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,mBAAA,CAC1DnC,GAAM,KAAA,CAAM,CAAA,OAAA,EAAK0B,CAAY,CAAA,CAAE,EAC/B,OAAA,CAAQ,KAAA,CAAM,4CAAA,CAA8CS,CAAG,EACjE,CAEJ,CAAA,CAAG,CAAC6uB,CAAAA,CAAcvC,CAAAA,CAAcH,EAAWyB,CAAAA,CAAa7oB,CAAS,CAAC,CAAA,CAgBlE,OACErL,GAAAA,CAACozB,EAAAA,CAAA,CACC,MAAA,CAAQxE,EACR,KAAA,CAAOj3B,CAAAA,CACP,WAAA,CAAakQ,CAAAA,CACb,WAAY7C,CAAAA,CACZ,cAAA,CAAgBwtB,CAAAA,CAChB,SAAA,CAAWC,EACX,WAAA,CAAaC,CAAAA,CACb,cAAA,CAAgBC,CAAAA,CAChB,aAAcC,CAAAA,CACd,OAAA,CAAS5B,CAAAA,CACT,SAAA,CAAW+D,EACX,aAAA,CAAeC,CAAAA,CACf,WAAA,CA3BoB,SAAY,CAClC,GAAI,CACF,IAAM9a,CAAAA,CAAW7O,CAAAA,GAEjBkpB,CAAAA,EAAkB,CAClB,MAAMC,CAAAA,CAAUta,CAAQ,CAAA,CACxB/V,EAAAA,CAAM,OAAA,CAAQ,sCAAgC,EAChD,CAAA,MAASmC,CAAAA,CAAK,CACZ,OAAA,CAAQ,MAAM,iCAAA,CAAmCA,CAAG,EACpDnC,EAAAA,CAAM,KAAA,CAAMmC,aAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,+BAA+B,EAClF,CACF,CAAA,CAiBI,kBAAA,CAAoB4uB,CAAAA,CACpB,SAAUtqB,CAAAA,CACV,MAAA,CAAQqoB,CAAAA,CACR,aAAA,CAAe11B,EACf,WAAA,CAAa21B,CAAAA,CACb,cAAeiC,CAAAA,CAAeC,CAAAA,CAAoB,OACpD,CAEJ,CAAA,CAEOC,EAAAA,CAAQR,EAAAA,CCrLf,IAAMS,EAAAA,CAAUtnB,UAAAA,CACd,CAAC,CAAE,QAAA,CAAAjO,CAAAA,CAAU,SAAA,CAAAoH,EAAW,GAAG8G,CAAM,CAAA,CAAGC,CAAAA,GAClClO,IAAC,IAAA,CAAA,CAAG,GAAA,CAAKkO,CAAAA,CAAK,SAAA,CAAW/G,EAAY,GAAG8G,CAAAA,CACrC,QAAA,CAAAlO,CAAAA,CACH,CAEJ,CAAA,CAEAu1B,EAAAA,CAAQ,YAAc,SAAA,CACtB,IAAOC,GAAQD,EAAAA,CCwCf,IAAME,EAAAA,CAA0C,CAAC,CAC/C,OAAA,CAAAz9B,CAAAA,CACA,MAAA,CAAAmE,CAAAA,CACA,YAAA2L,CAAAA,CACA,OAAA,CAAA4tB,CAAAA,CACA,UAAA,CAAAzwB,EACA,MAAA,CAAA3D,CAAAA,CACA,cAAA,CAAA/F,CAAAA,CACA,YAAAb,CAAAA,CAAc,EAAC,CACf,mBAAA,CAAAmK,EAAsB,CAAA,CACtB,SAAA,CAAA8wB,CAAAA,CACA,mBAAA,CAAAC,EACA,kBAAA,CAAAC,CAAAA,CACA,YAAAd,CAAAA,CACA,QAAA,CAAAlqB,EACA,MAAA,CAAAqoB,CAAAA,CACA,aAAA,CAAA11B,CAAAA,CAAgB,MAChB,sBAAA,CAAAs4B,CAEF,CAAA,GAAM,CAUJ,IAAMj+B,CAAAA,CAAqDiI,WAAAA,CAAM,OAAA,CAAQ,IAAM,CAC7E,IAAMi2B,CAAAA,CAA4C,EAAC,CAEnD,cAAO,OAAA,CAAQ9wB,CAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC9K,CAAAA,CAAK3B,CAAK,CAAA,GAAM,CACnDu9B,CAAAA,CAAU57B,CAAG,CAAA,CAAI,CAAE,cAAe3B,CAAM,EAC1C,CAAC,CAAA,CAOMu9B,CACT,EAAG,CAAC9wB,CAAU,CAAC,CAAA,CAGfnF,YAAM,SAAA,CAAU,IAAM,CAEpB,IAAMk2B,EAAgB75B,CAAAA,CAAO,GAAA,CAAIvB,CAAAA,EAAKA,CAAAA,CAAE,SAAS,CAAA,CAC3C8G,CAAAA,CAAYT,GAAa,QAAA,EAAS,CAClCg1B,EAAgB,MAAA,CAAO,IAAA,CAAKv0B,CAAAA,CAAU,KAAK,EAAE,CAAC,CAAA,CAEpD,GAAIu0B,CAAAA,CAAe,CACjB,IAAM1pB,CAAAA,CAAoB7K,CAAAA,CAAU,KAAA,CAAMu0B,CAAa,CAAA,EAAK,GACtDC,CAAAA,CAAoC,GAE1C,MAAA,CAAO,OAAA,CAAQ3pB,CAAiB,CAAA,CAAE,QAAQ,CAAC,CAACpS,CAAAA,CAAK3B,EAAK,IAAM,CACtDw9B,CAAAA,CAAc,QAAA,CAAS77B,CAAG,IAC5B+7B,CAAAA,CAAa/7B,CAAG,CAAA,CAAI3B,EAAAA,EAExB,CAAC,CAAA,CAGyB,MAAA,CAAO,IAAA,CAAK+T,CAAiB,EAAE,IAAA,CAAKpS,CAAAA,EAAO,CAAC67B,CAAAA,CAAc,SAAS77B,CAAG,CAAC,CAAA,EAE/FuH,CAAAA,CAAU,iBAAiBu0B,CAAAA,CAAeC,CAAY,EAG1D,CACF,CAAA,CAAG,CAACR,CAAAA,CAAS19B,CAAAA,CAAQ,SAAA,CAAWmE,CAAM,CAAC,CAAA,CAGvC,IAAMg6B,CAAAA,CAAar2B,WAAAA,CAAM,QAAQ,IAGxB,CAAA,QAAA,EAAW41B,CAAO,CAAA,CAAA,EAAI19B,EAAQ,SAAS,CAAA,CAAA,CAC7C,CAAC09B,CAAAA,CAAS19B,EAAQ,SAAS,CAAC,CAAA,CAGzBo+B,CAAAA,CAAoBt2B,YAAM,OAAA,CAAQ,IAAM,CAO5C,GAAI,CASF,OARe/H,EAAAA,CAAqBC,CAAAA,CAASH,CAAkB,CASjE,CAAA,MAASwM,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,sDAA+C,CAC3D,YAAA,CAAcrM,CAAAA,CAAQ,KAAA,CAAQ6P,EAAiB7P,CAAAA,CAAQ,KAAA,CAAO8P,CAAW,CAAA,CAAI,aAC7E,KAAA,CAAAzD,CAAAA,CACA,OAAA,CAAArM,CAAAA,CACA,mBAAAH,CACF,CAAC,CAAA,CAEDg+B,CAAAA,GAAqBxxB,EAAgB,CAAE,OAAA,CAAArM,CAAQ,CAAC,EACzC,IACT,CACF,CAAA,CAAG,CAACA,EAASH,CAAAA,CAAoBg+B,CAAAA,CAAoB/tB,CAAW,CAAC,EAG3D,CAAE,aAAA,CAAAuuB,EAAe,gBAAA,CAAAC,CAAiB,EAAIx2B,WAAAA,CAAM,OAAA,CAAQ,IAAM,CAW9D,IAAMy2B,CAAAA,CAAmB,EAAC,CACpBh6B,CAAAA,CAAuB,EAAC,CAE9B,OAAAJ,CAAAA,CAAO,OAAA,CAAQvE,GAAS,CAQtB,GAAI,CACiBD,EAAAA,CAAuBC,CAAAA,CAAOC,CAAkB,CAAA,EASjE0E,CAAAA,CAAQ,IAAA,CAAK3E,CAAK,EAEtB,CAAA,MAASyM,CAAAA,CAAO,CACd,OAAA,CAAQ,MAAM,CAAA,mDAAA,EAA8CzM,CAAAA,CAAM,SAAS,CAAA,CAAA,CAAA,CAAK,CAC9E,SAAA,CAAWA,CAAAA,CAAM,UACjB,KAAA,CAAAyM,CAAAA,CACA,MAAAzM,CAAAA,CACA,kBAAA,CAAAC,CACF,CAAC,EAED0+B,CAAAA,CAAO,IAAA,CAAK,CAAA,MAAA,EAAS3+B,CAAAA,CAAM,SAAS,CAAA,EAAA,EAAMyM,CAAAA,CAAgB,OAAO,CAAA,CAAE,EACnEwxB,CAAAA,GAAqBxxB,CAAAA,CAAgB,CAAE,OAAA,CAAArM,EAAS,KAAA,CAAAJ,CAAM,CAAC,CAAA,CAEvD2E,EAAQ,IAAA,CAAK3E,CAAK,EACpB,CACF,CAAC,CAAA,CAYM,CACL,aAAA,CAAe2E,CAAAA,CACf,iBAAkBg6B,CACpB,CACF,EAAG,CAACp6B,CAAAA,CAAQtE,EAAoBG,CAAAA,CAAS69B,CAAAA,CAAoB/tB,CAAW,CAAC,EAGnE4hB,CAAAA,CAAkBF,EAAAA,CAAkB6M,CAAAA,CAAevuB,CAAW,EAG9DyiB,CAAAA,CAAoBD,EAAAA,CAAe+L,CAAAA,CAAevuB,CAAW,EAG7D6jB,CAAAA,CAAgC7rB,WAAAA,CAAM,OAAA,CAAQ,IAAM,CACxD,IAAMM,CAAAA,CAA8E,EAAC,CAErF,OAAAi2B,CAAAA,CAAc,OAAA,CAAQz+B,CAAAA,EAAS,CAE7BwI,EAAO,IAAA,CAAKxI,CAAK,CAAA,CAGjB,IAAMwyB,EAAaV,CAAAA,CAAgB9xB,CAAAA,CAAM,SAAS,CAAA,CAC9CwyB,CAAAA,EACFhqB,EAAO,IAAA,CAAKgqB,CAAU,CAAA,CAIxB,IAAM0B,EAAevB,CAAAA,CAAkB3yB,CAAAA,CAAM,SAAS,CAAA,CAClDk0B,GAAgBA,CAAAA,CAAa,MAAA,CAAS,CAAA,EACxCA,CAAAA,CAAa,QAAQ3zB,CAAAA,EAAS,CAC5BiI,CAAAA,CAAO,IAAA,CAAK,CAAE,IAAA,CAAM,cAAA,CAAgB,KAAA,CAAAjI,CAAM,CAAC,EAC7C,CAAC,EAEL,CAAC,EAEMiI,CACT,CAAA,CAAG,CAACi2B,CAAAA,CAAe3M,EAAiBa,CAAiB,CAAC,EAGhDiM,CAAAA,CAAa12B,WAAAA,CAAM,QAAQ,IAAM,CACrC,IAAMiF,CAAAA,CAAc5I,EAAO,MAAA,CACrBs6B,CAAAA,CAAqBJ,CAAAA,CAAc,MAAA,CACnCK,EAAev6B,CAAAA,CAAO,MAAA,CAAOvE,CAAAA,EACjC,CAACy+B,EAAc,IAAA,CAAKM,EAAAA,EAAMA,GAAG,SAAA,GAAc/+B,CAAAA,CAAM,SAAS,CAC5D,CAAA,CAEMg/B,CAAAA,CAAwBP,CAAAA,CAAc,OAAOz+B,CAAAA,EACjDA,CAAAA,CAAM,WAAA,EAAa,IAAA,CAAKmB,IAAKA,EAAAA,CAAE,cAAA,GAAmB,UAAU,CAC9D,EAEM89B,CAAAA,CAAuBH,CAAAA,CAAa,OAAO9+B,CAAAA,EAC/CA,CAAAA,CAAM,aAAa,IAAA,CAAKmB,EAAAA,EAAKA,EAAAA,CAAE,cAAA,GAAmB,UAAU,CAC9D,CAAA,CAmBA,OAjBgC,CAC9B,eAAgBq9B,CAAAA,CAChB,WAAA,CAAArxB,CAAAA,CACA,aAAA,CAAe0xB,EACf,YAAA,CAAcC,CAAAA,CAAa,MAAA,CAC3B,eAAA,CAAiBE,EAAsB,MAAA,CACvC,cAAA,CAAgBC,CAAAA,CAAqB,MAAA,CACrC,iBAAkBH,CAAAA,CAAa,GAAA,CAAI97B,CAAAA,EAAKA,CAAAA,CAAE,SAAS,CAAA,CACnD,iBAAA,CAAmBuB,CAAAA,CAAO,MAAA,CAAOvB,GAAKA,CAAAA,CAAE,kBAAkB,EAAE,MAAA,CAC5D,MAAA,CAAQ07B,EAAiB,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAmB,MAC3D,CAQF,CAAA,CAAG,CAACn6B,CAAAA,CAAQk6B,CAAAA,CAAeD,EAAmBE,CAAAA,CAAkBt+B,CAAAA,CAAQ,KAAA,CAAO8P,CAAW,CAAC,CAAA,CAG3FhI,WAAAA,CAAM,SAAA,CAAU,IAAM,CAMpB81B,CAAAA,GAAsBY,CAAU,EAClC,CAAA,CAAG,CAACA,CAAAA,CAAYZ,CAAAA,CAAqB59B,CAAAA,CAAQ,KAAA,CAAO8P,CAAW,CAAC,CAAA,CAGhE,IAAMgvB,CAAAA,CAAsBl/B,IACZA,CAAAA,CAAM,KAAA,EAAS,UAEf,MAAA,CACL,qCAAA,CAEA,oBAILm/B,CAAAA,CAAuBn/B,CAAAA,EAAqB,CAShD,IAAMo/B,EAAY,CAAA,EAAGtB,CAAO,CAAA,CAAA,EAAI99B,CAAAA,CAAM,SAAS,CAAA,CAAA,CAE/C,OAAIA,CAAAA,CAAM,WAAA,EAAeA,EAAM,UAAA,CAE3BqI,GAAAA,CAACwxB,EAAAA,CAAA,CAEC,MAAO75B,CAAAA,CACP,UAAA,CAAYqN,CAAAA,CACZ,WAAA,CAAa6C,GAHRkvB,CAKP,CAAA,CAKF/2B,GAAAA,CAAC2oB,EAAAA,CAAA,CAEC,KAAA,CAAOhxB,CAAAA,CACP,WAAA,CAAakQ,CAAAA,CACb,WAAY7C,CAAAA,CAAAA,CAHP+xB,CAKP,CAEJ,CAAA,CAGA,GAAI,CAACZ,CAAAA,CAOH,OAAOT,CAAAA,CACLhuB,IAAAA,CAAC,OAAI,SAAA,CAAU,8EAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC,OAAI,SAAA,CAAU,sBAAA,CAAuB,QAAA,CAAA,+DAAA,CAEtC,CAAA,CAECjI,GAAS,KAAA,EACR2P,IAAAA,CAAC,OAAI,SAAA,CAAU,2BAAA,CAA4B,sBAC/B3P,CAAAA,CAAQ,KAAA,CAAQ6P,CAAAA,CAAiB7P,CAAAA,CAAQ,MAAO8P,CAAW,CAAA,CAAI,YAAA,CAAA,CAC3E,CAAA,CAGDwuB,EAAiB,MAAA,CAAS,CAAA,EACzB3uB,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,kDAAA,CACb,QAAA,CAAA,CAAA1H,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAc,QAAA,CAAA,0BAAA,CAAqB,CAAA,CACjDq2B,CAAAA,CAAiB,GAAA,CAAI,CAACjyB,CAAAA,CAAO0I,CAAAA,GAC5BpF,IAAAA,CAAC,KAAA,CAAA,CAAgB,UAAU,MAAA,CAAO,QAAA,CAAA,CAAA,SAAA,CAAGtD,CAAAA,CAAAA,CAAAA,CAA3B0I,CAAiC,CAC5C,CAAA,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CACE,IAAA,CAIN,IAAMjS,CAAAA,CAAWgF,WAAAA,CAAM,OAAA,CAAQ,IAAM,CACnC,IAAMlI,CAAAA,CAAQyC,EAAAA,CAAYrC,CAAO,EAIjC,OAAOJ,CACT,CAAA,CAAG,CAACI,CAAO,CAAC,CAAA,CAGNi/B,EAAqB,SAAA,CACrBC,CAAAA,CAAqB,MACrBC,CAAAA,CAAyB,SAAA,CAGzBC,CAAAA,CAAqBtB,CAAAA,EAAwB,aAAemB,CAAAA,CAC5DI,CAAAA,CAAqBvB,CAAAA,EAAwB,WAAA,CAC9C,OAAOA,CAAAA,CAAuB,WAAA,EAAgB,QAAA,CAC3C,CAAA,EAAGA,EAAuB,WAAW,CAAA,EAAA,CAAA,CACrCA,CAAAA,CAAuB,WAAA,CAC3BoB,EACEI,CAAAA,CAAyBxB,CAAAA,EAAwB,eAAA,EAAmBqB,CAAAA,CAG1E,OAAIr8B,CAAAA,CAGA6M,IAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAU,wEACV,KAAA,CAAO,CACL,WAAA,CAAayvB,CAAAA,CACb,YAAaC,CAAAA,CACb,WAAA,CAAa,QACb,eAAA,CAAiBC,CACnB,EAGC,QAAA,CAAA,CAAAt/B,CAAAA,CAAQ,KAAA,EACP2P,IAAAA,CAAC,OAAI,SAAA,CAAU,aAAA,CACb,QAAA,CAAA,CAAA1H,GAAAA,CAACu1B,GAAA,CAAQ,SAAA,CAAU,kBAAA,CAChB,QAAA,CAAA3tB,EAAiB7P,CAAAA,CAAQ,KAAA,CAAO8P,CAAW,CAAA,CAC9C,EACC9P,CAAAA,CAAQ,QAAA,EACPiI,GAAAA,CAACmO,EAAAA,CAAA,CAAS,SAAA,CAAU,2BAAA,CACjB,QAAA,CAAAvG,CAAAA,CAAiB7P,EAAQ,QAAA,CAAU8P,CAAW,CAAA,CACjD,CAAA,CAAA,CAEJ,EAIF7H,GAAAA,CAACq1B,EAAAA,CAAA,CACC,KAAA,CAAOx6B,CAAAA,CACP,WAAYmK,CAAAA,CACZ,MAAA,CAAQ3D,CAAAA,CACR,WAAA,CAAawG,EACb,WAAA,CAAaitB,CAAAA,GAAgB,IAAM,CACjC,QAAQ,IAAA,CAAK,0CAA0C,CAAA,CAEvD,IAAMrzB,EAAYT,EAAAA,CAAa,QAAA,GACzBg1B,CAAAA,CAAgB,MAAA,CAAO,KAAKv0B,CAAAA,CAAU,KAAK,CAAA,CAAE,CAAC,EAChDu0B,CAAAA,EACFv0B,CAAAA,CAAU,SAAA,CAAUu0B,CAAa,EAErC,CAAA,CAAA,CACA,WAAA,CAAav7B,CAAAA,CACb,QAAA,CAAUmQ,EACV,MAAA,CAAQqoB,CAAAA,CACR,cAAe11B,CAAAA,CACjB,CAAA,CAAA,CAAA,CA1CK24B,CA2CP,CAAA,CAKAE,CAAAA,CAAc,MAAA,GAAW,CAAA,CASpBV,EACLhuB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oFAAA,CACb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CAA0B,+EACe6uB,CAAAA,CAAW,WAAA,CAAY,UAAA,CAAA,CAC/E,CAAA,CACA7uB,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8BAAA,CAA+B,QAAA,CAAA,CAAA,oBAAA,CAC5B6uB,EAAW,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,CAAA,CACvD,EACCF,CAAAA,CAAiB,MAAA,CAAS,CAAA,EACzB3uB,IAAAA,CAAC,OAAI,SAAA,CAAU,wDAAA,CACb,UAAA1H,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,aAAA,CAAc,QAAA,CAAA,0BAAA,CAAqB,CAAA,CACjDq2B,CAAAA,CAAiB,IAAI,CAACjyB,CAAAA,CAAO0I,CAAAA,GAC5BpF,IAAAA,CAAC,OAAgB,SAAA,CAAU,MAAA,CAAO,QAAA,CAAA,CAAA,SAAA,CAAGtD,CAAAA,CAAAA,CAAAA,CAA3B0I,CAAiC,CAC5C,CAAA,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CACE,KAUJpF,IAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAU,uEAAA,CACV,MAAO,CACL,WAAA,CAAayvB,CAAAA,CACb,WAAA,CAAaC,EACb,WAAA,CAAa,OAAA,CACb,eAAA,CAAiBC,CACnB,EAIC,QAAA,CAAA,CAAAt/B,CAAAA,CAAQ,OACPiI,GAAAA,CAACu1B,EAAAA,CAAA,CAAQ,SAAA,CAAU,6EAAA,CAChB,QAAA,CAAA3tB,CAAAA,CAAiB7P,EAAQ,KAAA,CAAO8P,CAAW,CAAA,CAC9C,CAAA,CAGD9P,EAAQ,QAAA,EACPiI,GAAAA,CAACmO,EAAAA,CAAA,CAAS,UAAU,2BAAA,CACjB,QAAA,CAAAvG,CAAAA,CAAiB7P,CAAAA,CAAQ,SAAU8P,CAAW,CAAA,CACjD,CAAA,CAGF7H,GAAAA,CAAC,OAAI,SAAA,CAAU,yKAAA,CACZ,QAAA,CAAA0rB,CAAAA,CAA8B,IAAI,CAACvc,CAAAA,CAAMrC,CAAAA,GAAU,CAElD,GAAI,MAAA,GAAUqC,CAAAA,EAAQA,EAAK,IAAA,GAAS,cAAA,CAAgB,CAClD,GAAM,CAAE,KAAA,CAAAjX,CAAM,EAAIiX,CAAAA,CAClB,OACEzH,IAAAA,CAAC,KAAA,CAAA,CAEC,UAAU,oFAAA,CAET,QAAA,CAAA,CAAAxP,CAAAA,CAAM,UAAA,EACL8H,IAAC,IAAA,CAAA,CAAG,SAAA,CAAU,2CACX,QAAA,CAAA9H,CAAAA,CAAM,WACT,CAAA,CAEF8H,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CACZ,QAAA,CAAA9H,CAAAA,CAAM,MAAA,CAAO,GAAA,CAAK0yB,GACjB5qB,GAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAW62B,CAAAA,CAAmBjM,CAAW,CAAA,CAExC,QAAA,CAAAkM,EAAoBlM,CAAW,CAAA,CAAA,CAH3B,GAAG6K,CAAO,CAAA,CAAA,EAAI7K,CAAAA,CAAY,SAAS,UAI1C,CACD,CAAA,CACH,CAAA,CAAA,CAAA,CAjBK,CAAA,EAAG6K,CAAO,CAAA,cAAA,EAAiBv9B,CAAAA,CAAM,WAAW,CAAA,CAAA,EAAI4U,CAAK,CAAA,CAkB5D,CAEJ,CAGA,IAAMnV,EAAQwX,CAAAA,CACd,OACEnP,GAAAA,CAAC,KAAA,CAAA,CAEC,UAAW62B,CAAAA,CAAmBl/B,CAAK,CAAA,CAElC,QAAA,CAAAm/B,EAAoBn/B,CAAK,CAAA,CAAA,CAHrB,CAAA,EAAG89B,CAAO,IAAI99B,CAAAA,CAAM,SAAS,UAIpC,CAEJ,CAAC,EACH,CAAA,CAAA,CAAA,CA/DKu+B,CAkGP,CAEJ,CAAA,CAEOoB,GAAQ9B,EAAAA,CCnkBf,IAAM+B,EAAAA,CAAgD,CAAC,CACrD,UAAA,CAAAC,CAAAA,CACA,MAAA,CAAAvE,CAAAA,CACA,kBAAAwE,CAAAA,CACA,aAAA,CAAAC,EACA,QAAA,CAAA9sB,CAAAA,CACA,WAAA+sB,CAAAA,CACA,cAAA,CAAAr6B,CAAAA,CACA,aAAA,CAAAC,EACA,YAAA,CAAA0L,CAAAA,CAAe,KAAA,CACf,kBAAA,CAAA2uB,EACA,kBAAA,CAAAC,CAAAA,CAAqB,IAAA,CACrB,mBAAA,CAAAC,EAAsB,IACxB,CAAA,GAAM,CAEJ,IAAMC,EAAiBN,CAAAA,EAAqBD,CAAAA,CAGtCQ,CAAAA,CAAa/E,CAAAA,CACb,CAACgF,CAAAA,CAAiBC,CAAkB,CAAA,CAAIv8B,QAAAA,CAAS,KAAK,CAAA,CAEtDw8B,CAAAA,CAAcP,CAAAA,EAAsB,WAAA,CAEpCQ,EAAiB,IAAM,CAC3BT,GAAW,CACXO,CAAAA,CAAmB,KAAK,EAC1B,CAAA,CAEMG,CAAAA,CAA0B,IACzBJ,EAGHj4B,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gFAAA,CACb,SAAA0H,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6EAAA,CAEb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gEAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAA,CAAA1H,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CACb,QAAA,CAAAA,IAACs4B,aAAAA,CAAA,CAAc,SAAA,CAAU,sBAAA,CAAuB,EAClD,CAAA,CACAt4B,GAAAA,CAAC,MAAG,SAAA,CAAU,qCAAA,CAAsC,2CAEpD,CAAA,CAAA,CACF,CAAA,CACAA,GAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAAU+H,CAAAA,EAAM,CACdA,EAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,eAAA,GACFmwB,CAAAA,CAAmB,KAAK,EAC1B,CAAA,CACA,UAAU,qDAAA,CAEV,QAAA,CAAAl4B,GAAAA,CAACopB,CAAAA,CAAA,CAAE,IAAA,CAAM,EAAA,CAAI,CAAA,CACf,CAAA,CAAA,CACF,EAGA1hB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,KAAA,CACb,UAAA1H,GAAAA,CAAC,GAAA,CAAA,CAAE,UAAU,oBAAA,CAAqB,QAAA,CAAA,0KAAA,CAGlC,EACAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CACb,SAAA0H,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CACb,UAAA1H,GAAAA,CAACs4B,aAAAA,CAAA,CAAc,SAAA,CAAU,iDAAiD,CAAA,CAC1E5wB,IAAAA,CAAC,OAAI,SAAA,CAAU,sBAAA,CACb,UAAA1H,GAAAA,CAAC,QAAA,CAAA,CAAO,QAAA,CAAA,aAAA,CAAW,CAAA,CAAS,4DAC9B,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGA0H,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oEAAA,CACb,QAAA,CAAA,CAAA1H,IAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAU+H,CAAAA,EAAM,CACdA,CAAAA,CAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,iBAAgB,CAClBmwB,CAAAA,CAAmB,KAAK,EAC1B,EACA,SAAA,CAAU,mHAAA,CACX,QAAA,CAAA,SAAA,CAED,CAAA,CACAxwB,KAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAUK,GAAM,CACdA,CAAAA,CAAE,cAAA,EAAe,CACjBA,EAAE,eAAA,EAAgB,CAClBqwB,CAAAA,KACF,EACA,SAAA,CAAU,uHAAA,CAEV,QAAA,CAAA,CAAAp4B,GAAAA,CAACue,OAAA,CAAO,IAAA,CAAM,GAAI,CAAA,CAClBve,GAAAA,CAAC,QAAK,QAAA,CAAA,WAAA,CAAS,CAAA,CAAA,CACjB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,EACF,CAAA,CAvE2B,IAAA,CA2E/B,OAAK63B,CAAAA,CAoCHnwB,KAAAH,QAAAA,CAAA,CAEE,QAAA,CAAA,CAAAG,IAAAA,CAAC,OAAI,SAAA,CAAU,yEAAA,CACb,UAAA1H,GAAAA,CAACktB,EAAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAUnlB,CAAAA,EAAM,CACdA,CAAAA,CAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,iBAAgB,CAClBgwB,CAAAA,KACF,CAAA,CACA,SAAUz6B,CAAAA,CACX,QAAA,CAAA,iBAAA,CAED,EAGCw6B,CAAAA,EACC93B,GAAAA,CAAC,OAAI,SAAA,CAAU,4BAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAU+H,CAAAA,EAAM,CACdA,CAAAA,CAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,iBAAgB,CAClBmwB,CAAAA,CAAmB,IAAI,EACzB,EACA,SAAA,CAAU,wJAAA,CACV,KAAA,CAAM,iCAAA,CAEN,SAAAl4B,GAAAA,CAACue,MAAAA,CAAA,CAAO,IAAA,CAAM,GAAI,SAAA,CAAU,4CAAA,CAA6C,CAAA,CAC3E,CAAA,CACF,EAGAhhB,CAAAA,CAaAyC,GAAAA,CAAC8R,GAAA,CAAc,IAAA,CAAK,SAAS,OAAA,CAASlH,CAAAA,CACnC,QAAA,CAAAutB,CAAAA,CACH,EAdAn4B,GAAAA,CAAC8R,EAAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAU/J,CAAAA,EAAM,CACdA,CAAAA,CAAE,gBAAe,CACjBA,CAAAA,CAAE,eAAA,EAAgB,CAClBiwB,MACF,CAAA,CACA,QAAA,CAAU/uB,CAAAA,CAET,SAAAA,CAAAA,CAAe,eAAA,CAAkB,SAAA,CACpC,CAAA,CAAA,CAMJ,EAGAvB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4IAAA,CACb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,0DAAA,CACb,QAAA,CAAA,CAAA1H,IAACktB,EAAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAUnlB,CAAAA,EAAM,CACdA,CAAAA,CAAE,cAAA,GACFA,CAAAA,CAAE,eAAA,EAAgB,CAClBgwB,CAAAA,KACF,CAAA,CACA,QAAA,CAAUz6B,CAAAA,CACV,SAAA,CAAU,sBACX,QAAA,CAAA,iBAAA,CAED,CAAA,CAGCw6B,CAAAA,EACC93B,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAU+H,CAAAA,EAAM,CACdA,CAAAA,CAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,iBAAgB,CAClBmwB,CAAAA,CAAmB,IAAI,EACzB,CAAA,CACA,UAAU,mNAAA,CACV,KAAA,CAAM,iCAAA,CAEN,QAAA,CAAAl4B,IAACue,MAAAA,CAAA,CAAO,IAAA,CAAM,EAAA,CAAI,UAAU,4CAAA,CAA6C,CAAA,CAC3E,CAAA,CAGAhhB,CAAAA,CAcAyC,IAAC8R,EAAAA,CAAA,CAEC,KAAK,QAAA,CACL,OAAA,CAASlH,EACT,SAAA,CAAU,qBAAA,CAGT,QAAA,CAAAutB,CAAAA,CACH,EArBAn4B,GAAAA,CAAC8R,EAAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAU/J,CAAAA,EAAM,CACdA,CAAAA,CAAE,gBAAe,CACjBA,CAAAA,CAAE,iBAAgB,CAClBiwB,CAAAA,KACF,CAAA,CACA,QAAA,CAAU/uB,CAAAA,CACV,SAAA,CAAU,sBAET,QAAA,CAAAA,CAAAA,CAAe,eAAA,CAAkB,SAAA,CACpC,GAYJ,CAAA,CAGAjJ,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAA2B,CAAA,CAAA,CAC5C,CAAA,CAGAA,GAAAA,CAACq4B,CAAAA,CAAA,EAAwB,CAAA,CAAA,CAC3B,CAAA,CAtJE3wB,IAAAA,CAAAH,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAG,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yDACb,QAAA,CAAA,CAAA1H,GAAAA,CAAC8R,EAAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAASlH,EACT,QAAA,CAAU3B,CAAAA,CACV,UAAU,eAAA,CAET,QAAA,CAAAA,CAAAA,CAAe,eAAA,CAAkBkvB,EACpC,CAAA,CAECL,CAAAA,EACC93B,GAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAAU+H,CAAAA,EAAM,CACdA,EAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,eAAA,GACFmwB,CAAAA,CAAmB,IAAI,EACzB,CAAA,CACA,UAAU,wJAAA,CACV,KAAA,CAAM,iCAAA,CAEN,QAAA,CAAAl4B,IAACue,MAAAA,CAAA,CAAO,IAAA,CAAM,EAAA,CAAI,UAAU,4CAAA,CAA6C,CAAA,CAC3E,GAEJ,CAAA,CAGAve,GAAAA,CAACq4B,EAAA,EAAwB,CAAA,CAAA,CAC3B,CA2HN,CAAA,CAEOE,GAAQhB,EAAAA,CC1Qf,IAAMiB,GAAsD,CAAC,CAC3D,IAAA,CAAA5+B,CAAAA,CACA,OAAAyH,CAAAA,CACA,QAAA,CAAAuJ,CAAAA,CACA,WAAA,CAAA/C,EACA,UAAA,CAAA5D,CAAAA,CACA,iBAAA,CAAAw0B,CAAAA,CACA,WAAAd,CAAAA,CACA,OAAA,CAAA5zB,CAAAA,CACA,gBAAA,CAAA20B,EACA,cAAA,CAAAp9B,CAAAA,CACA,gBAAAkU,CAAAA,CACA,QAAA,CAAAxV,EACA,aAAA,CAAA6V,CAAAA,CACA,mBAAA,CAAAioB,CAAAA,CAAsB,KACtB,eAAA,CAAAa,CACF,CAAA,GAAM,CAEJ,IAAMC,CAAAA,CAAgB53B,EAAAA,CAAcM,CAAAA,EAAUA,CAAAA,CAAM,MAAMD,CAAM,CAAC,EAC3D2D,CAAAA,CAAa5I,OAAAA,CAAQ,IAAMw8B,CAAAA,EAAiB,EAAC,CAAG,CAACA,CAAa,CAAC,CAAA,CAG/D,CAAE,YAAA,CAAA7yB,EAAc,YAAA,CAAAkD,CAAAA,CAAc,eAAA,CAAAhD,CAAgB,EAAIyE,EAAAA,CACtDzG,CAAAA,CACAF,EACA8D,CAAAA,CACAvM,CACF,EACM,CAAE,UAAA,CAAA08B,CAAW,CAAA,CAAIxxB,GACrBvC,CAAAA,CACA8B,CAAAA,CACAkD,CAAAA,CACAhD,CAAAA,CACArM,EACAoL,CAAAA,CACA1J,CAAAA,EAAkB,UACpB,CAAA,CACM,CAAE,0BAAA,CAAAu9B,CAA2B,CAAA,CAAI7tB,EAAAA,CACrCjH,EACAnK,CAAAA,CACAmM,CAAAA,CACA6E,CAAAA,CACA3E,CACF,EAGM1K,CAAAA,CAAoB0I,CAAAA,CAAW,iBAAA,CAC/BzI,CAAAA,CAAiByI,EAAW,cAAA,CAG5B60B,CAAAA,CAAsB7tB,EAAAA,CAA2BhH,CAAAA,CAAW,WAAW,CAAA,CAG7E,OAAAiI,UAAU,IAAM,CACd,GAAI3Q,CAAAA,EAAqBA,CAAAA,CAAkB,MAAA,CAAS,CAAA,EAC9C,CAACA,CAAAA,CAAkB0I,CAAAA,CAAW,YAAY,CAAA,CAAG,CAE/C,IAAM80B,CAAAA,CAAcx9B,CAAAA,CAAkB,SAAA,CACpC,CAACe,CAAAA,CAASyM,CAAAA,GAAQzM,CAAAA,EAAWyM,CAAAA,CAAM9E,EAAW,YAChD,CAAA,CACA,GAAI80B,CAAAA,GAAgB,GAAI,CACtB90B,CAAAA,CAAW,QAAA,CAAS80B,CAAAA,CAAa,CAAC,CAAA,CAClC,MACF,CAGA,IAAMC,EAAkBz9B,CAAAA,CAAkB,WAAA,CACxC,KACA0I,CAAAA,CAAW,YAAA,CAAe,CAC5B,CAAA,CACI+0B,CAAAA,GAAoB,EAAA,EACtB/0B,CAAAA,CAAW,SAAS+0B,CAAAA,CAAiB,CAAC,EAE1C,CAEJ,EAAG,CAACz9B,CAAAA,CAAmB0I,CAAAA,CAAW,YAAA,CAAcA,EAAW,QAAQ,CAAC,CAAA,CAGpEiI,SAAAA,CAAU,IAAM,CACd,GAAI1Q,CAAAA,EAAkBA,CAAAA,CAAe,OAAS,CAAA,CAAG,CAC/C,IAAMy9B,CAAAA,CAAaz9B,EAAeyI,CAAAA,CAAW,YAAY,CAAA,CAMzD,GALI,CAACg1B,CAAAA,EAAcA,CAAAA,CAAW,SAAW,CAAA,EAAA,CAIhBA,CAAAA,CAAWh1B,EAAW,SAAS,CAAA,EAAK,CAAA,EACtC,CAAA,CACrB,OAIF,IAAMi1B,CAAAA,CAAWD,CAAAA,CAAW,SAAA,CAC1B,CAACl8B,CAAAA,CAAOgM,CAAAA,GAAQhM,CAAAA,CAAQ,CAAA,EAAKgM,EAAM9E,CAAAA,CAAW,SAChD,EACA,GAAIi1B,CAAAA,GAAa,GAAI,CACnBj1B,CAAAA,CAAW,QAAA,CAASA,CAAAA,CAAW,aAAci1B,CAAQ,CAAA,CACrD,MACF,CAGA,QAASnwB,CAAAA,CAAM9E,CAAAA,CAAW,SAAA,CAAY,CAAA,CAAG8E,GAAO,CAAA,CAAGA,CAAAA,EAAAA,CACjD,GAAIkwB,CAAAA,CAAWlwB,CAAG,EAAI,CAAA,CAAG,CACvB9E,CAAAA,CAAW,QAAA,CAASA,EAAW,YAAA,CAAc8E,CAAG,CAAA,CAChD,MACF,CAIF,IAAM3C,CAAAA,CAAmB5K,CAAAA,CAAe,SAAA,CACtC,CAAC29B,CAAAA,CAAQpwB,CAAAA,GACmBowB,CAAAA,CAAO,MAAA,CAAOp8B,GAASA,CAAAA,CAAQ,CAAC,CAAA,CACjC,MAAA,CAAS,GAAKgM,CAAAA,CAAM9E,CAAAA,CAAW,YAE5D,CAAA,CACA,GAAImC,CAAAA,GAAqB,EAAA,CAAI,CAC3B,IAAMgzB,EAAgB59B,CAAAA,CAAe4K,CAAgB,EAAE,SAAA,CACpDrJ,CAAAA,EAAUA,EAAQ,CACrB,CAAA,CACAkH,CAAAA,CAAW,QAAA,CAASmC,EAAkB,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGgzB,CAAa,CAAC,CAAA,CAChE,MACF,CAGA,IAAA,IAASrwB,EAAM9E,CAAAA,CAAW,YAAA,CAAe,CAAA,CAAG8E,CAAAA,EAAO,EAAGA,CAAAA,EAAAA,CAAO,CAC3D,IAAMowB,CAAAA,CAAS39B,EAAeuN,CAAG,CAAA,CAEjC,GAD0BowB,CAAAA,CAAO,OAAOp8B,CAAAA,EAASA,CAAAA,CAAQ,CAAC,CAAA,CACpC,OAAS,CAAA,CAAG,CAChC,IAAMs8B,CAAAA,CAAAA,CAAY,IAAM,CACtB,IAAA,IAASn8B,CAAAA,CAAUi8B,CAAAA,CAAO,MAAA,CAAS,EAAGj8B,CAAAA,EAAW,CAAA,CAAGA,CAAAA,EAAAA,CAClD,GAAIi8B,EAAOj8B,CAAO,CAAA,CAAI,CAAA,CACpB,OAAOA,EAGX,OAAO,CACT,CAAA,GAAG,CACH+G,EAAW,QAAA,CAAS8E,CAAAA,CAAKswB,CAAQ,CAAA,CACjC,MACF,CACF,CACF,CACF,CAAA,CAAG,CAAC79B,CAAAA,CAAgByI,CAAAA,CAAW,YAAA,CAAcA,CAAAA,CAAW,UAAWA,CAAAA,CAAW,QAAQ,CAAC,CAAA,CAQrFyD,IAAAA,CAAAH,SAAA,CACE,QAAA,CAAA,CAAAvH,GAAAA,CAAC8N,EAAAA,CAAA,CAAkB,MAAA,CAAQzM,CAAAA,CAAQ,QAAA,CAAUzH,CAAAA,CAAK,SAAU,CAAA,CAE5D8N,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,yFACV,KAAA,CAAO,CACL,gBAAiBixB,CAAAA,EAAiB,aAAA,EAAe,iBAAmB,SAAA,CACpE,WAAA,CAAaA,CAAAA,EAAiB,aAAA,EAAe,YAC7C,WAAA,CAAaA,CAAAA,EAAiB,aAAA,EAAe,WAAA,CACxC,OAAOA,CAAAA,CAAgB,aAAA,CAAc,WAAA,EAAgB,QAAA,CAClD,GAAGA,CAAAA,CAAgB,aAAA,CAAc,WAAW,CAAA,EAAA,CAAA,CAC5CA,CAAAA,CAAgB,cAAc,WAAA,CAClC,MAAA,CACJ,WAAA,CAAaA,CAAAA,EAAiB,eAAe,WAAA,CAAc,OAAA,CAAU,MACvE,CAAA,CAEA,UAAA34B,GAAAA,CAAC2P,EAAAA,CAAA,CACC,WAAA,CAAa1L,EAAW,kBAAA,EAAsBA,CAAAA,CAAW,WAAA,CACzD,UAAA,CAAYA,EAAW,iBAAA,EAAqBA,CAAAA,CAAW,UAAA,CACvD,eAAA,CAAiBuL,EACjB,QAAA,CAAUxV,CAAAA,CACV,iBAAA,CAAmBiK,CAAAA,CAAW,kBAC9B,mBAAA,CAAqBA,CAAAA,CAAW,YAAA,CAClC,CAAA,CACAjE,IAAC8P,EAAAA,CAAA,CACC,KAAMlW,CAAAA,CACN,WAAA,CAAaiO,EACb,aAAA,CAAegI,CAAAA,CACjB,CAAA,CAEA7P,GAAAA,CAAC,OAAI,SAAA,CAAU,yDAAA,CACb,QAAA,CAAAA,GAAAA,CAACs3B,GAAA,CACC,OAAA,CAASrzB,CAAAA,CAAW,cAAA,CACpB,OAAQ60B,CAAAA,CACR,WAAA,CAAajxB,CAAAA,CACb,OAAA,CAAS5D,EAAW,OAAA,CACpB,aAAA,CAAew0B,CAAAA,CACf,UAAA,CAAYzzB,EACZ,MAAA,CAAQ3D,CAAAA,CACR,cAAA,CAAgB/F,CAAAA,CAChB,YAAaq8B,CAAAA,CACb,WAAA,CAAa/9B,CAAAA,CAAK,QAAA,CAClB,oBAAqBqK,CAAAA,CAAW,YAAA,CAChC,SAAU40B,CAAAA,CACV,MAAA,CAAQb,EACR,aAAA,CAAe/zB,CAAAA,CAAW,aAAA,CAC1B,sBAAA,CAAwB00B,GAAiB,gBAAA,CACzC,SAAA,CAAW,CACT,YAAA,CAAc10B,EAAW,YAAA,CACzB,SAAA,CAAWA,CAAAA,CAAW,SAAA,CACtB,GAAGA,CAAAA,CAAW,SAChB,CAAA,CACF,CAAA,CACF,EAEAjE,GAAAA,CAACu4B,EAAAA,CAAA,CACC,UAAA,CAAYt0B,EAAW,YAAA,CACvB,MAAA,CAAQ+zB,CAAAA,CACR,iBAAA,CAAmB/zB,EAAW,mBAAA,CAC9B,aAAA,CAAeA,CAAAA,CAAW,eAAA,CAC1B,WAAY0zB,CAAAA,CACZ,QAAA,CAAUkB,EACV,cAAA,CAAgB50B,CAAAA,CAAW,eAC3B,aAAA,CAAeA,CAAAA,CAAW,aAAA,CAC1B,YAAA,CAAcgF,EACd,kBAAA,CAAoByvB,CAAAA,CACpB,kBAAA,CAAoBz0B,CAAAA,CAAW,WAAa,CAAA,CAC5C,mBAAA,CAAqB6zB,CAAAA,CACvB,CAAA,CAAA,CACF,GACF,CAEJ,CAAA,CAEOwB,GAAQd,EAAAA,CC1Nf,IAAMe,EAAAA,CAAwC,CAAC,CAC7C,IAAA,CAAA3/B,CAAAA,CACA,MAAA,CAAAyH,CAAAA,CACA,SAAAuJ,CAAAA,CACA,WAAA,CAAA/C,CAAAA,CAAc,IAAA,CACd,iBAAA6wB,CAAAA,CACA,cAAA,CAAAp9B,CACF,CAAA,GAAM,CAEJ,IAAMk+B,CAAAA,CAA0Bl+B,CAAAA,EAAkB1B,CAAAA,CAAK,aAAA,EAAe,gBAAkB,UAAA,CAElF4V,CAAAA,CAAkB5V,CAAAA,CAAK,aAAA,EAAe,gBAEtCiW,CAAAA,CAAgBjW,CAAAA,CAAK,aAAA,EAAe,aAAA,CAEpCk+B,EAAsBl+B,CAAAA,CAAK,aAAA,EAAe,mBAAA,EAAuB,IAAA,CAEjE++B,EAAkB/+B,CAAAA,CAAK,aAAA,EAAe,eAAA,CAEtCg/B,CAAAA,CAAgB53B,GAAcM,CAAAA,EAAUA,CAAAA,CAAM,KAAA,CAAMD,CAAM,CAAC,CAAA,CAC3D2D,CAAAA,CAAa5I,OAAAA,CAAQ,IAAMw8B,GAAiB,EAAC,CAAG,CAACA,CAAa,CAAC,EAG/DhhC,CAAAA,CAAqDwE,OAAAA,CAAQ,IAAM,CACvE,IAAM05B,CAAAA,CAA4C,EAAC,CACnD,OAAA,MAAA,CAAO,QAAQ9wB,CAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC9K,CAAAA,CAAK3B,CAAK,CAAA,GAAM,CACnDu9B,EAAU57B,CAAG,CAAA,CAAI,CAAE,aAAA,CAAe3B,CAAM,EAC1C,CAAC,CAAA,CACMu9B,CACT,EAAG,CAAC9wB,CAAU,CAAC,CAAA,CAGTzJ,EAAoBa,OAAAA,CAAQ,IACzBxC,EAAK,QAAA,CAAS,GAAA,CAAK7B,GAAY,CACpC,GAAI,CACF,OAAOD,GAAqBC,CAAAA,CAASH,CAAkB,CACzD,CAAA,MAASwM,EAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,2CAAA,CAA0C,CACtD,SAAA,CAAWrM,CAAAA,CAAQ,SAAA,CACnB,KAAA,CAAAqM,CACF,CAAC,CAAA,CACM,IACT,CACF,CAAC,CAAA,CACA,CAACxK,CAAAA,CAAK,QAAA,CAAUhC,CAAkB,CAAC,CAAA,CAGhCyD,CAAAA,CAAgB,CAAA,CAChBG,EAAiBY,OAAAA,CAAQ,IACtBxC,EAAK,QAAA,CAAS,GAAA,CAAI,CAAC7B,CAAAA,CAASoG,CAAAA,GAAe,CAChD,GAAI,CAAC5C,CAAAA,CAAkB4C,CAAU,CAAA,CAC/B,OAAO,EAAC,CAGV,IAAMjC,CAAAA,CAASnE,CAAAA,CAAQ,YAAc,EAAC,CAChC0hC,EAAa,IAAA,CAAK,IAAA,CAAKv9B,EAAO,MAAA,CAASb,CAAa,CAAA,CACpD49B,CAAAA,CAAa,IAAI,KAAA,CAAMQ,CAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,CAE/C,OAAAv9B,CAAAA,CAAO,OAAA,CAAQ,CAACvE,CAAAA,CAAOmV,CAAAA,GAAU,CAC/B,IAAM4sB,CAAAA,CAAY,KAAK,KAAA,CAAM5sB,CAAAA,CAAQzR,CAAa,CAAA,CAClD,GAAI,CACE3D,EAAAA,CAAuBC,CAAAA,CAAOC,CAAkB,IAClDqhC,CAAAA,CAAWS,CAAS,CAAA,CAAA,CAAKT,CAAAA,CAAWS,CAAS,CAAA,EAAK,CAAA,EAAK,CAAA,EAE3D,CAAA,MAASt1B,EAAO,CACd,OAAA,CAAQ,KAAA,CAAM,yCAAA,CAAwC,CACpD,SAAA,CAAWrM,CAAAA,CAAQ,SAAA,CACnB,SAAA,CAAWJ,EAAM,SAAA,CACjB,KAAA,CAAAyM,CACF,CAAC,EACD60B,CAAAA,CAAWS,CAAS,GAAKT,CAAAA,CAAWS,CAAS,GAAK,CAAA,EAAK,EACzD,CACF,CAAC,EAEMT,CACT,CAAC,CAAA,CACA,CAACr/B,EAAK,QAAA,CAAU2B,CAAAA,CAAmB3D,CAAAA,CAAoByD,CAAa,CAAC,CAAA,CAGlE4I,CAAAA,CAAa7I,EAAAA,CAAkB,CACnC,KAAAxB,CAAAA,CACA,cAAA,CAAgB4/B,CAAAA,CAChB,iBAAA,CAAAj+B,EACA,cAAA,CAAAC,CACF,CAAC,CAAA,CACKwI,EAAY5H,OAAAA,CAAQ,IAAMzC,EAAAA,CAAiBC,CAAI,EAAG,CAACA,CAAI,CAAC,CAAA,CAGxD,CAAE,YAAA8H,CAAY,CAAA,CAAIF,EAAAA,CAAmBH,CAAAA,CAAQzH,EAAK,QAAQ,CAAA,CAC1DqI,CAAAA,CAAS7F,OAAAA,CAAQ,IAAM2F,EAAAA,CAAgBiC,CAAS,CAAA,CAAG,CAACA,CAAS,CAAC,CAAA,CAG9D21B,CAAAA,CAAUv9B,OAAAA,CAAQ,IAEf,CAAA,EAAGiF,CAAM,CAAA,CAAA,EAAI4C,CAAAA,CAAW,OAAO,CAAA,CAAA,EAAIrK,CAAAA,CAAK,QAAA,CAAS,MAAM,GAC7D,CAACyH,CAAAA,CAAQ4C,CAAAA,CAAW,OAAA,CAASrK,EAAK,QAAA,CAAS,MAAM,CAAC,CAAA,CAG/CmK,CAAAA,CAAU61B,QAAQ,CACtB,QAAA,CAAUC,WAAAA,CAAY53B,CAAM,EAC5B,IAAA,CAAM,WAAA,CACN,aAAA,CAAe7F,OAAAA,CAAQ,IAAM,MAAA,CAAO,WAAA,CAClC4H,CAAAA,CAAU,GAAA,CAAKrM,GAAU,CACvBA,CAAAA,CAAM,UACN+J,CAAAA,CAAY/J,CAAAA,CAAM,SAAS,CAAA,EAAKA,CAAAA,CAAM,QAAA,EAAU,aAAA,EAAiB,EACnE,CAAC,CACH,CAAA,CAAG,CAACqM,EAAWtC,CAAW,CAAC,CAC7B,CAAC,EAGDwK,SAAAA,CAAU,IAAM,CACd,IAAMtT,CAAAA,CAASmL,EAAQ,SAAA,EAAU,CAEjC,IAAA,IAAW7J,CAAAA,IAAOtB,EAAQ,CACxB,IAAML,CAAAA,CAAQK,CAAAA,CAAOsB,CAAG,CAAA,CACpB3B,CAAAA,GAAU,MAAA,EAAaA,CAAAA,GAAU,IACnCwL,CAAAA,CAAQ,QAAA,CAAS7J,CAAAA,CAAK3B,CAAAA,CAAO,CAAE,WAAA,CAAa,IAAK,CAAC,EAEtD,CACF,CAAA,CAAG,CAACwL,CAAO,CAAC,EAGZ,IAAM00B,CAAAA,CAAoB72B,WAAAA,CAAY,CAACqc,EAAY1lB,CAAAA,GAAe,CAChEwL,EAAQ,QAAA,CAASka,CAAAA,CAAI1lB,EAAO,CAAE,cAAA,CAAgB,IAAK,CAAC,EACtD,CAAA,CAAG,CAACwL,CAAO,CAAC,EAEN,CAAE,cAAA,CAAAq0B,CAAe,CAAA,CAAI/zB,GAAaN,CAAAA,CAASC,CAAAA,CAAW3C,EAAQ4C,CAAU,CAAA,CAExE5E,EAAezF,CAAAA,CAAK,KAAA,EAAO,YAAA,EAAgBoF,EAAAA,CAC3C86B,EAAY16B,EAAAA,CAAgBC,CAAY,CAAA,CAE9C,OACEW,IAACF,EAAAA,CAAA,CAAkB,YAAA,CAAcT,CAAAA,CACjC,SAAAW,GAAAA,CAAC+5B,YAAAA,CAAA,CAAc,GAAGh2B,CAAAA,CAChB,SAAA/D,GAAAA,CAAC,MAAA,CAAA,CAEC,QAAA,CAAW+H,CAAAA,EAAMA,EAAE,cAAA,EAAe,CAClC,SAAA,CAAU,iFAAA,CACV,MAAO+xB,CAAAA,CAEP,QAAA,CAAA95B,GAAAA,CAACs5B,EAAAA,CAAA,CACC,IAAA,CAAM1/B,CAAAA,CACN,MAAA,CAAQyH,CAAAA,CACR,SAAUuJ,CAAAA,CACV,WAAA,CAAa/C,CAAAA,CACb,UAAA,CAAY5D,EACZ,SAAA,CAAWD,CAAAA,CACX,iBAAA,CAAmBy0B,CAAAA,CACnB,WAAYL,CAAAA,CACZ,OAAA,CAASr0B,CAAAA,CACT,gBAAA,CAAkB20B,GAAoB,UAAA,CACtC,cAAA,CAAgBc,EAChB,eAAA,CAAiBhqB,CAAAA,CACjB,SAAU5V,CAAAA,CAAK,QAAA,CACf,aAAA,CAAeiW,CAAAA,CACf,oBAAqBioB,CAAAA,CACrB,eAAA,CAAiBa,CAAAA,CACnB,CAAA,CAAA,CAtBKgB,CAuBP,CAAA,CACF,CAAA,CACA,CAEJ,CAAA,CAEOK,GAAQT,GCiCR,IAAKU,QACVA,CAAAA,CAAA,KAAA,CAAQ,QACRA,CAAAA,CAAA,KAAA,CAAQ,OAAA,CACRA,CAAAA,CAAA,MAAQ,OAAA,CACRA,CAAAA,CAAA,QAAA,CAAW,UAAA,CACXA,EAAA,GAAA,CAAM,KAAA,CACNA,CAAAA,CAAA,KAAA,CAAQ,QACRA,CAAAA,CAAA,gBAAA,CAAmB,mBACnBA,CAAAA,CAAA,GAAA,CAAM,MARIA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA","file":"index.mjs","sourcesContent":["import type { ConditionalDisplayGroup, FormField, ResponseInForm, Section } from \"./formTypeStructure\";\n\n// Types plus stricts pour améliorer la robustesse\ntype ConditionalOperator = \n | \"==\" \n | \"!=\" \n | \">\" \n | \"<\" \n | \"IN\" \n | \"NOT IN\" \n | \"CONTAINS\" \n | \"NOT CONTAINS\";\n\n// type ComputationType = \"SOMME\" | \"MULTIPLICATION\";\n\n// Fonction utilitaire pour normaliser les entrées en tableaux\nfunction normalizeToArray<T>(input?: T | T[]): T[] {\n if (input === undefined) return [];\n return Array.isArray(input) ? input : [input];\n}\n\nexport function shouldDisplayFormField(field: FormField, allResponseInForms: Record<string, ResponseInForm>): boolean {\n // console.log(`🔍 [shouldDisplayFormField] Evaluating field:`, field.conditionalDisplay);\n const result = evaluateConditionalDisplay(allResponseInForms, field.conditionalDisplay);\n // console.log(`✅ [shouldDisplayFormField] Result: ${result}`);\n return result;\n}\n\n// export function shouldDisplaySection(section: Section, allResponseInForms: Record<string, ResponseInForm>): boolean {\n// console.log(`🔍 [shouldDisplaySection] Evaluating section:`, section.conditionalDisplay);\n// const result = evaluateConditionalDisplay(allResponseInForms, section.conditionalDisplay);\n// console.log(`✅ [shouldDisplaySection] Result: ${result}`);\n// return result;\n// }\n\nexport function shouldDisplaySection(section: Section, allResponseInForms: Record<string, ResponseInForm>): boolean {\n // console.log(`🔍 [shouldDisplaySection] Section ID: ${section.title}`);\n // console.log(`🧾 conditionalDisplay:`, JSON.stringify(section.conditionalDisplay, null, 2));\n\n const result = evaluateConditionalDisplay(allResponseInForms, section.conditionalDisplay);\n\n // console.log(`✅ [shouldDisplaySection] Result for section \"${section.title}\": ${result}`);\n return result;\n}\n\n\n\nfunction evaluateConditionalDisplay(\n allResponseInForms: Record<string, ResponseInForm>,\n display?: ConditionalDisplayGroup\n): boolean {\n if (!display) {\n return true;\n }\n\n return evaluateConditionalDisplayGroup(display, allResponseInForms);\n}\n\nfunction evaluateConditionalDisplayGroup(\n group: ConditionalDisplayGroup,\n allResponseInForms: Record<string, ResponseInForm>\n): boolean {\n // console.log(`🔧 [evaluateConditionalDisplayGroup] Starting group evaluation`);\n // console.log(`🔧 [evaluateConditionalDisplayGroup] Group logic: ${group.logic}`);\n // console.log(`🔧 [evaluateConditionalDisplayGroup] Rules count: ${group.rules.length}`);\n \n const rules = normalizeToArray(group.rules);\n const evaluations = rules.map((rule) => {\n // console.log(`\\n🔧 [Rule ${ruleIndex + 1}] Starting rule evaluation:`, rule);\n \n const { fieldName, formFieldId, value, operator, numeric_compare_to, typeComputation } = rule;\n \n // Simplification de la récupération des clés de champs\n const fieldKeys: string[] = normalizeToArray(fieldName).length > 0 \n ? normalizeToArray(fieldName) \n : normalizeToArray(formFieldId);\n\n // console.log(`🔧 [Rule ${ruleIndex + 1}] Final field keys:`, fieldKeys);\n\n // Si aucune clé n'est trouvée, la règle échoue\n if (fieldKeys.length === 0) {\n // console.log(`❌ [Rule ${ruleIndex + 1}] No field keys found, rule fails`);\n return false;\n }\n\n // Récupération des valeurs depuis les réponses\n const values: ResponseInForm['responseValue'][] = fieldKeys\n .map(k => {\n const response = allResponseInForms[k];\n const value = response?.responseValue;\n // console.log(`🔧 [Rule ${ruleIndex + 1}] Field \"${k}\" -> response:`, response, `-> value:`, value);\n return value;\n })\n .filter(v => {\n const isDefined = v !== undefined;\n // console.log(`🔧 [Rule ${ruleIndex + 1}] Value ${v} is defined: ${isDefined}`);\n return isDefined;\n });\n\n // console.log(`🔧 [Rule ${ruleIndex + 1}] Collected values:`, values);\n\n // Si aucune valeur n'est trouvée, la règle échoue\n if (values.length === 0) {\n // console.log(`❌ [Rule ${ruleIndex + 1}] No values found, rule fails`);\n return false;\n }\n\n let finalValue: ResponseInForm['responseValue'] = values[0] || null;\n // console.log(`🔧 [Rule ${ruleIndex + 1}] Initial final value:`, finalValue);\n\n // Application des règles de calcul si plusieurs valeurs\n if (values.length > 1 && typeComputation) {\n // console.log(`🔧 [Rule ${ruleIndex + 1}] Multiple values detected, applying computation: ${typeComputation}`);\n \n if (typeComputation === \"SOMME\") {\n const numericValues = values.map(v => {\n const num = convertToNumber(v);\n // console.log(`🔧 [Rule ${ruleIndex + 1}] Converting ${v} to number: ${num}`);\n return num;\n });\n finalValue = numericValues.reduce((acc, curr) => {\n // console.log(`🔧 [Rule ${ruleIndex + 1}] Sum: ${acc} + ${curr} = ${acc + curr}`);\n return acc + curr;\n }, 0);\n } else if (typeComputation === \"MULTIPLICATION\") {\n const numericValues = values.map(v => {\n const num = convertToNumber(v);\n // console.log(`🔧 [Rule ${ruleIndex + 1}] Converting ${v} to number: ${num}`);\n return num;\n });\n finalValue = numericValues.reduce((acc, curr) => {\n // console.log(`🔧 [Rule ${ruleIndex + 1}] Multiply: ${acc} * ${curr} = ${acc * curr}`);\n return acc * curr;\n }, 1);\n }\n \n // console.log(`🔧 [Rule ${ruleIndex + 1}] Final computed value:`, finalValue);\n }\n\n // Évaluation selon l'opérateur\n // console.log(`🔧 [Rule ${ruleIndex + 1}] Evaluating condition:`);\n // console.log(` - finalValue:`, finalValue);\n // console.log(` - operator:`, operator);\n // console.log(` - value:`, value);\n // console.log(` - numeric_compare_to:`, numeric_compare_to);\n \n const result = evaluateCondition(finalValue, operator as ConditionalOperator, value, numeric_compare_to);\n // console.log(`🔧 [Rule ${ruleIndex + 1}] Condition result: ${result}`);\n \n return result;\n });\n\n // console.log(`\\n🔧 [evaluateConditionalDisplayGroup] All rule results:`, evaluations);\n \n const finalResult = group.logic === \"AND\"\n ? evaluations.every(Boolean)\n : evaluations.some(Boolean);\n \n // console.log(`🔧 [evaluateConditionalDisplayGroup] Group logic \"${group.logic}\" final result: ${finalResult}`);\n // console.log(`🧪 [evaluateConditionalDisplayGroup] Final result for group \"${group.logic}\":`, finalResult);\n\n return finalResult;\n}\n\n/**\n * Convertit une valeur en nombre pour les calculs\n */\nfunction convertToNumber(value: ResponseInForm['responseValue'] | string | number | boolean | string[] | number[] | undefined): number {\n // console.log(`🔢 [convertToNumber] Converting:`, value, `(type: ${typeof value})`);\n \n if (typeof value === \"number\") {\n // console.log(`🔢 [convertToNumber] Already a number: ${value}`);\n return value;\n }\n \n if (typeof value === \"string\") {\n const parsed = parseFloat(value);\n const result = isNaN(parsed) ? 0 : parsed;\n // console.log(`🔢 [convertToNumber] String \"${value}\" -> parsed: ${parsed} -> result: ${result}`);\n return result;\n }\n \n if (typeof value === \"boolean\") {\n const result = value ? 1 : 0;\n // console.log(`🔢 [convertToNumber] Boolean ${value} -> ${result}`);\n return result;\n }\n \n if (Array.isArray(value)) {\n // console.log(`🔢 [convertToNumber] Array length: ${value.length}`);\n return value.length;\n }\n \n // console.log(`🔢 [convertToNumber] Default case, returning 0`);\n return 0;\n}\n\n/**\n * Évalue une condition selon l'opérateur\n */\nfunction evaluateCondition(\n finalValue: ResponseInForm['responseValue'],\n operator?: ConditionalOperator,\n value?: string | number | boolean | string[] | number[],\n numeric_compare_to?: number\n): boolean {\n // console.log(`⚖️ [evaluateCondition] Starting condition evaluation`);\n // console.log(`⚖️ [evaluateCondition] finalValue:`, finalValue, `(type: ${typeof finalValue})`);\n // console.log(`⚖️ [evaluateCondition] operator:`, operator);\n // console.log(`⚖️ [evaluateCondition] value:`, value, `(type: ${typeof value})`);\n // console.log(`⚖️ [evaluateCondition] numeric_compare_to:`, numeric_compare_to);\n \n if (!operator) {\n // console.log(`⚖️ [evaluateCondition] No operator, returning true`);\n return true;\n }\n\n switch (operator) {\n case \"==\": {\n const finalStr = String(finalValue);\n const valueStr = String(value);\n const result = finalStr === valueStr;\n // console.log(`⚖️ [evaluateCondition] == comparison: \"${finalStr}\" === \"${valueStr}\" -> ${result}`);\n return result;\n }\n \n case \"!=\": {\n const finalStr = String(finalValue);\n const valueStr = String(value);\n const result = finalStr !== valueStr;\n // console.log(`⚖️ [evaluateCondition] != comparison: \"${finalStr}\" !== \"${valueStr}\" -> ${result}`);\n return result;\n }\n \n case \">\": {\n const numValue = convertToNumber(finalValue);\n const compareValue = numeric_compare_to ?? convertToNumber(value);\n const result = numValue > compareValue;\n // console.log(`⚖️ [evaluateCondition] > comparison: ${numValue} > ${compareValue} -> ${result}`);\n return result;\n }\n \n case \"<\": {\n const numValueLess = convertToNumber(finalValue);\n const compareValueLess = numeric_compare_to ?? convertToNumber(value);\n const result = numValueLess < compareValueLess;\n // console.log(`⚖️ [evaluateCondition] < comparison: ${numValueLess} < ${compareValueLess} -> ${result}`);\n return result;\n }\n \n case \"IN\": {\n if (!Array.isArray(value)) {\n // console.log(`⚖️ [evaluateCondition] IN: value is not an array, returning false`);\n return false;\n }\n const result = value.some(v => String(v) === String(finalValue));\n // console.log(`⚖️ [evaluateCondition] IN: final result -> ${result}`);\n return result;\n }\n \n case \"NOT IN\": {\n if (!Array.isArray(value)) {\n // console.log(`⚖️ [evaluateCondition] NOT IN: value is not an array, returning false`);\n return false;\n }\n const result = !value.some(v => String(v) === String(finalValue));\n // console.log(`⚖️ [evaluateCondition] NOT IN: final result -> ${result}`);\n return result;\n }\n \n case \"CONTAINS\": {\n if (!Array.isArray(finalValue)) {\n // console.log(`⚖️ [evaluateCondition] CONTAINS: finalValue is not an array, returning false`);\n return false;\n }\n const result = finalValue.some(v => String(v) === String(value));\n // console.log(`⚖️ [evaluateCondition] CONTAINS: final result -> ${result}`);\n return result;\n }\n \n case \"NOT CONTAINS\": {\n if (!Array.isArray(finalValue)) {\n // console.log(`⚖️ [evaluateCondition] NOT CONTAINS: finalValue is not an array, returning false`);\n return false;\n }\n const result = !finalValue.some(v => String(v) === String(value));\n // console.log(`⚖️ [evaluateCondition] NOT CONTAINS: final result -> ${result}`);\n return result;\n }\n \n default:\n // console.log(`⚖️ [evaluateCondition] Unknown operator \"${operator}\", returning false`);\n return false;\n }\n}\n\nexport function debugConditionalDisplay(\n allResponseInForms: Record<string, ResponseInForm>,\n display?: ConditionalDisplayGroup\n): { result: boolean; details: any } {\n if (!display) {\n return { result: true, details: \"No conditional display rules\" };\n }\n\n const group = display;\n const rules = normalizeToArray(group.rules);\n\n const ruleResults = rules.map((rule) => {\n const { fieldName, formFieldId, value, operator, numeric_compare_to, typeComputation } = rule;\n\n // Utilisation de la fonction utilitaire normalisée\n const fieldKeys: string[] = normalizeToArray(fieldName).length > 0 \n ? normalizeToArray(fieldName) \n : normalizeToArray(formFieldId);\n\n const values: ResponseInForm['responseValue'][] = fieldKeys\n .map(k => allResponseInForms[k]?.responseValue)\n .filter(v => v !== undefined);\n\n let finalValue: ResponseInForm['responseValue'] = values[0] || null;\n\n if (values.length > 1 && typeComputation) {\n if (typeComputation === \"SOMME\") {\n finalValue = values\n .map(v => convertToNumber(v))\n .reduce((acc, curr) => acc + curr, 0);\n } else if (typeComputation === \"MULTIPLICATION\") {\n finalValue = values\n .map(v => convertToNumber(v))\n .reduce((acc, curr) => acc * curr, 1);\n }\n }\n\n const result = evaluateCondition(finalValue, operator as ConditionalOperator, value, numeric_compare_to);\n\n return {\n fieldKeys,\n values,\n finalValue,\n operator,\n compareValue: value,\n numeric_compare_to,\n typeComputation,\n result\n };\n });\n\n const groupResult = group.logic === \"AND\"\n ? ruleResults.every(r => r.result)\n : ruleResults.some(r => r.result);\n\n return {\n result: groupResult,\n details: {\n logic: group.logic,\n rules: ruleResults,\n finalResult: groupResult\n }\n };\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","\n// 📁 src/types/formUtils.ts\nimport type { FormStructure, FormField, Section , ResponseInForm} from \"./formTypeStructure\";\n\n// import { FormField, Section, ResponseInForm } from \"../types/formTypeStructure\";\nimport { shouldDisplayFormField } from \"./displayRules\";\n/**\n * Extrait tous les champs du formulaire en aplatissant les sections.\n */\nexport function extractAllFields(form: FormStructure): FormField[] {\n return form.sections.flatMap((section: Section) => section.formFields ?? []);\n}\n\n/**\n * Type des valeurs autorisées dans un formulaire.\n */\nexport type AllowedFormValue = string | string[] | number | number[] | boolean | File | File[];\n\n // case \"email\":\n // case \"phone\":\n\n\nexport function getDefaultValueForField(field: FormField): any {\n switch (field.fieldType) {\n case \"text\":\n case \"textarea\":\n case \"radio\":\n case \"dropdown\":\n case \"number\":\n return \"\";\n case \"checkbox\":\n return [];\n case \"date\":\n return null;\n default:\n return \"\";\n }\n}\n\nexport function prepareFormDataBeforeSubmit(\n data: Record<string, any>,\n sections: Section[]\n): Record<string, any> {\n const filled = { ...data };\n\n const allResponseInForms: Record<string, ResponseInForm> = {};\n Object.entries(data).forEach(([key, value]) => {\n allResponseInForms[key] = { responseValue: value };\n });\n\n for (const section of sections) {\n for (const field of section.formFields) {\n const visible = shouldDisplayFormField(field, allResponseInForms);\n if (!visible && filled[field.fieldName] === undefined) {\n filled[field.fieldName] = getDefaultValueForField(field);\n }\n }\n }\n\n return filled;\n}\n\n/**\n * Vérifie si une section contient un champ OTP\n */\nexport function hasOTPField(section: Section): boolean {\n return section.formFields?.some(\n (field) => field.fieldType === \"OTP\"\n ) ?? false;\n}\n\n/**\n * Récupère le champ OTP d'une section s'il existe\n */\nexport function getOTPField(section: Section): FormField | undefined {\n return section.formFields?.find((field) => field.fieldType === \"OTP\");\n}\n\n/**\n * Aplatit les champs OTP dans le JSON final\n * Si un champ OTP a une valeur qui est un objet, ses propriétés sont aplaties au niveau racine\n */\nexport function flattenOTPFields(\n data: Record<string, any>,\n sections: Section[]\n): Record<string, any> {\n const flattened = { ...data };\n\n for (const section of sections) {\n for (const field of section.formFields || []) {\n if (field.fieldType === \"OTP\") {\n const fieldName = field.fieldName;\n const fieldValue = flattened[fieldName];\n\n // Si flattenOnSubmit est explicitement false, ne pas aplatir\n if (field.flattenOnSubmit === false) {\n continue;\n }\n\n // Si la valeur existe et est un objet (pas null, pas array, pas primitive)\n if (\n fieldValue !== undefined &&\n fieldValue !== null &&\n typeof fieldValue === \"object\" &&\n !Array.isArray(fieldValue)\n ) {\n // Aplatir les propriétés de l'objet au niveau racine\n Object.entries(fieldValue).forEach(([key, value]) => {\n flattened[key] = value;\n });\n\n // Supprimer la clé originale du champ OTP\n delete flattened[fieldName];\n }\n // Si la valeur est une string (OTP simple), la laisser telle quelle\n // (pas besoin d'aplatir une string)\n }\n }\n }\n\n return flattened;\n}\n\n/**\n * Trouve l'index de la section contenant un champ donné\n */\nexport function findSectionIndexForField(\n fieldName: string,\n allSections: Section[]\n): number {\n for (let i = 0; i < allSections.length; i++) {\n const section = allSections[i];\n const field = section.formFields?.find(\n (f) => f.fieldName === fieldName\n );\n if (field) {\n return i;\n }\n }\n return -1;\n}\n\n/**\n * Trouve le champ Email lié à un champ OTP\n * Recherche dans TOUTES les sections qui précèdent la section OTP\n */\nexport function findLinkedEmailField(\n otpField: FormField,\n allSections: Section[],\n otpSectionIndex: number\n): FormField | undefined {\n if (!otpField.otpFormFieldExecOptions?.linkedEmailFieldName) {\n return undefined;\n }\n\n const emailFieldName = otpField.otpFormFieldExecOptions.linkedEmailFieldName;\n \n // Rechercher uniquement dans les sections qui précèdent la section OTP\n for (let i = 0; i < otpSectionIndex; i++) {\n const section = allSections[i];\n const emailField = section.formFields?.find(\n (field) => field.fieldName === emailFieldName\n );\n \n if (emailField) {\n // Vérifier que c'est bien un champ avec validation email\n const hasEmailValidation = emailField.validations?.some(\n (v) => v.validationType === \"email\"\n );\n \n if (hasEmailValidation) {\n return emailField;\n }\n }\n }\n \n return undefined;\n}\n\n/**\n * Trouve le champ OTP lié à un champ Email\n * Recherche dans les sections qui SUIVENT la section Email\n */\nexport function findLinkedOTPField(\n emailField: FormField,\n allSections: Section[],\n emailSectionIndex: number\n): FormField | undefined {\n if (!emailField.emailFormFieldExecOptions?.linkedOTPFieldName) {\n return undefined;\n }\n\n const otpFieldName = emailField.emailFormFieldExecOptions.linkedOTPFieldName;\n \n // Rechercher uniquement dans les sections qui suivent la section Email\n for (let i = emailSectionIndex + 1; i < allSections.length; i++) {\n const section = allSections[i];\n const otpField = section.formFields?.find(\n (field) => field.fieldName === otpFieldName && field.fieldType === \"OTP\"\n );\n \n if (otpField) {\n return otpField;\n }\n }\n \n return undefined;\n}\n","// 📁 src/hooks/useFormNavigation.ts\nimport { useState, useMemo, useRef } from 'react';\nimport type { FormStructure, FormField, Section } from '../types/formTypeStructure';\nimport { hasOTPField } from '../types/formUtils';\n\ninterface UseFormNavigationProps {\n form: FormStructure;\n fieldsPerPage?: number;\n paginationMode?: \"byFields\" | \"bySection\";\n sectionVisibility?: boolean[]; // Visibilité de chaque section (optionnel)\n pageVisibility?: number[][]; // Nombre de champs visibles par page pour chaque section (optionnel)\n}\n\nexport const useFormNavigation = ({ \n form, \n fieldsPerPage = 4,\n paginationMode = \"byFields\",\n sectionVisibility,\n pageVisibility\n}: UseFormNavigationProps) => {\n const [sectionIndex, setSectionIndex] = useState(0);\n const [fieldPage, setFieldPage] = useState(0);\n \n // 🔥 Nouveau : Référence pour générer des clés uniques lors du changement de section\n const sectionChangeCounter = useRef(0);\n \n // Capturer paginationMode dans une constante pour éviter les erreurs TypeScript dans les fonctions\n const currentPaginationMode = paginationMode;\n\n const currentSection: Section | undefined = form.sections[sectionIndex];\n const fields: FormField[] = currentSection?.formFields || [];\n\n // Détecter si la section courante contient un champ OTP\n const isOTPSection = useMemo(() => {\n return currentSection ? hasOTPField(currentSection) : false;\n }, [currentSection]);\n\n // ⚠️ IMPORTANT: Tous les hooks doivent être appelés AVANT les conditions pour éviter l'erreur \"Rendered fewer hooks than expected\"\n // Calculer totalVisibleSteps et currentVisibleStep pour le mode \"bySection\" basés sur sectionVisibility si disponible\n const totalVisibleStepsForSection = useMemo(() => {\n if (sectionVisibility && sectionVisibility.length > 0) {\n // Compter uniquement les sections visibles\n return sectionVisibility.filter(visible => visible).length || 1;\n }\n // Fallback : compter toutes les sections\n return form.sections.length;\n }, [sectionVisibility, form.sections.length]);\n\n const currentVisibleStepForSection = useMemo(() => {\n if (sectionVisibility && sectionVisibility.length > 0) {\n // Compter uniquement les sections visibles jusqu'à la section actuelle\n let step = 0;\n for (let i = 0; i <= sectionIndex && i < sectionVisibility.length; i++) {\n if (sectionVisibility[i]) {\n step += 1;\n }\n }\n return Math.max(1, step);\n }\n // Fallback : compter normalement\n return sectionIndex + 1;\n }, [sectionVisibility, sectionIndex]);\n\n // Mode \"byFields\" : comportement actuel (pagination par nombre de champs)\n // Exception : si la section contient un OTP, afficher tous les champs (comme bySection)\n const totalFieldPages = isOTPSection \n ? 1 \n : Math.ceil(fields.length / fieldsPerPage);\n\n const pagedFields = isOTPSection\n ? fields // Afficher tous les champs si section OTP\n : fields.slice(\n fieldPage * fieldsPerPage,\n (fieldPage + 1) * fieldsPerPage\n );\n \n // Si section OTP, forcer fieldPage à 0\n const effectiveFieldPage = isOTPSection ? 0 : fieldPage;\n\n // Calculer totalVisibleSteps et currentVisibleStep basés sur pageVisibility si disponible\n const totalVisibleSteps = useMemo(() => {\n if (pageVisibility && pageVisibility.length > 0) {\n // Compter uniquement les pages avec des champs visibles (count > 0)\n return pageVisibility.reduce((sum, pages) => {\n return sum + pages.filter(count => count > 0).length;\n }, 0) || 1;\n }\n // Fallback : calculer le total normal si pageVisibility n'est pas fourni\n return form.sections.reduce((acc, section) => {\n return acc + Math.ceil((section.formFields?.length || 0) / fieldsPerPage);\n }, 0);\n }, [pageVisibility, form.sections, fieldsPerPage]);\n\n const currentVisibleStep = useMemo(() => {\n if (pageVisibility && pageVisibility.length > 0) {\n let step = 0;\n for (let i = 0; i < pageVisibility.length; i++) {\n const pages = pageVisibility[i] || [];\n // Filtrer uniquement les pages avec des champs visibles (count > 0)\n const visiblePages = pages.filter((count) => count > 0);\n \n if (i < sectionIndex) {\n // Compter toutes les pages visibles des sections précédentes\n step += visiblePages.length;\n } else if (i === sectionIndex) {\n // Compter les pages visibles jusqu'à la page actuelle\n for (let pageIdx = 0; pageIdx <= effectiveFieldPage && pageIdx < pages.length; pageIdx++) {\n if (pages[pageIdx] > 0) {\n step += 1;\n }\n }\n return Math.max(1, step);\n }\n }\n return 1;\n }\n // Fallback : calculer le step normal si pageVisibility n'est pas fourni\n let currentStep = 0;\n for (let s = 0; s < sectionIndex; s++) {\n const section = form.sections[s];\n const sectionHasOTP = section ? hasOTPField(section) : false;\n if (sectionHasOTP) {\n currentStep += 1; // Section OTP = 1 étape\n } else {\n currentStep += Math.ceil((section?.formFields?.length || 0) / fieldsPerPage);\n }\n }\n currentStep += effectiveFieldPage + 1;\n return currentStep;\n }, [pageVisibility, sectionIndex, effectiveFieldPage, form.sections, fieldsPerPage]);\n\n const navigationState = useMemo(() => {\n const isFirstSection = sectionIndex === 0 && effectiveFieldPage === 0;\n const isLastSection =\n sectionIndex === form.sections.length - 1 &&\n effectiveFieldPage === totalFieldPages - 1;\n\n // Utiliser totalVisibleSteps et currentVisibleStep si disponibles, sinon calculer normalement\n const totalSteps = totalVisibleSteps;\n const currentStep = currentVisibleStep;\n\n return {\n isFirstSection,\n isLastSection,\n totalSteps,\n currentStep,\n // 🔥 Amélioration : fadeKey plus unique avec compteur de changement de section\n fadeKey: (sectionIndex * 10000) + (sectionChangeCounter.current * 1000) + effectiveFieldPage,\n isOTPSection, // 🆕 Flag pour indiquer si c'est une section OTP\n };\n }, [sectionIndex, effectiveFieldPage, form.sections, totalFieldPages, fieldsPerPage, isOTPSection, totalVisibleSteps, currentVisibleStep]);\n\n // Mode \"bySection\" : tous les champs de la section, pas de pagination par champs\n if (currentPaginationMode === \"bySection\") {\n const pagedFieldsBySection = fields; // Tous les champs de la section\n\n const totalSteps = totalVisibleStepsForSection;\n const currentStep = currentVisibleStepForSection;\n const isFirstSection = sectionIndex === 0;\n const isLastSection = sectionIndex === form.sections.length - 1;\n\n const goToPrevious = () => {\n if (sectionIndex > 0) {\n sectionChangeCounter.current += 1;\n setSectionIndex(sectionIndex - 1);\n }\n };\n\n const goToNext = () => {\n if (sectionIndex < form.sections.length - 1) {\n sectionChangeCounter.current += 1;\n setSectionIndex(sectionIndex + 1);\n }\n };\n\n const goToFirst = () => {\n sectionChangeCounter.current += 1;\n setSectionIndex(0);\n };\n\n const goToLast = () => {\n sectionChangeCounter.current += 1;\n const lastSectionIndex = form.sections.length - 1;\n setSectionIndex(lastSectionIndex);\n };\n\n const goToStep = (targetSectionIndex: number, _targetFieldPage: number = 0) => {\n if (targetSectionIndex >= 0 && targetSectionIndex < form.sections.length) {\n if (targetSectionIndex !== sectionIndex) {\n sectionChangeCounter.current += 1;\n }\n setSectionIndex(targetSectionIndex);\n }\n };\n\n // Navigation intelligente pour mode bySection\n const goToPreviousVisible = () => {\n if (sectionVisibility && sectionVisibility.length > 0) {\n for (let sectionIdx = sectionIndex - 1; sectionIdx >= 0; sectionIdx--) {\n if (sectionVisibility[sectionIdx]) {\n goToStep(sectionIdx, 0);\n return;\n }\n }\n } else {\n goToPrevious();\n }\n };\n\n const goToNextVisible = () => {\n if (sectionVisibility && sectionVisibility.length > 0) {\n for (let sectionIdx = sectionIndex + 1; sectionIdx < sectionVisibility.length; sectionIdx++) {\n if (sectionVisibility[sectionIdx]) {\n goToStep(sectionIdx, 0);\n return;\n }\n }\n } else {\n goToNext();\n }\n };\n\n return {\n sectionIndex,\n fieldPage: 0, // Toujours 0 en mode bySection\n currentSection,\n pagedFields: pagedFieldsBySection,\n isFirstSection,\n isLastSection,\n totalSteps,\n currentStep,\n totalVisibleSteps: totalVisibleStepsForSection,\n currentVisibleStep: currentVisibleStepForSection,\n fadeKey: (sectionIndex * 10000) + (sectionChangeCounter.current * 1000),\n goToPrevious,\n goToNext,\n goToPreviousVisible,\n goToNextVisible,\n goToFirst,\n goToLast,\n goToStep,\n sectionVisibility,\n pageVisibility,\n debugInfo: {\n sectionCount: form.sections.length,\n totalFieldPages: 1, // Toujours 1 page par section\n fieldsOnCurrentPage: pagedFieldsBySection.length,\n },\n };\n }\n\n // Définir toutes les fonctions de navigation AVANT les conditions\n const goToPrevious = () => {\n // Si section OTP, passer directement à la section précédente\n if (isOTPSection) {\n if (sectionIndex > 0) {\n sectionChangeCounter.current += 1;\n setSectionIndex(sectionIndex - 1);\n const prevSection = form.sections[sectionIndex - 1];\n if (prevSection) {\n const prevHasOTP = hasOTPField(prevSection);\n setFieldPage(prevHasOTP ? 0 : Math.ceil((prevSection.formFields?.length || 0) / fieldsPerPage) - 1);\n }\n }\n } else if (fieldPage > 0) {\n setFieldPage(fieldPage - 1);\n } else if (sectionIndex > 0) {\n const prevSection = form.sections[sectionIndex - 1];\n if (prevSection) {\n setSectionIndex(sectionIndex - 1);\n const prevFields = prevSection.formFields || [];\n const prevHasOTP = hasOTPField(prevSection);\n setFieldPage(prevHasOTP ? 0 : Math.ceil(prevFields.length / fieldsPerPage) - 1);\n }\n }\n };\n\n const goToNext = () => {\n // Si section OTP, passer directement à la section suivante\n if (isOTPSection) {\n if (sectionIndex < form.sections.length - 1) {\n sectionChangeCounter.current += 1;\n setSectionIndex(sectionIndex + 1);\n setFieldPage(0);\n }\n } else if (fieldPage < totalFieldPages - 1) {\n setFieldPage(fieldPage + 1);\n } else if (sectionIndex < form.sections.length - 1) {\n // 🔥 Incrémenter le compteur lors du changement de section\n sectionChangeCounter.current += 1;\n setSectionIndex(sectionIndex + 1);\n setFieldPage(0);\n }\n };\n\n // 🔥 Nouvelle fonction pour retourner à la première section/page\n const goToFirst = () => {\n // 🔥 Incrémenter le compteur lors du changement de section\n sectionChangeCounter.current += 1;\n setSectionIndex(0);\n setFieldPage(0);\n };\n\n // 🔥 Fonction bonus pour aller à la dernière section/page\n const goToLast = () => {\n // 🔥 Incrémenter le compteur lors du changement de section\n sectionChangeCounter.current += 1;\n const lastSectionIndex = form.sections.length - 1;\n setSectionIndex(lastSectionIndex);\n \n const lastSection = form.sections[lastSectionIndex];\n if (lastSection) {\n const lastSectionFields = lastSection.formFields || [];\n const lastFieldPage = Math.ceil(lastSectionFields.length / fieldsPerPage) - 1;\n setFieldPage(Math.max(0, lastFieldPage));\n }\n };\n\n // 🔥 Fonction pour aller à une section/page spécifique\n const goToStep = (targetSectionIndex: number, targetFieldPage: number = 0) => {\n if (targetSectionIndex >= 0 && targetSectionIndex < form.sections.length) {\n // 🔥 Incrémenter le compteur seulement si on change de section\n if (targetSectionIndex !== sectionIndex) {\n sectionChangeCounter.current += 1;\n }\n \n setSectionIndex(targetSectionIndex);\n \n const targetSection = form.sections[targetSectionIndex];\n if (targetSection) {\n const targetHasOTP = hasOTPField(targetSection);\n if (targetHasOTP) {\n setFieldPage(0); // Section OTP = toujours page 0\n } else {\n const targetFields = targetSection.formFields || [];\n const maxFieldPage = Math.ceil(targetFields.length / fieldsPerPage) - 1;\n setFieldPage(Math.max(0, Math.min(targetFieldPage, maxFieldPage)));\n }\n }\n }\n };\n\n // Navigation intelligente : sauter les sections/pages cachées\n const goToPreviousVisible = () => {\n const mode = paginationMode; // Utiliser la prop directement pour éviter le narrowing TypeScript\n if (mode === \"bySection\") {\n // Mode bySection : chercher la section visible précédente\n if (sectionVisibility && sectionVisibility.length > 0) {\n for (let sectionIdx = sectionIndex - 1; sectionIdx >= 0; sectionIdx--) {\n if (sectionVisibility[sectionIdx]) {\n goToStep(sectionIdx, 0);\n return;\n }\n }\n } else {\n // Fallback : comportement normal\n goToPrevious();\n }\n } else {\n // Mode byFields : chercher la page visible précédente\n if (pageVisibility && pageVisibility.length > 0) {\n const currentPages = pageVisibility[sectionIndex] || [];\n \n // Chercher dans les pages de la section actuelle\n for (let pageIdx = effectiveFieldPage - 1; pageIdx >= 0; pageIdx--) {\n if (currentPages[pageIdx] > 0) {\n goToStep(sectionIndex, pageIdx);\n return;\n }\n }\n \n // Chercher dans les sections précédentes\n for (let sectionIdx = sectionIndex - 1; sectionIdx >= 0; sectionIdx--) {\n const pages = pageVisibility[sectionIdx] || [];\n for (let pageIdx = pages.length - 1; pageIdx >= 0; pageIdx--) {\n if (pages[pageIdx] > 0) {\n goToStep(sectionIdx, pageIdx);\n return;\n }\n }\n }\n } else {\n // Fallback : comportement normal\n goToPrevious();\n }\n }\n };\n\n const goToNextVisible = () => {\n const mode = paginationMode; // Utiliser la prop directement pour éviter le narrowing TypeScript\n if (mode === \"bySection\") {\n // Mode bySection : chercher la section visible suivante\n if (sectionVisibility && sectionVisibility.length > 0) {\n for (let sectionIdx = sectionIndex + 1; sectionIdx < sectionVisibility.length; sectionIdx++) {\n if (sectionVisibility[sectionIdx]) {\n goToStep(sectionIdx, 0);\n return;\n }\n }\n } else {\n // Fallback : comportement normal\n goToNext();\n }\n } else {\n // Mode byFields : chercher la page visible suivante\n if (pageVisibility && pageVisibility.length > 0) {\n const currentPages = pageVisibility[sectionIndex] || [];\n \n // Chercher dans les pages de la section actuelle\n for (let pageIdx = effectiveFieldPage + 1; pageIdx < currentPages.length; pageIdx++) {\n if (currentPages[pageIdx] > 0) {\n goToStep(sectionIndex, pageIdx);\n return;\n }\n }\n \n // Chercher dans les sections suivantes\n for (let sectionIdx = sectionIndex + 1; sectionIdx < pageVisibility.length; sectionIdx++) {\n const pages = pageVisibility[sectionIdx] || [];\n for (let pageIdx = 0; pageIdx < pages.length; pageIdx++) {\n if (pages[pageIdx] > 0) {\n goToStep(sectionIdx, pageIdx);\n return;\n }\n }\n }\n } else {\n // Fallback : comportement normal\n goToNext();\n }\n }\n };\n\n return {\n sectionIndex,\n fieldPage: effectiveFieldPage, // Utiliser effectiveFieldPage pour les sections OTP\n currentSection,\n pagedFields,\n\n // Calculs\n ...navigationState,\n totalVisibleSteps,\n currentVisibleStep,\n\n // Actions de navigation\n goToPrevious,\n goToNext,\n goToPreviousVisible,\n goToNextVisible,\n goToFirst, // 🔥 Nouvelle fonction\n goToLast, // 🔥 Fonction bonus\n goToStep, // 🔥 Fonction bonus pour navigation directe\n\n // Visibilité (exposée pour utilisation dans FormEngineContent)\n sectionVisibility,\n pageVisibility,\n\n // Debug info\n debugInfo: {\n sectionCount: form.sections.length,\n totalFieldPages,\n fieldsOnCurrentPage: pagedFields.length,\n },\n };\n};\n","import React from \"react\";\n\nexport const DEFAULT_PRIMARY = \"#008080\";\n\nfunction hexToRgb(hex: string): [number, number, number] | null {\n const m = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return m\n ? [parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16)]\n : null;\n}\n\n/** Dérive les 3 CSS variables nécessaires depuis un code hex. */\nexport function deriveThemeVars(primaryColor: string): React.CSSProperties {\n const rgb = hexToRgb(primaryColor);\n if (!rgb) {\n return {\n \"--fe-primary\": DEFAULT_PRIMARY,\n \"--fe-primary-light\": \"#e6f7f7\",\n \"--fe-primary-dark\": \"#006666\",\n } as React.CSSProperties;\n }\n const [r, g, b] = rgb;\n // Light : mélange 90% blanc — pour les fonds hover/focus\n const light = `rgb(${Math.round(r + (255 - r) * 0.9)},${Math.round(g + (255 - g) * 0.9)},${Math.round(b + (255 - b) * 0.9)})`;\n // Dark : 75% de la valeur — pour les textes accentués\n const dark = `rgb(${Math.round(r * 0.75)},${Math.round(g * 0.75)},${Math.round(b * 0.75)})`;\n return {\n \"--fe-primary\": primaryColor,\n \"--fe-primary-light\": light,\n \"--fe-primary-dark\": dark,\n } as React.CSSProperties;\n}\n\ninterface FormThemeContextValue {\n primaryColor: string;\n}\n\nconst FormThemeContext = React.createContext<FormThemeContextValue>({\n primaryColor: DEFAULT_PRIMARY,\n});\n\nexport const useFormTheme = () => React.useContext(FormThemeContext);\n\ninterface FormThemeProviderProps {\n primaryColor?: string;\n children: React.ReactNode;\n}\n\nexport const FormThemeProvider: React.FC<FormThemeProviderProps> = ({\n primaryColor = DEFAULT_PRIMARY,\n children,\n}) => (\n <FormThemeContext.Provider value={{ primaryColor }}>\n {children}\n </FormThemeContext.Provider>\n);\n","import type { Section } from \"./formTypeStructure\";\n\n\n/**\n * Normalise les données reçues depuis react-hook-form, en restructurant\n * les champs des groupes répétables dans un format par tableau d’objets.\n *\n * @param flatData Données plates de RHF (ex: champ_0, champ_1, etc.)\n * @param sections Sections du formulaire (chacune contient des champs)\n * @returns Données restructurées prêtes à être persistées ou envoyées\n */\nexport function normalizeFormData(\n flatData: Record<string, any>,\n sections: Section[]\n): Record<string, any> {\n const result: Record<string, any> = {};\n const usedKeys = new Set<string>();\n\n const markUsedKeysForGroup = (groupFieldName: string) => {\n usedKeys.add(groupFieldName);\n for (const key of Object.keys(flatData)) {\n if (key === groupFieldName || key.startsWith(`${groupFieldName}_`)) {\n usedKeys.add(key);\n }\n }\n };\n\n for (const section of sections) {\n for (const field of section.formFields) {\n const group = field.repeatGroup;\n\n if (group) {\n const storedGroupValue = flatData[group.fieldName];\n\n if (Array.isArray(storedGroupValue)) {\n result[group.fieldName] = storedGroupValue.map((instance) => {\n if (!instance || typeof instance !== \"object\") {\n return instance;\n }\n\n const normalizedInstance: Record<string, any> = {};\n\n for (const childField of group.formFields) {\n const value = instance[childField.fieldName];\n\n if (childField.repeatGroup) {\n const nestedGroupFieldName = childField.repeatGroup.fieldName;\n const nestedValue = instance[nestedGroupFieldName];\n\n if (Array.isArray(nestedValue)) {\n normalizedInstance[nestedGroupFieldName] = nestedValue.map((nestedEntry) => {\n if (!nestedEntry || typeof nestedEntry !== \"object\") {\n return nestedEntry;\n }\n\n const normalizedNestedEntry: Record<string, any> = {};\n\n childField.repeatGroup!.formFields.forEach((nestedField) => {\n if (nestedEntry[nestedField.fieldName] !== undefined) {\n normalizedNestedEntry[nestedField.fieldName] = nestedEntry[nestedField.fieldName];\n }\n });\n\n return normalizedNestedEntry;\n });\n\n markUsedKeysForGroup(nestedGroupFieldName);\n }\n\n if (value !== undefined) {\n normalizedInstance[childField.fieldName] = value;\n }\n } else if (value !== undefined) {\n normalizedInstance[childField.fieldName] = value;\n }\n }\n\n return normalizedInstance;\n });\n } else {\n result[group.fieldName] = [];\n }\n\n markUsedKeysForGroup(group.fieldName);\n continue;\n }\n\n if (!usedKeys.has(field.fieldName) && flatData[field.fieldName] !== undefined) {\n result[field.fieldName] = flatData[field.fieldName];\n usedKeys.add(field.fieldName);\n }\n }\n }\n\n // Ajouter les champs restants (hors repeatGroups et clés temporaires)\n for (const [key, value] of Object.entries(flatData)) {\n if (!usedKeys.has(key)) {\n result[key] = value;\n }\n }\n\n return result;\n}","// 📁 src/store/useFormStore.ts\nimport { useCallback } from 'react';\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\nimport type { Section } from '../types/formTypeStructure';\nimport { normalizeFormData } from '../types/repeatRules';\n\ninterface FormState {\n forms: Record<string, Record<string, any>>; // { [formId]: { fieldId: value } }\n setFormValue: (formId: string, fieldName: string, value: any) => void;\n setAllFormValues: (formId: string, values: Record<string, any>) => void;\n getFormValues: (formId: string) => Record<string, any>;\n clearForm: (formId: string) => void;\n clearAll: () => void;\n}\n\nexport const useFormStore = create<FormState>()(\n persist(\n (set, get) => ({\n forms: {},\n setFormValue: (formId, fieldName, value) =>\n set((state) => ({\n forms: {\n ...state.forms,\n [formId]: {\n ...state.forms[formId],\n [fieldName]: value,\n },\n },\n })),\n\n setAllFormValues: (formId, values) =>\n set((state) => ({\n forms: {\n ...state.forms,\n [formId]: values,\n },\n })),\n\n getFormValues: (formId) => get().forms[formId] || {},\n\n clearForm: (formId) =>\n set((state) => {\n const newForms = { ...state.forms };\n delete newForms[formId];\n return { forms: newForms };\n }),\n\n clearAll: () => set({ forms: {} }),\n }),\n {\n name: 'multi-form-drafts',\n }\n )\n);\n\n// ✅ Mise à jour : on utilise les `sections` au lieu des `subSections`\nexport const useFormPersistence = (\n formId: string,\n sections: Section[]\n) => {\n const formStore = useFormStore();\n\n const savedValues = formStore.getFormValues(formId);\n\n const syncFormData = useCallback(\n (watchedValues: Record<string, any>) => {\n const normalizedValues = normalizeFormData(watchedValues, sections);\n formStore.setAllFormValues(formId, normalizedValues);\n },\n [formId, sections]\n );\n\n return {\n savedValues,\n syncFormData,\n };\n};\n","// components/atoms/formfield/types/validation.ts\n\nimport { z } from \"zod\";\nimport { type FormField } from \"./formTypeStructure\";\n\nexport const createZodSchema = (formFields: FormField[]) => {\n const schema: Record<string, any> = {};\n\n formFields.forEach((field) => {\n let zodSchema: any;\n\n // Définir le schéma de base selon le type\n switch (field.fieldType) {\n case \"text\":\n case \"dropdown\":\n case \"radio\":\n zodSchema = z.string();\n break;\n case \"textarea\":\n zodSchema = z.string();\n break;\n case \"date\":\n zodSchema = z.string().refine((val) => !isNaN(Date.parse(val)), {\n message: \"Date invalide\",\n });\n break;\n case \"number\":\n zodSchema = z.coerce.number(); // Conversion automatique string -> number\n break;\n case \"bool\":\n zodSchema = z.boolean();\n break;\n case \"checkbox\":\n zodSchema = z.array(z.string()).optional();\n break;\n case \"file\":\n // Type de base: File, File[], null ou undefined\n zodSchema = z.union([\n z.instanceof(File),\n z.array(z.instanceof(File)),\n z.null(),\n z.undefined()\n ]);\n break;\n default:\n zodSchema = z.string();\n }\n\n // Appliquer les validations\n field.validations?.forEach((rule) => {\n \n let errMsg: string;\n\n if (rule.errMsg) {\n errMsg = rule.errMsg;\n } else if (rule.validationType) {\n errMsg = getDefaultErrorMessage(rule.validationType, rule.value);\n } else {\n errMsg = \"Unknown validation error\";\n }\n\n \n\n\n // const errMsg = rule.errMsg || getDefaultErrorMessage(rule.validationType, rule.value);\n \n switch (rule.validationType) {\n case \"required\":\n if (field.fieldType === \"text\" || field.fieldType === \"textarea\" || field.fieldType === \"dropdown\" || field.fieldType === \"radio\") {\n zodSchema = zodSchema.min(1, errMsg);\n } else if (field.fieldType === \"checkbox\") {\n zodSchema = z.array(z.string()).min(1, errMsg);\n } else if (field.fieldType === \"bool\") {\n zodSchema = zodSchema.refine((val: boolean) => val === true, { message: errMsg });\n } else if (field.fieldType === \"number\") {\n zodSchema = zodSchema.refine((val: number) => val !== null && val !== undefined, { message: errMsg });\n } else if (field.fieldType === \"file\") {\n zodSchema = zodSchema.refine(\n (val: any) => {\n // Vérifier si val est un File, un File[], ou un FileList avec au moins un fichier\n if (val instanceof File) return true;\n if (Array.isArray(val)) return val.length > 0 && val.every(f => f instanceof File);\n if (val && typeof val.length === 'number') return val.length > 0;\n return false;\n },\n { message: errMsg }\n );\n }\n break;\n case \"minLength\":\n if (zodSchema instanceof z.ZodString) {\n zodSchema = zodSchema.min(rule.value as number, errMsg);\n }\n break;\n case \"maxLength\":\n if (zodSchema instanceof z.ZodString) {\n zodSchema = zodSchema.max(rule.value as number, errMsg);\n }\n break;\n case \"regex\":\n if (zodSchema instanceof z.ZodString) {\n zodSchema = zodSchema.regex(new RegExp(rule.value as string), errMsg);\n }\n break;\n case \"email\":\n if (zodSchema instanceof z.ZodString) {\n zodSchema = zodSchema.email(errMsg);\n }\n break;\n case \"number\":\n zodSchema = z.coerce.number().refine((val) => !isNaN(val), {\n message: errMsg,\n });\n break;\n case \"phone_number\": \n if (zodSchema instanceof z.ZodString) {\n zodSchema = zodSchema.regex(\n /^\\+?[1-9]\\d{1,14}$/,\n errMsg\n );\n }\n break;\n case \"fileSize\":\n case \"fileType\":\n if (zodSchema instanceof z.ZodType) {\n if (rule.validationType === \"fileSize\") {\n const maxSize = Number(rule.value);\n const validateSize = (input: unknown): boolean => {\n if (input == null || input === \"\") {\n return true;\n }\n if (Array.isArray(input)) {\n return input.every((entry) => validateSize(entry));\n }\n if (input instanceof File) {\n return input.size <= maxSize;\n }\n // Valeurs déjà transformées (URL, string, etc.) -> validation déjà effectuée à l'upload\n return true;\n };\n zodSchema = zodSchema.refine(validateSize, errMsg);\n } else {\n const allowedTypes = Array.isArray(rule.value)\n ? (rule.value as string[])\n : [];\n\n const allowedExtensions = allowedTypes\n .map((type) => {\n if (!type) return null;\n const cleaned = type.toLowerCase();\n if (cleaned.includes(\"/\")) {\n return cleaned.split(\"/\").pop() ?? null;\n }\n return cleaned.startsWith(\".\")\n ? cleaned.slice(1)\n : cleaned;\n })\n .filter((ext): ext is string => Boolean(ext));\n\n const matchesAllowedType = (mime: string | undefined): boolean => {\n if (allowedTypes.length === 0) {\n return true;\n }\n if (!mime) {\n return false;\n }\n return allowedTypes.includes(mime);\n };\n\n const matchesAllowedExtension = (value: string | undefined): boolean => {\n if (allowedTypes.length === 0) {\n return true;\n }\n if (!value) return false;\n const lowerValue = value.toLowerCase();\n // Essayer de décoder l'URL pour obtenir le chemin\n let target = lowerValue;\n let filenameFromQuery: string | null = null;\n try {\n const url = new URL(lowerValue);\n target = url.pathname.toLowerCase();\n filenameFromQuery =\n url.searchParams.get(\"filename\") ??\n url.searchParams.get(\"file\") ??\n url.searchParams.get(\"file_name\") ??\n null;\n } catch {\n target = lowerValue;\n }\n const queryTarget = filenameFromQuery\n ? filenameFromQuery.toLowerCase()\n : null;\n\n return allowedExtensions.some((ext) => {\n if (target.endsWith(`.${ext}`)) {\n return true;\n }\n if (queryTarget && queryTarget.endsWith(`.${ext}`)) {\n return true;\n }\n return false;\n });\n };\n\n const validateType = (input: unknown): boolean => {\n if (input == null || input === \"\") {\n return true;\n }\n if (Array.isArray(input)) {\n return input.every((entry) => validateType(entry));\n }\n if (input instanceof File) {\n return matchesAllowedType(input.type);\n }\n if (typeof input === \"string\") {\n // Valeur déjà transformée (URL) : on valide via extension\n return matchesAllowedExtension(input) || allowedTypes.length === 0;\n }\n return true;\n };\n\n zodSchema = zodSchema.refine(validateType, errMsg);\n }\n }\n break;\n }\n });\n\n // Si pas de validation required, rendre le champ optionnel\n const hasRequired = field.validations?.some(v => v.validationType === \"required\");\n if (!hasRequired) {\n zodSchema = zodSchema.optional();\n }\n\n schema[field.fieldName] = zodSchema;\n });\n\n return z.object(schema);\n};\n\n// Fonction helper pour les messages d'erreur par défaut\nfunction getDefaultErrorMessage(validationType: string, value?: any): string {\n switch (validationType) {\n case \"required\": return \"Ce champ est obligatoire\";\n case \"minLength\": return `Minimum ${value} caractères`;\n case \"maxLength\": return `Maximum ${value} caractères`;\n case \"regex\": return \"Format invalide\";\n case \"email\": return \"Email invalide\";\n case \"number\": return \"Nombre invalide\";\n case \"fileSize\": return \"Fichier trop volumineux\";\n case \"fileType\": return \"Type de fichier non autorisé\";\n case \"phone_number\": return \"Numéro de téléphone invalide\";\n default: return \"Valeur invalide\";\n }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// import { z } from \"zod\";\n// import { type FormField } from \"./formTypeStructure\";\n\n// export const createZodSchema = (formFields: FormField[]) => {\n// const schema: Record<string, any> = {};\n\n// formFields.forEach((field) => {\n// let zodSchema: any;\n\n// switch (field.fieldType) {\n// case \"text\":\n// case \"dropdown\":\n// case \"radio\":\n// zodSchema = z.string();\n// break;\n// case \"date\":\n// zodSchema = z.string().refine((val) => !isNaN(Date.parse(val)), {\n// message: \"Date invalide\",\n// });\n// break;\n// case \"bool\":\n// zodSchema = z.boolean();\n// break;\n// case \"file\":\n// zodSchema = z\n// .instanceof(File)\n// .or(z.array(z.instanceof(File)))\n// .refine((files) => (Array.isArray(files) ? files.length > 0 : !!files), {\n// message: \"Un fichier est requis\",\n// });\n// break;\n// default:\n// zodSchema = z.any();\n// }\n\n// field.validations?.forEach((rule) => {\n// // Message d'erreur par défaut si non fourni\n// const errMsg = rule.errMsg || (() => {\n// switch (rule.validationType) {\n// case \"required\": return \"Ce champ est obligatoire\";\n// case \"minLength\": return `Minimum ${rule.value} caractères`;\n// case \"maxLength\": return `Maximum ${rule.value} caractères`;\n// case \"regex\": return \"Format invalide\";\n// case \"email\": return \"Email invalide\";\n// case \"number\": return \"Nombre invalide\";\n// case \"fileSize\": return \"Fichier trop volumineux\";\n// case \"fileType\": return \"Type de fichier non autorisé\";\n// case \"phone_number\": return \"Numéro de téléphone invalide\";\n// default: return \"Valeur invalide\";\n// }\n// })();\n// switch (rule.validationType) {\n// case \"required\":\n// if (zodSchema instanceof z.ZodString || zodSchema instanceof z.ZodArray) {\n// zodSchema = zodSchema.nonempty(errMsg);\n// } else if (zodSchema instanceof z.ZodBoolean) {\n// zodSchema = zodSchema.refine(val => val !== null, {\n// message: errMsg,\n// });\n// }\n// break;\n// case \"minLength\":\n// if (zodSchema instanceof z.ZodString) {\n// zodSchema = zodSchema.min(rule.value as number, errMsg);\n// }\n// break;\n// case \"maxLength\":\n// if (zodSchema instanceof z.ZodString) {\n// zodSchema = zodSchema.max(rule.value as number, errMsg);\n// }\n// break;\n// case \"regex\":\n// if (zodSchema instanceof z.ZodString) {\n// zodSchema = zodSchema.regex(new RegExp(rule.value as string), errMsg);\n// }\n// break;\n// case \"email\":\n// if (zodSchema instanceof z.ZodString) {\n// zodSchema = zodSchema.email(errMsg);\n// }\n// break;\n// case \"number\":\n// if (zodSchema instanceof z.ZodAny) {\n// zodSchema = z.number().refine((val) => !isNaN(val), {\n// message: errMsg,\n// });\n// }\n// break;\n// case \"fileSize\":\n// if (zodSchema instanceof z.ZodType) {\n// zodSchema = zodSchema.refine(\n// (file: File | File[]) =>\n// Array.isArray(file)\n// ? file.every((f) => f.size <= (rule.value as number))\n// : file.size <= (rule.value as number),\n// errMsg\n// );\n// }\n// break;\n// case \"fileType\":\n// if (zodSchema instanceof z.ZodType) {\n// zodSchema = zodSchema.refine(\n// (file: File | File[]) =>\n// Array.isArray(file)\n// ? file.every((f) => (rule.value as string[]).includes(f.type))\n// : (rule.value as string[]).includes(file.type),\n// errMsg\n// );\n// }\n// break;\n// case \"phone_number\": \n// if (zodSchema instanceof z.ZodString) {\n// zodSchema = zodSchema.regex(\n// /^\\+?[1-9]\\d{1,14}$/,\n// errMsg\n// );\n// }\n// break;\n// case \"textarea\": \n// zodSchema = z.string();\n// break;\n// }\n// });\n\n// schema[field.formFieldId] = zodSchema;\n// });\n\n// return z.object(schema);\n// };\n\n\n","// 📁 src/store/useOTPTokenStore.ts\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\nimport type { OTPAuthToken } from '../hooks/useOTPHandler';\n\ninterface OTPTokenState {\n // Stockage par formId et fieldName pour gérer plusieurs champs OTP\n tokens: Record<string, Record<string, OTPAuthToken>>; // { [formId]: { [fieldName]: token } }\n setOTPToken: (formId: string, fieldName: string, token: OTPAuthToken) => void;\n getOTPToken: (formId: string, fieldName: string) => OTPAuthToken | undefined;\n clearOTPToken: (formId: string, fieldName: string) => void;\n clearAllOTPTokens: (formId?: string) => void;\n}\n\nexport const useOTPTokenStore = create<OTPTokenState>()(\n persist(\n (set, get) => ({\n tokens: {},\n \n setOTPToken: (formId, fieldName, token) =>\n set((state) => ({\n tokens: {\n ...state.tokens,\n [formId]: {\n ...state.tokens[formId],\n [fieldName]: token,\n },\n },\n })),\n \n getOTPToken: (formId, fieldName) => {\n const state = get();\n return state.tokens[formId]?.[fieldName];\n },\n \n clearOTPToken: (formId, fieldName) =>\n set((state) => {\n const formTokens = state.tokens[formId];\n if (!formTokens) return state;\n \n const { [fieldName]: _, ...rest } = formTokens;\n return {\n tokens: {\n ...state.tokens,\n [formId]: rest,\n },\n };\n }),\n \n clearAllOTPTokens: (formId) =>\n set((state) => {\n if (formId) {\n const { [formId]: _, ...rest } = state.tokens;\n return { tokens: rest };\n }\n return { tokens: {} };\n }),\n }),\n {\n name: 'otp-auth-tokens', // Clé de persistance localStorage\n }\n )\n);\n\n// Fonction utilitaire pour vérifier si un token est expiré\nexport const isTokenExpired = (token: OTPAuthToken): boolean => {\n if (!token.expires_at) {\n return false; // Pas d'expiration définie\n }\n return Date.now() / 1000 >= token.expires_at;\n};\n\n// Fonction utilitaire pour récupérer un token valide (non expiré)\nexport const getValidOTPToken = (formId: string, fieldName: string): OTPAuthToken | null => {\n const token = useOTPTokenStore.getState().getOTPToken(formId, fieldName);\n if (!token) {\n return null;\n }\n if (isTokenExpired(token)) {\n // Token expiré, le supprimer\n useOTPTokenStore.getState().clearOTPToken(formId, fieldName);\n return null;\n }\n return token;\n};\n\n","\nimport type { UseFormReturn } from \"react-hook-form\";\nimport type { FormField } from \"../../../types/formTypeStructure\";\nimport { useCallback } from \"react\";\nimport { useFormStore } from \"../../../store/useFormStore\";\nimport { useOTPTokenStore } from \"../../../store/useOTPTokenStore\";\nimport toast from \"react-hot-toast\";\n\nconst useFormReset = (\n methods: UseFormReturn,\n allFields: FormField[],\n formId: string,\n navigation: any\n) => {\n const handleClearAll = useCallback(() => {\n try {\n // 1. Réinitialiser React Hook Form avec valeurs vides\n const defaultValues = Object.fromEntries(\n allFields.map((field) => [field.fieldName, \"\"])\n );\n methods.reset(defaultValues);\n\n // 2. Supprimer du localStorage\n localStorage.removeItem(`form_${formId}`);\n\n // 3. Réinitialiser Zustand\n useFormStore.getState().clearForm(formId);\n\n // 3.5. Nettoyer les tokens OTP associés au formulaire\n useOTPTokenStore.getState().clearAllOTPTokens(formId);\n\n // 4. Navigation forcée à la première section\n setTimeout(() => {\n navigation.goToFirst();\n }, 0);\n\n // 5. Toast succès\n toast.success(\"Toutes les données ont été supprimées ! 🗑️\", {\n duration: 3000,\n position: \"top-center\",\n style: {\n background: \"#10b981\",\n color: \"white\",\n fontWeight: \"bold\",\n },\n icon: \"✅\",\n });\n\n console.log(\"✅ Form cleared successfully:\", formId);\n } catch (error) {\n console.error(\"❌ Error clearing form:\", error);\n toast.error(\"Erreur lors de la suppression des données\", {\n duration: 3000,\n position: \"top-center\",\n style: {\n background: \"#ef4444\",\n color: \"white\",\n fontWeight: \"bold\",\n },\n icon: \"❌\",\n });\n }\n }, [methods, allFields, formId, navigation]);\n\n return { handleClearAll };\n};\n\nexport default useFormReset;\n","import toast from \"react-hot-toast\";\nimport type { FormValidationResult } from \"../types/formEngine.types\";\nimport type { FormStructure, FormField, Section } from \"../../../types/formTypeStructure\";\nimport {\n hasOTPField,\n getOTPField,\n findLinkedEmailField,\n findSectionIndexForField,\n} from \"../../../types/formUtils\";\n\nconst buildAbsoluteUrl = (serverDns: string, endpoint: string): string => {\n const base = serverDns.replace(/\\/+$/, \"\");\n if (/^https?:\\/\\//i.test(endpoint)) {\n return endpoint;\n }\n const path = endpoint.replace(/^\\/+/, \"\");\n return `${base}/${path}`;\n};\n\nconst getNextSectionIndex = (\n currentSectionIndex: number,\n currentFieldPage: number,\n form: FormStructure,\n paginationMode: \"byFields\" | \"bySection\",\n fieldsPerPage: number = 4\n): number => {\n if (paginationMode === \"bySection\") {\n if (currentSectionIndex < form.sections.length - 1) {\n return currentSectionIndex + 1;\n }\n return -1;\n }\n\n const currentSection = form.sections[currentSectionIndex];\n const totalFields = currentSection.formFields?.length || 0;\n const totalFieldPages = Math.ceil(totalFields / fieldsPerPage);\n\n if (currentFieldPage < totalFieldPages - 1) {\n return currentSectionIndex;\n }\n if (currentSectionIndex < form.sections.length - 1) {\n return currentSectionIndex + 1;\n }\n return -1;\n};\n\nconst sendOTPBeforeNavigation = async (\n otpField: FormField,\n formValues: Record<string, any>,\n allSections: Section[]\n): Promise<void> => {\n const options = otpField.otpFormFieldExecOptions;\n if (!options) {\n throw new Error(\"OTP options are not configured for this field\");\n }\n\n const sendConfig = options.sendOTPApiConfig ?? {\n serverDns: options.serverDns,\n postApiEndPoint: options.postApiEndPoint,\n payload: options.payload,\n extraHeaders: options.extraHeaders,\n bearer: options.bearer,\n };\n\n const otpSectionIndex = findSectionIndexForField(otpField.fieldName, allSections);\n const linkedEmailField = findLinkedEmailField(otpField, allSections, otpSectionIndex);\n\n if (!linkedEmailField) {\n throw new Error(`Linked field not found for OTP field: ${otpField.fieldName}`);\n }\n\n const linkedFieldValue = formValues[linkedEmailField.fieldName];\n if (!linkedFieldValue) {\n throw new Error(`Le champ lié \"${linkedEmailField.fieldName}\" est vide`);\n }\n\n const url = buildAbsoluteUrl(sendConfig.serverDns, sendConfig.postApiEndPoint);\n\n const basePayload = sendConfig.payload ?? {};\n const mergedPayload = {\n ...basePayload,\n ...formValues,\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(sendConfig.extraHeaders ?? {}),\n };\n if (sendConfig.bearer) {\n headers.Authorization = `Bearer ${sendConfig.bearer}`;\n }\n\n const controller = new AbortController();\n const timeoutMs = options.timeoutMs || 15000;\n\n const fetchPromise = fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(mergedPayload),\n signal: controller.signal,\n });\n\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetchPromise;\n clearTimeout(timeoutId);\n\n let responseData: any = null;\n try {\n responseData = await response.json();\n } catch {\n const text = await response.text();\n throw new Error(`Réponse OTP invalide: ${text}`);\n }\n\n if (!response.ok) {\n const errorMessage =\n responseData?.message ||\n `OTP request failed with status ${response.status} ${response.statusText}`;\n throw new Error(errorMessage);\n }\n\n const success = responseData?.success;\n if (success === false && response.status !== 200) {\n throw new Error(responseData?.message || \"Échec de l'envoi du code OTP\");\n }\n } catch (error: any) {\n clearTimeout(timeoutId);\n if (error.name === \"AbortError\") {\n throw new Error(\"Délai d'attente dépassé pour la requête OTP\");\n }\n throw error;\n }\n};\n\nconst useFormNavigationActions = (\n navigation: any,\n validatePage: () => Promise<FormValidationResult>,\n _isValidating: boolean,\n setIsValidating: (value: boolean) => void,\n form: FormStructure,\n formValues: Record<string, any>,\n paginationMode: \"byFields\" | \"bySection\",\n fieldsPerPage: number = 4\n) => {\n const handleNext = async () => {\n setIsValidating(true);\n try {\n const result = await validatePage();\n\n if (result.invalidFields && result.invalidFields.length > 0) {\n result.invalidFields.forEach((field) => {\n field.errors.forEach((error) => {\n toast.error(`${field.fieldLabel} : ${error}`);\n });\n });\n return;\n }\n\n if (result.emptyRequiredFields && result.emptyRequiredFields.length > 0) {\n result.emptyRequiredFields.forEach((field) => {\n toast.error(`${field.fieldLabel} : ${field.errors[0]}`);\n });\n return;\n }\n\n if (result.untouchedRequiredFields && result.untouchedRequiredFields.length > 0) {\n result.untouchedRequiredFields.forEach((field) => {\n toast.error(`${field.fieldLabel} : ${field.errors[0]}`);\n });\n return;\n }\n\n // 🆕 Vérifier si la section actuelle contient un champ OTP non validé\n // Cette vérification complète celle de useFormPageValidation en ajoutant un message plus explicite\n const currentSection = form.sections[navigation.sectionIndex];\n if (currentSection && hasOTPField(currentSection)) {\n const otpField = getOTPField(currentSection);\n if (otpField) {\n const otpValue = formValues[otpField.fieldName];\n const otpLength = otpField.otpFormFieldExecOptions?.otpLength ?? 6;\n const isOTPRequired = otpField.validations?.some(\n (v) => v.validationType === \"required\"\n );\n\n // Vérifier si l'OTP est requis mais non rempli ou incomplet\n if (isOTPRequired) {\n if (\n !otpValue ||\n typeof otpValue !== \"string\" ||\n otpValue.length !== otpLength\n ) {\n toast.error(\n `⚠️ Veuillez remplir et valider le code OTP avant de continuer. Le code doit contenir ${otpLength} chiffres.`\n );\n return;\n }\n // Si l'OTP est rempli avec la bonne longueur, la validation dans useFormPageValidation\n // devrait avoir vérifié qu'il est valide. Si on arrive ici, c'est que la validation a passé,\n // donc on peut continuer la navigation.\n }\n }\n }\n\n const nextSectionIndex = getNextSectionIndex(\n navigation.sectionIndex,\n navigation.fieldPage,\n form,\n paginationMode,\n fieldsPerPage\n );\n\n if (nextSectionIndex !== -1) {\n const nextSection = form.sections[nextSectionIndex];\n if (hasOTPField(nextSection)) {\n const otpField = getOTPField(nextSection);\n if (otpField) {\n try {\n await sendOTPBeforeNavigation(otpField, formValues, form.sections);\n toast.success(\"Code de vérification envoyé !\");\n } catch (err: any) {\n const message =\n err instanceof Error ? err.message : \"Erreur lors de l'envoi du code OTP\";\n toast.error(message);\n return;\n }\n }\n }\n }\n\n if (navigation.goToNextVisible) {\n navigation.goToNextVisible();\n } else {\n navigation.goToNext();\n }\n toast.success(\n `Super section suivante ! 🎉 (${result.requiredFieldsCount}/${result.visibleFieldsCount} champs requis)`\n );\n } finally {\n setIsValidating(false);\n }\n };\n\n return { handleNext };\n};\n\nexport default useFormNavigationActions;","import { useFormContext } from 'react-hook-form';\nimport type { FormField } from '../types/formTypeStructure';\n\nexport const useFormValidation = () => {\n const { trigger, formState } = useFormContext();\n\n const validateFields = async (fields: FormField[]): Promise<boolean> => {\n\n const fieldNames = fields.map(f => f.fieldName as string);\n \n if (fieldNames.length === 0) {\n return true;\n }\n \n try {\n const valid = await trigger(fieldNames);\n if (!valid) {\n console.log('Validation échouée, erreurs:', formState.errors);\n }\n return valid;\n } catch (error) {\n console.error('Erreur lors de la validation:', error);\n return false;\n }\n };\n\n return {\n validateFields,\n formState\n };\n};","import { useState } from \"react\";\n\nconst Tooltip: React.FC<{\n tooltipContent?: string;\n helpTextContent?: string;\n children: React.ReactNode;\n position?: 'top' | 'bottom' | 'left' | 'right';\n className?: string;\n}> = ({ tooltipContent = '', helpTextContent = '', children, position = 'top', className = '' }) => {\n const [isVisible, setIsVisible] = useState(false);\n const [tooltipId] = useState(() => `tooltip-${Math.random().toString(36).substr(2, 9)}`);\n\n const hasContent = tooltipContent.trim() || helpTextContent.trim();\n\n if (!hasContent) return <>{children}</>;\n\n const positionClasses = {\n top: 'bottom-full left-1/2 transform -translate-x-1/2 mb-3',\n bottom: 'top-full left-1/2 transform -translate-x-1/2 mt-3',\n left: 'right-full top-1/2 transform -translate-y-1/2 mr-3',\n right: 'left-full top-1/2 transform -translate-y-1/2 ml-3'\n };\n\n const arrowClasses = {\n top: 'top-full left-1/2 transform -translate-x-1/2 border-t-slate-800 border-t-[8px] border-l-transparent border-r-transparent border-l-[8px] border-r-[8px]',\n bottom: 'bottom-full left-1/2 transform -translate-x-1/2 border-b-slate-800 border-b-[8px] border-l-transparent border-r-transparent border-l-[8px] border-r-[8px]',\n left: 'left-full top-1/2 transform -translate-y-1/2 border-l-slate-800 border-l-[8px] border-t-transparent border-b-transparent border-t-[8px] border-b-[8px]',\n right: 'right-full top-1/2 transform -translate-y-1/2 border-r-slate-800 border-r-[8px] border-t-transparent border-b-transparent border-t-[8px] border-b-[8px]'\n };\n\n return (\n <div\n className={`relative inline-block ${className}`}\n onMouseEnter={() => setIsVisible(true)}\n onMouseLeave={() => setIsVisible(false)}\n onFocus={() => setIsVisible(true)}\n onBlur={() => setIsVisible(false)}\n >\n {children}\n\n {isVisible && (\n <div\n id={tooltipId}\n role=\"tooltip\"\n className={`absolute z-50 px-4 py-3 text-sm font-medium text-white bg-slate-500 rounded-xl shadow-2xl max-w-2xl min-w-80 backdrop-blur-sm border border-slate-700 ${positionClasses[position]}`}\n style={{\n animation: 'tooltipFadeIn 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n lineHeight: '1.5',\n wordWrap: 'break-word',\n hyphens: 'auto'\n }}\n >\n <div className=\"relative space-y-2\">\n <ul className=\"list-disc list-inside space-y-1\">\n {tooltipContent && <li>{tooltipContent}</li>}\n {helpTextContent && <li>{helpTextContent}</li>}\n </ul>\n \n </div>\n <div className={`absolute w-0 h-0 ${arrowClasses[position]}`} />\n </div>\n )}\n\n <style>{`\n @keyframes tooltipFadeIn {\n from { \n opacity: 0; \n transform: translateY(8px) scale(0.95);\n }\n to { \n opacity: 1; \n transform: translateY(0) scale(1);\n }\n }\n `}</style>\n </div>\n );\n};\n\nexport default Tooltip;\n\n\n\n\n// const validatePage = async () => {\n// const isValid = await validateFields(navigation.pagedFields);\n// const values = methods.getValues();\n \n// // Convertir les valeurs du formulaire en format ResponseInForm pour les règles d'affichage\n// const allResponseInForms: Record<string, ResponseInForm> = {};\n// Object.entries(values).forEach(([key, value]) => {\n// allResponseInForms[key] = { responseValue: value };\n// });\n\n// // Filtrer les champs selon leurs conditions d'affichage\n// const visiblePagedFields = navigation.pagedFields.filter((field: FormField) => \n// shouldDisplayFormField(field, allResponseInForms)\n// );\n\n// // Générer les champs répétés (uniquement pour les champs visibles)\n// const repeatFields = visiblePagedFields\n// .filter((f: FormField) => f.repeatGroup)\n// .flatMap((f: FormField) => {\n// const group = f.repeatGroup!;\n// const instanceCount = values[group.fieldName]?.length ?? 0;\n \n// const repeatedFields: FormField[] = [];\n \n// for (let i = 0; i < instanceCount; i++) {\n// for (const baseField of group.formFields) {\n// const repeatedField = {\n// ...baseField,\n// fieldName: `${group.fieldName}_${baseField.fieldName}_${i}`\n// };\n \n// // Vérifier si le champ répété doit être affiché\n// if (shouldDisplayFormField(repeatedField, allResponseInForms)) {\n// repeatedFields.push(repeatedField);\n// }\n// }\n// }\n \n// return repeatedFields;\n// });\n\n// // Tous les champs à vérifier (visibles uniquement)\n// const allFieldsToCheck = [...visiblePagedFields, ...repeatFields];\n\n// // Vérifier si tous les champs requis et visibles ont été touchés\n// const touched = allFieldsToCheck.every((field) => {\n// const required = field.validations?.some(\n// (v: ValidationRule) => v.validationType === \"required\"\n// );\n \n// // Si le champ n'est pas requis, on considère qu'il est \"touché\"\n// if (!required) return true;\n \n// // Vérifier si le champ requis a été touché\n// return !!methods.formState.touchedFields?.[field.fieldName];\n// });\n\n// // Validation supplémentaire : vérifier que tous les champs requis et visibles ont une valeur\n// const allRequiredFieldsFilled = allFieldsToCheck.every((field) => {\n// const required = field.validations?.some(\n// (v: ValidationRule) => v.validationType === \"required\"\n// );\n \n// if (!required) return true;\n \n// const fieldValue = values[field.fieldName];\n \n// // Vérifier selon le type de champ\n// if (Array.isArray(fieldValue)) {\n// return fieldValue.length > 0;\n// }\n \n// return fieldValue !== undefined && fieldValue !== null && fieldValue !== '';\n// });\n\n// return { \n// isValid, \n// touched, \n// allRequiredFieldsFilled,\n// visibleFieldsCount: allFieldsToCheck.length,\n// requiredFieldsCount: allFieldsToCheck.filter(f => \n// f.validations?.some(v => v.validationType === \"required\")\n// ).length\n// };\n// };\n","// components/atoms/formfield/FormFieldWrapper.tsx\n\nimport React, { useEffect, useState } from \"react\";\nimport type { ResponseInForm, FormField } from \"./types/formTypeStructure\";\nimport { useFormContext } from \"react-hook-form\";\nimport { AlertCircle, MessageCircle } from \"lucide-react\";\nimport Tooltip from \"./components/Tooltip\";\n\n// === Breakpoints définis dans Tailwind\nexport const BREAKPOINTS = {\n 'mobile-s': 320,\n 'mobile-m': 375,\n 'mobile-l': 425,\n tablet: 768,\n laptop: 1024,\n 'laptop-l': 1440,\n desktop: 1920,\n '4k-screen': 2560,\n};\n\n// === Hook pour la taille responsive\nexport const useResponsiveSize = () => {\n const calculateSize = (screenWidth: number) => {\n let width: number;\n let height: number;\n\n if (screenWidth <= BREAKPOINTS['mobile-s']) width = 210;\n else if (screenWidth <= BREAKPOINTS['mobile-m']) width = 260;\n else if (screenWidth <= BREAKPOINTS['mobile-l']) width = 280;\n else if (screenWidth <= BREAKPOINTS.tablet) width = 300;\n else if (screenWidth <= BREAKPOINTS.laptop) width = 300;\n else if (screenWidth <= BREAKPOINTS['laptop-l']) width = 380;\n else if (screenWidth <= BREAKPOINTS.desktop) width = 420;\n else if (screenWidth <= BREAKPOINTS['4k-screen']) width = 420;\n else width = 500;\n\n const heightMobileS = 35;\n const heightKScreen = 65;\n const heightSlope = (heightKScreen - heightMobileS) / (BREAKPOINTS['4k-screen'] - BREAKPOINTS['mobile-s']);\n \n height = heightSlope * (screenWidth - BREAKPOINTS['mobile-s']) + heightMobileS;\n height = Math.max(heightMobileS, Math.min(heightKScreen, height));\n\n const radiusRatio = 0.25;\n const borderRadius = Math.round(height * radiusRatio);\n const finalBorderRadius = Math.max(8, Math.min(16, borderRadius));\n\n return {\n width: Math.round(width),\n height: Math.round(height),\n borderRadius: finalBorderRadius,\n };\n };\n\n const [size, setSize] = useState(() =>\n typeof window !== \"undefined\"\n ? calculateSize(window.innerWidth)\n : { width: 340, height: 48, borderRadius: 12 }\n );\n\n useEffect(() => {\n const updateSize = () => {\n setSize(calculateSize(window.innerWidth));\n };\n\n let timeoutId: NodeJS.Timeout;\n const debouncedResize = () => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(updateSize, 100);\n };\n\n updateSize();\n window.addEventListener(\"resize\", debouncedResize);\n return () => {\n window.removeEventListener(\"resize\", debouncedResize);\n clearTimeout(timeoutId);\n };\n }, []);\n\n return size;\n};\n\n// === Hook pour breakpoint actuel\nexport const useCurrentBreakpoint = () => {\n const [breakpoint, setBreakpoint] = useState<keyof typeof BREAKPOINTS | 'xs'>('tablet');\n\n useEffect(() => {\n const update = () => {\n const screenWidth = window.innerWidth;\n if (screenWidth < BREAKPOINTS['mobile-s']) setBreakpoint('xs');\n else if (screenWidth < BREAKPOINTS['mobile-m']) setBreakpoint('mobile-s');\n else if (screenWidth < BREAKPOINTS['mobile-l']) setBreakpoint('mobile-m');\n else if (screenWidth < BREAKPOINTS.tablet) setBreakpoint('mobile-l');\n else if (screenWidth < BREAKPOINTS.laptop) setBreakpoint('tablet');\n else if (screenWidth < BREAKPOINTS['laptop-l']) setBreakpoint('laptop');\n else if (screenWidth < BREAKPOINTS.desktop) setBreakpoint('laptop-l');\n else if (screenWidth < BREAKPOINTS['4k-screen']) setBreakpoint('desktop');\n else setBreakpoint('4k-screen');\n };\n\n let timeoutId: NodeJS.Timeout;\n const debounced = () => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(update, 100);\n };\n\n update();\n window.addEventListener(\"resize\", debounced);\n return () => {\n window.removeEventListener(\"resize\", debounced);\n clearTimeout(timeoutId);\n };\n }, []);\n\n return breakpoint;\n};\n\n// === Multilingue\nexport const getLocalizedText = (\n text: string | { [lang: string]: string } | undefined,\n currentLang: string = \"fr\"\n): string => {\n if (!text) return \"\";\n if (typeof text === \"string\") return text;\n return text[currentLang] || text[\"fr\"] || text[\"en\"] || Object.values(text)[0] || \"\";\n};\n\n// === Extraire la valeur actuelle d'un champ\nexport const getCurrentValue = (responses: ResponseInForm | ResponseInForm[]): any => {\n if (Array.isArray(responses)) return responses.map(r => r.responseValue);\n return responses.responseValue;\n};\n\n// === Fonction pour extraire les messages d'erreur\nexport const extractErrorMessages = (err: any): string[] => {\n if (!err) return [];\n\n // Si c'est un array d'erreurs\n if (Array.isArray(err)) {\n return err.flatMap(e => extractErrorMessages(e)).filter(Boolean);\n }\n\n // Si c'est un objet avec une propriété message\n if (typeof err === \"object\" && err !== null) {\n if (typeof err.message === \"string\" && err.message.trim()) {\n return [err.message];\n }\n // Cas où l'erreur pourrait être dans une autre propriété\n if (err.type && typeof err.type === \"string\") {\n return [err.type];\n }\n }\n\n // Si c'est directement une string\n if (typeof err === \"string\" && err.trim()) {\n return [err];\n }\n\n return [];\n};\n\n\n// === Wrapper générique pour tout champ\nexport const FormFieldWrapper: React.FC<{\n field: FormField;\n currentLang?: string;\n showLabel?: boolean;\n children: React.ReactNode;\n tooltipPosition?: 'top' | 'bottom' | 'left' | 'right';\n}> = ({ field, currentLang = \"fr\", showLabel = true, children, tooltipPosition = 'right' }) => {\n\n\n const isRequired = field.validations?.some(v => v.validationType === \"required\");\n const { formState, getFieldState } = useFormContext();\n\n // Fonction pour accéder aux erreurs imbriquées\n function getByPath(obj: any, path: string): any {\n if (!obj || !path) return undefined;\n return path.split('.').reduce((acc, part) => {\n if (!acc) return undefined;\n if (Array.isArray(acc)) return acc[Number(part)];\n return acc[part];\n }, obj);\n }\n\n\n const fieldName = field.fieldName?.toString() ?? \"\";\n const error = getByPath(formState.errors, fieldName);\n const fieldState = getFieldState(fieldName, formState);\n\n const errorMessages = extractErrorMessages(error);\n\n // Logique d'affichage des erreurs\n const showError = errorMessages.length > 0 && (\n // Afficher l'erreur si le champ a été touché ET qu'il y a une erreur\n (fieldState.isTouched && fieldState.invalid) ||\n // Ou si le formulaire a été soumis\n formState.isSubmitted ||\n // Ou si on a tenté de soumettre\n formState.submitCount > 0\n );\n\n // Récupération du texte de tooltip localisé\n const tooltipText = getLocalizedText(field.tooltip, currentLang);\n\n return (\n <div className=\"mb-4\">\n {showLabel && (\n <div className=\"flex items-center mb-2\">\n\n {(tooltipText || field.helpText) && (\n <Tooltip\n tooltipContent={tooltipText}\n helpTextContent={\n field.helpText\n ? getLocalizedText(field.helpText, currentLang)\n : \"\"\n }\n position={tooltipPosition}\n className=\"ml-2\"\n >\n <MessageCircle\n size={16}\n className=\"text-gray-400 hover:text-gray-600 cursor-help transition-colors duration-200\"\n tabIndex={0}\n aria-label=\"Information supplémentaire\"\n />\n </Tooltip>\n )}\n\n <label className=\"block text-sm font-medium text-gray-700\">\n {getLocalizedText(field.label, currentLang)}\n {isRequired && (\n <AlertCircle size={12} className=\"inline text-red-500 ml-1\" />\n )}\n </label>\n\n {/* Tooltip à côté du label */}\n\n </div>\n )}\n\n {children}\n\n \n {/* Affichage des erreurs */}\n {showError && errorMessages.map((msg, idx) => (\n <p key={idx} className=\"text-sm text-red-500 mt-1\">\n {typeof msg === 'string' && msg.trim() ? msg : 'Champ invalide'}\n </p>\n ))}\n\n {field.example && (\n <p className=\"text-sm text-gray-300 mt-1 font-light italic\">\n Exemple: {getLocalizedText(field.example, currentLang)}\n </p>\n )}\n </div>\n );\n};\n\nexport default FormFieldWrapper;\n","import { useState } from \"react\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport type { FormValidationResult, FieldValidationError } from \"../types/formEngine.types\";\nimport type { FormField, ResponseInForm, ValidationRule } from \"../../../types/formTypeStructure\";\nimport { shouldDisplayFormField, shouldDisplaySection } from \"../../../types/displayRules\";\nimport { useFormValidation } from \"../../../hooks/useFormValidation\";\nimport { getLocalizedText, extractErrorMessages } from \"../../../FormFieldWrapper\";\nimport { hasOTPField, getOTPField } from \"../../../types/formUtils\";\n\nconst useFormPageValidation = (navigation: any, methods: UseFormReturn, currentLang: string = \"fr\", paginationMode: \"byFields\" | \"bySection\" = \"byFields\") => {\n const [isValidating, setIsValidating] = useState(false);\n const { validateFields, formState } = useFormValidation();\n\n const validatePage = async (): Promise<FormValidationResult> => {\n setIsValidating(true);\n\n try {\n const values = methods.getValues();\n\n // Convertir les valeurs pour les règles d'affichage\n const allResponseInForms: Record<string, ResponseInForm> = {};\n Object.entries(values).forEach(([key, value]) => {\n allResponseInForms[key] = { responseValue: value };\n });\n\n // ÉTAPE 1: Récupérer uniquement les champs de la page actuelle\n const currentPageFields = navigation.pagedFields || [];\n const currentSection = navigation.currentSection;\n // Adapter le message selon le mode de pagination\n const currentStepInfo = paginationMode === \"bySection\" \n ? `Section ${navigation.sectionIndex + 1}`\n : `Section ${navigation.sectionIndex + 1}, Page ${navigation.fieldPage + 1}`;\n \n // console.log(`📄 Page actuelle: ${currentStepInfo}, Champs bruts:`, currentPageFields.length);\n\n // 🆕 Vérifier si la section actuelle contient un OTP\n const isOTPSection = currentSection ? hasOTPField(currentSection) : false;\n const otpField = isOTPSection && currentSection ? getOTPField(currentSection) : undefined;\n\n // 🆕 Pour les sections OTP, valider que l'OTP a été rempli\n if (isOTPSection && otpField) {\n const otpValue = values[otpField.fieldName];\n const otpLength = otpField.otpFormFieldExecOptions?.otpLength ?? 6;\n \n // Vérifier que l'OTP est rempli (string de la bonne longueur)\n if (!otpValue || typeof otpValue !== \"string\" || otpValue.length !== otpLength) {\n const fieldLabel = getLocalizedText(otpField.label, currentLang);\n return {\n isValid: false,\n touched: true,\n allRequiredFieldsFilled: false,\n visibleFieldsCount: 1,\n emptyRequiredFields: [{\n fieldName: otpField.fieldName,\n fieldLabel,\n errors: [`Le code OTP doit contenir ${otpLength} chiffres`]\n }],\n invalidFields: [],\n untouchedRequiredFields: [],\n requiredFieldsCount: 1\n };\n }\n \n // Si l'OTP est rempli, la validation passe (pas besoin de valider les autres champs de la section)\n return {\n isValid: true,\n touched: true,\n allRequiredFieldsFilled: true,\n visibleFieldsCount: 1,\n emptyRequiredFields: [],\n invalidFields: [],\n untouchedRequiredFields: [],\n requiredFieldsCount: 1\n };\n }\n\n // ÉTAPE 2: Filtrer les champs visibles selon les règles d'affichage\n const visibleCurrentPageFields = currentPageFields.filter((field: FormField) => {\n // Vérifier si la section actuelle est visible\n const sectionVisible = shouldDisplaySection(currentSection, allResponseInForms);\n \n // Vérifier si le champ lui-même doit être affiché\n const shouldDisplay = shouldDisplayFormField(field, allResponseInForms);\n \n const isVisible = sectionVisible && shouldDisplay;\n\n if (isVisible) {\n // console.log(`✅ [Champ visible ${currentStepInfo}] ${field.fieldName}`);\n } else {\n // console.log(`🚫 [Champ masqué ${currentStepInfo}] ${field.fieldName} - SectionVisible: ${sectionVisible}, ShouldDisplay: ${shouldDisplay}`);\n }\n\n return isVisible;\n });\n\n // ÉTAPE 3: Gérer les champs répétés (repeat groups) pour la page actuelle\n const repeatFieldsForCurrentPage = visibleCurrentPageFields\n .filter((f: FormField) => f.repeatGroup)\n .flatMap((f: FormField) => {\n const group = f.repeatGroup!;\n const instanceCount = values[group.fieldName]?.length ?? 0;\n\n const repeatedFields: FormField[] = [];\n\n for (let i = 0; i < instanceCount; i++) {\n for (const baseField of group.formFields) {\n const repeatedField = {\n ...baseField,\n fieldName: `${group.fieldName}_${baseField.fieldName}_${i}`\n };\n\n if (shouldDisplayFormField(repeatedField, allResponseInForms)) {\n repeatedFields.push(repeatedField);\n }\n }\n }\n\n return repeatedFields;\n });\n\n // ÉTAPE 4: Combiner tous les champs à vérifier pour cette page\n const allFieldsToCheck = [...visibleCurrentPageFields, ...repeatFieldsForCurrentPage];\n\n // console.log(`🔍 Validation ${currentStepInfo}:`, {\n // totalFields: allFieldsToCheck.length,\n // fieldNames: allFieldsToCheck.map(f => f.fieldName)\n // });\n\n // ÉTAPE 5: Validation des champs avec react-hook-form\n const isValid = await validateFields(allFieldsToCheck);\n\n // Créer une map des champs pour retrouver rapidement les infos\n const fieldsMap = new Map(allFieldsToCheck.map(f => [f.fieldName, f]));\n\n // ÉTAPE 6: Identifier les champs requis\n const requiredFields = allFieldsToCheck.filter((field) => {\n const isRequired = field.validations?.some(\n (v: ValidationRule) => v.validationType === \"required\"\n );\n if (isRequired) {\n // console.log(`[Required] Champ requis sur ${currentStepInfo}: ${field.fieldName}`);\n }\n return isRequired;\n });\n\n // ÉTAPE 7: Vérifier que tous les champs requis ont été touchés\n const allRequiredFieldsTouched = requiredFields.every((field) => {\n const isTouched = !!methods.formState.touchedFields?.[field.fieldName];\n if (!isTouched) {\n console.warn(`[Non touché] Champ requis non touché: ${field.fieldName}`);\n }\n return isTouched;\n });\n\n // ÉTAPE 8: Vérifier que tous les champs requis sont remplis\n const allRequiredFieldsFilled = requiredFields.every((field) => {\n const fieldValue = values[field.fieldName];\n const filled = Array.isArray(fieldValue)\n ? fieldValue.length > 0\n : fieldValue !== undefined && fieldValue !== null && fieldValue !== '';\n\n if (!filled) {\n console.warn(`[Non rempli] Champ requis vide: ${field.fieldName} →`, fieldValue);\n } else {\n // console.log(`[Rempli] Champ requis rempli: ${field.fieldName} →`, fieldValue);\n }\n\n return filled;\n });\n\n // ÉTAPE 9: Vérifier si tous les champs (requis ou non) ont été touchés\n const allFieldsTouched = allFieldsToCheck.every((field) => {\n return !!methods.formState.touchedFields?.[field.fieldName];\n });\n\n // ÉTAPE 10: Extraire les erreurs détaillées pour les toasts\n // 10.1: Erreurs de validation Zod\n const invalidFields: FieldValidationError[] = [];\n if (methods.formState.errors) {\n Object.entries(methods.formState.errors).forEach(([fieldName, error]) => {\n const field = fieldsMap.get(fieldName);\n if (field && error) {\n const messages = extractErrorMessages(error);\n if (messages.length > 0) {\n invalidFields.push({\n fieldName,\n fieldLabel: getLocalizedText(field.label, currentLang),\n errors: messages\n });\n }\n }\n });\n }\n\n // 10.2: Champs requis non touchés\n const untouchedRequiredFields: FieldValidationError[] = [];\n requiredFields.forEach(field => {\n const isTouched = !!methods.formState.touchedFields?.[field.fieldName];\n if (!isTouched) {\n untouchedRequiredFields.push({\n fieldName: field.fieldName,\n fieldLabel: getLocalizedText(field.label, currentLang),\n errors: [\"Champ requis non rempli\"]\n });\n }\n });\n\n // 10.3: Champs requis vides\n const emptyRequiredFields: FieldValidationError[] = [];\n requiredFields.forEach(field => {\n const value = values[field.fieldName];\n const filled = Array.isArray(value) \n ? value.length > 0 \n : value !== undefined && value !== null && value !== '';\n if (!filled) {\n emptyRequiredFields.push({\n fieldName: field.fieldName,\n fieldLabel: getLocalizedText(field.label, currentLang),\n errors: [\"Champ requis\"]\n });\n }\n });\n\n const result = {\n isValid: isValid && allRequiredFieldsFilled,\n touched: allRequiredFieldsTouched, // Pour handleNext/handleSubmit\n allRequiredFieldsFilled,\n visibleFieldsCount: allFieldsToCheck.length,\n requiredFieldsCount: requiredFields.length,\n // Informations supplémentaires pour debug\n currentStep: currentStepInfo,\n sectionIndex: navigation.sectionIndex,\n fieldPage: navigation.fieldPage,\n allFieldsTouched, // Si vous voulez vérifier tous les champs\n fieldNames: allFieldsToCheck.map(f => f.fieldName),\n // NOUVEAUX: Détails des erreurs pour les toasts\n invalidFields,\n untouchedRequiredFields,\n emptyRequiredFields\n };\n\n // console.log(`📋 Résultat validation ${currentStepInfo}:`, {\n // isValid: result.isValid,\n // touched: result.touched,\n // allRequiredFieldsFilled: result.allRequiredFieldsFilled,\n // visibleFieldsCount: result.visibleFieldsCount,\n // requiredFieldsCount: result.requiredFieldsCount\n // });\n\n return result;\n\n } catch (error) {\n console.error(\"Erreur lors de la validation de la page:\", error);\n return {\n isValid: false,\n touched: false,\n allRequiredFieldsFilled: false,\n visibleFieldsCount: 0,\n requiredFieldsCount: 0,\n invalidFields: [],\n untouchedRequiredFields: [],\n emptyRequiredFields: []\n };\n } finally {\n setIsValidating(false);\n }\n };\n\n return { validatePage, isValidating, setIsValidating };\n};\n\nexport default useFormPageValidation;\n\n","import type { UseFormReturn } from \"react-hook-form\";\nimport type { FormStructure } from \"../../../types/formTypeStructure\";\nimport type { FormValidationResult } from \"../types/formEngine.types\";\nimport toast from \"react-hot-toast\";\nimport { prepareFormDataBeforeSubmit, flattenOTPFields } from \"../../../types/formUtils\";\nimport { normalizeFormData } from \"../../../types/repeatRules\";\n\nconst useFormSubmission = (\n methods: UseFormReturn,\n form: FormStructure,\n validatePage: () => Promise<FormValidationResult>,\n onSubmit: (data: Record<string, any>) => void,\n setIsValidating: (value: boolean) => void\n) => {\n const handleSubmitWithValidation = async () => {\n setIsValidating(true);\n try {\n const result = await validatePage();\n \n // Afficher les erreurs détaillées par champ\n if (result.invalidFields && result.invalidFields.length > 0) {\n result.invalidFields.forEach(field => {\n field.errors.forEach(error => {\n toast.error(`${field.fieldLabel} : ${error}`);\n });\n });\n return;\n }\n \n if (result.emptyRequiredFields && result.emptyRequiredFields.length > 0) {\n result.emptyRequiredFields.forEach(field => {\n toast.error(`${field.fieldLabel} : ${field.errors[0]}`);\n });\n return;\n }\n \n if (result.untouchedRequiredFields && result.untouchedRequiredFields.length > 0) {\n result.untouchedRequiredFields.forEach(field => {\n toast.error(`${field.fieldLabel} : ${field.errors[0]}`);\n });\n return;\n }\n \n const data = methods.getValues();\n const completedData = prepareFormDataBeforeSubmit(data, form.sections);\n const flattenedData = flattenOTPFields(completedData, form.sections); // 🆕 Aplatir les champs OTP\n const normalizedData = normalizeFormData(flattenedData, form.sections);\n\n onSubmit(normalizedData);\n \n toast.success(`Formulaire soumis avec succès ! 🎉 (${result.requiredFieldsCount} champs requis traités)`);\n } finally {\n setIsValidating(false);\n }\n };\n\n return { handleSubmitWithValidation };\n};\n\nexport default useFormSubmission;","import { useEffect, useState, useCallback, useRef } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport type { FormField } from '../types/formTypeStructure';\n\n/**\n * Hook pour gérer le filtrage dynamique des champs de formulaire\n */\nexport const useDynamicFiltering = (fields: FormField[]) => {\n const { watch, setValue } = useFormContext();\n const [filteredFields, setFilteredFields] = useState<FormField[]>(fields);\n const previousValuesRef = useRef<Record<string, any>>({});\n\n // Fonction pour appliquer le filtrage à un champ\n const applyDynamicFilter = useCallback((field: FormField, formValues: Record<string, any>): FormField => {\n if (!field.dynamicFilterRule || field.fieldType !== 'dropdown') {\n return field;\n }\n\n const { dependentFieldName, dataSource } = field.dynamicFilterRule;\n const dependentValue = formValues[dependentFieldName];\n\n // console.log('🔍 [DynamicFiltering] Application du filtre:', {\n // fieldName: field.fieldName,\n // dependentField: dependentFieldName,\n // dependentValue,\n // hasDataSource: !!dataSource.data\n // });\n\n // 🆕 Si le champ parent est vide ou n'a pas de données correspondantes, vider les options\n if (!dependentValue || !dataSource.data[dependentValue]) {\n // console.log('⚠️ [DynamicFiltering] Aucune donnée trouvée pour:', dependentValue, '- Options vidées');\n return {\n ...field,\n selectOptions: [] // 🆕 Vider les options au lieu de retourner le champ tel quel\n };\n }\n\n const filteredOptions = dataSource.data[dependentValue];\n // console.log('✅ [DynamicFiltering] Options filtrées:', {\n // fieldName: field.fieldName,\n // optionsCount: filteredOptions.length,\n // options: filteredOptions.map(opt => opt.value)\n // });\n\n return {\n ...field,\n selectOptions: filteredOptions\n };\n }, []);\n\n // 🆕 Fonction pour trouver les champs qui dépendent d'un champ donné\n const findDependentFields = useCallback((fieldName: string): FormField[] => {\n return fields.filter(field => \n field.dynamicFilterRule?.dependentFieldName === fieldName\n );\n }, [fields]);\n\n // 🆕 Fonction récursive pour réinitialiser une cascade de champs dépendants\n const resetCascade = useCallback((\n fieldName: string,\n formValues: Record<string, any>\n ) => {\n const dependentFields = findDependentFields(fieldName);\n \n dependentFields.forEach(dependentField => {\n const currentValue = formValues[dependentField.fieldName];\n if (currentValue) {\n // console.log(`🔄 [DynamicFiltering] Réinitialisation cascade: ${dependentField.fieldName} (dépend de ${fieldName})`);\n // Réinitialiser la valeur mais PAS les options (elles seront mises à jour par le filtrage)\n setValue(dependentField.fieldName, \"\", { shouldValidate: false });\n }\n \n // Réinitialiser récursivement les champs qui dépendent de celui-ci\n resetCascade(dependentField.fieldName, formValues);\n });\n }, [findDependentFields, setValue]);\n\n // Fonction pour appliquer le filtrage à tous les champs\n const applyFiltersToFields = useCallback((fields: FormField[], formValues: Record<string, any>): FormField[] => {\n return fields.map(field => applyDynamicFilter(field, formValues));\n }, [applyDynamicFilter]);\n\n // Surveiller les changements dans le formulaire\n useEffect(() => {\n // 🆕 Initialiser les valeurs précédentes avec les valeurs actuelles\n const initialValues = watch();\n previousValuesRef.current = { ...initialValues };\n \n const subscription = watch((formValues, { name: changedFieldName }) => {\n // console.log('👁️ [DynamicFiltering] Changement détecté dans le formulaire', { changedFieldName, formValues });\n \n // 🆕 TOUJOURS appliquer le filtrage avec les nouvelles valeurs (même si pas de changedFieldName)\n const updatedFields = applyFiltersToFields(fields, formValues);\n // console.log('📊 [DynamicFiltering] Champs après filtrage:', updatedFields.map(f => ({\n // fieldName: f.fieldName,\n // hasOptions: !!f.selectOptions?.length,\n // optionsCount: f.selectOptions?.length || 0\n // })));\n setFilteredFields(updatedFields);\n \n // 🆕 Ensuite, si un champ parent change ou devient vide, réinitialiser les cascades\n // Utiliser setTimeout pour laisser le temps au filtrage de s'appliquer d'abord\n if (changedFieldName) {\n const changedField = fields.find(f => f.fieldName === changedFieldName);\n const previousValue = previousValuesRef.current[changedFieldName];\n const currentValue = formValues[changedFieldName];\n \n // Si c'est un champ parent (qui n'a pas de dynamicFilterRule) et que sa valeur a changé\n if (changedField && !changedField.dynamicFilterRule && previousValue !== currentValue) {\n // Si le champ est devenu vide OU si on change d'une valeur à une autre (pas la première sélection)\n // Ne pas réinitialiser si c'est juste la première sélection (previousValue undefined/null et currentValue existe)\n if (!currentValue || (previousValue !== undefined && previousValue !== null && previousValue !== \"\")) {\n // console.log(`🔄 [DynamicFiltering] Champ parent ${changedFieldName} a changé, réinitialisation cascade`, {\n // previousValue,\n // currentValue\n // });\n // Utiliser setTimeout pour laisser le temps au filtrage de s'appliquer\n setTimeout(() => {\n resetCascade(changedFieldName, formValues);\n }, 0);\n } else {\n // console.log(`✅ [DynamicFiltering] Première sélection du champ parent ${changedFieldName}, pas de réinitialisation`);\n }\n }\n \n // Mettre à jour la référence des valeurs précédentes\n previousValuesRef.current = { ...formValues };\n }\n });\n\n return () => subscription.unsubscribe();\n }, [watch, fields, applyFiltersToFields, resetCascade]);\n\n return filteredFields;\n};\n\n/**\n * Hook pour obtenir les champs avec filtrage appliqué pour une section spécifique\n */\nexport const useSectionDynamicFiltering = (sectionFields: FormField[]) => {\n const { watch, setValue, getValues } = useFormContext();\n const [filteredSectionFields, setFilteredSectionFields] = useState<FormField[]>(sectionFields);\n const previousValuesRef = useRef<Record<string, any>>({});\n\n // 🆕 Fonction pour trouver les champs qui dépendent d'un champ donné (dans cette section)\n const findDependentFields = useCallback((fieldName: string): FormField[] => {\n return sectionFields.filter(field => \n field.dynamicFilterRule?.dependentFieldName === fieldName\n );\n }, [sectionFields]);\n\n // 🆕 Fonction récursive pour réinitialiser une cascade de champs dépendants\n const resetCascade = useCallback((\n fieldName: string,\n formValues: Record<string, any>\n ) => {\n const dependentFields = findDependentFields(fieldName);\n \n dependentFields.forEach(dependentField => {\n const currentValue = formValues[dependentField.fieldName];\n if (currentValue) {\n // console.log(`🔄 [SectionDynamicFiltering] Réinitialisation cascade: ${dependentField.fieldName} (dépend de ${fieldName})`);\n setValue(dependentField.fieldName, \"\", { shouldValidate: false });\n }\n \n // Réinitialiser récursivement les champs qui dépendent de celui-ci\n resetCascade(dependentField.fieldName, formValues);\n });\n }, [findDependentFields, setValue]);\n\n // Fonction pour appliquer le filtrage à un champ\n const applyDynamicFilter = useCallback((field: FormField, formValues: Record<string, any>): FormField => {\n if (!field.dynamicFilterRule || field.fieldType !== 'dropdown') {\n return field;\n }\n\n const { dependentFieldName, dataSource } = field.dynamicFilterRule;\n const dependentValue = formValues[dependentFieldName];\n\n // console.log('🔍 [SectionDynamicFiltering] Application du filtre:', {\n // fieldName: field.fieldName,\n // dependentField: dependentFieldName,\n // dependentValue,\n // hasDataSource: !!dataSource.data\n // });\n\n // 🆕 Si le champ parent est vide ou n'a pas de données correspondantes, vider les options\n if (!dependentValue || !dataSource.data[dependentValue]) {\n // console.log('⚠️ [SectionDynamicFiltering] Aucune donnée trouvée pour:', dependentValue, '- Options vidées');\n return {\n ...field,\n selectOptions: [] // 🆕 Vider les options au lieu de retourner le champ tel quel\n };\n }\n\n const filteredOptions = dataSource.data[dependentValue];\n // console.log('✅ [SectionDynamicFiltering] Options filtrées:', {\n // fieldName: field.fieldName,\n // optionsCount: filteredOptions.length,\n // options: filteredOptions.map(opt => opt.value)\n // });\n\n return {\n ...field,\n selectOptions: filteredOptions\n };\n }, []);\n\n // Fonction pour appliquer le filtrage à tous les champs de la section\n const applyFiltersToSectionFields = useCallback((fields: FormField[], formValues: Record<string, any>): FormField[] => {\n return fields.map(field => applyDynamicFilter(field, formValues));\n }, [applyDynamicFilter]);\n\n // Surveiller les changements dans le formulaire\n useEffect(() => {\n // 🆕 Initialiser les valeurs précédentes avec les valeurs actuelles\n const initialValues = watch();\n previousValuesRef.current = { ...initialValues };\n \n const subscription = watch((formValues, { name: changedFieldName }) => {\n // console.log('👁️ [SectionDynamicFiltering] Changement détecté dans la section', { changedFieldName, formValues });\n \n // 🆕 Utiliser requestAnimationFrame + setTimeout pour s'assurer que React a bien mis à jour les valeurs\n // après un setValue de react-hook-form, puis utiliser getValues() pour récupérer les valeurs synchrones\n requestAnimationFrame(() => {\n setTimeout(() => {\n // 🆕 Utiliser getValues() pour récupérer les valeurs les plus récentes au moment du filtrage\n // Le problème: formValues du callback watch() peut être obsolète si watch() se déclenche avant que setValue() ne soit terminé\n // Solution: utiliser getValues() qui récupère la valeur au moment de l'appel\n const currentFormValues = getValues();\n \n // 🆕 TOUJOURS appliquer le filtrage avec les nouvelles valeurs (même si pas de changedFieldName)\n const updatedFields = applyFiltersToSectionFields(sectionFields, currentFormValues);\n // console.log('📊 [SectionDynamicFiltering] Champs après filtrage:', updatedFields.map(f => ({\n // fieldName: f.fieldName,\n // hasOptions: !!f.selectOptions?.length,\n // optionsCount: f.selectOptions?.length || 0\n // })));\n setFilteredSectionFields(updatedFields);\n \n // 🆕 Ensuite, si un champ parent change ou devient vide, réinitialiser les cascades\n // Utiliser setTimeout pour laisser le temps au filtrage de s'appliquer d'abord\n if (changedFieldName) {\n const changedField = sectionFields.find(f => f.fieldName === changedFieldName);\n const previousValue = previousValuesRef.current[changedFieldName];\n const currentValue = currentFormValues[changedFieldName];\n \n // Si c'est un champ parent (qui n'a pas de dynamicFilterRule) et que sa valeur a changé\n if (changedField && !changedField.dynamicFilterRule && previousValue !== currentValue) {\n // Si le champ est devenu vide OU si on change d'une valeur à une autre (pas la première sélection)\n // Ne pas réinitialiser si c'est juste la première sélection (previousValue undefined/null et currentValue existe)\n if (!currentValue || (previousValue !== undefined && previousValue !== null && previousValue !== \"\")) {\n // console.log(`🔄 [SectionDynamicFiltering] Champ parent ${changedFieldName} a changé, réinitialisation cascade`, {\n // previousValue,\n // currentValue\n // });\n // Utiliser setTimeout pour laisser le temps au filtrage de s'appliquer\n setTimeout(() => {\n resetCascade(changedFieldName, currentFormValues);\n }, 0);\n } else {\n // console.log(`✅ [SectionDynamicFiltering] Première sélection du champ parent ${changedFieldName}, pas de réinitialisation`);\n }\n }\n \n // Mettre à jour la référence des valeurs précédentes\n previousValuesRef.current = { ...currentFormValues };\n }\n }, 10); // Petit délai pour garantir que setValue est terminé\n });\n });\n\n return () => subscription.unsubscribe();\n }, [watch, getValues, sectionFields, applyFiltersToSectionFields, resetCascade]);\n\n return filteredSectionFields;\n};\n\n/**\n * Hook pour gérer le filtrage dans les repeatGroup avec champs temporaires\n * Optimisé pour réduire les re-rendus\n */\nexport const useRepeatGroupDynamicFiltering = (repeatGroupFields: FormField[], repeatGroupName: string, index: number = 0) => {\n const { watch, setValue, getValues } = useFormContext();\n const [filteredRepeatGroupFields, setFilteredRepeatGroupFields] = useState<FormField[]>(repeatGroupFields);\n const previousValuesRef = useRef<Record<string, any>>({});\n\n // Fonction pour extraire la valeur d'un champ temporaire dans un RepeatGroup\n // 🆕 Utilise getValues() pour récupérer la valeur la plus récente au moment de l'appel\n // Ne se fie PAS à formValues qui peut être obsolète dans les RepeatGroups\n // Cette logique est spécifique aux RepeatGroups et différente de useSectionDynamicFiltering\n // Le problème: watch() peut être appelé avant que React Hook Form n'ait mis à jour la valeur\n // Solution: utiliser getValues() qui récupère la valeur au moment de l'appel, pas au moment de la souscription\n const getTempFieldValue = useCallback((formValues: Record<string, any>, baseFieldName: string, index: number, getValuesFn?: () => Record<string, any>): string | undefined => {\n const tempFieldName = `${repeatGroupName}_${baseFieldName}_${index}`;\n \n // 🆕 Pour les RepeatGroups, utiliser getValues() si fourni (dans le setTimeout)\n // Sinon, utiliser watch() comme fallback (mais peut être obsolète)\n // getValues() récupère la valeur au moment de l'appel, ce qui est plus fiable pour les RepeatGroups\n const currentFormValues = getValuesFn ? getValuesFn() : null;\n const value = currentFormValues ? currentFormValues[tempFieldName] : watch(tempFieldName);\n \n // console.log('🔎 [RepeatGroupDynamicFiltering] getTempFieldValue:', {\n // baseFieldName,\n // tempFieldName,\n // value,\n // hasGetValuesFn: !!getValuesFn,\n // valueFromGetValues: currentFormValues ? currentFormValues[tempFieldName] : undefined,\n // valueFromWatch: watch(tempFieldName),\n // valueType: typeof value,\n // isUndefined: value === undefined,\n // isNull: value === null,\n // isEmptyString: value === ''\n // });\n return value;\n }, [repeatGroupName, watch]);\n\n // 🆕 Fonction pour obtenir le nom temporaire d'un champ\n const getTempFieldName = useCallback((baseFieldName: string, index: number): string => {\n return `${repeatGroupName}_${baseFieldName}_${index}`;\n }, [repeatGroupName]);\n\n // 🆕 Fonction pour trouver les champs qui dépendent d'un champ donné (dans ce repeatGroup)\n const findDependentFields = useCallback((fieldName: string): FormField[] => {\n return repeatGroupFields.filter(field => \n field.dynamicFilterRule?.dependentFieldName === fieldName\n );\n }, [repeatGroupFields]);\n\n // 🆕 Fonction récursive pour réinitialiser une cascade de champs dépendants dans un repeatGroup\n const resetCascade = useCallback((\n fieldName: string,\n formValues: Record<string, any>\n ) => {\n const dependentFields = findDependentFields(fieldName);\n \n dependentFields.forEach(dependentField => {\n const tempFieldName = getTempFieldName(dependentField.fieldName, index);\n const currentValue = formValues[tempFieldName];\n if (currentValue) {\n // console.log(`🔄 [RepeatGroupDynamicFiltering] Réinitialisation cascade: ${tempFieldName} (dépend de ${getTempFieldName(fieldName, index)})`);\n setValue(tempFieldName, \"\", { shouldValidate: false });\n }\n \n // Réinitialiser récursivement les champs qui dépendent de celui-ci\n resetCascade(dependentField.fieldName, formValues);\n });\n }, [findDependentFields, setValue, getTempFieldName, index]);\n\n // Fonction pour appliquer le filtrage à un champ dans un repeatGroup\n // 🆕 Logique spécifique aux RepeatGroups : utilise getValues() via getTempFieldValue\n // Ne se fie PAS à formValues qui peut être obsolète\n const applyRepeatGroupDynamicFilter = useCallback((field: FormField, formValues: Record<string, any>, index: number, getValuesFn?: () => Record<string, any>): FormField => {\n if (!field.dynamicFilterRule || field.fieldType !== 'dropdown') {\n return field;\n }\n\n const { dependentFieldName, dataSource } = field.dynamicFilterRule;\n \n // 🆕 Pour les RepeatGroups, utiliser getTempFieldValue avec getValuesFn si fourni\n // Cela garantit qu'on récupère toujours la valeur la plus récente au moment de l'appel\n const dependentValue = getTempFieldValue(formValues, dependentFieldName, index, getValuesFn);\n\n // console.log('🔍 [RepeatGroupDynamicFiltering] Application du filtre:', {\n // fieldName: field.fieldName,\n // tempFieldName: `${repeatGroupName}_${field.fieldName}_${index}`,\n // dependentField: dependentFieldName,\n // tempDependentFieldName: `${repeatGroupName}_${dependentFieldName}_${index}`,\n // dependentValue,\n // hasDataSource: !!dataSource.data\n // });\n\n // 🆕 Si le champ parent est vide ou n'a pas de données correspondantes, vider les options\n // 🆕 Normaliser la valeur pour la comparaison (trim, lowercase pour éviter les problèmes de casse)\n const normalizedValue = dependentValue ? String(dependentValue).trim().toLowerCase() : '';\n const hasExactMatch = dependentValue && dataSource.data[dependentValue];\n \n // 🆕 Chercher aussi avec la valeur normalisée si pas de correspondance exacte\n let matchingKey = dependentValue;\n if (!hasExactMatch && normalizedValue) {\n matchingKey = Object.keys(dataSource.data || {}).find(key => \n key.toLowerCase() === normalizedValue\n ) || dependentValue;\n }\n \n if (!dependentValue || dependentValue === '' || !dataSource.data[matchingKey]) {\n // console.log('⚠️ [RepeatGroupDynamicFiltering] Aucune donnée trouvée pour:', {\n // dependentValue,\n // normalizedValue,\n // matchingKey,\n // dependentValueType: typeof dependentValue,\n // isEmpty: dependentValue === '',\n // isNull: dependentValue === null,\n // isUndefined: dependentValue === undefined,\n // hasExactMatch,\n // hasDataForMatchingKey: matchingKey ? matchingKey in dataSource.data : false,\n // availableKeys: Object.keys(dataSource.data || {}).slice(0, 10), // Limiter pour ne pas surcharger les logs\n // dataSourceKeys: dataSource.data ? Object.keys(dataSource.data).slice(0, 10) : []\n // }, '- Options vidées');\n return {\n ...field,\n selectOptions: [] // 🆕 Vider les options au lieu de retourner le champ tel quel\n };\n }\n\n // 🆕 Utiliser la clé correspondante (exacte ou normalisée)\n const finalKey = matchingKey;\n\n const filteredOptions = dataSource.data[finalKey];\n if (!Array.isArray(filteredOptions)) {\n console.error('❌ [RepeatGroupDynamicFiltering] Les options filtrées ne sont pas un tableau:', {\n fieldName: field.fieldName,\n dependentValue,\n finalKey,\n filteredOptions,\n type: typeof filteredOptions\n });\n return {\n ...field,\n selectOptions: []\n };\n }\n\n // console.log('✅ [RepeatGroupDynamicFiltering] Options filtrées:', {\n // fieldName: field.fieldName,\n // index,\n // dependentValue,\n // finalKey,\n // optionsCount: filteredOptions.length,\n // options: filteredOptions.map(opt => opt.value)\n // });\n\n return {\n ...field,\n selectOptions: filteredOptions\n };\n }, [getTempFieldValue, repeatGroupName]);\n\n // Fonction pour appliquer le filtrage à tous les champs du repeatGroup\n const applyFiltersToRepeatGroupFields = useCallback((fields: FormField[], formValues: Record<string, any>, index: number, getValuesFn?: () => Record<string, any>): FormField[] => {\n return fields.map(field => applyRepeatGroupDynamicFilter(field, formValues, index, getValuesFn));\n }, [applyRepeatGroupDynamicFilter]);\n\n // Surveiller les changements dans le formulaire\n useEffect(() => {\n // 🆕 Initialiser les valeurs précédentes avec les valeurs actuelles\n const initialValues = watch();\n previousValuesRef.current = { ...initialValues };\n \n const subscription = watch((formValues, { name: changedFieldName }) => {\n // 🆕 Filtrer les clés du formulaire pour ce repeatGroup\n const relevantKeys = Object.keys(formValues).filter(k => k.startsWith(`${repeatGroupName}_`) && k.endsWith(`_${index}`));\n const relevantValues = relevantKeys.reduce((acc, key) => {\n acc[key] = formValues[key];\n return acc;\n }, {} as Record<string, any>);\n \n // console.log('👁️ [RepeatGroupDynamicFiltering] Changement détecté dans le repeatGroup:', repeatGroupName, 'index:', index, { \n // changedFieldName,\n // relevantValues,\n // allRelevantKeys: relevantKeys\n // });\n \n // 🆕 D'abord appliquer le filtrage avec les nouvelles valeurs\n // Utiliser requestAnimationFrame + setTimeout pour s'assurer que React a bien mis à jour les valeurs\n // après un setValue de react-hook-form\n requestAnimationFrame(() => {\n // 🆕 Utiliser un petit setTimeout en plus pour garantir que setValue est complètement terminé\n // Cela résout le problème où watch() se déclenche avant que setValue ne soit terminé\n setTimeout(() => {\n // 🆕 LOGIQUE SPÉCIFIQUE AUX REPEATGROUPS\n // Pour les RepeatGroups, utiliser getValues() dans le setTimeout pour récupérer les valeurs les plus récentes\n // Le problème: watch() peut être appelé avant que React Hook Form n'ait mis à jour la valeur après setValue()\n // Solution: utiliser getValues() qui récupère la valeur au moment de l'appel, pas au moment de la souscription\n // Cette logique est différente de useSectionDynamicFiltering qui utilise formValues directement\n \n // 🆕 Utiliser getValues() pour récupérer les valeurs les plus récentes au moment du filtrage\n // Cela résout le problème de timing où watch() peut être obsolète\n const currentFormValues = getValues();\n const updatedFields = applyFiltersToRepeatGroupFields(repeatGroupFields, formValues, index, () => currentFormValues);\n // console.log('📊 [RepeatGroupDynamicFiltering] Champs après filtrage:', updatedFields.map(f => ({\n // fieldName: f.fieldName,\n // hasOptions: !!f.selectOptions?.length,\n // optionsCount: f.selectOptions?.length || 0,\n // hasDynamicFilter: !!f.dynamicFilterRule,\n // dependentField: f.dynamicFilterRule?.dependentFieldName,\n // dependentValue: f.dynamicFilterRule ? getTempFieldValue(formValues, f.dynamicFilterRule.dependentFieldName, index, () => currentFormValues) : undefined\n // })));\n setFilteredRepeatGroupFields(updatedFields);\n }, 10); // Petit délai pour garantir que setValue est terminé\n });\n \n // 🆕 Ensuite, si un champ parent change ou devient vide, réinitialiser les cascades\n // Utiliser setTimeout pour laisser le temps au filtrage de s'appliquer d'abord\n if (changedFieldName) {\n // Vérifier si le champ modifié appartient à ce repeatGroup\n const isInThisRepeatGroup = changedFieldName.startsWith(`${repeatGroupName}_`) && \n changedFieldName.endsWith(`_${index}`);\n \n if (isInThisRepeatGroup) {\n // Extraire le nom de base du champ\n const baseFieldName = changedFieldName.replace(`${repeatGroupName}_`, '').replace(`_${index}`, '');\n const changedField = repeatGroupFields.find(f => f.fieldName === baseFieldName);\n const previousValue = previousValuesRef.current[changedFieldName];\n const currentValue = formValues[changedFieldName];\n \n // console.log('🔍 [RepeatGroupDynamicFiltering] Champ modifié dans ce repeatGroup:', {\n // baseFieldName,\n // changedFieldName,\n // previousValue,\n // currentValue,\n // hasDynamicFilter: !!changedField?.dynamicFilterRule,\n // isParent: changedField && !changedField.dynamicFilterRule\n // });\n \n // Si c'est un champ parent (qui n'a pas de dynamicFilterRule) et que sa valeur a changé\n // 🆕 IMPORTANT: Le filtrage se déclenche toujours (déjà fait plus haut), mais on doit réinitialiser les cascades\n // seulement si la valeur a vraiment changé (pas juste si le watch se déclenche)\n if (changedField && !changedField.dynamicFilterRule) {\n // 🆕 Vérifier si la valeur a vraiment changé (pas juste le watch qui se déclenche)\n const hasValueChanged = previousValue !== currentValue;\n \n if (hasValueChanged) {\n // Si le champ est devenu vide OU si on change d'une valeur à une autre (pas la première sélection)\n // Ne pas réinitialiser si c'est juste la première sélection (previousValue undefined/null et currentValue existe)\n if (!currentValue || (previousValue !== undefined && previousValue !== null && previousValue !== \"\")) {\n // console.log(`🔄 [RepeatGroupDynamicFiltering] Champ parent ${baseFieldName} a changé, réinitialisation cascade`, {\n // previousValue,\n // currentValue,\n // hasValueChanged\n // });\n // Utiliser setTimeout pour laisser le temps au filtrage de s'appliquer\n setTimeout(() => {\n resetCascade(baseFieldName, formValues);\n }, 0);\n } else {\n // console.log(`✅ [RepeatGroupDynamicFiltering] Première sélection du champ parent ${baseFieldName}, pas de réinitialisation`);\n }\n } else {\n // console.log(`ℹ️ [RepeatGroupDynamicFiltering] Champ ${baseFieldName} n'a pas changé (watch déclenché mais valeur identique)`, {\n // previousValue,\n // currentValue\n // });\n }\n }\n \n // Mettre à jour la référence des valeurs précédentes\n previousValuesRef.current = { ...previousValuesRef.current, [changedFieldName]: currentValue };\n } else {\n // 🆕 Même si le champ modifié n'est pas dans ce repeatGroup, on doit quand même réappliquer le filtrage\n // car un changement ailleurs peut affecter les dépendances\n // console.log('🔄 [RepeatGroupDynamicFiltering] Changement détecté ailleurs, réapplication du filtrage pour ce repeatGroup');\n }\n }\n });\n\n return () => subscription.unsubscribe();\n }, [watch, getValues, repeatGroupFields, repeatGroupName, index, applyFiltersToRepeatGroupFields, resetCascade, getTempFieldValue, getTempFieldName]);\n\n return filteredRepeatGroupFields;\n}; ","import { useFormContext } from \"react-hook-form\";\nimport { useFormStore } from \"../../store/useFormStore\";\nimport { useCallback, useEffect } from \"react\";\nimport { normalizeFormData } from \"../../types/repeatRules\";\nimport type { Section } from \"../../types/formTypeStructure\";\n\n\n\n\nconst FormSyncComponent: React.FC<{\n formId: string;\n sections: Section[];\n}> = ({ formId, sections }) => {\n const { watch } = useFormContext();\n const setAllFormValues = useFormStore(state => state.setAllFormValues);\n\n const syncFormData = useCallback((data: Record<string, any>) => {\n const normalizedData = normalizeFormData(data, sections);\n setAllFormValues(formId, normalizedData);\n }, [formId, sections, setAllFormValues]);\n\n useEffect(() => {\n const subscription = watch(syncFormData);\n // console.log(JSON.stringify(syncFormData), null, 2); // Debugging output\n // Initial sync when the component mounts\n return () => subscription.unsubscribe();\n }, [watch, syncFormData]);\n\n return null;\n};\n\nexport default FormSyncComponent;","import React, { forwardRef } from 'react';\n\ninterface PContentProps extends React.HTMLAttributes<HTMLParagraphElement> {\n children: React.ReactNode;\n}\n\nconst PContent = forwardRef<HTMLParagraphElement, PContentProps>(\n ({ children, className, ...props }, ref) => (\n <p ref={ref} className={className} {...props}>\n {children}\n </p>\n )\n);\n\nPContent.displayName = 'PContent';\nexport default PContent;\n","import React from 'react';\nimport PContent from '../internal/text/PContent';\nimport type { ProgressBarType, Section } from '../types/formTypeStructure';\n\ninterface FormProgressBarProps {\n currentStep: number;\n totalSteps: number;\n progressBarType?: ProgressBarType;\n sections?: Section[];\n sectionVisibility?: boolean[];\n currentSectionIndex?: number;\n}\n\n// Sous-composant pour default_step (comportement actuel)\nconst DefaultStepProgressBar: React.FC<{ currentStep: number; totalSteps: number }> = ({ currentStep, totalSteps }) => {\n const progress = (currentStep / totalSteps) * 100;\n\n return (\n <div className=\"mt-4 w-full max-w-4xl mb-4\">\n <div className=\"h-2 bg-gray-200 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-secondary transition-all duration-500\"\n style={{ width: `${progress}%` }}\n />\n </div>\n <PContent className=\"text-right font-semibold text-xs text-gray-500 mt-1\">\n Étape {currentStep} / {totalSteps}\n </PContent>\n </div>\n );\n};\n\n// Sous-composant pour linear (barre simple sans texte)\nconst LinearProgressBar: React.FC<{ currentStep: number; totalSteps: number }> = ({ currentStep, totalSteps }) => {\n const progress = (currentStep / totalSteps) * 100;\n\n return (\n <div className=\"mt-4 w-full max-w-4xl mb-4\">\n <div className=\"h-2 bg-gray-200 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-secondary transition-all duration-500\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n );\n};\n\n// Sous-composant pour pastel (barre segmentée avec bordures arrondies)\nconst PastelProgressBar: React.FC<{ currentStep: number; totalSteps: number }> = ({ currentStep, totalSteps }) => {\n return (\n <div className=\"mt-4 w-full max-w-4xl mb-4\">\n <div className=\"flex items-center gap-1.5\">\n {Array.from({ length: totalSteps }, (_, index) => {\n const stepNumber = index + 1;\n const isCompleted = stepNumber < currentStep;\n const isActive = stepNumber === currentStep;\n const isUpcoming = stepNumber > currentStep;\n\n return (\n <div\n key={stepNumber}\n className={`\n flex-1 h-3 rounded-full transition-all duration-500\n ${isCompleted \n ? 'bg-pink-300' \n : isActive \n ? 'bg-pink-400 ring-2 ring-pink-200 ring-offset-1' \n : 'bg-pink-100'\n }\n `}\n style={{\n minWidth: '20px',\n }}\n />\n );\n })}\n </div>\n <PContent className=\"text-right font-semibold text-xs text-pink-600 mt-1\">\n Étape {currentStep} / {totalSteps}\n </PContent>\n </div>\n );\n};\n\n// Sous-composant pour custom\nconst CustomProgressBar: React.FC<{ \n currentStep: number; \n totalSteps: number; \n colors?: { background: string; foreground: string } \n}> = ({ currentStep, totalSteps, colors }) => {\n const progress = (currentStep / totalSteps) * 100;\n \n // Si colors n'est pas défini, utiliser les couleurs par défaut\n const backgroundColor = colors?.background || '#e5e7eb'; // gray-200\n const foregroundColor = colors?.foreground || '#008080'; // secondary\n\n return (\n <div className=\"mt-4 w-full max-w-4xl mb-4\">\n <div \n className=\"h-2 rounded-full overflow-hidden\"\n style={{ backgroundColor }}\n >\n <div\n className=\"h-full transition-all duration-500\"\n style={{ \n width: `${progress}%`,\n backgroundColor: foregroundColor\n }}\n />\n </div>\n <PContent className=\"text-right font-semibold text-xs text-gray-500 mt-1\">\n Étape {currentStep} / {totalSteps}\n </PContent>\n </div>\n );\n};\n\n// Sous-composant pour section_bubble\nconst SectionBubbleProgressBar: React.FC<{ \n sections: Section[];\n sectionVisibility?: boolean[];\n currentSectionIndex: number;\n}> = ({ sections, sectionVisibility, currentSectionIndex }) => {\n // Filtrer les sections visibles en gardant leur index original\n const visibleSectionsWithIndex = sections\n .map((section, index) => ({ section, originalIndex: index }))\n .filter(({ originalIndex }) => \n !sectionVisibility || sectionVisibility[originalIndex]\n );\n \n const visibleSections = visibleSectionsWithIndex.map(item => item.section);\n \n // Trouver l'index de la section actuelle parmi les sections visibles\n const visibleSectionIndex = visibleSectionsWithIndex.findIndex(\n ({ originalIndex }) => originalIndex === currentSectionIndex\n );\n \n // Si la section actuelle n'est pas visible, utiliser le premier index visible\n const currentVisibleIndex = visibleSectionIndex >= 0 ? visibleSectionIndex : 0;\n\n return (\n <div className=\"mt-4 w-full max-w-4xl mb-4\">\n <div className=\"flex items-center justify-center\">\n {visibleSections.map((section, index) => {\n const isCompleted = index < currentVisibleIndex;\n const isActive = index === currentVisibleIndex;\n const isUpcoming = index > currentVisibleIndex;\n\n return (\n <React.Fragment key={section.sectionId || index}>\n {/* Bulle de section */}\n <div className=\"flex items-center\">\n <div\n className={`\n w-10 h-10 rounded-full flex items-center justify-center font-semibold text-sm\n transition-all duration-300 z-10 relative\n ${isCompleted \n ? 'bg-secondary text-white' \n : isActive \n ? 'border-4 border-secondary bg-white text-secondary' \n : 'border-2 border-gray-300 bg-white text-gray-400'\n }\n `}\n >\n {index + 1}\n </div>\n {/* Ligne de connexion */}\n {index < visibleSections.length - 1 && (\n <div \n className={`\n h-1 w-16 transition-all duration-500 -mx-1\n ${index < currentVisibleIndex \n ? 'bg-secondary' \n : 'bg-gray-200'\n }\n `}\n />\n )}\n </div>\n </React.Fragment>\n );\n })}\n </div>\n <PContent className=\"text-center font-semibold text-xs text-gray-500 mt-2\">\n Section {currentVisibleIndex + 1} / {visibleSections.length}\n </PContent>\n </div>\n );\n};\n\n// Sous-composant pour section_bubble_pastel\nconst SectionBubblePastelProgressBar: React.FC<{ \n sections: Section[];\n sectionVisibility?: boolean[];\n currentSectionIndex: number;\n}> = ({ sections, sectionVisibility, currentSectionIndex }) => {\n // Filtrer les sections visibles en gardant leur index original\n const visibleSectionsWithIndex = sections\n .map((section, index) => ({ section, originalIndex: index }))\n .filter(({ originalIndex }) => \n !sectionVisibility || sectionVisibility[originalIndex]\n );\n \n const visibleSections = visibleSectionsWithIndex.map(item => item.section);\n \n // Trouver l'index de la section actuelle parmi les sections visibles\n const visibleSectionIndex = visibleSectionsWithIndex.findIndex(\n ({ originalIndex }) => originalIndex === currentSectionIndex\n );\n \n // Si la section actuelle n'est pas visible, utiliser le premier index visible\n const currentVisibleIndex = visibleSectionIndex >= 0 ? visibleSectionIndex : 0;\n\n return (\n <div className=\"mt-4 w-full max-w-4xl mb-4\">\n <div className=\"flex items-center justify-center\">\n {visibleSections.map((section, index) => {\n const isCompleted = index < currentVisibleIndex;\n const isActive = index === currentVisibleIndex;\n const isUpcoming = index > currentVisibleIndex;\n\n return (\n <React.Fragment key={section.sectionId || index}>\n {/* Bulle de section */}\n <div className=\"flex items-center\">\n <div\n className={`\n w-10 h-10 rounded-full flex items-center justify-center font-semibold text-sm\n transition-all duration-300 z-10 relative\n ${isCompleted \n ? 'bg-pink-300 text-white' \n : isActive \n ? 'border-4 border-pink-400 bg-white text-pink-400' \n : 'border-2 border-pink-200 bg-white text-pink-300'\n }\n `}\n >\n {index + 1}\n </div>\n {/* Ligne de connexion */}\n {index < visibleSections.length - 1 && (\n <div \n className={`\n h-1 w-16 transition-all duration-500 -mx-1\n ${index < currentVisibleIndex \n ? 'bg-pink-300' \n : 'bg-pink-100'\n }\n `}\n />\n )}\n </div>\n </React.Fragment>\n );\n })}\n </div>\n <PContent className=\"text-center font-semibold text-xs text-pink-600 mt-2\">\n Section {currentVisibleIndex + 1} / {visibleSections.length}\n </PContent>\n </div>\n );\n};\n\nconst FormProgressBar: React.FC<FormProgressBarProps> = ({ \n currentStep, \n totalSteps,\n progressBarType,\n sections,\n sectionVisibility,\n currentSectionIndex\n}) => {\n // Gestion de la visibilité : si visible === false, ne pas rendre le composant\n // On vérifie cela en premier, mais on ne retourne pas null directement\n // pour éviter les problèmes avec les hooks React\n const shouldRender = progressBarType?.visible !== false;\n\n // Si progressBarType n'est pas défini, utiliser default_step\n const type = progressBarType?.type || 'default_step';\n\n // Pour les types section_bubble, on a besoin de sections et currentSectionIndex\n // Si les données ne sont pas disponibles, fallback sur default_step\n const effectiveType = (type === 'section_bubble' || type === 'section_bubble_pastel') \n && (!sections || sections.length === 0 || currentSectionIndex === undefined)\n ? 'default_step'\n : type;\n\n // Si visible === false, retourner un div vide avec display: none\n // pour éviter les problèmes avec les hooks React\n if (!shouldRender) {\n return <div style={{ display: 'none' }} />;\n }\n\n // Rendu selon le type\n switch (effectiveType) {\n case 'default_step':\n return <DefaultStepProgressBar currentStep={currentStep} totalSteps={totalSteps} />;\n \n case 'linear':\n return <LinearProgressBar currentStep={currentStep} totalSteps={totalSteps} />;\n \n case 'pastel':\n return <PastelProgressBar currentStep={currentStep} totalSteps={totalSteps} />;\n \n case 'custom':\n return (\n <CustomProgressBar \n currentStep={currentStep} \n totalSteps={totalSteps} \n colors={progressBarType?.colors}\n />\n );\n \n case 'section_bubble':\n return (\n <SectionBubbleProgressBar \n sections={sections!}\n sectionVisibility={sectionVisibility}\n currentSectionIndex={currentSectionIndex!}\n />\n );\n \n case 'section_bubble_pastel':\n return (\n <SectionBubblePastelProgressBar \n sections={sections!}\n sectionVisibility={sectionVisibility}\n currentSectionIndex={currentSectionIndex!}\n />\n );\n \n default:\n return <DefaultStepProgressBar currentStep={currentStep} totalSteps={totalSteps} />;\n }\n};\n\nexport default FormProgressBar;\n","import React from 'react';\nimport { getLocalizedText } from '../FormFieldWrapper';\nimport type { FormStructure, HeaderOptions } from '../types/formTypeStructure';\n\ninterface FormHeaderProps {\n form: FormStructure;\n currentLang: string;\n headerOptions?: HeaderOptions;\n}\n\nconst FormHeader: React.FC<FormHeaderProps> = ({ form, currentLang, headerOptions }) => {\n // Gestion de la visibilité : si visible === false, ne pas rendre le composant\n if (headerOptions?.visible === false) {\n return null;\n }\n\n // Si type === \"custom\" et customHeader est défini, rendre le composant personnalisé\n if (headerOptions?.type === \"custom\" && headerOptions?.customHeader) {\n return <>{headerOptions.customHeader}</>;\n }\n\n // Header par défaut (comportement actuel)\n return (\n <div\n className=\"mb-8 p-6 text-white rounded-lg shadow-lg w-full max-w-4xl\"\n style={{ backgroundColor: \"var(--fe-primary)\" }}\n >\n <h1 className=\"text-3xl font-bold mb-2\">\n {getLocalizedText(form.name, currentLang)}\n </h1>\n <p className=\"text-white/80 mb-2\">\n {getLocalizedText(form.description, currentLang)}\n </p>\n <div className=\"flex flex-wrap gap-4 text-sm\">\n <span className=\"bg-white bg-opacity-20 px-2 py-1 rounded\">\n Fournisseur: {form.provider}\n </span>\n <span className=\"bg-white bg-opacity-20 px-2 py-1 rounded\">\n Statut: {form.status}\n </span>\n {form.version && (\n <span className=\"bg-white bg-opacity-20 px-2 py-1 rounded\">\n Version: {form.version}\n </span>\n )}\n </div>\n </div>\n );\n};\n\nexport default FormHeader;","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { useEffect, useState } from \"react\";\n\nconst WIDTH_MOBILE = 120;\nconst SCREEN_MOBILE = 320;\nconst WIDTH_DESKTOP = 233;\nconst SCREEN_DESKTOP = 2560;\n\nexport function useButtonSize() {\n const [width, setWidth] = useState(120);\n const [height, setHeight] = useState(36);\n const [borderRadius, setBorderRadius] = useState(16);\n const [pressed, setPressed] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const update = () => {\n const sw = window.innerWidth;\n const a = (WIDTH_DESKTOP - WIDTH_MOBILE) / (SCREEN_DESKTOP - SCREEN_MOBILE);\n const b = WIDTH_MOBILE - a * SCREEN_MOBILE;\n const w = a * sw + b;\n const h = w * 0.3;\n setWidth(w);\n setHeight(h);\n setBorderRadius(h * (30 / 66));\n setIsMobile(sw < 1024);\n };\n update();\n window.addEventListener(\"resize\", update);\n return () => window.removeEventListener(\"resize\", update);\n }, []);\n\n const transform = pressed\n ? \"scale(0.95)\"\n : isHovered && !isMobile\n ? \"scale(1.02)\"\n : \"scale(1)\";\n\n const handlers = {\n onMouseDown: () => setPressed(true),\n onMouseUp: () => setPressed(false),\n onMouseEnter: () => setIsHovered(true),\n onMouseLeave: () => {\n setPressed(false);\n setIsHovered(false);\n },\n onTouchStart: () => isMobile && setPressed(true),\n onTouchEnd: () => isMobile && setPressed(false),\n };\n\n return { width, height, borderRadius, pressed, isHovered, isMobile, transform, handlers };\n}\n","import React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useButtonSize } from \"./useButtonSize\";\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\nconst ValidationBtn: React.FC<ButtonProps> = ({ children, className, onClick, ...props }) => {\n const { width, height, borderRadius, pressed, isMobile, transform, handlers } = useButtonSize();\n\n const content = (\n <span className=\"inline-flex items-center justify-center gap-2 text-white font-medium text-sm\">\n {children}\n </span>\n );\n\n return (\n <button\n style={{\n width: `${width}px`,\n height: `${height}px`,\n borderRadius: `${borderRadius}px`,\n backgroundColor: \"var(--fe-primary)\",\n transform,\n transition: \"transform 0.2s ease, opacity 0.15s ease\",\n userSelect: \"none\",\n WebkitTapHighlightColor: \"transparent\",\n }}\n className={cn(\n \"inline-flex items-center justify-center px-6\",\n \"text-sm font-medium whitespace-nowrap\",\n \"shadow-sm\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--fe-primary)] focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"cursor-pointer overflow-hidden relative group\",\n \"hover:opacity-90\",\n className\n )}\n {...handlers}\n onClick={onClick}\n {...props}\n >\n <span className=\"relative overflow-hidden w-full h-full flex items-center justify-center\">\n <span\n className={cn(\n \"flex items-center justify-center transition-transform duration-300 w-full h-full\",\n !isMobile && \"group-hover:translate-x-full\"\n )}\n style={isMobile ? { transform: pressed ? \"translateX(100%)\" : \"translateX(0)\" } : {}}\n >\n {content}\n </span>\n <span\n className={cn(\n \"flex items-center justify-center absolute top-0 w-full h-full transition-transform duration-300\",\n !isMobile && \"group-hover:translate-x-[100%]\"\n )}\n style={{\n left: \"-100%\",\n ...(isMobile ? { transform: pressed ? \"translateX(100%)\" : \"translateX(0)\" } : {}),\n }}\n >\n {content}\n </span>\n </span>\n </button>\n );\n};\n\nexport default ValidationBtn;\n","import { useState } from \"react\";\n\nconst ButtonTooltip: React.FC<{\n content: string;\n children: React.ReactNode;\n}> = ({ content, children }) => {\n const [isVisible, setIsVisible] = useState(false);\n\n if (!content.trim()) return <>{children}</>;\n\n return (\n <div\n className=\"relative inline-block\"\n onMouseEnter={() => setIsVisible(true)}\n onMouseLeave={() => setIsVisible(false)}\n onFocus={() => setIsVisible(true)}\n onBlur={() => setIsVisible(false)}\n >\n {children}\n\n {isVisible && (\n <div\n role=\"tooltip\"\n className=\"absolute bottom-full left-1/2 transform -translate-x-1/2 mb-2 px-3 py-1.5 text-xs font-medium text-white bg-gray-900 rounded-md shadow-lg whitespace-nowrap\"\n style={{\n animation: 'fadeIn 0.15s ease-out'\n }}\n >\n {content}\n {/* Flèche pointant vers le bas */}\n <div className=\"absolute top-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-t-4 border-t-gray-900 border-l-4 border-l-transparent border-r-4 border-r-transparent\" />\n </div>\n )}\n\n <style>{`\n @keyframes fadeIn {\n from { \n opacity: 0; \n transform: translate(-50%, 4px) scale(0.96);\n }\n to { \n opacity: 1; \n transform: translate(-50%, 0) scale(1);\n }\n }\n `}</style>\n </div>\n );\n};\n\nexport default ButtonTooltip;\n\n","import * as React from \"react\";\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\";\nimport { cn } from \"../../lib/utils\";\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitive.Root\n className={cn(\n \"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent\",\n \"transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--fe-primary)] focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=unchecked]:bg-slate-200 data-[state=checked]:bg-[var(--fe-primary)]\",\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitive.Thumb\n className={cn(\n \"pointer-events-none block h-5 w-5 rounded-full bg-white shadow-md ring-0 transition-transform\",\n \"data-[state=unchecked]:translate-x-0 data-[state=checked]:translate-x-5\"\n )}\n />\n </SwitchPrimitive.Root>\n));\nSwitch.displayName = SwitchPrimitive.Root.displayName;\n\nexport { Switch };\n","import * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cn } from \"../../lib/utils\";\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(\n \"text-sm font-medium leading-none text-slate-700\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n className\n )}\n {...props}\n />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","import React from \"react\";\nimport { FormFieldWrapper, getLocalizedText } from \"../FormFieldWrapper\";\nimport { Switch } from \"../components/ui/switch\";\nimport { Label } from \"../components/ui/label\";\nimport type { FormField } from \"../types/formTypeStructure\";\nimport { useFormContext } from \"react-hook-form\";\n\ninterface BoolFormField extends FormField {\n fieldType: \"bool\";\n}\n\ninterface BoolFormFieldProps {\n field: BoolFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: boolean;\n className?: string;\n}\n\nconst BoolFormField: React.FC<BoolFormFieldProps> = ({\n field,\n name,\n currentLang = \"fr\",\n className = \"\",\n}) => {\n const { setValue, watch } = useFormContext();\n const fieldName = name ?? field.fieldName.toString();\n const label = getLocalizedText(field.label, currentLang);\n const isRequired = field.validations?.some((v) => v.validationType === \"required\");\n const currentValue = Boolean(watch(fieldName));\n const switchId = `switch-${fieldName}`;\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang} showLabel={false}>\n <div\n className={`flex items-center justify-between rounded-lg border border-slate-200 bg-white px-4 py-3 transition-colors ${\n currentValue ? \"border-teal-200 bg-teal-50/30\" : \"\"\n } ${className}`}\n >\n <Label htmlFor={switchId} className=\"cursor-pointer font-medium text-slate-700 flex-1 pr-4\">\n {label}\n {isRequired && <span className=\"text-red-500 ml-1\">*</span>}\n </Label>\n <Switch\n id={switchId}\n checked={currentValue}\n onCheckedChange={(checked) =>\n setValue(fieldName, checked, { shouldValidate: true, shouldTouch: true })\n }\n />\n </div>\n </FormFieldWrapper>\n );\n};\n\nexport default BoolFormField;\n","import * as React from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer h-4 w-4 shrink-0 rounded-sm border border-slate-300 bg-white\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--fe-primary)] focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=checked]:bg-[var(--fe-primary)] data-[state=checked]:border-[var(--fe-primary)] data-[state=checked]:text-white\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-current\">\n <Check className=\"h-3 w-3 stroke-[3]\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };\n","import React from \"react\";\nimport { FormFieldWrapper, getLocalizedText } from \"../FormFieldWrapper\";\nimport { Checkbox } from \"../components/ui/checkbox\";\nimport { Label } from \"../components/ui/label\";\nimport type { FormField, SelectOption } from \"../types/formTypeStructure\";\nimport { useFormContext } from \"react-hook-form\";\n\ninterface CheckboxFormField extends FormField {\n fieldType: \"checkbox\";\n selectOptions: SelectOption[];\n}\n\ninterface CheckboxFormFieldProps {\n field: CheckboxFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string | string[];\n className?: string;\n}\n\nconst CheckboxFormField: React.FC<CheckboxFormFieldProps> = ({\n field,\n name,\n currentLang = \"fr\",\n className,\n}) => {\n const { watch, setValue } = useFormContext();\n const fieldName = name ?? field.fieldName.toString();\n const selectedValues: string[] = watch(fieldName) || [];\n\n const toggleValue = (optionValue: string, checked: boolean) => {\n const newValues = checked\n ? [...selectedValues, optionValue]\n : selectedValues.filter((v) => v !== optionValue);\n setValue(fieldName, newValues, { shouldValidate: true, shouldTouch: true });\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <div className={`flex flex-col gap-2 ${className || \"\"}`}>\n {field.selectOptions?.map((option, idx) => {\n const inputId = `${fieldName}-${option.value}-${idx}`;\n const isChecked = selectedValues.includes(option.value);\n\n return (\n <div\n key={option.value}\n className=\"flex items-center gap-2 rounded px-2 py-1 hover:bg-teal-50 transition-colors\"\n >\n <Checkbox\n id={inputId}\n checked={isChecked}\n onCheckedChange={(checked) => toggleValue(option.value, !!checked)}\n />\n <Label htmlFor={inputId} className=\"cursor-pointer font-medium text-slate-700\">\n {getLocalizedText(option.label, currentLang)}\n </Label>\n </div>\n );\n })}\n </div>\n </FormFieldWrapper>\n );\n};\n\nexport default CheckboxFormField;\n","import * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { cn } from \"../../lib/utils\";\n\nconst Popover = PopoverPrimitive.Root;\nconst PopoverTrigger = PopoverPrimitive.Trigger;\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"start\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-auto rounded-md border border-slate-200 bg-white p-0 shadow-md outline-none\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };\n","import * as React from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\ninterface CalendarProps {\n value?: Date | null;\n onChange: (date: Date) => void;\n currentLang?: string;\n className?: string;\n}\n\nconst MONTHS_FR = [\n \"Janvier\", \"Février\", \"Mars\", \"Avril\", \"Mai\", \"Juin\",\n \"Juillet\", \"Août\", \"Septembre\", \"Octobre\", \"Novembre\", \"Décembre\",\n];\nconst MONTHS_EN = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n];\nconst DAYS_FR = [\"Dim\", \"Lun\", \"Mar\", \"Mer\", \"Jeu\", \"Ven\", \"Sam\"];\nconst DAYS_EN = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\nfunction getDaysInMonth(date: Date): Date[] {\n const year = date.getFullYear();\n const month = date.getMonth();\n const firstDay = new Date(year, month, 1);\n const start = new Date(firstDay);\n start.setDate(start.getDate() - firstDay.getDay());\n const days: Date[] = [];\n for (let i = 0; i < 42; i++) {\n const d = new Date(start);\n d.setDate(start.getDate() + i);\n days.push(d);\n }\n return days;\n}\n\nconst Calendar: React.FC<CalendarProps> = ({\n value,\n onChange,\n currentLang = \"fr\",\n className,\n}) => {\n const [currentMonth, setCurrentMonth] = React.useState(value ?? new Date());\n\n const months = currentLang === \"fr\" ? MONTHS_FR : MONTHS_EN;\n const daysOfWeek = currentLang === \"fr\" ? DAYS_FR : DAYS_EN;\n const todayLabel = currentLang === \"fr\" ? \"Aujourd'hui\" : \"Today\";\n\n const navigate = (dir: \"prev\" | \"next\") => {\n setCurrentMonth((prev) => {\n const d = new Date(prev);\n d.setMonth(prev.getMonth() + (dir === \"next\" ? 1 : -1));\n return d;\n });\n };\n\n const today = new Date();\n const todayStr = today.toDateString();\n const selectedStr = value?.toDateString();\n\n return (\n <div className={cn(\"w-72 select-none\", className)}>\n {/* Header */}\n <div className=\"flex items-center justify-between px-3 py-2 bg-[var(--fe-primary-light)] border-b border-slate-100\">\n <button\n type=\"button\"\n onClick={() => navigate(\"prev\")}\n className=\"p-1.5 rounded-md hover:bg-white/70 transition-colors text-[var(--fe-primary-dark)]\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <span className=\"text-sm font-semibold text-[var(--fe-primary-dark)]\">\n {months[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </span>\n <button\n type=\"button\"\n onClick={() => navigate(\"next\")}\n className=\"p-1.5 rounded-md hover:bg-white/70 transition-colors text-[var(--fe-primary-dark)]\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Weekday labels */}\n <div className=\"grid grid-cols-7 bg-slate-50 border-b border-slate-100\">\n {daysOfWeek.map((d) => (\n <div key={d} className=\"py-2 text-center text-xs font-medium text-slate-500\">\n {d}\n </div>\n ))}\n </div>\n\n {/* Days grid */}\n <div className=\"grid grid-cols-7 p-2 gap-0.5\">\n {getDaysInMonth(currentMonth).map((date, i) => {\n const isCurrentMonth = date.getMonth() === currentMonth.getMonth();\n const isToday = date.toDateString() === todayStr;\n const isSelected = selectedStr && date.toDateString() === selectedStr;\n\n return (\n <button\n key={i}\n type=\"button\"\n onClick={() => onChange(date)}\n className={cn(\n \"h-8 w-8 mx-auto flex items-center justify-center text-sm rounded-md transition-all\",\n !isCurrentMonth && \"text-slate-300\",\n isCurrentMonth && !isSelected && !isToday && \"text-slate-700 hover:bg-slate-100\",\n isToday && !isSelected && \"bg-blue-500 text-white font-semibold\",\n isSelected && \"bg-[var(--fe-primary)] text-white font-semibold shadow-sm\",\n )}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n\n {/* Footer */}\n <div className=\"border-t border-slate-100 p-2\">\n <button\n type=\"button\"\n onClick={() => {\n const t = new Date();\n setCurrentMonth(t);\n onChange(t);\n }}\n className=\"w-full text-sm font-medium py-1.5 px-3 rounded-md transition-colors text-[var(--fe-primary)] hover:bg-[var(--fe-primary-light)]\"\n >\n {todayLabel}\n </button>\n </div>\n </div>\n );\n};\n\nexport { Calendar };\n","import React, { useState } from \"react\";\nimport { CalendarIcon, ChevronDown } from \"lucide-react\";\nimport { FormFieldWrapper } from \"../FormFieldWrapper\";\nimport { Popover, PopoverTrigger, PopoverContent } from \"../components/ui/popover\";\nimport { Calendar } from \"../components/ui/calendar\";\nimport { cn } from \"../lib/utils\";\nimport type { FormField } from \"../types/formTypeStructure\";\nimport { useFormContext } from \"react-hook-form\";\n\ninterface DateFormField extends FormField {\n fieldType: \"date\";\n}\n\ninterface DateFormFieldProps {\n field: DateFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string;\n className?: string;\n}\n\nconst formatDate = (date: Date, lang: string): string =>\n date.toLocaleDateString(lang === \"fr\" ? \"fr-FR\" : \"en-US\", {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n });\n\nconst DateFormField: React.FC<DateFormFieldProps> = ({\n field,\n name,\n defaultValue,\n currentLang = \"fr\",\n className,\n}) => {\n const { register, setValue } = useFormContext();\n const fieldName = name ?? field.fieldName.toString();\n\n const [open, setOpen] = useState(false);\n const [selectedDate, setSelectedDate] = useState<Date | null>(\n defaultValue ? new Date(defaultValue) : null\n );\n\n const handleSelect = (date: Date) => {\n setSelectedDate(date);\n setValue(fieldName, date.toISOString().split(\"T\")[0], {\n shouldValidate: true,\n shouldTouch: true,\n });\n setOpen(false);\n };\n\n const placeholder = currentLang === \"fr\" ? \"Sélectionner une date\" : \"Select a date\";\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <input type=\"hidden\" {...register(fieldName)} />\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-slate-200 bg-white px-3 py-2\",\n \"text-sm transition-colors\",\n \"focus:outline-none focus:ring-2 focus:ring-[var(--fe-primary)] focus:ring-offset-1 focus:border-[var(--fe-primary)]\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n open && \"border-[var(--fe-primary)] ring-2 ring-[var(--fe-primary)] ring-offset-1\",\n selectedDate ? \"text-slate-900\" : \"text-slate-400\",\n className\n )}\n >\n <span className=\"flex items-center gap-2\">\n <CalendarIcon className=\"h-4 w-4 text-slate-400 shrink-0\" />\n {selectedDate ? formatDate(selectedDate, currentLang) : placeholder}\n </span>\n <ChevronDown\n className={cn(\n \"h-4 w-4 text-slate-400 shrink-0 transition-transform\",\n open && \"rotate-180\"\n )}\n />\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"p-0 overflow-hidden\">\n <Calendar\n value={selectedDate}\n onChange={handleSelect}\n currentLang={currentLang}\n />\n </PopoverContent>\n </Popover>\n </FormFieldWrapper>\n );\n};\n\nexport default DateFormField;\n","import * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-slate-200 bg-white px-3 py-2\",\n \"text-sm text-slate-900 placeholder:text-slate-400\",\n \"focus:outline-none focus:ring-2 focus:ring-[var(--fe-primary)] focus:ring-offset-1 focus:border-[var(--fe-primary)]\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"transition-colors [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 text-slate-400 shrink-0 ml-2\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 min-w-[8rem] overflow-hidden rounded-md border border-slate-200 bg-white text-slate-900 shadow-lg\",\n position === \"popper\" && \"w-[var(--radix-select-trigger-width)] max-h-64\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectPrimitive.Viewport className=\"p-1\">\n {children}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-xs font-semibold text-slate-500\", className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm text-slate-700\",\n \"outline-none focus:bg-[var(--fe-primary-light)] focus:text-[var(--fe-primary-dark)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"data-[state=checked]:text-[var(--fe-primary)] data-[state=checked]:font-medium\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4 text-[var(--fe-primary)]\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-slate-100\", className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select, SelectGroup, SelectValue,\n SelectTrigger, SelectContent, SelectLabel,\n SelectItem, SelectSeparator,\n};\n","import * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900\",\n \"placeholder:text-slate-400\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--fe-primary)] focus-visible:ring-offset-1 focus-visible:border-[var(--fe-primary)]\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"transition-colors\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","import React, { useState, useRef, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronDown } from \"lucide-react\";\nimport { FormFieldWrapper, getLocalizedText } from \"../FormFieldWrapper\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../components/ui/select\";\nimport { Input } from \"../components/ui/input\";\nimport { cn } from \"../lib/utils\";\nimport type { FormField, SelectOption } from \"../types/formTypeStructure\";\nimport { useFormContext } from \"react-hook-form\";\n\ninterface DropdownFormField extends FormField {\n fieldType: \"dropdown\";\n selectOptions: SelectOption[];\n enableSearch?: boolean;\n}\n\ninterface DropdownFormFieldProps {\n field: DropdownFormField;\n name?: string;\n defaultValue?: string;\n currentLang?: string;\n className?: string;\n dependentFieldNameTransformed?: string;\n}\n\nconst createSlug = (text: string): string =>\n text\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[̀-ͯ]/g, \"\")\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .trim()\n .replace(/^-+|-+$/g, \"\");\n\nconst DropdownFormField: React.FC<DropdownFormFieldProps> = ({\n field,\n name,\n defaultValue,\n currentLang = \"fr\",\n className,\n dependentFieldNameTransformed,\n}) => {\n const { setValue, watch, getValues } = useFormContext();\n const fieldName = name ?? field.fieldName.toString();\n const currentValue = watch(fieldName);\n\n const dependentFieldNameToWatch = field.dynamicFilterRule\n ? dependentFieldNameTransformed || field.dynamicFilterRule.dependentFieldName\n : null;\n const dependentValueFromWatch = dependentFieldNameToWatch\n ? watch(dependentFieldNameToWatch)\n : null;\n const dependentValueFromGetValues = dependentFieldNameToWatch\n ? getValues(dependentFieldNameToWatch)\n : null;\n const dependentValue =\n dependentValueFromWatch != null && dependentValueFromWatch !== \"\"\n ? dependentValueFromWatch\n : dependentValueFromGetValues != null && dependentValueFromGetValues !== \"\"\n ? dependentValueFromGetValues\n : null;\n\n const isDisabled =\n field.dynamicFilterRule && (!dependentValue || !field.selectOptions?.length);\n\n const placeholder = getLocalizedText(field.placeholder, currentLang);\n const label = getLocalizedText(field.label, currentLang);\n const effectivePlaceholder =\n isDisabled && field.dynamicFilterRule\n ? \"Sélectionnez d'abord le champ précédent\"\n : placeholder || `Sélectionner ${label}`;\n\n // ── Search mode state ──────────────────────────────────────────────────────\n const [isOpen, setIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [filteredOptions, setFilteredOptions] = useState(field.selectOptions || []);\n const [selectedOption, setSelectedOption] = useState<SelectOption | null>(null);\n const [hoveredOptionIndex, setHoveredOptionIndex] = useState<number | null>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{\n top: number;\n left: number;\n width: number;\n } | null>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (defaultValue) {\n const option = field.selectOptions?.find((opt) => opt.value === defaultValue);\n if (option) {\n setSelectedOption(option);\n setSearchQuery(getLocalizedText(option.label, currentLang));\n }\n }\n }, [defaultValue, field.selectOptions, currentLang]);\n\n useEffect(() => {\n if (currentValue && currentValue !== selectedOption?.value) {\n const option = field.selectOptions?.find((opt) => opt.value === currentValue);\n if (option) {\n setSelectedOption(option);\n setSearchQuery(getLocalizedText(option.label, currentLang));\n }\n } else if (!currentValue && selectedOption) {\n setSelectedOption(null);\n setSearchQuery(\"\");\n }\n }, [currentValue, field.selectOptions, currentLang, selectedOption]);\n\n const updateDropdownPosition = () => {\n if (!inputRef.current) return;\n const rect = inputRef.current.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n setDropdownPosition({ top: rect.bottom + scrollTop, left: rect.left + scrollLeft, width: rect.width });\n };\n\n useEffect(() => {\n if (isOpen && field.enableSearch) {\n updateDropdownPosition();\n window.addEventListener(\"scroll\", updateDropdownPosition, true);\n window.addEventListener(\"resize\", updateDropdownPosition);\n return () => {\n window.removeEventListener(\"scroll\", updateDropdownPosition, true);\n window.removeEventListener(\"resize\", updateDropdownPosition);\n };\n }\n }, [isOpen, field.enableSearch]);\n\n useEffect(() => {\n if (!field.enableSearch) {\n setFilteredOptions(field.selectOptions || []);\n return;\n }\n if (!searchQuery.trim()) {\n setFilteredOptions(field.selectOptions || []);\n return;\n }\n const querySlug = createSlug(searchQuery);\n setFilteredOptions(\n field.selectOptions?.filter((option) =>\n createSlug(getLocalizedText(option.label, currentLang)).includes(querySlug)\n ) || []\n );\n }, [searchQuery, field.selectOptions, field.enableSearch, currentLang]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (dropdownRef.current?.contains(target)) return;\n if (field.enableSearch && isOpen) {\n const portalDropdown = document.querySelector('[data-dropdown-portal=\"true\"]');\n if (portalDropdown?.contains(target)) return;\n }\n setIsOpen(false);\n setHoveredOptionIndex(null);\n if (selectedOption && field.enableSearch) {\n setSearchQuery(getLocalizedText(selectedOption.label, currentLang));\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [selectedOption, currentLang, field.enableSearch, isOpen]);\n\n const handleOptionSelect = (option: SelectOption) => {\n setSelectedOption(option);\n setSearchQuery(getLocalizedText(option.label, currentLang));\n setValue(fieldName, option.value, { shouldValidate: true, shouldTouch: true });\n setIsOpen(false);\n setHoveredOptionIndex(null);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setSearchQuery(value);\n if (field.enableSearch) {\n setIsOpen(true);\n setHoveredOptionIndex(null);\n if (!value.trim() && selectedOption) {\n setSelectedOption(null);\n setValue(fieldName, \"\", { shouldValidate: true, shouldTouch: true });\n }\n }\n };\n\n // ── Non-search mode: Radix Select ─────────────────────────────────────────\n if (!field.enableSearch) {\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <Select\n value={currentValue || \"\"}\n onValueChange={(val) =>\n setValue(fieldName, val, { shouldValidate: true, shouldTouch: true })\n }\n disabled={!!isDisabled}\n >\n <SelectTrigger className={cn(\"w-full\", className)}>\n <SelectValue placeholder={effectivePlaceholder} />\n </SelectTrigger>\n <SelectContent>\n {field.selectOptions?.map((option, index) => (\n <SelectItem key={`${option.value}-${index}`} value={option.value}>\n {getLocalizedText(option.label, currentLang)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </FormFieldWrapper>\n );\n }\n\n // ── Search mode: custom input + portal ────────────────────────────────────\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <div ref={dropdownRef} className=\"relative\">\n <Input\n ref={inputRef}\n type=\"text\"\n value={searchQuery}\n onChange={handleInputChange}\n onClick={() => {\n if (isDisabled) return;\n setIsOpen((v) => !v);\n if (selectedOption && !isOpen) setSearchQuery(\"\");\n }}\n onKeyDown={(e) => {\n if (isDisabled) return;\n if (e.key === \"Escape\") {\n setIsOpen(false);\n if (selectedOption) setSearchQuery(getLocalizedText(selectedOption.label, currentLang));\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (filteredOptions.length === 1 && filteredOptions[0]) {\n handleOptionSelect(filteredOptions[0]);\n }\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setIsOpen(true);\n }\n }}\n placeholder={effectivePlaceholder}\n autoComplete=\"off\"\n disabled={!!isDisabled}\n className={cn(\"pr-10\", className)}\n />\n <ChevronDown\n className={cn(\n \"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 text-slate-400 pointer-events-none transition-transform\",\n isOpen && \"rotate-180\"\n )}\n />\n\n {isOpen && dropdownPosition &&\n createPortal(\n <div\n data-dropdown-portal=\"true\"\n style={{\n position: \"absolute\",\n top: dropdownPosition.top,\n left: dropdownPosition.left,\n width: dropdownPosition.width,\n zIndex: 999999,\n }}\n className=\"rounded-md border border-slate-200 bg-white shadow-lg max-h-52 overflow-y-auto\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n {filteredOptions.length === 0 ? (\n <div className=\"px-3 py-2 text-sm text-slate-400 italic\">\n Aucun résultat trouvé\n </div>\n ) : (\n filteredOptions.map((option, index) => (\n <div\n key={`${option.value}-${index}`}\n className={cn(\n \"px-3 py-2 text-sm cursor-pointer border-b border-slate-100 last:border-0 transition-colors\",\n hoveredOptionIndex === index ? \"bg-teal-50 text-teal-800\" : \"text-slate-700\",\n selectedOption?.value === option.value && \"font-medium text-teal-700\"\n )}\n onMouseDown={(e) => {\n if (isDisabled) return;\n e.preventDefault();\n e.stopPropagation();\n handleOptionSelect(option);\n }}\n onMouseEnter={() => setHoveredOptionIndex(index)}\n onMouseLeave={() => setHoveredOptionIndex(null)}\n >\n {getLocalizedText(option.label, currentLang)}\n </div>\n ))\n )}\n </div>,\n document.body\n )}\n </div>\n </FormFieldWrapper>\n );\n};\n\nexport default DropdownFormField;\n","export const extractFileNameFromUrl = (\n value?: string | null\n): string | undefined => {\n if (!value) {\n return undefined;\n }\n\n const decodeSafe = (input: string): string => {\n try {\n return decodeURIComponent(input);\n } catch {\n return input;\n }\n };\n\n const extractFromPath = (input: string): string | undefined => {\n const sanitized = input.split(\"?\")[0];\n const segments = sanitized.split(/[\\\\/]/).filter(Boolean);\n if (segments.length === 0) {\n return sanitized ? decodeSafe(sanitized) : undefined;\n }\n return decodeSafe(segments[segments.length - 1]);\n };\n\n try {\n const url = new URL(value);\n const candidateParamKeys = [\"filename\", \"file\", \"file_name\", \"name\"];\n\n for (const key of candidateParamKeys) {\n const paramValue = url.searchParams.get(key);\n if (paramValue) {\n const normalized = paramValue.split(\"/\").filter(Boolean).pop() ?? paramValue;\n return decodeSafe(normalized);\n }\n }\n\n const pathSegments = url.pathname.split(\"/\").filter(Boolean);\n if (pathSegments.length > 0) {\n return decodeSafe(pathSegments[pathSegments.length - 1]);\n }\n } catch {\n // Not a valid URL, fall back to basic extraction below\n }\n\n return extractFromPath(value);\n};\n\n\n","import { useCallback, useMemo, useState } from \"react\";\nimport type {\n DeleteOption,\n FileToBucketManage,\n UploadOption,\n} from \"../types/formTypeStructure\";\nimport { extractFileNameFromUrl } from \"../utils/fileName\";\n\ntype NormalizedPayload = Record<string, unknown>;\n\nexport interface UploadFileParams {\n file: File | Blob;\n /**\n * Payload à fusionner avec la configuration statique avant l'appel API.\n * Permet d'injecter dynamiquement des informations comme le filename.\n */\n payloadOverrides?: Record<string, unknown>;\n /**\n * Nom de fichier à utiliser si l'on convertit un Blob en File.\n * Ignoré si `file` est déjà une instance de File.\n */\n fallbackFilename?: string;\n}\n\nexport interface UploadSuccess {\n url: string;\n filename?: string;\n originalName?: string;\n folder?: string;\n raw: any;\n}\n\nexport interface DeleteFileParams {\n filename?: string;\n fileUrl?: string;\n payloadOverrides?: Record<string, unknown>;\n}\n\nexport interface DeleteSuccess {\n success: boolean;\n raw: any;\n}\n\nconst isMap = (\n payload?: Map<string, unknown> | Record<string, unknown>\n): payload is Map<string, unknown> => payload instanceof Map;\n\nconst normalizePayload = (\n payload?: Map<string, unknown> | Record<string, unknown>\n): NormalizedPayload => {\n if (!payload) {\n return {};\n }\n if (isMap(payload)) {\n return Object.fromEntries(payload.entries());\n }\n return { ...payload };\n};\n\nconst buildAbsoluteUrl = (serverDns: string, endpoint: string): string => {\n const base = serverDns.replace(/\\/+$/, \"\");\n if (/^https?:\\/\\//i.test(endpoint)) {\n return endpoint;\n }\n const path = endpoint.replace(/^\\/+/, \"\");\n return `${base}/${path}`;\n};\n\nconst appendFormDataValue = (\n formData: FormData,\n key: string,\n value: unknown\n) => {\n if (value === undefined || value === null) {\n return;\n }\n\n if (value instanceof File || value instanceof Blob) {\n formData.append(key, value);\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((entry) => appendFormDataValue(formData, key, entry));\n return;\n }\n\n if (typeof value === \"object\") {\n formData.append(key, JSON.stringify(value));\n return;\n }\n\n formData.append(key, String(value));\n};\n\nconst pickFilename = (\n data: Record<string, any>,\n fallbackUrl?: string,\n fallbackFile?: File\n): string | undefined => {\n const candidates = [\n data?.filename,\n data?.fileName,\n data?.generatedFilename,\n data?.generatedFileName,\n data?.generated_filename,\n data?.storedFilename,\n data?.storedFileName,\n data?.name,\n ].filter((value) => typeof value === \"string\" && value.trim().length > 0) as string[];\n\n if (candidates.length > 0) {\n return candidates[0];\n }\n\n const derivedFromUrl = extractFileNameFromUrl(fallbackUrl);\n if (derivedFromUrl) {\n return derivedFromUrl;\n }\n\n return fallbackFile?.name;\n};\n\nconst prepareFileInstance = (\n file: File | Blob,\n fallbackFilename?: string\n): File => {\n if (file instanceof File) {\n return file;\n }\n const name =\n fallbackFilename ?? `upload-${Date.now()}.${(file.type || \"bin\").split(\"/\").pop() ?? \"bin\"}`;\n return new File([file], name, { type: file.type || \"application/octet-stream\" });\n};\n\nconst withTimeout = <T,>(\n promise: Promise<T>,\n timeoutMs?: number,\n controller?: AbortController\n): Promise<T> => {\n if (!timeoutMs || timeoutMs <= 0 || !controller) {\n return promise;\n }\n\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n return promise.finally(() => {\n clearTimeout(timeout);\n });\n};\n\nconst callUploadEndpoint = async (\n option: UploadOption,\n params: UploadFileParams\n): Promise<UploadSuccess> => {\n const controller = new AbortController();\n const url = buildAbsoluteUrl(option.serverDns, option.postApiEndPoint);\n const basePayload = normalizePayload(option.payload);\n const mergedPayload: NormalizedPayload = {\n ...basePayload,\n ...(params.payloadOverrides ?? {}),\n };\n\n const fileToSend = prepareFileInstance(params.file, params.fallbackFilename);\n const formData = new FormData();\n\n Object.entries(mergedPayload).forEach(([key, value]) => {\n if (key === \"file\") {\n return;\n }\n appendFormDataValue(formData, key, value);\n });\n\n formData.append(\"file\", fileToSend);\n\n const headers: Record<string, string> = {\n ...(option.extraHeaders ?? {}),\n };\n\n if (option.bearer) {\n headers.Authorization = `Bearer ${option.bearer}`;\n }\n\n const fetchPromise = fetch(url, {\n method: \"POST\",\n headers,\n body: formData,\n signal: controller.signal,\n });\n\n const response = await withTimeout(\n fetchPromise,\n option.timeoutMs,\n controller\n );\n\n if (option.onResponse) {\n try {\n await option.onResponse(response.clone());\n } catch (err) {\n console.warn(\"[FileBucketUpload] onResponse hook error:\", err);\n }\n }\n\n let payload: any = null;\n try {\n payload = await response.clone().json();\n } catch {\n // ignore JSON parse error, will be handled below\n }\n\n if (!response.ok) {\n const message =\n payload?.message ??\n `Upload failed with status ${response.status} ${response.statusText}`;\n throw new Error(message);\n }\n\n if (payload?.success === false) {\n throw new Error(payload?.message ?? \"Upload failed\");\n }\n\n const data = payload?.data ?? {};\n const fileUrl =\n data.url ?? data.file_url ?? data.downloadUrl ?? data.path ?? null;\n\n if (!fileUrl) {\n throw new Error(\n \"Upload succeeded but no URL was returned by the API response.\"\n );\n }\n\n return {\n url: fileUrl,\n filename: pickFilename(data, fileUrl, fileToSend),\n originalName: data.originalname ?? data.originalName ?? undefined,\n folder: data.folder ?? data.folder_name ?? undefined,\n raw: payload,\n };\n};\n\nconst callDeleteEndpoint = async (\n option: DeleteOption,\n params?: DeleteFileParams\n): Promise<DeleteSuccess> => {\n const controller = new AbortController();\n const url = buildAbsoluteUrl(option.serverDns, option.deleteApiEndPoint);\n\n const basePayload = normalizePayload(option.payload);\n const overridePayload = normalizePayload(params?.payloadOverrides);\n\n if (params?.filename) {\n overridePayload.filename = params.filename;\n }\n\n if (params?.fileUrl) {\n overridePayload.file_url = params.fileUrl;\n }\n\n const mergedPayload: NormalizedPayload = {\n ...basePayload,\n ...overridePayload,\n };\n\n const isDeleteByUrl = option.deleteApiEndPoint.includes(\"delete-file-by-url\");\n const isDeleteByFilename = option.deleteApiEndPoint.includes(\"delete-file\") && !isDeleteByUrl;\n\n if (\n isDeleteByFilename &&\n !mergedPayload.filename &&\n typeof mergedPayload.file_url === \"string\"\n ) {\n const inferred = extractFileNameFromUrl(mergedPayload.file_url);\n if (inferred) {\n mergedPayload.filename = inferred;\n }\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(option.extraHeaders ?? {}),\n };\n\n if (option.bearer) {\n headers.Authorization = `Bearer ${option.bearer}`;\n }\n\n const fetchPromise = fetch(url, {\n method: \"DELETE\",\n headers,\n body: JSON.stringify(mergedPayload),\n signal: controller.signal,\n });\n\n const response = await withTimeout(\n fetchPromise,\n option.timeoutMs,\n controller\n );\n\n if (option.onResponse) {\n try {\n await option.onResponse(response.clone());\n } catch (err) {\n console.warn(\"[FileBucketDelete] onResponse hook error:\", err);\n }\n }\n\n let payload: any = null;\n try {\n payload = await response.clone().json();\n } catch {\n // ignore JSON parse error, will be handled below\n }\n\n if (!response.ok) {\n const message =\n payload?.message ??\n `Delete failed with status ${response.status} ${response.statusText}`;\n throw new Error(message);\n }\n\n if (payload?.success === false) {\n throw new Error(payload?.message ?? \"Delete failed\");\n }\n\n return {\n success: true,\n raw: payload,\n };\n};\n\nexport const useFileBucketManager = (config?: FileToBucketManage) => {\n const [isUploading, setIsUploading] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const uploadOption = config?.uploadOption;\n const deleteOption = config?.deleteOption;\n\n const uploadFile = useCallback(\n async (params: UploadFileParams): Promise<UploadSuccess> => {\n if (!uploadOption) {\n throw new Error(\n \"Upload option is not configured for this field (fileToBucketManage.uploadOption missing).\"\n );\n }\n setIsUploading(true);\n setError(null);\n try {\n return await callUploadEndpoint(uploadOption, params);\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Unexpected upload error\";\n setError(message);\n throw err;\n } finally {\n setIsUploading(false);\n }\n },\n [uploadOption]\n );\n\n const deleteFile = useCallback(\n async (params?: DeleteFileParams): Promise<DeleteSuccess> => {\n if (!deleteOption) {\n throw new Error(\n \"Delete option is not configured for this field (fileToBucketManage.deleteOption missing).\"\n );\n }\n setIsDeleting(true);\n setError(null);\n try {\n return await callDeleteEndpoint(deleteOption, params);\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Unexpected delete error\";\n setError(message);\n throw err;\n } finally {\n setIsDeleting(false);\n }\n },\n [deleteOption]\n );\n\n const resetError = useCallback(() => setError(null), []);\n\n return useMemo(\n () => ({\n uploadFile,\n deleteFile,\n isUploading,\n isDeleting,\n error,\n resetError,\n hasUploadSupport: Boolean(uploadOption),\n hasDeleteSupport: Boolean(deleteOption),\n }),\n [\n uploadFile,\n deleteFile,\n isUploading,\n isDeleting,\n error,\n resetError,\n uploadOption,\n deleteOption,\n ]\n );\n};\n\nexport type FileBucketManagerHook = ReturnType<typeof useFileBucketManager>;\n\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { UploadCloud, Loader2, ExternalLink, Trash2 } from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\n\nimport { FormFieldWrapper } from \"../FormFieldWrapper\";\nimport type { FormField } from \"../types/formTypeStructure\";\nimport { useFileBucketManager } from \"../hooks/useFileBucketManager\";\nimport { extractFileNameFromUrl } from \"../utils/fileName\";\n\ninterface FileFormField extends FormField {\n fieldType: \"file\";\n}\n\ninterface FileFormFieldProps {\n field: FileFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string | string[];\n className?: string;\n}\n\ninterface UploadedFileInfo {\n id: string;\n name: string;\n size: number;\n type: string;\n url?: string;\n filename?: string;\n uploading: boolean;\n error?: string | null;\n}\n\nconst generateId = () => crypto.randomUUID?.() ?? Math.random().toString(36).slice(2);\n\nconst formatFileSize = (bytes: number) => {\n if (!bytes) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n};\n\nconst getFileIcon = (fileType: string) => {\n if (fileType.startsWith(\"image/\")) return \"🖼️\";\n if (fileType.startsWith(\"video/\")) return \"🎬\";\n if (fileType.startsWith(\"audio/\")) return \"🎵\";\n if (fileType.includes(\"pdf\")) return \"📄\";\n if (fileType.includes(\"word\")) return \"📝\";\n if (fileType.includes(\"excel\") || fileType.includes(\"sheet\")) return \"📊\";\n return \"📎\";\n};\n\nconst FileFormField: React.FC<FileFormFieldProps> = ({\n field,\n name,\n currentLang = \"fr\",\n className,\n defaultValue,\n}) => {\n const { setValue } = useFormContext();\n const [dragActive, setDragActive] = useState(false);\n const [uploadedFiles, setUploadedFiles] = useState<UploadedFileInfo[]>(() => {\n if (typeof defaultValue === \"string\" && defaultValue.trim().length > 0) {\n return [\n {\n id: generateId(),\n name: extractFileNameFromUrl(defaultValue) ?? defaultValue,\n size: 0,\n type: \"\",\n url: defaultValue,\n filename: extractFileNameFromUrl(defaultValue) ?? undefined,\n uploading: false,\n error: null,\n },\n ];\n }\n if (Array.isArray(defaultValue)) {\n return defaultValue\n .filter((url) => typeof url === \"string\" && url.trim().length > 0)\n .map((url) => ({\n id: generateId(),\n name: extractFileNameFromUrl(url) ?? url,\n size: 0,\n type: \"\",\n url,\n filename: extractFileNameFromUrl(url) ?? undefined,\n uploading: false,\n error: null,\n }));\n }\n return [];\n });\n const [componentError, setComponentError] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const fieldName = name ?? field.fieldName.toString();\n const isMultiple = useMemo(\n () => Array.isArray(field.response?.responseValue) || Array.isArray(defaultValue),\n [field.response?.responseValue, defaultValue]\n );\n const {\n uploadFile,\n deleteFile,\n isUploading,\n isDeleting,\n error: bucketError,\n resetError,\n hasUploadSupport,\n hasDeleteSupport,\n } = useFileBucketManager(field.fileToBucketManage);\n\n const effectiveError = componentError ?? bucketError ?? null;\n const didInitRef = useRef(false);\n\n useEffect(() => {\n if (didInitRef.current) return;\n didInitRef.current = true;\n if (uploadedFiles.length > 0) {\n const urls = uploadedFiles\n .filter((f) => f.url && !f.error)\n .map((f) => f.url!) ?? [];\n setValue(\n fieldName,\n isMultiple ? urls : urls[0] ?? null,\n { shouldValidate: false, shouldTouch: false }\n );\n }\n }, [uploadedFiles, fieldName, isMultiple, setValue]);\n\n const updateFilesState = (\n producer: (previous: UploadedFileInfo[]) => UploadedFileInfo[]\n ) => {\n setUploadedFiles((prev) => {\n const next = producer(prev);\n const successfulUrls = next.filter((f) => f.url && !f.error).map((f) => f.url!) ?? [];\n setValue(\n fieldName,\n isMultiple ? successfulUrls : successfulUrls[0] ?? null,\n { shouldValidate: true, shouldTouch: true }\n );\n return next;\n });\n };\n\n const handleDrag = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(e.type === \"dragenter\" || e.type === \"dragover\");\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n void handleFiles(e.dataTransfer.files);\n }\n };\n\n const handleFiles = async (files: FileList) => {\n if (!hasUploadSupport) {\n setComponentError(\n \"Configuration d'upload manquante pour ce champ (fileToBucketManage).\"\n );\n return;\n }\n\n resetError();\n setComponentError(null);\n\n const selectedFiles = Array.from(files);\n\n if (!isMultiple) {\n updateFilesState(() => []);\n }\n\n await Promise.all(\n selectedFiles.map(async (file) => {\n const id = generateId();\n updateFilesState((prev) => {\n const baseEntry: UploadedFileInfo = {\n id,\n name: file.name,\n size: file.size,\n type: file.type,\n uploading: true,\n url: undefined,\n filename: undefined,\n error: null,\n };\n if (isMultiple) {\n return [...prev, baseEntry];\n }\n return [baseEntry];\n });\n\n try {\n const result = await uploadFile({ file });\n updateFilesState((prev) =>\n prev.map((entry) =>\n entry.id === id\n ? {\n ...entry,\n uploading: false,\n url: result.url,\n name:\n result.originalName ??\n result.filename ??\n extractFileNameFromUrl(result.url) ??\n entry.name,\n filename: result.filename ?? extractFileNameFromUrl(result.url),\n error: null,\n }\n : entry\n )\n );\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Échec du téléversement du fichier.\";\n updateFilesState((prev) =>\n prev.map((entry) =>\n entry.id === id\n ? {\n ...entry,\n uploading: false,\n error: message,\n }\n : entry\n )\n );\n }\n })\n );\n\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n void handleFiles(e.target.files);\n }\n };\n\n const removeFile = async (id: string) => {\n resetError();\n setComponentError(null);\n\n const target = uploadedFiles.find((file) => file.id === id);\n if (!target) return;\n\n if (target.url && hasDeleteSupport) {\n try {\n await deleteFile({\n filename: target.filename ?? extractFileNameFromUrl(target.url ?? \"\"),\n fileUrl: target.url,\n });\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : \"Échec de la suppression du fichier distant.\";\n updateFilesState((prev) =>\n prev.map((entry) =>\n entry.id === id ? { ...entry, error: message } : entry\n )\n );\n return;\n }\n }\n\n updateFilesState((prev) => prev.filter((entry) => entry.id !== id));\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <div\n className={cn(\n \"relative border-2 border-dashed rounded-lg cursor-pointer transition-all duration-300 ease-in-out\",\n dragActive\n ? \"border-teal-500 bg-teal-50 scale-[1.02]\"\n : \"border-gray-300 hover:border-teal-400 hover:bg-gray-50\",\n className,\n isUploading && \"pointer-events-none opacity-60\"\n )}\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n >\n <input\n type=\"file\"\n multiple={isMultiple}\n ref={fileInputRef}\n onChange={handleInputChange}\n className=\"hidden\"\n />\n\n <div className=\"p-8 text-center\">\n <div className=\"flex flex-col items-center space-y-4\">\n <div\n className={cn(\n \"p-3 rounded-full transition\",\n dragActive\n ? \"bg-teal-600 text-white\"\n : \"bg-gray-100 text-teal-600 hover:bg-teal-100\"\n )}\n >\n <UploadCloud size={24} />\n </div>\n\n <div>\n <p className=\"text-base font-medium text-gray-700 mb-1\">\n {dragActive\n ? \"Déposez vos fichiers ici\"\n : \"Glissez-déposez vos fichiers\"}\n </p>\n <p className=\"text-sm text-gray-500\">\n ou{\" \"}\n <span className=\"text-teal-600 font-medium hover:underline\">\n cliquez pour parcourir\n </span>\n </p>\n <p className=\"text-xs text-gray-400 mt-2\">\n Formats variés supportés. Chaque fichier est envoyé dès sa sélection.\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {uploadedFiles.length > 0 && (\n <div className=\"mt-4 space-y-2\">\n <div className=\"text-sm font-medium text-gray-700 mb-3\">\n Fichier(s) ({uploadedFiles.length}) :\n </div>\n {uploadedFiles.map((file) => (\n <div\n key={file.id}\n className={cn(\n \"flex items-center justify-between p-3 bg-white border border-gray-200 rounded-lg hover:shadow-sm transition-shadow\",\n file.error && \"border-red-300\"\n )}\n >\n <div className=\"flex items-center space-x-3\">\n <div className=\"text-lg\">{getFileIcon(file.type)}</div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-gray-800 truncate\">\n {file.name}\n </p>\n <p className=\"text-sm text-gray-500\">\n {file.size ? formatFileSize(file.size) : \"En ligne\"}\n </p>\n {file.error && (\n <p className=\"text-xs text-red-500 mt-1\">{file.error}</p>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n {file.url && !file.uploading && (\n <button\n type=\"button\"\n onClick={() => window.open(file.url, \"_blank\")}\n className=\"p-2 hover:bg-teal-50 rounded-full transition-colors\"\n >\n <ExternalLink size={18} className=\"text-teal-600\" />\n </button>\n )}\n {file.uploading && (\n <Loader2 size={18} className=\"animate-spin text-teal-600\" />\n )}\n <button\n type=\"button\"\n onClick={() => void removeFile(file.id)}\n className=\"p-2 hover:bg-red-100 rounded-full disabled:opacity-60\"\n disabled={file.uploading || isDeleting}\n >\n {isDeleting ? (\n <Loader2 size={18} className=\"animate-spin text-red-500\" />\n ) : (\n <Trash2 size={18} className=\"text-red-500\" />\n )}\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {effectiveError && (\n <div className=\"mt-3 rounded-md bg-red-50 border border-red-200 px-3 py-2 text-sm text-red-600\">\n {effectiveError}\n </div>\n )}\n </FormFieldWrapper>\n );\n};\n\nexport default FileFormField;\n\n","import React, { useState, useEffect } from \"react\";\nimport { FormFieldWrapper, getLocalizedText } from \"../FormFieldWrapper\";\nimport { Input } from \"../components/ui/input\";\nimport type { FormField } from \"../types/formTypeStructure\";\nimport { useFormContext } from \"react-hook-form\";\n\ninterface NumberFormField extends FormField {\n fieldType: \"number\";\n}\n\ninterface NumberFormFieldProps {\n field: NumberFormField;\n name?: string;\n defaultValue?: string | number;\n currentLang?: string;\n className?: string;\n}\n\nconst NumberFormField: React.FC<NumberFormFieldProps> = ({\n field,\n name,\n defaultValue,\n currentLang = \"fr\",\n className,\n}) => {\n const { setValue, watch } = useFormContext();\n const placeholder = getLocalizedText(field.placeholder, currentLang);\n const fieldName = name ?? field.fieldName.toString();\n\n const [displayValue, setDisplayValue] = useState<string>(\"\");\n\n const formatNumber = (value: number | string): string => {\n if (value === null || value === undefined || value === \"\") return \"\";\n const numValue = typeof value === \"string\" ? parseFloat(value) : value;\n if (isNaN(numValue)) return \"\";\n return numValue.toLocaleString(\"fr-FR\", {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n });\n };\n\n const parseFormattedValue = (formattedValue: string): number => {\n if (!formattedValue) return 0;\n return parseFloat(formattedValue.replace(/\\s/g, \"\")) || 0;\n };\n\n useEffect(() => {\n if (defaultValue != null && !isNaN(Number(defaultValue))) {\n setDisplayValue(formatNumber(Number(defaultValue)));\n }\n }, [defaultValue]);\n\n const currentValue = watch(fieldName);\n useEffect(() => {\n if (currentValue !== undefined && currentValue !== null && !isNaN(Number(currentValue))) {\n const formatted = formatNumber(Number(currentValue));\n if (formatted !== displayValue) setDisplayValue(formatted);\n }\n }, [currentValue]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n if (!/^[\\d\\s,]*$/.test(inputValue)) return;\n setDisplayValue(inputValue);\n setValue(fieldName, parseFormattedValue(inputValue), {\n shouldValidate: true,\n shouldTouch: true,\n });\n };\n\n const handleBlur = () => {\n const numericValue = parseFormattedValue(displayValue);\n if (!isNaN(numericValue)) setDisplayValue(formatNumber(numericValue));\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <Input\n type=\"text\"\n name={fieldName}\n placeholder={placeholder}\n value={displayValue}\n onChange={handleInputChange}\n onBlur={handleBlur}\n className={className}\n />\n </FormFieldWrapper>\n );\n};\n\nexport default NumberFormField;\n","import React, { useState } from \"react\";\nimport { Eye, EyeOff } from \"lucide-react\";\nimport { FormFieldWrapper, getLocalizedText } from \"../FormFieldWrapper\";\nimport { Input } from \"../components/ui/input\";\nimport type { FormField } from \"../types/formTypeStructure\";\nimport { useFormContext } from \"react-hook-form\";\n\ninterface PasswordFormField extends FormField {\n fieldType: \"password\";\n}\n\ninterface PasswordFormFieldProps {\n field: PasswordFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string;\n className?: string;\n}\n\nconst PasswordFormField: React.FC<PasswordFormFieldProps> = ({\n field,\n name,\n defaultValue,\n currentLang = \"fr\",\n className,\n}) => {\n const { setValue, watch } = useFormContext();\n const [showPassword, setShowPassword] = useState(false);\n const placeholder = getLocalizedText(field.placeholder, currentLang);\n const fieldName = name ?? field.fieldName.toString();\n\n const currentValue = watch(fieldName) ?? defaultValue ?? \"\";\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setValue(fieldName, e.target.value, { shouldValidate: true, shouldTouch: true });\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <div className=\"relative\">\n <Input\n type={showPassword ? \"text\" : \"password\"}\n name={fieldName}\n value={currentValue}\n placeholder={placeholder}\n onChange={handleChange}\n className={className}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword((v) => !v)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-slate-400 hover:text-slate-600 focus:outline-none\"\n tabIndex={-1}\n >\n {showPassword ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </button>\n </div>\n </FormFieldWrapper>\n );\n};\n\nexport default PasswordFormField;\n","import * as React from \"react\";\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport { cn } from \"../../lib/utils\";\n\nconst RadioGroup = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <RadioGroupPrimitive.Root\n className={cn(\"grid gap-2\", className)}\n {...props}\n ref={ref}\n />\n));\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <RadioGroupPrimitive.Item\n ref={ref}\n className={cn(\n \"aspect-square h-4 w-4 rounded-full border border-slate-300 bg-white\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--fe-primary)] focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=checked]:border-[var(--fe-primary)]\",\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <div className=\"h-2.5 w-2.5 rounded-full bg-[var(--fe-primary)]\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n));\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n","import React from \"react\";\nimport { FormFieldWrapper, getLocalizedText } from \"../FormFieldWrapper\";\nimport { RadioGroup, RadioGroupItem } from \"../components/ui/radio-group\";\nimport { Label } from \"../components/ui/label\";\nimport type { FormField } from \"../types/formTypeStructure\";\nimport { useFormContext } from \"react-hook-form\";\n\ninterface RadioFormField extends FormField {\n fieldType: \"radio\";\n}\n\ninterface RadioFormFieldProps {\n field: RadioFormField;\n name?: string;\n defaultValue?: string;\n currentLang?: string;\n className?: string;\n}\n\nconst RadioFormField: React.FC<RadioFormFieldProps> = ({\n field,\n name,\n defaultValue,\n currentLang = \"fr\",\n className,\n}) => {\n const { setValue, trigger, watch } = useFormContext();\n const fieldName = name ?? field.fieldName.toString();\n const currentValue = watch(fieldName) ?? defaultValue ?? \"\";\n\n const handleValueChange = async (newValue: string) => {\n setValue(fieldName, newValue, {\n shouldValidate: true,\n shouldTouch: true,\n shouldDirty: true,\n });\n await trigger(fieldName);\n setTimeout(() => trigger(), 0);\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <RadioGroup\n value={currentValue}\n onValueChange={handleValueChange}\n className={`flex flex-col gap-2 ${className || \"\"}`}\n >\n {field.selectOptions?.map((option, idx) => {\n const inputId = `${field.formFieldId}-${option.value}-${idx}`;\n return (\n <div\n key={option.value}\n className=\"flex items-center gap-2 rounded-md px-2 py-1 hover:bg-teal-50 transition-all\"\n >\n <RadioGroupItem value={option.value} id={inputId} />\n <Label htmlFor={inputId} className=\"cursor-pointer text-slate-700 flex items-center gap-1\">\n {option.icon && <span>{option.icon}</span>}\n {getLocalizedText(option.label, currentLang)}\n </Label>\n </div>\n );\n })}\n </RadioGroup>\n </FormFieldWrapper>\n );\n};\n\nexport default RadioFormField;\n","import * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => (\n <textarea\n className={cn(\n \"flex min-h-[100px] w-full rounded-md border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900\",\n \"placeholder:text-slate-400\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--fe-primary)] focus-visible:ring-offset-1 focus-visible:border-[var(--fe-primary)]\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"transition-colors resize-y\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n);\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","import React, { useState, useEffect } from \"react\";\nimport { FormFieldWrapper, getLocalizedText } from \"../FormFieldWrapper\";\nimport { Textarea } from \"../components/ui/textarea\";\nimport type { FormField } from \"../types/formTypeStructure\";\nimport { useFormContext } from \"react-hook-form\";\n\ninterface TextareaFormField extends FormField {\n fieldType: \"textarea\";\n}\n\ninterface TextareaFormFieldProps {\n field: TextareaFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string;\n className?: string;\n}\n\nconst TextareaFormField: React.FC<TextareaFormFieldProps> = ({\n field,\n name,\n defaultValue,\n currentLang = \"fr\",\n className,\n}) => {\n const { setValue, watch } = useFormContext();\n const placeholder = getLocalizedText(field.placeholder, currentLang);\n const fieldName = name ?? field.fieldName.toString();\n\n const [displayValue, setDisplayValue] = useState<string>(defaultValue || \"\");\n\n useEffect(() => {\n if (defaultValue !== undefined) setDisplayValue(defaultValue);\n }, [defaultValue]);\n\n const currentValue = watch(fieldName);\n useEffect(() => {\n if (currentValue !== undefined && currentValue !== displayValue) {\n setDisplayValue(currentValue);\n }\n }, [currentValue, displayValue]);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n setDisplayValue(newValue);\n setValue(fieldName, newValue, { shouldValidate: true, shouldTouch: true });\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <Textarea\n name={fieldName}\n value={displayValue}\n placeholder={placeholder}\n onChange={handleChange}\n className={className}\n />\n </FormFieldWrapper>\n );\n};\n\nexport default TextareaFormField;\n","import { useEffect, useCallback, useState, useRef } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport toast from 'react-hot-toast';\nimport type { FormField, Section } from '../types/formTypeStructure';\nimport { findLinkedOTPField } from '../types/formUtils';\n\ninterface UseEmailOTPTriggerProps {\n emailField: FormField;\n allSections: Section[];\n currentSectionIndex: number;\n onOTPSent?: (email: string) => void;\n}\n\nconst isMap = (\n payload?: Map<string, unknown> | Record<string, unknown>\n): payload is Map<string, unknown> => payload instanceof Map;\n\nconst normalizePayload = (\n payload?: Map<string, unknown> | Record<string, unknown>\n): Record<string, unknown> => {\n if (!payload) {\n return {};\n }\n if (isMap(payload)) {\n return Object.fromEntries(payload.entries());\n }\n return { ...payload };\n};\n\nexport const useEmailOTPTrigger = ({\n emailField,\n allSections,\n currentSectionIndex,\n onOTPSent,\n}: UseEmailOTPTriggerProps) => {\n const { watch, trigger, formState } = useFormContext();\n const [isSendingOTP, setIsSendingOTP] = useState(false);\n const [otpSent, setOtpSent] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [lastSentEmail, setLastSentEmail] = useState<string | null>(null);\n \n const debounceTimerRef = useRef<NodeJS.Timeout | null>(null);\n const isProcessingRef = useRef(false);\n\n const emailValue = watch(emailField.fieldName);\n \n // Trouver le champ OTP lié (dans une section suivante)\n const linkedOTPField = findLinkedOTPField(\n emailField,\n allSections,\n currentSectionIndex\n );\n\n const sendOTP = useCallback(async (email: string) => {\n if (!emailField.emailFormFieldExecOptions?.otpSendApiConfig) {\n console.warn(\"Email field does not have OTP send API configuration\");\n return;\n }\n\n // Éviter les envois multiples simultanés\n if (isProcessingRef.current) {\n return;\n }\n\n const config = emailField.emailFormFieldExecOptions.otpSendApiConfig;\n setIsSendingOTP(true);\n setError(null);\n isProcessingRef.current = true;\n\n try {\n const url = `${config.serverDns}${config.postApiEndPoint}`;\n const basePayload = normalizePayload(config.payload);\n const payload = {\n ...basePayload,\n email,\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(config.extraHeaders || {}),\n };\n\n if (config.bearer) {\n headers.Authorization = `Bearer ${config.bearer}`;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n throw new Error(`OTP send failed: ${response.status} ${errorText}`);\n }\n\n const result = await response.json();\n setOtpSent(true);\n setLastSentEmail(email);\n onOTPSent?.(email);\n \n toast.success(`Code OTP envoyé à ${email}`, {\n duration: 3000,\n position: \"top-center\",\n });\n \n console.log(`✅ OTP envoyé à ${email}`, result);\n return result;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to send OTP\";\n setError(message);\n toast.error(`Erreur lors de l'envoi de l'OTP: ${message}`, {\n duration: 4000,\n position: \"top-center\",\n });\n throw err;\n } finally {\n setIsSendingOTP(false);\n isProcessingRef.current = false;\n }\n }, [emailField, onOTPSent]);\n\n // Déclencher l'envoi automatique quand l'email est validé\n useEffect(() => {\n // Nettoyer le timer précédent\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n\n // Vérifier si c'est le champ email qui a changé\n const email = emailValue;\n \n // Vérifier que l'email est valide et non vide\n if (!email || typeof email !== \"string\" || email.trim() === \"\") {\n return;\n }\n\n // Vérifier que le champ doit déclencher l'envoi d'OTP\n if (!emailField.emailFormFieldExecOptions?.triggerOTPSend) {\n return;\n }\n\n // Vérifier qu'un champ OTP est bien lié\n if (!linkedOTPField) {\n return;\n }\n\n // Si l'email n'a pas changé et qu'on a déjà envoyé l'OTP, ne pas réenvoyer\n if (email === lastSentEmail && otpSent) {\n return;\n }\n\n // Débounce : attendre 500ms après la dernière modification\n debounceTimerRef.current = setTimeout(async () => {\n try {\n // Valider l'email avant d'envoyer\n const isValid = await trigger(emailField.fieldName);\n if (!isValid) {\n console.log(\"Email validation failed, not sending OTP\");\n return;\n }\n\n // Réinitialiser l'état si l'email a changé\n if (email !== lastSentEmail) {\n setOtpSent(false);\n setError(null);\n }\n\n // Envoyer l'OTP\n await sendOTP(email);\n } catch (err) {\n console.error(\"Erreur lors de l'envoi automatique de l'OTP:\", err);\n }\n }, 500);\n\n return () => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, [\n emailValue,\n emailField,\n trigger,\n otpSent,\n sendOTP,\n linkedOTPField,\n lastSentEmail,\n ]);\n\n // Réinitialiser l'état si l'email change complètement\n useEffect(() => {\n if (emailValue !== lastSentEmail && lastSentEmail !== null) {\n setOtpSent(false);\n setError(null);\n }\n }, [emailValue, lastSentEmail]);\n\n return {\n isSendingOTP,\n otpSent,\n error,\n sendOTP,\n linkedOTPField,\n lastSentEmail,\n };\n};\n\n","import React, { useState, useEffect } from \"react\";\nimport { FormFieldWrapper, getLocalizedText } from \"../FormFieldWrapper\";\nimport { Input } from \"../components/ui/input\";\nimport type { FormField, Section } from \"../types/formTypeStructure\";\nimport { useFormContext } from \"react-hook-form\";\nimport { useEmailOTPTrigger } from \"../hooks/useEmailOTPTrigger\";\n\ninterface TextFormField extends FormField {\n fieldType: \"text\";\n}\n\ninterface TextFormFieldProps {\n field: TextFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string;\n className?: string;\n allSections?: Section[];\n currentSectionIndex?: number;\n}\n\nconst TextFormField: React.FC<TextFormFieldProps> = ({\n field,\n name,\n defaultValue,\n currentLang = \"fr\",\n className,\n allSections = [],\n currentSectionIndex = 0,\n}) => {\n const { setValue, watch } = useFormContext();\n const placeholder = getLocalizedText(field.placeholder, currentLang);\n const fieldName = name ?? field.fieldName.toString();\n\n const hasEmailValidation = field.validations?.some(\n (v) => v.validationType === \"email\"\n );\n const shouldTriggerOTP = field.emailFormFieldExecOptions?.triggerOTPSend === true;\n\n const emailOTPTrigger = useEmailOTPTrigger({\n emailField: field,\n allSections,\n currentSectionIndex,\n onOTPSent: (email) => {\n console.log(`✅ OTP envoyé automatiquement à ${email}`);\n },\n });\n\n const [displayValue, setDisplayValue] = useState<string>(defaultValue || \"\");\n\n useEffect(() => {\n if (defaultValue !== undefined) setDisplayValue(defaultValue);\n }, [defaultValue]);\n\n const currentValue = watch(fieldName);\n useEffect(() => {\n if (currentValue !== undefined && currentValue !== displayValue) {\n setDisplayValue(currentValue);\n }\n }, [currentValue, displayValue]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setDisplayValue(newValue);\n setValue(fieldName, newValue, { shouldValidate: true, shouldTouch: true });\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n {hasEmailValidation && shouldTriggerOTP && emailOTPTrigger.isSendingOTP && (\n <div className=\"mb-2 text-sm text-blue-600 flex items-center gap-2\">\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-blue-600\" />\n <span>Envoi du code OTP en cours...</span>\n </div>\n )}\n {hasEmailValidation && shouldTriggerOTP && emailOTPTrigger.otpSent && !emailOTPTrigger.isSendingOTP && (\n <div className=\"mb-2 text-sm text-green-600\">✓ Code OTP envoyé avec succès</div>\n )}\n {hasEmailValidation && shouldTriggerOTP && emailOTPTrigger.error && (\n <div className=\"mb-2 text-sm text-red-600\">⚠ Erreur: {emailOTPTrigger.error}</div>\n )}\n <Input\n type=\"text\"\n name={fieldName}\n value={displayValue}\n placeholder={placeholder}\n onChange={handleChange}\n className={className}\n />\n </FormFieldWrapper>\n );\n};\n\nexport default TextFormField;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { UploadCloud, Eye, Loader2, Trash2 } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nimport { FormFieldWrapper } from \"../../FormFieldWrapper\";\nimport { SpecialField, type FormField } from \"../../types/formTypeStructure\";\nimport { useFileBucketManager } from \"../../hooks/useFileBucketManager\";\nimport { extractFileNameFromUrl } from \"../../utils/fileName\";\n\ninterface ImageFormField extends FormField {\n fieldType: SpecialField.IMAGE;\n}\n\ninterface ImageFormFieldProps {\n field: ImageFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string;\n className?: string;\n}\n\ninterface UploadedImageInfo {\n url: string;\n name: string;\n size?: number;\n type?: string;\n bucketFilename?: string;\n}\n\nconst ImageFormField: React.FC<ImageFormFieldProps> = ({\n field,\n name,\n currentLang = \"fr\",\n className,\n defaultValue,\n}) => {\n const { setValue } = useFormContext();\n const [dragActive, setDragActive] = useState(false);\n const [uploadedImage, setUploadedImage] = useState<UploadedImageInfo | null>(\n null\n );\n const [localPreviewUrl, setLocalPreviewUrl] = useState<string | null>(null);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const fieldName = name ?? field.fieldName.toString();\n const didInitRef = useRef(false);\n const {\n uploadFile,\n deleteFile,\n isUploading,\n isDeleting,\n error: bucketError,\n resetError,\n hasUploadSupport,\n hasDeleteSupport,\n } = useFileBucketManager(field.fileToBucketManage);\n\n const effectiveError = errorMessage ?? bucketError ?? null;\n\n useEffect(() => {\n if (typeof defaultValue === \"string\" && defaultValue.trim().length > 0) {\n setUploadedImage({\n url: defaultValue,\n name: extractFileNameFromUrl(defaultValue) ?? defaultValue,\n bucketFilename: extractFileNameFromUrl(defaultValue) ?? undefined,\n });\n if (!didInitRef.current) {\n setValue(fieldName, defaultValue, {\n shouldValidate: false,\n shouldTouch: false,\n });\n didInitRef.current = true;\n }\n }\n }, [defaultValue, fieldName, setValue]);\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n };\n\n const handleDrag = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(e.type === \"dragenter\" || e.type === \"dragover\");\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n void handleFile(e.dataTransfer.files[0]);\n }\n };\n\n const handleFile = async (file: File) => {\n // Vérifier que c'est bien une image\n if (!file.type.startsWith(\"image/\")) {\n alert(\"Veuillez sélectionner un fichier image valide\");\n return;\n }\n\n if (!hasUploadSupport) {\n setErrorMessage(\n \"Configuration d'upload manquante pour ce champ (fileToBucketManage).\"\n );\n return;\n }\n\n resetError();\n setErrorMessage(null);\n\n const localUrl = URL.createObjectURL(file);\n setLocalPreviewUrl(localUrl);\n\n try {\n const result = await uploadFile({ file });\n setUploadedImage({\n url: result.url,\n name:\n result.originalName ??\n result.filename ??\n extractFileNameFromUrl(result.url) ??\n file.name,\n size: file.size,\n type: file.type,\n bucketFilename: result.filename ?? extractFileNameFromUrl(result.url),\n });\n setValue(fieldName, result.url, {\n shouldValidate: true,\n shouldTouch: true,\n });\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Échec de l'upload de l'image.\";\n setErrorMessage(message);\n } finally {\n URL.revokeObjectURL(localUrl);\n setLocalPreviewUrl(null);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n void handleFile(e.target.files[0]);\n }\n };\n\n const removeImage = async () => {\n resetError();\n setErrorMessage(null);\n\n if (uploadedImage && hasDeleteSupport) {\n try {\n await deleteFile({\n filename:\n uploadedImage.bucketFilename ??\n extractFileNameFromUrl(uploadedImage.url ?? \"\") ??\n undefined,\n fileUrl: uploadedImage.url,\n });\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : \"Échec de la suppression du fichier distant.\";\n setErrorMessage(message);\n return;\n }\n }\n\n setUploadedImage(null);\n setValue(fieldName, null, {\n shouldValidate: true,\n shouldTouch: true,\n });\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <div className=\"space-y-4\">\n {/* Zone de drop */}\n {!uploadedImage && !localPreviewUrl && (\n <div\n className={cn(\n \"relative border-2 border-dashed rounded-lg cursor-pointer transition-all duration-300 ease-in-out\",\n dragActive\n ? \"border-teal-500 bg-teal-50 scale-[1.02]\"\n : \"border-gray-300 hover:border-teal-400 hover:bg-gray-50\",\n className,\n isUploading && \"pointer-events-none opacity-60\"\n )}\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n >\n <input\n type=\"file\"\n accept=\"image/*\"\n ref={fileInputRef}\n onChange={handleInputChange}\n className=\"hidden\"\n />\n\n <div className=\"p-8 text-center\">\n <div className=\"flex flex-col items-center space-y-4\">\n <div\n className={cn(\n \"p-3 rounded-full transition\",\n dragActive\n ? \"bg-teal-600 text-white\"\n : \"bg-gray-100 text-teal-600 hover:bg-teal-100\"\n )}\n >\n <UploadCloud size={24} />\n </div>\n\n <div>\n <p className=\"text-base font-medium text-gray-700 mb-1\">\n {dragActive\n ? \"Déposez votre image ici\"\n : \"Glissez-déposez votre image\"}\n </p>\n <p className=\"text-sm text-gray-500\">\n ou{\" \"}\n <span className=\"text-teal-600 font-medium hover:underline\">\n cliquez pour parcourir\n </span>\n </p>\n <p className=\"text-xs text-gray-400 mt-2\">\n Formats acceptés : JPG, PNG, GIF, WEBP\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Preview de l'image */}\n {(uploadedImage || localPreviewUrl) && (\n <div className=\"relative border border-gray-200 rounded-lg overflow-hidden bg-gray-50\">\n <div className=\"relative group\">\n <img\n src={localPreviewUrl ?? uploadedImage?.url ?? \"\"}\n alt=\"Aperçu\"\n className=\"w-full h-auto max-h-96 object-contain\"\n />\n\n <div className=\"absolute inset-0 bg-black bg-opacity-0 group-hover:bg-opacity-50 transition-all duration-300 flex items-center justify-center opacity-0 group-hover:opacity-100\">\n <div className=\"flex space-x-2\">\n {uploadedImage && (\n <button\n type=\"button\"\n onClick={() => window.open(uploadedImage.url, \"_blank\")}\n className=\"p-2 bg-white rounded-full hover:bg-gray-100 transition-colors\"\n >\n <Eye size={20} className=\"text-teal-600\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => void removeImage()}\n className=\"p-2 bg-white rounded-full hover:bg-red-100 transition-colors disabled:opacity-60\"\n disabled={isDeleting}\n >\n {isDeleting ? (\n <Loader2 size={20} className=\"animate-spin text-red-600\" />\n ) : (\n <Trash2 size={20} className=\"text-red-600\" />\n )}\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"p-4 bg-white border-t border-gray-200\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-gray-800 truncate\">\n {uploadedImage?.name}\n </p>\n {(uploadedImage?.size ?? localPreviewUrl) && (\n <p className=\"text-sm text-gray-500\">\n {uploadedImage?.size\n ? formatFileSize(uploadedImage.size)\n : \"\"}\n </p>\n )}\n </div>\n {isUploading && (\n <Loader2 size={20} className=\"animate-spin text-teal-600\" />\n )}\n </div>\n </div>\n </div>\n )}\n\n {effectiveError && (\n <div className=\"rounded-md bg-red-50 border border-red-200 px-3 py-2 text-sm text-red-600\">\n {effectiveError}\n </div>\n )}\n </div>\n </FormFieldWrapper>\n );\n};\n\nexport default ImageFormField;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { UploadCloud, Video, Loader2, Trash2 } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nimport { FormFieldWrapper } from \"../../FormFieldWrapper\";\nimport { SpecialField, type FormField } from \"../../types/formTypeStructure\";\nimport { useFileBucketManager } from \"../../hooks/useFileBucketManager\";\nimport { extractFileNameFromUrl } from \"../../utils/fileName\";\n\ninterface VideoFormField extends FormField {\n fieldType: SpecialField.VIDEO;\n}\n\ninterface VideoFormFieldProps {\n field: VideoFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string;\n className?: string;\n}\n\ninterface UploadedVideoInfo {\n url: string;\n name: string;\n size?: number;\n type?: string;\n bucketFilename?: string;\n}\n\nconst VideoFormField: React.FC<VideoFormFieldProps> = ({\n field,\n name,\n currentLang = \"fr\",\n className,\n defaultValue,\n}) => {\n const { setValue } = useFormContext();\n const [dragActive, setDragActive] = useState(false);\n const [uploadedVideo, setUploadedVideo] = useState<UploadedVideoInfo | null>(\n null\n );\n const [localPreviewUrl, setLocalPreviewUrl] = useState<string | null>(null);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const fieldName = name ?? field.fieldName.toString();\n const didInitRef = useRef(false);\n const {\n uploadFile,\n deleteFile,\n isUploading,\n isDeleting,\n error: bucketError,\n resetError,\n hasUploadSupport,\n hasDeleteSupport,\n } = useFileBucketManager(field.fileToBucketManage);\n\n const effectiveError = errorMessage ?? bucketError ?? null;\n\n useEffect(() => {\n if (typeof defaultValue === \"string\" && defaultValue.trim().length > 0) {\n setUploadedVideo({\n url: defaultValue,\n name: extractFileNameFromUrl(defaultValue) ?? defaultValue,\n bucketFilename: extractFileNameFromUrl(defaultValue) ?? undefined,\n });\n if (!didInitRef.current) {\n setValue(fieldName, defaultValue, {\n shouldValidate: false,\n shouldTouch: false,\n });\n didInitRef.current = true;\n }\n }\n }, [defaultValue, fieldName, setValue]);\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n };\n\n const handleDrag = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(e.type === \"dragenter\" || e.type === \"dragover\");\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n void handleFile(e.dataTransfer.files[0]);\n }\n };\n\n const handleFile = async (file: File) => {\n if (!file.type.startsWith(\"video/\")) {\n alert(\"Veuillez sélectionner un fichier vidéo valide\");\n return;\n }\n\n if (!hasUploadSupport) {\n setErrorMessage(\n \"Configuration d'upload manquante pour ce champ (fileToBucketManage).\"\n );\n return;\n }\n\n resetError();\n setErrorMessage(null);\n\n const localUrl = URL.createObjectURL(file);\n setLocalPreviewUrl(localUrl);\n\n try {\n const result = await uploadFile({ file });\n setUploadedVideo({\n url: result.url,\n name:\n result.originalName ??\n result.filename ??\n extractFileNameFromUrl(result.url) ??\n file.name,\n size: file.size,\n type: file.type,\n bucketFilename: result.filename ?? extractFileNameFromUrl(result.url),\n });\n setValue(fieldName, result.url, {\n shouldValidate: true,\n shouldTouch: true,\n });\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Échec de l'upload de la vidéo.\";\n setErrorMessage(message);\n } finally {\n URL.revokeObjectURL(localUrl);\n setLocalPreviewUrl(null);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n void handleFile(e.target.files[0]);\n }\n };\n\n const removeVideo = async () => {\n resetError();\n setErrorMessage(null);\n\n if (uploadedVideo && hasDeleteSupport) {\n try {\n await deleteFile({\n filename:\n uploadedVideo.bucketFilename ??\n extractFileNameFromUrl(uploadedVideo.url ?? \"\") ??\n undefined,\n fileUrl: uploadedVideo.url,\n });\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : \"Échec de la suppression du fichier distant.\";\n setErrorMessage(message);\n return;\n }\n }\n\n setUploadedVideo(null);\n setLocalPreviewUrl(null);\n setValue(fieldName, null, {\n shouldValidate: true,\n shouldTouch: true,\n });\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <div className=\"space-y-4\">\n <div\n className={cn(\n \"relative border-2 border-dashed rounded-lg cursor-pointer transition-all duration-300 ease-in-out\",\n dragActive\n ? \"border-teal-500 bg-teal-50 scale-[1.02]\"\n : \"border-gray-300 hover:border-teal-400 hover:bg-gray-50\",\n (uploadedVideo || localPreviewUrl) && \"hidden\",\n className,\n isUploading && \"pointer-events-none opacity-60\"\n )}\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n >\n <input\n type=\"file\"\n accept=\"video/*\"\n ref={fileInputRef}\n onChange={handleInputChange}\n className=\"hidden\"\n />\n\n <div className=\"p-8 text-center\">\n <div className=\"flex flex-col items-center space-y-4\">\n <div\n className={cn(\n \"p-3 rounded-full transition\",\n dragActive\n ? \"bg-teal-600 text-white\"\n : \"bg-gray-100 text-teal-600 hover:bg-teal-100\"\n )}\n >\n <Video size={24} />\n </div>\n\n <div>\n <p className=\"text-base font-medium text-gray-700 mb-1\">\n {dragActive\n ? \"Déposez votre vidéo ici\"\n : \"Glissez-déposez votre vidéo\"}\n </p>\n <p className=\"text-sm text-gray-500\">\n ou{\" \"}\n <span className=\"text-teal-600 font-medium hover:underline\">\n cliquez pour parcourir\n </span>\n </p>\n <p className=\"text-xs text-gray-400 mt-2\">\n Formats acceptés : MP4, WEBM, AVI, etc.\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {(uploadedVideo || localPreviewUrl) && (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between p-3 bg-white border border-gray-200 rounded-lg\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"p-2 bg-purple-50 rounded-lg\">\n <Video size={20} className=\"text-purple-600\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-gray-800 truncate\">\n {uploadedVideo?.name}\n </p>\n {uploadedVideo?.size && (\n <p className=\"text-sm text-gray-500\">\n {formatFileSize(uploadedVideo.size)}\n </p>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => void removeVideo()}\n className=\"p-2 hover:bg-red-50 rounded-lg transition-colors disabled:opacity-60\"\n disabled={isDeleting}\n >\n {isDeleting ? (\n <Loader2 size={20} className=\"animate-spin text-red-500\" />\n ) : (\n <Trash2 size={20} className=\"text-red-500\" />\n )}\n </button>\n </div>\n\n <div className=\"border border-gray-200 rounded-lg overflow-hidden bg-gray-50\">\n <video\n src={localPreviewUrl ?? uploadedVideo?.url ?? undefined}\n controls\n className=\"w-full h-auto\"\n style={{ maxHeight: \"400px\" }}\n />\n </div>\n </div>\n )}\n\n {effectiveError && (\n <div className=\"rounded-md bg-red-50 border border-red-200 px-3 py-2 text-sm text-red-600\">\n {effectiveError}\n </div>\n )}\n </div>\n </FormFieldWrapper>\n );\n};\n\nexport default VideoFormField;\n\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { UploadCloud, Music, Play, Pause, Loader2, Trash2 } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nimport { FormFieldWrapper } from \"../../FormFieldWrapper\";\nimport { SpecialField, type FormField } from \"../../types/formTypeStructure\";\nimport { useFileBucketManager } from \"../../hooks/useFileBucketManager\";\nimport { extractFileNameFromUrl } from \"../../utils/fileName\";\n\ninterface AudioFormField extends FormField {\n fieldType: SpecialField.AUDIO;\n}\n\ninterface AudioFormFieldProps {\n field: AudioFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string;\n className?: string;\n}\n\ninterface UploadedAudioInfo {\n url: string;\n name: string;\n size?: number;\n type?: string;\n bucketFilename?: string;\n}\n\nconst AudioFormField: React.FC<AudioFormFieldProps> = ({\n field,\n name,\n currentLang = \"fr\",\n className,\n defaultValue,\n}) => {\n const { setValue } = useFormContext();\n const [dragActive, setDragActive] = useState(false);\n const [uploadedAudio, setUploadedAudio] = useState<UploadedAudioInfo | null>(\n null\n );\n const [localPreviewUrl, setLocalPreviewUrl] = useState<string | null>(null);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const fieldName = name ?? field.fieldName.toString();\n const didInitRef = useRef(false);\n const {\n uploadFile,\n deleteFile,\n isUploading,\n isDeleting,\n error: bucketError,\n resetError,\n hasUploadSupport,\n hasDeleteSupport,\n } = useFileBucketManager(field.fileToBucketManage);\n\n const effectiveError = errorMessage ?? bucketError ?? null;\n\n useEffect(() => {\n if (typeof defaultValue === \"string\" && defaultValue.trim().length > 0) {\n setUploadedAudio({\n url: defaultValue,\n name: extractFileNameFromUrl(defaultValue) ?? defaultValue,\n bucketFilename: extractFileNameFromUrl(defaultValue) ?? undefined,\n });\n if (!didInitRef.current) {\n setValue(fieldName, defaultValue, {\n shouldValidate: false,\n shouldTouch: false,\n });\n didInitRef.current = true;\n }\n }\n }, [defaultValue, fieldName, setValue]);\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n };\n\n const handleDrag = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(e.type === \"dragenter\" || e.type === \"dragover\");\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n void handleFile(e.dataTransfer.files[0]);\n }\n };\n\n const handleFile = async (file: File) => {\n if (!file.type.startsWith(\"audio/\")) {\n alert(\"Veuillez sélectionner un fichier audio valide\");\n return;\n }\n\n if (!hasUploadSupport) {\n setErrorMessage(\n \"Configuration d'upload manquante pour ce champ (fileToBucketManage).\"\n );\n return;\n }\n\n resetError();\n setErrorMessage(null);\n\n const localUrl = URL.createObjectURL(file);\n setLocalPreviewUrl(localUrl);\n\n try {\n const result = await uploadFile({ file });\n setUploadedAudio({\n url: result.url,\n name:\n result.originalName ??\n result.filename ??\n extractFileNameFromUrl(result.url) ??\n file.name,\n size: file.size,\n type: file.type,\n bucketFilename: result.filename ?? extractFileNameFromUrl(result.url),\n });\n setValue(fieldName, result.url, {\n shouldValidate: true,\n shouldTouch: true,\n });\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Échec de l'upload du fichier audio.\";\n setErrorMessage(message);\n } finally {\n URL.revokeObjectURL(localUrl);\n setLocalPreviewUrl(null);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n void handleFile(e.target.files[0]);\n }\n };\n\n const removeAudio = async () => {\n resetError();\n setErrorMessage(null);\n\n if (uploadedAudio && hasDeleteSupport) {\n try {\n await deleteFile({\n filename:\n uploadedAudio.bucketFilename ??\n extractFileNameFromUrl(uploadedAudio.url ?? \"\") ??\n undefined,\n fileUrl: uploadedAudio.url,\n });\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : \"Échec de la suppression du fichier distant.\";\n setErrorMessage(message);\n return;\n }\n }\n\n setUploadedAudio(null);\n setLocalPreviewUrl(null);\n setIsPlaying(false);\n setValue(fieldName, null, {\n shouldValidate: true,\n shouldTouch: true,\n });\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n\n const handlePlayPause = () => {\n if (audioRef.current) {\n if (isPlaying) {\n audioRef.current.pause();\n } else {\n audioRef.current.play();\n }\n setIsPlaying(!isPlaying);\n }\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <div className=\"space-y-4\">\n <div\n className={cn(\n \"relative border-2 border-dashed rounded-lg cursor-pointer transition-all duration-300 ease-in-out\",\n dragActive\n ? \"border-teal-500 bg-teal-50 scale-[1.02]\"\n : \"border-gray-300 hover:border-teal-400 hover:bg-gray-50\",\n (uploadedAudio || localPreviewUrl) && \"hidden\",\n className,\n isUploading && \"pointer-events-none opacity-60\"\n )}\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n >\n <input\n type=\"file\"\n accept=\"audio/*\"\n ref={fileInputRef}\n onChange={handleInputChange}\n className=\"hidden\"\n />\n\n <div className=\"p-8 text-center\">\n <div className=\"flex flex-col items-center space-y-4\">\n <div\n className={cn(\n \"p-3 rounded-full transition\",\n dragActive\n ? \"bg-teal-600 text-white\"\n : \"bg-gray-100 text-teal-600 hover:bg-teal-100\"\n )}\n >\n <Music size={24} />\n </div>\n\n <div>\n <p className=\"text-base font-medium text-gray-700 mb-1\">\n {dragActive\n ? \"Déposez votre audio ici\"\n : \"Glissez-déposez votre audio\"}\n </p>\n <p className=\"text-sm text-gray-500\">\n ou{\" \"}\n <span className=\"text-teal-600 font-medium hover:underline\">\n cliquez pour parcourir\n </span>\n </p>\n <p className=\"text-xs text-gray-400 mt-2\">\n Formats acceptés : MP3, WAV, OGG, etc.\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {(uploadedAudio || localPreviewUrl) && (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between p-4 bg-white border border-gray-200 rounded-lg\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"p-2 bg-green-50 rounded-lg\">\n <Music size={20} className=\"text-green-600\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-gray-800 truncate\">\n {uploadedAudio?.name}\n </p>\n {uploadedAudio?.size && (\n <p className=\"text-sm text-gray-500\">\n {formatFileSize(uploadedAudio.size)}\n </p>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => void removeAudio()}\n className=\"p-2 hover:bg-red-50 rounded-lg transition-colors disabled:opacity-60\"\n disabled={isDeleting}\n >\n {isDeleting ? (\n <Loader2 size={20} className=\"animate-spin text-red-500\" />\n ) : (\n <Trash2 size={20} className=\"text-red-500\" />\n )}\n </button>\n </div>\n\n <div className=\"border border-gray-200 rounded-lg overflow-hidden bg-gray-50\">\n <div className=\"flex items-center space-x-3 p-4 bg-white\">\n <button\n type=\"button\"\n onClick={handlePlayPause}\n className=\"p-3 bg-teal-600 text-white rounded-full hover:bg-teal-700 transition-colors disabled:opacity-60\"\n disabled={!(uploadedAudio || localPreviewUrl)}\n >\n {isPlaying ? <Pause size={20} /> : <Play size={20} />}\n </button>\n <div className=\"flex-1\">\n <audio\n ref={audioRef}\n src={localPreviewUrl ?? uploadedAudio?.url ?? undefined}\n onEnded={() => setIsPlaying(false)}\n />\n </div>\n </div>\n </div>\n </div>\n )}\n\n {effectiveError && (\n <div className=\"rounded-md bg-red-50 border border-red-200 px-3 py-2 text-sm text-red-600\">\n {effectiveError}\n </div>\n )}\n </div>\n </FormFieldWrapper>\n );\n};\n\nexport default AudioFormField;\n\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { UploadCloud, FileText, Eye, Loader2, Trash2 } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nimport { FormFieldWrapper } from \"../../FormFieldWrapper\";\nimport { SpecialField, type FormField } from \"../../types/formTypeStructure\";\nimport { useFileBucketManager } from \"../../hooks/useFileBucketManager\";\nimport { extractFileNameFromUrl } from \"../../utils/fileName\";\n\ninterface PDFFormField extends FormField {\n fieldType: SpecialField.PDF;\n}\n\ninterface PDFFormFieldProps {\n field: PDFFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string;\n className?: string;\n}\n\ninterface UploadedPDFInfo {\n url: string;\n name: string;\n size?: number;\n bucketFilename?: string;\n}\n\nconst PDFFormField: React.FC<PDFFormFieldProps> = ({\n field,\n name,\n currentLang = \"fr\",\n className,\n defaultValue,\n}) => {\n const { setValue } = useFormContext();\n const [dragActive, setDragActive] = useState(false);\n const [uploadedPDF, setUploadedPDF] = useState<UploadedPDFInfo | null>(null);\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n const [previewStatus, setPreviewStatus] = useState<\n \"idle\" | \"loading\" | \"ready\" | \"error\"\n >(\"idle\");\n const [previewMessage, setPreviewMessage] = useState<string | null>(null);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const fieldName = name ?? field.fieldName.toString();\n const didInitRef = useRef(false);\n const previousPreviewRef = useRef<string | null>(null);\n const {\n uploadFile,\n deleteFile,\n isUploading,\n isDeleting,\n error: bucketError,\n resetError,\n hasUploadSupport,\n hasDeleteSupport,\n } = useFileBucketManager(field.fileToBucketManage);\n\n const effectiveError = errorMessage ?? bucketError ?? null;\n\n const clearPreview = useCallback(() => {\n if (\n previousPreviewRef.current &&\n previousPreviewRef.current.startsWith(\"blob:\")\n ) {\n URL.revokeObjectURL(previousPreviewRef.current);\n }\n previousPreviewRef.current = null;\n setPreviewUrl(null);\n setPreviewStatus(\"idle\");\n setPreviewMessage(null);\n }, []);\n\n const setPreviewFromBlob = useCallback(\n (blob: Blob) => {\n clearPreview();\n const objectUrl = URL.createObjectURL(blob);\n previousPreviewRef.current = objectUrl;\n setPreviewUrl(objectUrl);\n setPreviewStatus(\"ready\");\n setPreviewMessage(null);\n },\n [clearPreview]\n );\n\n const loadPreviewFromRemote = useCallback(\n async (url: string) => {\n if (!url) {\n clearPreview();\n return;\n }\n setPreviewStatus(\"loading\");\n setPreviewMessage(null);\n try {\n const response = await fetch(url, { mode: \"cors\" });\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n const blob = await response.blob();\n const contentTypeHeader =\n response.headers.get(\"Content-Type\")?.toLowerCase() ?? \"\";\n const blobType = blob.type?.toLowerCase() ?? \"\";\n const fileName =\n extractFileNameFromUrl(url)?.toLowerCase() ??\n url.split(\"?\")[0].toLowerCase();\n\n const isProbablyPdf =\n contentTypeHeader.includes(\"pdf\") ||\n blobType.includes(\"pdf\") ||\n fileName.endsWith(\".pdf\");\n\n if (!isProbablyPdf) {\n throw new Error(\"Le fichier distant n'est pas un PDF.\");\n }\n\n const normalizedBlob = blobType.includes(\"pdf\")\n ? blob\n : new Blob([blob], { type: \"application/pdf\" });\n\n setPreviewFromBlob(normalizedBlob);\n } catch (error) {\n clearPreview();\n setPreviewStatus(\"error\");\n setPreviewMessage(\n \"Prévisualisation impossible. Utilisez le bouton « Ouvrir » pour consulter le PDF.\"\n );\n console.warn(\"[PDFFormField] Preview fetch failed:\", error);\n }\n },\n [clearPreview, setPreviewFromBlob]\n );\n\n useEffect(() => {\n if (typeof defaultValue === \"string\" && defaultValue.trim().length > 0) {\n setUploadedPDF({\n url: defaultValue,\n name: extractFileNameFromUrl(defaultValue) ?? defaultValue,\n bucketFilename: extractFileNameFromUrl(defaultValue) ?? undefined,\n });\n setPreviewStatus(\"loading\");\n setPreviewMessage(null);\n void loadPreviewFromRemote(defaultValue);\n if (!didInitRef.current) {\n setValue(fieldName, defaultValue, {\n shouldValidate: false,\n shouldTouch: false,\n });\n didInitRef.current = true;\n }\n } else {\n clearPreview();\n setUploadedPDF(null);\n }\n }, [defaultValue, fieldName, loadPreviewFromRemote, setValue, clearPreview]);\n\n useEffect(() => {\n return () => {\n if (previousPreviewRef.current && previousPreviewRef.current.startsWith(\"blob:\")) {\n URL.revokeObjectURL(previousPreviewRef.current);\n }\n };\n }, []);\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n };\n\n const handleDrag = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(e.type === \"dragenter\" || e.type === \"dragover\");\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n void handleFile(e.dataTransfer.files[0]);\n }\n };\n\n const handleFile = async (file: File) => {\n // Vérifier que c'est bien un PDF\n if (file.type !== \"application/pdf\") {\n alert(\"Veuillez sélectionner un fichier PDF valide\");\n return;\n }\n\n if (!hasUploadSupport) {\n setErrorMessage(\n \"Configuration d'upload manquante pour ce champ (fileToBucketManage).\"\n );\n return;\n }\n\n resetError();\n setErrorMessage(null);\n\n setPreviewFromBlob(file);\n setPreviewStatus(\"ready\");\n setPreviewMessage(null);\n\n try {\n const result = await uploadFile({ file });\n setUploadedPDF({\n url: result.url,\n name:\n result.originalName ??\n result.filename ??\n extractFileNameFromUrl(result.url) ??\n file.name,\n size: file.size,\n bucketFilename: result.filename ?? extractFileNameFromUrl(result.url),\n });\n setValue(fieldName, result.url, {\n shouldValidate: true,\n shouldTouch: true,\n });\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Échec de l'upload du PDF.\";\n setErrorMessage(message);\n clearPreview();\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n void handleFile(e.target.files[0]);\n }\n };\n\n const removePDF = async () => {\n resetError();\n setErrorMessage(null);\n\n if (uploadedPDF && hasDeleteSupport) {\n try {\n await deleteFile({\n filename:\n uploadedPDF.bucketFilename ??\n extractFileNameFromUrl(uploadedPDF.url ?? \"\") ??\n undefined,\n fileUrl: uploadedPDF.url,\n });\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : \"Échec de la suppression du fichier distant.\";\n setErrorMessage(message);\n return;\n }\n }\n\n setUploadedPDF(null);\n if (previewUrl && previewUrl.startsWith(\"blob:\")) {\n URL.revokeObjectURL(previewUrl);\n }\n setPreviewUrl(null);\n previousPreviewRef.current = null;\n setValue(fieldName, null, {\n shouldValidate: true,\n shouldTouch: true,\n });\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <div className=\"space-y-4\">\n {/* Zone de drop */}\n {!uploadedPDF && !previewUrl && (\n <div\n className={cn(\n \"relative border-2 border-dashed rounded-lg cursor-pointer transition-all duration-300 ease-in-out\",\n dragActive\n ? \"border-teal-500 bg-teal-50 scale-[1.02]\"\n : \"border-gray-300 hover:border-teal-400 hover:bg-gray-50\",\n className,\n isUploading && \"pointer-events-none opacity-60\"\n )}\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n >\n <input\n type=\"file\"\n accept=\"application/pdf\"\n ref={fileInputRef}\n onChange={handleInputChange}\n className=\"hidden\"\n />\n\n <div className=\"p-8 text-center\">\n <div className=\"flex flex-col items-center space-y-4\">\n <div\n className={cn(\n \"p-3 rounded-full transition\",\n dragActive\n ? \"bg-teal-600 text-white\"\n : \"bg-gray-100 text-teal-600 hover:bg-teal-100\"\n )}\n >\n <FileText size={24} />\n </div>\n\n <div>\n <p className=\"text-base font-medium text-gray-700 mb-1\">\n {dragActive\n ? \"Déposez votre PDF ici\"\n : \"Glissez-déposez votre PDF\"}\n </p>\n <p className=\"text-sm text-gray-500\">\n ou{\" \"}\n <span className=\"text-teal-600 font-medium hover:underline\">\n cliquez pour parcourir\n </span>\n </p>\n <p className=\"text-xs text-gray-400 mt-2\">\n Format accepté : PDF uniquement\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Preview du PDF */}\n {(uploadedPDF ||\n previewUrl ||\n previewStatus === \"loading\" ||\n previewStatus === \"error\") && (\n <div className=\"space-y-3\">\n {/* Boutons d'action */}\n <div className=\"flex items-center justify-between p-3 bg-white border border-gray-200 rounded-lg\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"p-2 bg-red-50 rounded-lg\">\n <FileText size={20} className=\"text-red-600\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-gray-800 truncate\">\n {uploadedPDF?.name}\n </p>\n {(uploadedPDF?.size ?? previewUrl) && (\n <p className=\"text-sm text-gray-500\">\n {uploadedPDF?.size\n ? formatFileSize(uploadedPDF.size)\n : \"\"}\n </p>\n )}\n </div>\n </div>\n <div className=\"flex space-x-2\">\n {uploadedPDF && (\n <button\n type=\"button\"\n onClick={() => window.open(uploadedPDF.url, \"_blank\")}\n className=\"p-2 hover:bg-teal-50 rounded-lg transition-colors\"\n title=\"Ouvrir dans un nouvel onglet\"\n >\n <Eye size={20} className=\"text-teal-600\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => void removePDF()}\n className=\"p-2 hover:bg-red-50 rounded-lg transition-colors disabled:opacity-60\"\n title=\"Supprimer\"\n disabled={isDeleting}\n >\n {isDeleting ? (\n <Loader2 size={20} className=\"animate-spin text-red-500\" />\n ) : (\n <Trash2 size={20} className=\"text-red-500\" />\n )}\n </button>\n </div>\n </div>\n\n {previewStatus === \"loading\" ? (\n <div className=\"border border-dashed border-gray-200 rounded-lg bg-white p-6 text-center text-sm text-gray-500 flex flex-col items-center gap-3\">\n <Loader2 size={24} className=\"animate-spin text-teal-600\" />\n <span>Génération de l'aperçu en cours…</span>\n </div>\n ) : previewUrl ? (\n <div className=\"border border-gray-200 rounded-lg overflow-hidden bg-gray-50\">\n <iframe\n src={previewUrl}\n className=\"w-full h-96\"\n title=\"Aperçu PDF\"\n />\n </div>\n ) : (\n <div className=\"border border-dashed border-gray-200 rounded-lg bg-white p-6 text-center text-sm text-gray-500\">\n {previewMessage ??\n \"Aperçu indisponible. Utilisez le bouton « Ouvrir » pour consulter le PDF.\"}\n </div>\n )}\n </div>\n )}\n\n {effectiveError && (\n <div className=\"rounded-md bg-red-50 border border-red-200 px-3 py-2 text-sm text-red-600\">\n {effectiveError}\n </div>\n )}\n </div>\n </FormFieldWrapper>\n );\n};\n\nexport default PDFFormField;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { Mic, MicOff, Play, Pause, Loader2, Trash2 } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nimport { FormFieldWrapper } from \"../../FormFieldWrapper\";\nimport type { FormField } from \"../../types/formTypeStructure\";\nimport { SpecialField } from \"../../types/formTypeStructure\";\nimport { useFileBucketManager } from \"../../hooks/useFileBucketManager\";\nimport { extractFileNameFromUrl } from \"../../utils/fileName\";\n\ninterface VoiceFormField extends FormField {\n fieldType: SpecialField.VOICE;\n}\n\ninterface VoiceFormFieldProps {\n field: VoiceFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string;\n className?: string;\n}\n\ninterface UploadedVoiceInfo {\n url: string;\n filename?: string;\n}\n\nconst VoiceFormField: React.FC<VoiceFormFieldProps> = ({\n field,\n name,\n currentLang = \"fr\",\n className,\n defaultValue,\n}) => {\n const { setValue } = useFormContext();\n const [isRecording, setIsRecording] = useState(false);\n const [audioUrl, setAudioUrl] = useState<string | null>(null);\n const [remoteInfo, setRemoteInfo] = useState<UploadedVoiceInfo | null>(null);\n const [duration, setDuration] = useState(0);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const intervalRef = useRef<NodeJS.Timeout | null>(null);\n const fieldName = name ?? field.fieldName.toString();\n const didInitRef = useRef(false);\n const {\n uploadFile,\n deleteFile,\n isUploading,\n isDeleting,\n error: bucketError,\n resetError,\n hasUploadSupport,\n hasDeleteSupport,\n } = useFileBucketManager(field.fileToBucketManage);\n\n const effectiveError = errorMessage ?? bucketError ?? null;\n\n useEffect(() => {\n if (typeof defaultValue === \"string\" && defaultValue.trim().length > 0) {\n setAudioUrl(defaultValue);\n setRemoteInfo({\n url: defaultValue,\n filename: extractFileNameFromUrl(defaultValue),\n });\n if (!didInitRef.current) {\n setValue(fieldName, defaultValue, {\n shouldValidate: false,\n shouldTouch: false,\n });\n didInitRef.current = true;\n }\n }\n }, [defaultValue, fieldName, setValue]);\n\n useEffect(() => {\n return () => {\n stopTimer();\n if (mediaRecorderRef.current && mediaRecorderRef.current.state !== \"inactive\") {\n mediaRecorderRef.current.stop();\n }\n if (audioRef.current) {\n audioRef.current.pause();\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const stopTimer = () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n\n const formatDuration = (seconds: number) => {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, \"0\")}`;\n };\n\n const startRecording = async () => {\n if (\n typeof navigator === \"undefined\" ||\n !navigator.mediaDevices ||\n !navigator.mediaDevices.getUserMedia\n ) {\n console.error(\n \"L'API mediaDevices.getUserMedia n'est pas disponible dans ce contexte.\"\n );\n alert(\n \"L'enregistrement audio n'est pas pris en charge par votre navigateur ou ce contexte (HTTPS requis).\"\n );\n return;\n }\n\n resetError();\n setErrorMessage(null);\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const mediaRecorder = new MediaRecorder(stream);\n mediaRecorderRef.current = mediaRecorder;\n chunksRef.current = [];\n\n mediaRecorder.ondataavailable = (e) => {\n if (e.data.size > 0) {\n chunksRef.current.push(e.data);\n }\n };\n\n mediaRecorder.onstop = async () => {\n const blob = new Blob(chunksRef.current, { type: \"audio/webm\" });\n\n if (!hasUploadSupport) {\n setErrorMessage(\n \"Configuration d'upload manquante pour ce champ (fileToBucketManage).\"\n );\n stream.getTracks().forEach((track) => track.stop());\n stopTimer();\n return;\n }\n\n const localUrl = URL.createObjectURL(blob);\n setAudioUrl(localUrl);\n setRemoteInfo(null);\n\n try {\n const result = await uploadFile({\n file: blob,\n fallbackFilename: `voice-${Date.now()}.webm`,\n });\n setAudioUrl(result.url);\n setRemoteInfo({\n url: result.url,\n filename: result.filename ?? extractFileNameFromUrl(result.url),\n });\n setValue(fieldName, result.url, {\n shouldValidate: true,\n shouldTouch: true,\n });\n URL.revokeObjectURL(localUrl);\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : \"Échec du téléversement de l'enregistrement.\";\n setErrorMessage(message);\n }\n\n stream.getTracks().forEach((track) => track.stop());\n stopTimer();\n };\n\n mediaRecorder.start();\n setIsRecording(true);\n setDuration(0);\n\n intervalRef.current = setInterval(() => {\n setDuration((prev) => prev + 1);\n }, 1000);\n } catch (error) {\n console.error(\"Erreur d'accès au microphone:\", error);\n alert(\"Impossible d'accéder au microphone. Vérifiez les permissions.\");\n }\n };\n\n const stopRecording = () => {\n if (mediaRecorderRef.current && isRecording) {\n mediaRecorderRef.current.stop();\n setIsRecording(false);\n stopTimer();\n }\n };\n\n const removeRecording = async () => {\n resetError();\n setErrorMessage(null);\n\n if (remoteInfo && hasDeleteSupport) {\n try {\n await deleteFile({\n filename:\n remoteInfo.filename ?? extractFileNameFromUrl(remoteInfo.url ?? \"\"),\n fileUrl: remoteInfo.url,\n });\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : \"Échec de la suppression de l'enregistrement distant.\";\n setErrorMessage(message);\n return;\n }\n }\n\n if (audioUrl && audioUrl.startsWith(\"blob:\")) {\n URL.revokeObjectURL(audioUrl);\n }\n\n setAudioUrl(null);\n setRemoteInfo(null);\n setDuration(0);\n setValue(fieldName, null, {\n shouldValidate: true,\n shouldTouch: true,\n });\n };\n\n const handlePlayPause = () => {\n if (audioRef.current) {\n if (audioRef.current.paused) {\n audioRef.current.play();\n } else {\n audioRef.current.pause();\n }\n }\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <div className=\"space-y-4\">\n {!audioUrl && (\n <div\n className={cn(\n \"relative border-2 border-dashed rounded-lg cursor-pointer transition-all duration-300 ease-in-out\",\n isRecording\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-teal-400 hover:bg-gray-50\",\n className\n )}\n >\n <div className=\"p-8 text-center\">\n <div className=\"flex flex-col items-center space-y-4\">\n <button\n type=\"button\"\n onClick={isRecording ? stopRecording : startRecording}\n className={cn(\n \"p-4 rounded-full transition-all duration-300\",\n isRecording\n ? \"bg-red-600 text-white animate-pulse\"\n : \"bg-teal-600 text-white hover:bg-teal-700\"\n )}\n disabled={isUploading}\n >\n {isRecording ? <Mic size={32} /> : <MicOff size={32} />}\n </button>\n\n <div>\n <p className=\"text-base font-medium text-gray-700 mb-1\">\n {isRecording\n ? \"Enregistrement en cours...\"\n : \"Enregistrer un message vocal\"}\n </p>\n {isRecording && (\n <p className=\"text-lg font-bold text-red-600\">\n {formatDuration(duration)}\n </p>\n )}\n {!isRecording && (\n <p className=\"text-sm text-gray-500\">\n Cliquez sur le bouton pour commencer\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {audioUrl && (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between p-4 bg-white border border-gray-200 rounded-lg\">\n <div className=\"flex items-center space-x-3\">\n <button\n type=\"button\"\n onClick={handlePlayPause}\n className=\"p-2 bg-teal-600 text-white rounded-full hover:bg-teal-700 transition-colors disabled:opacity-60\"\n disabled={!audioUrl}\n >\n <Play size={20} />\n </button>\n <audio\n ref={audioRef}\n src={audioUrl ?? undefined}\n onTimeUpdate={(e) => {\n const audio = e.currentTarget;\n if (audio.duration) {\n setDuration(audio.currentTime);\n }\n }}\n />\n <span className=\"text-sm text-gray-700 font-medium\">\n {formatDuration(duration)}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n {isUploading && (\n <Loader2 size={18} className=\"animate-spin text-teal-600\" />\n )}\n <button\n type=\"button\"\n onClick={() => void removeRecording()}\n className=\"p-2 hover:bg-red-50 rounded-lg transition-colors disabled:opacity-60\"\n disabled={isDeleting}\n >\n {isDeleting ? (\n <Loader2 size={18} className=\"animate-spin text-red-500\" />\n ) : (\n <Trash2 size={18} className=\"text-red-500\" />\n )}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {effectiveError && (\n <div className=\"rounded-md bg-red-50 border border-red-200 px-3 py-2 text-sm text-red-600\">\n {effectiveError}\n </div>\n )}\n </div>\n </FormFieldWrapper>\n );\n};\n\nexport default VoiceFormField;\n\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport {\n UploadCloud,\n FileText,\n Loader2,\n ExternalLink,\n Trash2,\n} from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nimport { FormFieldWrapper } from \"../../FormFieldWrapper\";\nimport { SpecialField, type FormField } from \"../../types/formTypeStructure\";\nimport { useFileBucketManager } from \"../../hooks/useFileBucketManager\";\nimport { extractFileNameFromUrl } from \"../../utils/fileName\";\n\ninterface DocumentFormField extends FormField {\n fieldType: SpecialField.DOCUMENT;\n}\n\ninterface DocumentFormFieldProps {\n field: DocumentFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string;\n className?: string;\n}\n\ninterface UploadedDocumentInfo {\n url: string;\n name: string;\n size?: number;\n type?: string;\n bucketFilename?: string;\n}\n\nconst DocumentFormField: React.FC<DocumentFormFieldProps> = ({\n field,\n name,\n currentLang = \"fr\",\n className,\n defaultValue,\n}) => {\n const { setValue } = useFormContext();\n const [dragActive, setDragActive] = useState(false);\n const [uploadedDocument, setUploadedDocument] =\n useState<UploadedDocumentInfo | null>(null);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const fieldName = name ?? field.fieldName.toString();\n const didInitRef = useRef(false);\n const {\n uploadFile,\n deleteFile,\n isUploading,\n isDeleting,\n error: bucketError,\n resetError,\n hasUploadSupport,\n hasDeleteSupport,\n } = useFileBucketManager(field.fileToBucketManage);\n\n const effectiveError = errorMessage ?? bucketError ?? null;\n\n useEffect(() => {\n if (typeof defaultValue === \"string\" && defaultValue.trim().length > 0) {\n setUploadedDocument({\n url: defaultValue,\n name: extractFileNameFromUrl(defaultValue) ?? defaultValue,\n bucketFilename: extractFileNameFromUrl(defaultValue) ?? undefined,\n });\n if (!didInitRef.current) {\n setValue(fieldName, defaultValue, {\n shouldValidate: false,\n shouldTouch: false,\n });\n didInitRef.current = true;\n }\n }\n }, [defaultValue, fieldName, setValue]);\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n };\n\n const getFileIcon = (fileName: string) => {\n const extension = fileName.split(\".\").pop()?.toLowerCase();\n switch (extension) {\n case \"doc\":\n case \"docx\":\n return \"📝\";\n case \"xls\":\n case \"xlsx\":\n return \"📊\";\n case \"ppt\":\n case \"pptx\":\n return \"📊\";\n default:\n return \"📄\";\n }\n };\n\n const handleDrag = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(e.type === \"dragenter\" || e.type === \"dragover\");\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n void handleFile(e.dataTransfer.files[0]);\n }\n };\n\n const handleFile = async (file: File) => {\n if (!hasUploadSupport) {\n setErrorMessage(\n \"Configuration d'upload manquante pour ce champ (fileToBucketManage).\"\n );\n return;\n }\n\n resetError();\n setErrorMessage(null);\n\n try {\n const result = await uploadFile({ file });\n setUploadedDocument({\n url: result.url,\n name:\n result.originalName ??\n result.filename ??\n extractFileNameFromUrl(result.url) ??\n file.name,\n size: file.size,\n type: file.type,\n bucketFilename: result.filename ?? extractFileNameFromUrl(result.url),\n });\n setValue(fieldName, result.url, {\n shouldValidate: true,\n shouldTouch: true,\n });\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Échec de l'upload du document.\";\n setErrorMessage(message);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n void handleFile(e.target.files[0]);\n }\n };\n\n const removeDocument = async () => {\n resetError();\n setErrorMessage(null);\n\n if (uploadedDocument && hasDeleteSupport) {\n try {\n await deleteFile({\n filename:\n uploadedDocument.bucketFilename ??\n extractFileNameFromUrl(uploadedDocument.url ?? \"\") ??\n undefined,\n fileUrl: uploadedDocument.url,\n });\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : \"Échec de la suppression du fichier distant.\";\n setErrorMessage(message);\n return;\n }\n }\n\n setUploadedDocument(null);\n setValue(fieldName, null, {\n shouldValidate: true,\n shouldTouch: true,\n });\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <div className=\"space-y-4\">\n {/* Zone de drop */}\n {!uploadedDocument && (\n <div\n className={cn(\n \"relative border-2 border-dashed rounded-lg cursor-pointer transition-all duration-300 ease-in-out\",\n dragActive\n ? \"border-teal-500 bg-teal-50 scale-[1.02]\"\n : \"border-gray-300 hover:border-teal-400 hover:bg-gray-50\",\n className,\n isUploading && \"pointer-events-none opacity-60\"\n )}\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n >\n <input\n type=\"file\"\n accept=\".doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.pdf\"\n ref={fileInputRef}\n onChange={handleInputChange}\n className=\"hidden\"\n />\n\n <div className=\"p-8 text-center\">\n <div className=\"flex flex-col items-center space-y-4\">\n <div\n className={cn(\n \"p-3 rounded-full transition\",\n dragActive\n ? \"bg-teal-600 text-white\"\n : \"bg-gray-100 text-teal-600 hover:bg-teal-100\"\n )}\n >\n <UploadCloud size={24} />\n </div>\n\n <div>\n <p className=\"text-base font-medium text-gray-700 mb-1\">\n {dragActive\n ? \"Déposez votre document ici\"\n : \"Glissez-déposez votre document\"}\n </p>\n <p className=\"text-sm text-gray-500\">\n ou{\" \"}\n <span className=\"text-teal-600 font-medium hover:underline\">\n cliquez pour parcourir\n </span>\n </p>\n <p className=\"text-xs text-gray-400 mt-2\">\n Formats acceptés : Word, Excel, PowerPoint, TXT, PDF\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Affichage du document sélectionné */}\n {uploadedDocument && (\n <div className=\"flex items-center justify-between p-4 bg-white border border-gray-200 rounded-lg hover:shadow-sm transition-shadow\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"text-2xl\">\n {getFileIcon(uploadedDocument.name)}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-gray-800 truncate\">\n {uploadedDocument.name}\n </p>\n {uploadedDocument.size && (\n <p className=\"text-sm text-gray-500\">\n {formatFileSize(uploadedDocument.size)}\n </p>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => window.open(uploadedDocument.url, \"_blank\")}\n className=\"p-2 hover:bg-teal-50 rounded-full transition-colors\"\n >\n <ExternalLink size={18} className=\"text-teal-600\" />\n </button>\n <button\n type=\"button\"\n onClick={() => void removeDocument()}\n className=\"p-2 hover:bg-red-100 rounded-full transition-colors disabled:opacity-60\"\n disabled={isDeleting}\n >\n {isDeleting ? (\n <Loader2 size={18} className=\"animate-spin text-red-500\" />\n ) : (\n <Trash2 size={18} className=\"text-red-500\" />\n )}\n </button>\n </div>\n </div>\n )}\n\n {effectiveError && (\n <div className=\"rounded-md bg-red-50 border border-red-200 px-3 py-2 text-sm text-red-600\">\n {effectiveError}\n </div>\n )}\n </div>\n </FormFieldWrapper>\n );\n};\n\nexport default DocumentFormField;\n\n","import React, { useCallback } from \"react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Image from \"@tiptap/extension-image\";\nimport Link from \"@tiptap/extension-link\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport { useFormContext } from \"react-hook-form\";\nimport { \n Bold, \n Italic, \n Underline, \n List, \n ListOrdered,\n Heading1,\n Heading2,\n Link as LinkIcon,\n Image as ImageIcon\n} from \"lucide-react\";\nimport { FormFieldWrapper } from \"../../FormFieldWrapper\";\nimport type { FormField } from \"../../types/formTypeStructure\";\nimport { SpecialField } from \"../../types/formTypeStructure\";\n\ninterface TipTapFormField extends FormField {\n fieldType: SpecialField.TIP_TAP_DOC_TEXT;\n}\n\ninterface TipTapFormFieldProps {\n field: TipTapFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string;\n className?: string;\n}\n\nconst TipTapFormField: React.FC<TipTapFormFieldProps> = ({\n field,\n name,\n currentLang = \"fr\",\n className,\n defaultValue,\n}) => {\n const { setValue } = useFormContext();\n const fieldName = name ?? field.fieldName.toString();\n\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n heading: {\n levels: [1, 2, 3],\n },\n }),\n Image.configure({\n inline: true,\n allowBase64: true,\n }),\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n target: '_blank',\n rel: 'noopener noreferrer',\n },\n }),\n Placeholder.configure({\n placeholder: \"Écrivez votre texte ici... (Utilisez le menu pour formater)\",\n }),\n ],\n content: defaultValue || \"\",\n onUpdate: ({ editor }) => {\n const html = editor.getHTML();\n setValue(fieldName, html, {\n shouldValidate: true,\n shouldTouch: true,\n });\n },\n });\n\n const addImage = useCallback(() => {\n const url = window.prompt('Entrez l\\'URL de l\\'image:');\n if (url && editor) {\n editor.chain().focus().setImage({ src: url }).run();\n }\n }, [editor]);\n\n const setLink = useCallback(() => {\n if (!editor) return;\n \n const previousUrl = editor.getAttributes('link').href;\n const url = window.prompt('URL du lien:', previousUrl);\n\n if (url === null) {\n return;\n }\n\n if (url === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n return;\n }\n\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\n }, [editor]);\n\n if (!editor) {\n return null;\n }\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <div className={`border border-slate-200 rounded-lg overflow-hidden shadow-sm ${className || ''}`}>\n {/* Toolbar */}\n <div className=\"border-b border-slate-100 bg-slate-50 p-2 flex flex-wrap items-center gap-0.5\">\n {/* Texte gras */}\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleBold().run()}\n className={`p-2 rounded hover:bg-gray-200 transition-colors ${\n editor.isActive('bold') ? 'bg-teal-100 text-teal-600' : 'text-gray-700'\n }`}\n >\n <Bold size={18} />\n </button>\n\n {/* Italique */}\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleItalic().run()}\n className={`p-2 rounded hover:bg-gray-200 transition-colors ${\n editor.isActive('italic') ? 'bg-teal-100 text-teal-600' : 'text-gray-700'\n }`}\n >\n <Italic size={18} />\n </button>\n\n {/* Souligné */}\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleStrike().run()}\n className={`p-2 rounded hover:bg-gray-200 transition-colors ${\n editor.isActive('strike') ? 'bg-teal-100 text-teal-600' : 'text-gray-700'\n }`}\n >\n <Underline size={18} />\n </button>\n\n {/* Séparateur */}\n <div className=\"w-px h-6 bg-gray-300 mx-1\" />\n\n {/* Titres */}\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}\n className={`p-2 rounded hover:bg-gray-200 transition-colors ${\n editor.isActive('heading', { level: 1 }) ? 'bg-teal-100 text-teal-600' : 'text-gray-700'\n }`}\n >\n <Heading1 size={18} />\n </button>\n\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\n className={`p-2 rounded hover:bg-gray-200 transition-colors ${\n editor.isActive('heading', { level: 2 }) ? 'bg-teal-100 text-teal-600' : 'text-gray-700'\n }`}\n >\n <Heading2 size={18} />\n </button>\n\n {/* Séparateur */}\n <div className=\"w-px h-6 bg-gray-300 mx-1\" />\n\n {/* Listes */}\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n className={`p-2 rounded hover:bg-gray-200 transition-colors ${\n editor.isActive('bulletList') ? 'bg-teal-100 text-teal-600' : 'text-gray-700'\n }`}\n >\n <List size={18} />\n </button>\n\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n className={`p-2 rounded hover:bg-gray-200 transition-colors ${\n editor.isActive('orderedList') ? 'bg-teal-100 text-teal-600' : 'text-gray-700'\n }`}\n >\n <ListOrdered size={18} />\n </button>\n\n {/* Séparateur */}\n <div className=\"w-px h-6 bg-gray-300 mx-1\" />\n\n {/* Lien */}\n <button\n type=\"button\"\n onClick={setLink}\n className={`p-2 rounded hover:bg-gray-200 transition-colors ${\n editor.isActive('link') ? 'bg-teal-100 text-teal-600' : 'text-gray-700'\n }`}\n >\n <LinkIcon size={18} />\n </button>\n\n {/* Image */}\n <button\n type=\"button\"\n onClick={addImage}\n className=\"p-2 rounded hover:bg-gray-200 transition-colors text-gray-700\"\n >\n <ImageIcon size={18} />\n </button>\n </div>\n\n {/* Éditeur */}\n <div className=\"prose prose-sm max-w-none\">\n <EditorContent \n editor={editor}\n className=\"p-4 min-h-48 focus-within:outline-none prose-headings:text-teal-700 prose-strong:text-teal-600\"\n />\n </div>\n </div>\n </FormFieldWrapper>\n );\n};\n\nexport default TipTapFormField;\n\n","import React from \"react\";\nimport type { FormField, Section } from \"./types/formTypeStructure\";\nimport { Eye, Edit, Plus, ArrowRight } from \"lucide-react\";\nimport ValidationBtn from \"./internal/button/ValidationBtn\";\nimport ButtonTooltip from \"./components/ButtonTooltip\";\n\n\n// Import des composants standards\nimport BoolFormField from \"./ui/BoolFormField\";\nimport CheckboxFormField from \"./ui/CheckboxFormField\";\nimport DateFormField from \"./ui/DateFormField\";\nimport DropdownFormField from \"./ui/DropdownFormField\";\nimport FileFormField from \"./ui/FileFormField\";\nimport NumberFormField from \"./ui/NumberFormField\";\nimport PasswordFormField from \"./ui/PasswordFormField\";\nimport RadioFormField from \"./ui/RadioFormField\";\nimport TextareaFormField from \"./ui/TextareaFormField\";\nimport TextFormField from \"./ui/TextFormField\";\n\n// Import des composants spéciaux\nimport ImageFormField from \"./ui/special/ImageFormField\";\nimport VideoFormField from \"./ui/special/VideoFormField\";\nimport AudioFormField from \"./ui/special/AudioFormField\";\nimport PDFFormField from \"./ui/special/PDFFormField\";\nimport VoiceFormField from \"./ui/special/VoiceFormField\";\nimport DocumentFormField from \"./ui/special/DocumentFormField\";\nimport TipTapFormField from \"./ui/special/TipTapFormField\";\nimport OTPRenderer from \"./components/OTPRenderer\";\n// import { useResponsiveSize } from \"./FormFieldWrapper\";\n\ninterface FieldRendererProps {\n field: FormField;\n currentLang?: string;\n className?: string;\n name?: string;\n formValues?: Record<string, any>;\n allSections?: Section[];\n currentSectionIndex?: number;\n // Nouvelles props pour les boutons de contrôle\n showControlButtons?: boolean;\n hasFilledData?: boolean;\n basedOnValue?: number; // Valeur du champ nombre pour les repeat groups\n onOpenModal?: () => void;\n onOpenEdit?: () => void;\n onOpenView?: () => void;\n dependentFieldNameTransformed?: string;\n}\n\nconst FieldRenderer: React.FC<FieldRendererProps> = ({\n field,\n currentLang = \"fr\",\n className = \"\",\n name,\n formValues,\n allSections = [],\n currentSectionIndex = 0,\n showControlButtons = false,\n hasFilledData = false,\n basedOnValue = 0,\n onOpenModal,\n onOpenEdit,\n onOpenView,\n dependentFieldNameTransformed\n}) => {\n const fieldKey = name ?? field.fieldName;\n const defaultValue = formValues?.[fieldKey];\n\n\n const renderControlButtons = () => {\n if (!showControlButtons) return null;\n\n return (\n <div className=\"flex justify-end mb-4 space-x-2\">\n {!hasFilledData && basedOnValue > 0 ? (\n /* Bouton Remplir - affiché quand aucune donnée n'est remplie ET quand basedOnValue > 0 */\n <ButtonTooltip content=\"Remplir les champs du groupe répétable\">\n <ValidationBtn\n type=\"button\"\n numerator={15}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onOpenModal?.();\n }}\n >\n Suivant\n <ArrowRight size={20} />\n </ValidationBtn>\n </ButtonTooltip>\n ) : hasFilledData ? (\n /* Boutons Modifier et Voir - affichés quand des données sont remplies */\n <>\n <ButtonTooltip content=\"Modifier les données du groupe\">\n <ValidationBtn\n type=\"button\"\n numerator={15}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onOpenEdit?.();\n }}\n >\n <Edit size={20} />\n </ValidationBtn>\n </ButtonTooltip>\n <ButtonTooltip content=\"Voir les données en lecture seule\">\n <ValidationBtn\n type=\"button\"\n numerator={15}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onOpenView?.();\n }}\n >\n <Eye size={20} />\n </ValidationBtn>\n </ButtonTooltip>\n </>\n ) : null}\n </div>\n );\n };\n\n\n\n const renderField = () => {\n switch (field.fieldType) {\n case \"text\":\n return (\n <TextFormField\n field={field as FormField & { fieldType: \"text\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n allSections={allSections}\n currentSectionIndex={currentSectionIndex}\n />\n );\n\n case \"textarea\":\n return (\n <TextareaFormField\n field={field as FormField & { fieldType: \"textarea\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n case \"password\":\n return (\n <PasswordFormField\n field={field as FormField & { fieldType: \"password\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n case \"number\":\n return (\n <NumberFormField\n field={field as FormField & { fieldType: \"number\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n case \"radio\":\n return (\n <RadioFormField\n field={field as FormField & { fieldType: \"radio\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n case \"checkbox\":\n return (\n <CheckboxFormField\n field={{\n ...(field as FormField & { fieldType: \"checkbox\" }),\n selectOptions: (field as any).selectOptions ?? [],\n }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n case \"bool\":\n return (\n <BoolFormField\n field={field as FormField & { fieldType: \"bool\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n case \"dropdown\":\n // Debug logs\n if (dependentFieldNameTransformed) {\n // console.log('🔍 [FieldRenderer] Passing dependentFieldNameTransformed to DropdownFormField:', {\n // fieldName: field.fieldName,\n // name,\n // dependentFieldNameTransformed,\n // hasDynamicFilterRule: !!(field as any).dynamicFilterRule,\n // dependentFieldName: (field as any).dynamicFilterRule?.dependentFieldName\n // });\n }\n return (\n <DropdownFormField\n field={{\n ...(field as FormField & { fieldType: \"dropdown\" }),\n selectOptions: (field as any).selectOptions ?? [],\n \n }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n dependentFieldNameTransformed={dependentFieldNameTransformed}\n />\n );\n\n case \"file\":\n return (\n <FileFormField\n field={field as FormField & { fieldType: \"file\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n case \"date\":\n return (\n <DateFormField\n field={field as FormField & { fieldType: \"date\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n // Champs spéciaux\n case \"IMAGE\":\n return (\n <ImageFormField\n field={field as FormField & { fieldType: \"IMAGE\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n case \"VIDEO\":\n return (\n <VideoFormField\n field={field as FormField & { fieldType: \"VIDEO\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n case \"AUDIO\":\n return (\n <AudioFormField\n field={field as FormField & { fieldType: \"AUDIO\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n case \"PDF\":\n return (\n <PDFFormField\n field={field as FormField & { fieldType: \"PDF\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n case \"VOICE\":\n return (\n <VoiceFormField\n field={field as FormField & { fieldType: \"VOICE\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n case \"DOCUMENT\":\n return (\n <DocumentFormField\n field={field as FormField & { fieldType: \"DOCUMENT\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n case \"TIP_TAP_DOC_TEXT\":\n return (\n <TipTapFormField\n field={field as FormField & { fieldType: \"TIP_TAP_DOC_TEXT\" }}\n currentLang={currentLang}\n className={className}\n name={name}\n defaultValue={defaultValue}\n />\n );\n\n default:\n return (\n <div className=\"text-red-500 font-semibold\">\n Champ non supporté : <code>{field.fieldType}</code>\n </div>\n );\n }\n };\n\n\n\n return (\n <div \n \n >\n \n {renderField()}\n\n {renderControlButtons()}\n </div>\n );\n};\n\nexport default FieldRenderer;\n","import React from 'react';\nimport { X, Eye, Edit, Plus, ChevronDown, ChevronUp } from 'lucide-react';\n\ninterface ModalHeaderProps {\n isViewMode: boolean;\n hasFilledData: boolean;\n fieldName: string;\n basedOnValue: number;\n onClose: () => void;\n onExpandAll: () => void;\n onCollapseAll: () => void;\n}\n\nconst ModalHeader: React.FC<ModalHeaderProps> = ({\n isViewMode,\n hasFilledData,\n fieldName,\n basedOnValue,\n onClose,\n onExpandAll,\n onCollapseAll\n}) => {\n const getIcon = () => {\n if (isViewMode) return <Eye className=\"h-4 w-4 sm:h-5 sm:w-5\" />;\n if (hasFilledData) return <Edit className=\"h-4 w-4 sm:h-5 sm:w-5\" />;\n return <Plus className=\"h-4 w-4 sm:h-5 sm:w-5\" />;\n };\n\n const getTitle = () => {\n if (isViewMode) return \"Visualisation\";\n if (hasFilledData) return \"Modifier\";\n return \"Remplir\";\n };\n\n return (\n <div className=\"bg-gradient-to-r from-[#008080] to-[#006666] p-4 sm:p-6 text-white\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2 sm:space-x-3\">\n <div className=\"p-1.5 sm:p-2 bg-white/20 rounded-lg\">\n {getIcon()}\n </div>\n <div>\n <h3 className=\"text-lg sm:text-xl font-bold\">\n {getTitle()} {fieldName}\n </h3>\n <p className=\"text-teal-100 text-xs sm:text-sm\">\n {basedOnValue} série{basedOnValue > 1 ? 's' : ''} à {isViewMode ? 'visualiser' : 'compléter'}\n </p>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1.5 sm:p-2 hover:bg-white/20 rounded-lg transition-colors\"\n >\n <X className=\"h-4 w-4 sm:h-5 sm:w-5\" />\n </button>\n </div>\n \n <div className=\"mt-4 flex space-x-2\">\n <button\n type=\"button\"\n onClick={onExpandAll}\n className=\"px-3 py-1.5 bg-white/20 hover:bg-white/30 rounded-lg text-sm font-medium transition-colors flex items-center space-x-1\"\n >\n <ChevronDown className=\"h-3 w-3\" />\n <span>Tout ouvrir</span>\n </button>\n <button\n type=\"button\"\n onClick={onCollapseAll}\n className=\"px-3 py-1.5 bg-white/20 hover:bg-white/30 rounded-lg text-sm font-medium transition-colors flex items-center space-x-1\"\n >\n <ChevronUp className=\"h-3 w-3\" />\n <span>Tout fermer</span>\n </button>\n </div>\n </div>\n );\n};\n\n\nexport default ModalHeader;","import { useMemo, useEffect } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport type { FormField, ValidationRule } from '../types/formTypeStructure';\nimport { getLocalizedText } from '../FormFieldWrapper';\n\n/**\n * Hook pour générer automatiquement des champs texte \"autre\" \n * lorsque l'utilisateur sélectionne \"autre\" ou \"autres\" dans un champ dropdown, radio ou checkbox\n */\nexport const useAutoOtherField = (\n fields: FormField[],\n currentLang: string = 'fr'\n): Record<string, FormField> => {\n const { watch, setValue } = useFormContext();\n\n // Surveiller toutes les valeurs du formulaire\n const formValues = watch();\n\n // Filtrer les champs qui peuvent générer un champ \"autre\"\n const eligibleFields = useMemo(() => {\n return fields.filter(field => \n (field.fieldType === 'dropdown' || \n field.fieldType === 'radio' || \n field.fieldType === 'checkbox') &&\n field.selectOptions?.some(opt => {\n const optionValue = typeof opt.value === 'string' ? opt.value : String(opt.value);\n return optionValue === 'autre' || optionValue === 'autres';\n })\n );\n }, [fields]);\n\n // Générer les champs \"autre\" dynamiquement\n const autoOtherFields = useMemo(() => {\n const generatedFields: Record<string, FormField> = {};\n\n eligibleFields.forEach(parentField => {\n const parentFieldName = parentField.fieldName;\n const parentValue = formValues[parentFieldName];\n const otherFieldName = `autre_${parentFieldName}`;\n\n // Vérifier si \"autre\" ou \"autres\" est sélectionné\n let shouldShowOtherField = false;\n\n if (parentField.fieldType === 'checkbox') {\n // Pour checkbox : vérifier si le tableau contient \"autre\" ou \"autres\"\n if (Array.isArray(parentValue)) {\n shouldShowOtherField = parentValue.includes('autre') || parentValue.includes('autres');\n }\n } else {\n // Pour dropdown et radio : vérifier la valeur exacte\n shouldShowOtherField = parentValue === 'autre' || parentValue === 'autres';\n }\n\n if (shouldShowOtherField) {\n // Générer le label \"Autre [label parent]\"\n const parentLabel = getLocalizedText(parentField.label, currentLang);\n const otherLabel = typeof parentField.label === 'string' \n ? `Autre ${parentLabel}`\n : Object.keys(parentField.label).reduce((acc, lang) => {\n acc[lang] = `Autre ${getLocalizedText(parentField.label, lang)}`;\n return acc;\n }, {} as { [lang: string]: string });\n\n // Hériter des validations required du parent\n const validations: ValidationRule[] = [];\n const parentRequired = parentField.validations?.some(\n v => v.validationType === 'required'\n );\n\n if (parentRequired) {\n validations.push({\n validationType: 'required',\n errMsg: `Veuillez préciser votre choix`\n });\n }\n\n // Créer le champ \"autre\"\n const otherField: FormField = {\n formFieldId: `autre_${parentField.formFieldId}`,\n fieldName: otherFieldName,\n fieldType: 'text',\n label: otherLabel,\n response: { responseValue: formValues[otherFieldName] || '' },\n validations: validations.length > 0 ? validations : undefined,\n placeholder: parentField.placeholder,\n width: parentField.width || 'half',\n };\n\n generatedFields[parentFieldName] = otherField;\n }\n });\n\n return generatedFields;\n }, [eligibleFields, formValues, currentLang]);\n\n // Nettoyage automatique : supprimer la valeur du champ \"autre\" quand \"autre\"/\"autres\" est désélectionné\n useEffect(() => {\n eligibleFields.forEach(parentField => {\n const parentFieldName = parentField.fieldName;\n const parentValue = formValues[parentFieldName];\n const otherFieldName = `autre_${parentFieldName}`;\n\n // Vérifier si \"autre\"/\"autres\" n'est plus sélectionné\n let shouldHaveOtherField = false;\n\n if (parentField.fieldType === 'checkbox') {\n if (Array.isArray(parentValue)) {\n shouldHaveOtherField = parentValue.includes('autre') || parentValue.includes('autres');\n }\n } else {\n shouldHaveOtherField = parentValue === 'autre' || parentValue === 'autres';\n }\n\n // Si le champ \"autre\" ne devrait plus être affiché mais a une valeur, nettoyer\n if (!shouldHaveOtherField && formValues[otherFieldName]) {\n setValue(otherFieldName, '', { shouldValidate: false, shouldTouch: false });\n }\n });\n }, [formValues, eligibleFields, setValue]);\n\n return autoOtherFields;\n};\n\n","import { useMemo, useEffect } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport type { FormField } from '../types/formTypeStructure';\nimport { getLocalizedText } from '../FormFieldWrapper';\n\n/**\n * Type pour représenter un groupe de champs de détails\n */\nexport interface DetailInfoGroup {\n groupLabel?: string;\n fields: FormField[];\n optionValue: string;\n}\n\n/**\n * Hook pour générer automatiquement des champs de détails\n * lorsque l'utilisateur sélectionne une option dans un champ dropdown, radio ou checkbox\n */\nexport const useDetailInfos = (\n fields: FormField[],\n currentLang: string = 'fr'\n): Record<string, DetailInfoGroup[]> => {\n const { watch, setValue } = useFormContext();\n\n // Surveiller toutes les valeurs du formulaire\n const formValues = watch();\n\n // Filtrer les champs qui ont detailInfos configuré\n const eligibleFields = useMemo(() => {\n return fields.filter(field => \n (field.fieldType === 'dropdown' || \n field.fieldType === 'radio' || \n field.fieldType === 'checkbox') &&\n field.detailInfos &&\n Object.keys(field.detailInfos).length > 0\n );\n }, [fields]);\n\n // Générer les groupes de champs de détails dynamiquement\n const detailInfosGroups = useMemo(() => {\n const generatedGroups: Record<string, DetailInfoGroup[]> = {};\n\n eligibleFields.forEach(parentField => {\n const parentFieldName = parentField.fieldName;\n const parentValue = formValues[parentFieldName];\n const groups: DetailInfoGroup[] = [];\n\n if (!parentField.detailInfos) return;\n\n if (parentField.fieldType === 'checkbox') {\n // Pour checkbox : générer un groupe pour chaque option sélectionnée\n if (Array.isArray(parentValue)) {\n parentValue.forEach((optionValue: string) => {\n const detailConfig = parentField.detailInfos![optionValue];\n if (detailConfig) {\n const groupLabel = detailConfig.label \n ? getLocalizedText(detailConfig.label, currentLang)\n : undefined;\n\n // Générer les champs avec les noms transformés\n const detailFields: FormField[] = detailConfig.formFields.map(detailField => {\n const detailFieldName = `${parentFieldName}_${optionValue}_${detailField.fieldName}`;\n return {\n ...detailField,\n formFieldId: `${parentField.formFieldId}_${optionValue}_${detailField.formFieldId}`,\n fieldName: detailFieldName,\n response: { \n responseValue: formValues[detailFieldName] || (detailField.response?.responseValue ?? '') \n },\n width: detailField.width || parentField.width || 'half',\n };\n });\n\n groups.push({\n groupLabel,\n fields: detailFields,\n optionValue,\n });\n }\n });\n }\n } else {\n // Pour dropdown et radio : générer un seul groupe si une option est sélectionnée\n if (parentValue && typeof parentValue === 'string') {\n const detailConfig = parentField.detailInfos![parentValue];\n if (detailConfig) {\n const groupLabel = detailConfig.label \n ? getLocalizedText(detailConfig.label, currentLang)\n : undefined;\n\n // Générer les champs avec les noms transformés\n const detailFields: FormField[] = detailConfig.formFields.map(detailField => {\n const detailFieldName = `${parentFieldName}_${parentValue}_${detailField.fieldName}`;\n return {\n ...detailField,\n formFieldId: `${parentField.formFieldId}_${parentValue}_${detailField.formFieldId}`,\n fieldName: detailFieldName,\n response: { \n responseValue: formValues[detailFieldName] || (detailField.response?.responseValue ?? '') \n },\n width: detailField.width || parentField.width || 'half',\n };\n });\n\n groups.push({\n groupLabel,\n fields: detailFields,\n optionValue: parentValue,\n });\n }\n }\n }\n\n if (groups.length > 0) {\n generatedGroups[parentFieldName] = groups;\n }\n });\n\n return generatedGroups;\n }, [eligibleFields, formValues, currentLang]);\n\n // Nettoyage automatique : supprimer les valeurs des champs de détails quand une option est désélectionnée\n useEffect(() => {\n eligibleFields.forEach(parentField => {\n const parentFieldName = parentField.fieldName;\n const parentValue = formValues[parentFieldName];\n\n if (!parentField.detailInfos) return;\n\n if (parentField.fieldType === 'checkbox') {\n // Pour checkbox : nettoyer uniquement les champs des options non sélectionnées\n if (Array.isArray(parentValue)) {\n Object.keys(parentField.detailInfos).forEach(optionValue => {\n if (!parentValue.includes(optionValue)) {\n // Option désélectionnée : nettoyer ses champs de détails\n const detailConfig = parentField.detailInfos![optionValue];\n if (detailConfig) {\n detailConfig.formFields.forEach(detailField => {\n const detailFieldName = `${parentFieldName}_${optionValue}_${detailField.fieldName}`;\n if (formValues[detailFieldName]) {\n setValue(detailFieldName, '', { shouldValidate: false, shouldTouch: false });\n }\n });\n }\n }\n });\n } else {\n // Si la valeur n'est plus un tableau, nettoyer tous les champs de détails\n Object.keys(parentField.detailInfos).forEach(optionValue => {\n const detailConfig = parentField.detailInfos![optionValue];\n if (detailConfig) {\n detailConfig.formFields.forEach(detailField => {\n const detailFieldName = `${parentFieldName}_${optionValue}_${detailField.fieldName}`;\n if (formValues[detailFieldName]) {\n setValue(detailFieldName, '', { shouldValidate: false, shouldTouch: false });\n }\n });\n }\n });\n }\n } else {\n // Pour dropdown et radio : nettoyer si une autre option est sélectionnée ou si aucune option\n const currentOptionValue = parentValue && typeof parentValue === 'string' ? parentValue : null;\n Object.keys(parentField.detailInfos).forEach(optionValue => {\n if (optionValue !== currentOptionValue) {\n // Option non sélectionnée : nettoyer ses champs de détails\n const detailConfig = parentField.detailInfos![optionValue];\n if (detailConfig) {\n detailConfig.formFields.forEach(detailField => {\n const detailFieldName = `${parentFieldName}_${optionValue}_${detailField.fieldName}`;\n if (formValues[detailFieldName]) {\n setValue(detailFieldName, '', { shouldValidate: false, shouldTouch: false });\n }\n });\n }\n }\n });\n }\n });\n }, [formValues, eligibleFields, setValue]);\n\n return detailInfosGroups;\n};\n\n","import React, { useMemo } from 'react';\nimport { ChevronDown, ChevronUp } from 'lucide-react';\nimport { useFormContext } from 'react-hook-form';\nimport FieldRenderer from '../../FieldRenderer';\nimport { useRepeatGroupDynamicFiltering } from '../../hooks/useDynamicFiltering';\nimport { useAutoOtherField } from '../../hooks/useAutoOtherField';\nimport { useDetailInfos, type DetailInfoGroup } from '../../hooks/useDetailInfos';\nimport type { FormField } from '../../types/formTypeStructure';\n\ninterface SeriesItemProps {\n index: number;\n repeatGroup: any;\n existingGroupData: Record<string, any>;\n buildTempFieldName: (childFieldName: string, index: number) => string;\n buildNestedGroupFieldName: (childGroupFieldName: string, index: number) => string;\n buildNestedChildFieldName: (\n childGroupFieldName: string,\n index: number,\n childFieldName: string,\n nestedIndex: number\n ) => string;\n isExpanded: boolean;\n isViewMode: boolean;\n currentLang: string;\n formValues: Record<string, any>;\n onToggle: (index: number) => void;\n seriesRef: (el: HTMLDivElement | null) => void;\n}\n\nconst SeriesItem: React.FC<SeriesItemProps> = ({\n index,\n repeatGroup,\n existingGroupData,\n buildTempFieldName,\n buildNestedGroupFieldName,\n buildNestedChildFieldName,\n isExpanded,\n isViewMode,\n currentLang,\n formValues,\n onToggle,\n seriesRef\n}) => {\n const { getValues, watch } = useFormContext();\n\n // Application du filtrage dynamique aux champs du repeatGroup avec l'index spécifique\n const filteredRepeatGroupFields = useRepeatGroupDynamicFiltering(\n repeatGroup.formFields,\n repeatGroup.fieldName,\n index\n );\n\n // 🆕 Générer les champs \"autre\" pour les champs du repeatGroup\n // Créer des champs avec les noms transformés pour le hook\n const fieldsWithTransformedNames = useMemo(() => {\n return filteredRepeatGroupFields.map(subField => ({\n ...subField,\n fieldName: buildTempFieldName(subField.fieldName, index),\n // Pour le hook, on doit aussi transformer le formFieldId pour l'unicité\n formFieldId: `${subField.formFieldId}_${index}`,\n }));\n }, [filteredRepeatGroupFields, index, buildTempFieldName]);\n\n const autoOtherFields = useAutoOtherField(fieldsWithTransformedNames, currentLang);\n\n // 🆕 Générer les groupes de détails pour les champs du repeatGroup\n const detailInfosGroups = useDetailInfos(fieldsWithTransformedNames, currentLang);\n\n // 🆕 Créer une liste de champs avec les champs \"autre\" et les groupes de détails injectés\n const fieldsWithAutoOtherAndDetails = useMemo(() => {\n const result: Array<{ \n field: FormField; \n isOtherField: boolean; \n isDetailGroup?: boolean;\n detailGroup?: DetailInfoGroup;\n originalFieldName?: string \n }> = [];\n \n filteredRepeatGroupFields.forEach(subField => {\n const tempName = buildTempFieldName(subField.fieldName, index);\n \n // Ajouter le champ parent\n result.push({ field: subField, isOtherField: false });\n \n // Si un champ \"autre\" existe pour ce champ parent, l'ajouter\n // Le hook retourne les champs avec les noms transformés, donc on cherche avec tempName\n const otherField = autoOtherFields[tempName];\n if (otherField) {\n // Adapter le nom du champ \"autre\" pour qu'il corresponde au pattern du repeatGroup\n const adaptedOtherField: FormField = {\n ...otherField,\n fieldName: `autre_${tempName}`, // autre_membres_langue_0\n };\n result.push({ \n field: adaptedOtherField, \n isOtherField: true,\n originalFieldName: subField.fieldName\n });\n }\n \n // Si des groupes de détails existent pour ce champ parent, les ajouter\n const detailGroups = detailInfosGroups[tempName];\n if (detailGroups && detailGroups.length > 0) {\n detailGroups.forEach(group => {\n // Adapter les noms des champs de détails pour correspondre au pattern du repeatGroup\n const adaptedDetailFields: FormField[] = group.fields.map(detailField => {\n // Le hook génère : \"{tempName}_{optionValue}_{detailFieldName}\"\n // On doit garder ce format car tempName est déjà transformé\n return {\n ...detailField,\n // Le nom est déjà correct (tempName contient déjà le pattern repeatGroup)\n };\n });\n \n result.push({\n field: subField, // Placeholder, ne sera pas utilisé\n isOtherField: false,\n isDetailGroup: true,\n detailGroup: {\n ...group,\n fields: adaptedDetailFields,\n },\n originalFieldName: subField.fieldName,\n });\n });\n }\n });\n \n return result;\n }, [filteredRepeatGroupFields, autoOtherFields, detailInfosGroups, index, buildTempFieldName]);\n\n return (\n <div className=\"group relative bg-gradient-to-br from-gray-50 to-gray-100 rounded-lg sm:rounded-xl border border-gray-200 hover:border-[#008080] transition-all duration-300 overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => onToggle(index)}\n className=\"w-full p-4 sm:p-6 flex items-center justify-between bg-white/50 hover:bg-white/70 transition-colors border-b border-gray-200\"\n >\n <div className=\"flex items-center space-x-3\">\n <div className=\"bg-gradient-to-r from-[#008080] to-[#006666] text-white px-2 sm:px-3 py-1 rounded-full text-xs sm:text-sm font-semibold shadow-lg\">\n Série {index + 1}\n </div>\n <span className=\"text-sm text-gray-600 font-medium\">\n {isExpanded ? 'Cliquez pour fermer' : 'Cliquez pour ouvrir'}\n </span>\n </div>\n <div className=\"flex items-center space-x-2 text-[#008080]\">\n {isExpanded ? (\n <ChevronUp className=\"h-5 w-5\" />\n ) : (\n <ChevronDown className=\"h-5 w-5\" />\n )}\n </div>\n </button>\n \n <div\n ref={seriesRef}\n className={`${!isExpanded ? 'h-0 opacity-0' : ''} overflow-hidden`}\n >\n <div className=\"p-4 sm:p-6 grid gap-3 sm:gap-4 grid-cols-1 sm:grid-cols-2\">\n {fieldsWithAutoOtherAndDetails.map(({ field: subField, isOtherField, isDetailGroup, detailGroup, originalFieldName }) => {\n // Si c'est un groupe de détails, le rendre séparément\n if (isDetailGroup && detailGroup) {\n return (\n <div\n key={`detail-group-${detailGroup.optionValue}-${index}`}\n className=\"col-span-1 sm:col-span-2 mt-4 p-4 bg-gray-50 rounded-lg border border-gray-200\"\n >\n {detailGroup.groupLabel && (\n <h4 className=\"font-semibold text-gray-700 mb-3 text-sm\">\n {detailGroup.groupLabel}\n </h4>\n )}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {detailGroup.fields.map((detailField) => {\n const detailFieldName = detailField.fieldName;\n // Le nom du champ de détail est déjà transformé (ex: \"membres_langue_0_fr_niveau\")\n // Pour existingGroupData, on sauvegarde avec le format: \"{parentFieldName}_{optionValue}_{detailFieldName}\"\n // On doit construire cette clé pour récupérer la valeur\n const detailFieldOriginalName = detailField.fieldName.split('_').slice(-1)[0]; // Dernière partie = nom original\n const detailDataKey = originalFieldName \n ? `${originalFieldName}_${detailGroup.optionValue}_${detailFieldOriginalName}`\n : detailFieldName;\n const detailFieldValue = existingGroupData[detailDataKey] ?? \"\";\n \n const detailFieldFormValues = {\n ...formValues,\n [detailFieldName]: detailFieldValue,\n };\n\n return (\n <div key={detailFieldName} className=\"space-y-2\">\n {isViewMode ? (\n <div className=\"bg-white/80 p-3 sm:p-4 rounded-lg border border-gray-200 shadow-sm\">\n <div className=\"text-xs sm:text-sm font-medium text-gray-600 mb-1\">\n {detailField.fieldName}\n </div>\n <div className=\"text-gray-900 font-medium text-sm sm:text-base\">\n {getValues(detailFieldName) || <span className=\"text-gray-400 italic\">Non renseigné</span>}\n </div>\n </div>\n ) : (\n <div className=\"bg-white/80 rounded-lg p-1 border border-gray-200 shadow-sm hover:shadow-md transition-shadow\">\n <FieldRenderer\n field={detailField}\n name={detailFieldName}\n currentLang={currentLang}\n formValues={detailFieldFormValues}\n showControlButtons={false}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n \n // Sinon, c'est un champ normal ou \"autre\"\n // Déterminer le nom du champ selon s'il s'agit d'un champ \"autre\" ou non\n const tempName = isOtherField \n ? subField.fieldName // Déjà transformé (autre_membres_langue_0)\n : buildTempFieldName(subField.fieldName, index);\n \n // Pour les champs \"autre\", utiliser le nom original pour récupérer la valeur depuis existingGroupData\n // Le nom dans existingGroupData sera \"autre_${originalFieldName}\"\n const dataKey = isOtherField && originalFieldName \n ? `autre_${originalFieldName}` \n : subField.fieldName;\n \n // Pour les champs \"autre\", la valeur peut être dans existingGroupData avec la clé \"autre_${originalFieldName}\"\n const fieldValue = isOtherField && originalFieldName\n ? (existingGroupData[`autre_${originalFieldName}`] ?? \"\")\n : (existingGroupData[dataKey] ?? \"\");\n \n const fieldSpecificFormValues = {\n ...formValues,\n [tempName]: fieldValue,\n };\n\n // 🆕 Calculer le nom transformé du champ parent si dynamicFilterRule existe\n // (seulement pour les champs non-\"autre\")\n const dependentFieldNameTransformed = !isOtherField && subField.dynamicFilterRule\n ? buildTempFieldName(subField.dynamicFilterRule.dependentFieldName, index)\n : undefined;\n\n // Les champs \"autre\" ne peuvent pas avoir de repeatGroup\n if (!isOtherField && subField.repeatGroup && subField.repeatRule) {\n const nestedCount = Math.max(0, Number(watch(tempName)) || 0);\n const nestedGroupName = buildNestedGroupFieldName(subField.repeatGroup.fieldName, index);\n const nestedExistingData = Array.isArray(existingGroupData[subField.repeatGroup.fieldName])\n ? existingGroupData[subField.repeatGroup.fieldName]\n : [];\n\n return (\n <div key={`${tempName}_nested`} className=\"space-y-4 sm:col-span-2\">\n <div className=\"bg-white/80 rounded-lg p-1 border border-gray-200 shadow-sm hover:shadow-md transition-shadow\">\n <FieldRenderer\n field={subField}\n name={tempName}\n currentLang={currentLang}\n formValues={fieldSpecificFormValues}\n showControlButtons={false}\n dependentFieldNameTransformed={dependentFieldNameTransformed}\n />\n </div>\n\n {nestedCount > 0 && (\n <div className=\"space-y-3\">\n {Array.from({ length: nestedCount }, (_, nestedIndex) => {\n const nestedEntry = nestedExistingData[nestedIndex] ?? {};\n return (\n <div\n key={`${nestedGroupName}_row_${nestedIndex}`}\n className=\"border border-teal-200 rounded-lg bg-white/70 shadow-sm\"\n >\n <div className=\"px-3 sm:px-4 py-2 bg-teal-50 border-b border-teal-100 text-sm sm:text-base font-semibold text-teal-700\">\n {currentLang === 'fr' ? `Dépendant ${nestedIndex + 1}` : `Dependant ${nestedIndex + 1}`}\n </div>\n <div className=\"p-3 sm:p-4 grid gap-3 sm:gap-4 grid-cols-1 sm:grid-cols-2\">\n {subField.repeatGroup!.formFields.map((childField: FormField) => {\n const childKey = buildNestedChildFieldName(\n subField.repeatGroup!.fieldName,\n index,\n childField.fieldName,\n nestedIndex\n );\n const childFormValues = {\n ...formValues,\n [childKey]: nestedEntry?.[childField.fieldName] ?? \"\",\n };\n\n // 🆕 Calculer le nom transformé du champ parent pour les nested groups\n // Pattern: {nestedGroupName}_{dependentFieldName}_{nestedIndex}\n const nestedGroupBaseName = buildNestedGroupFieldName(subField.repeatGroup!.fieldName, index);\n const dependentFieldNameTransformed = childField.dynamicFilterRule\n ? `${nestedGroupBaseName}_${childField.dynamicFilterRule.dependentFieldName}_${nestedIndex}`\n : undefined;\n\n return (\n <div key={childKey} className=\"space-y-2\">\n {isViewMode ? (\n <div className=\"bg-white/80 p-3 sm:p-4 rounded-lg border border-gray-200 shadow-sm\">\n <div className=\"text-xs sm:text-sm font-medium text-gray-600 mb-1\">\n {childField.fieldName}\n </div>\n <div className=\"text-gray-900 font-medium text-sm sm:text-base\">\n {getValues(childKey) || <span className=\"text-gray-400 italic\">Non renseigné</span>}\n </div>\n </div>\n ) : (\n <div className=\"bg-white/80 rounded-lg p-1 border border-gray-200 shadow-sm hover:shadow-md transition-shadow\">\n <FieldRenderer\n field={childField}\n name={childKey}\n currentLang={currentLang}\n formValues={childFormValues}\n showControlButtons={false}\n dependentFieldNameTransformed={dependentFieldNameTransformed}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div key={tempName} className=\"space-y-2\">\n {isViewMode ? (\n <div className=\"bg-white/80 p-3 sm:p-4 rounded-lg border border-gray-200 shadow-sm\">\n <div className=\"text-xs sm:text-sm font-medium text-gray-600 mb-1\">\n {subField.fieldName}\n </div>\n <div className=\"text-gray-900 font-medium text-sm sm:text-base\">\n {getValues(tempName) || <span className=\"text-gray-400 italic\">Non renseigné</span>}\n </div>\n </div>\n ) : (\n <div className=\"bg-white/80 rounded-lg p-1 border border-gray-200 shadow-sm hover:shadow-md transition-shadow\">\n <FieldRenderer\n field={subField}\n name={tempName}\n currentLang={currentLang}\n formValues={fieldSpecificFormValues}\n showControlButtons={false}\n dependentFieldNameTransformed={dependentFieldNameTransformed}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n\nexport default SeriesItem;","import React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useButtonSize } from \"./useButtonSize\";\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\nconst CancelBtn: React.FC<ButtonProps> = ({ children, className, onClick, ...props }) => {\n const { width, height, borderRadius, pressed, isMobile, transform, handlers } = useButtonSize();\n\n const content = (\n <span\n className=\"inline-flex items-center justify-center gap-2 font-medium text-sm\"\n style={{ color: \"var(--fe-primary)\" }}\n >\n {children}\n </span>\n );\n\n return (\n <button\n style={{\n width: `${width}px`,\n height: `${height}px`,\n borderRadius: `${borderRadius}px`,\n borderColor: \"var(--fe-primary)\",\n transform,\n transition: \"transform 0.2s ease, background-color 0.15s ease\",\n userSelect: \"none\",\n WebkitTapHighlightColor: \"transparent\",\n }}\n className={cn(\n \"inline-flex items-center justify-center px-6\",\n \"bg-white border text-sm font-medium whitespace-nowrap\",\n \"shadow-sm\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--fe-primary)] focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"cursor-pointer overflow-hidden relative group\",\n \"hover:bg-[var(--fe-primary-light)]\",\n className\n )}\n {...handlers}\n onClick={onClick}\n {...props}\n >\n <span className=\"relative overflow-hidden w-full h-full flex items-center justify-center\">\n <span\n className={cn(\n \"flex items-center justify-center transition-transform duration-300 w-full h-full\",\n !isMobile && \"group-hover:translate-x-full\"\n )}\n style={isMobile ? { transform: pressed ? \"translateX(100%)\" : \"translateX(0)\" } : {}}\n >\n {content}\n </span>\n <span\n className={cn(\n \"flex items-center justify-center absolute top-0 w-full h-full transition-transform duration-300\",\n !isMobile && \"group-hover:translate-x-[100%]\"\n )}\n style={{\n left: \"-100%\",\n ...(isMobile ? { transform: pressed ? \"translateX(100%)\" : \"translateX(0)\" } : {}),\n }}\n >\n {content}\n </span>\n </span>\n </button>\n );\n};\n\nexport default CancelBtn;\n","import React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useButtonSize } from \"./useButtonSize\";\n\ntype ButtonVariant = \"validation\" | \"cancel\" | \"red-flag\";\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n intent?: \"validation\" | \"cancel\";\n}\n\nconst Button: React.FC<ButtonProps> = ({\n children,\n className,\n variant = \"validation\",\n intent,\n onClick,\n ...props\n}) => {\n const effectiveVariant: ButtonVariant =\n intent === \"cancel\" ? \"cancel\" : intent === \"validation\" ? \"validation\" : variant;\n\n const { height, borderRadius, transform, handlers } = useButtonSize();\n\n const isCancel = effectiveVariant === \"cancel\";\n const isRedFlag = effectiveVariant === \"red-flag\";\n\n return (\n <button\n style={{\n height: `${height}px`,\n borderRadius: `${borderRadius}px`,\n ...(isCancel\n ? { borderColor: \"var(--fe-primary)\" }\n : !isRedFlag\n ? { backgroundColor: \"var(--fe-primary)\" }\n : {}),\n transform,\n transition: \"transform 0.2s ease, opacity 0.15s ease, background-color 0.15s ease\",\n userSelect: \"none\",\n WebkitTapHighlightColor: \"transparent\",\n }}\n className={cn(\n \"inline-flex items-center justify-center px-5\",\n \"text-sm font-medium whitespace-nowrap\",\n \"shadow-sm\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"cursor-pointer relative overflow-hidden\",\n isCancel && [\n \"bg-white border\",\n \"focus-visible:ring-[var(--fe-primary)]\",\n \"hover:bg-[var(--fe-primary-light)]\",\n ],\n !isCancel && !isRedFlag && [\n \"text-white\",\n \"focus-visible:ring-[var(--fe-primary)]\",\n \"hover:opacity-90\",\n ],\n isRedFlag && [\n \"bg-red-600 text-white\",\n \"focus-visible:ring-red-600\",\n \"hover:bg-red-700\",\n ],\n className\n )}\n {...handlers}\n onClick={onClick}\n {...props}\n >\n <span\n style={isCancel ? { color: \"var(--fe-primary)\" } : undefined}\n className=\"inline-flex items-center justify-center gap-2\"\n >\n {children}\n </span>\n </button>\n );\n};\n\nexport default Button;\n","import React from 'react';\nimport { Save } from 'lucide-react';\nimport ValidationBtn from '../../internal/button/ValidationBtn';\nimport CancelBtn from '../../internal/button/CancelBtn';\nimport Button from '../../internal/button/Button';\n\n\ninterface ModalFooterProps {\n isViewMode: boolean;\n onClose: () => void;\n onClear?: () => void;\n onSave: () => void;\n}\n\nconst ModalFooter: React.FC<ModalFooterProps> = ({\n isViewMode,\n onClose,\n onClear,\n onSave\n}) => {\n return (\n <div className=\"bg-gray-50 border-t border-gray-200 p-3 sm:p-6\">\n <div className=\"flex flex-col sm:flex-row justify-end space-y-2 sm:space-y-0 sm:space-x-3\">\n {isViewMode ? (\n <CancelBtn\n type=\"button\"\n onClick={onClose}\n className=\"w-full sm:w-auto px-4 sm:px-6 py-2.5 text-gray-600 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors font-medium text-sm sm:text-base\"\n >\n Fermer\n </CancelBtn>\n ) : (\n <>\n {onClear && (\n <Button\n variant=\"red-flag\"\n type=\"button\"\n onClick={onClear}\n className=\"w-full sm:w-auto px-4 sm:px-6 py-2.5\"\n >\n Effacer tout\n </Button>\n )}\n <ValidationBtn\n type=\"button\"\n onClick={onSave}\n className=\"w-full sm:w-auto px-4 sm:px-6 py-2.5 bg-gradient-to-r from-[#008080] to-[#006666] text-white rounded-lg hover:from-[#007070] hover:to-[#005555] transition-all font-medium shadow-lg hover:shadow-xl flex items-center justify-center space-x-2 text-sm sm:text-base\"\n >\n <Save className=\"h-4 w-4\" />\n <span>Sauvegarder</span>\n </ValidationBtn>\n </>\n )}\n </div>\n </div>\n );\n};\n\n\nexport default ModalFooter;","import { useRef, useCallback } from 'react';\n\nexport const useSeriesAnimations = (expandedSeries: Set<number>, basedOnValue: number) => {\n const seriesRefs = useRef<{ [key: number]: HTMLDivElement | null }>({});\n\n const animateSeriesToggle = useCallback((index: number, isExpanding: boolean) => {\n const el = seriesRefs.current[index];\n if (!el) return;\n\n const duration = window.innerWidth < 768 ? 200 : 300;\n\n if (isExpanding) {\n const targetHeight = el.scrollHeight;\n const anim = el.animate(\n [\n { height: '0px', opacity: '0' },\n { height: `${targetHeight}px`, opacity: '1' },\n ],\n { duration, easing: 'ease-out', fill: 'forwards' }\n );\n anim.onfinish = () => { el.style.height = 'auto'; };\n } else {\n const currentHeight = el.scrollHeight;\n el.animate(\n [\n { height: `${currentHeight}px`, opacity: '1' },\n { height: '0px', opacity: '0' },\n ],\n { duration, easing: 'ease-in-out', fill: 'forwards' }\n );\n }\n }, []);\n\n const animateExpandAll = useCallback(() => {\n const isMobile = window.innerWidth < 768;\n const duration = isMobile ? 150 : 300;\n const stagger = isMobile ? 50 : 100;\n\n Array.from({ length: basedOnValue }, (_, i) => i).forEach((index, i) => {\n const el = seriesRefs.current[index];\n if (el && !expandedSeries.has(index)) {\n const targetHeight = el.scrollHeight;\n const anim = el.animate(\n [\n { height: '0px', opacity: '0' },\n { height: `${targetHeight}px`, opacity: '1' },\n ],\n { duration, delay: i * stagger, easing: 'ease-out', fill: 'forwards' }\n );\n anim.onfinish = () => { el.style.height = 'auto'; };\n }\n });\n }, [basedOnValue, expandedSeries]);\n\n const animateCollapseAll = useCallback(() => {\n const isMobile = window.innerWidth < 768;\n const duration = isMobile ? 150 : 300;\n const stagger = isMobile ? 50 : 100;\n\n expandedSeries.forEach((index, i) => {\n const el = seriesRefs.current[index];\n if (el) {\n const currentHeight = el.scrollHeight;\n el.animate(\n [\n { height: `${currentHeight}px`, opacity: '1' },\n { height: '0px', opacity: '0' },\n ],\n { duration, delay: i * stagger, easing: 'ease-in-out', fill: 'forwards' }\n );\n }\n });\n }, [expandedSeries]);\n\n return {\n seriesRefs,\n animateSeriesToggle,\n animateExpandAll,\n animateCollapseAll,\n };\n};\n","import React, { useEffect, useMemo } from 'react';\nimport ModalHeader from './ModalHeader';\nimport SeriesItem from './SeriesItem';\nimport ModalFooter from './ModalFooter';\nimport { useSeriesAnimations } from '../hooks/useSeriesAnimations';\n\ninterface RepeatGroupModalProps {\n isModalOpen: boolean;\n isViewMode: boolean;\n modalRef: React.RefObject<HTMLDivElement | null>;\n overlayRef: React.RefObject<HTMLDivElement | null>;\n contentRef: React.RefObject<HTMLDivElement | null>;\n expandedSeries: Set<number>;\n basedOnValue: number;\n hasFilledData: boolean;\n repeatGroup: any;\n currentLang: string;\n formValues: Record<string, any>;\n filledSeries: any[];\n buildTempFieldName: (childFieldName: string, index: number) => string;\n buildNestedGroupFieldName: (childGroupFieldName: string, index: number) => string;\n buildNestedChildFieldName: (\n childGroupFieldName: string,\n index: number,\n childFieldName: string,\n nestedIndex: number\n ) => string;\n onClose: () => void;\n onClear?: () => void;\n onSave: () => void;\n onToggleSeries: (index: number) => void;\n setExpandedSeries: (expanded: Set<number>) => void;\n}\n\nconst RepeatGroupModal: React.FC<RepeatGroupModalProps> = ({\n isModalOpen,\n isViewMode,\n modalRef,\n overlayRef,\n contentRef,\n expandedSeries,\n basedOnValue,\n hasFilledData,\n repeatGroup,\n currentLang,\n formValues,\n filledSeries,\n buildTempFieldName,\n buildNestedGroupFieldName,\n buildNestedChildFieldName,\n onClose,\n onClear,\n onSave,\n onToggleSeries,\n setExpandedSeries\n}) => {\n const { seriesRefs, animateSeriesToggle, animateExpandAll, animateCollapseAll } = \n useSeriesAnimations(expandedSeries, basedOnValue);\n\n // Optimisation : Mémoriser les indices à rendre\n const seriesToRender = useMemo(() => {\n if (!isModalOpen) return [];\n \n // Toujours rendre toutes les séries (optimisation supprimée pour éviter les bugs)\n // On laisse le scroll gérer la performance\n const visibleIndices = new Set<number>();\n \n for (let i = 0; i < basedOnValue; i++) {\n visibleIndices.add(i);\n }\n \n return Array.from(visibleIndices).sort((a, b) => a - b);\n }, [isModalOpen, basedOnValue]);\n\n useEffect(() => {\n if (isModalOpen) {\n // Optimisation : Étendre seulement la première série au lieu de toutes\n setExpandedSeries(new Set([0]));\n }\n }, [isModalOpen, setExpandedSeries]);\n\n const handleToggleSeries = (index: number) => {\n const isExpanding = !expandedSeries.has(index);\n \n // Optimisation : Animation plus légère\n if (isExpanding) {\n onToggleSeries(index);\n // Animation différée pour éviter le blocage\n setTimeout(() => {\n animateSeriesToggle(index, true);\n }, 50);\n } else {\n animateSeriesToggle(index, false);\n setTimeout(() => onToggleSeries(index), 300);\n }\n };\n\n const handleExpandAll = () => {\n // Optimisation : Étendre progressivement\n const allIndices = Array.from({ length: basedOnValue }, (_, i) => i);\n setExpandedSeries(new Set(allIndices));\n \n // Animation différée pour éviter le blocage\n setTimeout(() => {\n animateExpandAll();\n }, 100);\n };\n\n const handleCollapseAll = () => {\n animateCollapseAll();\n setTimeout(() => {\n setExpandedSeries(new Set());\n }, 300);\n };\n\n if (!isModalOpen) return null;\n\n return (\n <div\n ref={modalRef}\n className=\"fixed inset-0 z-[100] flex items-center justify-center p-2 sm:p-4\"\n >\n {/* FULLSCREEN OVERLAY */}\n <div\n ref={overlayRef}\n className=\"fixed inset-0 bg-black bg-opacity-60 backdrop-blur-sm transition-opacity\"\n onClick={onClose}\n />\n\n {/* MODAL CONTENT */}\n <div\n ref={contentRef}\n className=\"relative z-10 bg-white w-[90%] sm:w-auto max-w-4xl max-h-[95vh] sm:max-h-[90vh] rounded-xl shadow-xl overflow-hidden flex flex-col\"\n >\n <ModalHeader\n isViewMode={isViewMode}\n hasFilledData={hasFilledData}\n fieldName={repeatGroup.fieldName}\n basedOnValue={basedOnValue}\n onClose={onClose}\n onExpandAll={handleExpandAll}\n onCollapseAll={handleCollapseAll}\n />\n\n {/* MAIN CONTENT - Optimisé */}\n <div className=\"flex-1 overflow-y-auto p-4 sm:p-6 custom-scrollbar\">\n <div className=\"space-y-4\">\n {seriesToRender.map((index) => (\n <SeriesItem\n key={index}\n index={index}\n repeatGroup={repeatGroup}\n existingGroupData={filledSeries[index] ?? {}}\n buildTempFieldName={buildTempFieldName}\n buildNestedGroupFieldName={buildNestedGroupFieldName}\n buildNestedChildFieldName={buildNestedChildFieldName}\n isExpanded={expandedSeries.has(index)}\n isViewMode={isViewMode}\n currentLang={currentLang}\n formValues={formValues}\n onToggle={handleToggleSeries}\n seriesRef={(el) => { seriesRefs.current[index] = el; }}\n />\n ))}\n </div>\n </div>\n\n <ModalFooter\n isViewMode={isViewMode}\n onClose={onClose}\n onClear={onClear}\n onSave={onSave}\n />\n </div>\n </div>\n );\n};\n\nexport default RepeatGroupModal;","import { useState } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport type { FormField } from '../../types/formTypeStructure';\n\nexport const useRepeatGroupLogic = (field: FormField, formValues: Record<string, any>) => {\n const { getValues, setValue, watch } = useFormContext();\n const [expandedSeries, setExpandedSeries] = useState<Set<number>>(new Set());\n \n const repeatGroup = field.repeatGroup!;\n const watchedValue = watch(field.fieldName);\n const basedOnValue = Number(watchedValue) || 0;\n const filledSeries = formValues?.[repeatGroup.fieldName] ?? [];\n\n const buildTempFieldName = (childFieldName: string, index: number) =>\n `${repeatGroup.fieldName}_${childFieldName}_${index}`;\n\n const buildNestedGroupFieldName = (childGroupFieldName: string, index: number) =>\n `${repeatGroup.fieldName}_${childGroupFieldName}_${index}`;\n\n const buildNestedChildFieldName = (\n childGroupFieldName: string,\n index: number,\n childFieldName: string,\n nestedIndex: number\n ) => `${buildNestedGroupFieldName(childGroupFieldName, index)}_${childFieldName}_${nestedIndex}`;\n\n const hasFilledData = filledSeries.some((group: any) =>\n Object.values(group || {}).some((v) => v !== \"\" && v !== null && v !== undefined)\n );\n\n const toggleSeries = (index: number) => {\n const newExpanded = new Set(expandedSeries);\n if (newExpanded.has(index)) {\n newExpanded.delete(index);\n } else {\n newExpanded.add(index);\n }\n setExpandedSeries(newExpanded);\n };\n\n const expandAll = () => {\n const allIndices = Array.from({ length: basedOnValue }, (_, i) => i);\n setExpandedSeries(new Set(allIndices));\n };\n\n const collapseAll = () => {\n setExpandedSeries(new Set());\n };\n\n const prefillTempFields = (series: any[]) => {\n for (let i = 0; i < basedOnValue; i++) {\n const groupData = series[i] ?? {};\n repeatGroup.formFields.forEach((subField) => {\n const fieldKey = buildTempFieldName(subField.fieldName, i);\n const currentValue = groupData[subField.fieldName];\n setValue(fieldKey, currentValue ?? \"\", {\n shouldValidate: true,\n shouldDirty: true,\n });\n\n // 🆕 Préremplir les champs \"autre\" si ils existent dans les données\n const otherFieldKey = `autre_${fieldKey}`;\n const otherFieldName = `autre_${subField.fieldName}`;\n if (groupData[otherFieldName] !== undefined) {\n setValue(otherFieldKey, groupData[otherFieldName] ?? \"\", {\n shouldValidate: true,\n shouldDirty: true,\n });\n }\n\n // 🆕 Préremplir les champs de détails si ils existent dans les données\n if (subField.detailInfos) {\n const parentValue = groupData[subField.fieldName];\n if (parentValue) {\n // Pour unichoix\n if (typeof parentValue === 'string') {\n const detailConfig = subField.detailInfos[parentValue];\n if (detailConfig) {\n detailConfig.formFields.forEach(detailField => {\n const detailDataKey = `${subField.fieldName}_${parentValue}_${detailField.fieldName}`;\n const detailFieldKey = `${fieldKey}_${parentValue}_${detailField.fieldName}`;\n if (groupData[detailDataKey] !== undefined) {\n setValue(detailFieldKey, groupData[detailDataKey] ?? \"\", {\n shouldValidate: true,\n shouldDirty: true,\n });\n }\n });\n }\n }\n // Pour multichoix (checkbox)\n else if (Array.isArray(parentValue)) {\n parentValue.forEach((optionValue: string) => {\n const detailConfig = subField.detailInfos[optionValue];\n if (detailConfig) {\n detailConfig.formFields.forEach(detailField => {\n const detailDataKey = `${subField.fieldName}_${optionValue}_${detailField.fieldName}`;\n const detailFieldKey = `${fieldKey}_${optionValue}_${detailField.fieldName}`;\n if (groupData[detailDataKey] !== undefined) {\n setValue(detailFieldKey, groupData[detailDataKey] ?? \"\", {\n shouldValidate: true,\n shouldDirty: true,\n });\n }\n });\n }\n });\n }\n }\n }\n\n if (subField.repeatGroup) {\n const nestedData = Array.isArray(groupData[subField.repeatGroup.fieldName])\n ? groupData[subField.repeatGroup.fieldName]\n : [];\n\n if ((currentValue === undefined || currentValue === null || currentValue === \"\") && nestedData.length > 0) {\n setValue(fieldKey, nestedData.length, {\n shouldValidate: true,\n shouldDirty: true,\n });\n }\n\n nestedData.forEach((nestedEntry: Record<string, any> = {}, nestedIndex: number) => {\n subField.repeatGroup!.formFields.forEach((childField) => {\n const childKey = buildNestedChildFieldName(\n subField.repeatGroup!.fieldName,\n i,\n childField.fieldName,\n nestedIndex\n );\n setValue(childKey, nestedEntry?.[childField.fieldName] ?? \"\", {\n shouldValidate: true,\n shouldDirty: true,\n });\n });\n });\n }\n });\n }\n };\n\n const saveGroups = () => {\n const groups: Record<string, any>[] = [];\n for (let i = 0; i < basedOnValue; i++) {\n const group: Record<string, any> = {};\n repeatGroup.formFields.forEach((subField) => {\n const fieldKey = buildTempFieldName(subField.fieldName, i);\n const rawValue = getValues(fieldKey);\n group[subField.fieldName] = rawValue;\n\n // 🆕 Sauvegarder les champs \"autre\" si ils existent\n const otherFieldKey = `autre_${fieldKey}`;\n const otherFieldValue = getValues(otherFieldKey);\n if (otherFieldValue !== undefined && otherFieldValue !== null && otherFieldValue !== \"\") {\n group[`autre_${subField.fieldName}`] = otherFieldValue;\n }\n\n // 🆕 Sauvegarder les champs de détails si ils existent\n if (subField.detailInfos) {\n if (subField.fieldType === 'checkbox' && Array.isArray(rawValue)) {\n // Pour multichoix : sauvegarder les détails de chaque option sélectionnée\n rawValue.forEach((optionValue: string) => {\n const detailConfig = subField.detailInfos![optionValue];\n if (detailConfig) {\n detailConfig.formFields.forEach(detailField => {\n const detailFieldKey = `${fieldKey}_${optionValue}_${detailField.fieldName}`;\n const detailValue = getValues(detailFieldKey);\n if (detailValue !== undefined && detailValue !== null && detailValue !== \"\") {\n group[`${subField.fieldName}_${optionValue}_${detailField.fieldName}`] = detailValue;\n }\n });\n }\n });\n } else if (typeof rawValue === 'string' && rawValue) {\n // Pour unichoix : sauvegarder les détails de l'option sélectionnée\n const detailConfig = subField.detailInfos[rawValue];\n if (detailConfig) {\n detailConfig.formFields.forEach(detailField => {\n const detailFieldKey = `${fieldKey}_${rawValue}_${detailField.fieldName}`;\n const detailValue = getValues(detailFieldKey);\n if (detailValue !== undefined && detailValue !== null && detailValue !== \"\") {\n group[`${subField.fieldName}_${rawValue}_${detailField.fieldName}`] = detailValue;\n }\n });\n }\n }\n }\n\n if (subField.repeatGroup) {\n const nestedCount = Math.max(0, Number(rawValue) || 0);\n const nestedEntries: Record<string, any>[] = [];\n\n for (let nestedIndex = 0; nestedIndex < nestedCount; nestedIndex++) {\n const nestedEntry: Record<string, any> = {};\n subField.repeatGroup.formFields.forEach((childField) => {\n const childKey = buildNestedChildFieldName(\n subField.repeatGroup!.fieldName,\n i,\n childField.fieldName,\n nestedIndex\n );\n nestedEntry[childField.fieldName] = getValues(childKey);\n });\n nestedEntries.push(nestedEntry);\n }\n\n group[subField.repeatGroup.fieldName] = nestedEntries;\n }\n });\n groups.push(group);\n }\n\n setValue(repeatGroup.fieldName, groups, {\n shouldValidate: true,\n shouldDirty: true,\n });\n };\n\n const clearGroups = () => {\n for (let i = 0; i < basedOnValue; i++) {\n repeatGroup.formFields.forEach((subField) => {\n const fieldKey = buildTempFieldName(subField.fieldName, i);\n const currentValue = getValues(fieldKey);\n\n // 🆕 Nettoyer les champs \"autre\" aussi\n const otherFieldKey = `autre_${fieldKey}`;\n setValue(otherFieldKey, \"\", {\n shouldValidate: true,\n shouldDirty: true,\n });\n\n // 🆕 Nettoyer les champs de détails aussi\n if (subField.detailInfos) {\n Object.keys(subField.detailInfos).forEach(optionValue => {\n const detailConfig = subField.detailInfos![optionValue];\n if (detailConfig) {\n detailConfig.formFields.forEach(detailField => {\n const detailFieldKey = `${fieldKey}_${optionValue}_${detailField.fieldName}`;\n setValue(detailFieldKey, \"\", {\n shouldValidate: true,\n shouldDirty: true,\n });\n });\n }\n });\n }\n\n if (subField.repeatGroup) {\n const nestedCount = Math.max(0, Number(currentValue) || 0);\n for (let nestedIndex = 0; nestedIndex < nestedCount; nestedIndex++) {\n subField.repeatGroup.formFields.forEach((childField) => {\n const childKey = buildNestedChildFieldName(\n subField.repeatGroup!.fieldName,\n i,\n childField.fieldName,\n nestedIndex\n );\n setValue(childKey, \"\", {\n shouldValidate: true,\n shouldDirty: true,\n });\n });\n }\n setValue(buildNestedGroupFieldName(subField.repeatGroup.fieldName, i), [], {\n shouldValidate: true,\n shouldDirty: true,\n });\n }\n\n setValue(fieldKey, \"\", {\n shouldValidate: true,\n shouldDirty: true,\n });\n });\n }\n\n setValue(repeatGroup.fieldName, [], {\n shouldValidate: true,\n shouldDirty: true,\n });\n\n setValue(field.fieldName, 0, {\n shouldValidate: true,\n shouldDirty: true,\n });\n };\n\n return {\n expandedSeries,\n setExpandedSeries,\n basedOnValue,\n filledSeries,\n watchedValue,\n hasFilledData,\n repeatGroup,\n toggleSeries,\n expandAll,\n collapseAll,\n prefillTempFields,\n saveGroups,\n clearGroups,\n buildTempFieldName,\n buildNestedGroupFieldName,\n buildNestedChildFieldName,\n };\n};\n\n\n","import { useState, useEffect, useRef } from 'react';\n\nexport const useModalLogic = () => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [isViewMode, setIsViewMode] = useState(false);\n const [manuallyClosed, setManuallyClosed] = useState(false);\n\n const modalRef = useRef<HTMLDivElement>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n const openModal = (viewMode: boolean = false, allowAutoOpen: boolean = true) => {\n if (!allowAutoOpen && manuallyClosed) return;\n setIsViewMode(viewMode);\n setIsModalOpen(true);\n if (allowAutoOpen) setManuallyClosed(false);\n };\n\n const closeModal = (isManualClose: boolean = false) => {\n if (!contentRef.current || !overlayRef.current) return;\n if (isManualClose) setManuallyClosed(true);\n\n const contentAnim = contentRef.current.animate(\n [\n { opacity: '1', transform: 'scale(1) translateY(0px)' },\n { opacity: '0', transform: 'scale(0.9) translateY(20px)' },\n ],\n { duration: 150, easing: 'ease-in', fill: 'forwards' }\n );\n\n overlayRef.current.animate(\n [{ opacity: '1' }, { opacity: '0' }],\n { duration: 100, delay: 50, easing: 'ease-in', fill: 'forwards' }\n );\n\n contentAnim.onfinish = () => {\n setIsModalOpen(false);\n setIsViewMode(false);\n };\n };\n\n // Animation d'ouverture\n useEffect(() => {\n if (isModalOpen && overlayRef.current && contentRef.current) {\n overlayRef.current.animate(\n [{ opacity: '0' }, { opacity: '1' }],\n { duration: 150, easing: 'ease-out', fill: 'forwards' }\n );\n\n contentRef.current.animate(\n [\n { opacity: '0', transform: 'scale(0.9) translateY(20px)' },\n { opacity: '1', transform: 'scale(1) translateY(0px)' },\n ],\n { duration: 200, delay: 50, easing: 'ease-out', fill: 'forwards' }\n );\n }\n }, [isModalOpen]);\n\n useEffect(() => {\n document.body.style.overflow = isModalOpen ? 'hidden' : '';\n return () => { document.body.style.overflow = ''; };\n }, [isModalOpen]);\n\n return {\n isModalOpen,\n isViewMode,\n modalRef,\n overlayRef,\n contentRef,\n openModal,\n closeModal,\n manuallyClosed,\n };\n};\n","import React, { useEffect } from 'react';\nimport FieldRenderer from '../FieldRenderer';\nimport RepeatGroupModal from './components/RepeatGroupModal';\nimport { useRepeatGroupLogic } from './hooks/useRepeatGroupLogic';\nimport { useModalLogic } from './hooks/useModalLogic';\nimport type { FormField } from '../types/formTypeStructure';\n\ninterface RepeatGroupRendererProps {\n field: FormField;\n formValues: Record<string, any>;\n currentLang?: string;\n}\n\nconst RepeatGroupRenderer: React.FC<RepeatGroupRendererProps> = ({\n field,\n formValues,\n currentLang = \"fr\",\n}) => {\n const {\n expandedSeries,\n setExpandedSeries,\n basedOnValue,\n filledSeries,\n watchedValue,\n hasFilledData,\n repeatGroup,\n toggleSeries,\n prefillTempFields,\n saveGroups,\n clearGroups,\n buildTempFieldName,\n buildNestedGroupFieldName,\n buildNestedChildFieldName\n } = useRepeatGroupLogic(field, formValues);\n\n const {\n isModalOpen,\n isViewMode,\n modalRef,\n overlayRef,\n contentRef,\n openModal,\n closeModal,\n manuallyClosed\n } = useModalLogic();\n\n // Effet pour déclencher automatiquement l'ouverture\n useEffect(() => {\n const currentValue = Number(watchedValue) || 0;\n \n if (currentValue > 0 && !hasFilledData && !isModalOpen) {\n setTimeout(() => {\n openModal(false, false); // Deuxième param: false = ouverture auto, donc pas d'ouverture si manuallyClosed\n }, 300);\n } else if (currentValue === 0) {\n closeModal(false); // Fermeture automatique, pas manuelle\n }\n }, [watchedValue, hasFilledData, isModalOpen, openModal, closeModal]);\n\n const handleOpenEdit = () => {\n prefillTempFields(filledSeries);\n openModal(false, true); // Ouverture manuelle\n };\n\n const handleOpenView = () => {\n prefillTempFields(filledSeries);\n openModal(true, true); // Ouverture manuelle\n };\n\n const handleSave = () => {\n saveGroups();\n closeModal(true); // Fermeture après sauvegarde = manuelle pour empêcher réouverture\n };\n \n const handleClose = () => {\n closeModal(true); // X = fermeture manuelle pour empêcher la réouverture auto\n };\n \n const handleClear = () => {\n clearGroups();\n closeModal(false); // Effacer = nettoyage + fermeture (pas manuelle car data supprimée)\n };\n\n return (\n <div className=\"space-y-6\">\n <FieldRenderer\n field={field}\n currentLang={currentLang}\n formValues={formValues}\n showControlButtons={true}\n hasFilledData={hasFilledData}\n basedOnValue={basedOnValue}\n onOpenModal={() => openModal(false, true)}\n onOpenEdit={handleOpenEdit}\n onOpenView={handleOpenView}\n />\n\n <RepeatGroupModal\n isModalOpen={isModalOpen}\n isViewMode={isViewMode}\n modalRef={modalRef}\n overlayRef={overlayRef}\n contentRef={contentRef}\n expandedSeries={expandedSeries}\n basedOnValue={basedOnValue}\n hasFilledData={hasFilledData}\n repeatGroup={repeatGroup}\n currentLang={currentLang}\n formValues={formValues}\n filledSeries={filledSeries}\n buildTempFieldName={buildTempFieldName}\n buildNestedGroupFieldName={buildNestedGroupFieldName}\n buildNestedChildFieldName={buildNestedChildFieldName}\n onClose={handleClose}\n onClear={handleClear}\n onSave={handleSave}\n onToggleSeries={toggleSeries}\n setExpandedSeries={setExpandedSeries}\n />\n </div>\n );\n};\n\nexport default RepeatGroupRenderer;","import React, { useState, useEffect, useRef } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { FormFieldWrapper, getLocalizedText } from \"../../FormFieldWrapper\";\nimport type { FormField } from \"../../types/formTypeStructure\";\nimport { SpecialField } from \"../../types/formTypeStructure\";\n\ninterface OTPFormField extends FormField {\n fieldType: SpecialField.OTP;\n}\n\ninterface OTPFormFieldProps {\n field: OTPFormField;\n name?: string;\n currentLang?: string;\n defaultValue?: string;\n className?: string;\n onOTPComplete?: (otpCode: string) => void; // 🆕 Callback quand le code est complet\n}\n\nconst OTPFormField: React.FC<OTPFormFieldProps> = ({\n field,\n name,\n currentLang = \"fr\",\n className,\n defaultValue = \"\",\n onOTPComplete, // 🆕\n}) => {\n const { setValue, watch } = useFormContext();\n const fieldName = name ?? field.fieldName.toString();\n const otpLength = field.otpFormFieldExecOptions?.otpLength ?? 6;\n \n // État local pour les cases OTP\n const [otpValues, setOtpValues] = useState<string[]>(\n Array(otpLength).fill(\"\")\n );\n \n // Références pour les inputs\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\n // Synchroniser avec react-hook-form\n const currentValue = watch(fieldName);\n useEffect(() => {\n if (currentValue && typeof currentValue === \"string\" && currentValue.length === otpLength) {\n const values = currentValue.split(\"\").slice(0, otpLength);\n setOtpValues(values);\n } else if (defaultValue && defaultValue.length === otpLength) {\n const values = defaultValue.split(\"\").slice(0, otpLength);\n setOtpValues(values);\n }\n }, [currentValue, defaultValue, otpLength]);\n\n // Mettre à jour RHF quand les valeurs changent\n useEffect(() => {\n const otpString = otpValues.join(\"\");\n if (otpString.length === otpLength) {\n setValue(fieldName, otpString, {\n shouldValidate: true,\n shouldTouch: true,\n });\n } else {\n setValue(fieldName, otpString, {\n shouldValidate: false,\n shouldTouch: true,\n });\n }\n }, [otpValues, fieldName, setValue, otpLength]);\n\n // 🆕 Détecter quand le code OTP est complet et déclencher l'auto-validation\n useEffect(() => {\n const otpString = otpValues.join(\"\");\n if (otpString.length === otpLength && onOTPComplete) {\n // Délai court pour laisser le temps à RHF de se mettre à jour\n const timer = setTimeout(() => {\n onOTPComplete(otpString);\n }, 100);\n return () => clearTimeout(timer);\n }\n }, [otpValues, otpLength, onOTPComplete]);\n\n const handleChange = (index: number, value: string) => {\n // Ne permettre que les chiffres\n const numericValue = value.replace(/\\D/g, \"\");\n \n if (numericValue.length > 1) {\n // Si plusieurs caractères, prendre le dernier\n const lastChar = numericValue.slice(-1);\n updateOTPValue(index, lastChar);\n } else if (numericValue.length === 1) {\n updateOTPValue(index, numericValue);\n } else {\n updateOTPValue(index, \"\");\n }\n };\n\n const updateOTPValue = (index: number, value: string) => {\n const newValues = [...otpValues];\n newValues[index] = value;\n setOtpValues(newValues);\n\n // Auto-avancement vers la case suivante\n if (value && index < otpLength - 1) {\n setTimeout(() => {\n inputRefs.current[index + 1]?.focus();\n }, 10);\n }\n };\n\n const handleKeyDown = (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n // Navigation avec les flèches\n if (e.key === \"ArrowLeft\" && index > 0) {\n e.preventDefault();\n inputRefs.current[index - 1]?.focus();\n } else if (e.key === \"ArrowRight\" && index < otpLength - 1) {\n e.preventDefault();\n inputRefs.current[index + 1]?.focus();\n }\n \n // Backspace : effacer et revenir en arrière\n if (e.key === \"Backspace\" && !otpValues[index] && index > 0) {\n e.preventDefault();\n inputRefs.current[index - 1]?.focus();\n }\n \n // Delete : effacer la case courante\n if (e.key === \"Delete\") {\n updateOTPValue(index, \"\");\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pastedData = e.clipboardData.getData(\"text\").replace(/\\D/g, \"\");\n const values = pastedData.slice(0, otpLength).split(\"\");\n \n const newValues = [...otpValues];\n values.forEach((char, i) => {\n if (i < otpLength) {\n newValues[i] = char;\n }\n });\n \n setOtpValues(newValues);\n \n // Focus sur la dernière case remplie ou la première vide\n const lastFilledIndex = Math.min(values.length - 1, otpLength - 1);\n setTimeout(() => {\n inputRefs.current[lastFilledIndex]?.focus();\n }, 10);\n };\n\n return (\n <FormFieldWrapper field={field} currentLang={currentLang}>\n <div className={`flex gap-2 justify-center ${className || \"\"}`}>\n {otpValues.map((value, index) => (\n <input\n key={index}\n ref={(el) => {\n inputRefs.current[index] = el;\n }}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n value={value}\n onChange={(e) => handleChange(index, e.target.value)}\n onKeyDown={(e) => handleKeyDown(index, e)}\n onPaste={handlePaste}\n className=\"w-12 h-12 text-center text-2xl font-bold border-2 border-teal-500 rounded-lg text-teal-700 focus:border-teal-600 focus:ring-2 focus:ring-teal-200 outline-none transition-all bg-white\"\n autoFocus={index === 0 && !otpValues.some(v => v)}\n />\n ))}\n </div>\n </FormFieldWrapper>\n );\n};\n\nexport default OTPFormField;\n\n","import React from 'react';\nimport { X, ExternalLink } from 'lucide-react';\nimport OTPFormField from '../ui/special/OTPFormField';\nimport type { FormField } from '../types/formTypeStructure';\nimport type { OTPServerResponse } from '../hooks/useOTPHandler';\nimport ValidationBtn from '../internal/button/ValidationBtn';\nimport CancelBtn from '../internal/button/CancelBtn';\n\ninterface OTPModalProps {\n isOpen: boolean;\n field: FormField;\n currentLang: string;\n formValues: Record<string, any>;\n serverResponse: OTPServerResponse | null;\n isSending: boolean;\n isResending?: boolean; // 🆕 État de renvoi en cours\n resendCooldown?: number; // 🆕 Cooldown restant en secondes\n otpValidated?: boolean; // 🆕 État de validation réussie\n onClose: () => void;\n onSendOTP: () => void;\n onValidateOTP: () => void; // 🆕 Fonction pour valider l'OTP\n onResendOTP?: () => void; // 🆕 Fonction pour renvoyer le code\n onCallbackRedirect: (url: string) => void;\n onSubmit?: () => void; // 🆕 Fonction pour soumettre le formulaire\n onNext?: () => void; // 🆕 Fonction pour aller à la section suivante\n isLastSection?: boolean; // 🆕 Indique si c'est la dernière section\n linkedEmail?: string | null;\n onOTPComplete?: (otpCode: string) => void; // 🆕 Callback quand le code est complet\n}\n\nconst OTPModal: React.FC<OTPModalProps> = ({\n isOpen,\n field,\n currentLang,\n formValues,\n serverResponse,\n isSending,\n isResending = false,\n resendCooldown = 0,\n otpValidated = false,\n onClose,\n onSendOTP,\n onValidateOTP,\n onResendOTP,\n onCallbackRedirect,\n onSubmit,\n onNext,\n isLastSection = false,\n linkedEmail,\n onOTPComplete,\n}) => {\n const modalRef = React.useRef<HTMLDivElement>(null);\n const overlayRef = React.useRef<HTMLDivElement>(null);\n const contentRef = React.useRef<HTMLDivElement>(null);\n\n // Animation d'ouverture\n React.useEffect(() => {\n if (isOpen && overlayRef.current && contentRef.current) {\n overlayRef.current.animate(\n [{ opacity: '0' }, { opacity: '1' }],\n { duration: 150, easing: 'ease-out', fill: 'forwards' }\n );\n contentRef.current.animate(\n [\n { opacity: '0', transform: 'scale(0.9) translateY(20px)' },\n { opacity: '1', transform: 'scale(1) translateY(0px)' },\n ],\n { duration: 200, delay: 50, easing: 'ease-out', fill: 'forwards' }\n );\n }\n }, [isOpen]);\n\n // Bloquer le scroll\n React.useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"\";\n }\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const hasCallbackUrl = serverResponse?.call_back_url && serverResponse?.call_back_url.trim() !== \"\";\n\n return (\n <div\n ref={modalRef}\n className=\"fixed inset-0 z-[100] flex items-center justify-center p-2 sm:p-4\"\n style={{ display: isOpen ? 'flex' : 'none' }}\n >\n {/* FULLSCREEN OVERLAY */}\n <div\n ref={overlayRef}\n className=\"fixed inset-0 bg-black bg-opacity-60 backdrop-blur-sm transition-opacity\"\n onClick={onClose}\n />\n\n {/* MODAL CONTENT */}\n <div\n ref={contentRef}\n className=\"relative z-10 bg-white w-[90%] sm:w-auto max-w-md max-h-[95vh] sm:max-h-[90vh] rounded-xl shadow-xl overflow-hidden flex flex-col\"\n >\n {/* HEADER */}\n <div className=\"flex items-center justify-between p-6 border-b border-gray-200\">\n <h2 className=\"text-xl font-semibold text-gray-900\">\n {typeof field.label === 'string' ? field.label : field.label[currentLang] || field.label['fr'] || 'Vérification OTP'}\n </h2>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-gray-400 hover:text-gray-600 transition-colors\"\n >\n <X size={24} />\n </button>\n </div>\n\n {/* MAIN CONTENT */}\n <div className=\"flex-1 overflow-y-auto p-6 custom-scrollbar\">\n {field.helpText && (\n <p className=\"text-sm text-gray-600 mb-4\">\n {typeof field.helpText === 'string' \n ? field.helpText \n : field.helpText[currentLang] || field.helpText['fr'] || ''}\n </p>\n )}\n\n {/* Afficher l'email lié si disponible */}\n {linkedEmail && (\n <div className=\"mb-4 p-3 bg-blue-50 border border-blue-200 rounded-lg\">\n <p className=\"text-sm text-blue-800\">\n Code envoyé à : <span className=\"font-semibold\">{linkedEmail}</span>\n </p>\n </div>\n )}\n\n <OTPFormField\n field={field as FormField & { fieldType: \"OTP\" }}\n currentLang={currentLang}\n onOTPComplete={onOTPComplete}\n />\n\n {/* 🆕 Bouton \"Renvoyer le code\" */}\n {field.otpFormFieldExecOptions?.enableResend !== false && !otpValidated && linkedEmail && onResendOTP && (\n <div className=\"mt-4 flex items-center justify-center gap-2\">\n <p className=\"text-sm text-gray-600\">\n Vous n'avez pas reçu le code ?\n </p>\n <button\n type=\"button\"\n onClick={onResendOTP}\n disabled={isResending || resendCooldown > 0}\n className=\"text-sm text-teal-600 hover:text-teal-800 font-medium disabled:text-gray-400 disabled:cursor-not-allowed transition-colors underline\"\n >\n {isResending \n ? \"Envoi en cours...\" \n : resendCooldown > 0 \n ? `Renvoyer (${resendCooldown}s)` \n : \"Renvoyer le code\"}\n </button>\n </div>\n )}\n\n {/* Affichage des messages serveur */}\n {serverResponse?.message && (\n <div className={`mt-4 p-3 rounded-lg ${\n serverResponse.success \n ? 'bg-green-50 text-green-800 border border-green-200' \n : 'bg-red-50 text-red-800 border border-red-200'\n }`}>\n <p className=\"text-sm\">{serverResponse.message}</p>\n </div>\n )}\n\n {/* Lien de redirection si call_back_url présent */}\n {hasCallbackUrl && (\n <div className=\"mt-6 p-4 bg-blue-50 border border-blue-200 rounded-lg\">\n <p className=\"text-sm text-blue-800 mb-3\">\n Continuer sur :\n </p>\n <button\n type=\"button\"\n onClick={() => onCallbackRedirect(serverResponse!.call_back_url!)}\n className=\"flex items-center gap-2 text-blue-600 hover:text-blue-800 font-medium transition-colors\"\n >\n <ExternalLink size={16} />\n <span className=\"underline break-all\">{serverResponse!.call_back_url}</span>\n </button>\n </div>\n )}\n </div>\n\n {/* FOOTER */}\n <div className=\"flex justify-end gap-3 p-6 border-t border-gray-200 bg-gray-50\">\n {!otpValidated && (\n <CancelBtn\n type=\"button\"\n onClick={onClose}\n >\n Annuler\n </CancelBtn>\n )}\n \n {hasCallbackUrl && (\n <ValidationBtn\n type=\"button\"\n onClick={() => onCallbackRedirect(serverResponse!.call_back_url!)}\n >\n Continuer sur\n </ValidationBtn>\n )}\n \n {!hasCallbackUrl && !otpValidated && (\n <ValidationBtn\n type=\"button\"\n onClick={onValidateOTP}\n disabled={isSending}\n >\n {isSending ? 'Validation en cours...' : 'Valider OTP'}\n </ValidationBtn>\n )}\n \n {!hasCallbackUrl && otpValidated && (\n <ValidationBtn\n type=\"button\"\n onClick={isLastSection && onSubmit ? onSubmit : onNext}\n >\n {isLastSection ? 'Soumettre le formulaire' : 'Continuer'}\n </ValidationBtn>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default OTPModal;\n\n","import { useState, useCallback } from 'react';\nimport type { OTPFormFieldExecOptions } from '../types/formTypeStructure';\nimport { useOTPTokenStore } from '../store/useOTPTokenStore';\n\nexport interface OTPAuthToken {\n access_token: string;\n token_type?: string; // \"bearer\" par défaut\n expires_in?: number; // en secondes\n expires_at?: number; // timestamp Unix (calculé depuis expires_in)\n}\n\nexport interface OTPServerResponse {\n success: boolean;\n call_back_url?: string;\n message?: string;\n // Nouveau : Token d'authentification\n authToken?: OTPAuthToken;\n // Support pour différents formats de réponse\n access_token?: string; // Format direct depuis l'API\n token_type?: string;\n expires_in?: number;\n}\n\nconst isMap = (\n payload?: Map<string, unknown> | Record<string, unknown>\n): payload is Map<string, unknown> => payload instanceof Map;\n\nconst normalizePayload = (\n payload?: Map<string, unknown> | Record<string, unknown>\n): Record<string, unknown> => {\n if (!payload) {\n return {};\n }\n if (isMap(payload)) {\n return Object.fromEntries(payload.entries());\n }\n return { ...payload };\n};\n\nconst buildAbsoluteUrl = (serverDns: string, endpoint: string): string => {\n const base = serverDns.replace(/\\/+$/, \"\");\n if (/^https?:\\/\\//i.test(endpoint)) {\n return endpoint;\n }\n const path = endpoint.replace(/^\\/+/, \"\");\n return `${base}/${path}`;\n};\n\nconst withTimeout = <T,>(\n promise: Promise<T>,\n timeoutMs?: number,\n controller?: AbortController\n): Promise<T> => {\n if (!timeoutMs || timeoutMs <= 0 || !controller) {\n return promise;\n }\n\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n return promise.finally(() => {\n clearTimeout(timeout);\n });\n};\n\n// Fonction pour extraire le token depuis différentes structures de réponse\nconst extractAuthToken = (responseData: Record<string, any>): OTPAuthToken | null => {\n // Chercher la clé qui contient \"token\" (insensible à la casse)\n const tokenKey = Object.keys(responseData).find(\n (key) => key.toLowerCase().includes('token') && typeof responseData[key] === 'string'\n );\n \n if (!tokenKey) {\n return null;\n }\n \n const tokenValue = responseData[tokenKey];\n if (!tokenValue || typeof tokenValue !== 'string') {\n return null;\n }\n \n // Construire OTPAuthToken\n const authToken: OTPAuthToken = {\n access_token: tokenValue,\n token_type: responseData.token_type || responseData.tokenType || 'bearer',\n expires_in: responseData.expires_in || responseData.expiresIn,\n };\n \n // Calculer expires_at si expires_in est présent\n if (authToken.expires_in) {\n authToken.expires_at = Math.floor(Date.now() / 1000) + authToken.expires_in;\n }\n \n return authToken;\n};\n\nexport const useOTPHandler = (\n options?: OTPFormFieldExecOptions,\n formId?: string,\n fieldName?: string\n) => {\n const [isSending, setIsSending] = useState(false);\n const [otpSent, setOtpSent] = useState(false);\n const [otpValidated, setOtpValidated] = useState(false); // 🆕 État pour la validation réussie\n const [serverResponse, setServerResponse] = useState<OTPServerResponse | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [resendCooldown, setResendCooldown] = useState<number>(0); // 🆕 Cooldown en secondes\n const [isResending, setIsResending] = useState(false); // 🆕 État pour le renvoi\n \n const setOTPToken = useOTPTokenStore((state) => state.setOTPToken);\n\n const sendOTP = useCallback(\n async (formData: Record<string, any>): Promise<OTPServerResponse> => {\n if (!options) {\n throw new Error(\"OTP options are not configured for this field\");\n }\n\n setIsSending(true);\n setError(null);\n\n try {\n const controller = new AbortController();\n const url = buildAbsoluteUrl(options.serverDns, options.postApiEndPoint);\n \n // Normaliser et fusionner le payload\n const basePayload = normalizePayload(options.payload);\n const mergedPayload = {\n ...basePayload,\n ...formData, // Fusionner avec les données du formulaire\n };\n\n // Préparer les headers\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(options.extraHeaders ?? {}),\n };\n\n if (options.bearer) {\n headers.Authorization = `Bearer ${options.bearer}`;\n }\n\n // Envoyer la requête POST\n const fetchPromise = fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(mergedPayload),\n signal: controller.signal,\n });\n\n const response = await withTimeout(\n fetchPromise,\n options.timeoutMs,\n controller\n );\n\n let payload: any = null;\n try {\n payload = await response.json();\n } catch {\n // Si la réponse n'est pas du JSON, essayer de lire le texte\n const text = await response.text();\n throw new Error(`Invalid JSON response: ${text}`);\n }\n\n if (!response.ok) {\n const message =\n payload?.message ??\n `OTP request failed with status ${response.status} ${response.statusText}`;\n throw new Error(message);\n }\n\n // 🎯 Gestion spéciale pour httpbin.org (mock endpoint)\n // httpbin.org/post retourne les données dans payload.json\n let responseData = payload;\n if (payload?.json) {\n // Format httpbin.org\n responseData = payload.json;\n }\n\n // 🎯 Simulation de réponse OTP pour les tests\n // Si on utilise httpbin.org, simuler une réponse réussie\n const isHttpbin = url.includes(\"httpbin.org\");\n if (isHttpbin) {\n // Simuler une réponse OTP réussie\n // Pour tester call_back_url, décommenter la ligne suivante:\n // const serverResponse: OTPServerResponse = {\n // success: true,\n // call_back_url: \"https://example.com/redirect\",\n // message: \"OTP vérifié avec succès (simulation)\",\n // };\n \n // Réponse normale (sans redirection)\n const serverResponse: OTPServerResponse = {\n success: true,\n message: \"OTP vérifié avec succès (simulation httpbin)\",\n };\n \n setOtpSent(true);\n setServerResponse(serverResponse);\n return serverResponse;\n }\n\n // Construire la réponse standardisée pour les vrais endpoints\n const serverResponse: OTPServerResponse = {\n success: responseData?.success ?? true,\n call_back_url: responseData?.call_back_url ?? responseData?.callback_url ?? responseData?.callBackUrl,\n message: responseData?.message,\n };\n\n setOtpSent(true);\n setServerResponse(serverResponse);\n\n return serverResponse;\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Unexpected OTP error\";\n setError(message);\n throw err;\n } finally {\n setIsSending(false);\n }\n },\n [options]\n );\n\n const handleCallbackRedirect = useCallback(\n (url: string, clearForm: () => void) => {\n // Vider le formulaire\n clearForm();\n \n // Rediriger vers l'URL\n window.location.href = url;\n },\n []\n );\n\n // 🆕 Fonction pour valider l'OTP (vérifie si le code est \"123456\" pour la simulation)\n const validateOTP = useCallback(\n async (otpCode: string, formData: Record<string, any>): Promise<OTPServerResponse> => {\n if (!options) {\n throw new Error(\"OTP options are not configured for this field\");\n }\n\n setIsSending(true);\n setError(null);\n\n try {\n // 🎯 Simulation : \"123456\" est le code OTP correct\n const CORRECT_OTP = \"123456\";\n \n // Simuler un délai de validation\n await new Promise(resolve => setTimeout(resolve, 800));\n\n if (otpCode !== CORRECT_OTP) {\n const errorMessage = \"Code OTP invalide. Veuillez réessayer.\";\n setError(errorMessage);\n throw new Error(errorMessage);\n }\n\n // Code OTP correct - simuler l'appel API\n const controller = new AbortController();\n const url = buildAbsoluteUrl(options.serverDns, options.postApiEndPoint);\n \n // Normaliser et fusionner le payload\n const basePayload = normalizePayload(options.payload);\n const mergedPayload = {\n ...basePayload,\n ...formData,\n otpCode, // Ajouter le code OTP au payload\n };\n\n // Préparer les headers\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(options.extraHeaders ?? {}),\n };\n\n if (options.bearer) {\n headers.Authorization = `Bearer ${options.bearer}`;\n }\n\n // Envoyer la requête POST\n const fetchPromise = fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(mergedPayload),\n signal: controller.signal,\n });\n\n const response = await withTimeout(\n fetchPromise,\n options.timeoutMs,\n controller\n );\n\n let payload: any = null;\n try {\n payload = await response.json();\n } catch {\n const text = await response.text();\n throw new Error(`Invalid JSON response: ${text}`);\n }\n\n if (!response.ok) {\n const message =\n payload?.message ??\n `OTP validation failed with status ${response.status} ${response.statusText}`;\n throw new Error(message);\n }\n\n // 🎯 Gestion spéciale pour httpbin.org (mock endpoint)\n let responseData = payload;\n if (payload?.json) {\n responseData = payload.json;\n }\n\n const isHttpbin = url.includes(\"httpbin.org\");\n if (isHttpbin) {\n // Simulation : OTP validé avec succès\n // Extraire le token même pour httpbin (si présent dans la réponse)\n const authToken = extractAuthToken(responseData);\n \n const serverResponse: OTPServerResponse = {\n success: true,\n message: \"Code OTP validé avec succès\",\n authToken: authToken || undefined,\n access_token: responseData?.access_token || responseData?.accessToken,\n token_type: responseData?.token_type || responseData?.tokenType,\n expires_in: responseData?.expires_in || responseData?.expiresIn,\n };\n \n // Stocker le token si présent et si formId/fieldName sont fournis\n if (authToken && formId && fieldName) {\n setOTPToken(formId, fieldName, authToken);\n console.log('✅ [OTP] Token d\\'authentification stocké (httpbin):', { formId, fieldName });\n }\n \n setOtpValidated(true);\n setOtpSent(true);\n setServerResponse(serverResponse);\n return serverResponse;\n }\n\n // Construire la réponse standardisée pour les vrais endpoints\n const success = responseData?.success ?? true;\n \n // Extraire le token d'authentification depuis la réponse\n const authToken = extractAuthToken(responseData);\n \n const serverResponse: OTPServerResponse = {\n success,\n call_back_url: responseData?.call_back_url ?? responseData?.callback_url ?? responseData?.callBackUrl,\n message: responseData?.message ?? \"Code OTP validé avec succès\",\n authToken: authToken || undefined,\n // Support pour format direct\n access_token: responseData?.access_token || responseData?.accessToken,\n token_type: responseData?.token_type || responseData?.tokenType,\n expires_in: responseData?.expires_in || responseData?.expiresIn,\n };\n\n // Si le serveur retourne success: false, lancer une erreur\n if (success === false) {\n const errorMessage = responseData?.message || \"Code OTP invalide. Veuillez réessayer.\";\n setError(errorMessage);\n throw new Error(errorMessage);\n }\n\n // Stocker le token si présent et si formId/fieldName sont fournis\n if (authToken && formId && fieldName) {\n setOTPToken(formId, fieldName, authToken);\n console.log('✅ [OTP] Token d\\'authentification stocké:', { formId, fieldName });\n }\n\n setOtpValidated(true);\n setOtpSent(true);\n setServerResponse(serverResponse);\n\n return serverResponse;\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Erreur lors de la validation de l'OTP\";\n setError(message);\n throw err;\n } finally {\n setIsSending(false);\n }\n },\n [options, formId, fieldName, setOTPToken]\n );\n\n // 🆕 Fonction pour réinitialiser l'état d'envoi (pour permettre le renvoi)\n const resetOTPSentState = useCallback(() => {\n setOtpSent(false);\n setServerResponse(null);\n setError(null);\n setOtpValidated(false);\n }, []);\n\n // 🆕 Fonction pour renvoyer le code OTP\n const resendOTP = useCallback(\n async (formData: Record<string, any>): Promise<OTPServerResponse> => {\n if (!options) {\n throw new Error(\"OTP options are not configured for this field\");\n }\n\n const cooldown = options.resendCooldownSeconds ?? 60;\n \n if (resendCooldown > 0) {\n throw new Error(`Veuillez attendre ${resendCooldown} secondes avant de renvoyer le code`);\n }\n\n setIsResending(true);\n setError(null);\n\n try {\n // Utiliser la config d'envoi initiale si disponible, sinon la config de vérification\n const sendConfig = options.sendOTPApiConfig || {\n serverDns: options.serverDns,\n postApiEndPoint: options.postApiEndPoint,\n payload: options.payload,\n extraHeaders: options.extraHeaders,\n bearer: options.bearer,\n };\n\n const controller = new AbortController();\n const url = buildAbsoluteUrl(sendConfig.serverDns, sendConfig.postApiEndPoint);\n \n const basePayload = normalizePayload(sendConfig.payload);\n const mergedPayload = {\n ...basePayload,\n ...formData,\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(sendConfig.extraHeaders ?? {}),\n };\n\n if (sendConfig.bearer) {\n headers.Authorization = `Bearer ${sendConfig.bearer}`;\n }\n\n const fetchPromise = fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(mergedPayload),\n signal: controller.signal,\n });\n\n const response = await withTimeout(\n fetchPromise,\n options.timeoutMs,\n controller\n );\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ message: response.statusText }));\n throw new Error(errorData.message || `OTP resend failed with status ${response.status}`);\n }\n\n const result = await response.json();\n \n // Démarrer le cooldown\n setResendCooldown(cooldown);\n const interval = setInterval(() => {\n setResendCooldown((prev) => {\n if (prev <= 1) {\n clearInterval(interval);\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n setOtpSent(true);\n return { success: true, message: \"Code OTP renvoyé avec succès\" };\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Erreur lors du renvoi du code\";\n setError(message);\n throw err;\n } finally {\n setIsResending(false);\n }\n },\n [options, resendCooldown]\n );\n\n const reset = useCallback(() => {\n setIsSending(false);\n setOtpSent(false);\n setOtpValidated(false);\n setServerResponse(null);\n setError(null);\n setResendCooldown(0);\n setIsResending(false);\n }, []);\n\n return {\n sendOTP,\n validateOTP, // 🆕 Nouvelle fonction pour valider l'OTP\n resendOTP, // 🆕 Fonction pour renvoyer le code\n resetOTPSentState, // 🆕 Réinitialiser l'état d'envoi\n handleCallbackRedirect,\n isSending,\n isResending, // 🆕 État de renvoi en cours\n resendCooldown, // 🆕 Cooldown restant en secondes\n otpSent,\n otpValidated, // 🆕 État de validation réussie\n serverResponse,\n error,\n reset,\n };\n};\n\n","import React, { useEffect, useMemo } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport toast from 'react-hot-toast';\nimport OTPModal from './OTPModal';\nimport { useOTPHandler } from '../hooks/useOTPHandler';\nimport type { FormField, Section } from '../types/formTypeStructure';\nimport { findLinkedEmailField, findSectionIndexForField } from '../types/formUtils';\nimport { useOTPTokenStore } from '../store/useOTPTokenStore';\n\ninterface OTPRendererProps {\n field: FormField;\n formValues: Record<string, any>;\n formId?: string; // 🆕 ID du formulaire pour stocker le token\n currentLang?: string;\n onClearForm: () => void;\n allSections?: Section[];\n onSubmit?: () => void; // 🆕 Fonction pour soumettre le formulaire\n onNext?: () => void; // 🆕 Fonction pour aller à la section suivante\n isLastSection?: boolean; // 🆕 Indique si c'est la dernière section\n}\n\nconst OTPRenderer: React.FC<OTPRendererProps> = ({\n field,\n formValues,\n formId,\n currentLang = \"fr\",\n onClearForm,\n allSections = [],\n onSubmit,\n onNext,\n isLastSection = false,\n}) => {\n const { getValues, watch } = useFormContext();\n const [isModalOpen, setIsModalOpen] = React.useState(false);\n \n // Surveiller la valeur de l'OTP pour la validation\n const otpValue = watch(field.fieldName);\n\n // Trouver le champ Email lié (dans une section précédente)\n const otpSectionIndex = useMemo(() => {\n return findSectionIndexForField(field.fieldName, allSections);\n }, [field.fieldName, allSections]);\n \n const linkedEmailField = useMemo(() => {\n if (otpSectionIndex === -1) return undefined;\n return findLinkedEmailField(field, allSections, otpSectionIndex);\n }, [field, allSections, otpSectionIndex]);\n \n const linkedEmail = linkedEmailField \n ? formValues[linkedEmailField.fieldName]\n : null;\n\n const {\n sendOTP,\n validateOTP,\n resendOTP,\n resetOTPSentState,\n handleCallbackRedirect,\n isSending,\n isResending,\n resendCooldown,\n otpSent,\n otpValidated,\n serverResponse,\n error,\n } = useOTPHandler(field.otpFormFieldExecOptions, formId, field.fieldName);\n\n // Ouvrir le modal automatiquement au montage\n useEffect(() => {\n if (!isModalOpen) {\n setTimeout(() => {\n setIsModalOpen(true);\n }, 300);\n }\n }, [isModalOpen]);\n\n const closeModal = () => {\n setIsModalOpen(false);\n };\n\n const handleSendOTP = async () => {\n try {\n const formData = getValues();\n await sendOTP(formData);\n } catch (err) {\n console.error(\"Erreur lors de l'envoi de l'OTP:\", err);\n }\n };\n\n const handleValidateOTP = async () => {\n try {\n const formData = getValues();\n // Récupérer la valeur OTP (peut être une string ou un objet)\n let otpCode = \"\";\n if (typeof otpValue === \"string\") {\n otpCode = otpValue;\n } else if (otpValue && typeof otpValue === \"object\" && otpValue.otp) {\n otpCode = otpValue.otp;\n } else {\n // Essayer de récupérer directement depuis formValues\n otpCode = formValues[field.fieldName] || \"\";\n if (typeof otpCode !== \"string\") {\n otpCode = \"\";\n }\n }\n \n const otpLength = field.otpFormFieldExecOptions?.otpLength ?? 6;\n if (!otpCode || otpCode.length !== otpLength) {\n toast.error(`Code OTP incomplet. Le code doit contenir ${otpLength} chiffres.`);\n return;\n }\n \n await validateOTP(otpCode, formData);\n // Si la validation réussit, un toast de succès sera affiché dans la modale via serverResponse\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Erreur lors de la validation de l'OTP\";\n toast.error(`❌ ${errorMessage}`);\n console.error(\"Erreur lors de la validation de l'OTP:\", err);\n }\n };\n\n const clearAllOTPTokens = useOTPTokenStore((state) => state.clearAllOTPTokens);\n \n const handleCallbackRedirectWrapper = (url: string) => {\n // Nettoyer les tokens OTP avant de rediriger\n if (formId) {\n clearAllOTPTokens(formId);\n }\n handleCallbackRedirect(url, onClearForm);\n };\n\n // 🆕 Auto-validation si activée\n const autoValidate = field.otpFormFieldExecOptions?.autoValidate ?? false;\n \n const handleOTPComplete = React.useCallback(async (otpCode: string) => {\n if (autoValidate && !otpValidated && !isSending) {\n try {\n const formData = getValues();\n await validateOTP(otpCode, formData);\n // Si la validation réussit, un toast de succès sera affiché dans la modale via serverResponse\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Code OTP invalide\";\n toast.error(`❌ ${errorMessage}`);\n console.error(\"Erreur lors de l'auto-validation de l'OTP:\", err);\n }\n }\n }, [autoValidate, otpValidated, isSending, validateOTP, getValues]);\n\n // 🆕 Fonction pour renvoyer le code\n const handleResendOTP = async () => {\n try {\n const formData = getValues();\n // Réinitialiser l'état avant de renvoyer\n resetOTPSentState();\n await resendOTP(formData);\n toast.success(\"Code OTP renvoyé avec succès !\");\n } catch (err) {\n console.error(\"Erreur lors du renvoi de l'OTP:\", err);\n toast.error(err instanceof Error ? err.message : \"Erreur lors du renvoi du code\");\n }\n };\n\n return (\n <OTPModal\n isOpen={isModalOpen}\n field={field}\n currentLang={currentLang}\n formValues={formValues}\n serverResponse={serverResponse}\n isSending={isSending}\n isResending={isResending}\n resendCooldown={resendCooldown}\n otpValidated={otpValidated}\n onClose={closeModal}\n onSendOTP={handleSendOTP}\n onValidateOTP={handleValidateOTP}\n onResendOTP={handleResendOTP}\n onCallbackRedirect={handleCallbackRedirectWrapper}\n onSubmit={onSubmit}\n onNext={onNext}\n isLastSection={isLastSection}\n linkedEmail={linkedEmail}\n onOTPComplete={autoValidate ? handleOTPComplete : undefined}\n />\n );\n};\n\nexport default OTPRenderer;\n\n","import React, { forwardRef } from 'react';\n\ninterface H4TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n children: React.ReactNode;\n}\n\nconst H4Title = forwardRef<HTMLHeadingElement, H4TitleProps>(\n ({ children, className, ...props }, ref) => (\n <h4 ref={ref} className={className} {...props}>\n {children}\n </h4>\n )\n);\n\nH4Title.displayName = 'H4Title';\nexport default H4Title;\n","import React from \"react\";\nimport { getLocalizedText } from \"../FormFieldWrapper\";\nimport FieldRenderer from \"../FieldRenderer\";\nimport RepeatGroupRenderer from \"../repeat-groupe-renderer/RepeatGroupRenderer\";\nimport OTPRenderer from \"./OTPRenderer\";\nimport { shouldDisplayFormField, shouldDisplaySection } from \"../types/displayRules\";\nimport { useFormStore } from \"../store/useFormStore\";\nimport { hasOTPField, getOTPField } from \"../types/formUtils\";\nimport { useAutoOtherField } from \"../hooks/useAutoOtherField\";\nimport { useDetailInfos, type DetailInfoGroup } from \"../hooks/useDetailInfos\";\n\nimport H4Title from \"../internal/text/H4Title\";\nimport PContent from \"../internal/text/PContent\";\n\nimport type { FormField, Section, ResponseInForm, ContainerStyles } from \"../types/formTypeStructure\";\n\ninterface ConditionalStats {\n sectionVisible: boolean;\n visibleFields: number;\n totalFields: number;\n hiddenFields: number;\n requiredVisible: number;\n requiredHidden: number;\n hiddenFieldNames: string[];\n conditionalFields: number;\n errors?: string[];\n}\n\ninterface FormSectionProps {\n section: Section;\n fields: FormField[];\n currentLang: string;\n fadeKey: number;\n formValues: Record<string, any>;\n formId?: string; // 🆕 ID du formulaire pour stocker les tokens OTP\n paginationMode?: \"byFields\" | \"bySection\";\n allSections?: Section[];\n currentSectionIndex?: number;\n debugInfo?: {\n sectionIndex: number;\n fieldPage: number;\n sectionCount: number;\n totalFieldPages: number;\n fieldsOnCurrentPage: number;\n };\n onFieldChange: (fieldName: string, value: any) => void;\n onConditionalChange?: (stats: ConditionalStats) => void;\n onConditionalError?: (error: Error, context: { section: Section; field?: FormField }) => void;\n onClearForm?: () => void;\n onSubmit?: () => void; // 🆕 Fonction pour soumettre le formulaire\n onNext?: () => void; // 🆕 Fonction pour aller à la section suivante\n isLastSection?: boolean; // 🆕 Indique si c'est la dernière section\n sectionContainerStyles?: ContainerStyles; // Styles personnalisés pour le conteneur de section\n}\n\nconst FormSection: React.FC<FormSectionProps> = ({\n section,\n fields,\n currentLang,\n fadeKey,\n formValues,\n formId,\n paginationMode,\n allSections = [],\n currentSectionIndex = 0,\n debugInfo,\n onConditionalChange,\n onConditionalError,\n onClearForm,\n onSubmit,\n onNext,\n isLastSection = false,\n sectionContainerStyles,\n // onFieldChange, // ⚠️ IMPORTANT: Cette prop doit être utilisée !\n}) => {\n // Log initial pour déboguer\n // console.log('1-🔍 FormSection - Début du rendu', {\n // sectionTitle: section.title ? getLocalizedText(section.title, currentLang) : 'Sans titre',\n // fieldsCount: fields.length,\n // formValues,\n // section\n // });\n\n // Convertir formValues en format ResponseInForm\n const allResponseInForms: Record<string, ResponseInForm> = React.useMemo(() => {\n const responses: Record<string, ResponseInForm> = {};\n \n Object.entries(formValues).forEach(([key, value]) => {\n responses[key] = { responseValue: value };\n });\n \n // console.log('2-🔄 FormSection - Conversion formValues vers ResponseInForm', {\n // formValues,\n // responses\n // });\n \n return responses;\n }, [formValues]);\n\n // 🔥 NOUVEAU : Nettoyage automatique des valeurs obsolètes (déplacé dans useEffect pour éviter setState pendant le rendu)\n React.useEffect(() => {\n // Nettoyer les valeurs obsolètes après le rendu\n const currentFields = fields.map(f => f.fieldName);\n const formStore = useFormStore.getState();\n const currentFormId = Object.keys(formStore.forms)[0];\n \n if (currentFormId) {\n const currentFormValues = formStore.forms[currentFormId] || {};\n const valuesToKeep: Record<string, any> = {};\n \n Object.entries(currentFormValues).forEach(([key, value]) => {\n if (currentFields.includes(key)) {\n valuesToKeep[key] = value;\n }\n });\n \n // Nettoyer si des valeurs obsolètes existent\n const hasObsoleteValues = Object.keys(currentFormValues).some(key => !currentFields.includes(key));\n if (hasObsoleteValues) {\n formStore.setAllFormValues(currentFormId, valuesToKeep);\n // console.log('🧹 [FormSection] Nettoyage des valeurs obsolètes');\n }\n }\n }, [fadeKey, section.sectionId, fields]);\n\n // 🔥 Amélioration : Clé de section plus robuste et unique\n const sectionKey = React.useMemo(() => {\n // Utiliser une combinaison de fadeKey et sectionId pour forcer le re-rendu\n // Le fadeKey inclut maintenant un compteur de changement de section\n return `section_${fadeKey}_${section.sectionId}`;\n }, [fadeKey, section.sectionId]);\n\n // Vérifier si la section doit être affichée avec gestion d'erreurs\n const shouldShowSection = React.useMemo(() => {\n // console.log('3-🔍 FormSection - Évaluation affichage section', {\n // sectionTitle: section.title ? getLocalizedText(section.title, currentLang) : 'Sans titre',\n // sectionConditionalDisplay: section.conditionalDisplay,\n // allResponseInForms\n // });\n\n try {\n const result = shouldDisplaySection(section, allResponseInForms);\n \n // console.log('4-✅ FormSection - Résultat affichage section', {\n // sectionTitle: section.title ? getLocalizedText(section.title, currentLang) : 'Sans titre',\n // shouldShow: result,\n // conditionalDisplay: section.conditionalDisplay\n // });\n \n return result;\n } catch (error) {\n console.error('5-❌ FormSection - Erreur évaluation section', {\n sectionTitle: section.title ? getLocalizedText(section.title, currentLang) : 'Sans titre',\n error,\n section,\n allResponseInForms\n });\n \n onConditionalError?.(error as Error, { section });\n return true; // Fallback : afficher la section en cas d'erreur\n }\n }, [section, allResponseInForms, onConditionalError, currentLang]);\n\n // Filtrer les champs selon leurs conditions d'affichage avec gestion d'erreurs\n const { visibleFields, evaluationErrors } = React.useMemo(() => {\n // console.log('6-🔍 FormSection - Évaluation affichage champs', {\n // sectionTitle: section.title ? getLocalizedText(section.title, currentLang) : 'Sans titre',\n // fieldsCount: fields.length,\n // fields: fields.map(f => ({ \n // fieldName: f.fieldName, \n // conditionalDisplay: f.conditionalDisplay,\n // type: f.fieldType \n // }))\n // });\n\n const errors: string[] = [];\n const visible: FormField[] = [];\n\n fields.forEach(field => {\n // console.log(`7-🔍 FormSection - Évaluation chaque champ \"${field.fieldName}\"`, {\n // fieldName: field.fieldName,\n // conditionalDisplay: field.conditionalDisplay,\n // type: field.fieldType,\n // allResponseInForms\n // });\n\n try {\n const shouldShow = shouldDisplayFormField(field, allResponseInForms);\n \n // console.log(`8-${shouldShow ? '✅' : '❌'} FormSection - Résultat champ \"${field.fieldName}\"`, {\n // fieldName: field.fieldName,\n // shouldShow,\n // conditionalDisplay: field.conditionalDisplay\n // });\n \n if (shouldShow) {\n visible.push(field);\n }\n } catch (error) {\n console.error(`9-❌ FormSection - Erreur évaluation champ \"${field.fieldName}\"`, {\n fieldName: field.fieldName,\n error,\n field,\n allResponseInForms\n });\n \n errors.push(`Field ${field.fieldName}: ${(error as Error).message}`);\n onConditionalError?.(error as Error, { section, field });\n // Fallback : afficher le champ en cas d'erreur\n visible.push(field);\n }\n });\n\n // console.log('10-📊 FormSection - Résumé évaluation champs', {\n // sectionTitle: section.title ? getLocalizedText(section.title, currentLang) : 'Sans titre',\n // totalFields: fields.length,\n // visibleFields: visible.length,\n // hiddenFields: fields.length - visible.length,\n // visibleFieldNames: visible.map(f => f.fieldName),\n // hiddenFieldNames: fields.filter(f => !visible.some(v => v.fieldName === f.fieldName)).map(f => f.fieldName),\n // errors\n // });\n\n return { \n visibleFields: visible,\n evaluationErrors: errors\n };\n }, [fields, allResponseInForms, section, onConditionalError, currentLang]);\n\n // 🆕 Générer automatiquement les champs \"autre\" pour dropdown/radio/checkbox\n const autoOtherFields = useAutoOtherField(visibleFields, currentLang);\n\n // 🆕 Générer automatiquement les groupes de champs de détails\n const detailInfosGroups = useDetailInfos(visibleFields, currentLang);\n\n // 🆕 Injecter les champs \"autre\" et les groupes de détails immédiatement après leurs champs parents\n const fieldsWithAutoOtherAndDetails = React.useMemo(() => {\n const result: Array<FormField | { type: 'detail-group', group: DetailInfoGroup }> = [];\n \n visibleFields.forEach(field => {\n // Ajouter le champ parent\n result.push(field);\n \n // Si un champ \"autre\" existe pour ce champ parent, l'ajouter immédiatement après\n const otherField = autoOtherFields[field.fieldName];\n if (otherField) {\n result.push(otherField);\n }\n \n // Si des groupes de détails existent pour ce champ parent, les ajouter\n const detailGroups = detailInfosGroups[field.fieldName];\n if (detailGroups && detailGroups.length > 0) {\n detailGroups.forEach(group => {\n result.push({ type: 'detail-group', group });\n });\n }\n });\n \n return result;\n }, [visibleFields, autoOtherFields, detailInfosGroups]);\n\n // Statistiques pour le debug et les callbacks\n const fieldStats = React.useMemo(() => {\n const totalFields = fields.length;\n const visibleFieldsCount = visibleFields.length;\n const hiddenFields = fields.filter(field => \n !visibleFields.some(vf => vf.fieldName === field.fieldName)\n );\n \n const requiredVisibleFields = visibleFields.filter(field => \n field.validations?.some(v => v.validationType === \"required\")\n );\n \n const requiredHiddenFields = hiddenFields.filter(field => \n field.validations?.some(v => v.validationType === \"required\")\n );\n\n const stats: ConditionalStats = {\n sectionVisible: shouldShowSection,\n totalFields,\n visibleFields: visibleFieldsCount,\n hiddenFields: hiddenFields.length,\n requiredVisible: requiredVisibleFields.length,\n requiredHidden: requiredHiddenFields.length,\n hiddenFieldNames: hiddenFields.map(f => f.fieldName),\n conditionalFields: fields.filter(f => f.conditionalDisplay).length,\n errors: evaluationErrors.length > 0 ? evaluationErrors : undefined\n };\n\n // console.log('11-📊 FormSection - Statistiques finales', {\n // sectionTitle: section.title ? getLocalizedText(section.title, currentLang) : 'Sans titre',\n // stats\n // });\n\n return stats;\n }, [fields, visibleFields, shouldShowSection, evaluationErrors, section.title, currentLang]);\n\n // Déclencher le callback de changement conditionnel\n React.useEffect(() => {\n // console.log('12-🔄 FormSection - Déclenchement callback conditional change', {\n // sectionTitle: section.title ? getLocalizedText(section.title, currentLang) : 'Sans titre',\n // fieldStats\n // });\n \n onConditionalChange?.(fieldStats);\n }, [fieldStats, onConditionalChange, section.title, currentLang]);\n\n // Fonction pour déterminer les classes CSS selon la largeur du champ\n const getFieldWidthClass = (field: FormField): string => {\n const width = field.width || \"half\"; // Par défaut \"half\" si non spécifiée\n \n if (width === \"full\") {\n return \"col-span-1 tablet:col-span-2 w-full\"; // Full width sur tous les écrans\n } else {\n return \"col-span-1 w-full\"; // Half width (1 colonne mobile, 2 colonnes tablet+)\n }\n };\n\n const renderFieldOrRepeat = (field: FormField) => {\n // console.log(`13-🎨 FormSection - Rendu champ \"${field.fieldName}\"`, {\n // fieldName: field.fieldName,\n // type: field.fieldType,\n // hasRepeatGroup: !!field.repeatGroup,\n // hasRepeatRule: !!field.repeatRule\n // });\n\n // Clé unique qui inclut la section et le fadeKey pour forcer le re-rendu\n const uniqueKey = `${fadeKey}_${field.fieldName}`;\n\n if (field.repeatGroup && field.repeatRule) {\n return (\n <RepeatGroupRenderer\n key={uniqueKey}\n field={field}\n formValues={formValues}\n currentLang={currentLang}\n // onFieldChange={onFieldChange} // ⚠️ IMPORTANT: Passer la prop !\n />\n );\n }\n\n return (\n <FieldRenderer\n key={uniqueKey}\n field={field}\n currentLang={currentLang}\n formValues={formValues}\n // onFieldChange={onFieldChange} // ⚠️ IMPORTANT: Passer la prop !\n />\n );\n };\n\n // Si la section ne doit pas être affichée, ne rien rendre\n if (!shouldShowSection) {\n // console.log('14-🚫 FormSection - Section cachée', {\n // sectionTitle: section.title ? getLocalizedText(section.title, currentLang) : 'Sans titre',\n // shouldShowSection,\n // debugInfo: !!debugInfo\n // });\n\n return debugInfo ? (\n <div className=\"border-2 border-red-200 w-full max-w-4xl bg-red-50 rounded-lg p-4 opacity-50\">\n <div className=\"text-red-600 text-sm\">\n ⚠️ Section cachée par les conditions d'affichage\n </div>\n\n {section?.title && (\n <div className=\"text-xs text-red-500 mt-2\">\n Section: {section.title ? getLocalizedText(section.title, currentLang) : 'Sans titre'}\n </div>\n )}\n\n {evaluationErrors.length > 0 && (\n <div className=\"text-xs text-red-600 mt-2 bg-red-100 p-2 rounded\">\n <div className=\"font-medium\">Erreurs d'évaluation:</div>\n {evaluationErrors.map((error, index) => (\n <div key={index} className=\"ml-2\">• {error}</div>\n ))}\n </div>\n )}\n </div>\n ) : null;\n }\n\n // 🆕 Détecter si la section contient un champ OTP\n const otpField = React.useMemo(() => {\n const field = getOTPField(section);\n if (field) {\n // console.log(\"🔍 [FormSection] OTP Field détecté:\", field.fieldName);\n }\n return field;\n }, [section]);\n\n // Styles par défaut pour le conteneur de section (utilisés aussi pour OTP)\n const defaultBorderColor = '#e2e8f0'; // slate-200\n const defaultBorderWidth = '2px';\n const defaultBackgroundColor = '#F6F6F6';\n\n // Appliquer les styles personnalisés ou utiliser les valeurs par défaut\n const sectionBorderColor = sectionContainerStyles?.borderColor || defaultBorderColor;\n const sectionBorderWidth = sectionContainerStyles?.borderWidth \n ? (typeof sectionContainerStyles.borderWidth === 'number' \n ? `${sectionContainerStyles.borderWidth}px` \n : sectionContainerStyles.borderWidth)\n : defaultBorderWidth;\n const sectionBackgroundColor = sectionContainerStyles?.backgroundColor || defaultBackgroundColor;\n\n // 🆕 Si la section contient un OTP, afficher uniquement OTPRenderer\n if (otpField) {\n // console.log(\"✅ [FormSection] Affichage de OTPRenderer pour:\", otpField.fieldName);\n return (\n <div\n key={sectionKey}\n className=\"w-full max-w-4xl rounded-lg p-2 tablet:p-8 flex flex-col items-center\"\n style={{\n borderColor: sectionBorderColor,\n borderWidth: sectionBorderWidth,\n borderStyle: 'solid',\n backgroundColor: sectionBackgroundColor,\n }}\n >\n {/* Header de la section */}\n {section.title && (\n <div className=\"w-full mb-6\">\n <H4Title className=\"text-center mb-2\">\n {getLocalizedText(section.title, currentLang)}\n </H4Title>\n {section.subTitle && (\n <PContent className=\"text-center text-gray-600\">\n {getLocalizedText(section.subTitle, currentLang)}\n </PContent>\n )}\n </div>\n )}\n\n {/* Afficher uniquement OTPRenderer */}\n <OTPRenderer\n field={otpField}\n formValues={formValues}\n formId={formId}\n currentLang={currentLang}\n onClearForm={onClearForm || (() => {\n console.warn(\"onClearForm not provided, using fallback\");\n // Fallback: réinitialiser les valeurs du formulaire\n const formStore = useFormStore.getState();\n const currentFormId = Object.keys(formStore.forms)[0];\n if (currentFormId) {\n formStore.clearForm(currentFormId);\n }\n })}\n allSections={allSections}\n onSubmit={onSubmit}\n onNext={onNext}\n isLastSection={isLastSection}\n />\n </div>\n );\n }\n\n // Si aucun champ n'est visible, ne pas afficher la section\n if (visibleFields.length === 0) {\n // console.log('15-🚫 FormSection - Section visible mais aucun champ visible', {\n // sectionTitle: section.title ? getLocalizedText(section.title, currentLang) : 'Sans titre',\n // shouldShowSection,\n // visibleFieldsCount: visibleFields.length,\n // totalFields: fields.length,\n // debugInfo: !!debugInfo\n // });\n\n return debugInfo ? (\n <div className=\"border-2 border-orange-200 w-full max-w-4xl bg-orange-50 rounded-lg p-4 opacity-50\">\n <div className=\"text-orange-600 text-sm\">\n ⚠️ Section visible mais tous les champs sont cachés ({fieldStats.totalFields} champs)\n </div>\n <div className=\"text-xs text-orange-500 mt-2\">\n Champs cachés: {fieldStats.hiddenFieldNames.join(', ')}\n </div>\n {evaluationErrors.length > 0 && (\n <div className=\"text-xs text-orange-600 mt-2 bg-orange-100 p-2 rounded\">\n <div className=\"font-medium\">Erreurs d'évaluation:</div>\n {evaluationErrors.map((error, index) => (\n <div key={index} className=\"ml-2\">• {error}</div>\n ))}\n </div>\n )}\n </div>\n ) : null;\n }\n\n // console.log('16-✅ FormSection - Rendu section avec champs visibles', {\n // sectionTitle: section.title ? getLocalizedText(section.title, currentLang) : 'Sans titre',\n // visibleFieldsCount: visibleFields.length,\n // visibleFieldNames: visibleFields.map(f => f.fieldName)\n // });\n\n return (\n <div\n key={sectionKey}\n className=\"w-full max-w-4xl rounded-lg p-2 tablet:p-8 flex flex-col items-center\"\n style={{\n borderColor: sectionBorderColor,\n borderWidth: sectionBorderWidth,\n borderStyle: 'solid',\n backgroundColor: sectionBackgroundColor,\n }}\n >\n {/* 🔥 Composant de nettoyage automatique */}\n \n {section.title && (\n <H4Title className=\"text-lg font-medium text-gray-700 mb-4 pb-2 border-b border-gray-200 w-full\">\n {getLocalizedText(section.title, currentLang)}\n </H4Title>\n )}\n\n {section.subTitle && (\n <PContent className=\"text-gray-600 mb-4 w-full\">\n {getLocalizedText(section.subTitle, currentLang)}\n </PContent>\n )}\n\n <div className=\"grid grid-cols-1 tablet:grid-cols-2 gap-6 w-full [&_input:not([type='radio']):not([type='checkbox'])]:!w-full [&_textarea]:!w-full [&_select]:!w-full [&_*]:!max-w-full\">\n {fieldsWithAutoOtherAndDetails.map((item, index) => {\n // Vérifier si c'est un groupe de détails\n if ('type' in item && item.type === 'detail-group') {\n const { group } = item;\n return (\n <div\n key={`${fadeKey}_detail-group_${group.optionValue}_${index}`}\n className=\"col-span-1 tablet:col-span-2 mt-4 p-4 bg-gray-50 rounded-lg border border-gray-200\"\n >\n {group.groupLabel && (\n <h4 className=\"font-semibold text-gray-700 mb-3 text-sm\">\n {group.groupLabel}\n </h4>\n )}\n <div className=\"grid grid-cols-1 tablet:grid-cols-2 gap-4\">\n {group.fields.map((detailField) => (\n <div\n key={`${fadeKey}_${detailField.fieldName}_wrapper`}\n className={getFieldWidthClass(detailField)}\n >\n {renderFieldOrRepeat(detailField)}\n </div>\n ))}\n </div>\n </div>\n );\n }\n \n // C'est un champ normal\n const field = item as FormField;\n return (\n <div \n key={`${fadeKey}_${field.fieldName}_wrapper`} \n className={getFieldWidthClass(field)}\n >\n {renderFieldOrRepeat(field)}\n </div>\n );\n })}\n </div>\n\n {/* {debugInfo && (\n <div className=\"mt-4 text-xs text-gray-600 border-t pt-4 w-full bg-gray-50 rounded-md p-3\">\n <div className=\"flex flex-col gap-2\">\n <p>\n Section {debugInfo.sectionIndex + 1}/{debugInfo.sectionCount}\n </p>\n <p>\n Page {debugInfo.fieldPage + 1}/{debugInfo.totalFieldPages} — Champs affichés : {visibleFields.length}\n </p>\n <p className=\"text-green-600\">\n Champs visibles : {visibleFields.length}/{fields.length}\n </p>\n {fieldStats.requiredHidden > 0 && (\n <p className=\"text-yellow-600\">\n ⚠️ Champs obligatoires cachés : {fieldStats.requiredHidden}\n </p>\n )}\n {fieldStats.conditionalFields > 0 && (\n <p className=\"text-blue-600\">\n Champs avec conditions : {fieldStats.conditionalFields}\n </p>\n )}\n {evaluationErrors.length > 0 && (\n <div className=\"text-red-600 bg-red-50 p-2 rounded mt-2\">\n <div className=\"font-medium\">Erreurs d'évaluation ({evaluationErrors.length}):</div>\n {evaluationErrors.map((error, index) => (\n <div key={index} className=\"ml-2 text-xs\">• {error}</div>\n ))}\n </div>\n )}\n </div>\n </div>\n )} */}\n </div>\n );\n};\n\nexport default FormSection;","import React, { useState } from 'react';\nimport { Trash2, AlertTriangle, X } from 'lucide-react';\nimport CancelBtn from '../internal/button/CancelBtn';\nimport ValidationBtn from '../internal/button/ValidationBtn';\n\ninterface FormNavigationProps {\n onPrevious: () => void;\n onNext: () => void;\n onPreviousVisible?: () => void; // Navigation intelligente (sauter les sections cachées)\n onNextVisible?: () => void; // Navigation intelligente (sauter les sections cachées)\n onSubmit?: () => void;\n onClearAll: () => void;\n isFirstSection: boolean;\n isLastSection: boolean;\n isValidating?: boolean;\n onSubmitButtonText?: string;\n showStepNavigation?: boolean;\n displayDeleteButton?: boolean; // Contrôle l'affichage du bouton de suppression\n}\n\nconst FormNavigation: React.FC<FormNavigationProps> = ({\n onPrevious,\n onNext,\n onPreviousVisible,\n onNextVisible,\n onSubmit,\n onClearAll,\n isFirstSection,\n isLastSection,\n isValidating = false,\n onSubmitButtonText,\n showStepNavigation = true,\n displayDeleteButton = true\n}) => {\n // Utiliser la navigation intelligente pour \"Précédent\" (pas de validation nécessaire)\n const handlePrevious = onPreviousVisible || onPrevious;\n // Toujours utiliser onNext qui contient la validation + navigation intelligente intégrée\n // onNextVisible n'est plus utilisé directement car la validation est maintenant intégrée dans onNext\n const handleNext = onNext;\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n\n const submitLabel = onSubmitButtonText ?? 'Soumettre';\n\n const handleClearAll = () => {\n onClearAll();\n setShowDeleteModal(false);\n };\n\n const DeleteConfirmationModal = () => {\n if (!showDeleteModal) return null;\n\n return (\n <div className=\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4\">\n <div className=\"bg-white rounded-lg shadow-xl max-w-md w-full mx-4 transform transition-all\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-6 border-b border-gray-200\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex-shrink-0\">\n <AlertTriangle className=\"h-6 w-6 text-red-600\" />\n </div>\n <h3 className=\"text-lg font-semibold text-gray-900\">\n Supprimer toutes les données\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setShowDeleteModal(false);\n }}\n className=\"text-gray-400 hover:text-gray-600 transition-colors\"\n >\n <X size={24} />\n </button>\n </div>\n\n {/* Body */}\n <div className=\"p-6\">\n <p className=\"text-gray-600 mb-4\">\n Êtes-vous sûr de vouloir supprimer toutes les données du formulaire ?\n Cette action est irréversible et effacera également les données sauvegardées.\n </p>\n <div className=\"bg-red-50 border border-red-200 rounded-md p-3\">\n <div className=\"flex\">\n <AlertTriangle className=\"h-5 w-5 text-red-400 mr-2 flex-shrink-0 mt-0.5\" />\n <div className=\"text-sm text-red-800\">\n <strong>Attention :</strong> Toutes vos données seront définitivement perdues.\n </div>\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"flex justify-end space-x-3 p-6 border-t border-gray-200 bg-gray-50\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setShowDeleteModal(false);\n }}\n className=\"px-4 py-2 text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors font-medium\"\n >\n Annuler\n </button>\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClearAll?.();\n }}\n className=\"px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700 transition-colors font-medium flex items-center space-x-2\"\n >\n <Trash2 size={16} />\n <span>Supprimer</span>\n </button>\n </div>\n </div>\n </div>\n );\n };\n\n if (!showStepNavigation) {\n return (\n <>\n <div className=\"mt-8 w-full max-w-2xl flex flex-col items-center gap-4\">\n <ValidationBtn\n type=\"submit\"\n onClick={onSubmit}\n disabled={isValidating}\n className=\"min-w-[200px]\"\n >\n {isValidating ? 'Validation...' : submitLabel}\n </ValidationBtn>\n\n {displayDeleteButton && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setShowDeleteModal(true);\n }}\n className=\"group relative p-3 bg-red-600 text-white rounded-full hover:bg-red-700 transition-all duration-200 shadow-lg hover:shadow-xl transform hover:scale-105\"\n title=\"Supprimer toutes les données\"\n >\n <Trash2 size={20} className=\"transition-transform group-hover:scale-110\" />\n </button>\n )}\n </div>\n\n {/* Modal de confirmation */}\n <DeleteConfirmationModal />\n </>\n );\n }\n\n return (\n <>\n {/* Version Desktop - normale */}\n <div className=\"hidden md:flex justify-between items-center gap-2 mt-8 w-full max-w-2xl\">\n <CancelBtn\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handlePrevious?.();\n }}\n disabled={isFirstSection}\n >\n Précédent\n </CancelBtn>\n\n {/* Bouton de suppression centré */}\n {displayDeleteButton && (\n <div className=\"flex-1 flex justify-center\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setShowDeleteModal(true);\n }}\n className=\"group relative p-3 bg-red-600 text-white rounded-full hover:bg-red-700 transition-all duration-200 shadow-lg hover:shadow-xl transform hover:scale-105\"\n title=\"Supprimer toutes les données\"\n >\n <Trash2 size={20} className=\"transition-transform group-hover:scale-110\" />\n </button>\n </div>\n )}\n\n {!isLastSection ? (\n <ValidationBtn\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleNext?.();\n }}\n disabled={isValidating}\n >\n {isValidating ? 'Validation...' : 'Suivant'}\n </ValidationBtn>\n ) : (\n <ValidationBtn type=\"submit\" onClick={onSubmit}>\n {submitLabel}\n </ValidationBtn>\n )}\n </div>\n\n {/* Version Mobile - Tab Bar fixée en bas */}\n <div className=\"md:hidden fixed bottom-0 left-0 right-0 bg-white/95 backdrop-blur-md border-t border-gray-200 px-4 py-3 shadow-lg z-50 mobile-nav-slide-up\">\n <div className=\"flex justify-between items-center gap-3 max-w-md mx-auto\">\n <CancelBtn\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handlePrevious?.();\n }}\n disabled={isFirstSection}\n className=\"flex-1 min-h-[44px]\"\n >\n Précédent\n </CancelBtn>\n\n {/* Bouton de suppression mobile centré */}\n {displayDeleteButton && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setShowDeleteModal(true);\n }}\n className=\"group relative p-3 bg-red-600 text-white rounded-full hover:bg-red-700 transition-all duration-200 shadow-lg hover:shadow-xl transform hover:scale-105 min-h-[44px] min-w-[44px] flex items-center justify-center\"\n title=\"Supprimer toutes les données\"\n >\n <Trash2 size={20} className=\"transition-transform group-hover:scale-110\" />\n </button>\n )}\n\n {!isLastSection ? (\n <ValidationBtn\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleNext?.();\n }}\n disabled={isValidating}\n className=\"flex-1 min-h-[44px]\"\n >\n {isValidating ? 'Validation...' : 'Suivant'}\n </ValidationBtn>\n ) : (\n <ValidationBtn\n // type=\"submit\"\n type=\"button\"\n onClick={onSubmit}\n className=\"flex-1 min-h-[44px]\"\n >\n {/* Simuler */}\n {submitLabel}\n </ValidationBtn>\n )}\n </div>\n\n {/* Espace pour les iPhone avec home indicator */}\n <div className=\"h-safe-area-inset-bottom\"></div>\n </div>\n\n {/* Modal de confirmation */}\n <DeleteConfirmationModal />\n </>\n );\n};\n\nexport default FormNavigation;\n","import { useMemo, useEffect } from \"react\";\nimport { useFormStore } from \"../../store/useFormStore\";\nimport useFormNavigationActions from \"./hooks/useFormNavigationActions\";\nimport useFormPageValidation from \"./hooks/useFormPageValidation\";\nimport useFormSubmission from \"./hooks/useFormSubmission\";\nimport { useSectionDynamicFiltering } from \"../../hooks/useDynamicFiltering\";\nimport type { FormEngineContentProps } from \"./types/formEngine.types\";\nimport FormSyncComponent from \"./FormSyncComponent\";\nimport FormProgressBar from \"../FormProgressBar\";\nimport FormHeader from \"../FormHeader\";\nimport FormSection from \"../FormSection\";\nimport FormNavigation from \"../FormNavigation\";\n\n\nconst FormEngineContent: React.FC<FormEngineContentProps> = ({\n form,\n formId,\n onSubmit,\n currentLang,\n navigation,\n handleFieldChange,\n onClearAll,\n methods,\n submitButtonText,\n paginationMode,\n progressBarType,\n sections,\n headerOptions,\n displayDeleteButton = true,\n containerStyles,\n}) => {\n // Récupération des valeurs du formulaire\n const rawFormValues = useFormStore((state) => state.forms[formId]);\n const formValues = useMemo(() => rawFormValues ?? {}, [rawFormValues]);\n\n // Hooks personnalisés pour séparer les responsabilités\n const { validatePage, isValidating, setIsValidating } = useFormPageValidation(\n navigation,\n methods,\n currentLang,\n paginationMode\n );\n const { handleNext } = useFormNavigationActions(\n navigation,\n validatePage,\n isValidating,\n setIsValidating,\n form,\n formValues,\n paginationMode || \"byFields\"\n );\n const { handleSubmitWithValidation } = useFormSubmission(\n methods,\n form,\n validatePage,\n onSubmit,\n setIsValidating\n );\n\n // Utiliser sectionVisibility et pageVisibility depuis navigation (calculés dans FormEngine.tsx)\n const sectionVisibility = navigation.sectionVisibility;\n const pageVisibility = navigation.pageVisibility;\n\n // Application du filtrage dynamique aux champs de la section courante\n const filteredPagedFields = useSectionDynamicFiltering(navigation.pagedFields);\n\n // Redirection automatique si la section actuelle devient cachée\n useEffect(() => {\n if (sectionVisibility && sectionVisibility.length > 0) {\n if (!sectionVisibility[navigation.sectionIndex]) {\n // Chercher la prochaine section visible\n const nextVisible = sectionVisibility.findIndex(\n (visible, idx) => visible && idx > navigation.sectionIndex\n );\n if (nextVisible !== -1) {\n navigation.goToStep(nextVisible, 0);\n return;\n }\n \n // Sinon, chercher la section visible précédente\n const previousVisible = sectionVisibility.lastIndexOf(\n true, \n navigation.sectionIndex - 1\n );\n if (previousVisible !== -1) {\n navigation.goToStep(previousVisible, 0);\n }\n }\n }\n }, [sectionVisibility, navigation.sectionIndex, navigation.goToStep]);\n\n // Redirection automatique si la page actuelle devient vide\n useEffect(() => {\n if (pageVisibility && pageVisibility.length > 0) {\n const pageCounts = pageVisibility[navigation.sectionIndex];\n if (!pageCounts || pageCounts.length === 0) {\n return;\n }\n\n const currentPageCount = pageCounts[navigation.fieldPage] || 0;\n if (currentPageCount > 0) {\n return; // Page actuelle contient des champs visibles\n }\n\n // Chercher la prochaine page visible dans la section actuelle\n const nextPage = pageCounts.findIndex(\n (count, idx) => count > 0 && idx > navigation.fieldPage\n );\n if (nextPage !== -1) {\n navigation.goToStep(navigation.sectionIndex, nextPage);\n return;\n }\n\n // Chercher la page visible précédente dans la section actuelle\n for (let idx = navigation.fieldPage - 1; idx >= 0; idx--) {\n if (pageCounts[idx] > 0) {\n navigation.goToStep(navigation.sectionIndex, idx);\n return;\n }\n }\n\n // Si aucune page visible dans la section actuelle, chercher dans les autres sections\n const nextSectionIndex = pageVisibility.findIndex(\n (counts, idx) => {\n const sectionPageCounts = counts.filter(count => count > 0);\n return sectionPageCounts.length > 0 && idx > navigation.sectionIndex;\n }\n );\n if (nextSectionIndex !== -1) {\n const nextPageIndex = pageVisibility[nextSectionIndex].findIndex(\n (count) => count > 0\n );\n navigation.goToStep(nextSectionIndex, Math.max(0, nextPageIndex));\n return;\n }\n\n // Chercher la dernière section/page visible précédente\n for (let idx = navigation.sectionIndex - 1; idx >= 0; idx--) {\n const counts = pageVisibility[idx];\n const sectionPageCounts = counts.filter(count => count > 0);\n if (sectionPageCounts.length > 0) {\n const lastPage = (() => {\n for (let pageIdx = counts.length - 1; pageIdx >= 0; pageIdx--) {\n if (counts[pageIdx] > 0) {\n return pageIdx;\n }\n }\n return 0;\n })();\n navigation.goToStep(idx, lastPage);\n return;\n }\n }\n }\n }, [pageVisibility, navigation.sectionIndex, navigation.fieldPage, navigation.goToStep]);\n\n // Utiliser le hook TFU si disponible et si c'est le formulaire TFU\n // if (useTFUFormMonitor && form.name?.toLowerCase().includes('tfu')) {\n // useTFUFormMonitor();\n // }\n\n return (\n <>\n <FormSyncComponent formId={formId} sections={form.sections} />\n\n <div \n className=\"h-full w-[100%] laptop:w-[90%] flex flex-col items-center justify-center pb-20 md:pb-0\"\n style={{\n backgroundColor: containerStyles?.mainContainer?.backgroundColor || '#ffffff',\n borderColor: containerStyles?.mainContainer?.borderColor,\n borderWidth: containerStyles?.mainContainer?.borderWidth \n ? (typeof containerStyles.mainContainer.borderWidth === 'number' \n ? `${containerStyles.mainContainer.borderWidth}px` \n : containerStyles.mainContainer.borderWidth)\n : undefined,\n borderStyle: containerStyles?.mainContainer?.borderWidth ? 'solid' : undefined,\n }}\n >\n <FormProgressBar \n currentStep={navigation.currentVisibleStep ?? navigation.currentStep} \n totalSteps={navigation.totalVisibleSteps ?? navigation.totalSteps}\n progressBarType={progressBarType}\n sections={sections}\n sectionVisibility={navigation.sectionVisibility}\n currentSectionIndex={navigation.sectionIndex}\n />\n <FormHeader \n form={form} \n currentLang={currentLang}\n headerOptions={headerOptions}\n />\n\n <div className=\"flex-1 w-full flex flex-col items-center justify-center\">\n <FormSection\n section={navigation.currentSection}\n fields={filteredPagedFields} // Utiliser les champs filtrés\n currentLang={currentLang}\n fadeKey={navigation.fadeKey}\n onFieldChange={handleFieldChange}\n formValues={formValues}\n formId={formId}\n paginationMode={paginationMode}\n onClearForm={onClearAll}\n allSections={form.sections}\n currentSectionIndex={navigation.sectionIndex}\n onSubmit={handleSubmitWithValidation}\n onNext={handleNext}\n isLastSection={navigation.isLastSection}\n sectionContainerStyles={containerStyles?.sectionContainer}\n debugInfo={{\n sectionIndex: navigation.sectionIndex,\n fieldPage: navigation.fieldPage,\n ...navigation.debugInfo\n }}\n />\n </div>\n\n <FormNavigation\n onPrevious={navigation.goToPrevious}\n onNext={handleNext}\n onPreviousVisible={navigation.goToPreviousVisible}\n onNextVisible={navigation.goToNextVisible}\n onClearAll={onClearAll}\n onSubmit={handleSubmitWithValidation}\n isFirstSection={navigation.isFirstSection}\n isLastSection={navigation.isLastSection}\n isValidating={isValidating}\n onSubmitButtonText={submitButtonText}\n showStepNavigation={navigation.totalSteps > 1}\n displayDeleteButton={displayDeleteButton}\n />\n </div>\n </>\n );\n};\n\nexport default FormEngineContent;","import { useCallback, useEffect, useMemo } from \"react\";\nimport { useFormNavigation } from \"../../hooks/useFormNavigation\";\nimport type { FormEngineProps } from \"./types/formEngine.types\";\nimport { FormThemeProvider, deriveThemeVars, DEFAULT_PRIMARY } from \"../../context/FormThemeContext\";\nimport { extractAllFields } from \"../../types/formUtils\";\nimport { useFormPersistence, useFormStore } from \"../../store/useFormStore\";\nimport { createZodSchema } from \"../../types/validation\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport { shouldDisplaySection, shouldDisplayFormField } from \"../../types/displayRules\";\nimport type { ResponseInForm } from \"../../types/formTypeStructure\";\nimport useFormReset from \"./hooks/useFormReset\";\nimport FormEngineContent from \"./FormEngineContent\";\n\n// import { useFormToast, FormToastUtils } from './toast/FormToastNotifier';\n\n\n\nconst FormEngine: React.FC<FormEngineProps> = ({\n form,\n formId,\n onSubmit,\n currentLang = \"fr\",\n submitButtonText,\n paginationMode // Prop optionnelle pour override (priorité sur form.layoutOptions)\n}) => {\n // Déterminer le mode de pagination : prop > form.layoutOptions > défaut\n const effectivePaginationMode = paginationMode ?? form.layoutOptions?.paginationMode ?? \"byFields\";\n // Extraire progressBarType depuis form.layoutOptions\n const progressBarType = form.layoutOptions?.progressBarType;\n // Extraire headerOptions depuis form.layoutOptions\n const headerOptions = form.layoutOptions?.headerOptions;\n // Extraire displayDeleteButton depuis form.layoutOptions (défaut: true pour rétrocompatibilité)\n const displayDeleteButton = form.layoutOptions?.displayDeleteButton ?? true;\n // Extraire containerStyles depuis form.layoutOptions\n const containerStyles = form.layoutOptions?.containerStyles;\n // Récupération des valeurs du formulaire pour calculer la visibilité\n const rawFormValues = useFormStore((state) => state.forms[formId]);\n const formValues = useMemo(() => rawFormValues ?? {}, [rawFormValues]);\n\n // Conversion des valeurs pour l'évaluation des conditions d'affichage\n const allResponseInForms: Record<string, ResponseInForm> = useMemo(() => {\n const responses: Record<string, ResponseInForm> = {};\n Object.entries(formValues).forEach(([key, value]) => {\n responses[key] = { responseValue: value };\n });\n return responses;\n }, [formValues]);\n\n // Calcul de la visibilité de chaque section\n const sectionVisibility = useMemo(() => {\n return form.sections.map((section) => {\n try {\n return shouldDisplaySection(section, allResponseInForms);\n } catch (error) {\n console.error('[FormEngine] Erreur évaluation section', { \n sectionId: section.sectionId, \n error \n });\n return true; // Fallback : afficher la section en cas d'erreur\n }\n });\n }, [form.sections, allResponseInForms]);\n\n // Calcul de la visibilité de chaque page (basé sur les champs visibles)\n const fieldsPerPage = 4; // Valeur par défaut, peut être ajustée\n const pageVisibility = useMemo(() => {\n return form.sections.map((section, sectionIdx) => {\n if (!sectionVisibility[sectionIdx]) {\n return []; // Section cachée = aucune page visible\n }\n\n const fields = section.formFields || [];\n const totalPages = Math.ceil(fields.length / fieldsPerPage);\n const pageCounts = new Array(totalPages).fill(0);\n\n fields.forEach((field, index) => {\n const pageIndex = Math.floor(index / fieldsPerPage);\n try {\n if (shouldDisplayFormField(field, allResponseInForms)) {\n pageCounts[pageIndex] = (pageCounts[pageIndex] || 0) + 1;\n }\n } catch (error) {\n console.error('[FormEngine] Erreur évaluation champ', {\n sectionId: section.sectionId,\n fieldName: field.fieldName,\n error,\n });\n pageCounts[pageIndex] = (pageCounts[pageIndex] || 0) + 1; // Fallback\n }\n });\n\n return pageCounts;\n });\n }, [form.sections, sectionVisibility, allResponseInForms, fieldsPerPage]);\n\n // Navigation et champs\n const navigation = useFormNavigation({ \n form, \n paginationMode: effectivePaginationMode,\n sectionVisibility,\n pageVisibility\n });\n const allFields = useMemo(() => extractAllFields(form), [form]);\n\n // Persistance et schéma\n const { savedValues } = useFormPersistence(formId, form.sections);\n const schema = useMemo(() => createZodSchema(allFields), [allFields]);\n\n // 🔥 Amélioration : Clé unique pour forcer le re-rendu complet lors du changement de structure\n const formKey = useMemo(() => {\n // Combiner l'ID du formulaire avec le fadeKey de navigation pour forcer le re-rendu\n return `${formId}_${navigation.fadeKey}_${form.sections.length}`;\n }, [formId, navigation.fadeKey, form.sections.length]);\n\n // Configuration React Hook Form\n const methods = useForm({\n resolver: zodResolver(schema),\n mode: \"onTouched\",\n defaultValues: useMemo(() => Object.fromEntries(\n allFields.map((field) => [\n field.fieldName,\n savedValues[field.fieldName] ?? field.response?.responseValue ?? \"\"\n ])\n ), [allFields, savedValues]),\n });\n\n // Initialisation des valeurs\n useEffect(() => {\n const values = methods.getValues();\n \n for (const key in values) {\n const value = values[key];\n if (value !== undefined && value !== \"\") {\n methods.setValue(key, value, { shouldTouch: true });\n }\n }\n }, [methods]);\n\n // Gestionnaires d'événements\n const handleFieldChange = useCallback((id: string, value: any) => {\n methods.setValue(id, value, { shouldValidate: true });\n }, [methods]);\n\n const { handleClearAll } = useFormReset(methods, allFields, formId, navigation);\n\n const primaryColor = form.theme?.primaryColor ?? DEFAULT_PRIMARY;\n const themeVars = deriveThemeVars(primaryColor);\n\n return (\n <FormThemeProvider primaryColor={primaryColor}>\n <FormProvider {...methods}>\n <form\n key={formKey}\n onSubmit={(e) => e.preventDefault()}\n className=\"h-full w-full laptop:w-[90%] flex flex-col items-center justify-center bg-white\"\n style={themeVars}\n >\n <FormEngineContent\n form={form}\n formId={formId}\n onSubmit={onSubmit}\n currentLang={currentLang}\n navigation={navigation}\n allFields={allFields}\n handleFieldChange={handleFieldChange}\n onClearAll={handleClearAll}\n methods={methods}\n submitButtonText={submitButtonText ?? \"Continer\"}\n paginationMode={effectivePaginationMode}\n progressBarType={progressBarType}\n sections={form.sections}\n headerOptions={headerOptions}\n displayDeleteButton={displayDeleteButton}\n containerStyles={containerStyles}\n />\n </form>\n </FormProvider>\n </FormThemeProvider>\n );\n};\n\nexport default FormEngine;","// components/atoms/formfield/types/formTypeStructure.ts\n\n// =============================================\n// === ELEMENTARY VALUES ========\n// =============================================\n\n/**\n * Represents a generic response value that can be of various types.\n *\n * @property responseValue - The value of the response, which can be a string, an array of strings,\n * a number, an array of numbers, a boolean, a File, or an array of Files.\n */\nexport interface ResponseInForm {\n responseValue: string | string[] | number | number[] | boolean | File | File[] | null;\n}\n\n\n/**\n * Représente une option sélectionnable dans un champ de formulaire de type sélection.\n *\n * @property value - La valeur unique associée à l’option (utilisée en interne).\n * @property label - Le libellé affiché à l’utilisateur. Peut être une chaîne de caractères ou un objet de traductions par langue.\n * @property points - (Optionnel) Nombre de points associés à cette option, utilisé pour des calculs ou des scores.\n * @property icon - (Optionnel) Icône à afficher à côté de l’option dans l’interface utilisateur.\n */\nexport interface SelectOption {\n value: string;\n label: string | { [lang: string]: string };\n points?: number; // dans le cas d'un jeu de choix\n icon?: string; // Optionnel : pour l’UI (ex : icône affichée à côté)\n}\n// =============================================\n// === ELEMENTARY VALUES ========\n// =============================================\n\n\n\n\n\n\n// =============================================\n// === CONDITIONAL DISPLAY STRUCTURES ====\n// =============================================\n\nexport type ConditionalOperator = \n | \"==\" \n | \"!=\" \n | \">\" \n | \"<\" \n | \"IN\" \n | \"NOT IN\" \n | \"CONTAINS\" \n | \"NOT CONTAINS\";\n\n/**\n * Méthodes d’agrégation de valeurs de plusieurs champs\n */\nexport type TypeComputation = \"SOMME\" | \"MULTIPLICATION\";\n\n/**\n * Une règle unique de condition d'affichage.\n */\nexport interface ConditionalDisplayRule {\n /**\n * Clé(s) technique(s) des champs sur lesquels appliquer la règle.\n * Peut être utilisé si formFieldId n’est pas renseigné.\n */\n fieldName?: string | string[];\n\n /**\n * ID(s) unique(s) des champs (UUID).\n * Peut remplacer ou compléter fieldName.\n */\n formFieldId?: string | string[];\n\n /**\n * La valeur ou les valeurs attendues (cible de comparaison).\n */\n value?: string | number | boolean | string[] | number[];\n\n /**\n * L’opérateur de comparaison.\n */\n operator?: ConditionalOperator;\n\n /**\n * Comparaison à une valeur numérique (dans le cas d’une agrégation ou d’un champ nombre).\n */\n numeric_compare_to?: number;\n\n /**\n * Si plusieurs champs sont ciblés, méthode d’agrégation des valeurs.\n * Exemple : SOMME, MULTIPLICATION\n */\n typeComputation?: TypeComputation;\n}\n\n/**\n * Groupe de règles à combiner selon une logique AND ou OR\n */\nexport interface ConditionalDisplayGroup {\n rules: ConditionalDisplayRule | ConditionalDisplayRule[];\n logic?: \"AND\" | \"OR\";\n}\n\n\n// =============================================\n// === CONFITION OF VALIDATION OF FORMFIELD ====\n// =============================================\n\n/**\n * Represents the available validation types for form fields.\n *\n * - `\"required\"`: Ensures the field is not empty.\n * - `\"minLength\"`: Validates that the field value meets a minimum length.\n * - `\"maxLength\"`: Validates that the field value does not exceed a maximum length.\n * - `\"regex\"`: Validates the field value against a regular expression pattern.\n * - `\"email\"`: Ensures the field value is a valid email address.\n * - `\"number\"`: Ensures the field value is a valid number.\n * - `\"fileSize\"`: Validates the size of an uploaded file.\n * - `\"phone_number\"`: Ensures the field value is a valid phone number.\n * - `\"textarea\"`: Indicates the field is a textarea input.\n * - `\"fileType\"`: Validates the type of an uploaded file.\n */\nexport type ValidationType =\n | \"required\"\n | \"minLength\"\n | \"maxLength\"\n | \"regex\"\n | \"email\"\n | \"number\"\n | \"fileSize\"\n | \"phone_number\" \n | \"textarea\"\n | \"fileType\";\n\n\n/**\n * Represents a validation rule for a form field.\n *\n * @property validationType - The type of validation to apply (e.g., required, minLength, pattern).\n * @property value - The value associated with the validation rule. This can be a number, a string, or an array of strings, depending on the validation type.\n * @property errMsg - The error message to display if the validation fails.\n */\nexport interface ValidationRule {\n validationType?: ValidationType;\n value?: number | string | string[];\n errMsg: string;\n}\n// =============================================\n// === CONFITION OF VALIDATION OF FORMFIELD ====\n// =============================================\n\n\n\n\n\n\n\n\n\n\n\n\n\n// =============================================\n// === REPETITION RULES ====\n// =============================================\n\n\n/**\n * Décrit la logique de répétition d’un groupe de champs selon une valeur numérique saisie dans un autre champ.\n */\nexport interface RepeatRule {\n\n\n /**\n * Limite maximale du nombre de répétitions autorisées (optionnelle).\n */\n max?: number;\n\n /**\n * Limite minimale du nombre de répétitions requises (optionnelle).\n */\n min?: number;\n\n /**\n * Indique si on pré-remplit automatiquement un ensemble vide (utile pour le rendu initial).\n */\n prefillEmpty?: boolean;\n}\n\n\n\n\n\n\n\n\n\n\nexport interface FormRepeatGroup {\n repeatGroupId: string; // ID unique du groupe répétable\n fieldName: string; // Clé technique, comme pour FormField\n label: string | { [lang: string]: string }; // Libellé du groupe\n minRepeats?: number; // Nombre minimum d’instances\n maxRepeats?: number; // Nombre maximum d’instances\n initialRepeats?: number; // Nombre d'instances créées initialement\n formFields: FormField[]; // Champs contenus dans chaque répétition\n position?: number; // Position d'affichage\n conditionalDisplay?: ConditionalDisplayGroup;\n}\n\n\n\nexport enum SpecialField {\n IMAGE = \"IMAGE\",\n VIDEO = \"VIDEO\",\n AUDIO = \"AUDIO\",\n DOCUMENT = \"DOCUMENT\",\n PDF = \"PDF\",\n VOICE = \"VOICE\",\n TIP_TAP_DOC_TEXT = \"TIP_TAP_DOC_TEXT\",\n OTP = \"OTP\",\n}\n\n\n\n// =============================================\n// === OTP FORM FIELD EXEC OPTIONS ======\n// =============================================\n\nexport interface OTPFormFieldExecOptions {\n serverDns: string;\n /** Endpoint relatif, ex: /api/otp/send */\n postApiEndPoint: string;\n /** Payload à envoyer avec la requête OTP (sera fusionné avec les données du formulaire) */\n payload?: Record<string, any> | Map<string, unknown>;\n /** Headers additionnels à joindre à la requête */\n extraHeaders?: Record<string, string>;\n /** Token Bearer pour l'authentification */\n bearer?: string;\n /** Timeout en ms pour la requête */\n timeoutMs?: number;\n /** Nombre de cases OTP (défaut: 6) */\n otpLength?: number;\n /** Nom du champ Email qui doit déclencher l'envoi de l'OTP (dans une section précédente) */\n linkedEmailFieldName?: string;\n /** Configuration pour l'envoi initial de l'OTP (quand l'email est saisi). Si non défini, utilise la même config que la vérification */\n sendOTPApiConfig?: {\n serverDns: string;\n postApiEndPoint: string;\n payload?: Record<string, any> | Map<string, unknown>;\n extraHeaders?: Record<string, string>;\n bearer?: string;\n };\n /** Activer la validation automatique quand tous les chiffres sont saisis (défaut: false) */\n autoValidate?: boolean;\n /** Activer le bouton \"Renvoyer le code\" (défaut: true) */\n enableResend?: boolean;\n /** Délai minimum en secondes entre deux envois de code (défaut: 60) */\n resendCooldownSeconds?: number;\n}\n\n\n// =============================================\n// === EMAIL FORM FIELD EXEC OPTIONS ======\n// =============================================\n\nexport interface EmailFormFieldExecOptions {\n /** Si true, déclenche automatiquement l'envoi d'OTP quand l'email est validé */\n triggerOTPSend?: boolean;\n /** Nom du champ OTP lié (optionnel, pour validation) */\n linkedOTPFieldName?: string;\n /** Configuration API pour l'envoi d'OTP */\n otpSendApiConfig?: {\n serverDns: string;\n postApiEndPoint: string;\n payload?: Record<string, any> | Map<string, unknown>;\n extraHeaders?: Record<string, string>;\n bearer?: string;\n };\n}\n\nexport interface OTPFormFieldLink {\n fieldName: string;\n fieldType: \"email\" | \"favoris\";\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// =============================================\n// === FILE TO BUCKET MANAGEMENT ======\n// =============================================\n\n\n\nexport interface FileToBucketManage {\n uploadOption: UploadOption;\n deleteOption: DeleteOption;\n}\n\n/**\n * Options pour l’upload d’un fichier vers le bucket.\n * Correspond à POST /api/files/upload-file (ou /upload-files pour du multi).\n */\nexport interface UploadOption {\n /** Base URL du service, ex: https://bucket.urmaphalab.com */\n serverDns: string;\n /** Endpoint relatif, ex: /api/files/upload-file */\n postApiEndPoint: string;\n /**\n * Payload non sérialisé : sera converti en multipart/form-data.\n * Clés attendues par l’API :\n * - file : File ou Blob (obligatoire)\n * - secret_key : string (obligatoire)\n * - folder_name : string (optionnel, défaut “general”)\n * - filename : string (optionnel, sans extension)\n * - files / filenames pour la variante multi-upload\n */\n payload?: Map<string, unknown> | Record<string, unknown>;\n /** Optionnel : Authorization: Bearer ... si l’API évolue en nécessite */\n bearer?: string;\n /** Headers supplémentaires à joindre à la requête (hors Content-Type géré par FormData) */\n extraHeaders?: Record<string, string>;\n /** Timeout en ms, si l’on veut borner la requête */\n timeoutMs?: number;\n /** Optionnel : hook pour logger ou transformer la réponse brute */\n onResponse?(response: Response): Promise<void>;\n}\n\n/**\n * Options pour supprimer un fichier du bucket.\n * Compatible avec:\n * - DELETE /api/files/delete-file\n * - DELETE /api/files/delete-file-by-url\n */\nexport interface DeleteOption {\n /** Base URL du service, ex: https://bucket.urmaphalab.com */\n serverDns: string;\n /** Endpoint relatif, ex: /api/files/delete-file */\n deleteApiEndPoint: string;\n /**\n * Payload JSON envoyé en body (ou query string).\n * Clés possibles suivant la route utilisée :\n * - secret_key : string (obligatoire)\n * - folder_name : string (optionnel, défaut “general”)\n * - filename : string (obligatoire si delete-file)\n * - file_url : string (obligatoire si delete-file-by-url)\n */\n payload?: Record<string, unknown> | Map<string, unknown>;\n /** Optionnel : Authorization: Bearer ... */\n bearer?: string;\n /** Headers additionnels à envoyer */\n extraHeaders?: Record<string, string>;\n /** Timeout en ms pour cette requête */\n timeoutMs?: number;\n /** Optionnel : hook pour logger ou transformer la réponse brute */\n onResponse?(response: Response): Promise<void>;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// =============================================\n// === THE FORM CORE COMPONENTS ========\n// =============================================\n\n/**\n * Represents a form field definition with metadata, validation, and display options.\n *\n * @property formFieldId - Unique identifier for the form field (UUID or generated).\n * @property fieldName - Internal technical key for the field.\n * @property slug - Optional, human-readable key for URLs or UI.\n * @property dataLabel - Optional, label used for export or processing.\n * @property fieldType - Type of the form field (e.g., text, dropdown, date, etc.).\n * @property label - Field label, can be a string or a multilingual object.\n * @property response - The response value or list of responses for the field.\n * @property selectOptions - Optional, list of selectable options for select, radio, or checkbox fields.\n * @property validations - Optional, array of validation rules for the field.\n * @property position - Optional, display order of the field.\n * @property placeholder - Optional, placeholder text, can be a string or multilingual object.\n * @property tooltip - Optional, tooltip text, can be a string or multilingual object.\n * @property helpText - Optional, help text, can be a string or multilingual object.\n * @property example - Optional, example value, can be a string or multilingual object.\n * @property conditionalDisplay - Optional, conditional display logic for the field.\n */\nexport interface FormField {\n formFieldId: string; // ID unique (UUID ou généré)\n fieldName: string; // Clé technique interne\n slug?: string; // Clé lisible pour URL / UI\n fieldType: \n | \"text\"\n | \"textarea\"\n | \"dropdown\"\n | \"radio\"\n | \"checkbox\"\n | \"date\"\n | \"number\"\n | \"bool\"\n | \"file\"\n | \"password\"\n | SpecialField;\n label: string | { [lang: string]: string }; // Label multilingue\n repeatGroup ?: FormRepeatGroup; // Groupe répétable (optionnel)\n repeatRule?: RepeatRule; // Règle de répétition (optionnelle)\n response: ResponseInForm; // Réponse ou liste de réponses\n selectOptions?: SelectOption[]; // Options pour select/radio/checkbox\n validations?: ValidationRule[]; // Liste des règles de validation\n position?: number; // Ordre d'affichage\n placeholder?: string | { [lang: string]: string };\n tooltip?: string | { [lang: string]: string };\n helpText?: string | { [lang: string]: string };\n example?: string | { [lang: string]: string };\n enableSearch?: boolean;\n dynamicFilterRule?: DynamicFilterRule;\n conditionalDisplay?: ConditionalDisplayGroup; // Logique d'affichage conditionnel\n fileToBucketManage?: FileToBucketManage; // Gestion des fichiers vers le bucket\n width?: \"full\" | \"half\"; // Largeur du champ: \"full\" = 100% (mobile), \"half\" = 50% (tablet+)\n otpFormFieldExecOptions?: OTPFormFieldExecOptions; // Options pour l'envoi et validation OTP\n emailFormFieldExecOptions?: EmailFormFieldExecOptions; // Options pour les champs Email qui déclenchent l'envoi d'OTP\n flattenOnSubmit?: boolean; // Si true, aplatir le champ dans le JSON final (défaut: true pour OTP)\n detailInfos?: DetailInfosConfig; // Configuration pour générer automatiquement des champs de détails selon l'option sélectionnée\n}\n\n/**\n * Configuration pour générer automatiquement des champs de détails\n * quand une option est sélectionnée dans un dropdown, radio ou checkbox.\n * \n * @property [optionValue] - Pour chaque valeur d'option, définir les champs de détails à générer\n * @property formFields - Liste des champs à générer pour cette option\n * @property label - Label optionnel pour le groupe de détails (peut être multilingue)\n */\nexport interface DetailInfosConfig {\n [optionValue: string]: {\n formFields: FormField[];\n label?: string | { [lang: string]: string };\n };\n}\n\nexport interface DynamicFilterRule {\n dependentFieldName: string; // Le champ dont dépend ce filtre\n filterType: \"exact\" | \"hierarchical\"; // Type de filtrage\n dataSource: {\n type: \"static\" | \"external\"; // Source des données\n data: Record<string, DynamicFilteringDataSourceElement[]>;\n // OU\n endpoint?: string; // Pour données externes\n };\n // Optionnel : transformation des données\n transform?: {\n valueKey: string; // Clé pour la valeur\n labelKey: string; // Clé pour le label\n };\n}\n\nexport interface DynamicFilteringDataSourceElement {\n value: string;\n label: string | { [lang: string]: string };\n}\n\n\n/**\n * Sous-section regroupant des champs.\n */\n/**\n * Represents a subsection within a form structure.\n *\n * @property subSectionId - Unique identifier for the subsection.\n * @property title - Optional title of the subsection. Can be a string, a localized object, or null.\n * @property subTitle - Optional subtitle of the subsection. Can be a string, a localized object, or null.\n * @property isSpacer - Optional visual spacer indicator (e.g., for visual separation).\n * @property position - Optional display order of the subsection.\n * @property formFields - Array of form fields contained in this subsection.\n */\nexport interface Section {\n sectionId: string;\n title?: string | { [lang: string]: string } | null; // Titre optionnel de la section\n subTitle?: string | { [lang: string]: string } | null; // Sous-titre optionnel de la section\n isSpacer?: string; // Pour gestion visuelle (ex : séparation)\n position?: number; // Ordre d'affichage de la sous-section\n formFields: FormField[];\n conditionalDisplay?: ConditionalDisplayGroup; // Logique d'affichage conditionnel\n}\n\n\n/**\n * Structure complète d’un formulaire.\n */\n/**\n * Represents the structure of a form.\n *\n * @property name - The name of the form.\n * @property provider - The author or provider of the form.\n * @property description - A general description of the form.\n * @property status - The activation status of the form. Can be \"ACTIVE\" or \"INACTIVE\".\n * @property isDeclaration - Indicates if the form is an official declaration (1 = yes, 0 = no).\n * @property isTest - Indicates if the form is a test form (1 = yes, 0 = no).\n * @property version - (Optional) The version of the form.\n * @property createdAt - (Optional) The ISO date when the form was created.\n * @property updatedAt - (Optional) The ISO date when the form was last updated.\n * @property sections - The sections that compose the form.\n */\nexport interface FormTheme {\n primaryColor?: string; // Code hex de la couleur principale, ex: \"#008080\"\n}\n\nexport interface FormStructure {\n name: string; // Nom du formulaire\n provider: string; // Auteur / fournisseur\n description: string; // Description générale\n status: \"ACTIVE\" | \"INACTIVE\"; // Statut d'activation\n isDeclaration: number; // 1 = déclaration officielle\n isTest: number; // 1 = formulaire de test\n version?: string; // Version du formulaire\n createdAt?: string; // Date de création (ISO)\n updatedAt?: string; // Date de mise à jour (ISO)\n sections: Section[]; // Sections composant le formulaire\n theme?: FormTheme; // Thème visuel (couleur principale)\n layoutOptions?: FormEngineLayoutOptions; // Options de layout et pagination du formulaire\n}\n// =============================================\n// === THE FORM COMPONENTS ========\n// =============================================\n\n\n\n\n// =============================================\n// === FORM ENGINE LAYOUTOPTIONS ========\n// =============================================\n\nexport interface FormEngineLayoutOptions {\n paginationMode?: \"byFields\" | \"bySection\"; // Mode de pagination: \"byFields\" = par nombre de champs (défaut), \"bySection\" = une section = une page\n progressBarType?: ProgressBarType;\n headerOptions?: HeaderOptions;\n displayDeleteButton?: boolean;\n containerStyles?: ContainerStylesOptions; // Styles personnalisés pour les conteneurs\n}\n\n\nexport interface ProgressBarType {\n type: \"default_step\" | \"custom\" | \"pastel\" | \"linear\" | \"section_bubble\" | \"section_bubble_pastel\";\n colors?: {\n background: string;\n foreground: string;\n };\n visible?: boolean;\n}\n\nexport interface HeaderOptions {\n visible?: boolean; // Contrôle de visibilité du header\n type: \"default\" | \"custom\"; // Type de header : \"default\" = header par défaut, \"custom\" = composant personnalisé\n customHeader?: React.ReactNode; // Composant React personnalisé à afficher si type === \"custom\"\n}\n\n// Interface pour les styles d'un conteneur\nexport interface ContainerStyles {\n borderColor?: string; // Couleur de la bordure (ex: \"#e5e7eb\", \"slate-200\", \"rgb(226, 232, 240)\")\n borderWidth?: string | number; // Épaisseur de la bordure (ex: \"2px\", 2, \"1px\", \"0.5rem\")\n backgroundColor?: string; // Couleur de fond (ex: \"#ffffff\", \"white\", \"#F6F6F6\", \"rgb(246, 246, 246)\")\n}\n\n// Options de styles pour les conteneurs du FormEngine\nexport interface ContainerStylesOptions {\n mainContainer?: ContainerStyles; // Styles pour le grand conteneur (qui contient sections + boutons)\n sectionContainer?: ContainerStyles; // Styles pour le petit conteneur (qui contient la section)\n}"]}
|