{"version":3,"sources":["webpack:///src/modules/checkout-delivery-options/checkout-delivery-options.tsx?d83e","webpack:///./src/modules/citta-cart/components/citta-cart-pick-up-in-store.tsx?51d4","webpack:///./src/modules/citta-cart/components/citta-cart-line-items.tsx?0904","webpack:///./src/modules/citta-cart/components/citta-cart-line-groups.tsx?d98e","webpack:///./src/modules/citta-cart/utils/get-promotion-in-citta-cart.ts?bc87","webpack:///./src/modules/citta-cart/citta-cart.tsx?a61a","webpack:///./src/modules/citta-cart/components/hso-validate-cartlines-inventory.tsx?3f6b","webpack:///./src/modules/citta-cart/components/citta-cart-line-items-promotion.tsx?a341","webpack:///./src/themes/citta/views/cart.view.tsx?df87","webpack:///src/Common/get-product.ts?5f1d","webpack:///src/index.ts?c6ae","webpack:///./src/themes/citta/views/header.view.tsx?1b61","webpack:///src/modules/checkout-loyalty/components/checkout-loyalty-label.tsx?3110","webpack:///src/modules/checkout-delivery-options/components/checkout-delivery-options.description.tsx?8620","webpack:///src/modules/cart-icon/components/flyout-cart-line-items.tsx?a0df","webpack:///./src/modules/citta-header/citta-header.view.tsx?3cdd","webpack:///./src/components/citta-cart/cart-line-items.tsx?52b5","webpack:///src/modules/cart/components/cart-line-items-promotion.tsx?6882","webpack:///./src/themes/citta/views/citta-cart.view.tsx?9912","webpack:///src/modules/checkout-loyalty/components/checkout-loyalty-text.tsx?0080","webpack:///src/modules/cart/components/cart-line-items.tsx?a1e3","webpack:///src/order-summary-lineitem.tsx?86d9","webpack:///src/modules/checkout-delivery-options/components/checkout-delivery-options.radio-button.tsx?f1bb","webpack:///src/modules/media-gallery/media-gallery.tsx?3b46","webpack:///src/modules/cart/actions/get-pickup-options-for-cartlines.ts?91bf","webpack:///src/modules/cart/components/cart-line-groups.tsx?b88f","webpack:///src/modules/cart/utils/get-promotion-in-cart.ts?1379","webpack:///src/modules/cart/cart.tsx?f1c3","webpack:///src/modules/media-gallery/utils/get-valid-product-images.ts?4e26","webpack:///./src/modules/citta-media-gallery/utils/get-valid-product-images.ts?fe1a","webpack:///./src/modules/citta-media-gallery/citta-media-gallery.tsx?5ffa","webpack:///./src/themes/citta/views/components/cart-icon.component.tsx?b149","webpack:///src/modules/checkout-delivery-options/components/checkout-delivery-options.error-message.tsx?8f25","webpack:///src/modules/cart-icon/utils/get-products-in-mini-cart.ts?f52c","webpack:///src/modules/cart-icon/cart-icon.tsx?5b5f","webpack:///src/modules/cart/cart.view.tsx?394b","webpack:///src/modules/media-gallery/utils/helper.ts?6516","webpack:///src/modules/checkout-loyalty/checkout-loyalty.view.tsx?876d","webpack:///src/modules/cart-icon/cart-icon.view.tsx?d63a","webpack:///src/checkout-errors/checkout-errors.ts?687e","webpack:///src/common/error.tsx?f9f6","webpack:///./src/modules/citta-media-gallery/citta-media-gallery.view.tsx?9c68","webpack:///src/modules/cart/components/cart-pick-up-in-store.tsx?f7bf","webpack:///src/modules/checkout-loyalty/components/checkout-loyalty-input.tsx?d04f","webpack:///./src/modules/citta-cart/citta-cart.view.tsx?8a3c","webpack:///src/modules/media-gallery/media-gallery.view.tsx?6e14","webpack:///./src/modules/citta-header/components/logo.tsx?fee4","webpack:///./src/modules/citta-header/components/nav-icon.tsx?df55","webpack:///./src/modules/citta-header/components/citta-header-preferred-store.tsx?26f0","webpack:///./src/modules/citta-header/citta-header.tsx?8ea9","webpack:///src/modules/checkout-loyalty/checkout-loyalty.tsx?c94a","webpack:///src/modules/checkout-delivery-options/checkout-delivery-options.view.tsx?d64d","webpack:///src/modules/checkout-delivery-options/components/checkout-delivery-options.error-title.tsx?e220","webpack:///src/invoice-summary-lineitem.tsx?1b66","webpack:///src/validate-cart.ts?28cc"],"names":["CheckoutDeliveryOptions","React","constructor","props","super","selectedItemId","deliveryOptions","isLoading","retailMultiplePickUpOptionEnabled","checkoutErrorRef","init","async","this","moduleState","onEdit","isSelectDefaultOptionEnabled","undefined","onCancel","onSubmit","status","config","useDefaultDeliveryOption","canShip","cartDeliveryMode","getSavedDeliveryOption","loadDeliveryOptions","_this$props$data$chec","data","checkout","result","checkoutCart","hasInvoiceLine","getCartLinesForShipping","length","isDeliveryModeExists","deliveryMode","find","deliveryOption","Code","getDeliveryOptionSelected","selectedItem","context","telemetry","error","id","typeName","priceFree","resources","price","get","channelConfig","request","channel","DeliveryOption","className","description","DescriptionComponent","Object","assign","Description","PriceComponent","CustomerContextualPrice","freePriceText","currencyCode","Currency","getErrorMessage","errorMessageTitle","CheckoutDeliveryOptionsError","tag","role","title","ErrorTitleComponent","message","ErrorMessageComponent","errorMessage","getDeliveryOptionList","count","map","index","code","radioButton","RadioButtonComponent","isChecked","value","ariaSetSize","ariaPosInSet","ariaLabel","onChange","onDeliveryOptionChange","telemetryContent","getSaveButton","saveBtnLabel","Button","color","disabled","onClick","onSave","getEditButton","editBtnLabel","getCancelButton","cancelBtnLabel","setError","setHasError","onUpdating","clearError","_this$props$data$chec2","information","updateShouldCollapsePaymentSection","newShouldCollapsePaymentSection","_this$props$data$chec3","updateCartDeliverySpecification","savedDeliveryOption","_this$props$data$chec4","onReady","cartLinesForShipping","DeliveryMode","deliveryModeId","trim","checkoutState","updateCartDeliverySpecificationInput","shippingAddress","channelDeliveryOptionConfig","onPending","then","response","_response$errorDetail","errorDetails","LocalizedMessage","StringExtensions","isNullOrEmpty","genericErrorMessage","setIsCancellable","catch","pickupDeliveryModeCode","PickupDeliveryModeCode","emailDeliveryModeCode","EmailDeliveryModeCode","cart","CartLines","filter","cartLine","_this$channelDelivery","PickupDeliveryModeCodes","getDeliveryOptions","_this$props$data$chec5","cartState","cartId","Id","originalDeliveryMode","shippingCartLines","hasShippingDeliveryLines","clearCartLinesDeliveryInformation","channelDeliveryOptionConfiguration","deliveryOptionFilter","filterDeliveryModeOption","FilterDeliveryModeOption","None","FilterOutNonCarrierDeliveryMode","getDeliveryOptionsAsync","callerContext","actionContext","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","_unused","deliveryOptionsNotFound","_this$props$data$chec6","_this$props$data$chec7","updateHasCartDeliveryMode","newHasCartDeliveryMode","isPaymentVerificationRedirection","_this$props$data$chec8","getStoredDeliveryOptions","_this$props$data$chec9","_this$props$data$chec10","_this$props$data$chec11","_this$props$data$chec12","_this$props$data$chec13","_this$props$data$chec14","isExpressCheckoutApplied","isExpressPaymentAppliedInCartPage","event","currentTarget","getTelemetryObject","telemetryPageName","friendlyName","_this$props$data$cart","_this$props$data$cart2","properties","ExtensionProperties","property","Key","Value","StringValue","JSON","parse","_this$expressPaymentD","_this$expressPaymentD2","expressPaymentDetailsFromCartPage","isExpressCheckoutAppliedInCartPage","_this$props$data$chec19","when","isDataReady","reaction","_this$props$data$chec15","_this$props$data$chec16","_this$props$data$chec17","_this$props$data$chec18","shouldEnableCheckoutErrorDisplayMessaging","_this$props$data$chec20","checkoutError","errorLocation","ErrorLocation","_this$props$data$chec21","checkoutErrorFocus","CheckoutModule","focusOnCheckoutError","shouldComponentUpdate","nextProps","nextState","state","render","_this$props$data$chan","_this$props$data$feat","featureState","feature","Name","IsEnabled","isReady","isUpdating","hasError","isError","isShowList","isShowSelected","deliveryOptionAriaLabel","viewProps","_objectSpread","deliveryOptionsData","alert","ErrorComponent","errorMessageData","viewState","isShowSaveButton","hasExternalSubmitGroup","isShowEditButton","isShowCancelButton","moduleProps","classname","DeliveryOptionsList","list","deliveryOptionSelected","waiting","Waiting","saveButton","editButton","cancelButton","renderView","__decorate","observable","computed","action","withModuleState","observer","PickUpInStore","_toggleBOPIS","isBopisSelected","storeSelectorStateManager","product","cartline","storeSelectorModuleId","openDialog","alreadySelectedLocation","OrgUnitNumber","FulfillmentStoreId","onLocationSelected","orgUnitLocation","updateCartLinePickupLocation","cartLineId","LineId","location","locationChangedHandler","Promise","resolve","_onLocationChangedCallback","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","orgUnitLocations","foundLocation","OrgUnitName","DeliveryOptions","_props$channelDeliver","retailMulitplePickupFeatureState","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","delivery","pickup","deliveryCode","push","ArrayExtensions","hasElements","option","callbacks","toggleBopis","defaultComponent","_renderShippingMethod","shipItText","pickupInStoretext","changeStoreText","orgUnitName","bopisSelected","toggleBOPIS","type","name","checked","key","shipitText","pickUpInStoreText","_getDeliveryOption","pickupStore","_deliveryOptions$Deli","ContainerProps","_assembleNode","foundProductAvailability","productPickUpOptions","_product$Behavior","_foundProductAvailabi","_product$Dimensions","_props$cartState","imageSettings","gridSettings","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","orderTemplates","customerInformation","wishlists","defaultWishlistName","hsoConfig","isAuthenticated","user","nameOfWishlist","availableQuantityInStock","isStockCheckEnabled","productAvailability","ProductAvailableQuantity","IsProductAvailable","AvailableQuantity","_getCartItemAvailableQuantity","maxQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","isQuantityLimitsFeatureEnabled","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","maxCartlineQuantity","Behavior","MaximumQuantity","shouldSkipStockCheck","ItemTypeValue","ReleasedProductType","Service","IsInvoiceLine","estimatedDateProperty","estimatedDateValue","estimatedDate","toString","StockThresholdprop","StockThresholdpropval","IntegerValue","StockThreshold","onhand","Number","ObjectExtensions","isNullOrUndefined","_getErrorMessage","currentQuantity","lineId","_props$productAvailab","finalErrorMessages","productAvailabilites","shouldIgnoreWarehouse","ProductId","InventLocationId","WarehouseId","includeErrors","outOfStockText","outOfRangeOneText","outOfRangeFormatText","replace","checkForErrors","cartlinesErrors","ValidationResultsPairs","errorsFoundByLineId","i","ValidationFailures","forEach","validation","ErrorContext","join","Quantity","onRemoveClickHandler","onRemoveClickFunction","payload","getPayloadObject","TelemetryEvent","RemoveFromCart","attributes","getTelemetryAttributes","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","toLowerCase","isCustomPriceSelected","Dimensions","dimension","DimensionTypeValue","DimensionValue","productUrl","getProductUrlSync","MsDyn365","isBrowser","isChannelTypeB2B","requestContext","_cartline$CatalogId","fullUrl","URL","window","href","searchParams","set","CatalogId","getInvoiceDetailsPageUrlSync","cartlineId","CartLineItemComponent","catalogs","isOutOfStock","lineIndex","isQuantityEditable","quantityOnChange","updateCartLinesQuantitySuccessHandler","primaryImageUrl","PrimaryImageUrl","inventoryInformationLabel","inventoryLabelClassName","isCartStateReady","showShippingChargesForLineItems","pickUpInStore","pickitUpText","remove","addToWishlist","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","ariaRole","onSuccess","addToOrderTemplate","AddToOrderTemplateComponent","classnames","quantity","shouldShowButtonFailedTooltip","disableButton","app","disableTooltip","assembleCartlines","cartlines","products","reactNodes","getProductByProductIdAndWarehouse","getProductByProductId","_productAvailability$2","_productAvailability$3","_cartline$WarehouseId","_productAvailability$","toUpperCase","CartLineGroupItems","_assembleGroupInvoiceCartlines","cartLines","carLineViewProps","_assembleGroupCartlines","getGroupByStorePickup","items","groupBy","item","groupDelivery","cartLinesGroup","entries","_ref","deliveryType","groupByDeliveryType","keys","getPromotionData","ctx","promotionData","getPromotionOptionsForCartLineItems","PromotionOptionsForCartLineItems","apiSettings","promotionOptions","exception","Cart","Component","_isMounted","promotionPopupId","promotionLinkClick","setState","showPromotionDialog","promotionCloseButtonclick","_hidePromotionDialog","getImageSettings","viewports","xs","q","w","h","sm","lg","lazyload","removeItemFromCartHandler","cartlineToRemove","input","cartLineIds","removeCartLines","validateCart","warning","debug","updateCartlineQuantity","cartlineToUpdate","cartLineQuantityUpdatedAsync","cartActionResult","_cartActionResult$err","lineUpdateFailure","validationResults","fulfillmentStoreIdUpdated","getActiveCartProductsAction","ActiveCartProductsInput","payLoad","bind","isCartValid","getOrderQuantityLimitsFeatureFlag","showAvailablePromotions","_this$props$data$cart3","ProductPickUpOptionsForCartLineItems","getPickUpOptionsForCartLineItems","componentWillUnmount","_this$props$context$r","_cart$cart$CartLines","_this$props$data$prod","signInUrl","guestCheckoutUrl","getUrlSync","backToShoppingUrl","checkoutURL","getCheckoutURL","isCartEmpty","_getCartLines","HSOConfigprop","channelConfiguration","HSOConfig","validInventoryAcrossCartLines","productAvailabilities","cartLineMap","Map","enableStockCheck","isValid","productIdWithErrors","IsGiftCardLine","has","_cartLineMap$get","_cartLine$Quantity2","cartLineTotal","delete","_cartLine$Quantity","productAvailabilityMap","productId","Array","from","_cartLineMap$get2","cartLineQty","availableQuantity","line","cartLineProduct","RecordId","isStockedItem","_cartLineProduct$Beha","IsStockedProduct","isEmailDelivery","shouldSkipInventoryCheck","validateCartLinesInventory","_isCheckoutBlockedDueToUnavailableFunds","some","RetailMultiplePickupFeatureState","multiplePickUpEnabled","getCartLinesGroup","contentAction","etext","TelemetryConstant","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","BackToShopping","backtoShoppingAttributes","cartLineGroup","_updateCartLineErrorForInvalidInventory","createElement","cartTitle","CartlinesWrapper","OrderSummaryWrapper","OrderSummaryItems","promoCode","_getPromoCode","_getPromotions","removePromoAriaLabelFormat","orderSummaryHeading","invoiceSummaryTitle","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","checkoutAsSignInUserButton","checkoutButtonTitle","checkoutAsGuestButton","showGuestCheckoutButton","guestCheckoutButtonTitle","expressCheckoutButton","slots","paymentExpress","ExpressCheckoutSectionWrapper","backToShoppingButton","backToShoppingButtonTitle","createTemplateFromCartButton","_displayAddCartToTemplate","SaveCartToOrderTemplateComponent","_generateAddToOrderTemplateDialogResources","_generateOrderTemplateNameDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","_generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","checkoutBlockedDueToUnavailableFunds","checkoutBlockedDueToUnavailableFundsTitle","checkoutBlockedDueToUnavailableFundsMessage","storeSelector","waitingComponent","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","OrderSummaryErrors","_getOrderSummaryErrors","_this$props$data$cart4","_cart$cart","showPromotionPopup","promotions","promotionLinkText","promotionPopupHeading","onCloseButtonClick","onSeeAllClick","titleId","promotionMessageWrapper","promotionMessage","Fragment","promotionStringHeading","promotionSeeAllLink","tabIndex","promotionDialog","Modal","isOpen","toggle","ModalHeader","ModalBody","_promotion","_promotion$Promotion","Promotion","OfferName","ModalFooter","cartPromotions","promotionCloseButtonAriaLabel","cartLineInventoryValidationResult","productIdWithError","element","_element$data","outOfStockErrorMessage","allErrors","_cartline$data","_cartline$data$produc","fullError","Wrapper","Alert","assertive","outOfStockErrorMessageHeader","header","errors","isOboRequest","_this$props$data$cust","customerInfo","AllowOnAccountPayment","CreditLimit","InvoiceSummary","orderTotalLabel","totalAmountLabel","invoiceLabel","_this$props","_featureState$result","_this$props$context$r2","isShowOrHideTaxEnabled","isEnableShowOrHideSalesTaxECommerceEnabled","OrderSummary","subTotalLabel","itemsWithCountLabel","shippingLabel","estimatedShippingLabel","otherChargeLabel","otherCharges","taxLabel","estimatedTaxLabel","orderTotal","totalDiscountsLabel","toBeCalculatedText","yetToBeCalculatedText","freeText","isTaxIncludedInPrice","IsTaxIncludedInPrice","isShowTaxBreakup","PromoCodeComponent","promoCodeHeadingText","promoPlaceholderText","promoCodeApplyButtonText","appliedPromoCodeHeadingText","collapseTimeOut","removePromoText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","failedToRemovePromoCodeErrorText","duplicatePromoCodeErrorText","duplicatePromotionErrorText","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","_generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","originalPriceText","currentPriceText","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","linesAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateCustomPriceAlertMessageText","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","_this$props$data$feat2","_this$props$data$cata","modules","storeSelectorId","CartLineItems","productDeliveryOptions","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","warehouseAggregation","sizeString","colorString","productDimensionTypeColor","configString","productDimensionTypeConfiguration","styleString","productDimensionTypeStyle","amountString","productDimensionTypeAmount","quantityDisplayString","quantityDisplayText","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","discountStringText","shippingChargesText","shippingCharges","salesAgreementPricePrompt","priceEditorResources","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","showOutOfStockErrors","addToOrderTemplateMessage","addItemToOrderTemplateError","isAbsoluteUrl","urlCheck","returnURL","origin","includes","validateCartAsync","AsyncResult","_this$props$context","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","_featureStatuses$find","featureStatuses","IsB2b","_this$props$data$feat3","_this$props$data$cata2","_this$props$data$chan2","_this$props$data$cart5","productDimensionTypeSize","cartLinesPickUpOptions","CartView","cittaTelemetry","CittaTelemetry","cittaInstrumentationKey","createLogMessage","decodeURI","search","logMessage","trace","_getImageSettings","_removeItemFromCartHandler","_validateCart","_moveToWishlistSuccessHandler","_updateCartlineQuantity","newQuantity","additionalProperties","orderQuantityLimitsFeatureIsEnabled","updateCartLineQuantity","_fulfillmentStoreIdUpdated","_renderCartlines","renderModuleAttributes","Node","_renderOrderSummarylines","_renderErrorBlock","_renderGIftCardError","freightCalculationText","orLabel","_goToPreviousPage","emptyCartText","_renderBOPISBlock","_cartResult$cart","retry","arguments","cartResult","cartVersion","Version","_cartResult","validationResult","validateForCheckoutAsync","ValidationFailuresByCartLines","refreshCart","refreshError","validateError","history","back","shipToAddressDisplayText","pickUpAtStoreWithLocationText","errorData","_props$cartlines","hasGiftCard","arr","val","arrVal","_arrVal$data","ItemId","cartlinesLength","giftCardErrorMessage","orderSummaryLines","_props$data$cart$resu","OrderSubTotal","NetPrice","subTotalHeadingLabel","_renderSubTotal","totalDiscounts","shipping","hideTaxLine","tax","_props$data$cart$resu2","_props$data$cart$resu3","_props$data$cart$resu4","TotalAmount","_renderAmountDue","warehouseId","targetWarehouseValue","InventoryLocationId","HeaderView","_renderTopBarLeft","navIcon","logo","_renderReactFragment","_renderTopBarRight","Divider","countryPicker","siteOptions","_renderAccountBlock","wishListIconDesktop","_renderCartIcon","_renderTopBarCenter","cittaLogo","cartItem","totalItemsInCart","itemCount","parseInt","label","cartLabelNoItems","cartLabelWithOneItem","cartLabel","format","CartIconComponent","_renderCollapseMenu","MobileMenuLinksContainer","mobileMenuCollapsed","Collapse","_renderMobileAccountBlock","wishListIconMobile","menuBar","renderCustomerName","accountInformation","customer","FirstName","renderForMobile","AccountInfoDropdownParentContainer","signOutLink","signInLink","accountLinks","accountClassName","Drawer","openGlyph","closeGlyph","glyphPlacement","toggleButtonText","link","AccountInfoDropdownPopoverConentContainer","accountInfoDropdownButton","slot","componentDidMount","_stickyHeaderSetup","HeaderTag","HeaderContainer","HeaderTopBarContainer","Module","onscroll","_updateHeader","headerAlertsContainer","document","querySelector","bannerHeights","offsetHeight","headerElem","documentElement","scrollTop","classList","add","stickyHeader","headerLogo","headerLeftActionItem","headerRightActionItem","navStickyPos","CheckoutLoyaltyLabel","text","htmlFor","CheckoutDeliveryOptionsDescription","_renderDeliveryLocation","deliverylocation","_foundProductDelivery","foundProductDeliveryOption","shippingText","_renderStoreLocation","_assembleCartlines","foundProductDeliveryOptions","outOfStockThreshold","isServiceItem","RemoveCartItem","removeCartItemAttribute","displayMode","deliveryLocation","storeLocation","FlyoutCartLineItems","headerView","HeaderTopBarRightContainer","MobileMenuContainer","MobileMenuBodyContainer","preferredStore","_renderDesktopAccountBlock","cartIcon","MobileMenuHeader","categoryMenuBar","customNavBar","_getProduct","_props$context","_product$Behavior2","productMaxQuantity","lineMaxQuantity","eoqQuantity","MultipleOfQuantity","finalErrorMessage","eoqErrorMessage","LineIndex","_i$DataValidationFail","_i$DataValidationFail2","_i$DataValidationFail3","DataValidationFailure","ErrorResourceId","_renderUnder200sError","_props$data$cart$resu5","_props$data$cart$resu6","SubtotalAmount","console","log","isB2B","subtotal","_props$data$cart$resu7","_props$data$cart$resu8","_props$data$cart$resu9","_props$data$cart$resu10","DiscountAmount","TaxAmount","_renderTax","_props$data$cart$resu11","_props$data$cart$resu12","_props$data$cart$resu13","amountDueLabel","_props$data$cart$resu14","DiscountAmountWithoutTax","totalSavings","_renderTotalSavings","CheckoutLoyaltyText","_context$request$chan","isMultipleCatalogFeatureEnabledInHq","priceCurrency","catalogId","isPickUpItem","isCartLineItemPickUpType","OrderSummaryLine","cssLabel","_buildOrderSummarySection","_computedLoyaltyAmount","loyaltyAmount","getDeliveryMode","_channelDeliveryOptio","featureSate","pickupDeliveryMode","dM","SubtotalAmountWithoutTax","TaxOnNonShippingCharges","OtherChargeAmount","hasDeliveryMethod","hasShippingMethod","freightFee","getDeliveryConfiguration","deliveryModes","taxOnShippingCharge","TaxOnShippingCharge","shippingChargeAmount","ShippingChargeAmount","otherCharge","otherChargeAmount","taxOnNonShippingCharges","isTaxGreaterThanZero","otherChargeAmountTotal","subtotalAmountActual","giftCardAmount","_computeGiftCardAmount","giftCardTotalValue","giftCardExtends","reduce","giftCardCounter","giftCard","Balance","amount","Math","min","customerAccountAmount","totalAmountAfterGiftCard","loyalty","loyaltyLabel","giftcardLabel","customerAccount","customerAccountLabel","CheckoutDeliveryOptionsRadioButton","MediaGallery","_this","_props$config$zoomedI","_inlineZoomDivRef","fullScreenOverlayButtonRef","player","mediaGalleryImages","defaultGalleryImageSettings","md","cropFocalRegion","defaultThumbnailImageSettings","onExiting","animating","onExited","next","removeInlineZoomStyle","isLastItem","nextIndex","activeIndex","goToIndex","updateZoomedInImage","previous","images","mediaGalleryItems","isFirstItem","autoplay","currentIndex","mediaItems","_mediaItems","_this$player$current","mediaTypeValue","MediaType","Video","current","play","_this$player$current2","pause","_renderCarouselItemVideo","mediaData","videoData","_videoData$_links","options","playerResources","videoMetaData","videoId","duration","playTime","thumbnail","posterframeUrl","src","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","editProps","Player","ref","playerData","isEditor","params","_renderEmptyImage","_getCarouselItem","image","isInPopup","Image","fallBackSrc","fallbackImage","loadFailureBehavior","shouldSkipToMainImage","bypassHideOnFailure","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","altText","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","imageFallbackOptimize","shouldUseOptimizedImage","getVideoThumbNailItem","classes","_refHandler","divRef","which","KeyCodes","Enter","Space","preventDefault","_renderVideoThumbnail","fullScreenTitleText","openModalDialog","_toggleModal","imageModalSlider","ZoomView","_mapProductToImageData","carouselprops","Carousel","_renderCarouselItemImageView","_zoomedImageSettings","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","keyboard","handleOnExited","handleOnExiting","isDisabledFunctionality","isMobileImageZoomed","carousel","imageModalSliderProps","modalIsOpen","ontoggle","galleryCarousel","classNames","ImagefullView","shouldUseCmsAltText","altTextSource","isImageZoomed","isInitialLoad","skipImageValidation","zoomedImageSettings","galleryImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","isMobile","variant","VariantType","Viewport","_this$props$config$im","source","imageSource","shouldUpdateOnPartialDimensionSelection","_setRenderType","OmniChannelMedia","mediaLocationsForSelectedVariant","_this$props$config$th","validateProductImages","thumbnailImageSettings","_setImages","_this$props$config$th2","getValidProductImages","channelId","productVariant","_product$productVaria","_this$props$context$a","_this$props$config$th3","getProductImages","fireImmediately","mediaLocations","_this$props$config$th4","_this$props$config$im2","_this$props$context$a2","isVertical","thumbnailsOrientation","isFullscreenAllowed","allowFullScreen","zoomViewMode","imageZoom","emptyPlaceHolderImage","placeholderImageName","getFallbackImageUrl","_this$props$config$im3","mediaLocation","_mediaLocation$Uri","Uri","getAltText","AltText","curatedImages","_filterMasterImageFromVariant","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","CarouselProps","indicatorAriaText","ariaLabelForSlide","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","vertical","flipperPrevLabel","flipperNextLabel","parentId","useTabList","stringify","_this$state$mediaGall","lastUpdate","defaultKey","_getEmptyThumbnailItem","_this$state$mediaGall2","zoomView","curatedImage","mediaToSet","all","getVideoMetadataFromApi","Date","now","media","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","_this$props$config$sh","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","MasterProductId","itemId","_item$additionalPrope","isApplicableForChildEntities","_this$props$config$da","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","_this$props$config$da2","inlineZoomImageOnHover","String","_handleMobileViewZoomedImageClick","target","style","transform","parentElement","overflow","_this$props$config$da3","bounds","getBoundingClientRect","positionX","clientX","left","positionY","clientY","top","scaledPositionX","scaledPositionY","scrollTo","_this$props$config$da4","innerWidth","inlineZoomInitClick","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","_this$props$config$da5","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","_product$PrimaryImage","_this$fullScreenOverl","focus","parentDiv","children","removeAttribute","removeContainerZoomStyle","getCacheKey","buildCacheKey","getCacheObjectType","dataCacheType","Error","getCartState","ProductsDataActions","createObservableDataAction","inputData","getPickUpOptionsForCartLineItemsDataAction","_isChannelLimitsFeatureEnabled","isMultipleCatalogsFeatureEnabled","currentCatalogId","getCatalogId","validateCatalogId","_featureState$result2","_featureStatuses$find2","isChannelLimitsFeatureEnabledInHq","_this$props$data$feat4","_featureState$result3","validateMediaLocationAsync","imageData","IsApplicableForChildEntities","http","XMLHttpRequest","open","addEventListener","send","selectedProduct","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","pairs","pair","productName","_actionContext$reques","isPreview","commerceApiRequest","previewImageData","displayOrder","DisplayOrder","MediaTypeValue","_mediaLocation$Uri2","commerceVideoMetadataRequest","validateMediaLocaionAsync","_imageSettings$viewpo","imageSettingsVal","imageConcatVal","onload","onerror","e","pageContext","allowFullscreen","inline","container","inlineZoomInit","CartIcon","_getCartLineQuantities","_createHiddenCartLines","_cart$CartLines","_cart$CartLines2","Price","display","countChanged","cartLink","cartItemCount","_resetClass","hiddenCartLines","_timeout","ms","res","setTimeout","msdyn365Commerce","createComponent","component","CheckoutDeliveryOptionsErrorMessage","getMiniCartData","miniCartData","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","getSortedCartLines","sortOrder","lines","sort","item1","item2","_item2$LineNumber","_item1$LineNumber","LineNumber","_item1$LineNumber2","_item2$LineNumber2","CheckOut","ViewShoppingBag","viewShoppingBagAttributes","_this$props$data$orgU","_setQuantityLimitsFeatureFlag","componentDidUpdate","prevProps","_this$state$miniCartD","_this$state$miniCartD2","enableHoverCart","isAnonymousCheckout","cartUrl","_getCheckoutURL","shouldShowMiniCart","isProductAddedToCart","addToCartBehavior","AddToCartBehavior","showMiniCart","includeFlyout","goToCartButtonText","goToCartButtonTitle","flyoutTitle","flyoutTooltip","UncontrolledTooltip","placement","hideArrow","trigger","shouldShowCloseButton","cartPageUrl","hideAriaHidden","priceString","totalPriceFormatString","cultureFormatter","formatCurrency","cartQtyLabel","FlyoutContainer","miniCartWrapper","miniCartItemWrapper","goToCartButton","totalPrice","_cart$result$cart$Ver","_cart$result","lastValidatedCartVersion","cartLinesSortOrder","cartEmptyText","_cartLine$cartlineId","renderCartLinesGroupHeader","pickUpText","emailShippingText","titleSeparate","_cartLine$pickUpInSto4","groupTitle","renderCartLinesGroupTitle","_cartLine$pickUpInSto","_cartLine$pickUpInSto2","_cartLine$pickUpInSto3","_props$cart","_props$cart2","_props$context$action","emailshippingText","renderCartLinesGroup","_renderInvoiceSummarylines","invoiceSummaryLines","invoices","imageAltText","_context$app","AddCheckoutLoyalty","heading","cardNumber","drawer","rewardPoints","loyaltyAmountContainer","appliedLoyaltyAmountContainer","loyaltyAmountLabel","loyaltyAmountInput","loyaltyAmountApplyButton","showAppliedAmount","loyaltyAmountAppliedText","loyaltyAmountAppliedPrice","loyaltyAmountRemoveButton","rewardPoint","checkoutLoyaltyRewardPoint","availablePointsText","activePoints","expiringPointsText","expiringPoints","ShowCheckoutLoyalty","_ref2","coveredAmountText","CheckoutLoyaltyView","checkoutLoyalty","showLoyalty","addLoyalty","isShowLoyalty","isShowAddLoyalty","CartIconView","CheckoutErrors","setCheckoutErrors","errorCode","apiError","clientCheckoutError","consoleCheckoutErrors","getCheckoutState","checkoutErrorsList","Console","consoleCheckoutError","errorMessageResource","getCheckoutErrorMessage","CheckoutPaymentInstrument","updateCheckoutError","newCheckoutError","updateShouldFocusOnCheckoutError","newShouldFocusOnCheckoutError","genericError","scrollIntoView","updateCheckoutErrorFocus","newCheckoutErrorFocus","setCheckoutErrorFocus","checkoutModuleId","checkoutModule","errorMessageFromAPI","errorResource","resource","ActionError","ErrorCode","ErrorMessageResource","checkoutTimeoutErrorMessage","Microsoft_Dynamics_Commerce_Runtime_BlockedLoyaltyCard","blockedLoyaltyCardErrorMessage","CheckoutLoyalty","Microsoft_Dynamics_Commerce_Runtime_CustomerAccountLimitSignDifferentFromAmountDue","customerAccountLimitSignDifferentFromAmountDueErrorMessage","CheckoutCustomerAccountPayment","Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsAvailableCreditLimit","customerAccountPaymentExceedsAvailableCreditLimitErrorMessage","Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsCustomerAccountFloorLimit","customerAccountPaymentExceedsCustomerAccountFloorLimitErrorMessage","Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItems","customerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItemsErrorMessage","Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentForCustomerWithoutAllowOnAccount","customerAccountPaymentForCustomerWithoutAllowOnAccountErrorMessage","Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentNotAllowedForOpenInvoices","customerAccountPaymentNotAllowedForOpenInvoicesErrorMessage","Microsoft_Dynamics_Commerce_Runtime_FraudRisk","fraudRiskErrorMessage","Microsoft_Dynamics_Commerce_Runtime_GiftCardBalanceInquiryFailed","giftCardBalanceInquiryFailedErrorMessage","CheckoutGiftCard","Microsoft_Dynamics_Commerce_Runtime_GiftCardCurrencyMismatch","giftCardCurrencyMismatchErrorMessage","Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion","invalidCartVersionErrorMessage","Microsoft_Dynamics_Commerce_Runtime_InvalidLoyaltyCardNumber","invalidLoyaltyCardNumberErrorMessage","Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest","invalidPaymentRequestErrorMessage","Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest_Console","invalidPaymentRequestConsoleErrorMessage","Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines","missingRequiredCartTenderLinesErrorMessage","Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountPaymentsNotAllowed","multipleCustomerAccountPaymentsNotAllowedErrorMessage","Microsoft_Dynamics_Commerce_Runtime_NoMoreThanOneLoyaltyTender","noMoreThanOneLoyaltyTenderErrorMessage","Microsoft_Dynamics_Commerce_Runtime_NoResponseFromGatewayForGiftCardBalanceInquiry","noResponseFromGatewayForGiftCardBalanceInquiryErrorMessage","Microsoft_Dynamics_Commerce_Runtime_NoTenderLoyaltyCard","noTenderLoyaltyCardErrorMessage","Microsoft_Dynamics_Commerce_Runtime_NotEnoughRewardPoints","notEnoughRewardPointsErrorMessage","Microsoft_Dynamics_Commerce_Runtime_PaymentAlreadyVoided","paymentAlreadyVoidedErrorMessage","Microsoft_Dynamics_Commerce_Runtime_PaymentAmountExceedsGiftBalance","paymentAmountExceedsGiftBalanceErrorMessage","Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties","paymentRequiresMerchantPropertiesErrorMessage","Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties_Console","paymentRequiresMerchantPropertiesConsoleErrorMessage","Microsoft_Dynamics_Commerce_Runtime_PaymentUsingUnauthorizedAccount","paymentUsingUnauthorizedAccountErrorMessage","Microsoft_Dynamics_Commerce_Runtime_RefundAmountMoreThanAllowed","refundAmountMoreThanAllowedErrorMessage","Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePayment","unableToAuthorizePaymentErrorMessage","Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardAdditionalContextRequired","unableToAuthorizePaymentCardAdditionalContextRequiredErrorMessage","Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardTypeMissingOrNotSupported","unableToAuthorizePaymentCardTypeMissingOrNotSupportedErrorMessage","Microsoft_Dynamics_Commerce_Runtime_UnableToCancelPayment","unableToCancelPaymentErrorMessage","Microsoft_Dynamics_Commerce_Runtime_UnableToReadCardTokenInfo","unableToReadCardTokenInfoErrorMessage","Microsoft_Dynamics_Commerce_Runtime_UnableToRetrieveCardPaymentAcceptResult","unableToRetrieveCardPaymentAcceptResultErrorMessage","_renderThumbnails","thumbnails","_renderThumbnailItem","MediaGalleryView","AdressInput","max","step","ariaValueMax","ariaValueMin","ariaValueNow","onBlur","Logo","_renderLogo","destinationUrl","_renderImage","defaultImageSettings","Msdyn365","NavIcon","toggleNavBar","mobileHamburgerAriaLabel","isExpanded","targetId","HeaderPreferredStore","Header","handleLinkTextChange","linkIndex","myAccountLinks","linkText","popOverRef","_toggleNavbar","_togglePopover","_keydown","signinPopoverOpen","_this$props$data$acco","_this$props$data$acco2","Email","removeEventListener","_logoSlot$","headerClassName","cartIconSlot","_getSlot","menuBarSlot","searchSlot","siteOptionsSlot","preferredStoreSlot","categoryMenuBarSlot","customNavBarSlot","countryPickerSlot","logoSlot","logoImage","logoLink","imageLink","WishListIconComponent","wishlistTooltipText","wrapClassName","displayName","_getSigninButton","_getSignOutButton","_getAccountInfoDropdownButton","_getAccountLinks","slotName","SignIn","signInLinkText","signInLinkAriaText","onTelemetryClick","SignOut","signOutLinkText","signOutUrl","signOutLinkAriaText","MyProfile","innerRef","accountEmailAddress","cta","editableLink","linkUrl","openInNewTab","onTextChange","_setHeader","keyCode","Escape","lockHeader","body","contains","isInMobileMenu","moduleClassName","_defaultLoyaltyPoints","isRequired","isEnabled","onSkip","loyaltyCard","CardNumber","LoyaltyCardId","updateLoyaltyCardId","loyaltyCardNumber","handleCancelOrSubmit","shouldPayLoyalty","_setErrorMessage","_clearError","_dialogToggleRef","_applyLoyaltyPoints","_removeLoyaltyPoints","_onInputChange","_onBlur","dollarsApplied","maxDollars","isFetchingLoyaltyCard","loyaltyTransactionEstimation","MaxCurrencyValueOfLoyaltyPoints","_updateEstimate","_updateLoyalty","isOBORequest","EnabledPaymentsForOBO","Loyalty","Heading","headingTag","loyaltyHeadingText","TextComponent","loyaltyCoveredAmountText","_drawerHeader","RewardPoints","points","_renderPointSection","availablePointsLabel","expiringLoyaltyPointsLabel","LabelComponent","payWithLoyaltyAmountLabel","InputComponent","applyCheckoutLoyaltyPaymentText","isNaN","removeCheckoutLoyaltyPaymentText","point","RewardPointId","ActivePoints","PointsExpiringSoon","updateLoyaltyAmount","newAmount","parseFloat","num","toFixed","getElementById","isDisabled","card","loyalPointsRequest","createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput","_query","bypassCache","callActionOrExecute","_points$MaxCurrencyVa","update","GetLoyaltyTransactionEstimationInput","newMaxPoints","DeliveryOptionList","DeliveryOptionSelected","CheckoutDeliveryOptionsView","CheckoutDeliveryOptionsErrorTitle","InvoiceSummaryLine","_buildPaymentSummarySection","invoiceLines","invoiceLine","InvoiceAmount","InvoiceId","propsContext","shouldRetry","_validationResult$Val","CartsDataActions","ValidationResultsByLineId","cartLineToUpdate","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","updateLineResult"],"mappings":";m9BAkGA,IAAMA,EAAN,cAAsCC,YAsClCC,YAAmBC,GACfC,MAAMD,GAtCU,KAAAE,eAAyB,GAEzB,KAAAC,gBAAoC,GAEpC,KAAAC,WAAqB,EAuBjC,KAAAC,mCAA8C,EAQrC,KAAAC,iBAAiDR,cA4IjD,KAAAS,KAAOC,UACpBC,KAAKT,MAAMU,YAAYH,KAAK,CACxBI,OAAQF,KAAKG,kCAA+BC,EAAYJ,KAAKE,OAC7DG,SAAUL,KAAKG,kCAA+BC,EAAYJ,KAAKK,SAC/DC,SAAUN,KAAKG,kCAA+BC,EAAYJ,KAAKM,SAC/DC,OACgD,qCAA1CP,KAAKT,MAAMiB,OAAOC,0BACpBT,KAAKU,UACC,WACA,aAGdV,KAAKW,iBAAmBX,KAAKY,+BACvBZ,KAAKa,uBAGE,KAAAH,QAAU,KAAc,IAAAI,EAErC,QADkD,QAAlCA,EAAGd,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAH,OAAA,EAA/BA,EAAiCI,aAAaC,iBAC3CnB,KAAKoB,0BAA0BC,OAAS,GAGjD,KAAAC,qBAAwBC,MACjCA,IACIvB,KAAKN,gBAAgB8B,KAAKC,GAAkBA,EAAeC,OAASH,IAO/D,KAAAI,0BAA4B,KACzC,MAAMC,EAAe5B,KAAKN,gBAAgB8B,KAAKC,GAAkBA,EAAeC,OAAS1B,KAAKP,gBAC9F,IAAKmC,EAED,OADA5B,KAAKT,MAAMsC,QAAQC,UAAUC,MAAM,kEAC5B,KAGX,MAAM,GAAEC,EAAE,SAAEC,EAAQ,QAAEJ,GAAY7B,KAAKT,OACjC,UAAE2C,GAAclC,KAAKT,MAAM4C,UAC3BC,EAAQC,IAAIT,EAAc,uBAAwB,GAClDU,EAAgBtC,KAAKT,MAAMsC,QAAQU,QAAQC,QACjD,MAAO,CACHC,eAAgB,CAAEC,UAAW,iDAC7BC,YAAatD,gBAACuD,IAAoBC,OAAAC,OAAA,GAAK,CAAEH,YAAaf,EAAamB,eACnEX,MACI/C,gBAAC2D,iBAAc,CACXhB,GAAIA,EACJC,SAAUA,EACVJ,QAASA,EACTa,UAAU,sCACV3B,KAAM,CAAEqB,MAAO,CAAEa,wBAAyBb,IAC1Cc,cAAehB,EACfiB,aAAcb,aAAa,EAAbA,EAAec,aAM5B,KAAAC,gBAAkB,KAC/B,MAAM,kBAAEC,GAAsBtD,KAAKT,MAAM4C,UACzC,MAAO,CAEHoB,6BAA8B,CAAEC,IAAK,OAAQd,UAAW,yBAA0Be,KAAM,QAAS,YAAa,aAC9GC,MAAOrE,gBAACsE,IAAmBd,OAAAC,OAAA,GAAK,CAAEY,MAAOJ,KACzCM,QAASvE,gBAACwE,IAAqBhB,OAAAC,OAAA,GAAK,CAAEc,QAAS5D,KAAK8D,kBAI3C,KAAAC,sBAAwB,KACrC,MAAMC,EAAQhE,KAAKN,gBAAgB2B,QAC7B,UAAEa,GAAclC,KAAKT,MAAM4C,WAC3B,GAAEH,EAAE,SAAEC,EAAQ,QAAEJ,GAAY7B,KAAKT,MACjC+C,EAAgBtC,KAAKT,MAAMsC,QAAQU,QAAQC,QAEjD,OAAOxC,KAAKN,gBAAgBuE,IAAI,CAACxC,EAAgCyC,KACtD,CACHzB,eAAgB,CAAEC,UAAW,uCAAwCe,KAAM,YAC3EU,KAAM1C,EAAeC,MAAQ,GAC7B0C,YACI/E,gBAACgF,IAAoBxB,OAAAC,OAAA,GACb,CACAwB,UAAW7C,EAAeC,OAAS1B,KAAKP,eACxC8E,MAAO9C,EAAeC,KACtB8C,YAAaR,EACbS,aAAcP,EAAQ,EACtBQ,UAAW,GAAGjD,EAAesB,YAC7B4B,SAAU3E,KAAK4E,uBACfC,iBAAkB7E,KAAK6E,oBAInClC,YACItD,gBAACuD,IAAoBC,OAAAC,OAAA,GACb,CACAH,YAAalB,EAAesB,eAIxCX,MACI/C,gBAAC2D,iBAAc,CACXhB,GAAIA,EACJC,SAAUA,EACVJ,QAASA,EACTa,UAAU,sCACV3B,KAAM,CAAEqB,MAAO,CAAEa,wBAAyBZ,IAAIZ,EAAgB,uBAAwB,KACtFyB,cAAehB,EACfiB,aAAcb,aAAa,EAAbA,EAAec,eAOhC,KAAA0B,cAAgB,KAC7B,MAAM,aAAEC,EAAe,QAAW/E,KAAKT,MAAM4C,UAC7C,OACI9C,gBAAC2F,SAAM,CACHtC,UAAU,yCACVgB,MAAOqB,EACPE,MAAM,UACNC,UAAWlF,KAAKP,eAChB0F,QAASnF,KAAKoF,QAEbL,IAKI,KAAAM,cAAgB,KAC7B,MAAM,aAAEC,EAAe,UAAatF,KAAKT,MAAM4C,UAC/C,OACI9C,gBAAC2F,SAAM,CAACtC,UAAU,yCAAyCgB,MAAO4B,EAAcL,MAAM,UAAUE,QAASnF,KAAKE,QACzGoF,IAKI,KAAAC,gBAAkB,KAC/B,MAAM,eAAEC,EAAiB,UAAaxF,KAAKT,MAAM4C,UACjD,OACI9C,gBAAC2F,SAAM,CAACtC,UAAU,2CAA2CgB,MAAO8B,EAAgBP,MAAM,YAAYE,QAASnF,KAAKK,UAC/GmF,IAKI,KAAAC,SAAY3B,IACzB9D,KAAKT,MAAMuC,UAAUC,MAAM+B,GAC3B9D,KAAKT,MAAMU,YAAYyF,aAAY,GACnC1F,KAAKT,MAAMU,YAAY0F,aACvB3F,KAAK8D,aAAeA,GAGP,KAAA8B,WAAa,KAC1B5F,KAAKT,MAAMU,YAAYyF,aAAY,GACnC1F,KAAK8D,kBAAe1D,GAGP,KAAAgF,OAASrF,gBAChBC,KAAKM,YAGE,KAAAJ,OAASH,UAA0B,IAAA8F,EAChD7F,KAAKT,MAAMuC,UAAUgE,YAAY,sCAEjC9F,KAAK4F,aACL5F,KAAK2F,mBACgC,QAArCE,EAAM7F,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAA4E,OAAA,EAA/BA,EAAiCE,mCAAmC,CAAEC,iCAAiC,MAGhG,KAAA1F,SAAWP,UAA0B,IAAAkG,EAClDjG,KAAKT,MAAMuC,UAAUgE,YAAY,8CAE3B9F,KAAKkG,gCAAgClG,KAAKP,sBACX,QAArCwG,EAAMjG,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAgF,OAAA,EAA/BA,EAAiCF,mCAAmC,CAAEC,iCAAiC,MAGhG,KAAA3F,SAAWN,UACxBC,KAAKT,MAAMuC,UAAUgE,YAAY,wCAGjC,MAAMK,EAAsBnG,KAAKY,yBACP,IAADwF,EAArBD,GACAnG,KAAKP,eAAiB0G,EACtBnG,KAAKqG,gBAEgC,QAArCD,EAAMpG,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAmF,OAAA,EAA/BA,EAAiCL,mCAAmC,CAAEC,iCAAiC,MAE7GhG,KAAK2F,cAII,KAAA/E,uBAAyB,KACtC,MAAM0F,EAAuBtG,KAAKoB,0BAClC,OAAOkF,EAAqB,IAAMA,EAAqB,GAAGC,cAG7C,KAAAL,gCAAkCnG,UAC/C,GAA8B,KAA1ByG,EAAeC,OACf,OAGJ,MAAM,UAAEtE,GAAcnC,KAAKT,MACrBmH,EAAgB1G,KAAKT,MAAMwB,KAAKC,SAASC,OACzC0F,EAAuC,CACzCH,iBACAI,gBAAiBF,EAAcE,gBAC/BC,4BAA6B7G,KAAKJ,kCAAoCI,KAAK6G,iCAA8BzG,GAG7GJ,KAAK4F,aACL5F,KAAK8G,kBAECJ,EAAcxF,aACfgF,gCAAgCS,GAChCI,KAAKC,IACF,GAAwB,WAApBA,EAASzG,OAAqB,CAAC,IAAD0G,EAC9B,MAAMnD,EAAe,IAAwB,QAAxBmD,EAAGD,EAASE,oBAAY,IAAAD,OAAA,EAArBA,EAAuBE,kBAC/CnH,KAAKyF,SAAS2B,mBAAiBC,cAAcvD,GAAgB3B,EAAUmF,oBAAsBxD,GAGjG9D,KAAKqG,UACLrG,KAAKT,MAAMU,YAAYsH,kBAAiB,KAE3CC,MAAM,KACHxH,KAAKyF,SAAStD,EAAUmF,wBAInB,KAAAlG,wBAA0B,KACvC,MAAM,QAAEmB,GAAYvC,KAAKT,MAAMsC,QACzB4F,EAAyBlF,GAAWA,EAAQC,SAAWD,EAAQC,QAAQkF,uBACvEC,EAAwBpF,GAAWA,EAAQC,SAAWD,EAAQC,QAAQoF,sBAE5E,OAAO5H,KAAKJ,mCACJI,KAAKT,MAAMwB,KAAKC,SAASC,QAAUjB,KAAKT,MAAMwB,KAAKC,SAASC,OAAOC,aAAa2G,KAAKC,WAAc,IAAIC,OAAOC,IAAQ,IAAAC,EAAA,OACpHD,EAASzB,cAA0C,KAA1ByB,EAASzB,aAC5ByB,EAASzB,gBAC2B,QADf0B,EACjBjI,KAAK6G,mCAA2B,IAAAoB,GAAyB,QAAzBA,EAAhCA,EAAkCC,+BAAuB,IAAAD,OAAA,EAAzDA,EAA2DzG,KACvDD,GAAgBA,IAAiByG,EAASzB,gBACzCyB,EAASzB,eAAiBoB,EACnCK,KAERhI,KAAKT,MAAMwB,KAAKC,SAASC,QAAUjB,KAAKT,MAAMwB,KAAKC,SAASC,OAAOC,aAAa2G,KAAKC,WAAc,IAAIC,OAAOC,GAC5GA,EAASzB,cAA0C,KAA1ByB,EAASzB,aAC5ByB,EAASzB,eAAiBkB,GAA0BO,EAASzB,eAAiBoB,EAC9EK,IAIH,KAAAG,mBAAqBpI,UAAkD,IAAAqI,EACpF,IAAKpI,KAAKT,MAAMwB,KAAKC,SAASC,OAC1B,OAGJ,MAAM,QAAEY,EAAO,UAAEM,EAAS,OAAE3B,GAAWR,KAAKT,MACtC8I,EAA2C,QAAlCD,EAAGpI,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAmH,OAAA,EAA/BA,EAAiClH,aAC7CoH,EAAUD,EAAUR,KAAcU,GAExC,GAAI1G,EAAS,CACT7B,KAAKL,WAAY,EACjBK,KAAKN,gBAAkB,GACvBM,KAAKP,eAAiB,GACtBO,KAAK4F,aAEL,IACI,IAAI4C,EAA+B,GACnC,MAAMC,EAAoBzI,KAAKoB,0BACzBsH,EAA2BD,GAAqBA,EAAkBpH,OAAS,GAAKoH,EAAkB,GAAGlC,aAC3G,GAAImC,EAA0B,CAE1BF,EAAuBC,EAAkB,GAAGlC,cAAgB,GAG5D,MAAMsB,EAAOQ,EAAUR,WACjBQ,EAAUM,kCAAkC,CAC9Cd,OACAe,mCAAoC5I,KAAK6G,8BAKjD,IAAIgC,EACJ,OAAQrI,EAAOsI,0BACX,IAAI,OACAD,EAAuBE,2BAAyBC,KAChD,MACJ,IAAI,kCACAH,EAAuBE,2BAAyBE,gCAChD,MACJ,QACIJ,EAAuBE,2BAAyBE,gCAExD,MAAMjC,QAAiBkC,kCACnB,CACIC,cAAetH,EAAQuH,cACvBC,oBAAqBC,2BAAyBC,qCAAqC1H,EAAQuH,gBAE/Fd,EACA1B,EACA,GACAiC,GACA,GAGAH,SACM1I,KAAKkG,gCAAgCsC,GAG3CxB,GAAYA,EAAS3F,OAAS,IAC9BrB,KAAKN,gBAAkBsH,GAE7B,MAAAwC,GACExJ,KAAKyF,SAAStD,EAAUmF,qBAG5B,GAAoC,IAAhCtH,KAAKN,gBAAgB2B,OACrBrB,KAAKyF,SAAStD,EAAUsH,8BACrB,GAAIzJ,KAAKW,kBAAoBX,KAAKsB,qBAAqBtB,KAAKW,kBAAmB,CAAC,IAAD+I,EAAAC,EAClF3J,KAAKP,eAAiBO,KAAKW,iBAC3BX,KAAKW,sBAAmBP,EACxBJ,KAAKqG,UAG0B,QAA/BqD,EAAA1J,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAyI,GAA/BA,EAAiCE,0BAA0B,CAAEC,wBAAwB,IAEjD,QAAhCF,EAAC3J,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAA0I,GAA/BA,EAAiCG,wCAC5B9J,KAAKT,MAAMwB,KAAKC,SAASC,OAAO8E,mCAAmC,CAAEC,iCAAiC,QAE7G,CAAC,IAAD+D,EACH/J,KAAK2F,aACL3F,KAAKP,eAAiBO,KAAKN,gBAAgB2B,OAAS,GAAIrB,KAAKN,gBAAgB,GAAGgC,MAAa,GAG9D,QAA/BqI,EAAA/J,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAA8I,GAA/BA,EAAiCH,0BAA0B,CAAEC,yBAA0B7J,KAAKG,+BAGhGH,KAAKL,WAAY,IAIR,KAAAqK,yBAA2BjK,UACxC,IAAKC,KAAKT,MAAMwB,KAAKC,SAASC,OAC1B,OAGJ,MAAM,QAAEY,GAAY7B,KAAKT,MACnB8I,EAAYrI,KAAKT,MAAMwB,KAAKC,SAASC,OAAOC,aAElD,GAAIW,EAAS,CACT7B,KAAKL,WAAY,EACjBK,KAAKN,gBAAkB,GACvBM,KAAKP,eAAiB,GACtBO,KAAK4F,aAEL,IAAI4C,EAA+B,GACnC,MAAMC,EAAoBzI,KAAKoB,0BACzBsH,EAA2BD,GAAqBA,EAAkBpH,OAAS,GAAKoH,EAAkB,GAAGlC,aAC3G,GAAImC,EAA0B,CAE1BF,EAAuBC,EAAkB,GAAGlC,cAAgB,GAG5D,MAAMsB,EAAOQ,EAAUR,WACjBQ,EAAUM,kCAAkC,CAC9Cd,OACAe,mCAAoC5I,KAAK6G,8BAEzC6B,SACM1I,KAAKkG,gCAAgCsC,GAIvB,IAADyB,EAA3B,GAAIjK,KAAKW,iBACLX,KAAKP,eAAiBO,KAAKW,iBAC3BX,KAAKW,sBAAmBP,EACxBJ,KAAKqG,UAG0B,QAA/B4D,EAAAjK,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAgJ,GAA/BA,EAAiCL,0BAA0B,CAAEC,wBAAwB,IAEhF7J,KAAKT,MAAMwB,KAAKC,SAASC,OAAO6I,wCAC3B9J,KAAKT,MAAMwB,KAAKC,SAASC,OAAO8E,mCAAmC,CAAEC,iCAAiC,IAIpHhG,KAAKL,WAAY,IAIR,KAAAkB,oBAAsBd,UAA0B,IAAAmK,EAC7D,MAAMtD,EAAiD,QAAlCsD,EAAGlK,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAiJ,OAAA,EAA/BA,EAAiCtD,gBAEjB,IAADuD,EAAAC,EAAAC,EAAAC,EAAnCtK,KAAKU,WAAakG,KAEkB,QAAhCuD,EAACnK,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAkJ,IAA/BA,EAAiCL,kCAClC9J,KAAKG,8BAC0B,QADEiK,EACjCpK,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAmJ,GAA/BA,EAAiCG,iCAE3BvK,KAAKmI,mBAAmBvB,GAGC,QAAnCyD,EAAIrK,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAoJ,GAA/BA,EAAiCP,wCAC3B9J,KAAKgK,4BAIXhK,KAAKG,8BAC0B,QADEmK,EACjCtK,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAqJ,GAA/BA,EAAiCC,0BACjCvK,KAAKwK,oCAELxK,KAAKM,aAKA,KAAAsE,uBAA0B6F,IACvC,MAAMjE,EAAiBiE,EAAMC,cAAcnG,MAC3CvE,KAAKP,eAAiB+G,GAGT,KAAAH,QAAU,KACyB,qCAA1CrG,KAAKT,MAAMiB,OAAOC,0BACpBT,KAAKT,MAAMU,YAAYoG,WAId,KAAAV,WAAa,KACsB,qCAA1C3F,KAAKT,MAAMiB,OAAOC,0BACpBT,KAAKT,MAAMU,YAAY0F,cAId,KAAAmB,UAAY,KACpB9G,KAAKG,8BACNH,KAAKT,MAAMU,YAAY6G,aA3jB3B9G,KAAK6E,iBAAmB8F,6BACpB3K,KAAKT,MAAMsC,QAAQU,QAAQqI,kBAC3B5K,KAAKT,MAAMsL,aACX7K,KAAKT,MAAMuC,WAEf9B,KAAKG,6BACDH,KAAKT,MAAMiB,OAAOC,0BAAsE,SAA1CT,KAAKT,MAAMiB,OAAOC,yBArC9D,kBACN,MAAgF,aAAxET,KAAKT,MAAMwB,KAAKC,SAASC,QAAUjB,KAAKT,MAAMwB,KAAKC,SAAST,QAGxE,wCAA4C,IAAAuK,EAAAC,EAExC,MAAMC,EAEe,QAFLF,EACQ,QADRC,EACZ/K,KAAKT,MAAMwB,KAAK8G,YAAI,IAAAkD,GAAQ,QAARA,EAApBA,EAAsB9J,cAAM,IAAA8J,GAAM,QAANA,EAA5BA,EAA8BlD,YAAI,IAAAkD,GAAqB,QAArBA,EAAlCA,EAAoCE,2BAAmB,IAAAF,GAA4D,QAA5DA,EAAvDA,EAAyDvJ,KAAK0J,GAA6B,0BAAjBA,EAASC,YAAgC,IAAAJ,GAAO,QAAPA,EAAnHA,EAAqHK,aAAK,IAAAL,OAAA,EAA1HA,EACMM,mBAAW,IAAAP,IAAI,GAEzB,OAAOE,EAAaM,KAAKC,MAAMP,GAAc,KAGjD,wCAA4C,IAAAQ,EAAAC,EACxC,OAAiF,QAAjFD,EAA6C,QAA7CC,EAAOzL,KAAK0L,yCAAiC,IAAAD,OAAA,EAAtCA,EAAwCE,0CAAkC,IAAAH,KA0B9E,0BAAuB,IAAAI,EAC1BC,YACI,IAAM7L,KAAK8L,YACX/L,gBACUC,KAAKF,SAInBiM,YACI,SAAAC,EAAA,OAAqC,QAArCA,EAAMhM,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAA+K,OAAA,EAA/BA,EAAiCpF,iBACvC7G,UAAW,IAAAkM,QACDjM,KAAKa,sBACXb,KAAKT,MAAMU,YAAYsH,kBAAiB,SAEH,QAArC0E,EAAMjM,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAgL,OAAA,EAA/BA,EAAiClG,mCAAmC,CAAEC,iCAAiC,OAIrH+F,YACI,SAAAG,EAAA,OAAqC,QAArCA,EAAMlM,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAiL,OAAA,EAA/BA,EAAiC3B,0BACvCxK,UACgG,IAADoM,EAAvF5B,GAA4BvK,KAAKU,YAAcV,KAAKwK,0CAC9CxK,KAAKa,sBACXb,KAAKT,MAAMU,YAAYsH,kBAAiB,SAEH,QAArC4E,EAAMnM,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAkL,OAAA,EAA/BA,EAAiCpG,mCAAmC,CAAEC,iCAAiC,QAKtF,QAAnC4F,EAAI5L,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAA2K,GAA/BA,EAAiCQ,4CACjCL,YACI,SAAAM,EAAA,OAAqC,QAArCA,EAAMrM,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAoL,OAAA,EAA/BA,EAAiCC,eACvCA,IAEQA,GACAA,EAAcC,gBAAkBC,gBAAcpN,yBAC9CkN,EAAcxI,cAEd9D,KAAKyF,SAAS6G,EAAcxI,gBAKxCiI,YACI,SAAAU,EAAA,OAAqC,QAArCA,EAAMzM,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAwL,OAAA,EAA/BA,EAAiCC,oBACvCA,IACQA,IAAuBC,iBAAevN,yBACtCwN,YAAqB5M,KAAKH,iBAAkBG,KAAKT,MAAMsC,QAAQuH,kBAO5EyD,sBAAsBC,EAAgDC,GACzE,OAAI/M,KAAKgN,QAAUD,GAAa/M,KAAKT,MAAMwB,OAAS+L,EAAU/L,KAM3DkM,SAAM,IAAAC,EAAAC,EAOT,GALAnN,KAAK6G,4BAAyE,QAA9CqG,EAAGlN,KAAKT,MAAMwB,KAAK8F,mCAA2B,IAAAqG,OAAA,EAA3CA,EAA6CjM,OAChFjB,KAAKJ,kCAAgE,QAA/BuN,EAAGnN,KAAKT,MAAMwB,KAAKqM,oBAAY,IAAAD,GAAQ,QAARA,EAA5BA,EAA8BlM,cAAM,IAAAkM,GAE5E,QAF4EA,EAApCA,EAAsC3L,KAC3E6L,GAHkC,oEAGvBA,EAAQC,aACtB,IAAAH,OAAA,EAFwCA,EAEtCI,WAEEvN,KAAKU,UAEN,OADAV,KAAKT,MAAMsC,QAAQC,UAAUC,MAAM,kEAC5B,KAGX,MACI9B,aAAa,QAAEuN,EAAO,WAAEC,EAAU,SAAEC,IACpC1N,KAAKT,MACHoO,GAAW3N,KAAKL,WAAa+N,EAC7BE,GAAc5N,KAAKL,YAAc+N,GAAYD,IAAezN,KAAKG,6BACjE0N,GAAkB7N,KAAKL,YAAc+N,GAAYF,GACjD,kBAAElK,EAAiB,wBAAEwK,GAA4B9N,KAAKT,MAAM4C,UAE5D4L,EAASC,IAAA,GACRhO,KAAKT,OAAK,IACbqF,uBAAwB5E,KAAK4E,uBAC7BnF,eAAgBO,KAAKP,eACrBwO,oBAAqBjO,KAAKN,gBAC1BC,UAAWK,KAAKL,UAChBuO,MAAOlO,KAAK8D,cAAgBzE,gBAAC8O,IAActL,OAAAC,OAAA,GAAK,CAAEY,MAAOJ,EAAmBM,QAAS5D,KAAK8D,gBAC1FsK,iBAAkBpO,KAAK8D,aACvBuK,UAAW,CACP1O,UAAWK,KAAKL,UAChBgO,UACAC,aACAC,iBACAS,iBAAkBV,IAAe5N,KAAKT,MAAMU,YAAYsO,uBACxDC,iBAAkBX,IAAmB7N,KAAKT,MAAMU,YAAYsO,uBAC5DE,mBAAoBb,IAAe5N,KAAKT,MAAMU,YAAYsO,0BAA4BvO,KAAKY,0BAE/FxB,wBAAyB,CACrBsP,YAAa1O,KAAKT,MAClBmD,UAAWiM,IAAU,+BAAgC3O,KAAKT,MAAMiB,OAAOkC,YAE3EhD,gBAAiB,CACbkP,oBAAqB,CACjBlM,UAAW,qCACXe,KAAM,OACN,aAAcqK,GAElBe,KAAM7O,KAAK+D,yBAEf+K,uBAAwB9O,KAAK2B,4BAC7BmC,aAAc9D,KAAKqD,kBACnB0L,QAAS1P,gBAAC2P,UAAO,MACjBnP,iBAAkBG,KAAKH,iBACvBoP,WAAYjP,KAAK8E,gBACjBoK,WAAYlP,KAAKqF,gBACjB8J,aAAcnP,KAAKuF,kBACnBH,OAAQpF,KAAKoF,OACblF,OAAQF,KAAKE,OACbG,SAAUL,KAAKK,WAGnB,OAAOL,KAAKT,MAAM6P,WAAWrB,KA3KrBsB,YAAA,CAAXC,K,qCAEWD,YAAA,CAAXC,K,sCAEWD,YAAA,CAAXC,K,gCAEWD,YAAA,CAAXC,K,mCAESD,YAAA,CAATE,K,gCAuKDF,YAAA,CADCG,K,2BA/KCpQ,EAAuBiQ,YAAA,CAF5BI,kBACAC,KACKtQ,GAwmBSA,a,0YC1pBR,MAAMuQ,EAAiBpQ,IAC1B,MAmBMqQ,EAAgBC,IAClB,MAAM,0BAAEC,EAAyB,QAAEC,EAAO,SAAEC,EAAQ,UAAE3H,EAAS,sBAAE4H,GAA0B1Q,EAE3F,GAAIsQ,EAAiB,CACjB,IAAKC,EACD,OAEJA,EACKI,WAAW,CACRlO,GAAIiO,EACJF,UACAI,wBAAyB,CACrBC,cAAeJ,EAASK,oBAE5B3Q,gBAAiBH,EAAMG,gBACvB4Q,mBAAoBvQ,MAAOwQ,EAAiBhP,IAlCzBxB,OAC/BwQ,EACAlI,EACA2H,EACAzO,IAEK8G,EAGEA,EACFmI,6BAA6B,CAAEC,WAAYT,EAASU,OAASC,SAAUJ,EAAiBhP,iBACxFwF,KAAK9F,IACoB,YAAlBA,EAAOV,QACPhB,EAAMqR,2BAGbpJ,MAAMzF,OATA8O,QAAQC,UA4BIC,CAA2BR,EAAiBlI,EAAW2H,EAAUzO,KAG/EiG,MAAMzF,WACR,CACH,IAAKsG,EACD,OAEJ2H,EAASzJ,aAAe,GACxByJ,EAASK,mBAAqB,GAC9BL,EAASgB,gBAAkB,GAC3B3I,EACK4I,4BAA4B,CAAER,WAAYT,EAASU,SACnD3J,KAAK9F,IACoB,YAAlBA,EAAOV,QACPhB,EAAMqR,2BAGbpJ,MAAMzF,SAIbmP,EAAkBA,CAACC,EAAwCC,KAC7D,IAAKA,IAAqBD,GAAkD,IAA5BC,EAAiB/P,OAC7D,MAAO,GAGX,MAAMgQ,EAAgBD,EAAiB5P,KAAK+O,GACjCA,EAAgBH,gBAAkBe,GAG7C,OAAIE,EACOA,EAAcC,YAElBH,GAwFX,GAAK5R,EAAMG,iBAAoBH,EAAMG,gBAAgB6R,gBAArD,CAIiF,IAAAC,EAAjF,GAAIjS,EAAMkS,kCAAoClS,EAAMsH,6BAChD,IAvByB6K,EACzBC,EACAC,KAEA,MAAMnQ,EAA2B,GASjC,OARAkQ,WAAwB1N,IAAI4N,IACxB,MAAMC,EAASF,aAAqB,EAArBA,EAAuBpQ,KAAKuQ,GAAgBA,IAAiBF,EAASnQ,MAIrF,OAHIoQ,GACArQ,EAAeuQ,KAAKF,GAEjBrQ,IAGJwQ,kBAAgBC,YAAYzQ,IAU9BiQ,CAAqBnS,EAAMG,gBAAgB6R,gBAAkD,QAAnCC,EAAEjS,EAAMsH,mCAA2B,IAAA2K,OAAA,EAAjCA,EAAmCtJ,yBAChG,YAED,IACF3I,EAAMkI,yBACNlI,EAAMG,gBAAgB6R,gBAAgB/P,KAAK2Q,GAAUA,EAAOzQ,OAASnC,EAAMkI,wBAE5E,OAGJ,MAAO,CACH2K,UAAW,CACPC,YAAazC,GAEjB0C,iBAxG0BC,EAC1BvK,EACAwK,EACAC,EACAC,EACAtB,KAEA,MAAMuB,EAAczB,EAAgBlJ,EAASqI,mBAAoBe,GAC3DwB,IAAkB5K,EAASqI,mBAE3BwC,EAAehD,GACV,KACHD,EAAaC,IAIrB,OACIxQ,2BAAA,KACIA,gBAAA,SAAOqD,UAAU,iCACbrD,gBAAA,SACI2C,GAAI,6BAA6BgG,EAAS0I,OAC1CoC,KAAK,QACLC,KAAM,gBAAgB/K,EAAS0I,OAC/B/L,SAAUkO,GAAY,GACtBtO,MAAOiO,EACPQ,SAAUJ,EAAa,gBACRA,EACfK,IAAQjL,EAAS0I,OAAZ,YAER8B,GAELnT,gBAAA,SAAOqD,UAAU,qCACbrD,gBAAA,SACI2C,GAAI,+BAA+BgG,EAAS0I,OAC5CoC,KAAK,QACLC,KAAM,gBAAgB/K,EAAS0I,OAC/B/L,SAAUkO,GAAY,GACtBtO,MAAOkO,EACPO,QAASJ,EAAa,eACRA,EACdK,IAAQjL,EAAS0I,OAAZ,YAER+B,GAEJzK,EAASqI,mBACNhR,gBAAA,OAAKqD,UAAU,qCACXrD,gBAAA,QAAMqD,UAAU,2CAA2CiQ,GAC3DtT,gBAAA,UAAQqD,UAAU,uCAAuCyC,QAAS0N,GAAY,IACzEH,IAGT,OAqDMH,CACdhT,EAAMyQ,SACNzQ,EAAM2T,WACN3T,EAAM4T,kBACN5T,EAAMmT,gBACNnT,EAAM6R,kBAEVuB,YAAazB,EAAgB3R,EAAMyQ,SAASK,mBAAoB9Q,EAAM6R,kBACtEvB,kBAAmBtQ,EAAMyQ,SAASK,mBAClC5O,eAzDuB2R,EAACC,EAAkC3T,KAA2C,IAAA4T,EACrG,MAAMzB,EAAWnS,SAAgC,QAAjB4T,EAAf5T,EAAiB6R,uBAAe,IAAA+B,OAAA,EAAhCA,EAAkC9R,KAAK2Q,GAAUA,EAAOzQ,OAAS2R,EAAY5L,wBAC9F,OAAOoK,aAAQ,EAARA,EAAU9O,aAuDDqQ,CAAmB7T,EAAOA,EAAMG,iBAChD6T,eAAgB,CACZ7Q,UAAW,qCCuBjB8Q,EAAgBA,CAClBxD,EACAD,EACAxQ,EACA2E,EACAuP,EACAC,KACqB,IAAAC,EAAAC,EAAAC,EAAAC,EACrB,MAAM,cACFC,EAAa,aACbC,EAAY,GACZhS,EAAE,SACFC,EAAQ,QACRJ,EAAO,UACPM,EAAS,iBACT8R,EAAgB,uBAChBC,EAAsB,6BACtBC,EAA4B,6BAC5BC,EAA4B,gCAC5BC,EAA+B,kCAC/BC,EAAiC,mCACjCC,EAAkC,wCAClCC,EAAuC,uDACvCC,EAAsD,wBACtDC,EAAuB,6BACvBC,EAA4B,eAC5BC,EAAc,oBACdC,EAAmB,UACnBC,EAAS,oBACTC,EAAmB,sBACnB9E,EAAqB,UACrB+E,GACAzV,EAEE0V,EAAkBpT,EAAQU,QAAQ2S,KAAKD,gBACvCE,EAAiBL,GAAaA,EAAUzT,OAAS,GAAKyT,EAAU,GAAGxH,KAAOwH,EAAU,GAAGxH,KAAOyH,EAC9FK,GA5JNC,EA4J+D9V,EAAM8V,oBA3JrEC,EA2J0F7B,EAxJrF4B,GACAC,GACAA,EAAoBC,0BACpBD,EAAoBE,oBACpBF,EAAoBC,yBAAyBE,kBAK3CH,EAAoBC,yBAAyBE,kBAHzC,GAXuBC,IAClCL,EACAC,EA6JA,MAAMK,EACF5F,GA/IwB6F,EAC5BC,EACAR,EACAD,EACAU,EACAC,KAEA,GAAID,EAAgC,CAChC,IAAIE,EAAmCD,EAQvC,OAJKA,IACDC,EAAmCH,GAAuB,IAGvDR,EACDW,EAAmCZ,EAC/BY,EACAZ,EACJY,EAEV,OAAIX,GACOD,EAA2BS,EAAsBT,EAErDS,GAuHHD,CACIrW,EAAM0W,oBACN1W,EAAM8V,oBACND,EACA7V,EAAMuW,gCACN/F,SAAiB,QAAV4D,EAAP5D,EAASmG,gBAAQ,IAAAvC,OAAA,EAAjBA,EAAmBwC,kBAAmB,GAK9C,IAAIC,GAAuBrG,aAAO,EAAPA,EAASsG,iBAAkBC,sBAAoBC,WAAavG,EAASwG,cAEhG,GAAIxB,EAAW,CACX,MAAMyB,EAAwBrB,IACvB3B,aAAwB,EAAxBA,EAA0B8B,yBAAyBtK,uBACnDwI,aAAwB,EAAxBA,EAA0B8B,yBAAyBtK,oBAAoBzJ,KAAM0J,GAA6B,kBAAjBA,EAASC,MAEnGuL,EAAqBD,GAAyBA,EAAsBrL,OAASqL,EAAsBrL,MAAMC,YAE/G,IAAIsL,EAAgB,GAEhBA,EADsBvW,MAAtBsW,EACgB,GAEAA,EAAmBE,WAGvC,MAAMC,EAAqBzB,IACpB3B,aAAwB,EAAxBA,EAA0B8B,yBAAyBtK,uBACnDwI,aAAwB,EAAxBA,EAA0B8B,yBAAyBtK,oBAAoBzJ,KAAM0J,GAA6B,mBAAjBA,EAASC,MACnG2L,EAAwBD,GAAsBA,EAAmBzL,OAASyL,EAAmBzL,MAAM2L,aACzG,IAAIC,EAAiB,EACQ5W,MAAzB0W,IACAE,EAAiBF,GAGrB,IAAIG,EAAS,EACmB7W,MAA5BgV,IACA6B,EAASC,OAAO9B,KAGE,GAAlB4B,GAGIC,GAAUD,GAGW,IAAjBL,KALRP,GAAuB,GAa/B,MAAMtS,EAAeqT,mBAAiBC,kBAAkBzB,QAClDvV,EA3KeiX,EACrBjC,EACAkC,EACA/X,EACA6W,EACApO,EACAuP,KACoB,IAAAC,EACpB,MAAMC,EAA+B,GAGrC,GADuE,aAAb,QAAzBD,EAAAjY,EAAM+V,2BAAmB,IAAAkC,OAAA,EAAzBA,EAA2BjX,QAExD,OAGJ,IAAIkT,EACJ,GAAIlU,EAAMmY,sBAAwBzF,kBAAgBC,YAAY3S,EAAMmY,wBAChEjE,EAA2BlU,EAAMmY,qBAAqBlW,KAAK8T,GACnD/V,EAAMoY,sBACCrC,EAAoBC,yBAAyBqC,YAAc5P,EAAS4P,UAG3EtC,EAAoBC,yBAAyBqC,YAAc5P,EAAS4P,WACpEtC,EAAoBuC,mBAAqB7P,EAAS8P,kBAGzB1X,IAA7BqT,GACA,OAIJlU,EAAMwY,eAAiBxY,EAAM8V,sBAAwBe,IACjDhB,GAA4B,EAC5BqC,EAAmBzF,KAAKzS,EAAMyY,gBACvB5C,EAA2BkC,IACD,IAA7BlC,EACAqC,EAAmBzF,KAAKzS,EAAM0Y,mBAE9BR,EAAmBzF,KAAKzS,EAAM2Y,qBAAqBC,QAAQ,YAAa/C,EAAyBwB,eAM7G,MAAMwB,EAAiB7Y,EAAM8Y,gBAAgBC,uBACvCC,EAAsBH,aAAc,EAAdA,EAAgBrQ,OAAO7D,GAASA,EAAMwM,SAAW6G,GAC7E,QAA4BnX,IAAxBmY,EACA,IAAK,MAAMC,KAAKD,EACRtG,kBAAgBC,YAAYsG,EAAEC,qBAC9BD,EAAEC,mBAAmBC,QAAQC,SACOvY,IAA5BuY,EAAWC,cACXnB,EAAmBzF,KAAK2G,EAAWC,gBAOvD,OAAI3G,kBAAgBC,YAAYuF,GACrBA,EAAmBoB,KAAK,UADnC,GAkHMxB,CAAiBjC,EAA0BpF,EAAS8I,SAAWvZ,EAAO6W,EAAsBpG,EAAUA,EAASU,QAE/GqI,EAvGoBC,EAAC9E,EAA8DlE,IAAuB,KAChHkE,EAAuBlE,IAsGMgJ,CAAsB9E,EAAwBlE,GAErEiJ,EAAUC,2BAAiBC,IAAeC,eAAgB7Z,EAAMsF,iBAAmBoP,EAAkB,IACrGoF,EAAaC,iCAAuB/Z,EAAMsF,iBAAmBoU,GAE7DM,EAAe9F,aAAwB,EAAxBA,EAA0B+F,gBACzCC,EAAgBhG,EAChB,iCAAuE,QAAvEG,EAAgCH,EAAyBiG,sBAAc,IAAA9F,OAAA,EAAvCA,EAAyC+F,oBACzEvZ,EAGAwZ,GAEF,YADA7J,SAAmB,QAAZ8D,EAAP9D,EAAS8J,kBAAU,IAAAhG,GAA8E,QAA9EA,EAAnBA,EAAqBrS,KAAKsY,GAHL,IAGkBA,EAAUC,2BAAgD,IAAAlG,GAAgB,QAAhBA,EAAjGA,EAAmGmG,sBAAc,IAAAnG,OAAA,EAAjHA,EAAmHzI,OAGvH,IAAI6O,GACJ,GAAIlK,GAGA,GAFAkK,GAAaC,4BAAkBnK,EAASxQ,EAAMsC,QAAQuH,mBAAehJ,GAEjE+Z,IAASC,WAAaC,YAAiB9a,EAAMsC,QAAQuH,cAAckR,gBAAiB,KAAAC,GACpF,MAAMC,EAAU,IAAIC,IAAIR,GAAYS,OAAO/J,SAASgK,MACpDH,EAAQI,aAAaC,IAAI,YAAa,IAAqB,QAArBN,GAAGvK,EAAS8K,iBAAS,IAAAP,MAAI,IAC/DN,GAAaO,EAAQG,WAGzBV,GAAac,uCAA6B/K,EAASjN,aAAe,GAAIxD,EAAMsC,QAAQuH,eAGxF,MAAO,CACHrI,KAAM,CACFgP,UACAC,YAEJgL,WAAYhL,EAASU,OACrB3O,MAAO+B,EACP4J,WAAW0I,IAAwB7W,EAAM8V,sBAAsBrF,EAAS8I,UAAanD,UAAe,GACpG3F,SACI3Q,gBAAC4b,wBAAqB,CAClBla,KAAM,CACFiH,SAAUgI,EACV3H,UAAW9I,EAAM8I,UACjB0H,UACAmL,SAAU3b,EAAM2b,UAEpB5D,gBAAiBtH,EAAS8I,SAC1BnD,YAAaA,EACbwF,eAAe/E,IAAwB7W,EAAM8V,sBAAsBD,GAA4B,EAC/FpB,aAAcA,EACdD,cAAeA,EACf/R,GAAIA,EACJC,SAAUA,EACVgY,WAAYA,GACZpY,QAASA,EACTM,UAAWA,EACX8Q,IAAK,GAAG/O,KAAS+V,KACjBmB,UAAWlX,EACXmX,oBAAqBlE,mBAAiBC,kBAAkBrH,GACxDuL,iBAAkB/b,EAAMgc,sCACxBC,gBAAiBzL,aAAO,EAAPA,EAAS0L,gBAC1B3X,aAAcA,EACd4X,0BAA2BnC,EAC3BoC,wBAAyBlC,EACzBmC,iBAA8C,WAAb,QAAf9H,EAAAvU,EAAM8I,iBAAS,IAAAyL,OAAA,EAAfA,EAAiBvT,QACnCsb,gCAAiCtc,EAAMsc,gCACvChX,iBAAkBtF,EAAMsF,iBACxBgC,4BAA6BtH,EAAMsH,8BAG3CiV,cAAe/L,EACTJ,EAAc,CACVM,wBACA5H,UAAW9I,EAAM8I,UACjB2H,WACAD,UACAmD,WAAY3T,EAAMiT,WAClBW,kBAAmB5T,EAAMwc,aACzBrJ,gBAAiBnT,EAAMmT,gBACvB5C,0BAA2BvQ,EAAMuQ,0BACjCsB,iBAAkB7R,EAAM6R,iBACxB1R,gBAAiBgU,EACjBjM,uBAC4C,KAAxCuI,EAASzJ,aAAqCyJ,EAASzJ,aAAehH,EAAMkI,uBAChFgK,iCAAkClS,EAAMkS,iCACxC5K,4BAA6BtH,EAAMsH,4BACnC+J,uBAAwBrR,EAAMqR,8BAElCxQ,EACN4b,OACI3c,gBAAC2F,SAAMnC,OAAAC,OAAA,CAACJ,UAAU,6BAA6ByC,QAAS4T,EAAsBrV,MAAOuQ,GAAsBoF,GACtGpF,GAGTgI,cACIhH,GAAmBlF,IAAY6J,GAC3Bva,gBAAC6c,yBAAsB,CACnBxZ,UAAU,iCACVgS,wBAAyBA,EACzBC,6BAA8BA,EAC9B9S,QAASA,EACTG,GAAIA,EACJiR,IAAKjD,EAASU,OACdzO,SAAUA,EACVkT,eAAgBA,EAChBnF,SAAUA,EACVmM,gBAAc,EACdC,mBAAmB,EACnBC,kBAAkB,EAClBC,mBAAmB,EACnBC,SAAS,SACTxb,KAAM,CACF+T,YACA/E,WAEJyM,UAAWrI,SAGf/T,EAERqc,mBACIxH,GAAmBL,GAAkB7E,EACjC1Q,gBAACqd,8BAA2B,CACxBha,UAAWia,IAAW,uCAAwC/C,GAAwB,WAAa,IACnGxF,6BAA8BA,EAC9BC,gCAAiCA,EACjCC,kCAAmCA,EACnCC,mCAAoCA,EACpCC,wCAAyCA,EACzCC,uDAAwDA,EACxD1T,KAAM,CAAEgP,UAAS6M,SAAU5M,EAAS8I,UAAY,EAAGlE,iBAAgBC,uBACnEhT,QAASA,EACTsa,gBAAc,EACdU,8BAA+BjD,GAC/BkD,cAAelD,GACf5X,GAAIA,EACJC,SAAUA,EAEVqa,mBAAoB/c,EAAMsC,QAAQkb,IAAIvc,OAAOwc,iBAAkB,SAGnE5c,IAKH6c,EAAoBA,CAC7BC,EACAC,EACA5d,KAEA,MAAM6d,EAAoC,GAiC1C,OA/BAF,EAAUjZ,IAAI,CAAC+L,EAAU9L,KACrB,IAAI6L,EAQA0D,EAaAC,EAjBA3D,EAHAxQ,EAAMuW,+BAGIuH,4CAAkCrN,EAAS4H,UAAWuF,EAAUnN,EAAS8H,YAAavY,EAAM8I,WAE5FiV,gCAAsBtN,EAAS4H,UAAWuF,GAGpD5d,EAAMmY,sBAAwBzF,kBAAgBC,YAAY3S,EAAMmY,wBAChEjE,EAA2BlU,EAAMmY,qBAAqBlW,KAAK8T,IAAsB,IAAAiI,EAAAC,EAAAC,EAC5CC,EAAjC,OAAIne,EAAMoY,uBAC6C,QAA5C+F,EAAApI,EAAoBC,gCAAwB,IAAAmI,OAAA,EAA5CA,EAA8C9F,aAAc5H,EAAS4H,WAGhC,QAA5C2F,EAAAjI,EAAoBC,gCAAwB,IAAAgI,OAAA,EAA5CA,EAA8C3F,aAAc5H,EAAS4H,YACjC,QAApC4F,EAAAlI,EAAoBuC,wBAAgB,IAAA2F,OAAA,EAApCA,EAAsCG,kBAAsC,QAAzBF,EAAKzN,EAAS8H,mBAAW,IAAA2F,OAAA,EAApBA,EAAsBE,uBAMvDvd,IAA/Bb,EAAMmU,sBAAsCzB,kBAAgBC,YAAY3S,EAAMmU,wBAC9EA,EAAuBnU,EAAMmU,qBAAqBlS,KAAKC,GAC5CA,GAAkBA,EAAemW,YAAc5H,EAAS4H,YAGvEwF,EAAWpL,KAAKwB,EAAcxD,EAAUD,EAASxQ,EAAO2E,EAAOuP,EAA0BC,MAGtF0J,GCtdEQ,EAAsBre,IAC/B,MAAM,SAAE4d,EAAQ,UAAED,EAAS,eAAE/b,GAAmB5B,EAChD,OAAO4B,EAtB4B0c,EACnCC,EACAX,EACA5d,KAEA,MAAM6d,EAAsC,GAC5C,GAAIU,GAAaA,EAAUzc,OAAS,EAAG,CAEnC,MAAM0c,EAAmBd,EAAkBa,EAAWX,EAAU5d,GACvC,OAArBwe,GACAX,EAAWpL,KAAK+L,GAGxB,OAAOX,GAUDS,CAA+BX,EAAWC,EAAU5d,GA7D9Bye,EAC5Bd,EACAC,EACA5d,KAEA,MAAM6d,EAAsC,GAC5C,IAAKD,GAAgC,IAApBA,EAAS9b,OAEtB,OADA9B,EAAMsC,QAAQC,UAAUC,MAAM,iDACvB,KAGX,MAAMkc,EAAyBC,GAAsBC,IAAQD,EAAOE,GAAQA,EAAK/N,oBAE3EgO,GADsBH,EACahB,EADSiB,IAAQD,EAAOE,GAAQA,EAAK7X,eAAlD2X,MAE5B,MAAMI,EAA6B,GAqBnC,OAlBAzb,OAAO0b,QAAQF,GAAe3F,QAAQ8F,IAAwC,IAAtCC,EAAcC,GAAoBF,EAEtEH,EAAcI,GAAgBR,EAAsBS,GACpDJ,EAAetM,KAAKiM,EAAsBS,MAI9C7b,OAAO8b,KAAKL,GAAgB5F,QAAQzF,IAChC,MAAM6K,EAAYQ,EAAerL,GACjCpQ,OAAO8b,KAAKb,GAAWpF,QAAQxU,IAC3B,MAAM8D,EAAW8V,EAAU5Z,GACrB6Z,EAAmBd,EAAkBjV,EAAUmV,EAAU5d,GACtC,OAArBwe,GACAX,EAAWpL,KAAK+L,OAKrBX,GA2BDY,CAAwBd,EAAWC,EAAU5d,ICpDhDQ,eAAe6e,EAAiBC,GACnC,MAAMC,EAAgC,GAatC,aAXMC,8CAAoC,IAAIC,mCAAiCH,EAAIvE,eAAe2E,aAAcJ,GAC3G9X,KAAKmY,IACEA,IACAJ,EAAcI,iBAAmBA,KAGxC1X,MAAMzF,IACH8c,EAAI/c,UAAUqd,UAAUpd,GACjB,KAGR+c,E,ykBCoFX,IAAMM,EAAN,cAAmB/f,IAAMggB,UAarB/f,YAAmBC,GACfC,MAAMD,GAPF,KAAAuW,gCAA0C,EAE1C,KAAAwJ,YAAsB,EAEb,KAAAC,iBAA2B,uBAuQ3B,KAAAC,mBAAsB/U,IACnCzK,KAAKyf,SAAS,CACVC,qBAAsB1f,KAAKgN,MAAM0S,uBAOxB,KAAAC,0BAA4B,KACzC3f,KAAK4f,wBA8eQ,KAAAC,iBAAoB9L,GAE7BA,GAAiB,CACb+L,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCG,UAAU,GASL,KAAAC,0BAA6BC,IAC1C,GAAIvgB,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAQ,CAC7B,MAAMuf,EAAQ,CACVC,YAAa,CAACF,EAAiB7P,OAAQkG,aAE3C5W,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAChByf,gBAAgBF,GAChBzZ,KAAK,KACF/G,KAAK2gB,eAAenZ,MAAMzF,IACtB/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,+BAGlCrZ,MAAMzF,IACH/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,kCAU1B,KAAA1M,6BAA+B,CAAClT,EAAsC+O,KAC7D,UAAlB/O,EAAOV,QAAsByP,GAC7BhQ,KAAKsgB,0BAA0BtQ,IAWtB,KAAA8Q,uBAAyB,CAACC,EAA4BnE,EAAkBxB,KACrF4F,YACIhhB,KAAK8V,+BACL9V,KAAKT,MAAMwB,KAAK8G,KAAK5G,OACrBjB,KAAKT,MAAMuC,UACX9B,KAAKT,MAAMwB,KAAKoc,SAASlc,OACzB8f,EACAnE,GAEC7V,KAAMka,IACH,GAAiC,aAA7BA,aAAgB,EAAhBA,EAAkB1gB,QAMlB,OALAP,KAAK2gB,eAAenZ,MAAMzF,IACtB/B,KAAKT,MAAMuC,UAAU8e,QAAS7e,EAAgB6B,SAC9C5D,KAAKT,MAAMuC,UAAU+e,MAAM,8BAGxB,EAGX,IAAK1J,mBAAiBC,kBAAkB6J,GAAmB,KAAAC,EAEvD,MAAMC,EAA0C,CAC5CzQ,OAAQyG,mBAAiBC,kBAAkB2J,EAAiBrQ,QAAU,IAAMqQ,EAAiBrQ,OAC7F+H,mBAAoB,CAChB,CACIG,aAAc3G,kBAAgBC,YAAY+O,EAAiBG,mBACrDH,EAAiBG,kBAAkB,GAAGxI,aACtC,GACNzR,iBAA+C,QAA/B+Z,EAAED,EAAiB/Z,oBAAY,IAAAga,OAAA,EAA7BA,EAA+B/Z,oBAK7DnH,KAAKyf,SAAS,CACVpH,gBAAiB,CAAEC,uBAAwB,CAAC6I,MAIpD,OAAO,IAEV3Z,MAAM,KACI,IAGR,GAMM,KAAA6Z,0BAA4B,KACrCrhB,KAAK8V,gCAELwL,sCAA4B,IAAIC,0BAA2BvhB,KAAKT,MAAMsC,QAAQuH,eACzErC,KAAKhH,SAAYC,KAAK2gB,gBACtBnZ,MAAOzF,IACJ/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,EAAM6B,SACnC5D,KAAKT,MAAMuC,UAAU+e,MAAM,8BA32BvC7gB,KAAK6E,iBAAmB8F,6BACpB3K,KAAKT,MAAMsC,QAAQU,QAAQqI,kBAC3B5K,KAAKT,MAAMsL,aACX7K,KAAKT,MAAMuC,WAEf9B,KAAKwhB,QAAUtI,2BAAiB,QAASlZ,KAAK6E,iBAAkB,IAChE7E,KAAKwf,mBAAqBxf,KAAKwf,mBAAmBiC,KAAKzhB,MACvDA,KAAK2f,0BAA4B3f,KAAK2f,0BAA0B8B,KAAKzhB,MAErEA,KAAKgN,MAAQ,CACT0S,qBAAqB,EACrBZ,cAAe,GACf4C,aAAa,EACbhO,0BAAsBtT,EACtBiY,gBAAiB,IAOlB,0BACHrY,KAAKsf,YAAa,EAClB,MAAM,OACF9e,EACAqB,SAAS,cAAEuH,IACXpJ,KAAKT,MAO2B,IAAAuL,GALpC9K,KAAK8V,qCAAuC9V,KAAK2hB,oCAC7C3hB,KAAK8V,sCACC9V,KAAK2gB,eAGXngB,EAAOohB,2BACH5hB,KAAKsf,YAAyC,QAA/BxU,EAAI9K,KAAKT,MAAMwB,KAAK8G,KAAK5G,cAAM,IAAA6J,GAA3BA,EAA6BjD,KAAKC,WACrD9H,KAAKyf,SAAS,CAAEX,oBAAqBF,EAAiBxV,KAG1D2C,YACI,SAAAhB,EAAA,OAAiC,QAAjCA,EAAM/K,KAAKT,MAAMwB,KAAK8G,KAAK5G,cAAM,IAAA8J,OAAA,EAA3BA,EAA6BlD,KAAKC,WACxC/H,UACQC,KAAKsf,YACLtf,KAAKyf,SAAS,CAAEX,oBAAqBF,EAAiBxV,QAKtE2C,YACI,SAAA8V,EAAA,OAAiC,QAAjCA,EAAM7hB,KAAKT,MAAMwB,KAAK8G,KAAK5G,cAAM,IAAA4gB,OAAA,EAA3BA,EAA6Bha,KAAKC,WACxC/H,UACI,GAAIC,KAAKsf,WAAY,CACjB,MAAMkB,EAAQ,IAAIsB,uCAAqC1Y,EAAckR,eAAe2E,aACpFjf,KAAKyf,SAAS,CAAE/L,2BAA4BqO,2CAAiCvB,EAAOpX,QAS7F4Y,uBACHhiB,KAAKsf,YAAa,EASfzS,sBAAsBC,EAA4CC,GACrE,OAAI/M,KAAKgN,QAAUD,GAAa/M,KAAKT,MAAMwB,OAAS+L,EAAU/L,KAO3DkM,SAAM,IAAAgV,EAAAC,EAAAC,EAAAhV,EACT,MACIpM,MACI8G,MAAQ5G,OAAQ4G,GAChBsV,UAAYlc,OAAQkc,IAExBtb,SACIU,SACI2S,MAAM,gBAAED,EAAe,UAAEmN,KAEhC,UACDjgB,GACAnC,KAAKT,MAEH8iB,EAAmBC,YAAW,WAAYtiB,KAAKT,MAAMsC,QAAQuH,gBAAkB,GAC/EmZ,EAAoBD,YAAW,OAAQtiB,KAAKT,MAAMsC,QAAQuH,gBAAkB,GAC5EoZ,EAAcxiB,KAAKyiB,eAAexN,EAAiBoN,EAAkBD,GAAa,IAClFM,EAAc7a,GAAQA,EAAKA,KAAKC,WAA4C,IAA/BD,EAAKA,KAAKC,UAAUzG,OACjEyc,EAAY9d,KAAK2iB,gBACjBhb,EAA0D,QAArCsa,EAAGjiB,KAAKT,MAAMsC,QAAQU,QAAQC,eAAO,IAAAyf,OAAA,EAAlCA,EAAoCra,sBAG5Dgb,EAAgB5iB,KAAKT,MAAMwB,KAAK8hB,qBAAqB5hB,QACpDjB,KAAKT,MAAMwB,KAAK8hB,qBAAqB5hB,OAAOgK,qBAC5CjL,KAAKT,MAAMwB,KAAK8hB,qBAAqB5hB,OAAQgK,oBAAoBzJ,KAAM0J,GAA6B,cAAjBA,EAASC,KAEnG,IAAI2X,EAAYF,GAAiBA,EAAcxX,OAASwX,EAAcxX,MAAM2L,aAC3D3W,MAAb0iB,IACAA,EAAY,GAGhB,MAAMC,ECjNR,SACFjF,EACAkF,EACA5Z,EACA+T,EACAxV,EACAqN,GAEA,MAAMiO,EAAc,IAAIC,IAExB,IAAK9Z,EAAckR,eAAeyC,IAAIvc,OAAO2iB,iBACzC,MAAO,CACHC,SAAS,EACTC,oBAAqB,IAG7B,MAAMA,EAAsB,GAC5B,IAAID,GAAU,EAEd,GAAInR,kBAAgBC,YAAY4L,IAAc7L,kBAAgBC,YAAY8Q,GAAwB,CAE9F,IAAK,MAAMhb,KAAY8V,EAEnB,GAAI9V,EAAS4P,YAAc5P,EAASwO,gBAAkBxO,EAASsb,eAC3D,GAAKL,EAAYM,IAAIvb,EAAS4P,WAEvB,KAAA4L,EAAAC,EACH,MAAMC,EAAmD,QAAtCF,EAAGP,EAAY5gB,IAAI2F,EAAS4P,kBAAU,IAAA4L,IAAI,EAC7DP,EAAYU,OAAO3b,EAAS4P,WAC5BqL,EAAYpI,IAAI7S,EAAS4P,UAAW8L,GAAkC,QAArBD,EAAIzb,EAAS8Q,gBAAQ,IAAA2K,IApBtD,QAesB,KAAAG,EACtCX,EAAYpI,IAAI7S,EAAS4P,UAA4B,QAAnBgM,EAAE5b,EAAS8Q,gBAAQ,IAAA8K,IAhBrC,GA0B5B,MAAMC,EAAyB,IAAIX,IACnC,IAAK,MAAM5N,KAAuB0N,EAE1B1N,EAAoBC,yBAAyBqC,YAC5CiM,EAAuBN,IAAIjO,EAAoBC,yBAAyBqC,YAEzEiM,EAAuBhJ,IAAIvF,EAAoBC,yBAAyBqC,UAAWtC,GAK3F,IAAK,MAAMwO,KAAaC,MAAMC,KAAKf,EAAYtE,QAAS,KAAAsF,EAAAvG,EACpD,MAAMwG,EAAwC,QAA7BD,EAAGhB,EAAY5gB,IAAIyhB,UAAU,IAAAG,IAtCtB,EAuClB3O,EAAsBuO,EAAuBxhB,IAAIyhB,GACjDK,EAAmF,QAAlEzG,EAAGpI,aAAmB,EAAnBA,EAAqBC,yBAAyBE,yBAAiB,IAAAiI,SAAItd,EAGvF4H,EAAW8V,EAAUtc,KAAK4iB,GAAQA,EAAKxM,YAAckM,GACrDO,EAAkBlH,aAAQ,EAARA,EAAU3b,KAAKuO,GAAWA,EAAQuU,WAAaR,GACvE,IAAIS,GAAgB,EACC,IAAAC,EAArB,GAAIH,EACAE,IAA0C,QAAzBC,EAACH,EAAgBnO,gBAAQ,IAAAsO,IAAxBA,EAA0BC,kBAEhD,MAAMC,IACF1c,YAAUzB,cAA0C,KAA1ByB,EAASzB,eAAsByB,EAASzB,eAAiBoB,EACvF,IAAIgd,GAA4BJ,GAAiBG,EAEjD,GAAI1P,EAAW,CACX,MAAMyB,EAAwB0N,IACvB7O,aAAmB,EAAnBA,EAAqBC,yBAAyBtK,uBAC9CqK,aAAmB,EAAnBA,EAAqBC,yBAAyBtK,oBAAoBzJ,KAAM0J,GAA6B,kBAAjBA,EAASC,MAE9FuL,EAAqBD,GAAyBA,EAAsBrL,OAASqL,EAAsBrL,MAAMC,YAE/G,IAAIsL,EAAgB,GAEhBA,EADsBvW,MAAtBsW,EACgB,GAEAA,EAAmBE,WAGvC,MAAMC,EAAqBsN,IACpB7O,aAAmB,EAAnBA,EAAqBC,yBAAyBtK,uBAC9CqK,aAAmB,EAAnBA,EAAqBC,yBAAyBtK,oBAAoBzJ,KAAM0J,GAA6B,mBAAjBA,EAASC,MAC9F2L,EAAwBD,GAAsBA,EAAmBzL,OAASyL,EAAmBzL,MAAM2L,aACzG,IAAIC,EAAiB,EACQ5W,MAAzB0W,IACAE,EAAiBF,GAGrB,IAAIG,EAAS,EACY7W,MAArB+jB,IACAlN,EAASC,OAAOiN,KAGE,GAAlBnN,GAGIC,GAAUD,GAGW,IAAjBL,KALRgO,GAA2B,GAa/BA,IAGCrP,YAAqBE,oBAAuB2O,GAAqBD,EAAcC,KAChFd,EAAoBrR,KAAK8R,GACzBV,GAAU,IAItB,MAAO,CACHA,UACAC,uBD8FsCuB,CACd,QADwC1C,EAC5Dra,aAAI,EAAJA,EAAMA,KAAKC,iBAAS,IAAAoa,IAAI,GACmB,QADjBC,EAC1BniB,KAAKT,MAAMwB,KAAK2W,qBAAqBzW,cAAM,IAAAkhB,IAAI,GAC/CniB,KAAKT,MAAMsC,QAAQuH,cACnB+T,UAAY,GACZxV,EACAmb,GAGJ,IAAIpV,IACCqV,WAA+BK,UAChCpjB,KAAK6kB,4CACH9B,IAAkC/iB,KAAKgN,MAAM0U,eAC9C5D,GAAYA,EAAUgH,KAAK9U,GAAYA,EAAStC,UAErD,MAAMqX,EAAsE,QAAtC5X,EAAGnN,KAAKT,MAAMwB,KAAKqM,aAAanM,cAAM,IAAAkM,OAAA,EAAnCA,EAAqC3L,KAC1E4L,GAAsC,oEAAtBA,EAAaE,MAE3B0X,EAAwBD,aAAgC,EAAhCA,EAAkCxX,UAC1D+Q,EAAiBzW,WAAM1G,gBAAkB6jB,EAAwBhlB,KAAKilB,oBAAsB,KAClGjlB,KAAKwhB,QAAQ0D,cAAcC,MAAQC,oBAAkBC,SACrD,MAAMC,EAA6BhM,iCAAuBtZ,KAAK6E,iBAAkB7E,KAAKwhB,SACtFxhB,KAAKwhB,QAAQ0D,cAAcC,MAAQC,oBAAkBG,cACrD,MAAMC,EAA4BlM,iCAAuBtZ,KAAK6E,iBAAkB7E,KAAKwhB,SACrFxhB,KAAKwhB,QAAQ0D,cAAcC,MAAQC,oBAAkBK,eACrD,MAAMC,EAA2BpM,iCAAuBtZ,KAAK6E,iBAAkB7E,KAAKwhB,SAGpF,GAAIuB,IAAkCA,EAA8BK,QAAS,CACzE,GAAI4B,GAA4C,OAAnB1G,EACzB,IAAK,MAAMqH,KAAiBrH,EACxBte,KAAK4lB,wCAAwCD,EAAe5C,GAIpE/iB,KAAK4lB,wCAAwC9H,EAAWiF,GAG5D,MAAMhV,EAASC,IAAA,GACRhO,KAAKT,OAAK,IACbmD,UAAWia,IAAW,WACtBjZ,MAAOrE,IAAAwmB,cAAA,MAAInjB,UAAU,qBAAqBP,EAAU2jB,WACpDje,KAAM7H,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAC3B8kB,iBAAkB,CAAErjB,UAAW,uBAC/BsjB,oBAAqB,CAAEtjB,UAAWmF,WAAM1G,eAAiB,8BAAgC,6BACzF8kB,kBAAmB,CAAEvjB,UAAWmF,WAAM1G,eAAiB,6BAA+B,4BACtF+b,UAAWY,EACXQ,iBACA4H,UAAWlmB,KAAKmmB,gBAChBjH,iBAAkBlf,KAAKomB,iBACvBvkB,QAAS7B,KAAKT,MAAMsC,QACpBI,SAAUjC,KAAKT,MAAM0C,SACrBH,UAAW9B,KAAKT,MAAMuC,UACtBE,GAAIhC,KAAKT,MAAMyC,GACfgjB,wBACAqB,2BAA4BlkB,EAAUkkB,2BACtCC,oBAAqBrU,kBAAgBC,YAAYrK,aAAI,EAAJA,EAAMA,KAAKC,WACxDD,WAAM1G,eACF9B,IAAAwmB,cAAA,MAAInjB,UAAU,gCAAgCP,EAAUokB,qBAExDlnB,IAAAwmB,cAAA,MAAInjB,UAAU,8BAA8BP,EAAUqkB,mBAE1D,KACJC,sBAAuBzmB,KAAK0mB,4BAC5BC,wBAAyB3mB,KAAK4mB,8BAC9BC,2BAA6BnE,EAUzB,KATArjB,IAAAwmB,cAAC7gB,SAAMnC,OAAAC,OAAA,CACHoC,SAAUwI,EACVhL,UAAU,yBACViY,KAAM6H,EACN9e,MAAOvB,EAAU2kB,qBACbxB,GAEHnjB,EAAU2kB,qBAGnBC,sBACKrE,GAAgBzN,IAAmBjV,KAAKT,MAAMiB,OAAOwmB,wBAUlD,KATA3nB,IAAAwmB,cAAC7gB,SAAMnC,OAAAC,OAAA,CACHoC,SAAUwI,EACVhL,UAAU,8BACViY,KAAM0H,EACN3e,MAAOvB,EAAU8kB,0BACbzB,GAEHrjB,EAAU8kB,0BAGvBC,sBAAwBxE,EAAgD,KAAlC1iB,KAAKT,MAAM4nB,MAAMC,eACvDC,8BAA+B,CAAE3kB,UAAW,8CAC5C4kB,qBACIjoB,IAAAwmB,cAAC7gB,SAAMnC,OAAAC,OAAA,CACHJ,UAAU,gCACNgjB,EAAwB,CAC5B/K,KAAM4H,EACN7e,MAAOvB,EAAUolB,4BAEhBplB,EAAUolB,2BAGnBC,6BACIxnB,KAAKynB,6BAA+BtK,EAChC9d,IAAAwmB,cAAC6B,mCAAgC,CAC7BpT,kCAAmCtU,KAAK2nB,2CAA2CxlB,GACnFoS,mCAAoCvU,KAAK4nB,0CAA0CzlB,GACnF0lB,yCAA0C7nB,KAAK8nB,kDAAkD3lB,GACjGsS,uDAAwDzU,KAAK+nB,gEACzD5lB,GAEJ6lB,kCAAmC7lB,EAAU6lB,kCAC7CC,yCAA0C9lB,EAAU8lB,yCACpDpmB,QAAS7B,KAAKT,MAAMsC,QACpBG,GAAIhC,KAAKT,MAAMyC,GACfC,SAAUjC,KAAKT,MAAM0C,SACrBlB,KAAM,CACF6T,eAAgB5U,KAAKT,MAAMwB,KAAK6T,eAAe3T,OAC/C6c,UAAW9d,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAQ4G,KAAKC,UAC7C+M,oBAAqB7U,KAAKT,MAAMwB,KAAK8T,oBAAoB5T,UAGjE,KACRinB,qCAAsCloB,KAAK6kB,0CACvCxlB,IAAAwmB,cAAA,QAAMnjB,UAAU,uBACZrD,IAAAwmB,cAAA,QAAMnjB,UAAU,sCAAqC,cAAa,SAClErD,IAAAwmB,cAAA,QAAMnjB,UAAU,gCACZrD,IAAAwmB,cAAA,QAAMnjB,UAAU,uCAAuCP,EAAUgmB,2CAChEhmB,EAAUimB,8CAGnB,KACJC,cACIroB,KAAKT,MAAM4nB,MAAMkB,eAAiBroB,KAAKT,MAAM4nB,MAAMkB,cAAchnB,OAAS,EAAIrB,KAAKT,MAAM4nB,MAAMkB,cAAc,GAAK,KACtHnU,uBAAwBlU,KAAKsgB,0BAC7BnM,6BAA8BnU,KAAKmU,6BACnCmU,iBAAkBjpB,IAAAwmB,cAAC7W,UAAO,CAACtM,UAAU,wCACrC6lB,kBAAmD,WAAhCvoB,KAAKT,MAAMwB,KAAK8G,KAAKtH,OAAsBP,KAAKT,MAAM4C,UAAUqmB,wBAA0B,KAC7GC,eAAgBzoB,KAAKT,MAAMwB,KAAK8G,KAAK5G,QAAUjB,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAOynB,QAC3EC,mBAAoB3oB,KAAK4oB,uBAAuB9K,GAChDjZ,iBAAkB7E,KAAK6E,mBAG3B,OAAO7E,KAAKT,MAAM6P,WAAWrB,GAwBzB6R,uBACJ5f,KAAKyf,SAAS,CACVC,qBAAqB,IAQrB+H,4BAAyB,IAAAoB,EAAAC,EAC7B,MAAMjhB,EAA2B,QAAvBghB,EAAG7oB,KAAKT,MAAMwB,KAAK8G,YAAI,IAAAghB,OAAA,EAApBA,EAAsB5nB,OACnC,OAAIkW,mBAAiBC,kBAAkBvP,KAASA,EAAK1G,mBAKjDkZ,YAAiBra,KAAKT,MAAMsC,QAAQuH,cAAckR,iBAClDta,KAAKT,MAAMwB,KAAK6T,eAAe3T,QAC/BgR,kBAAgBC,YAAqB,QAAV4W,EAACjhB,EAAKA,YAAI,IAAAihB,OAAA,EAATA,EAAWhhB,YACvC9H,KAAKT,MAAMwB,KAAK8T,oBAAoB5T,QAYpCmlB,iBACJ,OACIpmB,KAAKT,MAAMiB,OAAOohB,yBEzZCriB,KAC3B,MAAM,GACFyC,EAAE,mBACF+mB,EAAkB,WAClBC,EACA7mB,WAAW,kBAAE8mB,EAAiB,sBAAEC,GAAuB,mBACvDC,EAAkB,cAClBC,GACA7pB,EAEJ,IAAK0S,kBAAgBC,YAAY8W,GAC7B,OAGJ,MAAMK,EAAarnB,EAAH,SACVU,EAAY,sBAClB,MAAO,CACH4mB,wBAAyB,CACrB5mB,UAAW,uBAEf6mB,iBACIlqB,IAAAwmB,cAAAxmB,IAAAmqB,SAAA,KACInqB,IAAAwmB,cAAA,QAAMnjB,UAAU,uBAChBrD,IAAAwmB,cAAA,Y,IAAQtmB,EAAM4C,UAAUsnB,yBAGhCC,oBACIrqB,IAAAwmB,cAAA,KAAGnjB,UAAU,2BAA2BinB,SAAU,EAAGlmB,KAAK,OAAO0B,QAASikB,GACrE,IACAH,E,IAAoB,KAG7BW,gBACIvqB,IAAAwmB,cAACgE,QAAK,CAACC,OAAQf,EAAoBrmB,UAAW,GAAGA,EAAaqnB,OAAQZ,GAClE9pB,IAAAwmB,cAACmE,cAAW,CAACtnB,UAAcA,EAAH,mBAAgCqnB,OAAQZ,GAC5D9pB,IAAAwmB,cAAA,MAAI7jB,GAAIqnB,EAAS3mB,UAAU,mCACtBwmB,IAGT7pB,IAAAwmB,cAACoE,YAAS,CAACvnB,UAAcA,EAAH,kBAClBrD,IAAAwmB,cAAA,UACKmD,EAAW/kB,IAAIimB,IAAa,IAAAC,EACzB,OACI9qB,IAAAwmB,cAAA,MAAInjB,UAAU,iCAAiCuQ,IAAKiX,EAAWxZ,QACtC,QAD4CyZ,EAChED,EAAWE,iBAAS,IAAAD,OAAA,EAApBA,EAAsBE,U,IAAY,SAMvDhrB,IAAAwmB,cAACyE,cAAW,CAAC5nB,UAAcA,EAAH,wBFwW5B6nB,CAAe,CACXvoB,GAAIhC,KAAKuf,iBACTwJ,mBAAoB/oB,KAAKgN,MAAM0S,oBAC/B0J,cAAeppB,KAAKwf,mBACpB2J,mBAAoBnpB,KAAK2f,0BACzBqJ,WAAYhpB,KAAKgN,MAAM8R,cAAcI,iBACrC/c,UAAW,CACPsnB,uBAAwBzpB,KAAKT,MAAM4C,UAAUsnB,uBAC7CR,kBAAmBjpB,KAAKT,MAAM4C,UAAU8mB,kBACxCC,sBAAuBlpB,KAAKT,MAAM4C,UAAU+mB,sBAC5CsB,8BAA+BxqB,KAAKT,MAAM4C,UAAUqoB,iCAW5D5E,wCACJ9H,EACA2M,GAEA,MAAM,UAAEtoB,GAAcnC,KAAKT,MAE3B,GACI0S,kBAAgBC,YAAY4L,KAC3B2M,EAAkCrH,SACnCnR,kBAAgBC,YAAYuY,EAAkCpH,qBAE9D,IAAK,MAAMqH,KAAsBD,EAAkCpH,oBAAqB,CACpF,MAAMrb,EAAW8V,aAAS,EAATA,EAAWtc,KAAKmpB,IAAO,IAAAC,EAAA,OAAgB,QAAZA,EAAAD,EAAQ5pB,YAAI,IAAA6pB,OAAA,EAAZA,EAAc5a,SAAS4H,aAAc8S,IAC7E1iB,IACAA,EAASjG,MAAQI,EAAU0oB,uBAC3B7iB,EAAS0F,UAAW,IAW5Bkb,uBAAuB9K,GAC3B,MAAMgN,EACDhN,GACGA,EACK7Z,IAAI+L,IAAW,IAAA+a,EAIZ,MAFmC,QAAbA,EAAA/a,EAASjP,YAAI,IAAAgqB,GAAS,QAATA,EAAbA,EAAehb,eAAO,IAAAgb,OAAA,EAAtBA,EAAwB1U,iBAAkBC,sBAAoBC,UAE9DvG,EAASjO,MAAO,KAAAipB,EAClC,MAAMC,EACFjb,EAASjP,MAA6B,QAAzBiqB,EAAIhb,EAASjP,KAAKgP,eAAO,IAAAib,GAArBA,EAAuB1d,KAClC,GAAG0C,EAASjP,KAAKgP,QAAQzC,SAAS0C,EAASjO,QAC3CiO,EAASjO,MAEnB,OACI1C,IAAAwmB,cAAA,OAAK5S,IAAKgY,EAAWvoB,UAAU,mBAC1BuoB,GAKb,OAAO,OAEVljB,OAAQqc,KAAgCA,IACjD,GAEJ,MAAO,CACH8G,QAAS,CACL1nB,IAAK2nB,QACLzoB,UAAW,YACXonB,OAAQgB,EAAUzpB,OAAS,EAC3B4D,MAAO,SACPmmB,WAAW,EACX,aAAcprB,KAAKT,MAAM4C,UAAUkpB,8BAEvCC,OACIjsB,IAAAwmB,cAAA,OAAKnjB,UAAU,oBAAmB,cAAa,QAC3CrD,IAAAwmB,cAAA,QAAMnjB,UAAU,6BAChBrD,IAAAwmB,cAAA,YAAO7lB,KAAKT,MAAM4C,UAAUkpB,+BAGpCE,OAAQT,GAIRjG,0CACJ,GAAI2G,YAAaxrB,KAAKT,MAAMsC,QAAQU,SAAU,KAAAkpB,EAC1C,MAAMC,EAAe1rB,KAAKT,MAAMwB,KAAK8T,sBAA0D,QAAvC4W,EAAIzrB,KAAKT,MAAMwB,KAAK8T,2BAAmB,IAAA4W,OAAA,EAAnCA,EAAqCxqB,QACjG,SAASyqB,GAAkBA,EAAaC,uBAAsD,IAA7BD,EAAaE,aAGlF,OAAO,EAOHhF,8BACJ,MACI7lB,MACI8G,MAAQ5G,OAAQ4G,IACnB,UACD/F,EAAS,UACTK,GACAnC,KAAKT,MAET,OAAOsI,WAAM1G,eACP0qB,YAAe,CACXC,gBAAiB3pB,EAAU4pB,iBAC3BC,aAAc7pB,EAAU6pB,aACxBnkB,KAAMA,EAAKA,KACXhG,QAAS7B,KAAKT,MAAMsC,QACpBI,SAAUjC,KAAKT,MAAM0C,SACrBH,YACAE,GAAIhC,KAAKT,MAAMyC,UAEnB5B,EAOFsmB,4BAAyB,IAAAuF,EAAAC,EAAAC,EAC7B,MACIprB,MACI8G,MAAQ5G,OAAQ4G,GAAM,4BACtBhB,GACH,UACD/E,EAAS,UACTK,GACAnC,KAAKT,MAEHsjB,EAAuB7iB,KAAKT,MAAMsC,SAAW7B,KAAKT,MAAMsC,QAAQU,SAAWvC,KAAKT,MAAMsC,QAAQU,QAAQC,QAEtG4K,EAAyB,QAAb6e,EAAGjsB,KAAKT,aAAK,IAAA0sB,GAAM,QAANA,EAAVA,EAAYlrB,YAAI,IAAAkrB,OAAA,EAAhBA,EAAkB7e,aACjCxN,EAAoCwN,SAAoB,QAAR8e,EAAZ9e,EAAcnM,cAAM,IAAAirB,GAA2D,QAA3DA,EAApBA,EAAsB1qB,KAAK4c,GAF/B,oEAEuCA,EAAK9Q,aAAuC,IAAA4e,OAAA,EAA/EA,EACpC3e,UAEA6e,GAA+G,KAAjD,QAArCD,EAAAnsB,KAAKT,MAAMsC,QAAQU,QAAQwa,IAAIvc,cAAM,IAAA2rB,OAAA,EAArCA,EAAuCE,4CAEtE,OAAOxJ,IAAwB5Q,kBAAgBC,YAAYrK,aAAI,EAAJA,EAAMA,KAAKC,YAAeD,WAAM1G,oBAqBrFf,EApBAksB,YAAa,CACTzkB,KAAMA,EAAMA,KACZ0kB,cAAepqB,EAAUqqB,oBACzBC,cAAetqB,EAAUuqB,uBACzBC,iBAAkBxqB,EAAUyqB,aAC5BC,SAAU1qB,EAAU2qB,kBACpBhB,gBAAiB3pB,EAAU4qB,WAC3BC,oBAAqB7qB,EAAU6qB,oBAC/BnrB,QAAS7B,KAAKT,MAAMsC,QACpBI,SAAUjC,KAAKT,MAAM0C,SACrBD,GAAIhC,KAAKT,MAAMyC,GACfirB,mBAAoB9qB,EAAU+qB,sBAC9BC,SAAUhrB,EAAUD,UACpB2gB,uBACAjjB,oCACAiH,4BAA6BA,aAA2B,EAA3BA,EAA6B5F,OAC1Da,YACAsrB,qBAAsBvlB,EAAMA,KAAKwlB,qBACjCC,iBAAkBlB,IASxBjG,gBACJ,MACIplB,MACI8G,MAAQ5G,OAAQ4G,IACnB,UACD1F,GACAnC,KAAKT,MAET,OACIsI,GACIxI,IAAAwmB,cAAC0H,qBAAkB,CACf1lB,KAAMA,EACN2lB,qBAAsBrrB,EAAUqrB,qBAChCC,qBAAsBtrB,EAAUsrB,qBAChCC,yBAA0BvrB,EAAUurB,yBACpCC,4BAA6BxrB,EAAUwrB,4BACvCC,gBAAiB,IACjBvH,2BAA4BlkB,EAAUkkB,2BACtCwH,gBAAiB1rB,EAAU0rB,gBAC3BC,0BAA2B3rB,EAAU2rB,0BACrCC,8BAA+B5rB,EAAU4rB,8BACzCC,iCAAkC7rB,EAAU6rB,iCAC5CC,4BAA6B9rB,EAAU+rB,4BACvCrsB,QAAS7B,KAAKT,MAAMsC,QACpBG,GAAIhC,KAAKT,MAAMyC,GACfC,SAAUjC,KAAKT,MAAM0C,SACrBlB,KAAM,GACN8D,iBAAkB7E,KAAK6E,mBAW/B8iB,2CAA2CxlB,GAC/C,MAAO,CACHgsB,yBAA0BhsB,EAAUgsB,yBAEpCC,wBAAyBjsB,EAAUisB,wBACnCC,4BAA6BlsB,EAAUksB,4BAEvCC,gCAAiCnsB,EAAUmsB,gCAC3CC,iCAAkCpsB,EAAUosB,iCAC5CC,sCAAuCrsB,EAAUqsB,sCAEjDC,oBAAqBtsB,EAAUssB,oBAC/BC,wBAAyBvsB,EAAUusB,wBACnCC,cAAexsB,EAAUwsB,eASzBC,iDAAiDzsB,GACrD,MAAO,CACH0sB,4BAA6B1sB,EAAU0sB,4BACvCC,2BAA4B3sB,EAAU2sB,2BACtCC,0CAA2C5sB,EAAU4sB,0CACrDC,6CAA8C7sB,EAAU6sB,6CACxDC,0CAA2C9sB,EAAU8sB,0CACrD/rB,cAAef,EAAUe,cACzBgsB,kBAAmB/sB,EAAU+sB,kBAC7BC,iBAAkBhtB,EAAUgtB,kBAS5BrH,kDAAkD3lB,GACtD,MAAO,CACH0sB,4BAA6B1sB,EAAU0sB,4BACvCC,2BAA4B3sB,EAAU2sB,2BACtCM,4CAA6CjtB,EAAUitB,4CACvDC,+CAAgDltB,EAAUktB,+CAC1DC,4CAA6CntB,EAAUmtB,4CACvDC,+CAAgDptB,EAAUotB,+CAC1DC,2CAA4CrtB,EAAUqtB,2CACtDC,qDAAsDttB,EAAUstB,sDAShE1H,gEACJ5lB,GAEA,MAAO,CACHutB,yBAA0BvtB,EAAUutB,yBACpCC,8BAA+BxtB,EAAUwtB,8BACzCC,yBAA0BztB,EAAUytB,yBACpCC,+BAAgC1tB,EAAU0tB,gCAS1CjI,0CAA0CzlB,GAC9C,MAAO,CACH2tB,yBAA0B3tB,EAAU4tB,0BACpCC,wBAAyB7tB,EAAU8tB,mBACnCC,2BAA4B/tB,EAAU+tB,2BACtCC,yBAA0BhuB,EAAUiuB,+BAEpCC,yBAA0BluB,EAAUkuB,yBAEpCC,yBAA0BnuB,EAAUouB,8BACpCC,+BAAgCruB,EAAUsuB,0CAQ1C9N,gBAAa,IAAA+N,EAAAC,EACjB,MACI5vB,MACI8G,MAAQ5G,OAAQ4G,GAChBiN,WAAa7T,OAAQ6T,GACrBF,gBAAkB3T,OAAQ2T,GAC1BC,qBAAuB5T,OAAQ4T,IAEnChT,SACIU,SAAWC,SAAS,uBAAEkF,GAA2B,CAAEA,4BAAwBtH,KAC9E,OACDI,EAAM,UACNsB,EAAS,UACTK,EAAS,QACTyuB,GACA5wB,KAAKT,MAEHwU,EAAgB/T,KAAK6f,iBAAiBrf,EAAOuT,eAE7CgR,EAAsE,QAAtC2L,EAAG1wB,KAAKT,MAAMwB,KAAKqM,aAAanM,cAAM,IAAAyvB,OAAA,EAAnCA,EAAqClvB,KAC1E4L,GAAsC,oEAAtBA,EAAaE,MAE3B0X,EAAwBD,aAAgC,EAAhCA,EAAkCxX,UAE1D8K,EAAqDrY,KAAKgN,MAAMqL,gBACtE,IAAIwY,EAA0B,GAC1BD,GAAW/tB,OAAO8b,KAAKiS,GAASvvB,OAAS,GAAKuvB,EAAQvI,eAAiBuI,EAAQvI,cAAchnB,OAAS,IACtGwvB,EAAkBD,EAAQvI,cAAc,GAAGrmB,IAG/C,MAAM4gB,EAAgB5iB,KAAKT,MAAMwB,KAAK8hB,qBAAqB5hB,QACxDjB,KAAKT,MAAMwB,KAAK8hB,qBAAqB5hB,OAAOgK,qBAC5CjL,KAAKT,MAAMwB,KAAK8hB,qBAAqB5hB,OAAQgK,oBAAoBzJ,KAAM0J,GAA6B,cAAjBA,EAASC,KAE/F,IAAI2X,EAAYF,GAAiBA,EAAcxX,OAASwX,EAAcxX,MAAM2L,aAK5E,OAJiB3W,MAAb0iB,IACAA,EAAY,GAGT7Q,kBAAgBC,YAAYrK,aAAI,EAAJA,EAAMA,KAAKC,WHpPxBvI,KAC1B,MAAM,SAAE4d,EAAQ,UAAED,GAAc3d,EAChC,OAAO0d,EAAkBC,EAAWC,EAAU5d,IGmPpCuxB,CAAc,CACV5T,UAAWrV,EAAMA,KAAKC,UACtBmI,sBAAuB4gB,EACvBxY,kBACA8E,SAAUnd,KAAKT,MAAMwB,KAAKoc,SAASlc,OACnCyW,qBAAsB1X,KAAKT,MAAMwB,KAAK2W,qBAAqBzW,OAC3D8vB,uBAAwB/wB,KAAKT,MAAMwB,KAAKrB,gBAAgBuB,OACxDia,SAAkC,QAA1ByV,EAAE3wB,KAAKT,MAAMwB,KAAKma,gBAAQ,IAAAyV,OAAA,EAAxBA,EAA0B1vB,OACpC8S,gBACAsB,oBAAqBrV,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO2iB,mBAAoB,EACvElN,oBAAqB+a,2CAAiChxB,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAOywB,4BACpFtZ,sBAA8E,aAAvD3X,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO0wB,qBACrDld,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCnS,QAAS7B,KAAKT,MAAMsC,QACpBI,SAAUjC,KAAKT,MAAM0C,SACrBD,GAAIhC,KAAKT,MAAMyC,GACfyP,iCAAkCuT,EAClC7iB,UAAW,CACPgvB,WAAY,QACZC,YAAajvB,EAAUkvB,0BACvBC,aAAcnvB,EAAUovB,kCACxBC,YAAarvB,EAAUsvB,0BACvBC,aAAcvvB,EAAUwvB,2BACxBC,sBAAuBzvB,EAAU0vB,oBACjCC,uBAAwB3vB,EAAU2vB,uBAClCC,yBAA0B5vB,EAAU4vB,yBACpCC,yBAA0B7vB,EAAU6vB,yBACpCC,mBAAoB9vB,EAAU8vB,mBAC9B/C,kBAAmB/sB,EAAU+sB,kBAC7BC,iBAAkBhtB,EAAUgtB,iBAC5B+C,oBAAqB/vB,EAAUgwB,gBAC/BC,0BAA2BjwB,EAAUiwB,0BACrCC,qBAAoBrkB,EAAA,GACb7L,IAGXL,YACA4S,wBAAyBvS,EAAUuS,wBACnCC,6BAA8BxS,EAAUwS,6BACxCV,iBAAkB9R,EAAUmwB,qBAC5B9f,WAAYrQ,EAAUowB,uBACtBxW,aAAc5Z,EAAUqwB,oBACxB9f,gBAAiBvQ,EAAUswB,uBAC3B3iB,0BAA2B9P,KAAKT,MAAMwB,KAAK+O,0BAA0B7O,OACrE+W,eAAgB7V,EAAU0oB,uBAC1B5S,kBAAmB9V,EAAUuwB,8BAC7Bxa,qBAAsB/V,EAAUwwB,6BAChCtqB,UAAWrI,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAChCmQ,iBAAkBpR,KAAKT,MAAMwB,KAAKqQ,iBAAiBnQ,OACnDiT,uBAAwBlU,KAAKsgB,0BAC7BnM,6BAA8BnU,KAAKmU,6BACnCoH,sCAAuCvb,KAAK8gB,uBAC5ClQ,uBAAwB5Q,KAAKqhB,0BAC7BvM,YACAC,oBAAqB5S,EAAU4S,oBAC/BtN,uBAAwBC,EACxBqQ,cAAevX,EAAOoyB,qBACtB/W,gCAAiCrb,EAAOqb,gCACxChX,iBAAkB7E,KAAK6E,iBACvBiR,+BAAgC9V,KAAK8V,+BAErCxB,kCAAmCtU,KAAK2nB,2CAA2CxlB,GACnFoS,mCAAoCvU,KAAK4nB,0CAA0CzlB,GACnFqS,wCAAyCxU,KAAK4uB,iDAAiDzsB,GAC/FsS,uDAAwDzU,KAAK+nB,gEACzD5lB,GAGJiS,6BAA8BjS,EAAUiS,6BACxCC,gCAAiClS,EAAUkS,gCAC3Cwe,0BAA2B1wB,EAAU0wB,0BACrCC,4BAA6B3wB,EAAU2wB,4BACvCle,iBACAC,sBACAS,oBAAqBtV,KAAKT,MAAMwB,KAAK2W,qBACrC1C,UAAW8N,IAEf,KAUFL,eAAexN,EAA0BoN,EAA0BD,GACvE,GAAInN,EACA,OAAOoN,EAGX,MAAM0Q,EAAgBC,mBAAS3Q,GAC/B,IAAI4Q,EAAY5Q,EAKhB,OAJIlI,IAASC,YAAc2Y,IACvBE,EAAY,GAAGvY,OAAO/J,SAASuiB,SAAS7Q,KAGrC,GAAGD,IAAaA,EAAU+Q,SAAS,KAAa,IAAN,SAAeF,IAiI5D,qBACJ,MACIlyB,MAAM,KAAE8G,GAAM,UACd/F,EAAS,QACTD,GACA7B,KAAKT,MAEH6hB,QAAyEgS,YAE3EvrB,EACA/F,EACAD,GACA,GAGE+gB,EAAgB5iB,KAAKT,MAAMwB,KAAK8hB,qBAAqB5hB,QACxDjB,KAAKT,MAAMwB,KAAK8hB,qBAAqB5hB,OAAOgK,qBAC5CjL,KAAKT,MAAMwB,KAAK8hB,qBAAqB5hB,OAAQgK,oBAAoBzJ,KAAM0J,GAA6B,cAAjBA,EAASC,KAE/F,IAAI2X,EAAYF,GAAiBA,EAAcxX,OAASwX,EAAcxX,MAAM2L,aAQ5E,GAPiB3W,MAAb0iB,IACAA,EAAY,GAEZA,GACA9iB,KAAKyf,SAAS,CAAEiC,aAAa,IAG7BN,EAAmB,CACnB,MAAMgC,GAAWnR,kBAAgBC,YAAYkP,EAAkB9I,wBAC/DtY,KAAKyf,SAAS,CACVpH,gBAAiB+I,EACjBM,YAAa0B,SAGjBpjB,KAAKyf,SAAS,CAAEiC,aAAa,IAGjC,OAAO2R,cAAYviB,UAOf,0CAAuC,IAAAwiB,EAC3C,MAAMC,EAA4D,QAArBD,EAAGtzB,KAAKT,MAAMsC,eAAO,IAAAyxB,GAAS,QAATA,EAAlBA,EAAoB/wB,eAAO,IAAA+wB,GAAK,QAALA,EAA3BA,EAA6BvW,WAAG,IAAAuW,GAAU,QAAVA,EAAhCA,EAAkCE,gBAAQ,IAAAF,OAAA,EAA1CA,EAA4CG,iCAC5F,GAAgD,SAA5CF,EACA,OAAO,EAGX,IAAI,IAAAG,EACA,MAAMC,QAAwB3zB,KAAKT,MAAMwB,KAAKqM,aAK9C,MADK,QAFDsmB,EAAAC,EAAgBnyB,KACZ4L,GAAsC,oEAAtBA,EAAaE,aAChC,IAAAomB,OAAA,EAFDA,EAEGnmB,aAAa,GAEhB,OAAO,EAEb,MAAOxL,GAGL,OAFA/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,iCACpB,EAGX,GAAgD,QAA5C0S,EACA,OAAO,EAEX,IACI,MAAM7H,QAAqB1rB,KAAKT,MAAMwB,KAAK8T,oBAC3C,QACM6W,IAC4C,QAA5C6H,GAAqD7H,EAAakI,OACnB,QAA5CL,IAAsD7H,EAAakI,OAE9E,MAAO7xB,GAGL,OAFA/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,gCACpB,GAQPoE,oBAAiB,IAAA4O,EAAA3mB,EAAA4mB,EAAAC,EAAAC,EACrB,MACIjzB,MACI8G,MAAQ5G,OAAQ4G,GAChBiN,WAAa7T,OAAQ6T,GACrBF,gBAAkB3T,OAAQ2T,GAC1BC,qBAAuB5T,OAAQ4T,IAEnChT,SACIU,SAAWC,SAAS,uBAAEkF,GAA2B,CAAEA,4BAAwBtH,KAC9E,OACDI,EAAM,UACNsB,EAAS,UACTK,EAAS,QACTyuB,GACA5wB,KAAKT,MAEHwU,EAAgB/T,KAAK6f,iBAAiBrf,EAAOuT,eAC7CsE,EAAqDrY,KAAKgN,MAAMqL,gBACtE,IAAIwY,EAA0B,GAC1BD,GAAW/tB,OAAO8b,KAAKiS,GAASvvB,OAAS,GAAKuvB,EAAQvI,eAAiBuI,EAAQvI,cAAchnB,OAAS,IACtGwvB,EAAkBD,EAAQvI,cAAc,GAAGrmB,IAG/C,MAAM+iB,EAAsE,QAAtC8O,EAAG7zB,KAAKT,MAAMwB,KAAKqM,aAAanM,cAAM,IAAA4yB,OAAA,EAAnCA,EAAqCryB,KAC1E4L,GAAsC,oEAAtBA,EAAaE,MAE3B0X,EAAwBD,aAAgC,EAAhCA,EAAkCxX,UAEhE,OAAOvN,KAAKT,MAAMwB,KAAKoc,WAClBtV,WAAM1G,gBAAkBnB,KAAKT,MAAMwB,KAAKoc,SAASlc,SAClD4G,GACAA,EAAKA,KAAKC,WACVD,EAAKA,KAAKC,UAAUzG,OAAS,GACc,QADb6L,EAC9BlN,KAAKT,MAAMwB,KAAK8F,mCAA2B,IAAAqG,GAA3CA,EAA6CjM,OAC3C2c,EAAmB,CACfV,UAAWrV,EAAKA,KAAKC,UACrBmI,sBAAuB4gB,EACvBxY,kBACA8E,SAAUnd,KAAKT,MAAMwB,KAAKoc,SAASlc,OACnCyW,qBAAsB1X,KAAKT,MAAMwB,KAAK2W,qBAAqBzW,OAC3D8vB,uBAAwB/wB,KAAKT,MAAMwB,KAAKrB,gBAAgBuB,OACxDia,SAAkC,QAA1B4Y,EAAE9zB,KAAKT,MAAMwB,KAAKma,gBAAQ,IAAA4Y,OAAA,EAAxBA,EAA0B7yB,OACpC8S,gBACAsB,oBAAqBrV,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO2iB,mBAAoB,EACvEhiB,gBAAgB0G,aAAI,EAAJA,EAAM1G,kBAAkB,EACxC8U,oBAAqB+a,2CAAiChxB,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAOywB,4BACpFjd,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCnS,QAAS7B,KAAKT,MAAMsC,QACpB4P,iCAAkCuT,EAClC/iB,SAAUjC,KAAKT,MAAM0C,SACrBD,GAAIhC,KAAKT,MAAMyC,GACfG,UAAW,CACPgvB,WAAYhvB,EAAU8xB,yBACtB7C,YAAajvB,EAAUkvB,0BACvBC,aAAcnvB,EAAUovB,kCACxBC,YAAarvB,EAAUsvB,0BACvBC,aAAcvvB,EAAUwvB,2BACxBC,sBAAuBzvB,EAAU0vB,oBACjCC,uBAAwB3vB,EAAU2vB,uBAClCC,yBAA0B5vB,EAAU4vB,yBACpCC,yBAA0B7vB,EAAU6vB,yBACpCC,mBAAoB9vB,EAAU8vB,mBAC9B/C,kBAAmB/sB,EAAU+sB,kBAC7BC,iBAAkBhtB,EAAUgtB,iBAC5B+C,oBAAqB/vB,EAAUgwB,gBAC/BC,0BAA2BjwB,EAAUiwB,0BACrCC,qBAAoBrkB,EAAA,GACb7L,IAGXL,YACA4S,wBAAyBvS,EAAUuS,wBACnCC,6BAA8BxS,EAAUwS,6BACxCV,iBAAkB9R,EAAUmwB,qBAC5B9f,WAAYrQ,EAAUowB,uBACtBxW,aAAc5Z,EAAUqwB,oBACxB9f,gBAAiBvQ,EAAUswB,uBAC3B3iB,0BAA2B9P,KAAKT,MAAMwB,KAAK+O,0BAA0B7O,OACrE+W,eAAgB7V,EAAU0oB,uBAC1B5S,kBAAmB9V,EAAUuwB,8BAC7Bxa,qBAAsB/V,EAAUwwB,6BAChCtqB,UAAWrI,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAChCmQ,iBAAkBpR,KAAKT,MAAMwB,KAAKqQ,iBAAiBnQ,OACnDiT,uBAAwBlU,KAAKsgB,0BAC7BnM,6BAA8BnU,KAAKmU,6BACnCoH,sCAAuCvb,KAAK8gB,uBAC5ClQ,uBAAwB5Q,KAAKqhB,0BAC7BvM,YACAC,oBAAqB5S,EAAU4S,oBAC/BtN,uBAAwBC,EACxBqQ,cAAevX,EAAOoyB,qBACtB/W,gCAAiCrb,EAAOqb,gCACxChX,iBAAkB7E,KAAK6E,iBACvBiR,+BAAgC9V,KAAK8V,+BAErCxB,kCAAmCtU,KAAK2nB,2CAA2CxlB,GACnFoS,mCAAoCvU,KAAK4nB,0CAA0CzlB,GACnFqS,wCAAyCxU,KAAK4uB,iDAAiDzsB,GAC/FsS,uDAAwDzU,KAAK+nB,gEACzD5lB,GAGJiS,6BAA8BjS,EAAUiS,6BACxCC,gCAAiClS,EAAUkS,gCAC3Cwe,0BAA2B1wB,EAAU0wB,0BACrCC,4BAA6B3wB,EAAU2wB,4BACvCle,iBACAC,sBACAhO,4BAAwE,QAA7CktB,EAAE/zB,KAAKT,MAAMwB,KAAK8F,mCAA2B,IAAAktB,OAAA,EAA3CA,EAA6C9yB,OAC1E0W,sBAA8E,aAAvD3X,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO0wB,qBACrD5b,oBAAqBtV,KAAKT,MAAMwB,KAAK2W,qBACrChE,qBAAsB1T,KAAKgN,MAAM0G,uBAA8D,QAA1CsgB,EAAIh0B,KAAKT,MAAMwB,KAAKmzB,8BAAsB,IAAAF,OAAA,EAAtCA,EAAwC/yB,UAErG,OA3kCRme,EAAI/P,YAAA,CADTK,KACK0P,GA+kCSA,a,qPGlqCT,MAAO+U,UAAiB90B,gBAsB1BC,YAAYC,GACRC,MAAMD,GAtBF,KAAA60B,eAAiC,IAAIC,IAAer0B,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO8zB,yBAEnF,KAAAtnB,MAAwB,CAC3BqL,gBAAiB,IAGb,KAAAkc,iBAAoB3wB,GAGL,GAAGA,YAFF4wB,UAAU9Z,OAAO/J,SAAS8jB,qBAC/B/Z,OAAO/J,SAASuiB,SAK3B,KAAAwB,WAAc9wB,IAClB5D,KAAKo0B,eAAeO,MAAM30B,KAAKu0B,iBAAiB3wB,KAI5C,KAAAkS,gCAA0C,EAkL1C,KAAA8e,kBAAqB7gB,GAClBA,GAAiB,CACpB+L,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCG,UAAU,GAIV,KAAAwU,2BAA8BtU,IAClC,GAAIvgB,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAQ,CAC7B,MAAMuf,EAAQ,CACVC,YAAa,CAACF,EAAiB7P,OAAQkG,aAE3C5W,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAOyf,gBAAgBF,GACvCzZ,KAAK,KACF/G,KAAK80B,gBACAttB,MAAOzF,IACJ/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,+BAGtCrZ,MAAOzF,IACJ/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,kCAKnC,KAAAkU,8BAAgC,CAAC9zB,EAAsC+O,KACrD,UAAlB/O,EAAOV,QAAsByP,GAC7BhQ,KAAK60B,2BAA2B7kB,IAIhC,KAAAglB,wBAA0B,CAACjU,EAA4BnE,KAC3D,GAAI5c,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAQ,CAC7B,MAAMuf,EAAQ,CACV/P,WAAYsQ,EAAiBrQ,OAAQkG,WACrCqe,YAAarY,EACbsY,qBAAsB,CAAEC,oCAAqCn1B,KAAK8V,iCAEtE9V,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAOm0B,uBAAuB5U,GAC9CzZ,KAAM9F,GACmB,YAAlBA,EAAOV,SACPP,KAAK80B,gBAAgBttB,MAAOzF,IACxB/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,8BAExB,IAIdrZ,MAAOzF,IACJ/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,yCAIvC,OAAO,GAGH,KAAAwU,2BAA6B,KACjCr1B,KAAK80B,gBAAgBttB,MAAOzF,IACxB/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,8BA/O/B7gB,KAAKs1B,iBAAmBt1B,KAAKs1B,iBAAiB7T,KAAKzhB,MAGhD,0BAIHA,KAAK8V,qCAAuC9V,KAAK2hB,oCAC7C3hB,KAAK8V,sCACC9V,KAAK80B,gBAGf90B,KAAK00B,WAAW,uBAGbznB,SACH,OACI5N,gBAAA,MAAAwD,OAAAC,OAAA,CAAKJ,UAAW1C,KAAKT,MAAMmD,UAAWV,GAAIhC,KAAKT,MAAMyC,IAAQhC,KAAKT,MAAMg2B,uBAAuBv1B,KAAKT,QAC/FS,KAAKT,MAAMmE,MACZrE,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAK9C,KAAKT,MAAMwmB,kBAChB/lB,KAAKs1B,oBAETt1B,KAAKT,MAAM+mB,qBACRjnB,gBAAEm2B,OAAI3yB,OAAAC,OAAA,GAAK9C,KAAKT,MAAMymB,qBACjBhmB,KAAKT,MAAM+mB,oBACXmP,EAAyBz1B,KAAKT,MAAMknB,sBAAuBzmB,KAAKT,MAAM0mB,kBAAmBjmB,KAAKT,OAC9FS,KAAKgN,MAAMqL,gBAAgBhX,OAAS,EAAIq0B,EAAkB11B,KAAKT,MAAMopB,oBAAsB,KAC3FgN,EAAqB31B,KAAKT,OAC1BS,KAAKT,MAAMiB,OAAOo1B,uBAAyBv2B,gBAAA,OAAKqD,UAAU,wBAAwB1C,KAAKT,MAAMiB,OAAOo1B,wBAAgC,KACrIv2B,gBAAA,OAAKqD,UAAW,wBACX1C,KAAKT,MAAMsnB,2BACX7mB,KAAKT,MAAMsC,QAAQU,SAAWvC,KAAKT,MAAMsC,QAAQU,QAAQ2S,MAAQlV,KAAKT,MAAMsC,QAAQU,QAAQ2S,KAAKD,gBAAkB,KAAO5V,gBAAA,OAAKqD,UAAU,+BAA+B1C,KAAKT,MAAM4C,UAAU0zB,SAC9Lx2B,gBAAA,OAAKqD,UAAW,oCAuWPP,EAtWwBnC,KAAKT,MAAM4C,UAwWhE9C,gBAAC2F,SAAM,CACHtC,UAAW,+BACXyC,QAAS2wB,GAER3zB,EAAUolB,4BA3WUvnB,KAAKT,MAAMwnB,yBAK3B/mB,KAAKT,MAAM8oB,eAgW5B,IAAqClmB,EA3VzBmzB,mBACJ,MAAM,cAAES,GAAkB/1B,KAAKT,MAAM4C,UAErC,GAAInC,KAAKT,MAAMgpB,kBACX,OAAOlpB,2BAAA,KAAGW,KAAKT,MAAMgpB,mBAEzB,MAAMzK,EAAY9d,KAAK2iB,gBACvB,OAAI7E,EACOA,EAAU7Z,IAAI,CAAC+D,EAAU9D,IAExB7E,gBAAA,OAAKqD,UAAU,sBAAsBuQ,IAAK/O,GACrC8D,EAASgI,SACTgmB,EAAkBhuB,EAAUhI,KAAKT,MAAM4C,UAAWnC,KAAKT,MAAM8oB,eAC9DhpB,gBAAA,OAAKqD,UAAU,+BACVsF,EAASiU,cACTjU,EAASgU,UAMlBhc,KAAKT,MAAMkpB,eAEXppB,gBAAA,OAAKqD,UAAU,wBACXrD,gBAAA,KAAGqD,UAAU,iBAAiBqzB,GAC7B/1B,KAAKT,MAAM+nB,sBAEhBjoB,2BAAA,KAAGW,KAAKT,MAAM+oB,kBAKtB3F,gBACJ,MACI5hB,MACI8G,MAAQ5G,OAAQ4G,GAChBiN,WAAa7T,OAAQ6T,GACrBF,gBAAkB3T,OAAQ2T,GAC1BC,qBAAuB5T,OAAQ4T,IAEnChT,SACIU,SACIC,SAAS,uBACLkF,GACA,CAAEA,4BAAwBtH,KAGtCI,OAAQA,EAAM,UACdsB,EAAS,UACTK,EAAS,QACTyuB,GACA5wB,KAAKT,MAEHwU,EAAgB/T,KAAK40B,kBAAkBp0B,EAAOuT,eAE9CsE,EAA+CrY,KAAKgN,MAAMqL,gBAChE,IAAIwY,EAA0B,GAI9B,OAHID,GAAW/tB,OAAO8b,KAAKiS,GAASvvB,OAAS,GAAKuvB,EAAQvI,eAAiBuI,EAAQvI,cAAchnB,OAAS,IACtGwvB,EAAkBD,EAAQvI,cAAc,GAAGrmB,IAExChC,KAAKT,MAAMwB,KAAKoc,UAAYnd,KAAKT,MAAMwB,KAAKoc,SAASlc,QAAU4G,GAAQA,EAAKA,KAAKC,WAAaD,EAAKA,KAAKC,UAAUzG,OAAS,EAC9HyvB,YAAc,CACV5T,UAAWrV,EAAKA,KAAKC,UACrBmI,sBAAuB4gB,EACvBxY,gBAAiBA,EACjB8E,SAAUnd,KAAKT,MAAMwB,KAAKoc,SAASlc,OACnCyW,qBAAsB1X,KAAKT,MAAMwB,KAAK2W,qBAAqBzW,OAC3D8vB,uBAAwB/wB,KAAKT,MAAMwB,KAAKrB,gBAAgBuB,OACxD8S,cAAeA,EACfsB,oBAAqBrV,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO2iB,mBAAoB,EACvElN,oBAAqBjW,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAOywB,2BACnDjd,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCnS,QAAS7B,KAAKT,MAAMsC,QACpBI,SAAUjC,KAAKT,MAAM0C,SACrBD,GAAIhC,KAAKT,MAAMyC,GACfG,UAAW,CACPgvB,WAAYhvB,EAAU8xB,yBACtB7C,YAAa,UACbE,aAAcnvB,EAAUovB,kCACxBC,YAAarvB,EAAUsvB,0BACvBG,sBAAuBzvB,EAAU0vB,oBACjCC,uBAAwB3vB,EAAU2vB,uBAClCC,yBAA0B5vB,EAAU4vB,yBACpCC,yBAA0B7vB,EAAU6vB,yBACpCC,mBAAoB9vB,EAAU8vB,mBAC9B/C,kBAAmB/sB,EAAU+sB,kBAC7BC,iBAAkBhtB,EAAUgtB,iBAC5B+C,oBAAqB/vB,EAAUgwB,iBAEnCrwB,UAAWA,EACX4S,wBAAyBvS,EAAUuS,wBACnCC,6BAA8BxS,EAAUwS,6BACxCV,iBAAkB9R,EAAUmwB,qBAC5B9f,WAAYrQ,EAAUowB,uBACtBxW,aAAc5Z,EAAUqwB,oBACxB9f,gBAAiBvQ,EAAUswB,uBAC3B3iB,0BAA2B9P,KAAKT,MAAMwB,KAAK+O,0BAA0B7O,OACrE+W,eAAgB7V,EAAU0oB,uBAC1B5S,kBAAmB9V,EAAUuwB,8BAC7Bxa,qBAAsB/V,EAAUwwB,6BAChCtqB,UAAWrI,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAChCmQ,iBAAkBpR,KAAKT,MAAMwB,KAAKqQ,iBAAiBnQ,OACnDiT,uBAAwBlU,KAAK60B,2BAC7B1gB,6BAA8BnU,KAAK+0B,8BACnCxZ,sCAAuCvb,KAAKg1B,wBAC5CpkB,uBAAwB5Q,KAAKq1B,2BAC7BvgB,UAAWA,EACXC,oBAAqB5S,EAAU4S,oBAC/BtN,uBAAwBC,EACxBqQ,cAAevX,EAAOoyB,qBACtB/W,gCAAiCrb,EAAOqb,gCACxChX,iBAAkB7E,KAAKT,MAAMsF,iBAC7BiR,+BAAgC9V,KAAK8V,+BAErCxB,kCAAmCtU,KAAK2nB,2CAA2CxlB,GACnFoS,mCAAoCvU,KAAK4nB,0CAA0CzlB,GACnFqS,wCAAyCxU,KAAK4uB,iDAAiDzsB,GAC/FsS,uDAAwDzU,KAAK+nB,gEAAgE5lB,GAE7HiS,6BAA8BjS,EAAUiS,6BACxCye,0BAA2B1wB,EAAU0wB,0BACrCC,4BAA6B3wB,EAAU2wB,4BACvCle,eAAgBA,EAChBC,oBAAqBA,IAEzB,KA8EA,0CAAuC,IAAAye,EAC3C,MAAMC,EAA4D,QAArBD,EAAGtzB,KAAKT,MAAMsC,eAAO,IAAAyxB,GAAS,QAATA,EAAlBA,EAAoB/wB,eAAO,IAAA+wB,GAAK,QAALA,EAA3BA,EAA6BvW,WAAG,IAAAuW,GAAU,QAAVA,EAAhCA,EAAkCE,gBAAQ,IAAAF,OAAA,EAA1CA,EAA4CG,iCAC5F,GAAgD,SAA5CF,EACA,OAAO,EAGX,IAAI,IAAAG,EACA,MAAMC,QAAwB3zB,KAAKT,MAAMwB,KAAKqM,aAK9C,MADK,QAFDsmB,EAAAC,EAAgBnyB,KACZ4L,GAAsC,oEAAtBA,EAAaE,aAChC,IAAAomB,OAAA,EAFDA,EAEGnmB,aAAa,GAEhB,OAAO,EAEb,MAAOxL,GAGL,OAFA/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,iCACpB,EAGX,GAAgD,QAA5C0S,EACA,OAAO,EAEX,IACI,MAAM7H,QAAqB1rB,KAAKT,MAAMwB,KAAK8T,oBAC3C,QACM6W,IAC4C,QAA5C6H,GAAqD7H,EAAakI,OACnB,QAA5CL,IAAsD7H,EAAakI,OAE9E,MAAO7xB,GAGL,OAFA/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,gCACpB,GAIP,sBAAyC,IAAAoV,EAAA,IAArBC,IAAAC,UAAA90B,OAAA,QAAAjB,IAAA+1B,UAAA,KAAAA,UAAA,GACxB,IAAKn2B,KAAK8V,+BACN,OAAOud,cAAYviB,UAGvB,MACI/P,MAAQ8G,KAAMA,IACd7H,KAAKT,MACT,IAAI62B,EACJ,IACIA,QAAmBvuB,EACrB,MAAO9F,GAGL,OAFA/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,sBACpBwS,cAAYviB,UAEvB,MAAMulB,EAA6B,QAAlBJ,EAAGG,EAAWvuB,YAAI,IAAAouB,OAAA,EAAfA,EAAiBK,QACrC,IAAID,EA8BA,OADAr2B,KAAKT,MAAMuC,UAAU8e,QAAQ,uDACtByS,cAAYviB,UA7BnB,IAAI,IAAAylB,EACA,MAAMC,QAAoDC,mCAAyB,CAAEttB,cAAenJ,KAAKT,MAAMsC,QAAQuH,eAA2B,QAAZmtB,EAAEH,SAAU,IAAAG,GAAM,QAANA,EAAVA,EAAY1uB,YAAI,IAAA0uB,OAAA,EAAhBA,EAAkBhuB,GAAI8tB,GAE9J,OADAr2B,KAAKyf,SAAS,CAAEpH,gBAAiBme,EAAiBE,+BAAiC,KAC5ErD,cAAYviB,UACrB,MAAO/O,GACL,GAAIm0B,GAAwB,2DAAfn0B,EAAMgR,KAAmE,CAClF,UACUqjB,EAAWO,YAAY,IAC/B,MAAOC,GAGL,OAFA52B,KAAKT,MAAMuC,UAAU8e,QAAQgW,GAC7B52B,KAAKT,MAAMuC,UAAU+e,MAAM,0BACpBwS,cAAYviB,UAEvB,IAEI,aADM9Q,KAAK80B,eAAc,GAClBzB,cAAYviB,UACrB,MAAO+lB,GAGL,OAFA72B,KAAKT,MAAMuC,UAAU8e,QAAQiW,GAC7B72B,KAAKT,MAAMuC,UAAU+e,MAAM,2BACpBwS,cAAYviB,WAM3B,OAFA9Q,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,2BACpBwS,cAAYviB,WAQvB6W,2CAA2CxlB,GAC/C,MAAO,CACHgsB,yBAA0BhsB,EAAUgsB,yBAEpCC,wBAAyBjsB,EAAUisB,wBACnCC,4BAA6BlsB,EAAUksB,4BAEvCC,gCAAiCnsB,EAAUmsB,gCAC3CC,iCAAkCpsB,EAAUosB,iCAC5CC,sCAAuCrsB,EAAUqsB,sCAEjDC,oBAAqBtsB,EAAUssB,oBAC/BC,wBAAyBvsB,EAAUusB,wBACnCC,cAAexsB,EAAUwsB,eAIzBC,iDAAiDzsB,GACrD,MAAO,CACH0sB,4BAA6B1sB,EAAU0sB,4BACvCC,2BAA4B3sB,EAAU2sB,2BACtCC,0CAA2C5sB,EAAU4sB,0CACrDC,6CAA8C7sB,EAAU6sB,6CACxDC,0CAA2C9sB,EAAU8sB,0CACrD/rB,cAAef,EAAUe,cACzBgsB,kBAAmB/sB,EAAU+sB,kBAC7BC,iBAAkBhtB,EAAUgtB,kBAI5BpH,gEAAgE5lB,GACpE,MAAO,CACHutB,yBAA0BvtB,EAAUutB,yBACpCC,8BAA+BxtB,EAAUwtB,8BACzCC,yBAA0BztB,EAAUytB,yBACpCC,+BAAgC1tB,EAAU0tB,gCAI1CjI,0CAA0CzlB,GAC9C,MAAO,CACH2tB,yBAA0B3tB,EAAU4tB,0BACpCC,wBAAyB7tB,EAAU8tB,mBACnCC,2BAA4B/tB,EAAU+tB,2BACtCC,yBAA0BhuB,EAAUiuB,+BAEpCC,yBAA0BluB,EAAUkuB,yBAEpCC,yBAA0BnuB,EAAUouB,8BACpCC,+BAAgCruB,EAAUsuB,2CAiBtD,SAASqF,IACLpb,OAAOoc,QAAQC,OAdJ5C,YAiBf,MAAM6B,EAAoBA,CAAChuB,EAA+B7F,EAA2BkmB,KACjF,IAAKrgB,EAAS8T,gBAAkBuM,EAC5B,OAAO,KAGX,MAAM,uBAAEkK,EAAsB,yBAAEyE,EAAwB,oBAAExE,EAAmB,8BAAEyE,EAA6B,uBAAExE,GAA2BtwB,EAEnI0N,EAAkB7H,EAAS8T,cAAcjM,gBAI/C,OACIxQ,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKkF,EAAS8T,cAAcvI,gBAC7BlU,gBAAA,OAAKqD,UAAU,+BACVmN,EAAkBxQ,gBAAA,QAAMqD,UAAU,WAAWu0B,GAAwC53B,gBAAA,QAAMqD,UAAU,QAAQs0B,IAG9GnnB,GACAxQ,gBAAA,OAAKqD,UAAU,oCACXrD,gBAAA,QAAMqD,UAAU,0CAA0CsF,EAAS8T,cAAcnJ,aACjFtT,gBAAC2F,SAAM,CAACtC,UAAU,mCAAmCyC,QAXhDsF,GAAkDzC,EAAS8T,eAAiB9T,EAAS8T,cAAc1J,UAAUC,aAAY,IAWlDogB,IAGpFpzB,gBAAC2F,SAAM,CAACtC,UAAU,2BAA2ByC,QAfhCsF,GAAkDzC,EAAS8T,eAAiB9T,EAAS8T,cAAc1J,UAAUC,aAAaxC,IAenEA,EAAkB0iB,EAAyBC,KAKrHkD,EAAqBwB,GAClBA,GAAyC,IAA5BA,EAAU3L,OAAOlqB,OAK/BhC,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKo0B,EAAUhM,SAChB,2DALG,KAUTyK,EAAwBp2B,IAA8D,IAAA43B,EAMxF,IAAIC,GALuBC,EAKS93B,EAAM2d,UALNoa,EAKiB,WAJ1CD,EAAIvS,MAAK,SAASyS,GAAU,IAAAC,EAC/B,OAAOF,KAAmB,QAAhBE,EAAKD,EAAOx2B,YAAI,IAAAy2B,GAAS,QAATA,EAAXA,EAAaznB,eAAO,IAAAynB,OAAA,EAApBA,EAAsBC,YAF7C,IAA2BJ,EAASC,EAMpC,IAAII,GAAiC,QAAfP,EAAA53B,EAAM2d,iBAAS,IAAAia,OAAA,EAAfA,EAAiB91B,SAAU,EACjD,OAAG+1B,GAAeM,EAAkB,EAE5Br4B,gBAAA,OAAKqD,UAAU,iBACXnD,EAAMiB,OAAOm3B,sBAAwB,mHAItC,MAITlC,EAA2BA,CAACmC,EAAmD3R,EAA+B1mB,IAC3Gq4B,EAIDv4B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKmjB,GACL1mB,EAAM2mB,UAWnB,SAAyB3mB,GAAsC,IAAAs4B,EAC3D,MAAMC,EAAuC,QAA1BD,EAAIt4B,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAA42B,GAAM,QAANA,EAAtBA,EAAwBhwB,YAAI,IAAAgwB,OAAA,EAA5BA,EAA8BE,SACrD,OACI14B,gBAAA,KAAGqD,UAAW,qCACVo1B,GAAiBA,EAAgB,EACjCz4B,2BAAA,KACQA,gBAAA,QAAMqD,UAAU,4BAA4BnD,EAAM4C,UAAU61B,sBAC5D34B,gBAAC2D,iBAAc,CACXjC,KAAM,CACFqB,MAAO,CAAEa,wBAAyB60B,IAEtC50B,mBAAe9C,EACfyB,QAAStC,EAAMsC,QACfG,GAAIzC,EAAMyC,GACVC,SAAU1C,EAAM0C,SAChBS,UAAW,8BAGnB,MA5BHu1B,CAAgB14B,GAChBq4B,EAAkBM,eAAiBN,EAAkBM,eAAiB,KACtEN,EAAkBO,SAClB54B,EAAMiB,OAAO43B,YAAc,KAAOR,EAAkBS,IAsDjE,SAA0B94B,GAAsC,IAAA+4B,EAAAC,EAAAC,EAC5D,OACIn5B,gBAAA,KAAGqD,UAAW,sCACVrD,gBAAA,QAAMqD,UAAU,4BAA4BnD,EAAM4C,UAAU4pB,kBACrC,QAAtBuM,EAAA/4B,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAAq3B,GAAM,QAANA,EAAtBA,EAAwBzwB,YAAI,IAAAywB,GAA5BA,EAA8BG,aAA6D,KAAxB,QAAtBF,EAAAh5B,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAAs3B,GAAM,QAANA,EAAtBA,EAAwB1wB,YAAI,IAAA0wB,OAAA,EAA5BA,EAA8BE,aACxEp5B,gBAAC2D,iBAAc,CACXjC,KAAM,CACFqB,MAAO,CAAEa,wBAA+C,QAAxBu1B,EAAEj5B,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAAu3B,GAAM,QAANA,EAAtBA,EAAwB3wB,YAAI,IAAA2wB,OAAA,EAA5BA,EAA8BC,cAEpEv1B,cAAe3D,EAAM4C,UAAUD,UAC/BL,QAAStC,EAAMsC,QACfG,GAAIzC,EAAMyC,GACVC,SAAU1C,EAAM0C,SAChBS,UAAW,6BAGXrD,gBAAA,QAAMqD,UAAU,4BAA4BnD,EAAM4C,UAAU+qB,wBArEnEwL,CAAiBn5B,IATf,M,oCChhBf,oFAeO,SAAS+d,EAAsBwG,EAA+B3G,GACjE,QAAkB/c,IAAd0jB,GAA2B7R,kBAAgBC,YAAYiL,GACvD,OAAOA,EAAS3b,KAAKuO,GACV+T,IAAc/T,EAAQuU,UAelC,SAASjH,EACZyG,EACA3G,EACAwb,EACAtwB,GAEA,MAAMuwB,EAAuBD,UAAetwB,aAAS,EAATA,EAAWR,KAAKiQ,YAE5D,QAAkB1X,IAAd0jB,GAA2B7R,kBAAgBC,YAAYiL,GACvD,OAAOA,EAAS3b,KAAKuO,IAAU,IAAA4D,EAC3B,OAAOmQ,IAAc/T,EAAQuU,WAA4B,QAAhB3Q,EAAA5D,EAAQmG,gBAAQ,IAAAvC,OAAA,EAAhBA,EAAkBklB,uBAAwBD,M,oCC3C/F,id,4JCmBA,MAAME,UAAmBz5B,YACrBC,YAAYC,GACRC,MAAMD,GA8BF,KAAAw5B,kBAAoB,IAEpB15B,gBAAA,OAAKqD,UAAU,0BACV1C,KAAKT,MAAMy5B,QACXh5B,KAAKT,MAAM05B,KACXj5B,KAAKk5B,qBAAqBl5B,KAAKT,MAAMk1B,SAK1C,KAAA0E,mBAAqB,KACzB,MAAM,QAACC,GAAWp5B,KAAKT,MACvB,OACIF,gBAAA,OAAKqD,UAAU,2BACV1C,KAAKk5B,qBAAqBl5B,KAAKT,MAAM4nB,MAAMkS,eAC3Cr5B,KAAKk5B,qBAAqBl5B,KAAKT,MAAM4nB,MAAMmS,aAC3Ct5B,KAAKu5B,qBAAoB,GACzBv5B,KAAKT,MAAMi6B,oBACZn6B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKs2B,IACV/5B,gBAAA,OAAKqD,UAAU,uB,KAAyB1C,KAAKy5B,kB,OAKjD,KAAAC,oBAAsB,IAEtBr6B,gBAAA,OAAKqD,UAAU,4BACV1C,KAAKk5B,qBAAqBl5B,KAAKT,MAAM4nB,MAAMwS,YAKhD,KAAAF,gBAAkB,KAEtB,GAAIz5B,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAQ,CAC7B,MAAM24B,EAAW,GAAG55B,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAO44B,iBAC1CC,EAAYF,GAAYG,SAASH,EAAU,KAAO,EACxD,IAAII,EAAQh6B,KAAKT,MAAM4C,UAAU83B,kBAAoB,gCAMrD,OALkB,IAAdH,EACAE,EAAQh6B,KAAKT,MAAM4C,UAAU+3B,sBAAwB,gCAC9CJ,EAAY,IACnBE,EAAQh6B,KAAKT,MAAM4C,UAAUg4B,WAAaC,iBAAOp6B,KAAKT,MAAM4C,UAAUg4B,UAAWP,IAAa,wBAAwBE,WAGtHz6B,gBAACg7B,oBAAiB,CACdF,UAAWH,EACXn4B,QAAS7B,KAAKT,MAAMsC,QACpBG,GAAIhC,KAAKT,MAAMyC,GACfC,SAAUjC,KAAKT,MAAM0C,SACrBlB,KAAM,CAAE8G,KAAM7H,KAAKT,MAAMwB,KAAK8G,KAAK5G,UAI3C,OAAO,MAIP,KAAAq5B,oBAAsB,KAC1B,MAAM,QAAClB,EAAO,yBAAEmB,EAAwB,oBAAEC,GAAuBx6B,KAAKT,MACtE,OACIF,gBAACo7B,WAAQ,CAAC/3B,UAAW,mCAAoConB,QAAS0Q,GAC9Dn7B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKy3B,GACLv6B,KAAKk5B,qBAAqBl5B,KAAKT,MAAMk1B,QACrCz0B,KAAK06B,2BAA0B,GAC9B16B,KAAKT,MAAMo7B,oBAEjBt7B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKs2B,IACTp5B,KAAKk5B,qBAAqBl5B,KAAKT,MAAMq7B,WAK1C,KAAAC,mBAAqB,KACzB,MAAM,mBAAEC,GAAuB96B,KAAKT,MAAMwB,KACpCg6B,EAAWD,GAAsBA,EAAmB75B,OAC1D,OACI5B,2BAAA,KAAG07B,EAAWA,EAASC,WAAaD,EAASztB,KAAO,KAIpD,KAAAotB,0BAA6BO,IACjC,MAAM,mCACFC,EAAkC,YAClCC,EAAW,WACXC,EAAU,aACVC,GAAgBr7B,KAAKT,MAEzB,GAAI27B,EAAoC,CACpC,MAAMI,EAAmB3e,IAAW,oBAAqBue,EAAmCx4B,UAAWu4B,EAAkB,iBAAmB,mBAE5I,GAAII,EACA,OACIh8B,gBAACk8B,SAAM,CAAC74B,UAAW44B,EAAkBE,UAAU,yBAAyBC,WAAW,0BAA0BC,eAAe,MAAMC,iBAAkB37B,KAAK66B,sBACrJx7B,gBAAA,aACMg8B,GAAeA,EAAap3B,IAAK23B,GAA0BA,GAC5DT,IAIV,GAAIC,EACP,OACI/7B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKo4B,EAAkC,CAAEx4B,UAAW44B,IACpDF,GAKjB,OAAO,MAGH,KAAA7B,oBAAuB0B,IAC3B,MAAM,mCACFC,EAAkC,0CAClCW,EAAyC,0BACzCC,EAAyB,YACzBX,EAAW,WACXC,EAAU,aACVC,GACAr7B,KAAKT,MAET,GAAI27B,EAAoC,CACpC,GAAIW,EACA,OACIx8B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKo4B,GACLY,EACDz8B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAK+4B,KACJR,GAAeA,EAAap3B,IAAK23B,GAA2BA,GAC7DT,IAIV,GAAIC,EACP,OACI/7B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKo4B,GACLE,GAMjB,OADAp7B,KAAKT,MAAMsC,QAAQC,UAAUC,MAAM,gDAC5B,MAGH,KAAAm3B,qBAAwBhb,GAExB7e,gBAACA,WAAc,KACV6e,GAASA,EAAM7c,OACV6c,EAAMja,IAAI,CAAC83B,EAAuB73B,IACvB7E,gBAACA,WAAc,CAAC4T,IAAK/O,GAAQ63B,IAExC,MAjLXC,oBACHh8B,KAAKi8B,qBAGFhvB,SACH,MAAM,UACFivB,EAAS,gBACTC,EAAe,sBACfC,GACAp8B,KAAKT,MACT,OACIF,gBAACg9B,SAAMx5B,OAAAC,OAAA,GAAKo5B,GACR78B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKq5B,GACN98B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKs5B,EAAqB,CAAE15B,UAAWia,IAAWyf,EAAsB15B,UAAW1C,KAAKT,MAAMi7B,oBAAsB,GAAK,mBACzHx6B,KAAK+4B,oBACL/4B,KAAK05B,sBACL15B,KAAKm5B,sBAETn5B,KAAKs6B,sBACNj7B,gBAACm2B,OAAI,CAAC9yB,UAAW,2BACZ1C,KAAKk5B,qBAAqBl5B,KAAKT,MAAMq7B,YAkKlDqB,qBAEJvhB,OAAO4hB,SAAW,KACdt8B,KAAKu8B,iBAETv8B,KAAKu8B,gBAGDA,gBAEJ,MAAMC,EAA4CC,SAASC,cAAc,oBACnEC,EAAgBH,EAAwBA,EAAsBI,aAAe,EAG7EC,EAAaJ,SAASC,cAAc,cACtCG,IACIJ,SAASK,gBAAgBC,UAAYJ,EACrCE,EAAWG,UAAUC,IAAI,eAEzBJ,EAAWG,UAAUhhB,OAAO,gBAKpC,MAAMkhB,EAAmCT,SAASC,cAAc,4BAC1DS,EAAiCV,SAASC,cAAc,6BACxDU,EAA2CX,SAASC,cAAc,2BAClEW,EAA4CZ,SAASC,cAAc,4BAEzE,GAAIQ,GAAgBC,GAAcC,GAAwBC,EAAuB,CAE7E,MAAMC,EAAeH,EAAWP,aAAeD,EAC3CF,SAASK,gBAAgBC,UAAYO,EACrCJ,EAAaF,UAAUC,IAAI,SAE3BC,EAAaF,UAAUhhB,OAAO,SAI9BygB,SAASK,gBAAgBC,UAAYJ,GACrCS,EAAqBJ,UAAUC,IAAI,SACnCI,EAAsBL,UAAUC,IAAI,WAEpCG,EAAqBJ,UAAUhhB,OAAO,SACtCqhB,EAAsBL,UAAUhhB,OAAO,YAMxC8c,a,oCChQf,gBA6BeyE,IARoD/e,IAAiC,IAAhC,UAAE9b,EAAS,KAAE86B,EAAI,QAAEC,GAASjf,EAC5F,OACInf,gBAAA,SAAOqD,UAAWA,EAAW+6B,QAASA,GACjCD,K,8DCCEE,IARgFlf,IAAoB,IAAnB,YAAE7b,GAAa6b,EAC3G,OAAK7b,EAIEtD,gBAAA,QAAMqD,UAAU,6CAA6CC,GAHzD,O,2NC4Df,MA8IMg7B,EAA0BA,CAAC31B,EAAuCzI,KACpE,IAAIq+B,EACJ,GAAI51B,GAAYA,EAASqI,mBAAoB,CAAC,IAADwtB,EACzC,MAAMlrB,EAAczB,EAAgBlJ,EAASqI,mBAAoB9Q,EAAM6R,kBAEvE,IAAI0sB,EACAv+B,EAAMwxB,wBAA0BxxB,EAAMwxB,uBAAuB1vB,OAAS,IACtEy8B,EAA6Bv+B,EAAMwxB,uBAAuBvvB,KAAKC,GACpDA,GAAkBA,EAAemW,YAAc5P,EAAS4P,YAGvE,MAAM/F,EAAqC,QAA7BgsB,EAAGC,SAA0B,IAAAD,GAAiB,QAAjBA,EAA1BA,EAA4BtsB,uBAAe,IAAAssB,OAAA,EAA3CA,EAA6Cr8B,KAAK2Q,GAAUA,EAAOzQ,OAASsG,EAASzB,cAChGoK,EAAWkB,aAAQ,EAARA,EAAU9O,YAIvB66B,EADAjtB,EACmB,GAAGA,MAAagC,IAEhB,GAAGA,OAG1BirB,EAAmBr+B,EAAM4C,UAAU47B,aAEvC,OAAOH,GAGLI,EAAuBA,CAACh2B,EAAuCzI,KACjE,GAAIyI,GAAYA,EAASqI,mBAAoB,CACzC,MAAMsC,EAAczB,EAAgBlJ,EAASqI,mBAAoB9Q,EAAM6R,kBAEvE,GAAIuB,EACA,OACItT,gBAAA,OAAKqD,UAAU,+BACXrD,gBAAA,QAAMqD,UAAU,WAAWiQ,IAM3C,OAAO,MAGLzB,EAAkBA,CAACC,EAAwCC,KAC7D,IAAKA,IAAqBD,GAAkD,IAA5BC,EAAiB/P,OAC7D,MAAO,GAGX,MAAMgQ,EAAgBD,EAAiB5P,KAAK+O,GACjCA,EAAgBH,gBAAkBe,GAG7C,OAAIE,EACOA,EAAcC,YAElBH,GAGL8sB,EAAqBA,CACvB/gB,EACAC,EACA5d,KAEA,MAAM6d,EAA6C,GAEnD,OAAKD,GAAgC,IAApBA,EAAS9b,QAK1B6b,EAAUjZ,IAAI,CAAC+L,EAAU9L,KACrB,IAAI6L,EAQA0D,EAMAqqB,EAMU,IAADlqB,GAhBT7D,EAHAxQ,EAAMuW,+BAGIuH,YAAkCrN,EAAS4H,UAAWuF,EAAUnN,EAAS8H,YAAavY,EAAM8I,WAE5FiV,YAAsBtN,EAAS4H,UAAWuF,GAGpD5d,EAAMmY,sBAAwBnY,EAAMmY,qBAAqBrW,OAAS,IAClEoS,EAA2BlU,EAAMmY,qBAAqBlW,KAAK8T,IAAsB,IAAAoI,EAC7E,OAAmD,QAA5CA,EAAApI,EAAoBC,gCAAwB,IAAAmI,OAAA,EAA5CA,EAA8C9F,aAAe5H,EAAS4H,aAIjFrY,EAAMwxB,wBAA0BxxB,EAAMwxB,uBAAuB1vB,OAAS,IACtEy8B,EAA6Bv+B,EAAMwxB,uBAAuBvvB,KAAKC,GACpDA,GAAkBA,EAAemW,YAAc5H,EAAS4H,YAGnE7H,IACAqN,EAAWpL,KAhLDwB,EAClBxD,EACAD,EACAxQ,EACA2E,EACAuP,EACAyqB,KAC8B,IAAAvqB,EAC9B,MAAM,cAAEI,EAAa,aAAEC,EAAY,GAAEhS,EAAE,SAAEC,EAAQ,QAAEJ,EAAO,UAAEM,EAAS,iBAAE8R,EAAgB,uBAAEC,GAA2B3U,EAE9G6V,GAlENC,EAmEI9V,EAAM8V,oBAlEV8oB,EAmEI5+B,EAAM4+B,oBAlEV7oB,EAmEI7B,EAjEA4B,GAEKC,IACAA,EAAoBG,mBACrBH,EAAoBG,mBAAqB,GACzCH,EAAoBG,mBAAqB0oB,EAElC,EAEJ7oB,EAAoBG,kBAAoB0oB,EAG5C,GAjB2BzoB,IAClCL,EACA8oB,EACA7oB,EAqEA,MAAMK,EACF5F,GArDwB6F,EAC5BC,EACAR,EACAD,EACAU,EACAC,KAEA,GAAID,EAAgC,CAChC,IAAIE,EAAmCD,EAQvC,OAJKA,IACDC,EAAmCH,GAAuB,IAGvDR,EACDW,EAAmCZ,EAC/BY,EACAZ,EACJY,EAEV,OAAIX,GACOD,EAA2BS,EAAsBT,EAErDS,GA6BHD,CACIrW,EAAM0W,oBACN1W,EAAM8V,oBACND,EACA7V,EAAMuW,gCACN/F,SAAiB,QAAV4D,EAAP5D,EAASmG,gBAAQ,IAAAvC,OAAA,EAAjBA,EAAmBwC,kBAAmB,GAIxCioB,EAAgBruB,EAAQsG,gBAAkBC,sBAAoBC,QAE9DwC,EA/BoBC,EAAC9E,EAA8DlE,IAAuB,KAChHkE,EAAuBlE,IA8BMgJ,CAAsB9E,EAAwBlE,GACrEwR,EAAUtI,2BAAiB,QAAS3Z,EAAMsF,iBAAmBugB,oBAAkBiZ,gBAC/EC,EAA0BhlB,iCAAuB/Z,EAAMsF,iBAAmB2c,GAEhF,IAAIvH,EAAaC,4BAAkBnK,EAASxQ,EAAMsC,QAAQuH,mBAAehJ,GACzE,GAAI+Z,IAASC,WAAaC,YAAiB9a,EAAMsC,QAAQuH,cAAckR,gBAAiB,CAAC,IAADC,EACpF,MAAMC,EAAU,IAAIC,IAAIR,EAAYS,OAAO/J,SAASgK,MACpDH,EAAQI,aAAaC,IAAI,YAAa,IAAqB,QAArBN,EAAGvK,EAAS8K,iBAAS,IAAAP,IAAI,IAC/DN,EAAaO,EAAQG,KAGzB,MAAO,CACH5Z,KAAM,CACFgP,UACAC,YAEJtC,WAAW0wB,IAAiB7+B,EAAM8V,sBAAsBrF,EAAS8I,SAAYnD,EAC7E3F,SACI3Q,gBAAC4b,wBAAqB,CAClBla,KAAM,CACFiH,SAAUgI,EACVD,UACAmL,SAAU3b,EAAM2b,UAEpB5D,gBAAiBtH,EAAS8I,SAC1BnD,YAAaA,EACbwF,eAAeijB,IAAiB7+B,EAAM8V,sBAAsBD,GAA4B,EACxFpB,aAAcA,EACdD,cAAeA,EACf/R,GAAIA,EACJC,SAAUA,EACVgY,WAAYA,EACZpY,QAASA,EACTM,UAAWA,EACX8Q,IAAK,GAAG/O,KAAS+V,IACjBoB,oBAAoB,EACpBG,gBAAiBzL,EAAQ0L,gBACzB8iB,YAAY,UACZ15B,iBAAkBtF,EAAMsF,iBACxBgC,4BAA6BtH,EAAMsH,4BACnC23B,iBAAkBb,EAAwB3tB,EAAUzQ,KAG5Dyc,OACI3c,gBAAC2F,SAAMnC,OAAAC,OAAA,CACHJ,UAAU,6BACVyC,QAAS4T,EACTrV,MAAOuQ,GACHqqB,GAEHrqB,GAGTwqB,cAAeT,EAAqBhuB,EAAUzQ,KAgGtCiU,CACIxD,EACAD,EACAxQ,EACA2E,EACwB,QADnB0P,EACLH,SAAwB,IAAAG,OAAA,EAAxBA,EAA0B2B,6BAOnC6H,IAvCH7d,EAAMsC,QAAQC,UAAUC,MAAM,kDACvB,OA6CF28B,EAAuBn/B,IAChC,MAAM,SAAE4d,EAAQ,UAAED,GAAc3d,EAChC,OAAO0+B,EAAmB/gB,EAAWC,EAAU5d,K,mGCjNnD,SAAS25B,EAAqBhb,GAC1B,OACI7e,gBAACA,WAAc,KACV6e,GAASA,EAAM7c,OACV6c,EAAMja,IAAI,CAAC83B,EAAuB73B,IACvB7E,gBAACA,WAAc,CAAC4T,IAAK/O,GAAQ63B,IAExC,MAKH4C,UAhIgCp/B,IAC3C,MAAM,UACF28B,EAAS,gBACTC,EAAe,sBACfC,EAAqB,2BACrBwC,EAA0B,oBAC1BC,EAAmB,wBACnBC,EAAuB,yBACvBvE,GACAh7B,EACJ,OACIF,gBAACg9B,SAAMx5B,OAAAC,OAAA,GAAKo5B,GACR78B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKq5B,GACLjD,EAAqB35B,EAAMq7B,SAC5Bv7B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKs5B,GACL78B,EAAMy5B,QACNz5B,EAAM05B,KACP55B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAK87B,GACL1F,EAAqB35B,EAAMk1B,QAC3Bl1B,EAAMw/B,eACN7F,EAAqB35B,EAAM+5B,aA4BpD,SAAoC/5B,GAChC,MAAM,mCACF27B,EAAkC,0CAClCW,EAAyC,0BACzCC,EAAyB,YACzBX,EAAW,WACXC,EAAU,aACVC,GACA97B,EAEJ,GAAI27B,EAAoC,CACpC,GAAIW,EACA,OACIx8B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKo4B,GACLY,EACDz8B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAK+4B,KACJR,GAAeA,EAAap3B,IAAI23B,GAAQA,GACzCT,GAEL97B,gBAAA,QAAMqD,UAAU,eAGrB,GAAI04B,EACP,OACI/7B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKo4B,GACLE,GAMjB,OADA77B,EAAMsC,QAAQC,UAAUC,MAAM,gDACvB,KA1Dci9B,CAA2Bz/B,GAC3BA,EAAM0/B,WAGf5/B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAK+7B,GACNx/B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKg8B,GACL5F,EAAqB35B,EAAMk1B,QAC1Bl1B,EAAM2/B,iBACPhG,EAAqB35B,EAAMq7B,SAC5Bv7B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKy3B,KAEJh7B,EAAM87B,cAAe97B,EAAM87B,aAAap3B,IAAI23B,GAAQA,GAmDlF,SAAmCr8B,GAC/B,MAAM,mCACF27B,EAAkC,0CAClCW,EAAyC,0BACzCC,EAAyB,YACzBX,EAAW,WACXC,EAAU,aACVC,GACA97B,EACJ,GAAI27B,EAAoC,CACpC,GAAIW,EACA,OACIx8B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKo4B,GACLY,EACDz8B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAK+4B,KACJR,GAAeA,EAAap3B,IAAI23B,GAAQA,GACzCT,GAEL97B,gBAAA,QAAMqD,UAAU,eAGrB,GAAI04B,EACP,OACI/7B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKo4B,GACLE,GAMjB,OADA77B,EAAMsC,QAAQC,UAAUC,MAAM,gDACvB,KAhFkB24B,CAA0Bn7B,GACzBA,EAAM+5B,eAMnBJ,EAAqB35B,EAAM4/B,iBAC3BjG,EAAqB35B,EAAM6/B,cAC3BlG,EAAqB35B,EAAM85B,mB,kCLnD5C,mkB,kMM2FA,MA8MM4E,EAAqBA,CAAC/gB,EAAuBC,EAAuC5d,KACtF,MAAM6d,EAAoC,GAE1C,OAAKD,GAAgC,IAApBA,EAAS9b,QAK1B6b,EAAUjZ,IAAI,CAAC+L,EAAU9L,KACrB,MAAM6L,EAvNMsvB,EAACvb,EAA+B3G,KAChD,QAAkB/c,IAAd0jB,GAA2B3G,EAC3B,OAAOA,EAAS3b,KAAKuO,GACV+T,IAAc/T,EAAQuU,WAoNjB+a,CAAYrvB,EAAS4H,UAAWuF,GAEhD,IAAI1J,EAMAqqB,EALAv+B,EAAMmY,sBAAwBnY,EAAMmY,qBAAqBrW,OAAS,IAClEoS,EAA2BlU,EAAMmY,qBAAqBlW,KAAM8T,IAAuB,IAAAoI,EAC/E,OAAmD,QAA5CA,EAAApI,EAAoBC,gCAAwB,IAAAmI,OAAA,EAA5CA,EAA8C9F,aAAe5H,EAAS4H,aAIjFrY,EAAMwxB,wBAA0BxxB,EAAMwxB,uBAAuB1vB,OAAS,IACtEy8B,EAA6Bv+B,EAAMwxB,uBAAuBvvB,KAAMC,GACrDA,GAAkBA,EAAemW,YAAc5H,EAAS4H,YAGnE7H,GACAqN,EAAWpL,KAzKDwB,EAClBxD,EACAD,EACAxQ,EACA2E,EACAuP,EACAyqB,KACwB,IAAAvqB,EAAA2rB,EAAAC,EAAA3rB,EAAAE,EACxB,MAAM,cAAEC,EAAa,aAAEC,EAAY,GAAEhS,EAAE,SAAEC,EAAQ,QAAEJ,EAAO,UAAEM,EAAS,iBAAE8R,EAAgB,uBACnFC,EAAsB,6BAAEC,EAA4B,6BAAEC,EAA4B,kCAClFE,EAAiC,mCAAEC,EAAkC,wCACrEC,EAAuC,uDAAEC,EAAsD,wBAC/FC,EAAuB,6BAAEC,EAA4B,eAAEC,EAAc,oBAAEC,EAAmB,UAC1FC,EAAS,oBAAEC,EAAmB,sBAAE9E,GAA0B1Q,EAExD0V,EAAkBpT,EAAQU,QAAQ2S,KAAKD,gBACvCE,EAAiBL,GAAaA,EAAUzT,OAAS,GAAKyT,EAAU,GAAGxH,KAAOwH,EAAU,GAAGxH,KAAOyH,EAC9FY,EArEsBC,EAACK,EAA6BZ,EAA8BC,EAAoDkqB,KAC5I,MAAMC,EAAkBD,GAA0CvpB,EAElE,OAAIZ,EACKC,GAAwBA,EAAoBC,0BAA6BD,EAAoBE,oBAAuBF,EAAoBC,yBAAyBE,kBAG/JH,EAAoBC,yBAAyBE,kBAAoBH,EAAoBC,yBAAyBE,kBAAoBgqB,EAF9H,EAKRA,GA2Da7pB,CAChBrW,EAAM0W,oBACN1W,EAAM8V,oBACN5B,EACAlU,EAAMuW,+BAAiD,QAAnBnC,EAAG5D,EAAQmG,gBAAQ,IAAAvC,OAAA,EAAhBA,EAAkBwC,qBAAkB/V,GAIzEg+B,EADmB,IACHruB,EAAQsG,cAGxBqpB,EADoF,SAA/D,QAAbJ,EAAA//B,EAAMsC,eAAO,IAAAy9B,GAAS,QAATA,EAAbA,EAAe/8B,eAAO,IAAA+8B,GAAK,QAALA,EAAtBA,EAAwBviB,WAAG,IAAAuiB,GAAU,QAAVA,EAA3BA,EAA6B9L,gBAAQ,IAAA8L,OAAA,EAArCA,EAAuC7L,oCACJ,QAAhB8L,EAAAxvB,EAAQmG,gBAAQ,IAAAqpB,OAAA,EAAhBA,EAAkBI,qBAA0B,EACvE77B,EApEeuT,EAAC1B,EAAqB2B,EAAyB/X,EAA4B6b,EAAmBgjB,EAAwBsB,KAE3I,MAAME,EAA8B,GAChCrgC,EAAMwY,eACFxY,EAAM8V,sBAAwB+oB,IAC1BzoB,GAAe,EACfiqB,EAAkB5tB,KAAKzS,EAAMyY,gBACtBrC,EAAc2B,IACD,IAAhB3B,EACAiqB,EAAkB5tB,KAAKzS,EAAM0Y,mBAE7B2nB,EAAkB5tB,KAAKzS,EAAM2Y,qBAAqBC,QAAQ,YAAaxC,EAAYiB,eAKnG,MAAMipB,EAAkB,qCAAqCH,EAe7D,GAZAngC,EAAM8Y,gBACDtQ,OAAOyQ,GAAKA,EAAEsnB,YAAc1kB,GAC5B1C,QAAQF,IAAI,IAAAunB,EAAAC,EAAAC,EAEwC,4FAAtB,QAAvBF,EAAAvnB,EAAE0nB,6BAAqB,IAAAH,OAAA,EAAvBA,EAAyBI,kBACoB,8GAAtB,QAAvBH,EAAAxnB,EAAE0nB,6BAAqB,IAAAF,OAAA,EAAvBA,EAAyBG,iBACrBP,EAAkB5tB,KAAK6tB,GACG,QAA3BI,EAAIznB,EAAE0nB,6BAAqB,IAAAD,GAAvBA,EAAyBrnB,cAChCgnB,EAAkB5tB,KAAKwG,EAAE0nB,sBAAsBtnB,gBAIvDgnB,EAAkBv+B,OAAS,EAC3B,OAAOu+B,EAAkB/mB,KAAK,MAoCbxB,CAAiB1B,EAAa3F,EAAS8I,SAAWvZ,EAAO2E,EAAOk6B,EAAesB,GAG9FzmB,EAAUC,2BAAiBC,IAAeC,eAAgB7Z,EAAMsF,iBAAmBoP,EAAkB,IACrGoF,EAAaC,iCAAuB/Z,EAAMsF,iBAAmBoU,GAE7DM,EAAe9F,aAAwB,EAAxBA,EAA0B+F,gBACzCC,EAAgBhG,EAA2B,iCAAuE,QAAvEG,EAAgCH,EAAyBiG,sBAAc,IAAA9F,OAAA,EAAvCA,EAAyC+F,oBAAkBvZ,EAC5I,MAAO,CACHW,KAAM,CACFgP,QAASA,EACTC,SAAUA,GAEdjO,MAAO+B,EACPkM,SACI3Q,gBAAC4b,wBAAqB,CAClBla,KAAM,CACFiH,SAAUgI,EACVD,QAASA,GAEbuH,gBAAiBtH,EAAS8I,SAC1BnD,YAAaA,EACbwF,eAAgBijB,IAAiB7+B,EAAM8V,sBAAwBM,GAAe,EAC9E3B,aAAcA,EACdD,cAAeA,EACf/R,GAAIA,EACJC,SAAUA,EACVgY,WAAYC,4BAAkBnK,EAASxQ,EAAMsC,QAAQuH,mBAAehJ,GACpEyB,QAASA,EACTM,UAAWA,EACX8Q,IAAK/O,EACLmX,oBAAoB,EACpBC,iBAAkB/b,EAAMgc,sCACxBC,gBAAiBzL,EAAQ0L,gBACzB3X,aAAcA,EACd4X,0BAA2BnC,EAC3BoC,wBAAyBlC,EACzBmC,iBAA8C,WAAb,QAAf9H,EAAAvU,EAAM8I,iBAAS,IAAAyL,OAAA,EAAfA,EAAiBvT,QACnCsb,gCAAiCtc,EAAMsc,gCACvChX,iBAAkBtF,EAAMsF,mBAEhCiX,cACInM,wBAAc,CACVM,sBAAuBA,EACvB5H,UAAW9I,EAAM8I,UACjB2H,SAAUA,EACVD,QAASA,EACTmD,WAAY3T,EAAMiT,WAClBW,kBAAmB5T,EAAMwc,aACzBrJ,gBAAiBnT,EAAMmT,gBACvB5C,0BAA2BvQ,EAAMuQ,0BACjCsB,iBAAkB7R,EAAM6R,iBACxB1R,gBAAiBw+B,EACjBz2B,uBAAwBlI,EAAMkI,uBAC9BmJ,uBAAwBrR,EAAMqR,yBAGtCoL,OACI3c,gBAAC2F,SAAMnC,OAAAC,OAAA,CACHJ,UAAU,6BACVyC,QA1DkBsF,IAA2CyJ,EAAuBlE,IA2DpFtM,MAAOuQ,GACHoF,GAEHpF,GAGTgI,cACIhH,EACI5V,gBAAC6c,yBAAsB,CACnBxZ,UAAW,iCACXgS,wBAAyBA,EACzBC,6BAA8BA,EAC9B9S,QAASA,EACTG,GAAIA,EACJiR,IAAKjD,EAASU,OACdzO,SAAUA,EACVkT,eAAgBA,EAChBnF,SAAUA,EACVmM,gBAAgB,EAChBC,mBAAmB,EACnBC,kBAAkB,EAClBC,mBAAmB,EACnBvb,KAAM,CACF+T,UAAWA,EACX/E,QAASA,GAEbyM,UAAWrI,SAGf/T,EAERqc,mBAEIxH,GAAmBL,EAEfvV,gBAACqd,8BAA2B,CACxBha,UAAW,uCACX0R,6BAA8BA,EAC9BE,kCAAmCA,EACnCC,mCAAoCA,EACpCC,wCAAyCA,EACzCC,uDAAwDA,EACxD1T,KAAM,CAAEgP,QAASA,EAAS6M,SAAU5M,EAAS8I,UAAY,EAAGlE,eAAgBA,EAAgBC,oBAAqBA,GACjHhT,QAASA,EACTsa,gBAAgB,EAChBG,mBAAmB,EACnBta,GAAIA,EACJC,SAAUA,SAGd7B,IA6BYoT,CAAcxD,EAAUD,EAASxQ,EAAO2E,EAAOuP,EAA0BqqB,MAI1F1gB,IAxBH7d,EAAMsC,QAAQC,UAAUC,MAAM,iDACvB,OA8BF+uB,EAAiBvxB,IAC1B,MAAM,SAAE4d,EAAQ,UAAED,GAAc3d,EAChC,OACI0+B,EAAmB/gB,EAAWC,EAAU5d,K,kCC/UhD,mFAiCO,MAAMgrB,EAAkBhrB,IAC3B,MAAM,GACFyC,EAAE,mBACF+mB,EAAkB,WAClBC,EACA7mB,WAAW,kBAAE8mB,EAAiB,sBAAEC,GAAuB,mBACvDC,EAAkB,cAClBC,GACA7pB,EAEJ,IAAK0S,kBAAgBC,YAAY8W,GAC7B,OAGJ,MAAMK,EAAarnB,EAAH,SACVU,EAAY,sBAClB,MAAO,CACH4mB,wBAAyB,CACrB5mB,UAAW,uBAEf6mB,iBACIlqB,IAAAwmB,cAAAxmB,IAAAmqB,SAAA,KACInqB,IAAAwmB,cAAA,QAAMnjB,UAAU,uBAChBrD,IAAAwmB,cAAA,Y,IAAQtmB,EAAM4C,UAAUsnB,yBAGhCC,oBACIrqB,IAAAwmB,cAAA,KAAGnjB,UAAU,2BAA2BinB,SAAU,EAAGlmB,KAAK,OAAO0B,QAASikB,GACrE,IACAH,E,IAAoB,KAG7BW,gBACIvqB,IAAAwmB,cAACgE,QAAK,CAACC,OAAQf,EAAoBrmB,UAAW,GAAGA,EAAaqnB,OAAQZ,GAClE9pB,IAAAwmB,cAACmE,cAAW,CAACtnB,UAAcA,EAAH,mBAAgCqnB,OAAQZ,GAC5D9pB,IAAAwmB,cAAA,MAAI7jB,GAAIqnB,EAAS3mB,UAAU,mCACtBwmB,IAGT7pB,IAAAwmB,cAACoE,YAAS,CAACvnB,UAAcA,EAAH,kBAClBrD,IAAAwmB,cAAA,UACKmD,EAAW/kB,IAAIimB,IAAa,IAAAC,EACzB,OACI9qB,IAAAwmB,cAAA,MAAInjB,UAAU,iCAAiCuQ,IAAKiX,EAAWxZ,QACtC,QAD4CyZ,EAChED,EAAWE,iBAAS,IAAAD,OAAA,EAApBA,EAAsBE,U,IAAY,SAMvDhrB,IAAAwmB,cAACyE,cAAW,CAAC5nB,UAAcA,EAAH,yB,4NC/ClC,MAAOyxB,UAAiB90B,gBAsB1BC,YAAYC,GACRC,MAAMD,GAtBF,KAAA60B,eAAiC,IAAIC,IAAer0B,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO8zB,yBAEnF,KAAAtnB,MAAwB,CAC3BqL,gBAAiB,IAGb,KAAAkc,iBAAoB3wB,GAGL,GAAGA,YAFF4wB,UAAU9Z,OAAO/J,SAAS8jB,qBAC/B/Z,OAAO/J,SAASuiB,SAK3B,KAAAwB,WAAc9wB,IAClB5D,KAAKo0B,eAAeO,MAAM30B,KAAKu0B,iBAAiB3wB,KAI5C,KAAAkS,gCAA0C,EAkL1C,KAAA8e,kBAAqB7gB,GAClBA,GAAiB,CACpB+L,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCG,UAAU,GAIV,KAAAwU,2BAA8BtU,IAClC,GAAIvgB,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAQ,CAC7B,MAAMuf,EAAQ,CACVC,YAAa,CAACF,EAAiB7P,OAAQkG,aAE3C5W,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAOyf,gBAAgBF,GACvCzZ,KAAK,KACF/G,KAAK80B,gBACAttB,MAAOzF,IACJ/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,+BAGtCrZ,MAAOzF,IACJ/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,kCAKnC,KAAAkU,8BAAgC,CAAC9zB,EAAsC+O,KACrD,UAAlB/O,EAAOV,QAAsByP,GAC7BhQ,KAAK60B,2BAA2B7kB,IAIhC,KAAAglB,wBAA0B,CAACjU,EAA4BnE,KAC3D,GAAI5c,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAQ,CAC7B,MAAMuf,EAAQ,CACV/P,WAAYsQ,EAAiBrQ,OAAQkG,WACrCqe,YAAarY,EACbsY,qBAAsB,CAAEC,oCAAqCn1B,KAAK8V,iCAEtE9V,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAOm0B,uBAAuB5U,GAC9CzZ,KAAM9F,GACmB,YAAlBA,EAAOV,SACPP,KAAK80B,gBAAgBttB,MAAOzF,IACxB/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,8BAExB,IAIdrZ,MAAOzF,IACJ/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,yCAIvC,OAAO,GAGH,KAAAwU,2BAA6B,KACjCr1B,KAAK80B,gBAAgBttB,MAAOzF,IACxB/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,8BA/O/B7gB,KAAKs1B,iBAAmBt1B,KAAKs1B,iBAAiB7T,KAAKzhB,MAGhD,0BAIHA,KAAK8V,qCAAuC9V,KAAK2hB,oCAC7C3hB,KAAK8V,sCACC9V,KAAK80B,gBAGf90B,KAAK00B,WAAW,uBAGbznB,SACH,OACI5N,gBAAA,MAAAwD,OAAAC,OAAA,CAAKJ,UAAW1C,KAAKT,MAAMmD,UAAWV,GAAIhC,KAAKT,MAAMyC,IAAQhC,KAAKT,MAAMg2B,uBAAuBv1B,KAAKT,QAC/FS,KAAKT,MAAMmE,MACZrE,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAK9C,KAAKT,MAAMwmB,kBAChB/lB,KAAKs1B,oBAETt1B,KAAKT,MAAM+mB,qBACRjnB,gBAAEm2B,OAAI3yB,OAAAC,OAAA,GAAK9C,KAAKT,MAAMymB,qBACjBhmB,KAAKT,MAAM+mB,oBACXmP,EAAyBz1B,KAAKT,MAAMknB,sBAAuBzmB,KAAKT,MAAM0mB,kBAAmBjmB,KAAKT,OAC9FS,KAAKgN,MAAMqL,gBAAgBhX,OAAS,EAAIq0B,EAAkB11B,KAAKT,MAAMopB,oBAAsB,KAC3FyX,EAAsBpgC,KAAKT,OAC3BS,KAAKT,MAAMiB,OAAOo1B,uBAAyBv2B,gBAAA,OAAKqD,UAAU,wBAAwB1C,KAAKT,MAAMiB,OAAOo1B,wBAAgC,KACrIv2B,gBAAA,OAAKqD,UAAW,wBACX1C,KAAKT,MAAMsnB,2BACX7mB,KAAKT,MAAMsC,QAAQU,SAAWvC,KAAKT,MAAMsC,QAAQU,QAAQ2S,MAAQlV,KAAKT,MAAMsC,QAAQU,QAAQ2S,KAAKD,gBAAkB,KAAO5V,gBAAA,OAAKqD,UAAU,+BAA+B1C,KAAKT,MAAM4C,UAAU0zB,SAC9Lx2B,gBAAA,OAAKqD,UAAW,oCAuWPP,EAtWwBnC,KAAKT,MAAM4C,UAwWhE9C,gBAAC2F,SAAM,CACHtC,UAAW,+BACXyC,QAAS2wB,GAER3zB,EAAUolB,4BA3WUvnB,KAAKT,MAAMwnB,yBAK3B/mB,KAAKT,MAAM8oB,eAgW5B,IAAqClmB,EA3VzBmzB,mBACJ,MAAM,cAAES,GAAkB/1B,KAAKT,MAAM4C,UAErC,GAAInC,KAAKT,MAAMgpB,kBACX,OAAOlpB,2BAAA,KAAGW,KAAKT,MAAMgpB,mBAEzB,MAAMzK,EAAY9d,KAAK2iB,gBACvB,OAAI7E,EACOA,EAAU7Z,IAAI,CAAC+D,EAAU9D,IAExB7E,gBAAA,OAAKqD,UAAU,sBAAsBuQ,IAAK/O,GACrC8D,EAASgI,SACTgmB,EAAkBhuB,EAAUhI,KAAKT,MAAM4C,UAAWnC,KAAKT,MAAM8oB,eAC9DhpB,gBAAA,OAAKqD,UAAU,+BACVsF,EAASiU,cACTjU,EAASgU,UAMlBhc,KAAKT,MAAMkpB,eAEXppB,gBAAA,OAAKqD,UAAU,wBACXrD,gBAAA,KAAGqD,UAAU,iBAAiBqzB,GAC7B/1B,KAAKT,MAAM+nB,sBAEhBjoB,2BAAA,KAAGW,KAAKT,MAAM+oB,kBAKtB3F,gBACJ,MACI5hB,MACI8G,MAAQ5G,OAAQ4G,GAChBiN,WAAa7T,OAAQ6T,GACrBF,gBAAkB3T,OAAQ2T,GAC1BC,qBAAuB5T,OAAQ4T,IAEnChT,SACIU,SACIC,SAAS,uBACLkF,GACA,CAAEA,4BAAwBtH,KAGtCI,OAAQA,EAAM,UACdsB,EAAS,UACTK,EAAS,QACTyuB,GACA5wB,KAAKT,MAEHwU,EAAgB/T,KAAK40B,kBAAkBp0B,EAAOuT,eAE9CsE,EAA+CrY,KAAKgN,MAAMqL,gBAChE,IAAIwY,EAA0B,GAI9B,OAHID,GAAW/tB,OAAO8b,KAAKiS,GAASvvB,OAAS,GAAKuvB,EAAQvI,eAAiBuI,EAAQvI,cAAchnB,OAAS,IACtGwvB,EAAkBD,EAAQvI,cAAc,GAAGrmB,IAExChC,KAAKT,MAAMwB,KAAKoc,UAAYnd,KAAKT,MAAMwB,KAAKoc,SAASlc,QAAU4G,GAAQA,EAAKA,KAAKC,WAAaD,EAAKA,KAAKC,UAAUzG,OAAS,EAC9HyvB,YAAc,CACV5T,UAAWrV,EAAKA,KAAKC,UACrBmI,sBAAuB4gB,EACvBxY,gBAAiBA,EACjB8E,SAAUnd,KAAKT,MAAMwB,KAAKoc,SAASlc,OACnCyW,qBAAsB1X,KAAKT,MAAMwB,KAAK2W,qBAAqBzW,OAC3D8vB,uBAAwB/wB,KAAKT,MAAMwB,KAAKrB,gBAAgBuB,OACxD8S,cAAeA,EACfsB,oBAAqBrV,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO2iB,mBAAoB,EACvElN,oBAAqBjW,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAOywB,2BACnDjd,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCnS,QAAS7B,KAAKT,MAAMsC,QACpBI,SAAUjC,KAAKT,MAAM0C,SACrBD,GAAIhC,KAAKT,MAAMyC,GACfG,UAAW,CACPgvB,WAAY,QACZC,YAAa,UACbE,aAAcnvB,EAAUovB,kCACxBC,YAAarvB,EAAUsvB,0BACvBG,sBAAuBzvB,EAAU0vB,oBACjCC,uBAAwB3vB,EAAU2vB,uBAClCC,yBAA0B5vB,EAAU4vB,yBACpCC,yBAA0B7vB,EAAU6vB,yBACpCC,mBAAoB9vB,EAAU8vB,mBAC9B/C,kBAAmB/sB,EAAU+sB,kBAC7BC,iBAAkBhtB,EAAUgtB,iBAC5B+C,oBAAqB/vB,EAAUgwB,iBAEnCrwB,UAAWA,EACX4S,wBAAyBvS,EAAUuS,wBACnCC,6BAA8BxS,EAAUwS,6BACxCV,iBAAkB9R,EAAUmwB,qBAC5B9f,WAAYrQ,EAAUowB,uBACtBxW,aAAc5Z,EAAUqwB,oBACxB9f,gBAAiBvQ,EAAUswB,uBAC3B3iB,0BAA2B9P,KAAKT,MAAMwB,KAAK+O,0BAA0B7O,OACrE+W,eAAgB7V,EAAU0oB,uBAC1B5S,kBAAmB9V,EAAUuwB,8BAC7Bxa,qBAAsB/V,EAAUwwB,6BAChCtqB,UAAWrI,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAChCmQ,iBAAkBpR,KAAKT,MAAMwB,KAAKqQ,iBAAiBnQ,OACnDiT,uBAAwBlU,KAAK60B,2BAC7B1gB,6BAA8BnU,KAAK+0B,8BACnCxZ,sCAAuCvb,KAAKg1B,wBAC5CpkB,uBAAwB5Q,KAAKq1B,2BAC7BvgB,UAAWA,EACXC,oBAAqB5S,EAAU4S,oBAC/BtN,uBAAwBC,EACxBqQ,cAAevX,EAAOoyB,qBACtB/W,gCAAiCrb,EAAOqb,gCACxChX,iBAAkB7E,KAAKT,MAAMsF,iBAC7BiR,+BAAgC9V,KAAK8V,+BAErCxB,kCAAmCtU,KAAK2nB,2CAA2CxlB,GACnFoS,mCAAoCvU,KAAK4nB,0CAA0CzlB,GACnFqS,wCAAyCxU,KAAK4uB,iDAAiDzsB,GAC/FsS,uDAAwDzU,KAAK+nB,gEAAgE5lB,GAE7HiS,6BAA8BjS,EAAUiS,6BACxCye,0BAA2B1wB,EAAU0wB,0BACrCC,4BAA6B3wB,EAAU2wB,4BACvCle,eAAgBA,EAChBC,oBAAqBA,IAEzB,KA8EA,0CAAuC,IAAAye,EAC3C,MAAMC,EAA4D,QAArBD,EAAGtzB,KAAKT,MAAMsC,eAAO,IAAAyxB,GAAS,QAATA,EAAlBA,EAAoB/wB,eAAO,IAAA+wB,GAAK,QAALA,EAA3BA,EAA6BvW,WAAG,IAAAuW,GAAU,QAAVA,EAAhCA,EAAkCE,gBAAQ,IAAAF,OAAA,EAA1CA,EAA4CG,iCAC5F,GAAgD,SAA5CF,EACA,OAAO,EAGX,IAAI,IAAAG,EACA,MAAMC,QAAwB3zB,KAAKT,MAAMwB,KAAKqM,aAK9C,MADK,QAFDsmB,EAAAC,EAAgBnyB,KACZ4L,GAAsC,oEAAtBA,EAAaE,aAChC,IAAAomB,OAAA,EAFDA,EAEGnmB,aAAa,GAEhB,OAAO,EAEb,MAAOxL,GAGL,OAFA/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,iCACpB,EAGX,GAAgD,QAA5C0S,EACA,OAAO,EAEX,IACI,MAAM7H,QAAqB1rB,KAAKT,MAAMwB,KAAK8T,oBAC3C,QACM6W,IAC4C,QAA5C6H,GAAqD7H,EAAakI,OACnB,QAA5CL,IAAsD7H,EAAakI,OAE9E,MAAO7xB,GAGL,OAFA/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,gCACpB,GAIP,sBAAyC,IAAAoV,EAAA,IAArBC,IAAAC,UAAA90B,OAAA,QAAAjB,IAAA+1B,UAAA,KAAAA,UAAA,GACxB,IAAKn2B,KAAK8V,+BACN,OAAOud,cAAYviB,UAGvB,MACI/P,MAAQ8G,KAAMA,IACd7H,KAAKT,MACT,IAAI62B,EACJ,IACIA,QAAmBvuB,EACrB,MAAO9F,GAGL,OAFA/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,sBACpBwS,cAAYviB,UAEvB,MAAMulB,EAA6B,QAAlBJ,EAAGG,EAAWvuB,YAAI,IAAAouB,OAAA,EAAfA,EAAiBK,QACrC,IAAID,EA8BA,OADAr2B,KAAKT,MAAMuC,UAAU8e,QAAQ,uDACtByS,cAAYviB,UA7BnB,IAAI,IAAAylB,EACA,MAAMC,QAAoDC,mCAAyB,CAAEttB,cAAenJ,KAAKT,MAAMsC,QAAQuH,eAA2B,QAAZmtB,EAAEH,SAAU,IAAAG,GAAM,QAANA,EAAVA,EAAY1uB,YAAI,IAAA0uB,OAAA,EAAhBA,EAAkBhuB,GAAI8tB,GAE9J,OADAr2B,KAAKyf,SAAS,CAAEpH,gBAAiBme,EAAiBE,+BAAiC,KAC5ErD,cAAYviB,UACrB,MAAO/O,GACL,GAAIm0B,GAAwB,2DAAfn0B,EAAMgR,KAAmE,CAClF,UACUqjB,EAAWO,YAAY,IAC/B,MAAOC,GAGL,OAFA52B,KAAKT,MAAMuC,UAAU8e,QAAQgW,GAC7B52B,KAAKT,MAAMuC,UAAU+e,MAAM,0BACpBwS,cAAYviB,UAEvB,IAEI,aADM9Q,KAAK80B,eAAc,GAClBzB,cAAYviB,UACrB,MAAO+lB,GAGL,OAFA72B,KAAKT,MAAMuC,UAAU8e,QAAQiW,GAC7B72B,KAAKT,MAAMuC,UAAU+e,MAAM,2BACpBwS,cAAYviB,WAM3B,OAFA9Q,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,2BACpBwS,cAAYviB,WAQvB6W,2CAA2CxlB,GAC/C,MAAO,CACHgsB,yBAA0BhsB,EAAUgsB,yBAEpCC,wBAAyBjsB,EAAUisB,wBACnCC,4BAA6BlsB,EAAUksB,4BAEvCC,gCAAiCnsB,EAAUmsB,gCAC3CC,iCAAkCpsB,EAAUosB,iCAC5CC,sCAAuCrsB,EAAUqsB,sCAEjDC,oBAAqBtsB,EAAUssB,oBAC/BC,wBAAyBvsB,EAAUusB,wBACnCC,cAAexsB,EAAUwsB,eAIzBC,iDAAiDzsB,GACrD,MAAO,CACH0sB,4BAA6B1sB,EAAU0sB,4BACvCC,2BAA4B3sB,EAAU2sB,2BACtCC,0CAA2C5sB,EAAU4sB,0CACrDC,6CAA8C7sB,EAAU6sB,6CACxDC,0CAA2C9sB,EAAU8sB,0CACrD/rB,cAAef,EAAUe,cACzBgsB,kBAAmB/sB,EAAU+sB,kBAC7BC,iBAAkBhtB,EAAUgtB,kBAI5BpH,gEAAgE5lB,GACpE,MAAO,CACHutB,yBAA0BvtB,EAAUutB,yBACpCC,8BAA+BxtB,EAAUwtB,8BACzCC,yBAA0BztB,EAAUytB,yBACpCC,+BAAgC1tB,EAAU0tB,gCAI1CjI,0CAA0CzlB,GAC9C,MAAO,CACH2tB,yBAA0B3tB,EAAU4tB,0BACpCC,wBAAyB7tB,EAAU8tB,mBACnCC,2BAA4B/tB,EAAU+tB,2BACtCC,yBAA0BhuB,EAAUiuB,+BAEpCC,yBAA0BluB,EAAUkuB,yBAEpCC,yBAA0BnuB,EAAUouB,8BACpCC,+BAAgCruB,EAAUsuB,2CAiBtD,SAASqF,IACLpb,OAAOoc,QAAQC,OAdJ5C,YAiBf,MAAM6B,EAAoBA,CAAChuB,EAA+B7F,EAA2BkmB,KACjF,IAAKrgB,EAAS8T,gBAAkBuM,EAC5B,OAAO,KAGX,MAAM,uBAAEkK,EAAsB,yBAAEyE,EAAwB,oBAAExE,EAAmB,8BAAEyE,EAA6B,uBAAExE,GAA2BtwB,EAEnI0N,EAAkB7H,EAAS8T,cAAcjM,gBAI/C,OACIxQ,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKkF,EAAS8T,cAAcvI,gBAC7BlU,gBAAA,OAAKqD,UAAU,+BACVmN,EAAkBxQ,gBAAA,QAAMqD,UAAU,WAAWu0B,GAAwC53B,gBAAA,QAAMqD,UAAU,QAAQs0B,IAG9GnnB,GACAxQ,gBAAA,OAAKqD,UAAU,oCACXrD,gBAAA,QAAMqD,UAAU,0CAA0CsF,EAAS8T,cAAcnJ,aACjFtT,gBAAC2F,SAAM,CAACtC,UAAU,mCAAmCyC,QAXhDsF,GAAkDzC,EAAS8T,eAAiB9T,EAAS8T,cAAc1J,UAAUC,aAAY,IAWlDogB,IAGpFpzB,gBAAC2F,SAAM,CAACtC,UAAU,2BAA2ByC,QAfhCsF,GAAkDzC,EAAS8T,eAAiB9T,EAAS8T,cAAc1J,UAAUC,aAAaxC,IAenEA,EAAkB0iB,EAAyBC,KAKrHkD,EAAqBwB,GAClBA,GAAyC,IAA5BA,EAAU3L,OAAOlqB,OAI/BhC,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKo0B,EAAUhM,SACf,2DAJE,KASTkV,EAAyB7gC,IAAiC,IAAAs4B,EAAAS,EAAAC,EAAAC,EAAA6H,EAAAC,EAC5D,MAAMxI,EAAuC,QAA1BD,EAAIt4B,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAA42B,GAAM,QAANA,EAAtBA,EAAwBhwB,YAAI,IAAAgwB,OAAA,EAA5BA,EAA8B0I,eAGrD,OAFAC,QAAQC,IAAI,OAA6B,QAAvBnI,EAAC/4B,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAAq3B,OAAA,EAAtBA,EAAwBzwB,SACA,QAAtB0wB,EAAAh5B,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAAs3B,OAAA,EAAtBA,EAAwB1wB,QAA8B,QAA1B2wB,EAAIj5B,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAAu3B,OAAA,EAAtBA,EAAwB3wB,KAAKC,YAA+D,KAA5B,QAAtBu4B,EAAA9gC,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAAo/B,OAAA,EAAtBA,EAAwBx4B,KAAKC,UAAUzG,SAAqE,cAA/B,QAAtBi/B,EAAA/gC,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAAq/B,OAAA,EAAtBA,EAAwBz4B,KAAKC,UAAU,GAAG2vB,UAC1KK,EAAgB,IAE9Bz4B,gBAAA,OAAKqD,UAAU,wCACVrD,gBAAA,gGAIN,MAGLo2B,EAA2BA,CAACmC,EAAmD3R,EAA+B1mB,KAA8D,IAAA+/B,EAC9K,IAAK1H,EACD,OAAO,KAEX,MAAM8I,EAAoF,SAA/D,QAAbpB,EAAA//B,EAAMsC,eAAO,IAAAy9B,GAAS,QAATA,EAAbA,EAAe/8B,eAAO,IAAA+8B,GAAK,QAALA,EAAtBA,EAAwBviB,WAAG,IAAAuiB,GAAU,QAAVA,EAA3BA,EAA6B9L,gBAAQ,IAAA8L,OAAA,EAArCA,EAAuC7L,kCACrD,OACIp0B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKmjB,GACLya,EAAO,KAAOnhC,EAAM2mB,UACpBwa,EAAO9I,EAAkB+I,SAStC,SAAyBphC,GAAsC,IAAAqhC,EAC3D,MAAM9I,EAAuC,QAA1B8I,EAAIrhC,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAA2/B,GAAM,QAANA,EAAtBA,EAAwB/4B,YAAI,IAAA+4B,OAAA,EAA5BA,EAA8B7I,SACrD,OACI14B,gBAAA,KAAGqD,UAAW,qCACVo1B,GAAiBA,EAAgB,EACjCz4B,2BAAA,KACQA,gBAAA,QAAMqD,UAAU,4BAA4BnD,EAAM4C,UAAU61B,sBAC5D34B,gBAAC2D,iBAAc,CACXjC,KAAM,CACFqB,MAAO,CAAEa,wBAAyB60B,IAEtC50B,mBAAe9C,EACfyB,QAAStC,EAAMsC,QACfG,GAAIzC,EAAMyC,GACVC,SAAU1C,EAAM0C,SAChBS,UAAW,8BAGnB,MA3BiCu1B,CAAgB14B,GACpDA,EAAMiB,OAAO43B,YAAc,KA+BxC,SAAoB74B,GAAsC,IAAAshC,EAAAC,EAAAC,EACtD,MACMlU,GADiBttB,EAAMsI,MAAQtI,EAAMsI,KAAKA,KAAKm5B,gBAAkB,GACrC,EAAGzhC,EAAM4C,UAAUuqB,uBAAyBntB,EAAM4C,UAAU2qB,kBAC9F,OACIztB,gBAAA,KAAGqD,UAAW,sCACVrD,gBAAA,QAAMqD,UAAU,4BAA4BmqB,GACrB,QAAtBgU,EAAAthC,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAA4/B,GAAM,QAANA,EAAtBA,EAAwBh5B,YAAI,IAAAg5B,GAA5BA,EAA8BI,YAAmC,QAAtBH,EAAAvhC,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAA6/B,GAAM,QAANA,EAAtBA,EAAwBj5B,YAAI,IAAAi5B,OAAA,EAA5BA,EAA8BG,WAAY,EAClF5hC,gBAAC2D,iBAAc,CACXjC,KAAM,CACFqB,MAAO,CAAEa,wBAA+C,QAAxB89B,EAAExhC,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAA8/B,GAAM,QAANA,EAAtBA,EAAwBl5B,YAAI,IAAAk5B,OAAA,EAA5BA,EAA8BE,YAEpE/9B,cAAe3D,EAAM4C,UAAUD,UAC/BL,QAAStC,EAAMsC,QACfG,GAAIzC,EAAMyC,GACVC,SAAU1C,EAAM0C,SAChBS,UAAW,6BAGXrD,gBAAA,QAAMqD,UAAU,4BAA4BnD,EAAM4C,UAAU+qB,wBAjDjCgU,CAAW3hC,GAC7CmhC,GAAsC9I,EAAkBM,eAAhDN,EAAkB+I,SAA4E,KACtGD,EAAO,KAqDpB,SAA0BnhC,GAAsC,IAAA4hC,EAAAC,EAAAC,EAC5D,OACIhiC,gBAAA,KAAGqD,UAAW,sCACVrD,gBAAA,QAAMqD,UAAU,4BAA4BnD,EAAM4C,UAAUm/B,gBACrC,QAAtBH,EAAA5hC,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAAkgC,GAAM,QAANA,EAAtBA,EAAwBt5B,YAAI,IAAAs5B,GAA5BA,EAA8B1I,aAA6D,KAAxB,QAAtB2I,EAAA7hC,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAAmgC,GAAM,QAANA,EAAtBA,EAAwBv5B,YAAI,IAAAu5B,OAAA,EAA5BA,EAA8B3I,aACxEp5B,gBAAC2D,iBAAc,CACXjC,KAAM,CACFqB,MAAO,CAAEa,wBAA+C,QAAxBo+B,EAAE9hC,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAAogC,GAAM,QAANA,EAAtBA,EAAwBx5B,YAAI,IAAAw5B,OAAA,EAA5BA,EAA8B5I,cAEpEv1B,cAAe3D,EAAM4C,UAAUD,UAC/BL,QAAStC,EAAMsC,QACfG,GAAIzC,EAAMyC,GACVC,SAAU1C,EAAM0C,SAChBS,UAAW,6BAGXrD,gBAAA,QAAMqD,UAAU,4BAA4BnD,EAAM4C,UAAU+qB,wBArErDwL,CAAiBn5B,GAC/BmhC,EAAO,KA0EpB,SAA6BnhC,GAAqB,IAAAgiC,EAE9C,MAAMC,EAAiD,QAAzBD,EAAGhiC,EAAMwB,KAAK8G,KAAK5G,cAAM,IAAAsgC,GAAM,QAANA,EAAtBA,EAAwB15B,YAAI,IAAA05B,OAAA,EAA5BA,EAA8BC,yBAC/D,OACIniC,gBAAA,KAAGqD,UAAW,yCACT8+B,GAA4BA,EAA2B,EACpDniC,2BAAA,KACIA,gBAAA,QAAMqD,UAAU,4BAA4BnD,EAAM4C,UAAUs/B,cAC5DpiC,gBAAC2D,iBAAc,CACXjC,KAAM,CACFqB,MAAO,CAAEa,wBAAyBu+B,IAEtCt+B,cAAe3D,EAAM4C,UAAUD,UAC/BL,QAAStC,EAAMsC,QACfG,GAAIzC,EAAMyC,GACVC,SAAU1C,EAAM0C,SAChBS,UAAW,8BAGnB,MA7FWg/B,CAAoBniC,M,kCCphB/C,gBA2BeoiC,IARkDnjB,IAAwB,IAAvB,UAAE9b,EAAS,KAAE86B,GAAMhf,EACjF,OAAKgf,EAIEn+B,gBAAA,QAAMqD,UAAWA,GAAY86B,GAHzB,O,+SCuHf,MAgHMhqB,EAAgBA,CAClBxD,EACAD,EACAxQ,EACA2E,EACAuP,EACAC,KACqB,IAAAC,EAAAC,EAAAC,EAAAC,EAAA8tB,EACrB,MAAM,cACF7tB,EAAa,aACbC,EAAY,GACZhS,EAAE,SACFC,EAAQ,QACRJ,EAAO,UACPM,EAAS,iBACT8R,EAAgB,uBAChBC,EAAsB,6BACtBC,EAA4B,6BAC5BC,EAA4B,gCAC5BC,EAA+B,kCAC/BC,EAAiC,mCACjCC,EAAkC,wCAClCC,EAAuC,uDACvCC,EAAsD,wBACtDC,EAAuB,6BACvBC,EAA4B,eAC5BC,EAAc,oBACdC,EAAmB,UACnBC,EAAS,oBACTC,EAAmB,sBACnB9E,EAAqB,oCACrB4xB,GACAtiC,EAEE0V,EAAkBpT,EAAQU,QAAQ2S,KAAKD,gBACvCE,EAAiBL,GAAaA,EAAUzT,OAAS,GAAKyT,EAAU,GAAGxH,KAAOwH,EAAU,GAAGxH,KAAOyH,EAC9FK,GAnJNC,EAmJ+D9V,EAAM8V,oBAlJrEC,EAkJ0F7B,EA/IrF4B,GACAC,GACAA,EAAoBC,0BACpBD,EAAoBE,oBACpBF,EAAoBC,yBAAyBE,kBAK3CH,EAAoBC,yBAAyBE,kBAHzC,GAXuBC,IAClCL,EACAC,EAoJA,MAAMK,EACF5F,GAtIwB6F,EAC5BC,EACAR,EACAD,EACAU,EACAC,KAEA,GAAID,EAAgC,CAChC,IAAIE,EAAmCD,EAQvC,OAJKA,IACDC,EAAmCH,GAAuB,IAGvDR,EACDW,EAAmCZ,EAC/BY,EACAZ,EACJY,EAEV,OAAIX,GACOD,EAA2BS,EAAsBT,EAErDS,GA8GHD,CACIrW,EAAM0W,oBACN1W,EAAM8V,oBACND,EACA7V,EAAMuW,gCACN/F,SAAiB,QAAV4D,EAAP5D,EAASmG,gBAAQ,IAAAvC,OAAA,EAAjBA,EAAmBwC,kBAAmB,GAIxCC,GAAuBrG,aAAO,EAAPA,EAASsG,iBAAkBC,sBAAoBC,WAAavG,EAASwG,cAE5F1S,EAAeqT,mBAAiBC,kBAAkBzB,QAClDvV,EAvHeiX,EACrBjC,EACAkC,EACA/X,EACA6W,EACApO,EACAuP,EACA9D,KACoB,IAAA+D,EACpB,MAAMC,EAA+B,GAGrC,GADuE,aAAb,QAAzBD,EAAAjY,EAAM+V,2BAAmB,IAAAkC,OAAA,EAAzBA,EAA2BjX,QAExD,OAGJ,GAAIhB,EAAMmY,sBAAwBzF,kBAAgBC,YAAY3S,EAAMmY,4BAC/BtX,IAA7BqT,EAEA,OADAgE,EAAmBzF,KAAKzS,EAAMyY,gBACvBP,EAAmBb,WAG9BrX,EAAMwY,eAAiBxY,EAAM8V,sBAAwBe,IACjDhB,GAA4B,EAC5BqC,EAAmBzF,KAAKzS,EAAMyY,gBACvB5C,EAA2BkC,IACD,IAA7BlC,EACAqC,EAAmBzF,KAAKzS,EAAM0Y,mBAE9BR,EAAmBzF,KAAKzS,EAAM2Y,qBAAqBC,QAAQ,YAAa/C,EAAyBwB,eAM7G,MAAMwB,EAAiB7Y,EAAM8Y,gBAAgBC,uBACvCC,EAAsBH,aAAc,EAAdA,EAAgBrQ,OAAO7D,GAASA,EAAMwM,SAAW6G,GAC7E,QAA4BnX,IAAxBmY,EACA,IAAK,MAAMC,KAAKD,EACRtG,kBAAgBC,YAAYsG,EAAEC,qBAC9BD,EAAEC,mBAAmBC,QAAQC,SACOvY,IAA5BuY,EAAWC,cACXnB,EAAmBzF,KAAK2G,EAAWC,gBAOvD,OAAI3G,kBAAgBC,YAAYuF,GACrBA,EAAmBoB,KAAK,UADnC,GAuEMxB,CACIjC,EACApF,EAAS8I,SACTvZ,EACA6W,EACApG,EACAA,EAASU,OACT+C,GAGJsF,EApEoBC,EAAC9E,EAA8DlE,IAAuB,KAChHkE,EAAuBlE,IAmEMgJ,CAAsB9E,EAAwBlE,GAErEiJ,EAAUC,2BAAiBC,IAAeC,eAAgB7Z,EAAMsF,iBAAmBoP,EAAkB,IACrGoF,EAAaC,iCAAuB/Z,EAAMsF,iBAAmBoU,GAE7DM,EAAe9F,aAAwB,EAAxBA,EAA0B+F,gBACzCC,GAAgBhG,EAChB,iCAAuE,QAAvEG,EAAgCH,EAAyBiG,sBAAc,IAAA9F,OAAA,EAAvCA,EAAyC+F,oBACzEvZ,EAGAwZ,GAEF,YADA7J,SAAmB,QAAZ8D,EAAP9D,EAAS8J,kBAAU,IAAAhG,GAA8E,QAA9EA,EAAnBA,EAAqBrS,KAAKsY,GAHL,IAGkBA,EAAUC,2BAAgD,IAAAlG,GAAgB,QAAhBA,EAAjGA,EAAmGmG,sBAAc,IAAAnG,OAAA,EAAjHA,EAAmHzI,OAGvH,IAAI6O,GACJ,GAAIlK,GAGA,GAFAkK,GAAaC,4BAAkBnK,EAASxQ,EAAMsC,QAAQuH,mBAAehJ,GAEjE+Z,IAASC,WAAaC,YAAiB9a,EAAMsC,QAAQuH,cAAckR,gBAAiB,CAAC,IAADC,GACpF,MAAMC,EAAU,IAAIC,IAAIR,GAAYS,OAAO/J,SAASgK,MACpDH,EAAQI,aAAaC,IAAI,YAAa,IAAqB,QAArBN,GAAGvK,EAAS8K,iBAAS,IAAAP,MAAI,IAC/DN,GAAaO,EAAQG,WAGzBV,GAAac,uCAA6B/K,EAASjN,aAAe,GAAIxD,EAAMsC,QAAQuH,eAGxF,MAAO,CACHrI,KAAM,CACFgP,UACAC,YAEJgL,WAAYhL,EAASU,OACrB3O,MAAO+B,EACP4J,WACM0I,IAAwB7W,EAAM8V,sBAAsBrF,EAAS8I,UAAanD,UAAe,KACzFwB,mBAAiBC,kBAAkBtT,KAAkBsD,mBAAiBC,cAAcvD,GAC1FkM,SACI3Q,gBAAC4b,wBAAqB,CAClBla,KAAM,CACFiH,SAAUgI,EACV3H,UAAW9I,EAAM8I,UACjB0H,UACAmL,SAAU3b,EAAM2b,UAEpB5D,gBAAiBtH,EAAS8I,SAC1BnD,YAAaA,EACbwF,eAAe/E,IAAwB7W,EAAM8V,sBAAsBD,GAA4B,EAC/FpB,aAAcA,EACdD,cAAeA,EACf/R,GAAIA,EACJC,SAAUA,EACVgY,WAAYA,GACZpY,QAASA,EACTM,UAAWA,EACX8Q,IAAK,GAAG/O,KAAS+V,KACjBmB,UAAWlX,EACXmX,oBAAqBlE,mBAAiBC,kBAAkBrH,GACxDuL,iBAAkB/b,EAAMgc,sCACxBC,gBAAiBzL,aAAO,EAAPA,EAAS0L,gBAC1B3X,aAAcA,EACd4X,0BAA2BnC,EAC3BoC,wBAAyBlC,GACzBmC,iBAA8C,WAAb,QAAf9H,EAAAvU,EAAM8I,iBAAS,IAAAyL,OAAA,EAAfA,EAAiBvT,QACnCsb,gCAAiCtc,EAAMsc,gCACvChX,iBAAkBtF,EAAMsF,iBACxBgC,4BAA6BtH,EAAMsH,4BACnCi7B,cAAsC,QAAzBF,EAAE//B,EAAQU,QAAQC,eAAO,IAAAo/B,OAAA,EAAvBA,EAAyBx+B,WAGhD0Y,cAAe/L,EACTJ,YAAc,CACVM,wBACA5H,UAAW9I,EAAM8I,UACjB2H,WACAD,UACAmD,WAAY3T,EAAMiT,WAClBW,kBAAmB5T,EAAMwc,aACzBrJ,gBAAiBnT,EAAMmT,gBACvB5C,0BAA2BvQ,EAAMuQ,0BACjCsB,iBAAkB7R,EAAM6R,iBACxB1R,gBAAiBgU,EACjBjM,uBAC4C,KAAxCuI,EAASzJ,aAAqCyJ,EAASzJ,aAAehH,EAAMkI,uBAChFgK,iCAAkClS,EAAMkS,iCACxC5K,4BAA6BtH,EAAMsH,4BACnC+J,uBAAwBrR,EAAMqR,8BAElCxQ,EACN4b,OACI3c,gBAAC2F,SAAMnC,OAAAC,OAAA,CAACJ,UAAU,6BAA6ByC,QAAS4T,EAAsBrV,MAAOuQ,GAAsBoF,GACtGpF,GAGTgI,cACIhH,GAAmBlF,IAAY6J,GAC3Bva,gBAAC6c,yBAAsB,CACnBxZ,UAAU,iCACVgS,wBAAyBA,EACzBC,6BAA8BA,EAC9B9S,QAASA,EACTG,GAAIA,EACJiR,IAAKjD,EAASU,OACdzO,SAAUA,EACVkT,eAAgBA,EAChBnF,SAAUA,EACVmM,gBAAc,EACdC,mBAAmB,EACnBC,kBAAkB,EAClBC,mBAAmB,EACnBC,SAAS,SACTxb,KAAM,CACF+T,YACA/E,WAEJyM,UAAWrI,SAGf/T,EAERqc,mBACIxH,GAAmBL,GAAkB7E,EACjC1Q,gBAACqd,8BAA2B,CACxBha,UAAWia,IAAW,uCAAwC/C,GAAwB,WAAa,IACnGxF,6BAA8BA,EAC9BC,gCAAiCA,EACjCC,kCAAmCA,EACnCC,mCAAoCA,EACpCC,wCAAyCA,EACzCC,uDAAwDA,EACxD1T,KAAM,CAAEgP,UAAS6M,SAAU5M,EAAS8I,UAAY,EAAGlE,iBAAgBC,uBACnEhT,QAASA,EACTsa,gBAAc,EACdU,8BAA+BjD,GAC/BkD,cAAelD,GACf5X,GAAIA,EACJC,SAAUA,EAEVqa,mBAAoB/c,EAAMsC,QAAQkb,IAAIvc,OAAOwc,iBAAkB,EAC/DjJ,mBAAuC3T,IAAxBb,EAAMwU,cAA8BxU,EAAMwU,mBAAgB3T,EACzEyhC,oCAAqCA,IAAuC,EAC5EE,UAAW/xB,EAAS8K,iBAGxB1a,IAKH6c,EAAoBA,CAC7BC,EACAC,EACA5d,KAEA,MAAM6d,EAAoC,GA0C1C,OAxCAF,EAAUjZ,IAAI,CAAC+L,EAAU9L,KACrB,IAAI6L,EAQA0D,EAJA1D,EAHAxQ,EAAMuW,+BAGIuH,YAAkCrN,EAAS4H,UAAWuF,EAAUnN,EAAS8H,YAAavY,EAAM8I,WAE5FiV,YAAsBtN,EAAS4H,UAAWuF,GAKxD,MAAM6kB,EAAeC,mCACjBjyB,EACAzQ,EAAMkS,iCACNlS,EAAMsH,4BACNtH,EAAMkI,wBAeV,IAAIiM,EAbAnU,EAAMmY,sBAAwBzF,kBAAgBC,YAAY3S,EAAMmY,wBAChEjE,EAA2BlU,EAAMmY,qBAAqBlW,KAAK8T,IACJ,IAADoI,EAAAH,EAAAE,EAAlD,OAAKle,EAAMoY,uBAAyBqqB,GAGgB,QAA5CtkB,EAAApI,EAAoBC,gCAAwB,IAAAmI,OAAA,EAA5CA,EAA8C9F,aAAc5H,EAAS4H,YACjC,QAApC2F,EAAAjI,EAAoBuC,wBAAgB,IAAA0F,OAAA,EAApCA,EAAsCI,kBAAsC,QAAzBF,EAAKzN,EAAS8H,mBAAW,IAAA2F,OAAA,EAApBA,EAAsBE,eAG/ErI,EAAoBC,yBAAyBqC,YAAc5H,EAAS4H,kBAKhDxX,IAA/Bb,EAAMmU,sBAAsCzB,kBAAgBC,YAAY3S,EAAMmU,wBAC9EA,EAAuBnU,EAAMmU,qBAAqBlS,KAAKC,GAC5CA,GAAkBA,EAAemW,YAAc5H,EAAS4H,YAGvEwF,EAAWpL,KAAKwB,EAAcxD,EAAUD,EAASxQ,EAAO2E,EAAOuP,EAA0BC,MAGtF0J,GAOE0T,EAAiBvxB,IAC1B,MAAM,SAAE4d,EAAQ,UAAED,GAAc3d,EAChC,OAAO0d,EAAkBC,EAAWC,EAAU5d,K,+rBCnclD,MAAM2iC,EAAqD1jB,IAUtD,IAVuD,MACxDpc,EAAK,MACL43B,EAAK,QACLn4B,EAAO,GACPG,EAAE,SACFC,EAAQ,mBACRgrB,EAAkB,SAClBE,EAAQ,SACRgV,EAAQ,cACRL,GACHtjB,EACG,OACInf,gBAAA,KAAGqD,UAAW,2BAA2By/B,GACrC9iC,gBAAA,QAAMqD,UAAU,4BAA4Bs3B,GAC3C53B,GAAmB,IAAVA,EACN/C,gBAAC2D,iBAAc,CACXjC,KAAM,CACFqB,MAAO,CAAEa,wBAAyBb,IAEtCc,cAAeiqB,EACftrB,QAASA,EACTG,GAAIA,EACJC,SAAUA,EACVS,UAAU,2BACVS,aAAc2+B,IAGlBziC,gBAAA,QAAMqD,UAAU,4BAA4BuqB,KAMtDmV,EAA4B,SAC9B7iC,EACA6C,EACA+/B,GAEiB,IADjBnI,EAAA7D,UAAA90B,OAAA,QAAAjB,IAAA+1B,UAAA,GAAAA,UAAA,GAAgB,GAEhB,OACI92B,gBAAC6iC,EAAgB,CACb9/B,MAAOA,EACP43B,MAAOA,EACPn4B,QAAStC,EAAMsC,QACfG,GAAIzC,EAAMyC,GACVC,SAAU1C,EAAM0C,SAChBgrB,mBAAoB1tB,EAAM0tB,mBAC1BE,SAAU5tB,EAAM4tB,SAChBrrB,UAAWvC,EAAMuC,UACjBqgC,SAAUA,EACVL,cAAeviC,EAAMsjB,qBAAqBzf,YAKhDi/B,EAA0B37B,GACpBA,GAAiBA,EAAc47B,eAAkB,EAmEvDC,EAAkB,SACpBhhC,GAIA,IAAAihC,EAAA,IAHAC,EAAAtM,UAAA90B,OAAA,QAAAjB,IAAA+1B,UAAA,IAAAA,UAAA,GACAtvB,EAAgEsvB,UAAA90B,OAAA,EAAA80B,UAAA,QAAA/1B,EAChEsiC,EAA2BvM,UAAA90B,OAAA,EAAA80B,UAAA,QAAA/1B,EAE3B,OAAKqiC,EAGE57B,SAAoD,QAAzB27B,EAA3B37B,EAA6BqB,+BAAuB,IAAAs6B,OAAA,EAApDA,EAAsDhhC,KAAKmhC,GAAMA,IAAOphC,GAFpEmhC,GAMFpW,EAAgB/sB,IACzB,MAAM,eACFghC,EAAc,yBAEdqC,EAAwB,UACxB3B,EAAS,wBAET4B,EAAuB,eACvB7B,EAAiB,EAAC,YAClBvI,EAAW,kBACXqK,GACAvjC,EAAMsI,MAEJ,QAAEnH,EAAO,kBAAEqiC,EAAiB,kBAAEC,EAAiB,WAAEC,GA7E1BC,EAC7Br7B,EACAgb,EACAhc,EACAjH,EACAwtB,EACAE,KAEA,MAAM7lB,EAAyBob,GAAwBA,EAAqBnb,uBACtEC,EAAwBkb,GAAwBA,EAAqBjb,sBAErEu7B,GADYt7B,EAAKC,WAAa,IACJ7D,IAAI+D,GAAYA,EAASzB,cACnD68B,OAAmDhjC,IAA7ByH,EAAKw7B,oBAAoCx7B,EAAKw7B,oBAAsB,EAC1FC,OAAqDljC,IAA9ByH,EAAK07B,qBAAqC17B,EAAK07B,qBAAuB,EAOnG,IAAIN,EAAiC,EAEjCA,OADyB7iC,IAAzBgtB,QAA2DhtB,IAArBktB,EACzBzlB,EAAK07B,qBAELnW,IAAyBE,EAAmBgW,EAAuBF,EAAsBv7B,EAAK07B,qBAmB/G,MAAO,CACH7iC,QAlBYyiC,EAAcre,KAC1BvjB,KAEyB,KAAjBA,IACCA,IACGghC,EAAgBhhC,EAAc3B,EAAmCiH,EAA6BY,IAC9FlG,IAAiBoG,KAa7Bo7B,kBAVsBI,EAAcre,KAAKvjB,KAAkBA,GAAgBA,IAAiBoG,GAW5Fq7B,kBAVsBG,EAAcre,KACpCvjB,KACMA,GACFA,IACIghC,EAAgBhhC,EAAc3B,EAAmCiH,EAA6BY,IAClGlG,IAAiBoG,GAMrBs7B,eA8BkEC,CAClE3jC,EAAMsI,KACNtI,EAAMsjB,qBACNtjB,EAAMsH,4BACNtH,EAAMK,kCACNL,EAAM6tB,qBACN7tB,EAAM+tB,kBAGV,IAAIlQ,EAEJ,QAAmChd,IAA/Bb,EAAM6tB,2BAAiEhtB,IAA3Bb,EAAM+tB,iBAClDlQ,EAAa,CACTujB,SAAUyB,EAA0B7iC,EAAOghC,EAAgB,YAAahhC,EAAMgtB,eAC9E8L,IAAK+J,EAA0B7iC,EAAOwjC,EAAoB9B,OAAY7gC,EAAW,aAAcb,EAAMstB,UACrGE,WAAYqV,EAA0B7iC,EAAOk5B,EAAa,QAASl5B,EAAMusB,iBACzE0X,YACKV,GAAqBV,EAA0B7iC,EAAOujC,EAAmB,gBAAiBvjC,EAAMotB,wBACjGvsB,OAEL,CACH,MAAMqjC,OAA0CrjC,IAAtB0iC,EAAkCA,EAAoB,EAC1EY,OAAsDtjC,IAA5ByiC,EAAwCA,EAA0B,EAC5Fc,OAAqCvjC,IAAd6gC,GAA2BA,EAAY,EAM9D2C,EACFrkC,EAAM6tB,uBAAyB7tB,EAAM+tB,iBAAmBmW,EAAoBC,EAA0BD,EAEpGI,EAAuBtkC,EAAM6tB,sBAAwB7tB,EAAM+tB,iBAAmBsV,EAA2BrC,EAE/GnjB,EAAa,CACTujB,SAAUyB,EAA0B7iC,EAAOskC,EAAsB,YAAatkC,EAAMgtB,eACpF8L,IAAK94B,EAAM+tB,iBACL8U,EACI7iC,EACAwjC,GAAqBY,EAAuB1C,OAAY7gC,EACxD,aACAb,EAAMstB,UAEV,GACNE,WAAYqV,EAA0B7iC,EAAOk5B,EAAa,QAASl5B,EAAMusB,iBACzE0X,YACKV,GAAqBV,EAA0B7iC,EAAOqkC,EAAwB,gBAAiBrkC,EAAMotB,wBACtGvsB,GAMZ,GAHIM,IACA0c,EAAW+a,SAAWiK,EAA0B7iC,EAAOyjC,EAAoBC,OAAa7iC,EAAW,WAAYb,EAAMktB,gBAErHltB,EAAMmH,cAAe,CACrB,MAAMo9B,EA5IiBC,EAACr9B,EAA+BmB,KAC3D,MAGMm8B,GAAsBt9B,EAAcu9B,iBAAmB,IAAIC,OAHzCC,CAACngC,EAAeogC,IAC7BpgC,GAASogC,EAASC,SAAW,GAEiD,GACnFC,GAAUz8B,EAAK4wB,aAAe,GAAK4J,EAAuB37B,GAChE,OAAO69B,KAAKC,IAAIR,EAAoBM,IAsITP,CAAuBxkC,EAAMmH,cAAenH,EAAMsI,MACnEy6B,EAAgBD,EAAuB9iC,EAAMmH,eAC7C+9B,GAlJ0B/9B,EAkJ6BnH,EAAMmH,gBAjJ9CA,EAAc+9B,uBAA0B,EAkJvDC,GAA4BjM,GAAe,GAAKqL,EAAiBxB,EAAgBmC,EAEnFnC,EAAgB,IAChBllB,EAAWunB,QAAUvC,EAA0B7iC,GAAQ+iC,EAAe,UAAW/iC,EAAMqlC,cAAgB,mBAGvGd,EAAiB,IACjB1mB,EAAWgnB,SAAWhC,EAA0B7iC,GAAQukC,EAAgB,YAAavkC,EAAMslC,eAAiB,qBAG5GJ,EAAwB,IACxBrnB,EAAW0nB,gBAAkB1C,EACzB7iC,GACCklC,EACD,yBACAllC,EAAMwlC,sBAAwB,2BAItC3nB,EAAW2P,WAAaqV,EAAyBp0B,IAAC,GACzCzO,GAAK,IAAE4tB,cAAU/sB,IACtBskC,EACA,QACAnlC,EAAMusB,iBA1KsBplB,MAkLpC,OAJIs6B,EAAiB,IACjB5jB,EAAW8a,eAAiBkK,EAA0B7iC,GAAQyhC,EAAgB,kBAAmBzhC,EAAMytB,sBAGpG5P,I,wECpPI4nB,IAjCgFxmB,IAQ1F,IAR2F,UAC5Fla,EAAS,MACTC,EAAK,YACLC,EAAW,aACXC,EAAY,UACZC,EAAS,iBACTG,EAAgB,SAChBF,GACH6Z,EACG,IAAKja,EACD,OAAO,KAGX,MAAMid,EAAUtI,2BAAiB,QAASrU,EAAmBugB,oBAAkB7T,iBACzE8H,EAAaC,iCAAuBzU,EAAmB2c,GAE7D,OACIniB,gBAAA,QAAAwD,OAAAC,OAAA,CACIJ,UAAU,4CACVsQ,QAAS1O,EAAS,eACJA,EACdwO,KAAK,QAAO,eACEtO,EAAW,gBACVC,EAAY,aACf+c,EAAQ0D,cAAcC,OAASzgB,EAAY,GAAGA,KAAa8c,EAAQ0D,cAAcC,QAAUzgB,EACvGH,MAAOA,EACPwO,KAAK,mBACDsG,EAAU,CACd1U,SAAUA,O,i0BCyCtB,MAAMsgC,UAAqB5lC,YAgCvBC,YAAmBC,GAA4C,IAAA2lC,EAAA1mB,EAAA2mB,EAC3D3lC,MAAMD,GAAM2lC,EAAAllC,KAhCC,KAAAolC,kBAAiD,IAAIliB,IAErD,KAAAmiB,2BAAqFhmC,cACrF,KAAAimC,OAAkCjmC,cAE3C,KAAAkmC,mBAAmC,GAI1B,KAAAC,4BAA8C,CAC3D1lB,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCulB,GAAI,CAAEzlB,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,YAAaC,EAAG,EAAGC,EAAG,IAEnCG,UAAU,EACVqlB,iBAAiB,GAGJ,KAAAC,8BAAgD,CAC7D7lB,UAAW,CACPC,GAAI,CAAEC,EAAG,YAAaC,EAAG,IAAKC,EAAG,GACjCE,GAAI,CAAEJ,EAAG,YAAaC,EAAG,IAAKC,EAAG,IAErCG,UAAU,EACVqlB,iBAAiB,GA+NJ,KAAAE,UAAY,KACzB5lC,KAAKyf,SAAS,CAAEomB,WAAW,KAGd,KAAAC,SAAW,KACxB9lC,KAAKyf,SAAS,CAAEomB,WAAW,KAMd,KAAAE,KAAO,KAEpB,GADAC,uCAC0B5lC,IAAtBJ,KAAKimC,aACL,OAGJ,MAAMC,EAAYlmC,KAAKimC,aAAe,EAAIjmC,KAAKgN,MAAMm5B,YAAc,EACnEnmC,KAAKomC,UAAUF,GAEflmC,KAAKqmC,uBAMQ,KAAAC,SAAW,KACxBN,kCACA,MAAMO,EAASvmC,KAAKgN,MAAMw5B,kBACpBN,EAAYlmC,KAAKymC,cAAiBF,EAASA,EAAOllC,OAAS,EAAI,EAAKrB,KAAKgN,MAAMm5B,YAAc,EACnGnmC,KAAKomC,UAAUF,GACflmC,KAAKqmC,uBAGQ,KAAAD,UAAaliC,IAC1B,MAAM,SAAEwiC,GAAa1mC,KAAKT,MAAMiB,OAC1BmmC,EAAe3mC,KAAKgN,MAAMm5B,YAC1BS,EAAa5mC,KAAKgN,MAAMw5B,kBACD,IAADK,EACwCC,EADpE,GAAIJ,GAAYE,EACZ,IAA0B,QAAtBC,EAAAD,EAAW,GAAG1iC,UAAQ,IAAA2iC,OAAA,EAAtBA,EAAwBE,kBAAmBC,YAAUC,MAClC,QAAnBH,EAAA9mC,KAAKslC,OAAO4B,eAAO,IAAAJ,GAAnBA,EAAqBK,YAClB,GAAIP,EAAW,GAAGD,GAAgBI,iBAAmBC,YAAUC,MAAO,CAAC,IAADG,EACtD,QAAnBA,EAAApnC,KAAKslC,OAAO4B,eAAO,IAAAE,GAAnBA,EAAqBC,QAG7BrnC,KAAKyf,SAAS,CAAE0mB,YAAajiC,KA+LhB,KAAAojC,yBAA2B,CAACC,EAAuBrjC,EAAe6P,KAC/E,MAAMyzB,EAAYD,EAAUC,UAC5B,GAAIA,EAAW,CAAC,IAADC,EACX,MAAMC,EAA0B1nC,KAAKT,MAAMiB,OACrCmnC,EAAkB3nC,KAAKT,MAAM4C,UAC7BylC,EAAgC,GACtCA,EAAcC,QAAUL,EAAUxlC,GAClC4lC,EAAclkC,MAAQ8jC,EAAU9jC,MAChCkkC,EAAcE,SAAWN,EAAUO,SAC/BP,EAAUQ,YACVJ,EAAcK,eAAiBT,EAAUQ,UAAUE,KAEnC,QAApBT,EAAID,EAAUW,cAAM,IAAAV,GAAhBA,EAAkBW,mBAClBR,EAAcS,sBAAwBb,EAAUW,OAAOC,kBAE3D,MAAME,EAA+B,CAAEZ,UAASa,SAAUX,GACpDvuB,EAAa,CACfrX,GAAI,GAAGhC,KAAKT,MAAMyC,sBAAsBkC,KAE5C,OACI7E,gBAAC4nC,IAAK,CAACvkC,UAAU,2BAA2B8lC,UAAW,CAAEv1B,IAAKu0B,EAAWltB,eAAgBta,KAAKT,MAAMsC,QAAQU,UACxGlD,gBAACopC,SAAM5lC,OAAAC,OAAA,CACH4lC,IAAK1oC,KAAKslC,OACVqD,WAAYL,EACZM,SAAU5oC,KAAKT,MAAMsC,QAAQU,QAAQsmC,OAAOD,SAC5CjB,gBAAiBA,GACbtuB,KAKpB,OAAOrZ,KAAK8oC,kBAAkB/0B,IAGjB,KAAAg1B,iBAAmB,SAChCC,EACAj1B,EACA7P,GAAa,IACb+kC,EAAA9S,UAAA90B,OAAA,QAAAjB,IAAA+1B,UAAA,IAAAA,UAAA,GAA0B,OAE1B92B,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFwX,eAAgB4qB,EAAK3lC,MAAMsC,QAAQuH,cAAckR,eACjD5X,UAAU,0BACNsmC,EAAK,CACTG,YAAuB,IAAVjlC,EAAcghC,EAAKkE,cAAgBJ,EAAMd,IACtDl0B,aAAckxB,EAAK3lC,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,EACfs1B,oBAAoB,OACpBrnC,GAAI,GAAGkjC,EAAK3lC,MAAMyC,sBAAsBkC,IACxColC,sBAAuBL,EACvBM,oBAA+B,IAAVrlC,MAIZ,KAAAslC,kBAAoB,CACjCR,EACAj1B,EACA7P,EACAulC,KAOO,CACHC,4BAA6B,CACzBlmC,IAAK,KACLd,UARQia,IACZ,mCACA8sB,IAAwBvlC,EAAQ,0CAA4C,IAOxET,KAAM,MACNkmB,SAAU,EACV1W,IAAK/O,EACL,aAAc8kC,EAAMW,QACpB,gBAAiBF,IAAwBvlC,EACzCiB,QAASnF,KAAK4pC,0BAA0B1lC,GACxC2lC,UAAW7pC,KAAK8pC,4BAA4B5lC,IAEhD6lC,QACI1qC,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFwX,eAAgBta,KAAKT,MAAMsC,QAAQuH,cAAckR,eACjD5X,UAAU,+BACNsmC,EAAK,CACTG,YAAuB,IAAVjlC,EAAclE,KAAKopC,cAAgBJ,EAAMd,IACtDl0B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,EACfs1B,oBAAoB,OACpBW,sBAAuBhqC,KAAKgN,MAAMi9B,wBAClCV,oBAA+B,IAAVrlC,OAWpB,KAAAgmC,sBAAwB,CACrC3C,EACAxzB,EACA7P,EACAulC,KAEA,MAAMU,EAAUxtB,IACZ,mCACA8sB,IAAwBvlC,EAAQ,0CAA4C,IAG1EsjC,EAAYD,EAAUC,UAC5B,IAAIwB,EASJ,OAPIA,EADAxB,WAAWQ,UACHR,EAAUQ,UAEV,CACJE,IAAK,SAIN,CACHwB,4BAA6B,CACzBlmC,IAAK,KACLd,UAAWynC,EACX1mC,KAAM,MACNkmB,SAAU,EACV1W,IAAK/O,EACL,aAAc8kC,EAAMW,QACpB,gBAAiBF,IAAwBvlC,EACzCiB,QAASnF,KAAK4pC,0BAA0B1lC,GACxC2lC,UAAW7pC,KAAK8pC,4BAA4B5lC,IAEhD6lC,QACI1qC,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFwX,eAAgBta,KAAKT,MAAMsC,QAAQuH,cAAckR,eACjD5X,UAAU,+BACNsmC,EAAK,CACTG,YAAaH,EAAMd,IACnBl0B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,EACfs1B,oBAAoB,OACpBW,sBAAuBhqC,KAAKgN,MAAMi9B,wBAClCV,oBAA+B,IAAVrlC,OAWpB,KAAAkmC,YAAelmC,GAAmBmmC,IAC/CrqC,KAAKolC,kBAAkBvqB,IAAI3W,EAAOmmC,IAGrB,KAAAP,4BAA+B5lC,GACpCuG,IACAA,EAAM6/B,QAAUC,WAASC,OAAS//B,EAAM6/B,QAAUC,WAASE,QAC3DhgC,EAAMigC,iBAEN1qC,KAAKomC,UAAUliC,KAKV,KAAA0lC,0BAA6B1lC,GAClCuG,IACJA,EAAMigC,iBAEN1qC,KAAKomC,UAAUliC,IA0LN,KAAAymC,sBAAwB,CAACpD,EAAuBrjC,EAAe6P,KAC5E,MAAMyzB,EAAYD,EAAUC,UAC5B,IAAIwB,EASJ,OAPIA,EADAxB,WAAWQ,UACHR,EAAUQ,UAEV,CACJE,IAAK,SAKT7oC,gBAAA,OAAKqD,UAAU,yBACXrD,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFwX,eAAgBta,KAAKT,MAAMsC,QAAQuH,cAAckR,eACjD5X,UAAU,gCACNsmC,EAAK,CACTG,YAAaH,EAAMd,IACnBl0B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,EACfs1B,oBAAoB,OACpBW,sBAAuBhqC,KAAKgN,MAAMi9B,wBAClCV,oBAA+B,IAAVrlC,KAEzB7E,gBAAA,OAAKqD,UAAU,wCAEXrD,gBAAA,UACIqE,MAAO1D,KAAKT,MAAM4C,UAAUyoC,oBAC5BnnC,KAAK,SACLilC,IAAK1oC,KAAKqlC,2BACVlgC,QAASnF,KAAK6qC,gBACdnoC,UAAU,8CA8Db,KAAA+jC,YAAc,IAAiC,IAA3BzmC,KAAKgN,MAAMm5B,YAE/B,KAAAF,WAAa,KAC1B,MAAMM,EAASvmC,KAAKgN,MAAMw5B,kBAC1B,OAAOD,GAAUvmC,KAAKgN,MAAMm5B,cAAgBI,EAAOllC,OAAS,GAG/C,KAAAwpC,gBAAkB,KAC/B7qC,KAAK8qC,gBAyBQ,KAAAC,iBAAoBC,IACjC,MACIjqC,MACIgP,SAAW9O,OAAQ8O,IACtB,UACD5N,GACAnC,KAAKT,MACT,IAAIinC,EAAoBxmC,KAAKgN,MAAMw5B,mBAE9BA,GAAqBz2B,IACtBy2B,EAAoB,CAACxmC,KAAKirC,uBAAuBl7B,KAErD,MAAMm7B,EAAgB,CAClB1nC,IAAK2nC,WACLzoC,UAAW,6BACXwb,MACIsoB,GACAA,EAAkBviC,IAAI,CAACma,EAAkBla,IACrClE,KAAKorC,6BAA6BJ,EAAU5sB,EAAMpe,KAAKqrC,qBAAsBnnC,GAAO,IAE5FiiC,YAAanmC,KAAKgN,MAAMm5B,YACxBJ,KAAM/lC,KAAK+lC,KACXO,SAAUtmC,KAAKsmC,SACfgF,UAAU,EACVC,kBAAmBppC,EAAUqpC,8BAC7BC,kBAAmBtpC,EAAUupC,0BAC7BC,yBAA0B3rC,KAAKomC,UAC/BwF,uBAAuB,EACvBC,eAAe,EACfC,UAAU,EACVC,eAAgB/rC,KAAK8lC,SACrBkG,gBAAiBhsC,KAAK4lC,UACtBqG,wBAAyBjsC,KAAKgN,MAAMk/B,qBAElCC,EAAW9sC,gBAAC8rC,WAAQtoC,OAAAC,OAAA,GAAKooC,IAEzBkB,EAAyC,CAC3CC,YAAarsC,KAAKgN,MAAMq/B,YACxBC,SAAUtsC,KAAK8qC,aACfyB,gBAAiBJ,EACjBK,WAAY7vB,IAAW,0BAA2B,6BAEtD,OAAO8vB,wBAAcL,IAGjB,KAAAM,oBAAsB,IACc,YAApC1sC,KAAKT,MAAMiB,OAAOmsC,cAp9BtB3sC,KAAK8qC,aAAe9qC,KAAK8qC,aAAarpB,KAAKzhB,MAC3CA,KAAKgN,MAAQ,CACTm5B,YAAa,EACbN,WAAW,EACX+G,eAAe,EACfP,aAAa,EACbQ,eAAe,EACf5C,0BAA2BjqC,KAAKT,MAAMiB,OAAOssC,qBAGjD9sC,KAAKqrC,qBACoE,QADhD7sB,EACW,QADX2mB,EACrB5lC,EAAMiB,OAAOusC,2BAAmB,IAAA5H,IAAI5lC,EAAMiB,OAAOwsC,4BAAoB,IAAAxuB,IAAIxe,KAAKwlC,4BAElFxlC,KAAKitC,iBAAmBjtC,KAAKitC,iBAAiBxrB,KAAKzhB,MACnDA,KAAKktC,wBAA0BltC,KAAKktC,wBAAwBzrB,KAAKzhB,MACjEA,KAAKmtC,oBAAsBntC,KAAKmtC,oBAAoB1rB,KAAKzhB,MACzDA,KAAKotC,2BAA6BptC,KAAKotC,2BAA2B3rB,KAAKzhB,MACvEA,KAAKqtC,yBAA2BrtC,KAAKqtC,yBAAyB5rB,KAAKzhB,MAGhEstC,WAEH,MAAgB,OADHA,mBAAS,CAAEC,QAASC,cAAYC,SAAU5rC,QAAS7B,KAAKT,MAAMsC,QAAQU,UAIhF,0BAAuB,IAAAmrC,EAAAzrB,EAC1B,MAAM0rB,EAAsC,QAAhCD,EAAG1tC,KAAKT,MAAMiB,OAAOotC,mBAAW,IAAAF,IAAA,cACtCG,EAA0C7tC,KAAKT,MAAMiB,OAAOqtC,wCAElE,GADA7tC,KAAK8tC,kBAC8B,QAA/B7rB,EAACjiB,KAAKT,MAAMsC,QAAQU,QAAQwa,WAAG,IAAAkF,GAAQ,QAARA,EAA9BA,EAAgCzhB,cAAM,IAAAyhB,IAAtCA,EAAwC8rB,mBAC/B,gBAANJ,EACA,QAAqCvtC,IAAjCJ,KAAKgN,MAAMw5B,mBAAmCxmC,KAAKT,MAAMwB,KAAKitC,iCAAiC/sC,OAAQ,CAAC,IAADgtC,EACvG,MAAM1H,QAAe2H,YACjBluC,KAAKT,MAAMwB,KAAKitC,iCAAiC/sC,OACjDjB,KAAKT,MAAMsC,QAAQuH,cACqB,QADR6kC,EAChCjuC,KAAKT,MAAMiB,OAAO2tC,8BAAsB,IAAAF,IAAIjuC,KAAK2lC,qCAE/C3lC,KAAKouC,WAAW7H,QACnB,QAAqCnmC,IAAjCJ,KAAKgN,MAAMw5B,mBAAmCxmC,KAAKT,MAAMwB,KAAKgP,QAAQ9O,OAAQ,CAAC,IAADotC,EACrF,MAAMt+B,EAAU/P,KAAKT,MAAMwB,KAAKgP,QAAQ9O,OAClCslC,QAAe+H,YACjBv+B,EAAQuU,UACPtkB,KAAKT,MAAMsC,QAAQU,QAAQ0c,YAAYsvB,UACxCvuC,KAAKT,MAAMsC,QAAQuH,cACqB,QADRilC,EAChCruC,KAAKT,MAAMiB,OAAO2tC,8BAAsB,IAAAE,IAAIruC,KAAK2lC,8BACjD51B,EAAQy+B,sBAGNxuC,KAAKouC,WAAW7H,cAEhBvmC,KAAKouC,WAAW,IAgDlC,GA3CAriC,YACI,KAAK,IAAA0iC,EACD,MAAM1+B,EAAU/P,KAAKT,MAAMwB,KAAKgP,QAAQ9O,OACxC,OAAK8O,EAIA89B,GAAkE,QAAvBY,EAAC1+B,EAAQy+B,sBAAc,IAAAC,GAAtBA,EAAwBnqB,SAIlE,GAAGvU,EAAQuU,YAAYvU,EAAQy+B,eAAelqB,WAH1C,GAAGvU,EAAQuU,SAJX,MASfvkB,UACI,MAAMgQ,EAAU/P,KAAKT,MAAMwB,KAAKgP,QAAQ9O,OACxC,IAAIslC,EAAuB,GAC3B,GAAIx2B,EAAS,CAAC,IAAD2+B,EAUFC,EATP,GAA0B,QAA1BD,EAAI1uC,KAAKT,MAAMsC,QAAQkb,WAAG,IAAA2xB,GAAQ,QAARA,EAAtBA,EAAwBluC,cAAM,IAAAkuC,GAA9BA,EAAgCX,iBAChCxH,QAAeqI,YACX7+B,EAAQuU,SACRtkB,KAAK0sC,uBACJ1sC,KAAKT,MAAMsC,QAAQU,QAAQ0c,YAAYsvB,UACxCvuC,KAAKT,MAAMsC,QAAQuH,cACnB2G,EAAQzC,KACRugC,EAA0C99B,EAAQy+B,oBAAiBpuC,QAGvEmmC,QAAe+H,YACXv+B,EAAQuU,UACPtkB,KAAKT,MAAMsC,QAAQU,QAAQ0c,YAAYsvB,UACxCvuC,KAAKT,MAAMsC,QAAQuH,cACqB,QADRulC,EAChC3uC,KAAKT,MAAMiB,OAAO2tC,8BAAsB,IAAAQ,IAAI3uC,KAAK2lC,8BACjDkI,EAA0C99B,EAAQy+B,oBAAiBpuC,SAGrEJ,KAAKouC,WAAW7H,cAEhBvmC,KAAKouC,WAAW,KAG9B,CAAES,iBAAiB,IAGb,cAANlB,GAAoC3tC,KAAKT,MAAMwB,KAAK+tC,eAAe7tC,OAAQ,CAAC,IAAD8tC,EAC3E,MAAMxI,QAAe2H,YACjBluC,KAAKT,MAAMwB,KAAK+tC,eAAe7tC,OAC/BjB,KAAKT,MAAMsC,QAAQuH,cACqB,QADR2lC,EAChC/uC,KAAKT,MAAMiB,OAAO2tC,8BAAsB,IAAAY,IAAI/uC,KAAK2lC,qCAE/C3lC,KAAKouC,WAAW7H,IAIvB15B,sBAAsBC,EAAkDC,GAC3E,OAAI/M,KAAKgN,QAAUD,GAAa/M,KAAKT,MAAMwB,OAAS+L,EAAU/L,KAM3DkM,SAAM,IAAA+hC,EAAAC,EACT,MAAM,GAAEjtC,EAAE,OAAExB,EAAM,UAAE2B,GAAcnC,KAAKT,OAEjC,UAAEmD,EAAS,sBAAEkpC,GAA0BprC,EAEvC0uC,EAAkD,aAA5B1uC,EAAO2uC,sBAE7BC,EAA+BpvC,KAAKstC,YAAc9sC,EAAO6uC,kBAAmB,EAC5EC,EACc,WAAhB9uC,EAAO+uC,UAAgC,SAAoC,cAAhB/uC,EAAO+uC,UAAmC,YAAuB,GAC1H5B,EAAsC,QAAhCqB,EAAGhvC,KAAKT,MAAMiB,OAAOotC,mBAAW,IAAAoB,IAAA,cAEtCQ,EAAqD,QAAhCP,EAAGjvC,KAAKT,MAAMsC,QAAQkb,IAAIvc,cAAM,IAAAyuC,OAAA,EAA7BA,EAA+BQ,qBACxB,IAADtjB,EAAhCnsB,KAAKT,MAAMwB,KAAKgP,QAAQ9O,SACxBjB,KAAKopC,cAAgBsG,8BACjB1vC,KAAKT,MAAMwB,KAAKgP,QAAQ9O,OAAOw2B,OAC/Bz3B,KAAKT,MAAMsC,QAAQU,QAAQ0c,YACG,QADQkN,EACtCnsB,KAAKT,MAAMsC,QAAQU,QAAQwa,WAAG,IAAAoP,GAAQ,QAARA,EAA9BA,EAAgC3rB,cAAM,IAAA2rB,OAAA,EAAtCA,EAAwC4hB,mBAMhD,GAHIyB,GAAyBxvC,KAAKopC,gBAC9BppC,KAAKopC,cAAgB,GAAGppC,KAAKopC,iBAAiBoG,KAE9CxvC,KAAKT,MAAMiB,OAAOssC,sBAAwB9sC,KAAKgN,MAAMw5B,mBAAqBxmC,KAAKgN,MAAM6/B,cAAe,CAAC,IAAD8C,EACpG,IAAIpJ,EAAuB,GACvBuI,EAAkC,GAC5B,gBAANnB,GAAsC3tC,KAAKT,MAAMwB,KAAKitC,iCAAiC/sC,OACvF6tC,EAAiB9uC,KAAKT,MAAMwB,KAAKitC,iCAAiC/sC,OACrD,cAAN0sC,GAAoC3tC,KAAKT,MAAMwB,KAAK+tC,eAAe7tC,SAC1E6tC,EAAiB9uC,KAAKT,MAAMwB,KAAK+tC,eAAe7tC,QAEpDslC,EAASuI,EAAe7qC,IAAI2rC,IAAgB,IAAAC,EAAA1tB,EACxC,MAAO,CACH+lB,IAAsB,QAAnB2H,EAAED,EAAcE,WAAG,IAAAD,IAAI,GAC1BlG,QAASoG,YACL/vC,KAAKT,MAAMsC,QAAQuH,cAAckR,eACjCta,KAAK0sC,sBACyB,QADJvqB,EAC1BniB,KAAKT,MAAMwB,KAAKgP,QAAQ9O,cAAM,IAAAkhB,OAAA,EAA9BA,EAAgC7U,KAChCsiC,EAAcI,YAI1B,MAAMC,EAAwC,QAA3BN,EAAG3vC,KAAKT,MAAMiB,OAAO+lC,cAAM,IAAAoJ,IAAI,GAClD3vC,KAAKulC,mBAAqB,IAAIvlC,KAAKkwC,8BAA8B3J,MAAY0J,GAEjF,MAAME,EAA4BnwC,KAAKowC,sBAAsBhB,EAAqBE,GAC5Ee,EAAqCrwC,KAAKswC,iCAC1CviC,EAASC,IAAA,GACPhO,KAAKT,OAA+C,IACxDyN,MAAOhN,KAAKgN,MACZi4B,aAAc,CACVv2B,YAAa1O,KAAKT,MAClBmD,UAAWia,IAAW,qBAAoBuyB,EAAa,WAAa,IAAMxsC,IAE9EmnB,MAAOulB,EAAsBpvC,KAAK+qC,iBAAiBuE,GAAgB,KACnEiB,eAAgBvwC,KAAK6qC,gBACrB2F,uBAAwBxwC,KAAK4pC,0BAC7B6G,yBAA0BzwC,KAAK8pC,4BAC/B4G,cAAe,CACXltC,IAAK2nC,WACLzoC,UAAW,6BACXwb,MAAOiyB,EAA0BjyB,MACjCioB,YAAanmC,KAAKgN,MAAMm5B,YACxBJ,KAAM/lC,KAAK+lC,KACXO,SAAUtmC,KAAKsmC,SACfgF,UAAU,EACVC,kBAAmBppC,EAAUqpC,8BAC7BC,kBAAmBtpC,EAAUupC,0BAC7BC,yBAA0B3rC,KAAKomC,UAC/BwF,uBAAiD,IAA1BA,EACvB+E,kBAAmBxuC,EAAUyuC,kBAC7B7E,eAAgB/rC,KAAK8lC,SACrBkG,gBAAiBhsC,KAAK4lC,UACtB3yB,IAAKk9B,EAA0BxxB,MAEnCkyB,WAAY,CACRC,yBAA0B,CAAEpuC,UAAW,0CACvCquC,kCAAmC,CAC/BvtC,IAAKwtC,sBACLtuC,UAAW,+BACXuuC,SAAU/B,EACVgC,iBAAkB/uC,EAAUqpC,8BAC5B2F,iBAAkBhvC,EAAUupC,0BAC5B0F,SAAUpvC,EACVqvC,YAAY,EACZp+B,IAAK3H,KAAKgmC,UAAUjB,EAAmC1xB,OAE3DT,MAAOmyB,EAAmCnyB,SAIlD,OAAOle,KAAKT,MAAM6P,WAAWrB,GAM1Bs4B,sBACHrmC,KAAKyf,SAAS,CAAEmtB,eAAe,IAmD3B0D,iCAA8B,IAAAiB,EAClC,MAAM/K,EAAgD,QAA/B+K,EAAGvxC,KAAKgN,MAAMw5B,yBAAiB,IAAA+K,IAAIvxC,KAAKulC,mBACzD4I,EAAyBnuC,KAAKT,MAAMiB,OAAO2tC,uBAC7CA,IACAA,EAAuBzI,iBAAkB,GAK7C,IAF6BzzB,kBAAgBC,YAAYs0B,GAE9B,CACvB,GAAIxmC,KAAKgN,MAAMwkC,WAAY,CACvB,MAAMC,EAAa,EACnB,MAAO,CACHvzB,MAAO,CAACle,KAAK0xC,uBAAuBvD,EAAwBsD,EAAYzxC,KAAKgN,MAAMm5B,cACnFxnB,KAAM,CAAC,UAGf,MAAO,CAAET,MAAO,GAAIS,KAAM,IAG9B,MAAO,CACHT,MAAO,IAEAsoB,EAAmBviC,IAAI,CAACma,EAAkBla,IACrCka,EAAK2oB,iBAAmBC,YAAUC,MAC3BjnC,KAAKkqC,sBACR9rB,EACA+vB,UAA0BnuC,KAAK2lC,8BAC/BzhC,EACAlE,KAAKgN,MAAMm5B,aAGRnmC,KAAKwpC,kBACRprB,EACA+vB,UAA0BnuC,KAAK2lC,8BAC/BzhC,EACAlE,KAAKgN,MAAMm5B,eAM3BxnB,KAAM,IAAI6nB,EAAmBviC,IAAIma,GAAQA,EAAK8pB,OAI9CkI,sBAAsBhB,EAA8BE,GAAoB,IAAAqC,EAC5E,MAAMnL,EAAgD,QAA/BmL,EAAG3xC,KAAKgN,MAAMw5B,yBAAiB,IAAAmL,IAAI3xC,KAAKulC,mBACzDyH,EAAuBhtC,KAAKT,MAAMiB,OAAOwsC,qBAC3CA,IACAA,EAAqBtH,iBAAkB,GAG3C,MAAMkM,EAAWxC,EAAsB,aAAeE,EAItD,OAF6Br9B,kBAAgBC,YAAYs0B,GASlD,CACHtoB,MAAO,IAEAsoB,EAAmBviC,IAAI,CAACma,EAAkBla,IAClClE,KAAKorC,6BACRwG,EACAxzB,EACA4uB,UAAwBhtC,KAAKwlC,4BAC7BthC,KAKZya,KAAM,IAAI6nB,EAAmBviC,IAAIma,GAAQA,EAAK8pB,OAnB1CloC,KAAKgN,MAAMwkC,WACJ,CAAEtzB,MAAO,CAACle,KAAK8oC,kBAAkBkE,IAAwBruB,KAAM,CAAC,UAEpE,CAAET,MAAO,GAAIS,KAAM,IAoB1B,iBAAiB4nB,GACrB,MAAMsL,EAAe7xC,KAAKT,MAAMiB,OAAO+lC,QAAU,GAC3CuL,EAA2B9xC,KAAKkwC,8BAA8B3J,GAE/D11B,QAAQkhC,IACTD,EAAW7tC,IAAIlE,UACX,GAAIwnC,EAAUR,iBAAmBC,YAAUC,OAASM,EAAUW,IAC1D,IACI,MACML,EADM,IAAIptB,IAAI8sB,EAAUW,KACVttB,aAAavY,IAAI,QACjCwlC,IACAN,EAAUC,gBAAkBwK,YAAwBnK,EAAS7nC,KAAKT,MAAMsC,QAAQuH,gBAEtF,MAAOrH,GACD/B,KAAKT,MAAMuC,WACX9B,KAAKT,MAAMuC,UAAU+e,MAAM,gCAIvC,OAAO0mB,KAEbxgC,KAAKwgC,IACH,MAAMX,EAAaW,EAAUx/B,OAAO4iB,GAE5BA,EAAQoc,iBAAmBC,YAAUC,OACpCtc,EAAQoc,iBAAmBC,YAAUC,YAA+B7mC,IAAtBuqB,EAAQ6c,WAI/DxnC,KAAKyf,SAAS,CACV+mB,kBAAmB,IAAII,KAAeiL,GACtC1L,YAAa,EACbqL,WAAYS,KAAKC,MACjBjI,yBAAyB,MAIjCjqC,KAAKyf,SAAS,CACV+mB,kBAAmB,IAAIsL,KAAeD,GACtC1L,YAAa,EACbqL,WAAYS,KAAKC,MACjBjI,yBAAyB,IAIzB6D,iBACJ9tC,KAAKyf,SAAS,CACVotB,eAAe,IAIfzB,6BACJwG,EACAO,EACAp+B,EACA7P,GAC0B,IAA1B+kC,EAAA9S,UAAA90B,OAAA,QAAAjB,IAAA+1B,UAAA,IAAAA,UAAA,GAEA,GAAIgc,EAAMpL,iBAAmBC,YAAUC,MACnC,OAAIgC,GAA0B,eAAb2I,EACNvyC,2BAAA,KAAGW,KAAKsnC,yBAAyB6K,EAAOjuC,EAAO6P,IAEnD1U,2BAAA,KAAGW,KAAK2qC,sBAAsBwH,EAAOjuC,EAAO6P,IAEnD,GAAI/T,KAAKstC,WACL,OAAIrE,EACOjpC,KAAKoyC,8BAA8BD,EAAOnyC,KAAKqrC,qBAAsBnnC,GAEzElE,KAAKqyC,6BAA6BF,EAAOp+B,EAAe7P,GAGnE,OAAQ0tC,GACJ,IAAK,YACD,OAAO5xC,KAAKoyC,8BAA8BD,EAAOnyC,KAAKqrC,qBAAsBnnC,GAEhF,IAAK,SACD,OAAOlE,KAAKsyC,yBAAyBH,EAAOnyC,KAAKqrC,qBAAsBnnC,GAE3E,IAAK,aACD,OAAOlE,KAAKqyC,6BAA6BF,EAAOp+B,EAAe7P,GAKvE,OAAO7E,2BAAA,KAAGW,KAAK+oC,iBAAiBoJ,EAAOp+B,EAAe7P,EAAO+kC,IAI7DiH,8BAA8B3J,GAAqB,IAAAgM,EAAAC,EAAAC,EAAAC,EACvD,MAAMC,EAAmF,QAA5DJ,EAAGvyC,KAAKT,MAAMiB,OAAOoyC,+CAAuC,IAAAL,KACzF,IAAIM,EAAgBtM,UAAU,GAC9B,MAAMuM,GACD37B,mBAAiBC,kBAAgD,QAA/Bo7B,EAACxyC,KAAKT,MAAMwB,KAAKgP,QAAQ9O,cAAM,IAAAuxC,OAAA,EAA9BA,EAAgCO,mBACnE57B,mBAAiBC,kBAAgD,QAA/Bq7B,EAACzyC,KAAKT,MAAMwB,KAAKgP,QAAQ9O,cAAM,IAAAwxC,OAAA,EAA9BA,EAAgCjE,gBAClEwE,EAAuC,QAAjCN,EAAG1yC,KAAKT,MAAMwB,KAAKgP,QAAQ9O,cAAM,IAAAyxC,OAAA,EAA9BA,EAAgCjb,OAU/C,OATIkb,GAA2BG,GAAoBE,IAC/CH,EAAgBA,EAAc9qC,OAAOqW,IAAO,IAAA60B,EAExC,QAD8D,QAA5BA,EAAG70B,EAAK8W,4BAAoB,IAAA+d,OAAA,EAAzBA,EAA2BC,gCAG/DjhC,kBAAgBC,YAAY2gC,KAC7BA,EAAgBtM,UAAU,KAG3BsM,EAiLHP,yBAAyBtJ,EAAmBj1B,EAA+B7P,GAAa,IAAAivC,EAC5F,OACI9zC,gBAAA,OACIqD,UAAW,mBAAkB1C,KAAKgN,MAAM4/B,cAAgB,SAAW,IACnElE,IAAK1oC,KAAKoqC,YAAYlmC,GAAM,aACW,QADXivC,EAChBnzC,KAAKT,MAAMiB,OAAO4yC,iBAAS,IAAAD,IAAIE,oBAE3Ch0C,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFwX,eAAgBta,KAAKT,MAAMsC,QAAQuH,cAAckR,eACjD5X,UAAU,0BACNsmC,EAAK,CACTG,YAAuB,IAAVjlC,EAAclE,KAAKopC,cAAgBJ,EAAMd,IACtDl0B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,EACfs1B,oBAAoB,OACpBlkC,QAASnF,KAAKmtC,oBACdmG,YAActzC,KAAKgN,MAAM4/B,eAAiB5sC,KAAKktC,8BAA4B9sC,EAC3E4B,GAAI,GAAGhC,KAAKT,MAAMyC,sBAAsBkC,IACxColC,uBAAqB,EACrBU,sBAAuBhqC,KAAKgN,MAAMi9B,0BAA4BjqC,KAAKT,MAAMiB,OAAO6uC,gBAChF9F,oBAA+B,IAAVrlC,KAEzB7E,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFW,KAAK,eACL6W,eAAgBta,KAAKT,MAAMsC,QAAQuH,cAAckR,eACjD5X,UAAU,6BACNsmC,EAAK,CACTG,YAAuB,IAAVjlC,EAAclE,KAAKopC,cAAgBJ,EAAMd,IACtD/iC,QAASnF,KAAKitC,iBACdj5B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,EACfs1B,oBAAoB,OACpBrnC,GAAI,GAAGhC,KAAKT,MAAMyC,aAAakC,IAC/BqvC,YAAcvzC,KAAKgN,MAAM4/B,eAAiB4G,mCAA+BpzC,EACzEkpC,uBAAqB,EACrBU,sBAAuBhqC,KAAKgN,MAAMi9B,0BAA4BjqC,KAAKT,MAAMiB,OAAO6uC,gBAChF9F,oBAA+B,IAAVrlC,MAM7BgpC,wBAAwBziC,GAAyC,IAAAgpC,EACrEC,iCAAuBjpC,EAAkC,QAA7BgpC,EAAEzzC,KAAKT,MAAMiB,OAAO4yC,iBAAS,IAAAK,IAAIE,OAAON,qBAGhEO,kCAAkCnpC,GACtC,MAAMopC,EAAS7zC,KAAKgN,MAAMi9B,wBAA2Bx/B,EAAMopC,OAA8BppC,EAAMC,cAE/F,GAAK1K,KAAKgN,MAAMk/B,oBAiBZ2H,EAAOC,MAAMC,UAAY,GACzBF,EAAO7W,UAAUhhB,OAnBgB,wBAoBjC63B,EAAOG,cAAeF,MAAMG,SAAW,GACvCj0C,KAAKyf,SAAS,CACVysB,qBAAqB,QArBQ,CAAC,IAADgI,EACjC,MAAMC,EAASN,EAAOO,wBAChBhB,EAAYl8B,OAAkC,QAA5Bg9B,EAACl0C,KAAKT,MAAMiB,OAAO4yC,iBAAS,IAAAc,IAAIb,oBAElDgB,EAAY5pC,EAAM6pC,QAAUH,EAAOI,KACnCC,EAAY/pC,EAAMgqC,QAAUN,EAAOO,IACnCC,EAAkBN,EAAYjB,EAC9BwB,EAAkBJ,EAAYpB,EAEpCS,EAAOC,MAAMC,UAAY,SAASX,KAClCS,EAAO7W,UAAUC,IAXgB,wBAYjC4W,EAAOG,cAAeF,MAAMG,SAAW,OACvCJ,EAAOG,cAAea,SAASF,EAAkBN,EAAWO,EAAkBJ,GAC9Ex0C,KAAKyf,SAAS,CACVysB,qBAAqB,KAYzBiB,oBAAoB1iC,GAAyC,IAAAqqC,EAC7Dp6B,OAAOq6B,YAAc,IAErB/0C,KAAK4zC,kCAAkCnpC,IAG3CuqC,8BAAoBvqC,EAAkC,QAA7BqqC,EAAE90C,KAAKT,MAAMiB,OAAO4yC,iBAAS,IAAA0B,IAAInB,OAAON,qBACjErzC,KAAKyf,SAAS,CACVmtB,eAAe,KAIfK,iBAAiBxiC,GACrBwqC,oCAA0BxqC,GAC1BzK,KAAKyf,SAAS,CACVmtB,eAAe,IAIfQ,2BAA2B3iC,GAC3BiQ,OAAOq6B,YAAc,IAErB/0C,KAAK4zC,kCAAkCnpC,IAI3CyqC,8BAAoBzqC,GAEpBzK,KAAKyf,SAAS,CACVmtB,eAAe,KAIfS,yBAAyB5iC,GAC7B0qC,kCAAwB1qC,GAExBzK,KAAKyf,SAAS,CACVmtB,eAAe,IAIfwF,8BAA8BpJ,EAAmBj1B,EAA+B7P,GAAa,IAAAkxC,EACjG,OACI/1C,gBAAA,OAAKqD,UAAU,+BACXrD,gBAAA,oBAC2C,QAD3C+1C,EACgBp1C,KAAKT,MAAMiB,OAAO4yC,iBAAS,IAAAgC,IAAI/B,mBAC3C3wC,UAAU,8BACVe,KAAK,eACL4xC,WAAYr1C,KAAKqtC,yBACjBloC,QAASnF,KAAKqtC,yBACdkG,YAAcvzC,KAAKgN,MAAM4/B,eAAiB0I,iCAA6Bl1C,IAE3Ef,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFwX,eAAgBta,KAAKT,MAAMsC,QAAQuH,cAAckR,eACjD5X,UAAU,0BACNsmC,EAAK,CACTG,YAAuB,IAAVjlC,EAAclE,KAAKopC,cAAgBJ,EAAMd,IACtDl0B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzC7O,QAASnF,KAAKotC,2BACdr5B,cAAeA,EACfs1B,oBAAoB,OACpBiK,YAActzC,KAAKgN,MAAM4/B,eAAiB2I,kCAA8Bn1C,EACxE4B,GAAI,GAAGhC,KAAKT,MAAMyC,sBAAsBkC,IACxColC,uBAAqB,EACrBU,sBAAuBhqC,KAAKgN,MAAMi9B,0BAA4BjqC,KAAKT,MAAMiB,OAAO6uC,gBAChF9F,oBAA+B,IAAVrlC,MAM7BmuC,6BAA6BrJ,EAAmBj1B,EAA+B7P,GACnF,OACI7E,gBAAA,OAAKqD,UAAU,yBACXrD,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFwX,eAAgBta,KAAKT,MAAMsC,QAAQuH,cAAckR,eACjD5X,UAAU,0BACNsmC,EAAK,CACTG,YAAuB,IAAVjlC,EAAclE,KAAKopC,cAAgBJ,EAAMd,IACtDl0B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,EACfs1B,oBAAoB,OACpBW,sBAAuBhqC,KAAKgN,MAAMi9B,wBAClCV,oBAA+B,IAAVrlC,KAEzB7E,gBAAA,OAAKqD,UAAU,kCAEXrD,gBAAA,KACIsb,KAAK,sBACLjX,MAAO1D,KAAKT,MAAM4C,UAAUyoC,oBAC5BnnC,KAAK,SACLilC,IAAK1oC,KAAKqlC,2BACVlgC,QAASnF,KAAK6qC,gBACdnoC,UAAU,mDAoDtBuoC,uBAAuBl7B,GAAsB,IAAAylC,EACjD,MAAO,CACHtN,IAA4B,QAAzBsN,EAAEzlC,EAAQ0L,uBAAe,IAAA+5B,IAAI,IAIhC1M,kBAAkB/0B,GACtB,OACI1U,gBAAA,OAAKqD,UAAU,0BACXrD,gBAAC6pC,IAAK,CACF5uB,eAAgBta,KAAKT,MAAMsC,QAAQuH,cAAckR,eACjD5X,UAAU,gCACVwlC,IAAI,QACJl0B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,UAAiB/T,KAAKwlC,4BACrC6D,oBAAoB,WAM5BqI,uBACJ39B,EACA7P,EACAulC,GAMA,MAAO,CACHC,4BAA6B,CACzBlmC,IAAK,KACLd,UAPQia,IACZ,mCACA8sB,IAAwBvlC,EAAQ,0CAA4C,IAMxET,KAAM,MACNkmB,SAAU,EACV1W,IAAK,QACL,aAAc,GACd,gBAAiBw2B,IAAwBvlC,EACzCiB,QAASnF,KAAK4pC,0BAA0B1lC,GACxC2lC,UAAW7pC,KAAK8pC,4BAA4B5lC,IAEhD6lC,QACI1qC,gBAAC6pC,IAAK,CACF5uB,eAAgBta,KAAKT,MAAMsC,QAAQuH,cAAckR,eACjD5X,UAAU,0CACVwlC,IAAI,QACJl0B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,UAAiB/T,KAAK2lC,8BACrC0D,oBAAoB,WAiB5ByB,eACJ,GAAI9qC,KAAKgN,MAAMq/B,YAAa,CAAC,IAADoJ,EACe,QAAvCA,EAAAz1C,KAAKqlC,2BAA2B6B,eAAO,IAAAuO,GAAvCA,EAAyCC,QACzC,MAAMC,EAAY31C,KAAKolC,kBAAkB/iC,IAAIrC,KAAKgN,MAAMm5B,aACxD,GAAIwP,GAAaA,EAAUC,UAAYD,EAAUC,SAASv0C,QAAU,EAAG,CACnE,MAAM2nC,EAAQ2M,EAAUC,SAAS,GAAGlZ,cAAc,OAC9CsM,GACAA,EAAM6M,gBAAgB,SAG9B71C,KAAKyf,SAAS,CACVmtB,eAAe,IAGvB5sC,KAAKyf,SAAS,CACVmtB,eAAe,EACfP,aAAcrsC,KAAKgN,MAAMq/B,cAE7BrG,kCACA8P,sCAyDO7Q,a,6TCpkCR,MAAMnjB,EAGTxiB,YAAmB2f,GAQZ,KAAA82B,YAAc,IAAcC,wBAAc,mCAAoCh2C,KAAKif,aAMnF,KAAAg3B,mBAAqB,IAAc,mCAMnC,KAAAC,cAAgB,IAAiB,OAnBpCl2C,KAAKif,YAAcA,GAqCpBlf,eAAegiB,EAClBvB,EACA3e,GAGA,IAAK2e,EAAMvB,YAAYsvB,UACnB,MAAM,IAAI4H,MAAM,0EAEpB,MACMtuC,SADkBuuC,uBAAav0C,IACdgG,KACjBsV,QAAiBmE,sCAA4B,IAAIC,0BAA2B1f,GAE5EmF,EAAqC,GAG3C,QAAa5G,IAATyH,IAAuBoK,kBAAgBC,YAAYiL,GACnD,OAAOtM,QAAQC,QAAQ9J,GAa3B,aAV4BqvC,sBAAoBntC,wBAC5C,CACIC,cAAetH,EACfwH,oBAAqBC,2BAAyBC,qCAAqC1H,IAEvFsb,EAASlZ,IAAI8L,GAAWA,EAAQuU,UAChC,GAdiB,GAyBiCgyB,YAA2B,CACjFt0C,GAAI,6EACJwN,OAAQuS,EACRvB,MAjDiB+1B,GACV,IAAIz0B,EAAqCy0B,EAAUj8B,eAAe2E,eAmD9Du3B,I,iCCtGf,MA0Da54B,EAAsBre,IAC/B,MAAM,SAAE4d,EAAQ,UAAED,EAAS,eAAE/b,GAAmB5B,EAChD,OAAO4B,EAtB4B0c,EACnCC,EACAX,EACA5d,KAEA,MAAM6d,EAAsC,GAC5C,GAAIU,GAAaA,EAAUzc,OAAS,EAAG,CAEnC,MAAM0c,EAAmBd,YAAkBa,EAAWX,EAAU5d,GACvC,OAArBwe,GACAX,EAAWpL,KAAK+L,GAGxB,OAAOX,GAUDS,CAA+BX,EAAWC,EAAU5d,GA7D9Bye,EAC5Bd,EACAC,EACA5d,KAEA,MAAM6d,EAAsC,GAC5C,IAAKD,GAAgC,IAApBA,EAAS9b,OAEtB,OADA9B,EAAMsC,QAAQC,UAAUC,MAAM,iDACvB,KAGX,MAAMkc,EAAyBC,GAAsBC,IAAQD,EAAOE,GAAQA,EAAK/N,oBAE3EgO,GADsBH,EACahB,EADSiB,IAAQD,EAAOE,GAAQA,EAAK7X,eAAlD2X,MAE5B,MAAMI,EAA6B,GAqBnC,OAlBAzb,OAAO0b,QAAQF,GAAe3F,QAAQ8F,IAAwC,IAAtCC,EAAcC,GAAoBF,EAEtEH,EAAcI,GAAgBR,EAAsBS,GACpDJ,EAAetM,KAAKiM,EAAsBS,MAI9C7b,OAAO8b,KAAKL,GAAgB5F,QAAQzF,IAChC,MAAM6K,EAAYQ,EAAerL,GACjCpQ,OAAO8b,KAAKb,GAAWpF,QAAQxU,IAC3B,MAAM8D,EAAW8V,EAAU5Z,GACrB6Z,EAAmBd,YAAkBjV,EAAUmV,EAAU5d,GACtC,OAArBwe,GACAX,EAAWpL,KAAK+L,OAKrBX,GA2BDY,CAAwBd,EAAWC,EAAU5d,I,gBCpDhDQ,eAAe6e,EAAiBC,GACnC,MAAMC,EAAgC,GAatC,aAXMC,8CAAoC,IAAIC,mCAAiCH,EAAIvE,eAAe2E,aAAcJ,GAC3G9X,KAAKmY,IACEA,IACAJ,EAAcI,iBAAmBA,KAGxC1X,MAAMzF,IACH8c,EAAI/c,UAAUqd,UAAUpd,GACjB,KAGR+c,E,ykBCqFX,IAAMM,EAAN,cAAmB/f,IAAMggB,UAarB/f,YAAmBC,GACfC,MAAMD,GAPF,KAAAuW,gCAA0C,EAE1C,KAAAwJ,YAAsB,EAEb,KAAAC,iBAA2B,uBA0P3B,KAAAC,mBAAsB/U,IACnCzK,KAAKyf,SAAS,CACVC,qBAAsB1f,KAAKgN,MAAM0S,uBAOxB,KAAAC,0BAA4B,KACzC3f,KAAK4f,wBA+dQ,KAAAC,iBAAoB9L,GAE7BA,GAAiB,CACb+L,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCG,UAAU,GASL,KAAAC,0BAA6BC,IAC1C,GAAIvgB,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAQ,CAC7B,MAAMuf,EAAQ,CACVC,YAAa,CAACF,EAAiB7P,OAAQkG,aAE3C5W,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAChByf,gBAAgBF,GAChBzZ,KAAK,KACF/G,KAAK2gB,eAAenZ,MAAMzF,IACtB/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,+BAGlCrZ,MAAMzF,IACH/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,kCAU1B,KAAA1M,6BAA+B,CAAClT,EAAsC+O,KAC7D,UAAlB/O,EAAOV,QAAsByP,GAC7BhQ,KAAKsgB,0BAA0BtQ,IAWtB,KAAA8Q,uBAAyB,CAACC,EAA4BnE,EAAkBxB,KACrF4F,YACIhhB,KAAK8V,+BACL9V,KAAKT,MAAMwB,KAAK8G,KAAK5G,OACrBjB,KAAKT,MAAMuC,UACX9B,KAAKT,MAAMwB,KAAKoc,SAASlc,OACzB8f,EACAnE,GAEC7V,KAAMka,IACH,GAAiC,aAA7BA,aAAgB,EAAhBA,EAAkB1gB,QAMlB,OALAP,KAAK2gB,eAAenZ,MAAMzF,IACtB/B,KAAKT,MAAMuC,UAAU8e,QAAS7e,EAAgB6B,SAC9C5D,KAAKT,MAAMuC,UAAU+e,MAAM,8BAGxB,EAGX,IAAK1J,mBAAiBC,kBAAkB6J,GAAmB,CAAC,IAADC,EAEvD,MAAMC,EAA0C,CAC5CzQ,OAAQyG,mBAAiBC,kBAAkB2J,EAAiBrQ,QAAU,IAAMqQ,EAAiBrQ,OAC7F+H,mBAAoB,CAChB,CACIG,aAAc3G,kBAAgBC,YAAY+O,EAAiBG,mBACrDH,EAAiBG,kBAAkB,GAAGxI,aACtC,GACNzR,iBAA+C,QAA/B+Z,EAAED,EAAiB/Z,oBAAY,IAAAga,OAAA,EAA7BA,EAA+B/Z,oBAK7DnH,KAAKyf,SAAS,CACVpH,gBAAiB,CAAEC,uBAAwB,CAAC6I,MAIpD,OAAO,IAEV3Z,MAAM,KACI,IAGR,GAMM,KAAA6Z,0BAA4B,KACrCrhB,KAAK8V,gCAELwL,sCAA4B,IAAIC,0BAA2BvhB,KAAKT,MAAMsC,QAAQuH,eACzErC,KAAKhH,SAAYC,KAAK2gB,gBACtBnZ,MAAOzF,IACJ/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,EAAM6B,SACnC5D,KAAKT,MAAMuC,UAAU+e,MAAM,8BA/0BvC7gB,KAAK6E,iBAAmB8F,6BACpB3K,KAAKT,MAAMsC,QAAQU,QAAQqI,kBAC3B5K,KAAKT,MAAMsL,aACX7K,KAAKT,MAAMuC,WAEf9B,KAAKwhB,QAAUtI,2BAAiB,QAASlZ,KAAK6E,iBAAkB,IAChE7E,KAAKwf,mBAAqBxf,KAAKwf,mBAAmBiC,KAAKzhB,MACvDA,KAAK2f,0BAA4B3f,KAAK2f,0BAA0B8B,KAAKzhB,MAErEA,KAAKgN,MAAQ,CACT0S,qBAAqB,EACrBZ,cAAe,GACf4C,aAAa,EACbhO,0BAAsBtT,EACtBiY,gBAAiB,IAOlB,0BACHrY,KAAKsf,YAAa,EAClB,MAAM,OACF9e,EACAqB,SAAS,cAAEuH,IACXpJ,KAAKT,MAQ4B,IAADuL,GANpC9K,KAAK8V,qCACM9V,KAAK2hB,2CAA+C3hB,KAAKy2C,iCAChEz2C,KAAK8V,sCACC9V,KAAK2gB,eAGXngB,EAAOohB,2BACH5hB,KAAKsf,YAAyC,QAA/BxU,EAAI9K,KAAKT,MAAMwB,KAAK8G,KAAK5G,cAAM,IAAA6J,GAA3BA,EAA6BjD,KAAKC,WACrD9H,KAAKyf,SAAS,CAAEX,oBAAqBF,EAAiBxV,KAG1D2C,YACI,SAAAhB,EAAA,OAAiC,QAAjCA,EAAM/K,KAAKT,MAAMwB,KAAK8G,KAAK5G,cAAM,IAAA8J,OAAA,EAA3BA,EAA6BlD,KAAKC,WACxC/H,UACQC,KAAKsf,YACLtf,KAAKyf,SAAS,CAAEX,oBAAqBF,EAAiBxV,QAKtE2C,YACI,SAAA8V,EAAA,OAAiC,QAAjCA,EAAM7hB,KAAKT,MAAMwB,KAAK8G,KAAK5G,cAAM,IAAA4gB,OAAA,EAA3BA,EAA6Bha,KAAKC,WACxC/H,UACI,GAAIC,KAAKsf,WAAY,CACjB,MAAMkB,EAAQ,IAAIsB,uCAAqC1Y,EAAckR,eAAe2E,aACpFjf,KAAKyf,SAAS,CAAE/L,2BAA4BqO,EAAiCvB,EAAOpX,QAS7F4Y,uBACHhiB,KAAKsf,YAAa,EASfzS,sBAAsBC,EAAkCC,GAC3D,OAAI/M,KAAKgN,QAAUD,GAAa/M,KAAKT,MAAMwB,OAAS+L,EAAU/L,KAO3DkM,SAAM,IAAAgV,EAAAC,EAAAC,EAAAhV,EAAA+e,EACT,MACInrB,MACI8G,MAAQ5G,OAAQ4G,GAChBsV,UAAYlc,OAAQkc,IAExBtb,SACIU,SACI2S,MAAM,gBAAED,EAAe,UAAEmN,KAEhC,UACDjgB,GACAnC,KAAKT,MAEH8iB,EAAmBC,YAAW,WAAYtiB,KAAKT,MAAMsC,QAAQuH,gBAAkB,GAC/EmZ,EAAoBD,YAAW,OAAQtiB,KAAKT,MAAMsC,QAAQuH,gBAAkB,GAC5EoZ,EAAcxiB,KAAKyiB,eAAexN,EAAiBoN,EAAkBD,GAAa,IAClFM,EAAc7a,GAAQA,EAAKA,KAAKC,WAA4C,IAA/BD,EAAKA,KAAKC,UAAUzG,OACjEyc,EAAY9d,KAAK2iB,gBACjBhb,EAA0D,QAArCsa,EAAGjiB,KAAKT,MAAMsC,QAAQU,QAAQC,eAAO,IAAAyf,OAAA,EAAlCA,EAAoCra,sBAC5Dmb,EAAgC6B,qCACd,QADwC1C,EAC5Dra,aAAI,EAAJA,EAAMA,KAAKC,iBAAS,IAAAoa,IAAI,GACmB,QADjBC,EAC1BniB,KAAKT,MAAMwB,KAAK2W,qBAAqBzW,cAAM,IAAAkhB,IAAI,GAC/CniB,KAAKT,MAAMsC,QAAQuH,cACnB+T,UAAY,GACZxV,GAGE+F,IACDqV,WAA+BK,WAC9BL,IAAkC/iB,KAAKgN,MAAM0U,eAC9C5D,GAAYA,EAAUgH,KAAK9U,GAAYA,EAAStC,UAC/CqX,EAAsE,QAAtC5X,EAAGnN,KAAKT,MAAMwB,KAAKqM,aAAanM,cAAM,IAAAkM,OAAA,EAAnCA,EAAqC3L,KAC1E4L,GAAsC,oEAAtBA,EAAaE,MAE3B0X,EAAwBD,aAAgC,EAAhCA,EAAkCxX,WAE1D,aAAEH,GAAiBpN,KAAKT,MAAMwB,KAC9B21C,GACiB,QAAnBxqB,EAAA9e,EAAanM,cAAM,IAAAirB,GAA4E,QAA5EA,EAAnBA,EAAqB1qB,KAAM4c,GAHQ,2DAGeA,EAAK9Q,aAAwC,IAAA4e,OAAA,EAA/FA,EAAiG3e,aAAa,EAC5GopC,EAAmBC,YAAa52C,KAAKT,MAAMsC,QAAQU,SACzDs0C,4BAAkBF,GAClB,MAAMr4B,EAAiBzW,WAAM1G,gBAAkB6jB,EAAwBhlB,KAAKilB,oBAAsB,KAClGjlB,KAAKwhB,QAAQ0D,cAAcC,MAAQC,oBAAkBC,SACrD,MAAMC,EAA6BhM,iCAAuBtZ,KAAK6E,iBAAkB7E,KAAKwhB,SACtFxhB,KAAKwhB,QAAQ0D,cAAcC,MAAQC,oBAAkBG,cACrD,MAAMC,EAA4BlM,iCAAuBtZ,KAAK6E,iBAAkB7E,KAAKwhB,SACrFxhB,KAAKwhB,QAAQ0D,cAAcC,MAAQC,oBAAkBK,eACrD,MAAMC,EAA2BpM,iCAAuBtZ,KAAK6E,iBAAkB7E,KAAKwhB,SAGpF,GAAIuB,IAAkCA,EAA8BK,QAAS,CACzE,GAAI4B,GAA4C,OAAnB1G,EACzB,IAAK,MAAMqH,KAAiBrH,EACxBte,KAAK4lB,wCAAwCD,EAAe5C,GAIpE/iB,KAAK4lB,wCAAwC9H,EAAWiF,GAG5D,MAAMhV,EAASC,IAAA,GACRhO,KAAKT,OAAK,IACbmD,UAAWia,IAAW,WACtBjZ,MAAOrE,IAAAwmB,cAAA,MAAInjB,UAAU,qBAAqBP,EAAU2jB,WACpDje,KAAM7H,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAC3B8kB,iBAAkB,CAAErjB,UAAW,uBAC/BsjB,oBAAqB,CAAEtjB,UAAWmF,WAAM1G,eAAiB,8BAAgC,6BACzF8kB,kBAAmB,CAAEvjB,UAAWmF,WAAM1G,eAAiB,6BAA+B,4BACtF+b,UAAWY,EACXQ,iBACA4H,UAAWlmB,KAAKmmB,gBAChBjH,iBAAkBlf,KAAKomB,iBACvBvkB,QAAS7B,KAAKT,MAAMsC,QACpBI,SAAUjC,KAAKT,MAAM0C,SACrBH,UAAW9B,KAAKT,MAAMuC,UACtBE,GAAIhC,KAAKT,MAAMyC,GACfgjB,wBACAqB,2BAA4BlkB,EAAUkkB,2BACtCC,oBAAqBrU,kBAAgBC,YAAYrK,aAAI,EAAJA,EAAMA,KAAKC,WACxDD,WAAM1G,eACF9B,IAAAwmB,cAAA,MAAInjB,UAAU,gCAAgCP,EAAUokB,qBAExDlnB,IAAAwmB,cAAA,MAAInjB,UAAU,8BAA8BP,EAAUqkB,mBAE1D,KACJC,sBAAuBzmB,KAAK0mB,4BAC5BC,wBAAyB3mB,KAAK4mB,8BAC9BC,2BAA6BnE,EAUzB,KATArjB,IAAAwmB,cAAC7gB,SAAMnC,OAAAC,OAAA,CACHoC,SAAUwI,EACVhL,UAAU,yBACViY,KAAM6H,EACN9e,MAAOvB,EAAU2kB,qBACbxB,GAEHnjB,EAAU2kB,qBAGnBC,sBACKrE,GAAgBzN,IAAmBjV,KAAKT,MAAMiB,OAAOwmB,wBAUlD,KATA3nB,IAAAwmB,cAAC7gB,SAAMnC,OAAAC,OAAA,CACHoC,SAAUwI,EACVhL,UAAU,8BACViY,KAAM0H,EACN3e,MAAOvB,EAAU8kB,0BACbzB,GAEHrjB,EAAU8kB,0BAGvBC,sBAAwBxE,EAAgD,KAAlC1iB,KAAKT,MAAM4nB,MAAMC,eACvDC,8BAA+B,CAAE3kB,UAAW,8CAC5C4kB,qBACIjoB,IAAAwmB,cAAC7gB,SAAMnC,OAAAC,OAAA,CACHJ,UAAU,gCACNgjB,EAAwB,CAC5B/K,KAAM4H,EACN7e,MAAOvB,EAAUolB,4BAEhBplB,EAAUolB,2BAGnBC,6BACIxnB,KAAKynB,6BAA+BtK,EAChC9d,IAAAwmB,cAAC6B,mCAAgC,CAC7BpT,kCAAmCtU,KAAK2nB,2CAA2CxlB,GACnFoS,mCAAoCvU,KAAK4nB,0CAA0CzlB,GACnF0lB,yCAA0C7nB,KAAK8nB,kDAAkD3lB,GACjGsS,uDAAwDzU,KAAK+nB,gEACzD5lB,GAEJ6lB,kCAAmC7lB,EAAU6lB,kCAC7CC,yCAA0C9lB,EAAU8lB,yCACpDpmB,QAAS7B,KAAKT,MAAMsC,QACpBG,GAAIhC,KAAKT,MAAMyC,GACfC,SAAUjC,KAAKT,MAAM0C,SACrB4/B,oCAAqC6U,IAAoC,EACzE3U,UAAW4U,EACX51C,KAAM,CACF6T,eAAgB5U,KAAKT,MAAMwB,KAAK6T,eAAe3T,OAC/C6c,UAAW9d,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAQ4G,KAAKC,UAC7C+M,oBAAqB7U,KAAKT,MAAMwB,KAAK8T,oBAAoB5T,UAGjE,KACRinB,qCAAsC,KACtCG,cACIroB,KAAKT,MAAM4nB,MAAMkB,eAAiBroB,KAAKT,MAAM4nB,MAAMkB,cAAchnB,OAAS,EAAIrB,KAAKT,MAAM4nB,MAAMkB,cAAc,GAAK,KACtHnU,uBAAwBlU,KAAKsgB,0BAC7BnM,6BAA8BnU,KAAKmU,6BACnCmU,iBAAkBjpB,IAAAwmB,cAAC7W,UAAO,CAACtM,UAAU,wCACrC6lB,kBAAmD,WAAhCvoB,KAAKT,MAAMwB,KAAK8G,KAAKtH,OAAsBP,KAAKT,MAAM4C,UAAUqmB,wBAA0B,KAC7GC,eAAgBzoB,KAAKT,MAAMwB,KAAK8G,KAAK5G,QAAUjB,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAOynB,QAC3EC,mBAAoB3oB,KAAK4oB,uBAAuB9K,GAChDjZ,iBAAkB7E,KAAK6E,mBAG3B,OAAO7E,KAAKT,MAAM6P,WAAWrB,GAwBzB6R,uBACJ5f,KAAKyf,SAAS,CACVC,qBAAqB,IAQrB+H,4BAAyB,IAAAoB,EAAAC,EAC7B,MAAMjhB,EAA2B,QAAvBghB,EAAG7oB,KAAKT,MAAMwB,KAAK8G,YAAI,IAAAghB,OAAA,EAApBA,EAAsB5nB,OACnC,OAAIkW,mBAAiBC,kBAAkBvP,KAASA,EAAK1G,mBAKjDkZ,YAAiBra,KAAKT,MAAMsC,QAAQuH,cAAckR,iBAClDta,KAAKT,MAAMwB,KAAK6T,eAAe3T,QAC/BgR,kBAAgBC,YAAqB,QAAV4W,EAACjhB,EAAKA,YAAI,IAAAihB,OAAA,EAATA,EAAWhhB,YACvC9H,KAAKT,MAAMwB,KAAK8T,oBAAoB5T,QAYpCmlB,iBACJ,OACIpmB,KAAKT,MAAMiB,OAAOohB,yBAClB2I,YAAe,CACXvoB,GAAIhC,KAAKuf,iBACTwJ,mBAAoB/oB,KAAKgN,MAAM0S,oBAC/B0J,cAAeppB,KAAKwf,mBACpB2J,mBAAoBnpB,KAAK2f,0BACzBqJ,WAAYhpB,KAAKgN,MAAM8R,cAAcI,iBACrC/c,UAAW,CACPsnB,uBAAwBzpB,KAAKT,MAAM4C,UAAUsnB,uBAC7CR,kBAAmBjpB,KAAKT,MAAM4C,UAAU8mB,kBACxCC,sBAAuBlpB,KAAKT,MAAM4C,UAAU+mB,sBAC5CsB,8BAA+BxqB,KAAKT,MAAM4C,UAAUqoB,iCAW5D5E,wCACJ9H,EACA2M,GAEA,MAAM,UAAEtoB,GAAcnC,KAAKT,MAE3B,GACI0S,kBAAgBC,YAAY4L,KAC3B2M,EAAkCrH,SACnCnR,kBAAgBC,YAAYuY,EAAkCpH,qBAE9D,IAAK,MAAMqH,KAAsBD,EAAkCpH,oBAAqB,CACpF,MAAMrb,EAAW8V,aAAS,EAATA,EAAWtc,KAAKmpB,IAAO,IAAAC,EAAA,OAAgB,QAAZA,EAAAD,EAAQ5pB,YAAI,IAAA6pB,OAAA,EAAZA,EAAc5a,SAAS4H,aAAc8S,IAC7E1iB,IACAA,EAASjG,MAAQI,EAAU0oB,uBAC3B7iB,EAAS0F,UAAW,IAW5Bkb,uBAAuB9K,GAC3B,MAAMgN,EACDhN,GACGA,EACK7Z,IAAI+L,IAAW,IAAA+a,EAIZ,MAFmC,QAAbA,EAAA/a,EAASjP,YAAI,IAAAgqB,GAAS,QAATA,EAAbA,EAAehb,eAAO,IAAAgb,OAAA,EAAtBA,EAAwB1U,iBAAkBC,sBAAoBC,UAE9DvG,EAASjO,MAAO,CAAC,IAADipB,EAClC,MAAMC,EACFjb,EAASjP,MAA6B,QAAzBiqB,EAAIhb,EAASjP,KAAKgP,eAAO,IAAAib,GAArBA,EAAuB1d,KAClC,GAAG0C,EAASjP,KAAKgP,QAAQzC,SAAS0C,EAASjO,QAC3CiO,EAASjO,MAEnB,OACI1C,IAAAwmB,cAAA,OAAK5S,IAAKgY,EAAWvoB,UAAU,mBAC1BuoB,GAKb,OAAO,OAEVljB,OAAQqc,KAAgCA,IACjD,GAEJ,MAAO,CACH8G,QAAS,CACL1nB,IAAK2nB,QACLzoB,UAAW,YACXonB,OAAQgB,EAAUzpB,OAAS,EAC3B4D,MAAO,SACPmmB,WAAW,EACX,aAAcprB,KAAKT,MAAM4C,UAAUkpB,8BAEvCC,OACIjsB,IAAAwmB,cAAA,OAAKnjB,UAAU,oBAAmB,cAAa,QAC3CrD,IAAAwmB,cAAA,QAAMnjB,UAAU,6BAChBrD,IAAAwmB,cAAA,YAAO7lB,KAAKT,MAAM4C,UAAUkpB,+BAGpCE,OAAQT,GAQRlE,8BACJ,MACI7lB,MACI8G,MAAQ5G,OAAQ4G,IACnB,UACD/F,EAAS,UACTK,GACAnC,KAAKT,MAET,OAAOsI,WAAM1G,eACP0qB,YAAe,CACXC,gBAAiB3pB,EAAU4pB,iBAC3BC,aAAc7pB,EAAU6pB,aACxBnkB,KAAMA,EAAKA,KACXhG,QAAS7B,KAAKT,MAAMsC,QACpBI,SAAUjC,KAAKT,MAAM0C,SACrBH,YACAE,GAAIhC,KAAKT,MAAMyC,UAEnB5B,EAOFsmB,4BAAyB,IAAAuF,EAAA6qB,EAAA3qB,EAC7B,MACIprB,MACI8G,MAAQ5G,OAAQ4G,GAAM,4BACtBhB,GACH,UACD/E,EAAS,UACTK,GACAnC,KAAKT,MAEHsjB,EAAuB7iB,KAAKT,MAAMsC,SAAW7B,KAAKT,MAAMsC,QAAQU,SAAWvC,KAAKT,MAAMsC,QAAQU,QAAQC,QAEtG4K,EAAyB,QAAb6e,EAAGjsB,KAAKT,aAAK,IAAA0sB,GAAM,QAANA,EAAVA,EAAYlrB,YAAI,IAAAkrB,OAAA,EAAhBA,EAAkB7e,aACjCxN,EAAoCwN,SAAoB,QAAR0pC,EAAZ1pC,EAAcnM,cAAM,IAAA61C,GAA2D,QAA3DA,EAApBA,EAAsBt1C,KAAK4c,GAF/B,oEAEuCA,EAAK9Q,aAAuC,IAAAwpC,OAAA,EAA/EA,EACpCvpC,UAEA6e,GAA+G,KAAjD,QAArCD,EAAAnsB,KAAKT,MAAMsC,QAAQU,QAAQwa,IAAIvc,cAAM,IAAA2rB,OAAA,EAArCA,EAAuCE,4CAEtE,OAAOxJ,IAAwB5Q,kBAAgBC,YAAYrK,aAAI,EAAJA,EAAMA,KAAKC,YAAeD,WAAM1G,oBAqBrFf,EApBAksB,YAAa,CACTzkB,KAAMA,EAAMA,KACZ0kB,cAAepqB,EAAUqqB,oBACzBC,cAAetqB,EAAUuqB,uBACzBC,iBAAkBxqB,EAAUyqB,aAC5BC,SAAU1qB,EAAU2qB,kBACpBhB,gBAAiB3pB,EAAU4qB,WAC3BC,oBAAqB7qB,EAAU6qB,oBAC/BnrB,QAAS7B,KAAKT,MAAMsC,QACpBI,SAAUjC,KAAKT,MAAM0C,SACrBD,GAAIhC,KAAKT,MAAMyC,GACfirB,mBAAoB9qB,EAAU+qB,sBAC9BC,SAAUhrB,EAAUD,UACpB2gB,uBACAjjB,oCACAiH,4BAA6BA,aAA2B,EAA3BA,EAA6B5F,OAC1Da,YACAsrB,qBAAsBvlB,EAAMA,KAAKwlB,qBACjCC,iBAAkBlB,IASxBjG,gBACJ,MACIplB,MACI8G,MAAQ5G,OAAQ4G,IACnB,UACD1F,GACAnC,KAAKT,MAET,OACIsI,GACIxI,IAAAwmB,cAAC0H,qBAAkB,CACf1lB,KAAMA,EACN2lB,qBAAsBrrB,EAAUqrB,qBAChCC,qBAAsBtrB,EAAUsrB,qBAChCC,yBAA0BvrB,EAAUurB,yBACpCC,4BAA6BxrB,EAAUwrB,4BACvCC,gBAAiB,IACjBvH,2BAA4BlkB,EAAUkkB,2BACtCwH,gBAAiB1rB,EAAU0rB,gBAC3BC,0BAA2B3rB,EAAU2rB,0BACrCC,8BAA+B5rB,EAAU4rB,8BACzCC,iCAAkC7rB,EAAU6rB,iCAC5CC,4BAA6B9rB,EAAU+rB,4BACvCrsB,QAAS7B,KAAKT,MAAMsC,QACpBG,GAAIhC,KAAKT,MAAMyC,GACfC,SAAUjC,KAAKT,MAAM0C,SACrBlB,KAAM,GACN8D,iBAAkB7E,KAAK6E,mBAW/B8iB,2CAA2CxlB,GAC/C,MAAO,CACHgsB,yBAA0BhsB,EAAUgsB,yBAEpCC,wBAAyBjsB,EAAUisB,wBACnCC,4BAA6BlsB,EAAUksB,4BAEvCC,gCAAiCnsB,EAAUmsB,gCAC3CC,iCAAkCpsB,EAAUosB,iCAC5CC,sCAAuCrsB,EAAUqsB,sCAEjDC,oBAAqBtsB,EAAUssB,oBAC/BC,wBAAyBvsB,EAAUusB,wBACnCC,cAAexsB,EAAUwsB,eASzBC,iDAAiDzsB,GACrD,MAAO,CACH0sB,4BAA6B1sB,EAAU0sB,4BACvCC,2BAA4B3sB,EAAU2sB,2BACtCC,0CAA2C5sB,EAAU4sB,0CACrDC,6CAA8C7sB,EAAU6sB,6CACxDC,0CAA2C9sB,EAAU8sB,0CACrD/rB,cAAef,EAAUe,cACzBgsB,kBAAmB/sB,EAAU+sB,kBAC7BC,iBAAkBhtB,EAAUgtB,kBAS5BrH,kDAAkD3lB,GACtD,MAAO,CACH0sB,4BAA6B1sB,EAAU0sB,4BACvCC,2BAA4B3sB,EAAU2sB,2BACtCM,4CAA6CjtB,EAAUitB,4CACvDC,+CAAgDltB,EAAUktB,+CAC1DC,4CAA6CntB,EAAUmtB,4CACvDC,+CAAgDptB,EAAUotB,+CAC1DC,2CAA4CrtB,EAAUqtB,2CACtDC,qDAAsDttB,EAAUstB,sDAShE1H,gEACJ5lB,GAEA,MAAO,CACHutB,yBAA0BvtB,EAAUutB,yBACpCC,8BAA+BxtB,EAAUwtB,8BACzCC,yBAA0BztB,EAAUytB,yBACpCC,+BAAgC1tB,EAAU0tB,gCAS1CjI,0CAA0CzlB,GAC9C,MAAO,CACH2tB,yBAA0B3tB,EAAU4tB,0BACpCC,wBAAyB7tB,EAAU8tB,mBACnCC,2BAA4B/tB,EAAU+tB,2BACtCC,yBAA0BhuB,EAAUiuB,+BAEpCC,yBAA0BluB,EAAUkuB,yBAEpCC,yBAA0BnuB,EAAUouB,8BACpCC,+BAAgCruB,EAAUsuB,0CAQ1C9N,gBAAa,IAAA+N,EAAAmD,EAAAlD,EACjB,MACI5vB,MACI8G,MAAQ5G,OAAQ4G,GAChBiN,WAAa7T,OAAQ6T,GACrBF,gBAAkB3T,OAAQ2T,GAC1BC,qBAAuB5T,OAAQ4T,IAEnChT,SACIU,SAAWC,SAAS,uBAAEkF,GAA2B,CAAEA,4BAAwBtH,KAC9E,OACDI,EAAM,UACNsB,EAAS,UACTK,EAAS,QACTyuB,GACA5wB,KAAKT,MAEHwU,EAAgB/T,KAAK6f,iBAAiBrf,EAAOuT,eAE7CgR,EAAsE,QAAtC2L,EAAG1wB,KAAKT,MAAMwB,KAAKqM,aAAanM,cAAM,IAAAyvB,OAAA,EAAnCA,EAAqClvB,KAC1E4L,GAAsC,oEAAtBA,EAAaE,MAE3B0X,EAAwBD,aAAgC,EAAhCA,EAAkCxX,UAE1D8K,EAAqDrY,KAAKgN,MAAMqL,gBACtE,IAAIwY,EAA0B,GAC1BD,GAAW/tB,OAAO8b,KAAKiS,GAASvvB,OAAS,GAAKuvB,EAAQvI,eAAiBuI,EAAQvI,cAAchnB,OAAS,IACtGwvB,EAAkBD,EAAQvI,cAAc,GAAGrmB,IAE/C,MACM00C,GACiC,QAAnC7iB,EAAA7zB,KAAKT,MAAMwB,KAAKqM,aAAanM,cAAM,IAAA4yB,GAA4E,QAA5EA,EAAnCA,EAAqCryB,KAAM4c,GAFR,2DAE+BA,EAAK9Q,aAAwC,IAAAumB,OAAA,EAA/GA,EAAiHtmB,aACjH,EACJ,OAAO0E,kBAAgBC,YAAYrK,aAAI,EAAJA,EAAMA,KAAKC,WACxCgpB,YAAc,CACV5T,UAAWrV,EAAMA,KAAKC,UACtBmI,sBAAuB4gB,EACvBxY,kBACA8E,SAAUnd,KAAKT,MAAMwB,KAAKoc,SAASlc,OACnCyW,qBAAsB1X,KAAKT,MAAMwB,KAAK2W,qBAAqBzW,OAC3D8vB,uBAAwB/wB,KAAKT,MAAMwB,KAAKrB,gBAAgBuB,OACxDia,SAAkC,QAA1ByV,EAAE3wB,KAAKT,MAAMwB,KAAKma,gBAAQ,IAAAyV,OAAA,EAAxBA,EAA0B1vB,OACpC8S,gBACAsB,oBAAqBrV,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO2iB,mBAAoB,EACvElN,oBAAqB+a,2CAAiChxB,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAOywB,4BACpFtZ,sBAA8E,aAAvD3X,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO0wB,qBACrDld,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCnS,QAAS7B,KAAKT,MAAMsC,QACpBI,SAAUjC,KAAKT,MAAM0C,SACrBD,GAAIhC,KAAKT,MAAMyC,GACfyP,iCAAkCuT,EAClC7iB,UAAW,CACPgvB,WAAYhvB,EAAU8xB,yBACtB7C,YAAajvB,EAAUkvB,0BACvBC,aAAcnvB,EAAUovB,kCACxBC,YAAarvB,EAAUsvB,0BACvBC,aAAcvvB,EAAUwvB,2BACxBC,sBAAuBzvB,EAAU0vB,oBACjCC,uBAAwB3vB,EAAU2vB,uBAClCC,yBAA0B5vB,EAAU4vB,yBACpCC,yBAA0B7vB,EAAU6vB,yBACpCC,mBAAoB9vB,EAAU8vB,mBAC9B/C,kBAAmB/sB,EAAU+sB,kBAC7BC,iBAAkBhtB,EAAUgtB,iBAC5B+C,oBAAqB/vB,EAAUgwB,gBAC/BC,0BAA2BjwB,EAAUiwB,0BACrCC,qBAAoBrkB,EAAA,GACb7L,IAGXL,YACA4S,wBAAyBvS,EAAUuS,wBACnCC,6BAA8BxS,EAAUwS,6BACxCV,iBAAkB9R,EAAUmwB,qBAC5B9f,WAAYrQ,EAAUowB,uBACtBxW,aAAc5Z,EAAUqwB,oBACxB9f,gBAAiBvQ,EAAUswB,uBAC3B3iB,0BAA2B9P,KAAKT,MAAMwB,KAAK+O,0BAA0B7O,OACrE+W,eAAgB7V,EAAU0oB,uBAC1B5S,kBAAmB9V,EAAUuwB,8BAC7Bxa,qBAAsB/V,EAAUwwB,6BAChCtqB,UAAWrI,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAChCmQ,iBAAkBpR,KAAKT,MAAMwB,KAAKqQ,iBAAiBnQ,OACnDiT,uBAAwBlU,KAAKsgB,0BAC7BnM,6BAA8BnU,KAAKmU,6BACnCoH,sCAAuCvb,KAAK8gB,uBAC5ClQ,uBAAwB5Q,KAAKqhB,0BAC7BvM,YACAC,oBAAqB5S,EAAU4S,oBAC/BtN,uBAAwBC,EACxBqQ,cAAevX,EAAOoyB,qBACtB/W,gCAAiCrb,EAAOqb,gCACxChX,iBAAkB7E,KAAK6E,iBACvBiR,+BAAgC9V,KAAK8V,+BAErCxB,kCAAmCtU,KAAK2nB,2CAA2CxlB,GACnFoS,mCAAoCvU,KAAK4nB,0CAA0CzlB,GACnFqS,wCAAyCxU,KAAK4uB,iDAAiDzsB,GAC/FsS,uDAAwDzU,KAAK+nB,gEACzD5lB,GAGJiS,6BAA8BjS,EAAUiS,6BACxCC,gCAAiClS,EAAUkS,gCAC3Cwe,0BAA2B1wB,EAAU0wB,0BACrCC,4BAA6B3wB,EAAU2wB,4BACvCle,iBACAC,sBACAS,oBAAqBtV,KAAKT,MAAMwB,KAAK2W,qBACrCmqB,oCAAqC6U,IAAoC,IAE7E,KAUFj0B,eAAexN,EAA0BoN,EAA0BD,GACvE,GAAInN,EACA,OAAOoN,EAGX,MAAM0Q,EAAgBC,mBAAS3Q,GAC/B,IAAI4Q,EAAY5Q,EAKhB,OAJIlI,IAASC,YAAc2Y,IACvBE,EAAY,GAAGvY,OAAO/J,SAASuiB,SAAS7Q,KAGrC,GAAGD,IAAaA,EAAU+Q,SAAS,KAAa,IAAN,SAAeF,IAiI5D,qBACJ,IAAKjzB,KAAK8V,+BAEN,OADA9V,KAAKyf,SAAS,CAAEiC,aAAa,IACtB2R,cAAYviB,UAGvB,MACI/P,MAAM,KAAE8G,GAAM,UACd/F,EAAS,QACTD,GACA7B,KAAKT,MAEH6hB,QAAyEgS,YAAkBvrB,EAAM/F,EAAWD,GAAS,GAE3H,GAAIuf,EAAmB,CACnB,MAAMgC,GAAWnR,kBAAgBC,YAAYkP,EAAkB9I,wBAC/DtY,KAAKyf,SAAS,CACVpH,gBAAiB+I,EACjBM,YAAa0B,SAGjBpjB,KAAKyf,SAAS,CAAEiC,aAAa,IAGjC,OAAO2R,cAAYviB,UAOf,0CAAuC,IAAAwiB,EAC3C,MAAMC,EAA4D,QAArBD,EAAGtzB,KAAKT,MAAMsC,eAAO,IAAAyxB,GAAS,QAATA,EAAlBA,EAAoB/wB,eAAO,IAAA+wB,GAAK,QAALA,EAA3BA,EAA6BvW,WAAG,IAAAuW,GAAU,QAAVA,EAAhCA,EAAkCE,gBAAQ,IAAAF,OAAA,EAA1CA,EAA4CG,iCAC5F,GAAgD,SAA5CF,EACA,OAAO,EAGX,IAAK,IAADG,EACA,MAAMC,QAAwB3zB,KAAKT,MAAMwB,KAAKqM,aAK9C,MADK,QAFDsmB,EAAAC,EAAgBnyB,KACZ4L,GAAsC,oEAAtBA,EAAaE,aAChC,IAAAomB,OAAA,EAFDA,EAEGnmB,aAAa,GAEhB,OAAO,EAEb,MAAOxL,GAGL,OAFA/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,iCACpB,EAGX,GAAgD,QAA5C0S,EACA,OAAO,EAEX,IACI,MAAM7H,QAAqB1rB,KAAKT,MAAMwB,KAAK8T,oBAC3C,QACM6W,IAC4C,QAA5C6H,GAAqD7H,EAAakI,OACnB,QAA5CL,IAAsD7H,EAAakI,OAE9E,MAAO7xB,GAGL,OAFA/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,gCACpB,GAIP,uCAAoC,IAAAk2B,EACxC,MAAMpjB,QAAwB3zB,KAAKT,MAAMwB,KAAKqM,aAExC4pC,EAAoCrjB,SAEzC,QAFwDojB,EAAfpjB,EAAiBnyB,KACvD4L,GAAsC,wEAAtBA,EAAaE,aAChC,IAAAypC,OAAA,EAFyCA,EAEvCxpC,UAEH,OAAOypC,WAOH/xB,oBAAiB,IAAAgyB,EAAAC,EAAAhqC,EAAA4mB,EAAAC,EAAAC,EACrB,MACIjzB,MACI8G,MAAQ5G,OAAQ4G,GAChBiN,WAAa7T,OAAQ6T,GACrBF,gBAAkB3T,OAAQ2T,GAC1BC,qBAAuB5T,OAAQ4T,IAEnChT,SACIU,SAAWC,SAAS,uBAAEkF,GAA2B,CAAEA,4BAAwBtH,KAC9E,OACDI,EAAM,UACNsB,EAAS,UACTK,EAAS,QACTyuB,GACA5wB,KAAKT,MAEHwU,EAAgB/T,KAAK6f,iBAAiBrf,EAAOuT,eAC7CsE,EAAqDrY,KAAKgN,MAAMqL,gBACtE,IAAIwY,EAA0B,GAC1BD,GAAW/tB,OAAO8b,KAAKiS,GAASvvB,OAAS,GAAKuvB,EAAQvI,eAAiBuI,EAAQvI,cAAchnB,OAAS,IACtGwvB,EAAkBD,EAAQvI,cAAc,GAAGrmB,IAG/C,MAAM+iB,EAAsE,QAAtCkyB,EAAGj3C,KAAKT,MAAMwB,KAAKqM,aAAanM,cAAM,IAAAg2C,OAAA,EAAnCA,EAAqCz1C,KAC1E4L,GAAsC,oEAAtBA,EAAaE,MAE3B0X,EAAwBD,aAAgC,EAAhCA,EAAkCxX,WAC1D,aAAEH,GAAiBpN,KAAKT,MAAMwB,KAE9B21C,GACiB,QAAnBQ,EAAA9pC,EAAanM,cAAM,IAAAi2C,GAA4E,QAA5EA,EAAnBA,EAAqB11C,KAAM4c,GAFQ,2DAEeA,EAAK9Q,aAAwC,IAAA4pC,OAAA,EAA/FA,EAAiG3pC,aAAa,EAClH,OAAOvN,KAAKT,MAAMwB,KAAKoc,WAClBtV,WAAM1G,gBAAkBnB,KAAKT,MAAMwB,KAAKoc,SAASlc,SAClD4G,GACAA,EAAKA,KAAKC,WACVD,EAAKA,KAAKC,UAAUzG,OAAS,GACc,QADb6L,EAC9BlN,KAAKT,MAAMwB,KAAK8F,mCAA2B,IAAAqG,GAA3CA,EAA6CjM,OAC3C2c,EAAmB,CACfV,UAAWrV,EAAKA,KAAKC,UACrBmI,sBAAuB4gB,EACvBxY,kBACA8E,SAAUnd,KAAKT,MAAMwB,KAAKoc,SAASlc,OACnCyW,qBAAsB1X,KAAKT,MAAMwB,KAAK2W,qBAAqBzW,OAC3D8vB,uBAAwB/wB,KAAKT,MAAMwB,KAAKrB,gBAAgBuB,OACxDia,SAAkC,QAA1B4Y,EAAE9zB,KAAKT,MAAMwB,KAAKma,gBAAQ,IAAA4Y,OAAA,EAAxBA,EAA0B7yB,OACpC8S,gBACAsB,oBAAqBrV,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO2iB,mBAAoB,EACvEhiB,gBAAgB0G,aAAI,EAAJA,EAAM1G,kBAAkB,EACxC8U,oBAAqB+a,2CAAiChxB,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAOywB,4BACpFjd,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCnS,QAAS7B,KAAKT,MAAMsC,QACpB4P,iCAAkCuT,EAClC/iB,SAAUjC,KAAKT,MAAM0C,SACrBD,GAAIhC,KAAKT,MAAMyC,GACfG,UAAW,CACPgvB,WAAYhvB,EAAU8xB,yBACtB7C,YAAajvB,EAAUkvB,0BACvBC,aAAcnvB,EAAUovB,kCACxBC,YAAarvB,EAAUsvB,0BACvBC,aAAcvvB,EAAUwvB,2BACxBC,sBAAuBzvB,EAAU0vB,oBACjCC,uBAAwB3vB,EAAU2vB,uBAClCC,yBAA0B5vB,EAAU4vB,yBACpCC,yBAA0B7vB,EAAU6vB,yBACpCC,mBAAoB9vB,EAAU8vB,mBAC9B/C,kBAAmB/sB,EAAU+sB,kBAC7BC,iBAAkBhtB,EAAUgtB,iBAC5B+C,oBAAqB/vB,EAAUgwB,gBAC/BC,0BAA2BjwB,EAAUiwB,0BACrCC,qBAAoBrkB,EAAA,GACb7L,IAGXL,YACA4S,wBAAyBvS,EAAUuS,wBACnCC,6BAA8BxS,EAAUwS,6BACxCV,iBAAkB9R,EAAUmwB,qBAC5B9f,WAAYrQ,EAAUowB,uBACtBxW,aAAc5Z,EAAUqwB,oBACxB9f,gBAAiBvQ,EAAUswB,uBAC3B3iB,0BAA2B9P,KAAKT,MAAMwB,KAAK+O,0BAA0B7O,OACrE+W,eAAgB7V,EAAU0oB,uBAC1B5S,kBAAmB9V,EAAUuwB,8BAC7Bxa,qBAAsB/V,EAAUwwB,6BAChCtqB,UAAWrI,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAChCmQ,iBAAkBpR,KAAKT,MAAMwB,KAAKqQ,iBAAiBnQ,OACnDiT,uBAAwBlU,KAAKsgB,0BAC7BnM,6BAA8BnU,KAAKmU,6BACnCoH,sCAAuCvb,KAAK8gB,uBAC5ClQ,uBAAwB5Q,KAAKqhB,0BAC7BvM,YACAC,oBAAqB5S,EAAU4S,oBAC/BtN,uBAAwBC,EACxBqQ,cAAevX,EAAOoyB,qBACtB/W,gCAAiCrb,EAAOqb,gCACxChX,iBAAkB7E,KAAK6E,iBACvBiR,+BAAgC9V,KAAK8V,+BAErCxB,kCAAmCtU,KAAK2nB,2CAA2CxlB,GACnFoS,mCAAoCvU,KAAK4nB,0CAA0CzlB,GACnFqS,wCAAyCxU,KAAK4uB,iDAAiDzsB,GAC/FsS,uDAAwDzU,KAAK+nB,gEACzD5lB,GAGJiS,6BAA8BjS,EAAUiS,6BACxCC,gCAAiClS,EAAUkS,gCAC3Cwe,0BAA2B1wB,EAAU0wB,0BACrCC,4BAA6B3wB,EAAU2wB,4BACvCle,iBACAC,sBACAhO,4BAAwE,QAA7CktB,EAAE/zB,KAAKT,MAAMwB,KAAK8F,mCAA2B,IAAAktB,OAAA,EAA3CA,EAA6C9yB,OAC1E0W,sBAA8E,aAAvD3X,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO0wB,qBACrD5b,oBAAqBtV,KAAKT,MAAMwB,KAAK2W,qBACrChE,qBAAsB1T,KAAKgN,MAAM0G,uBAA8D,QAA1CsgB,EAAIh0B,KAAKT,MAAMwB,KAAKmzB,8BAAsB,IAAAF,OAAA,EAAtCA,EAAwC/yB,QACjG4gC,oCAAqC6U,IAAoC,IAE7E,OAhjCRt3B,EAAI/P,YAAA,CADTK,KACK0P,GAojCSA,a,sOCrpCfrf,eAAeo3C,EAA2BvH,GACtC,MAAMwH,EAAwB,CAC1BlP,IAAK0H,EAAcE,KAAO,GAC1BnG,QAASiG,EAAcI,SAAW,IAMtC,OAJIJ,EAAcyH,+BACdD,EAAUliB,qBAAuB,CAAEge,6BAA8B,SAG/C,KAAlBkE,EAAUlP,IACH,CAACkP,GAAW,GAGhB,IAAIvmC,QAA+BC,IACtC,IACI,MAAMwmC,EAAO,IAAIC,eACjBD,EAAKE,KAAK,OAAQJ,EAAUlP,KAAM,GAElCoP,EAAKG,iBAAiB,OAAQ,KAC1B3mC,EAAQ,CAACsmC,EAA2B,MAAhBE,EAAK/2C,QAAkC,MAAhB+2C,EAAK/2C,WAGpD+2C,EAAKG,iBAAiB,QAAS,KAC3B3mC,EAAQ,CAACsmC,GAAW,MAGxBE,EAAKI,OACP,MAAAluC,GACEsH,EAAQ,CAACsmC,GAAW,OAKzBr3C,eAAeuuC,EAClBxqB,EACAyqB,EACAnlC,EACA2K,EACA4jC,GAEA,MAAM5V,EAAY6U,YAAaxtC,EAAckR,gBACvCs9B,EAAc,IAAIC,wCAAsC/zB,EAAWyqB,EAAWoJ,EAAiB5V,GAErG,OAAO+V,8CAAoCF,EAAaxuC,GACnDrC,KAAK+nC,GACEA,EACOj+B,QAAQkhC,IAAIjD,EAAe7qC,IAAI2rC,GAAiBuH,EAA2BvH,KAAiB7oC,KAAKgxC,GAC7FA,EAAMhwC,OAAOiwC,GAAQA,EAAK,IAAI/zC,IAAI+zC,GAAQA,EAAK,KAIvD,IAEVxwC,MAAMzF,IACHqH,EAActH,UAAUqd,UAAUpd,GAClCqH,EAActH,UAAU+e,MAAM,sDACvB,KAeZ9gB,eAAe6uC,EAClB9qB,EACA4oB,EACA6B,EACAnlC,EACA6uC,EACAN,GAA+B,IAAAO,EAE/B,MAAMnW,EAAY6U,YAAaxtC,EAAckR,gBAC7C,GAAgC,QAAhC49B,EAAI9uC,EAAckR,sBAAc,IAAA49B,GAAQ,QAARA,EAA5BA,EAA8BrP,cAAM,IAAAqP,GAApCA,EAAsCC,UAAW,CACjD,MAAMnxC,QAAiBoxC,YAAmBhvC,EAAckR,eAAgB,iCAAkC,OAAQ,CAC9GwJ,UAAWA,EACXyqB,UAAWA,EACXxM,UAAWA,IAEf,GAAwB,MAApB/6B,EAASzG,OAET,OADA6I,EAActH,UAAU+e,MAAM,2EACvB,GAEX,MAAMw3B,EAAmBrxC,aAAQ,EAARA,EAAUjG,KACnC,OAAIs3C,EACOA,EAAiBp0C,IAAI2rC,IAAgB,IAAAC,EACxC,MAAO,CACH3H,IAAsB,QAAnB2H,EAAED,EAAcE,WAAG,IAAAD,IAAI,GAC1BlG,QAASoG,YAAW3mC,EAAckR,eAAgBoyB,EAAqBuL,EAAarI,EAAcI,SAClGsI,aAAc1I,EAAc2I,aAC5BxR,eAAgB6I,EAAc4I,eAC9BtjB,qBAAsB0a,EAAcyH,6BAC9B,CACInE,6BAA8B,aAElC9yC,KAIX,GAEX,MAAMw3C,EAAc,IAAIC,wCAAsC/zB,EAAWyqB,EAAWoJ,EAAiB5V,GACrG,OAAO+V,8CAAoCF,EAAaxuC,GACnDrC,KAAK+nC,GACEA,EACOA,EAAe7qC,IAAI2rC,IAAgB,IAAA6I,EACtC,MAAO,CACHvQ,IAAsB,QAAnBuQ,EAAE7I,EAAcE,WAAG,IAAA2I,IAAI,GAC1B9O,QAASoG,YAAW3mC,EAAckR,eAAgBoyB,EAAqBuL,EAAarI,EAAcI,SAClGsI,aAAc1I,EAAc2I,aAC5BxR,eAAgB6I,EAAc4I,eAC9BtjB,qBAAsB0a,EAAcyH,6BAC9B,CACInE,6BAA8B,aAElC9yC,KAIX,IAEVoH,MAAMzF,IACHqH,EAActH,UAAUqd,UAAUpd,GAClCqH,EAActH,UAAU+e,MAAM,sDACvB,KAIZ9gB,eAAemuC,EAClBY,EACA1lC,EACA2K,GAEA,OAAOlD,QAAQkhC,IAAIjD,EAAe7qC,IAAI2rC,GAAiBuH,EAA2BvH,KAC7E7oC,KAAKgxC,GACKA,EAAMhwC,OAAOiwC,GAAQA,EAAK,IAAI/zC,IAAI+zC,GAAQA,EAAK,KAEzDxwC,MAAMzF,IACHqH,EAActH,UAAUqd,UAAUpd,GAClCqH,EAActH,UAAU+e,MAAM,qCACvB,KAUZ9gB,eAAeiyC,EAAwBnK,EAAiBz+B,GAC3D,IAAIk/B,EACJ,GAAIT,EAAS,CACT,MAAM7gC,QAAiB0xC,YAA6BtvC,EAAckR,eAAgB,CAACutB,IAEnF,GAAwB,MAApB7gC,EAASzG,OAET,YADA6I,EAActH,UAAU+e,MAAM,6CAA6CgnB,GAI/E,MAAML,EAAYxgC,EAASjG,KACvBymC,GAAav1B,kBAAgBC,YAAYs1B,KACzCc,EAAkBd,EAAU,IAGpC,OAAOc,I,kOC7LJvoC,eAAeuuC,EAAsBxqB,EAAmByqB,EAAmBnlC,EAA+B2K,GAC7G,MAAM6jC,EAAc,IAAIC,wCACpB/zB,EACAyqB,GAGJ,OAAOuJ,8CAAoCF,EAAaxuC,GACnDrC,KAAK+nC,GACEA,EACOj+B,QAAQkhC,IAAIjD,EAAe7qC,IAAK2rC,GAAkB+I,EAA0B/I,EAAe77B,KAC7FhN,KAAKgxC,GACKA,EAAMhwC,OAAOiwC,GAAQA,EAAK,IAAI/zC,IAAI+zC,GAAQA,EAAK,KAI3D,IACRxwC,MAAMzF,IACLqH,EAActH,UAAUqd,UAAUpd,GAClCqH,EAActH,UAAU+e,MAAM,sDACvB,KAenB9gB,eAAe44C,EAA0B/I,EAA8B77B,GAA6B,IAAA6kC,EAChG,MAAMxB,EAAY,CACdlP,IAAK0H,EAAcE,KAAO,GAC1BnG,QAASiG,EAAcI,SAAW,IAGhC6I,GAA4C,QAAxBD,EAAC7kC,EAAc+L,iBAAS,IAAA84B,OAAA,EAAvBA,EAAyBx4B,GAAIJ,GAAI7H,QAAQ,SAAU,IAE9E,GAAsB,KAAlBi/B,EAAUlP,IACV,MAAO,CAACkP,GAAW,GAGvB,MAAM0B,EAAoB1B,EAAUlP,IAAQ,IAAS2Q,EAErD,OAAO,IAAIhoC,QAAgCC,IACvC,IACI,MAAMwmC,EAAO,IAAIC,eACjBD,EAAKE,KAAK,OAAQsB,GAAgB,GAElCxB,EAAKyB,OAAS,KACVjoC,EAAQ,CAACsmC,EAA2B,MAAhBE,EAAK/2C,QAAkC,MAAhB+2C,EAAK/2C,UAGpD+2C,EAAK0B,QAAU,KACXloC,EAAQ,CAACsmC,GAAW,KAGxBE,EAAKI,OACP,MAAOuB,GACLnoC,EAAQ,CAACsmC,GAAW,O,ykBCAhC,MAAMnS,UAAqB5lC,YAsBvBC,YAAYC,GACRC,MAAMD,GAtBF,KAAA6lC,kBAAiD,IAAIliB,IAC5C,KAAAsiB,4BAA8C,CAC3D1lB,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCulB,GAAI,CAAEzlB,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,YAAaC,EAAG,EAAGC,EAAG,IAEnCG,UAAU,EACVqlB,iBAAiB,GAGJ,KAAAC,8BAAgD,CAC7D7lB,UAAW,CACPC,GAAI,CAAEC,EAAG,YAAaC,EAAG,IAAKC,EAAG,GACjCE,GAAI,CAAEJ,EAAG,YAAaC,EAAG,IAAKC,EAAG,IAErCG,UAAU,EACVqlB,iBAAiB,GA0Jb,KAAAE,UAAY,KAChB5lC,KAAKyf,SAAS,CAAEomB,WAAW,KAGvB,KAAAC,SAAW,KACf9lC,KAAKyf,SAAS,CAAEomB,WAAW,KAGvB,KAAAE,KAAO,KACX,QAA0B3lC,IAAtBJ,KAAKimC,aACL,OAGJ,MAAMC,EAAYlmC,KAAKimC,aAAe,EAAIjmC,KAAKgN,MAAMm5B,YAAc,EACnEnmC,KAAKomC,UAAUF,IAGX,KAAAI,SAAW,KACf,MAAMJ,EAAYlmC,KAAKymC,cACjBzmC,KAAKgN,MAAMw5B,kBACPxmC,KAAKgN,MAAMw5B,kBAAkBnlC,OAAS,EACtC,EACJrB,KAAKgN,MAAMm5B,YAAc,EAC/BnmC,KAAKomC,UAAUF,IAGX,KAAAE,UAAaliC,IACjBlE,KAAKyf,SAAS,CAAE0mB,YAAajiC,KAezB,KAAA6kC,iBAAmB,CAACC,EAAmBj1B,EAA+B7P,IAC1E7E,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFJ,UAAU,0BACNsmC,EAAK,CACTh1B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,EACfs1B,oBAAoB,UACpB5lC,KAAK,WACLzB,GAAI,GAAGhC,KAAKT,MAAMyC,sBAAsBkC,OAIxC,KAAAslC,kBAAoB,CAACR,EAAmBj1B,EAA+B7P,EAAeulC,KAMnF,CACHC,4BAA6B,CACzBlmC,IAAK,KACLd,UARQia,IACZ,mCACA8sB,IAAwBvlC,EAAQ,0CAA4C,IAOxET,KAAM,MACNkmB,SAAU,EACV1W,IAAK/O,EACL,aAAc8kC,EAAMW,QACpB,gBAAiBF,IAAwBvlC,EACzC,gBAAiB,GAAGlE,KAAKT,MAAMyC,sBAAsBkC,IACrDiB,QAASnF,KAAK4pC,0BAA0B1lC,GACxC2lC,UAAW7pC,KAAK8pC,4BAA4B5lC,IAEhD6lC,QACI1qC,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFJ,UAAU,+BACNsmC,EAAK,CACTh1B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,EACfs1B,oBAAoB,eAM5B,KAAAS,4BAA+B5lC,GAC3BuG,IACAA,EAAM6/B,QAAUC,WAASC,OAAS//B,EAAM6/B,QAAUC,WAASE,QAC3DhgC,EAAMigC,iBAEN1qC,KAAKomC,UAAUliC,KAKnB,KAAA0lC,0BAA6B1lC,GACzBuG,IACJA,EAAMigC,iBAEN1qC,KAAKomC,UAAUliC,IAuHf,KAAAuiC,YAAc,IAAiC,IAA3BzmC,KAAKgN,MAAMm5B,YAE/B,KAAAF,WAAa,IAAMjmC,KAAKgN,MAAMw5B,mBAAqBxmC,KAAKgN,MAAMm5B,cAAgBnmC,KAAKgN,MAAMw5B,kBAAkBnlC,OAAS,EAEpH,KAAAwpC,gBAAkB,KACtB7qC,KAAK8qC,gBAuBD,KAAAC,iBAAkBC,IACtB,MACIjqC,MACIgP,SAAW9O,OAAQ8O,IACtB,UACD5N,EAAS,OACT3B,GACAR,KAAKT,MACT,IAAIinC,EAAoBxmC,KAAKgN,MAAMw5B,mBAE9BA,GAAqBz2B,IACtBy2B,EAAoB,CAACxmC,KAAKirC,uBAAuBl7B,KAGrD,MAAMi9B,EAAuBxsC,EAAOwsC,qBACjCA,IACCA,EAAqBtH,iBAAkB,GAG3C,MAAMwF,EAAgB,CAClB1nC,IAAK2nC,WACLzoC,UAAW,6BACXwb,MACIsoB,GACAA,EAAkBviC,IAAI,CAACma,EAAkBla,IAAkBlE,KAAKorC,6BAA6BJ,EAAU5sB,EAAM4uB,GAAwBhtC,KAAKwlC,4BAA6BthC,IAC3KiiC,YAAanmC,KAAKgN,MAAMm5B,YACxBJ,KAAM/lC,KAAK+lC,KACXO,SAAUtmC,KAAKsmC,SACfgF,UAAU,EACVC,kBAAmBppC,EAAUqpC,8BAC7BC,kBAAmBtpC,EAAUupC,0BAC7BC,yBAA0B3rC,KAAKomC,UAC/BwF,uBAAuB,EACvBC,eAAe,EACfE,eAAgB/rC,KAAK8lC,SACrBkG,gBAAiBhsC,KAAK4lC,WAGpBuG,EAAW9sC,gBAAC8rC,WAAQtoC,OAAAC,OAAA,GAAMooC,IAE1BkB,EAAwC,CAC1CC,YAAYrsC,KAAKgN,MAAMq/B,YACvBC,SAAStsC,KAAK8qC,aACdyB,gBAAiBJ,GAErB,OAAOM,wBAAcL,IAxbrBpsC,KAAK8qC,aAAe9qC,KAAK8qC,aAAarpB,KAAKzhB,MAC3CA,KAAKgN,MAAQ,CAAEm5B,YAAa,EAAGN,WAAW,EAAOW,uBAAmBpmC,EAAWwsC,eAAe,EAAOP,aAAY,GAEjHrsC,KAAKitC,iBAAmBjtC,KAAKitC,iBAAiBxrB,KAAKzhB,MACnDA,KAAKktC,wBAA0BltC,KAAKktC,wBAAwBzrB,KAAKzhB,MACjEA,KAAKmtC,oBAAsBntC,KAAKmtC,oBAAoB1rB,KAAKzhB,MACzDA,KAAKotC,2BAA6BptC,KAAKotC,2BAA2B3rB,KAAKzhB,MACvEA,KAAKqtC,yBAA2BrtC,KAAKqtC,yBAAyB5rB,KAAKzhB,MAGhE,0BACH,MAAM2tC,EAAS3tC,KAAKT,MAAMiB,OAAOotC,aAAeA,cAAYsL,YACtDrH,EAAe7xC,KAAKT,MAAMiB,OAAO+lC,QAAU,GA6BjD,GA3BIoH,IAAWC,cAAYsL,aACvBntC,YACI,IAAO/L,KAAKT,MAAMwB,KAAKgP,QAAQ9O,OAASjB,KAAKT,MAAMwB,KAAKgP,QAAQ9O,OAAOqjB,SAAW,KAClFvkB,UACI,GAAIC,KAAKT,MAAMwB,KAAKgP,QAAQ9O,OAAQ,CAChC,MAAMslC,QAAe+H,EACjBtuC,KAAKT,MAAMwB,KAAKgP,QAAQ9O,OAAOqjB,UAC9BtkB,KAAKT,MAAMsC,QAAQU,QAAQ0c,YAAYsvB,UACxCvuC,KAAKT,MAAMsC,QAAQuH,cACnBpJ,KAAKT,MAAMiB,OAAO2tC,wBAA0BnuC,KAAK2lC,+BAErD3lC,KAAKyf,SAAS,CACV+mB,kBAAmB,IAAID,KAAWsL,GAClC1L,YAAa,EACbqL,WAAYS,KAAKC,aAGrBlyC,KAAKyf,SAAS,CACV+mB,kBAAmB,IAAIqL,GACvB1L,YAAa,EACbqL,WAAYS,KAAKC,UAOjCvE,IAAWC,cAAY9pB,WAAa9jB,KAAKT,MAAMwB,KAAK+tC,eAAe7tC,OAAQ,CAC3E,MAAMslC,QD1GXxmC,eAAqC+uC,EAAiC1lC,EAA+B2K,GACxG,OAAOlD,QAAQkhC,IAAIjD,EAAe7qC,IAAK2rC,GAAkB+I,EAA0B/I,EAAe77B,KAC7FhN,KAAKgxC,GACKA,EAAMhwC,OAAOiwC,GAAQA,EAAK,IAAI/zC,IAAI+zC,GAAQA,EAAK,KACvDxwC,MAAMzF,IACLqH,EAActH,UAAUqd,UAAUpd,GAClCqH,EAActH,UAAU+e,MAAM,qCACvB,KCmGcqtB,CACjBluC,KAAKT,MAAMwB,KAAK+tC,eAAe7tC,OAC/BjB,KAAKT,MAAMsC,QAAQuH,cACnBpJ,KAAKT,MAAMiB,OAAO2tC,wBAA0BnuC,KAAK2lC,+BAErD3lC,KAAKyf,SAAS,CACV+mB,kBAAmB,IAAID,KAAWsL,GAClC1L,YAAa,EACbqL,WAAYS,KAAKC,aAElB,GAAIvE,IAAWC,cAAYsL,aAAel5C,KAAKT,MAAMwB,KAAKgP,QAAQ9O,OAAQ,CAC7E,MAAMslC,QAAe+H,EACjBtuC,KAAKT,MAAMwB,KAAKgP,QAAQ9O,OAAOqjB,UAC9BtkB,KAAKT,MAAMsC,QAAQU,QAAQ0c,YAAYsvB,UACxCvuC,KAAKT,MAAMsC,QAAQuH,cACnBpJ,KAAKT,MAAMiB,OAAO2tC,wBAA0BnuC,KAAK2lC,+BAGrD3lC,KAAKyf,SAAS,CACV+mB,kBAAmB,IAAID,KAAWsL,GAClC1L,YAAa,EACbqL,WAAYS,KAAKC,aAGrBlyC,KAAKyf,SAAS,CACV+mB,kBAAmB,IAAIqL,GACvB1L,YAAa,EACbqL,WAAYS,KAAKC,QAKtBjlC,SACH,MAAM,GACFjL,EAAE,OACFxB,EAAM,UACN2B,GACAnC,KAAKT,MAEHinC,EAAoBxmC,KAAKgN,MAAMw5B,mBAC/B,UAAE9jC,EAAS,sBAAEkpC,GAA0BprC,EACvCwsC,EAAuBxsC,EAAOwsC,qBACjCA,IACCA,EAAqBtH,iBAAkB,GAE3C,MAAMyI,EAAyB3tC,EAAO2tC,uBACnCA,IACCA,EAAuBzI,iBAAkB,GAG7C,MAAMwJ,EAAsB1uC,EAAO2uC,wBAA0BA,wBAAsB8B,SAC7EkI,EAA0B34C,EAAO6uC,kBAAmB,EACpDC,EACF9uC,EAAO+uC,YAAcA,YAAU6J,OACzB7J,YAAU6J,OACV54C,EAAO+uC,YAAcA,YAAU8J,UAC/B9J,YAAU8J,UACV,GACJzH,EAAWuH,EAAkB,aAAc7J,EAE3CvhC,EAASC,IAAA,GACPhO,KAAKT,OAAyD,IAClEyN,MAAOhN,KAAKgN,MACZi4B,aAAc,CACVv2B,YAAa1O,KAAKT,MAClBmD,UAAWia,IAAW,qBAAoBuyB,EAAa,WAAa,IAAMxsC,IAE9EmnB,MAAOsvB,EAAkBn5C,KAAK+qC,iBAAiBuE,GAAe,KAC9DoB,cAAe,CACXltC,IAAK2nC,WACLzoC,UAAW,6BACXwb,MACIsoB,GACAA,EAAkBviC,IAAI,CAACma,EAAkBla,IAAkBlE,KAAKorC,6BAA6BwG,EAAUxzB,EAAM4uB,GAAwBhtC,KAAKwlC,4BAA6BthC,IAC3KiiC,YAAanmC,KAAKgN,MAAMm5B,YACxBJ,KAAM/lC,KAAK+lC,KACXO,SAAUtmC,KAAKsmC,SACfgF,UAAU,EACVC,kBAAmBppC,EAAUqpC,8BAC7BC,kBAAmBtpC,EAAUupC,0BAC7BC,yBAA0B3rC,KAAKomC,UAC/BwF,uBAAiD,IAA1BA,EACvBG,eAAgB/rC,KAAK8lC,SACrBkG,gBAAiBhsC,KAAK4lC,UACtB3yB,IAAKjT,KAAKgN,MAAMwkC,YAEpBX,WAAY,CACRC,yBAA0B,CAAEpuC,UAAW,0CACvCquC,kCAAmC,CAC/BvtC,IAAKwtC,sBACLtuC,UAAW,+BACXuuC,SAAU/B,EACVgC,iBAAkB/uC,EAAUqpC,8BAC5B2F,iBAAkBhvC,EAAUupC,0BAC5B0F,SAAUpvC,EACVqvC,YAAY,EACZp+B,IAAKjT,KAAKgN,MAAMwkC,YAEpBtzB,MACIsoB,GACAA,EAAkBviC,IAAI,CAACma,EAAkBla,IAAkBlE,KAAKwpC,kBAAkBprB,EAAM+vB,GAA0BnuC,KAAK2lC,8BAA+BzhC,EAAOlE,KAAKgN,MAAMm5B,iBAIpL,OAAOnmC,KAAKT,MAAM6P,WAAWrB,GAiCzBq9B,6BAA6BwG,EAAkB5I,EAAmBj1B,EAA+B7P,GACrG,MAAiB,cAAb0tC,EACO5xC,KAAKoyC,8BAA8BpJ,EAAOj1B,EAAe7P,GAC5C,WAAb0tC,EACA5xC,KAAKsyC,yBAAyBtJ,EAAOj1B,EAAe7P,GACvC,eAAb0tC,EACA5xC,KAAKqyC,6BAA6BrJ,EAAOj1B,EAAe7P,GAExD7E,gBAACA,WAAc,KAAEW,KAAK+oC,iBAAiBC,EAAOj1B,EAAe7P,IAiEpEouC,yBAAyBtJ,EAAmBj1B,EAA8B7P,GAC9E,OAEI7E,gBAAA,OAAKqD,UAAW,mBAAkB1C,KAAKgN,MAAM4/B,cAAgB,SAAW,IAAMlE,IAAK2B,GAAUrqC,KAAKolC,kBAAkBvqB,IAAI3W,EAAOmmC,GAAQ,aAAcrqC,KAAKT,MAAMiB,OAAO4yC,WACnK/zC,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFJ,UAAU,0BACNsmC,EAAK,CACTh1B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,EACfs1B,oBAAoB,UACpB5lC,KAAK,WACL0B,QAASnF,KAAKmtC,oBACdmG,YAAatzC,KAAKgN,MAAM4/B,eAAiB5sC,KAAKktC,8BAA2B9sC,EACzE4B,GAAI,GAAGhC,KAAKT,MAAMyC,sBAAsBkC,OAE5C7E,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFW,KAAK,eACLf,UAAU,6BACNsmC,EAAK,CACT7jC,QAASnF,KAAKitC,iBACdj5B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,EACfs1B,oBAAoB,UACpBrnC,GAAI,GAAGhC,KAAKT,MAAMyC,aAAakC,IAC/BqvC,YAAavzC,KAAKgN,MAAM4/B,eAAiB4G,mCAA8BpzC,MAM/E8sC,wBAAwBziC,GAC5BipC,iCAAuBjpC,EAAOzK,KAAKT,MAAMiB,OAAO4yC,WAG5CjG,oBAAoB1iC,GACpBiQ,OAAOq6B,YAAc,MAIzBuE,yBAAe7uC,EAAOzK,KAAKT,MAAMiB,OAAO4yC,WACxCpzC,KAAKyf,SAAS,CACVmtB,eAAe,KAIfK,iBAAiBxiC,GACrBwqC,oCAA0BxqC,GAC1BzK,KAAKyf,SAAS,CACVmtB,eAAe,IAKfQ,2BAA2B3iC,GAC3BiQ,OAAOq6B,YAAc,MAIzBG,8BAAoBzqC,GAEpBzK,KAAKyf,SAAS,CACVmtB,eAAe,KAIfS,yBAAyB5iC,GAC7B0qC,kCAAwB1qC,GAExBzK,KAAKyf,SAAS,CACVmtB,eAAe,IAIfwF,8BAA8BpJ,EAAmBj1B,EAA8B7P,GACnF,OACI7E,gBAAA,OAAKqD,UAAU,+BACXrD,gBAAA,OAAKqD,UAAU,8BAA8Be,KAAK,eAAe4xC,WAAYr1C,KAAKqtC,yBAA0BloC,QAASnF,KAAKqtC,yBAA0BkG,YAAavzC,KAAKgN,MAAM4/B,eAAiB0I,iCAA4Bl1C,IACzNf,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFJ,UAAU,0BACNsmC,EAAK,CACTh1B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzC7O,QAASnF,KAAKotC,2BACdr5B,cAAeA,EACfs1B,oBAAoB,UACpBiK,YAAatzC,KAAKgN,MAAM4/B,eAAiB2I,kCAA6Bn1C,EACtE4B,GAAI,GAAGhC,KAAKT,MAAMyC,sBAAsBkC,QAMhDmuC,6BAA6BrJ,EAAmBj1B,EAA8B7P,GAClF,OACI7E,gBAAA,OAAKqD,UAAU,yBACXrD,gBAAC6pC,IAAKrmC,OAAAC,OAAA,CACFJ,UAAU,0BACNsmC,EAAK,CACTh1B,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCD,cAAeA,EACfs1B,oBAAoB,UACpB5lC,KAAK,cAETpE,gBAAA,OAAKqD,UAAU,kCACXrD,gBAAA,KAAGsb,KAAK,sBAAsBjX,MAAO1D,KAAKT,MAAM4C,UAAUyoC,oBAAqBnnC,KAAK,SAAS0B,QAASnF,KAAK6qC,gBAAiBnoC,UAAU,mDAM9IuoC,uBAAuBl7B,GAC3B,MAAO,CACHm4B,IAAKn4B,EAAQ0L,iBAAmB,IAYhCqvB,eACJ,GAAI9qC,KAAKgN,MAAMq/B,YAAa,CACxB,MAAMsJ,EAAY31C,KAAKolC,kBAAkB/iC,IAAIrC,KAAKgN,MAAMm5B,aACxD,GAAIwP,GAAaA,EAAUC,UAAYD,EAAUC,SAASv0C,QAAU,EAAG,CACnE,MAAM2nC,EAAQ2M,EAAUC,SAAS,GAAGlZ,cAAc,OAC9CsM,GACAA,EAAM6M,gBAAgB,SAG9B71C,KAAKyf,SAAS,CACVmtB,eAAe,IAGvB5sC,KAAKyf,SAAS,CACVmtB,eAAe,EACfP,aAAcrsC,KAAKgN,MAAMq/B,cAE7BrG,mCAoDOf,a,qaC7ef,IAAMsU,EAAN,cAAuBl6C,YAGnBC,YAAYC,GACRC,MAAMD,GAwDF,KAAAi6C,uBAA0B3xC,IAC9B,IAAIA,EACA,MAAO,IAGX,IAAI+U,EAAW,EAQf,OANG/U,EAAKC,WAAaD,EAAKC,UAAUzG,OAAS,GACzCwG,EAAKC,UAAU4Q,QAAQ1Q,IACnB4U,GAAY5U,EAAS8Q,UAAY,IAIlC8D,EAAShG,YAGZ,KAAA6iC,uBAA0B5xC,IAA+B,IAAA6xC,EAAAC,EAC7D,IAAK9xC,GAAuB,QAAf6xC,EAAC7xC,EAAKC,iBAAS,IAAA4xC,IAAdA,EAAgBr4C,OAC1B,OAAOhC,gBAAA,mBAAe,OAG1B,IAAIye,EAA6B,GAUjC,OARc,QAAd67B,EAAA9xC,EAAKC,iBAAS,IAAA6xC,GAAdA,EAAgBjhC,QAAQ0L,IACpBtG,EAAU9L,KAAK,CACX4K,SAAUwH,EAAKtL,SACf1W,MAAOgiB,EAAKw1B,MACZx7B,KAAMgG,EAAKqT,WAIZp4B,gBAAA,OAAK2C,GAAG,qBAAqB8xC,MAAO,CAAC+F,QAAS,QAAO,YAAavuC,KAAKgmC,UAAUxzB,MArFxF9d,KAAKgN,MAAQ,CACT8sC,cAAc,GAGf7sC,SACH,MAAM,UAAEktB,EAAWp5B,MAAM,KAAE8G,IAAW7H,KAAKT,MAE3C,IAAKsI,EACD,OACIxI,gBAAA,KAAGqD,UAAW,yBACVrD,gBAAA,OAAKqD,UAAU,uBAAsB,eAAc,KAM/D,MAAMq3C,EAAWz3B,YAAW,OAAQtiB,KAAKT,MAAMsC,QAAQuH,eAEjDwwB,EAAW,GAAG55B,KAAKw5C,uBAAuB3xC,EAAKA,MAE/CmyB,EAAQI,iBAAOD,EAAWP,IAAa,iBAAiBA,WAEzD55B,KAAKgN,MAAM8sC,cAAgB95C,KAAKg6C,eAAiBh6C,KAAKg6C,cAAgBpgB,IACvE55B,KAAKyf,SAAS,CACVq6B,cAAc,IAGlB95C,KAAKi6C,eAETj6C,KAAKg6C,cAAgBpgB,EACrB,MAAMsgB,EAAkBl6C,KAAKy5C,uBAAuB5xC,EAAKA,MACzD,OACIxI,gBAAA,KAAGqD,UAAW,0BAAyB1C,KAAKgN,MAAM8sC,aAAe,SAAW,IAAMn/B,KAAMo/B,EAAQ,aAAc/f,GAC1G36B,gBAAA,OAAKqD,UAAU,uBAAsB,eAAc,G,IAC7Ck3B,E,KAELsgB,GAKLC,SAASC,GAEb,OAAO,IAAIvpC,QAAQwpC,GAAOC,WAAWD,EAAKD,IAGtC,0BACEp6C,KAAKm6C,SAAS,MACpBn6C,KAAKyf,SAAS,CACVq6B,cAAc,MAvDpBP,EAAQlqC,YAAA,CADbK,KACK6pC,GAgGC,MAAMlf,EAAsEkgB,IAAiBC,gBAChG,W,yWAAUxsC,CAAA,CACRysC,UAAWlB,GArHgB,M,kCCxBjC,gBAyBemB,IARkFl8B,IAAgB,IAAf,QAAE5a,GAAS4a,EACzG,OAAK5a,EAIEvE,gBAAA,KAAGqD,UAAU,+CAA+CkB,GAHxD,O,2SCiBR7D,eAAe46C,EAAgB97B,EAAqBxW,GACvD,MAAMuyC,EAA8B,GAE9B/yC,EAAOQ,EAAUR,KAuCvB,OAnCIA,GAAQA,EAAKC,WAAaD,EAAKC,UAAUzG,OAAS,IAAMgH,EAAUlH,uBAC5DmgB,sCAA4B,IAAIC,0BAA2B1C,GAC5D9X,KAAKoW,IACEA,IACAy9B,EAAaz9B,SAAWA,KAG/B3V,MAAMzF,IAEH,MADA8c,EAAI/c,UAAUqd,UAAUpd,GAClB,IAAIo0C,MAAM,sFAGlB0E,4CAAkC,IAAIC,wCAAsCj8B,EAAIvE,eAAe2E,aAAcJ,GAC9G9X,KAAKod,IACEA,IACAy2B,EAAaljC,qBAAuByM,KAG3C3c,MAAMzF,IAEH,MADA8c,EAAI/c,UAAUqd,UAAUpd,GAClB,IAAIo0C,MAAM,sFAGlB4E,6CAAmC,IAAIC,yCAAuCn8B,EAAIvE,eAAe2E,aAAcJ,GAChH9X,KAAKrH,IACEA,IACAk7C,EAAal7C,gBAAkBA,KAGtC8H,MAAMzF,IAEH,MADA8c,EAAI/c,UAAUqd,UAAUpd,GAClB,IAAIo0C,MAAM,iFAIrByE,E,ykBCRX,IAAMrB,EAAN,cAAuBl6C,IAAMggB,UAezB/f,YAAYC,GACRC,MAAMD,GAPF,KAAAK,mCAA8C,EAgPrC,KAAAq7C,mBAAqB,CAAC/9B,EAAuBg+B,KAC1D,MAAMC,EAAoB,IAAIj+B,GAG9B,MAAa,eAATg+B,EACOC,EAAMC,KAAK,CAACC,EAAOC,KAAK,IAAAC,EAAAC,EAAA,OAAsB,QAAjBD,EAACD,EAAMG,kBAAU,IAAAF,IAHpC,IAGiE,QAArBC,EAAKH,EAAMI,kBAAU,IAAAD,IAHjE,KAKdL,EAAMC,KAAK,CAACC,EAAOC,KAAK,IAAAI,EAAAC,EAAA,OAAsB,QAAjBD,EAACL,EAAMI,kBAAU,IAAAC,IALhC,IAK6D,QAArBC,EAAKL,EAAMG,kBAAU,IAAAE,IAL7D,MAoER,KAAA/mB,kBAAqB7gB,GAE9BA,GAAiB,CACb+L,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCG,UAAU,GAKL,KAAAwU,2BAA8BtU,IAC3C,GAAIvgB,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAQ,CAC7B,MAAMuf,EAAQ,CACVC,YAAa,CAACF,EAAiB7P,OAAQkG,aAE3C5W,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAAOyf,gBAAgBF,GAAOhZ,MAAMzF,IACrD/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,kCAlUnC7gB,KAAKgN,MAAQ,CACT4tC,aAAc,GACdl5B,aAAa,EACb5L,gCAAgC,GAEpC9V,KAAK6E,iBAAmB8F,6BACpB3K,KAAKT,MAAMsC,QAAQU,QAAQqI,kBAC3B5K,KAAKT,MAAMsL,aACX7K,KAAKT,MAAMuC,WAEf,MAAMmX,EAAUC,2BAAiBC,IAAeyiC,SAAU57C,KAAK6E,iBAAkBugB,oBAAkBC,UACnGrlB,KAAKslB,2BAA6BhM,iCAAuBtZ,KAAK6E,iBAAkBoU,GAEhFA,EAAQiM,cAAcC,MAAQC,oBAAkBG,cAChDvlB,KAAKwlB,0BAA4BlM,iCAAuBtZ,KAAK6E,iBAAkBoU,GAE/EA,EAAQiM,cAAcC,MAAQC,oBAAkBy2B,gBAChD77C,KAAK87C,0BAA4BxiC,iCAAuBtZ,KAAK6E,iBAAkBoU,GAG5E,0BAAuB,IAAA8iC,EAC1B,MAAMl6C,EAAU7B,KAAKT,MAAMsC,QAAQuH,cAEnC2C,YACI,SAAAjB,EAAA,OAAiC,QAAjCA,EAAM9K,KAAKT,MAAMwB,KAAK8G,KAAK5G,cAAM,IAAA6J,OAAA,EAA3BA,EAA6BjD,KAAKC,WACxC/H,UACIC,KAAKyf,SAAS,CACVm7B,mBAAoBD,EAAgB94C,EAAS7B,KAAKT,MAAMwB,KAAK8G,KAAK5G,kBAIxEjB,KAAKg8C,gCAEXh8C,KAAKyf,SAAS,CACVrO,iBAAkD,QAAlC2qC,EAAE/7C,KAAKT,MAAMwB,KAAKqQ,wBAAgB,IAAA2qC,OAAA,EAAhCA,EAAkC96C,SAGxDjB,KAAK80B,gBAGFmnB,mBAAmBC,GACtBl8C,KAAK80B,gBAGFjoB,sBAAsBC,EAA0CC,GACnE,OAAI/M,KAAKgN,QAAUD,GAAa/M,KAAKT,MAAMwB,OAAS+L,EAAU/L,KAO3DkM,SAAM,IAAAgV,EAAAC,EAAAi6B,EAAAC,EAAAlvC,EAAAC,EACT,MAAM,GACFnL,EAAE,SACFC,EACAzB,QAAQ,gBAAE67C,EAAe,oBAAEC,GAC3Bz6C,SACIU,SACI2S,MAAM,gBAAED,EAAe,UAAEmN,KAEhC,QACDvgB,EAAO,UACPM,GACAnC,KAAKT,MAEHsI,EAAQ7H,KAAKT,MAAMwB,KAAK8G,MAAQ7H,KAAKT,MAAMwB,KAAK8G,KAAK5G,aAAWb,EAChEiiB,EAAmBC,YAAW,WAAYtiB,KAAKT,MAAMsC,QAAQuH,gBAAkB,GAC/EmzC,EAAUj6B,YAAW,OAAQtiB,KAAKT,MAAMsC,QAAQuH,gBAAkB,GAClEoZ,EAAcxiB,KAAKw8C,gBAAgBvnC,EAAiBoN,EAAkBD,GAAa,IACnFM,EAAc7a,GAAQA,EAAKA,KAAKC,WAA4C,IAA/BD,EAAKA,KAAKC,UAAUzG,OAEjEo7C,GACF50C,aAAI,EAAJA,EAAM60C,uBAAwB18C,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAOm8C,oBAAsBC,oBAAkBC,aAClG17C,EAAiB0G,aAAI,EAAJA,EAAM1G,eACvBwG,EAA0D,QAArCsa,EAAGjiB,KAAKT,MAAMsC,QAAQU,QAAQC,eAAO,IAAAyf,OAAA,EAAlCA,EAAoCra,sBAC5DkW,EAAY9d,KAAK2iB,gBACjBI,EAAgC6B,qCACd,QADwC1C,EAC5Dra,aAAI,EAAJA,EAAMA,KAAKC,iBAAS,IAAAoa,IAAI,GACoB,QADlBi6B,EAC1Bn8C,KAAKgN,MAAM4tC,aAAaljC,4BAAoB,IAAAykC,IAAI,GAChDn8C,KAAKT,MAAMsC,QAAQuH,cACa,QADAgzC,EAChCp8C,KAAKgN,MAAM4tC,aAAaz9B,gBAAQ,IAAAi/B,IAAI,GACpCz0C,GAEE+F,IACDqV,WAA+BK,WAC9BL,IAAkC/iB,KAAKgN,MAAM0U,eAC9C5D,GAAYA,EAAUgH,KAAK9U,GAAYA,EAAStC,UAC/CovC,EAAgB98C,KAAKT,MAAMwB,KAAK8G,MAAwC,YAAhC7H,KAAKT,MAAMwB,KAAK8G,KAAKtH,QAAwB87C,EACrFxiB,EAAmBhyB,WAAMgyB,iBAAmBhyB,EAAKgyB,iBAAmB,EACpEkjB,EAAqB56C,EAAU66C,oBAAoB7kC,QAAQ,UAAW0hB,EAAiBjjB,YACvFqmC,EAAc96C,EAAU86C,YACxBC,EAAgB,CAClB15C,IAAK25C,sBACLV,qBACAW,UAAW,aACXC,WAAW,EACX36C,UAAW,iCACX46C,QAAS,QACT/e,YAAa,SACbsV,OAAQ7xC,EACRu7C,uBAAuB,EACvBC,YAAajB,EACbkB,gBAAgB,GAIdr7C,EAASyF,IAASA,EAAK1G,gBAAkB0G,EAAKA,KAAK4wB,kBAAgBr4B,EACnEs9C,EAAct7C,EACdD,EAAUw7C,uBAAuBxlC,QAAQ,UAAWtW,EAAQ+7C,iBAAiBC,eAAez7C,IAC5F,GAENpC,KAAK6G,4BAAyE,QAA9CqG,EAAGlN,KAAKT,MAAMwB,KAAK8F,mCAA2B,IAAAqG,OAAA,EAA3CA,EAA6CjM,OAChFjB,KAAKJ,kCAAgE,QAA/BuN,EAAGnN,KAAKT,MAAMwB,KAAKqM,oBAAY,IAAAD,GAAQ,QAARA,EAA5BA,EAA8BlM,cAAM,IAAAkM,GAE5E,QAF4EA,EAApCA,EAAsC3L,KAC3E6L,GAHkC,oEAGvBA,EAAQC,aACtB,IAAAH,OAAA,EAFwCA,EAEtCI,UAEH,MAAMQ,EAASC,IAAA,GACRhO,KAAKT,OAAK,IACb0/B,SACI5/B,IAAAwmB,cAACwU,oBAAiB,CACdF,UAAWh4B,EAAUg4B,UACrB2jB,aAAc37C,EAAU27C,aACxBj8C,QAASA,EACTG,GAAIA,EACJC,SAAUA,EACVlB,KAAM,CAAE8G,QACRhD,iBAAkB7E,KAAK6E,mBAG/BqY,UAAWY,EACXigC,gBAAiBjB,EAAgBI,OAAgB98C,EACjD2lB,iBAAkB,CACdrjB,UAAW,4BAEfs7C,gBAAiB,CACbt7C,UAAWia,IAAW,gBACtB3a,GAAIhC,KAAKT,MAAMyC,IAEnBi8C,oBAAqB,CACjBv7C,UAAWia,IAAW,wBAM1BkK,2BACKnE,GAAgBvhB,GAAoBm7C,IAAuBrnC,EAUxD,KATA5V,IAAAwmB,cAAC7gB,SAAMnC,OAAAC,OAAA,CACHoC,SAAUwI,EACVhL,UAAU,6BACViY,KAAM6H,EACN9e,MAAOvB,EAAU2kB,qBACb9mB,KAAKslB,4BAERnjB,EAAU2kB,qBAGvBC,uBACIu1B,GAAwB55B,GAAgBzN,EAUpC,KATA5V,IAAAwmB,cAAC7gB,SAAMnC,OAAAC,OAAA,CACHoC,SAAUwI,EACVhL,UAAU,kCACViY,KAAM0H,EACN3e,MAAOvB,EAAU8kB,0BACbjnB,KAAKwlB,2BAERrjB,EAAU8kB,0BAGvBi3B,eACI7+C,IAAAwmB,cAAC7gB,SAAMnC,OAAAC,OAAA,CACHJ,UAAU,6BACViY,KAAM4hC,EACN74C,MAAOq5C,GACH/8C,KAAK87C,2BAERiB,GAGT70B,qCAAsC,KACtC+0B,YAAa59C,IAAAwmB,cAAA,QAAMnjB,UAAU,8BAA8Bu6C,GAC3DkB,WAAY9+C,IAAAwmB,cAAA,OAAKnjB,UAAU,0BAA0Bg7C,KAGzD,OAAO19C,KAAKT,MAAM6P,WAAWrB,GAGzB+mB,gBAAa,IAAAspB,EAAAC,EACjB,MACIt9C,MAAM,KAAE8G,IACR7H,KAAKT,MACH82B,EAAwC,QAA7B+nB,EAAc,QAAdC,EAAGx2C,EAAK5G,cAAM,IAAAo9C,GAAM,QAANA,EAAXA,EAAax2C,YAAI,IAAAw2C,OAAA,EAAjBA,EAAmB/nB,eAAO,IAAA8nB,SAAIh+C,EAC9CJ,KAAKs+C,2BAA6BjoB,IAItCr2B,KAAKs+C,yBAA2BjoB,EAE5Br2B,KAAKgN,MAAM8I,+BACXsd,YAAkBvrB,EAAM7H,KAAKT,MAAMuC,UAAW9B,KAAKT,MAAMsC,SACpDkF,KAAM9F,IACHjB,KAAKyf,SAAS,CAAEiC,aAAczP,kBAAgBC,YAAYjR,aAAM,EAANA,EAAQqX,4BAErE9Q,MAAM,KACHxH,KAAKyf,SAAS,CAAEiC,aAAa,MAGrC1hB,KAAKyf,SAAS,CAAEiC,aAAa,KAI7B86B,gBAAgBvnC,EAA0BoN,EAA0BD,GACxE,GAAInN,EACA,OAAOoN,EAGX,MAAM0Q,EAAgBC,mBAAS3Q,GAC/B,IAAI4Q,EAAY5Q,EAKhB,OAJIk4B,IAAiBngC,YAAc2Y,IAC/BE,EAAY,GAAGvY,OAAO/J,SAASuiB,SAAS7Q,KAGrC,GAAGD,IAAaA,EAAU+Q,SAAS,KAAa,IAAN,SAAeF,IAmB5DtQ,gBAAa,IAAAgO,EACjB,MACI9uB,SACIU,SAAWC,SAAS,uBAAEkF,GAA2B,CAAEA,4BAAwBtH,KAC9E,OACDI,EAAM,UACNsB,EAAS,UACTK,GACAnC,KAAKT,MAEHwU,EAAgB/T,KAAK40B,kBAAkBp0B,EAAOuT,eAC9ClM,EAAO7H,KAAKT,MAAMwB,KAAK8G,MAAQ7H,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAI1D,OAAOjB,KAAKgN,MAAM4tC,aAAaz9B,UAAYtV,GAAQA,EAAKA,KAAKC,WAAaD,EAAKA,KAAKC,UAAUzG,OAAS,EACjGq9B,YAAoB,CAChBxhB,UAAWld,KAAKi7C,mBAAmBpzC,EAAKA,KAAKC,UAAWtH,EAAO+9C,oBAC/DphC,SAAUnd,KAAKgN,MAAM4tC,aAAaz9B,SAClCzF,qBAAsB1X,KAAKgN,MAAM4tC,aAAaljC,qBAC9CqZ,uBAAwB/wB,KAAKgN,MAAM4tC,aAAal7C,gBAChDqU,gBACAoqB,oBAAqBn+B,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO29B,qBAAuB,EAC1E9oB,oBAAqBrV,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAO2iB,mBAAoB,EACvElN,oBAAqB+a,2CAAiChxB,KAAKT,MAAMsC,QAAQkb,IAAIvc,OAAOywB,4BACpFjd,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aACzCnS,QAAS7B,KAAKT,MAAMsC,QACpBI,SAAUjC,KAAKT,MAAM0C,SACrBD,GAAIhC,KAAKT,MAAMyC,GACfG,UAAW,CACPgvB,WAAYhvB,EAAU8xB,yBACtB7C,YAAajvB,EAAUkvB,0BACvBC,aAAcnvB,EAAUovB,kCACxBC,YAAarvB,EAAUsvB,0BACvBG,sBAAuBzvB,EAAU0vB,oBACjCO,0BAA2BjwB,EAAUiwB,0BACrCN,uBAAwB,GACxBG,mBAAoB,GACpB/C,kBAAmB,GACnBC,iBAAkB,GAClB+C,oBAAqB,GACrB6L,aAAc57B,EAAU47B,cAE5Bj8B,YACAmS,iBAAkB9R,EAAUmwB,qBAC5Bta,eAAgB,GAChBC,kBAAmB,GACnBC,qBAAsB,GACtB7P,UAAWR,EACXuJ,iBAAkBpR,KAAKgN,MAAMoE,iBAC7B8C,uBAAwBlU,KAAK60B,2BAC7BptB,uBAAwBC,EACxB7C,iBAAkB7E,KAAK6E,iBACvBgC,4BAA6B7G,KAAKJ,kCAAoCI,KAAK6G,iCAA8BzG,EACzG0V,+BAAgC9V,KAAKgN,MAAM8I,+BAC3CoF,SAAkC,QAA1ByV,EAAE3wB,KAAKT,MAAMwB,KAAKma,gBAAQ,IAAAyV,OAAA,EAAxBA,EAA0B1vB,SAExC,KA4BF,sCAAmC,IAAAyyB,EAAAJ,EACvC,MAAMK,QAAwB3zB,KAAKT,MAAMwB,KAAKqM,aAM9C,IAHIumB,SAEC,QAFcD,EAAfC,EAAiBnyB,KACb4L,GAAsC,wEAAtBA,EAAaE,aAChC,IAAAomB,OAAA,EAFDA,EAEGnmB,aAAa,EAGhB,YADAvN,KAAKyf,SAAS,CAAE3J,gCAAgC,IAGpD,MAAMyd,EAA4D,QAArBD,EAAGtzB,KAAKT,MAAMsC,eAAO,IAAAyxB,GAAS,QAATA,EAAlBA,EAAoB/wB,eAAO,IAAA+wB,GAAK,QAALA,EAA3BA,EAA6BvW,WAAG,IAAAuW,GAAU,QAAVA,EAAhCA,EAAkCE,gBAAQ,IAAAF,OAAA,EAA1CA,EAA4CG,iCAC5F,GAAKF,GAAuF,SAA5CA,EAAhD,CAKA,IAAK,IAADwjB,EACA,MAAMpjB,QAAwB3zB,KAAKT,MAAMwB,KAAKqM,aAK9C,MAHIumB,SAEC,QAFcojB,EAAfpjB,EAAiBnyB,KACb4L,GAAsC,oEAAtBA,EAAaE,aAChC,IAAAypC,OAAA,EAFDA,EAEGxpC,aAAa,GAGhB,YADAvN,KAAKyf,SAAS,CAAE3J,gCAAgC,IAGtD,MAAO/T,GAIL,OAHA/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,qCAC3B7gB,KAAKyf,SAAS,CAAE3J,gCAAgC,IAGJ,QAA5Cyd,EACAvzB,KAAKyf,SAAS,CAAE3J,gCAAgC,IAEhD9V,KAAKT,MAAMwB,KAAK8T,oBACX9N,KAAK2kB,IACF,MAAMzqB,IACAyqB,IAC4C,QAA5C6H,GAAqD7H,EAAakI,OACnB,QAA5CL,IAAsD7H,EAAakI,OAC5E5zB,KAAKyf,SAAS,CAAE3J,+BAAgC7U,MAEnDuG,MAAMzF,IACH/B,KAAKT,MAAMuC,UAAU8e,QAAQ7e,GAC7B/B,KAAKT,MAAMuC,UAAU+e,MAAM,sCAjCnC7gB,KAAKyf,SAAS,CAAE3J,gCAAgC,MArWtDyjC,EAAQlqC,YAAA,CADbK,KACK6pC,GA4YSA,a,iHClcf,MAAMjkB,EAAmBA,CACrBxX,EACA0gC,EACAz4B,EACAsC,EACAf,EACAgB,EACAC,EACAE,IAEIF,EACOlpB,2BAAA,KAAGkpB,GAEVzK,EACOA,EAAU7Z,IAAI+D,IAAW,IAAAy2C,EAC5B,OACIp/C,gBAAA,OAAKqD,UAAU,sBAAsBuQ,IAAK,GAAsB,QAAtBwrC,EAAGz2C,EAASgT,kBAAU,IAAAyjC,IAAI,MAAMtkC,IAASC,UAAUxD,cACxF5O,EAASgI,SACTqY,GAAiBrgB,EAAS8T,cACvBzc,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKkF,EAAS8T,cAAcvI,gBAAiBvL,EAAS8T,cAAcxJ,kBACzE,KACHtK,EAASyU,mBACNpd,gBAACm2B,OAAI,CAAC9yB,UAAU,gCACXsF,EAASgU,OACThU,EAASiU,cACTjU,EAASyU,oBAGdpd,2BAAA,KACK2I,EAASgU,OACThU,EAASiU,kBAO3BwM,EACHppB,gBAAA,OAAKqD,UAAU,wBACXrD,gBAAA,KAAGqD,UAAU,iBAAiB87C,GAC7Bl3B,GAGLjoB,2BAAA,KAAGipB,GA8HLo2B,EAA6BA,CAC/BC,EACA5gB,EACA6gB,EACAC,EACA72C,EACAL,KACA,IAAAm3C,EAEA,IAAIC,EAOJ,OALAA,GAHmE,QAA9CD,EAAwB92C,EAAS8T,qBAAa,IAAAgjC,OAAA,EAAtBA,EAAwBjvC,iBAGtC8uC,EAAa5gB,EACvC32B,mBAAiBC,cAAcM,KAChCo3C,EAAa/2C,EAASjH,MAAQiH,EAASjH,KAAKiP,SAASzJ,eAAiBoB,EAAwBi3C,EAAoBG,GAIlH1/C,2BAAA,KACIA,gBAAA,OAAKqD,UAAU,8CACXrD,gBAAA,KAAGqD,UAAW,8CAA8Cq8C,EAAWplC,uBACvEta,gBAAA,KAAGqD,UAAW,8CAA8Cq8C,EAAWplC,eAAkBolC,GA/CvEC,EAACh3C,EAA+B62C,KAAyB,IAAAI,EAAAC,EAAAC,EACvF,MAAMtvC,EAA6D,QAA9CovC,EAAwBj3C,EAAS8T,qBAAa,IAAAmjC,OAAA,EAAtBA,EAAwBpvC,gBACrE,OACIxQ,2BAAA,KACIA,gBAACm2B,OAAI,CAAC9yB,UAAU,oDACXmN,EACGxQ,gBAAA,KAAGqD,UAAU,uDACc,QADuCw8C,EAC7Dl3C,EAAS8T,qBAAa,IAAAojC,OAAA,EAAtBA,EAAwBz9C,eACxBo9C,EACsB,QADTM,EACbn3C,EAAS8T,qBAAa,IAAAqjC,OAAA,EAAtBA,EAAwBxsC,aAE7B,QAqCHqsC,CAA0Bh3C,EAAU62C,MA8FtC1qB,UAxC6B50B,IAAqB,IAAA6/C,EAAAC,EAhMtCnoB,EAwEAlO,EAwHsC,OAC7D3pB,gBAAA,MAAAwD,OAAAC,OAAA,CAAKJ,UAAWnD,EAAMmD,UAAWV,GAAIzC,EAAMyC,IAAQzC,EAAMg2B,uBAAuBh2B,IAC3EA,EAAMmE,QACK,QAAX07C,EAAC7/C,EAAMsI,YAAI,IAAAu3C,GAAVA,EAAYj+C,iBAAkB5B,EAAM2f,mBA3HnB8J,EA2HyDzpB,EAAM2f,iBAzHlF7f,2BAAA,KACIA,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKkmB,EAAWM,yBAChBN,EAAWO,iBACXP,EAAWU,oBACXV,EAAWY,mBAsHnBrqB,EAAMylB,sBA/CezlB,IACtBA,EAAM+e,gBAAkBrM,kBAAgBC,YAAY3S,EAAM+e,gBAEtDjf,gBAAA,OAAKqD,UAAU,wBACVnD,EAAM+e,eAAera,IAAIiZ,IAAY,IAAAoiC,EAClC,OACIjgD,gBAAA,OAAK4T,IAAKiK,EAAU,GAAGlC,WAAYtY,UAAU,+BACxCg8C,EACGn/C,EAAM4C,UAAUw8C,WAChBp/C,EAAM4C,UAAU47B,aAChBx+B,EAAM4C,UAAUo9C,kBAChBhgD,EAAM4C,UAAU08C,cAChB3hC,EAAU,GACwC,QADtCoiC,EACZ//C,EAAMsC,QAAQuH,cAAckR,eAAe9X,eAAO,IAAA88C,OAAA,EAAlDA,EAAoD13C,uBAEvD0tB,EACGpY,EACA3d,EAAM4C,UAAU4zB,cAChBx2B,EAAMwmB,iBACNxmB,EAAM8oB,cACN9oB,EAAM+nB,qBACN/nB,EAAM+oB,iBACN/oB,EAAMgpB,kBACNhpB,EAAMkpB,oBAQ3BlpB,EAAMkpB,eACTppB,gBAAA,OAAKqD,UAAU,uBACXrD,gBAAA,OAAKqD,UAAU,wBACXrD,gBAAA,KAAGqD,UAAU,iBAAiBnD,EAAM4C,UAAU4zB,eAC7Cx2B,EAAM+nB,uBAIfjoB,2BAAA,KAAGE,EAAM+oB,kBASLk3B,CAAqBjgD,GAErBF,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKvD,EAAMwmB,kBACXuP,EACG/1B,EAAM2d,UACN3d,EAAM4C,UAAU4zB,cAChBx2B,EAAMwmB,iBACNxmB,EAAM8oB,cACN9oB,EAAM+nB,qBACN/nB,EAAM+oB,iBACN/oB,EAAMgpB,kBACNhpB,EAAMkpB,iBAIjBlpB,EAAM+mB,qBACHjnB,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKvD,EAAMymB,qBACXzmB,EAAM+mB,oBACI,QAAV+4B,EAAA9/C,EAAMsI,YAAI,IAAAw3C,GAAVA,EAAYl+C,eApMMs+C,EAC/BC,EACAz5B,EACA1mB,IAEKmgD,EAKDrgD,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKmjB,GACLy5B,EAAoBC,SACpBD,EAAoBtb,SACpBsb,EAAoB/a,QACpB+a,EAAoB3yB,aARzBxtB,EAAMsC,QAAQC,UAAUC,MAAM,uDACvB,MA8LO09C,CAA2BlgD,EAAMonB,wBAAyBpnB,EAAM0mB,kBAAmB1mB,GA3KxEk2B,EAC7BmC,EACA3R,EACA1mB,IAEKq4B,EAKDv4B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKmjB,GACL1mB,EAAM2mB,UACN0R,EAAkB+I,SAClB/I,EAAkBO,SAClBP,EAAkB4L,YAClB5L,EAAkBS,IAClBT,EAAkBM,eAAiBN,EAAkBM,eAAiB,KACtEN,EAAkB7K,aAXvBxtB,EAAMsC,QAAQC,UAAUC,MAAM,qDACvB,MAqKO0zB,CAAyBl2B,EAAMknB,sBAAuBlnB,EAAM0mB,kBAAmB1mB,IAzN1E23B,EA0NQ33B,EAAMopB,qBAzNlB1W,kBAAgBC,YAAYglB,EAAU3L,QAIrDlsB,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKo0B,EAAUhM,SACfgM,EAAU5L,OACV4L,EAAU3L,QALR,KAyNEhsB,EAAMsnB,2BACNtnB,EAAMwnB,sBACNxnB,EAAM2nB,uBAAyBjV,kBAAgBC,YAAY3S,EAAM2nB,uBAC9D7nB,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKvD,EAAM8nB,+BAAgC9nB,EAAM2nB,uBACtD,KACH3nB,EAAM+nB,qBACN/nB,EAAMioB,8BAGdjoB,EAAM8oB,iB,kCCjSR,IAAK2e,EA+BL,SAAS+I,EACZluC,EACA6qC,EACAuL,EACA2H,GAAqB,IAAAC,EAErB,OAAKh+C,SAAY,QAALg+C,EAAPh+C,EAASkb,WAAG,IAAA8iC,GAAQ,QAARA,EAAZA,EAAcr/C,cAAM,IAAAq/C,GAApBA,EAAsB9R,kBAGvBrB,EACOkT,EAHA3H,EA7Cf,kCAOA,SAAYjR,GAIRA,IAAA,eAIAA,IAAA,iBAIAA,IAAA,iBAIAA,IAAA,eAhBJ,CAAYA,MAAS,M,+ECGrB,MAAM8Y,EAAoDthC,IAcrD,IAdsD,QACvDuhC,EAAO,WACPC,EAAU,OACVC,EAAM,aACNC,EAAY,uBACZC,EAAsB,8BACtBC,EAA6B,mBAC7BC,EAAkB,mBAClBC,EAAkB,yBAClBC,EAAwB,kBACxBC,EAAiB,yBACjBC,EAAwB,0BACxBC,EAAyB,0BACzBC,GACHniC,EACG,OACInf,2BAAA,KACK0gD,EACAC,EACD3gD,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKm9C,GACLC,EAAaj8C,IAAK28C,GAEXvhD,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAK89C,EAAYC,2BAA0B,CAAE5tC,IAAK2tC,EAAY3tC,MAC9D2tC,EAAYl9C,MACZk9C,EAAYE,oBACZF,EAAYG,aACZH,EAAYI,mBACZJ,EAAYK,kBAK7B5hD,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKq9C,GACLE,EACAC,EACAC,EACAC,GACGnhD,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKs9C,GACLK,EACAC,EACAC,MAQnBO,EAAsDC,IAA2C,IAA1C,QAAEpB,EAAO,kBAAEqB,EAAiB,OAAE9c,GAAQ6c,EAC/F,OACI9hD,2BAAA,KACK0gD,EACAqB,EACA9c,IAiBE+c,UAZkD9hD,IAC7D,MAAM,gBAAE+hD,EAAe,iBAAEzhD,EAAgB,MAAEqO,EAAK,UAAEG,EAAS,YAAEkzC,EAAW,WAAEC,GAAejiD,EAEzF,OACIF,gBAACg9B,SAAMx5B,OAAAC,OAAA,GAAKw+C,EAAe,CAAE5Y,IAAK7oC,IAC7BqO,EACAG,EAAUozC,eAAiBpiD,gBAAC6hD,EAAmBr+C,OAAAC,OAAA,GAAKy+C,IACpDlzC,EAAUqzC,kBAAoBriD,gBAACygD,EAAkBj9C,OAAAC,OAAA,GAAK0+C,O,+EC7BpDG,UAnBqCpiD,GAChDF,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKvD,EAAMy+C,gBAAqBz+C,EAAMg2B,uBAAuBh2B,IAC7DA,EAAM0/B,WACN1/B,EAAMw+C,iBACH1+C,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKvD,EAAMw+C,iBACXx+C,EAAM09C,YACN19C,EAAM2oB,qCACP7oB,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKvD,EAAMwmB,kBAvBPuP,EAACxX,EAAuDve,IACxEue,EAIEA,EAAU7Z,IAAI,CAAC+D,EAAU9D,IAExB7E,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKvD,EAAM0+C,oBAAmB,CAAEhrC,IAAK/O,IACrC8D,EAASgI,SACThI,EAASy2B,cACTz2B,EAASgU,UARlBzc,EAAMsC,QAAQC,UAAUC,MAAM,kDACvB,MAoBoCuzB,CAAiB/1B,EAAM2d,UAAW3d,IACpEA,EAAM4+C,WACN5+C,EAAMsnB,2BACNtnB,EAAMwnB,sBACNxnB,EAAM2+C,kB,sLCrBhB,MAAM0D,GA4ON7hD,eAAe8hD,EAClBC,EAEA3/C,EACAoI,EACAsU,EACAkjC,GAEA,IAAIC,EACJ,MAAMC,EAA0C,GAE1Cv7C,QAAsCw7C,2BAAiBrjC,GAAKrX,MAAOzF,IAErE,MADA8c,EAAI/c,UAAUqd,UAAUpd,GAClBA,IAIV,IAAK,MAAMuK,KAAiBs1C,EAAeO,mBACvC,GAAIL,IAAcx1C,EAAcw1C,UAC5B,GAAIx1C,EAAcC,gBAAkBC,gBAAc41C,QAAS,CACvD,MAAMC,EAAuC,CACzCP,UAAWx1C,EAAcw1C,UACzBQ,qBAAsBh2C,EAAcg2C,qBACpC/1C,cAAeD,EAAcC,eAEjC01C,EAAsBjwC,KAAKqwC,OACxB,CACH,GAAIL,EAEA,MADAnjC,EAAI/c,UAAUqd,UAAU,IAAIg3B,MAAM,8CAC5B,IAAIA,MAAM,6CAEhB6L,EAAsB,CAClBF,UAAWx1C,EAAcw1C,UACzBQ,qBAAsBh2C,EAAcg2C,qBACpC/1C,cAAeD,EAAcC,eAQjD,IAAK,MAAM81C,KAAwBJ,EAC/BI,EAAqBv+C,aAAey+C,EAAwBpgD,EAAWkgD,EAAqBC,qBAAuBP,GACnHvhB,QAAQC,IAAI4hB,EAAqBv+C,cAIrC,GAAIk+C,EACAA,EAAoBl+C,aAAey+C,EAAwBpgD,EAAW6/C,EAAoBM,qBAAuBP,GAE7Gx3C,GAA4By3C,EAAoBz1C,gBAAkBC,gBAAcg2C,4BAChFR,EAAoBz1C,cAAgBC,gBAAc6Y,gBAGhD3e,EAAc+7C,oBAAoB,CAAEC,iBAAkBV,UACtDt7C,EAAci8C,iCAAiC,CAAEC,+BAA+B,SAGtF,GAAqC,IAAjCX,EAAsB5gD,OAAc,CACpC,MAAMwhD,EAAe,CACjBt2C,cAAeC,gBAAc6Y,UAG7Bw9B,EAA2B,aAD3Bd,GAG+B5/C,EAAUmF,0BAGvCZ,EAAc+7C,oBAAoB,CAAEC,iBAAkBG,UACtDn8C,EAAci8C,iCAAiC,CAAEC,+BAA+B,KAK3F7iD,eAAe6M,EAAqB/M,EAAgDgf,GACvF,MAAMnY,QAAsCw7C,2BAAiBrjC,GAAKrX,MAAOzF,IAErE,MADA8c,EAAI/c,UAAUqd,UAAUpd,GAClBA,IAGVlC,EAAiBqnC,SAAWrnC,EAAiBqnC,QAAQ4b,uBAE/Cp8C,EAAcq8C,yBAAyB,CAAEC,sBAAuBr2C,iBAAe3D,aAC/EtC,EAAci8C,iCAAiC,CAAEC,+BAA+B,IAGnF7iD,eAAekjD,EAAsBC,EAA0BrkC,GAClE,MAAMnY,QAAsCw7C,2BAAiBrjC,GAAKrX,MAAOzF,IAErE,MADA8c,EAAI/c,UAAUqd,UAAUpd,GAClBA,IAGV,IAAK,MAAMohD,KAAkBtgD,OAAO8b,KAAKhS,kBACrC,GAAIu2C,EAAiB/vB,SAASxmB,iBAAew2C,IAEzC,kBADMz8C,EAAcq8C,yBAAyB,CAAEC,sBAAuBr2C,iBAAew2C,MAOjG,SAASZ,EAAwBpgD,EAAgBmgD,EAA4Cc,GACzF,MAAMC,EAAgBxgD,OAAO8b,KAAKxc,GAAWX,KAAK8hD,GAAYA,IAAahB,GAE3E,YAAyBliD,IAAlBijD,EAA8BlhD,EAAUkhD,GAAiBD,EApVzCxB,EAAA2B,YAA8B,CACjDzB,UAAW0B,YAAUD,YACrBjB,qBAAsBmB,uBAAqBC,4BAC3Cn3C,cAAeC,gBAAc6Y,UAGVu8B,EAAA+B,uDAAyE,CAC5F7B,UAAW0B,YAAUG,uDACrBrB,qBAAsBmB,uBAAqBG,+BAC3Cr3C,cAAeC,gBAAcq3C,iBAGVjC,EAAAkC,mFAAqG,CACxHhC,UAAW0B,YAAUM,mFACrBxB,qBAAsBmB,uBAAqBM,2DAC3Cx3C,cAAeC,gBAAcw3C,gCAGVpC,EAAAqC,sFAAwG,CAC3HnC,UAAW0B,YAAUS,sFACrB3B,qBAAsBmB,uBAAqBS,8DAC3C33C,cAAeC,gBAAc6Y,UAGVu8B,EAAAuC,2FAA6G,CAChIrC,UAAW0B,YAAUW,2FACrB7B,qBAAsBmB,uBAAqBW,mEAC3C73C,cAAeC,gBAAcw3C,gCAGVpC,EAAAyC,sGAAwH,CAC3IvC,UAAW0B,YAAUa,sGACrB/B,qBAAsBmB,uBAAqBa,8EAC3C/3C,cAAeC,gBAAcw3C,gCAGVpC,EAAA2C,2FAA6G,CAChIzC,UAAW0B,YAAUe,2FACrBjC,qBAAsBmB,uBAAqBe,mEAC3Cj4C,cAAeC,gBAAcw3C,gCAGVpC,EAAA6C,oFAAsG,CACzH3C,UAAW0B,YAAUiB,oFACrBnC,qBAAsBmB,uBAAqBiB,4DAC3Cn4C,cAAeC,gBAAcw3C,gCAGVpC,EAAA+C,8CAAgE,CACnF7C,UAAW0B,YAAUmB,8CACrBrC,qBAAsBmB,uBAAqBmB,sBAC3Cr4C,cAAeC,gBAAcg2C,2BAGVZ,EAAAiD,iEAAmF,CACtG/C,UAAW0B,YAAUqB,iEACrBvC,qBAAsBmB,uBAAqBqB,yCAC3Cv4C,cAAeC,gBAAcu4C,kBAGVnD,EAAAoD,6DAA+E,CAClGlD,UAAW0B,YAAUwB,6DACrB1C,qBAAsBmB,uBAAqBwB,qCAC3C14C,cAAeC,gBAAcu4C,kBAGVnD,EAAAsD,uDAAyE,CAC5FpD,UAAW0B,YAAU0B,uDACrB5C,qBAAsBmB,uBAAqB0B,+BAC3C54C,cAAeC,gBAAc6Y,UAGVu8B,EAAAwD,6DAA+E,CAClGtD,UAAW0B,YAAU4B,6DACrB9C,qBAAsBmB,uBAAqB4B,qCAC3C94C,cAAeC,gBAAcq3C,iBAGVjC,EAAA0D,0DAA4E,CAC/FxD,UAAW0B,YAAU8B,0DACrBhD,qBAAsBmB,uBAAqB8B,kCAC3Ch5C,cAAeC,gBAAcg2C,2BAGVZ,EAAA4D,kEAAoF,CACvG1D,UAAW0B,YAAU8B,0DACrBhD,qBAAsBmB,uBAAqBgC,yCAC3Cl5C,cAAeC,gBAAc41C,SAGVR,EAAA8D,mEAAqF,CACxG5D,UAAW0B,YAAUkC,mEACrBpD,qBAAsBmB,uBAAqBkC,2CAC3Cp5C,cAAeC,gBAAcg2C,2BAGVZ,EAAAgE,8EAAgG,CACnH9D,UAAW0B,YAAUoC,8EACrBtD,qBAAsBmB,uBAAqBoC,sDAC3Ct5C,cAAeC,gBAAcw3C,gCAGVpC,EAAAkE,+DAAiF,CACpGhE,UAAW0B,YAAUsC,+DACrBxD,qBAAsBmB,uBAAqBsC,uCAC3Cx5C,cAAeC,gBAAcq3C,iBAGVjC,EAAAoE,mFAAqG,CACxHlE,UAAW0B,YAAUwC,mFACrB1D,qBAAsBmB,uBAAqBwC,2DAC3C15C,cAAeC,gBAAcu4C,kBAGVnD,EAAAsE,wDAA0E,CAC7FpE,UAAW0B,YAAU0C,wDACrB5D,qBAAsBmB,uBAAqB0C,gCAC3C55C,cAAeC,gBAAcq3C,iBAGVjC,EAAAwE,0DAA4E,CAC/FtE,UAAW0B,YAAU4C,0DACrB9D,qBAAsBmB,uBAAqB4C,kCAC3C95C,cAAeC,gBAAcq3C,iBAGVjC,EAAA0E,yDAA2E,CAC9FxE,UAAW0B,YAAU8C,yDACrBhE,qBAAsBmB,uBAAqB8C,iCAC3Ch6C,cAAeC,gBAAcg2C,2BAGVZ,EAAA4E,oEAAsF,CACzG1E,UAAW0B,YAAUgD,oEACrBlE,qBAAsBmB,uBAAqBgD,4CAC3Cl6C,cAAeC,gBAAcu4C,kBAGVnD,EAAA8E,sEAAwF,CAC3G5E,UAAW0B,YAAUkD,sEACrBpE,qBAAsBmB,uBAAqBkD,8CAC3Cp6C,cAAeC,gBAAcg2C,2BAGVZ,EAAAgF,8EAAgG,CACnH9E,UAAW0B,YAAUkD,sEACrBpE,qBAAsBmB,uBAAqBoD,qDAC3Ct6C,cAAeC,gBAAc41C,SAGVR,EAAAkF,oEAAsF,CACzGhF,UAAW0B,YAAUsD,oEACrBxE,qBAAsBmB,uBAAqBsD,4CAC3Cx6C,cAAeC,gBAAcw3C,gCAGVpC,EAAAoF,gEAAkF,CACrGlF,UAAW0B,YAAUwD,gEACrB1E,qBAAsBmB,uBAAqBwD,wCAC3C16C,cAAeC,gBAAcq3C,iBAGVjC,EAAAsF,6DAA+E,CAClGpF,UAAW0B,YAAU0D,6DACrB5E,qBAAsBmB,uBAAqB0D,qCAC3C56C,cAAeC,gBAAcg2C,2BAGVZ,EAAAwF,0FAA4G,CAC/HtF,UAAW0B,YAAU4D,0FACrB9E,qBAAsBmB,uBAAqB4D,kEAC3C96C,cAAeC,gBAAcg2C,2BAGVZ,EAAA0F,0FAA4G,CAC/HxF,UAAW0B,YAAU8D,0FACrBhF,qBAAsBmB,uBAAqB8D,kEAC3Ch7C,cAAeC,gBAAcg2C,2BAGVZ,EAAA4F,0DAA4E,CAC/F1F,UAAW0B,YAAUgE,0DACrBlF,qBAAsBmB,uBAAqBgE,kCAC3Cl7C,cAAeC,gBAAcg2C,2BAGVZ,EAAA8F,8DAAgF,CACnG5F,UAAW0B,YAAUkE,8DACrBpF,qBAAsBmB,uBAAqBkE,sCAC3Cp7C,cAAeC,gBAAcg2C,2BAGVZ,EAAAgG,4EAA8F,CACjH9F,UAAW0B,YAAUoE,4EACrBtF,qBAAsBmB,uBAAqBoE,oDAC3Ct7C,cAAeC,gBAAcg2C,2BAGVZ,EAAAO,mBAAuC,CAC1DP,EAAe2B,YACf3B,EAAe+B,uDACf/B,EAAekC,mFACflC,EAAeqC,sFACfrC,EAAeuC,2FACfvC,EAAeyC,sGACfzC,EAAe2C,2FACf3C,EAAe6C,oFACf7C,EAAe+C,8CACf/C,EAAeiD,iEACfjD,EAAeoD,6DACfpD,EAAesD,uDACftD,EAAewD,6DACfxD,EAAe0D,0DACf1D,EAAe4D,kEACf5D,EAAe8D,mEACf9D,EAAegE,8EACfhE,EAAekE,+DACflE,EAAeoE,mFACfpE,EAAesE,wDACftE,EAAewE,0DACfxE,EAAe0E,yDACf1E,EAAe4E,oEACf5E,EAAe8E,sEACf9E,EAAegF,8EACfhF,EAAekF,oEACflF,EAAeoF,gEACfpF,EAAesF,6DACftF,EAAewF,0FACfxF,EAAe0F,0FACf1F,EAAe4F,0DACf5F,EAAe8F,8DACf9F,EAAegG,8E,kCCzPvB,kDAwBO,MAAMz5C,EAA0CqQ,IAAA,IAAC,MAAE9a,EAAK,QAAEE,EAAO,UAAElB,EAAY,kCAAkC8b,EAAA,OACpHnf,gBAAA,OAAKqD,UAAcA,EAAH,UAAuBe,KAAK,QAAO,YAAW,aAC1DpE,gBAAA,KAAGqD,UAAcA,EAAH,iBAA8BgB,GAC5CrE,gBAAA,KAAGqD,UAAcA,EAAH,mBAAgCkB,M,+ECtBtD,MAYMkkD,EAAqBC,IACvB,MAAM,yBAAEjX,EAAwB,kCAAEC,EAAiC,MAAE7yB,GAAU6pC,EAE/E,OACI1oD,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKguC,GACNzxC,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKiuC,GACL7yB,GAASA,EAAMja,IAAI+jD,MAM9BA,EAAwBhgB,IAC1B,MAAM,4BAAE0B,EAA2B,QAAEK,GAAY/B,EAEjD,OACI3oC,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAK4mC,GACLK,IAKEke,UAlC4C1oD,IACvD,MAAM,cAACmxC,EAAa,WAAEG,EAAU,aAAE5L,EAAY,MAAEpb,GAAStqB,EAEzD,OACIF,gBAACg9B,SAAMx5B,OAAAC,OAAA,GAAKmiC,GACR5lC,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAK4tC,IACT7mB,EACAi+B,EAAkBjX,M,0GCmCxB,MAAMlhC,EAAiBpQ,IAC1B,MAmBMqQ,EAAgBC,IAClB,MAAM,0BAAEC,EAAyB,QAAEC,EAAO,SAAEC,EAAQ,UAAE3H,EAAS,sBAAE4H,GAA0B1Q,EAE3F,GAAIsQ,EAAiB,CACjB,IAAKC,EACD,OAEJA,EACKI,WAAW,CACRlO,GAAIiO,EACJF,UACAI,wBAAyB,CACrBC,cAAeJ,EAASK,oBAE5B3Q,gBAAiBH,EAAMG,gBACvB4Q,mBAAoBvQ,MAAOwQ,EAAiBhP,IAlCzBxB,OAC/BwQ,EACAlI,EACA2H,EACAzO,IAEK8G,EAGEA,EACFmI,6BAA6B,CAAEC,WAAYT,EAASU,OAASC,SAAUJ,EAAiBhP,iBACxFwF,KAAK9F,IACoB,YAAlBA,EAAOV,QACPhB,EAAMqR,2BAGbpJ,MAAMzF,OATA8O,QAAQC,UA4BIC,CAA2BR,EAAiBlI,EAAW2H,EAAUzO,KAG/EiG,MAAMzF,WACR,CACH,IAAKsG,EACD,OAEJ2H,EAASzJ,aAAe,GACxByJ,EAASK,mBAAqB,GAC9BL,EAASgB,gBAAkB,GAC3B3I,EACK4I,4BAA4B,CAAER,WAAYT,EAASU,SACnD3J,KAAK9F,IACoB,YAAlBA,EAAOV,QACPhB,EAAMqR,2BAGbpJ,MAAMzF,SAIbmP,EAAkBA,CAACC,EAAwCC,KAC7D,IAAKA,IAAqBD,GAAkD,IAA5BC,EAAiB/P,OAC7D,MAAO,GAGX,MAAMgQ,EAAgBD,EAAiB5P,KAAK+O,GACjCA,EAAgBH,gBAAkBe,GAG7C,OAAIE,EACOA,EAAcC,YAElBH,GAwFX,GAAK5R,EAAMG,iBAAoBH,EAAMG,gBAAgB6R,gBAArD,CAIkF,IAADC,EAAjF,GAAIjS,EAAMkS,kCAAoClS,EAAMsH,6BAChD,IAvByB6K,EACzBC,EACAC,KAEA,MAAMnQ,EAA2B,GASjC,OARAkQ,WAAwB1N,IAAI4N,IACxB,MAAMC,EAASF,aAAqB,EAArBA,EAAuBpQ,KAAKuQ,GAAgBA,IAAiBF,EAASnQ,MAIrF,OAHIoQ,GACArQ,EAAeuQ,KAAKF,GAEjBrQ,IAGJwQ,kBAAgBC,YAAYzQ,IAU9BiQ,CAAqBnS,EAAMG,gBAAgB6R,gBAAkD,QAAnCC,EAAEjS,EAAMsH,mCAA2B,IAAA2K,OAAA,EAAjCA,EAAmCtJ,yBAChG,YAED,IACF3I,EAAMkI,yBACNlI,EAAMG,gBAAgB6R,gBAAgB/P,KAAK2Q,GAAUA,EAAOzQ,OAASnC,EAAMkI,wBAE5E,OAGJ,MAAO,CACH2K,UAAW,CACPC,YAAazC,GAEjB0C,iBAxG0BC,EAC1BvK,EACAwK,EACAC,EACAC,EACAtB,KAEA,MAAMuB,EAAczB,EAAgBlJ,EAASqI,mBAAoBe,GAC3DwB,IAAkB5K,EAASqI,mBAE3BwC,EAAehD,GACV,KACHD,EAAaC,IAIrB,OACIxQ,2BAAA,KACIA,gBAAA,SAAOqD,UAAU,iCACbrD,gBAAA,SACI2C,GAAI,6BAA6BgG,EAAS0I,OAC1CoC,KAAK,QACLC,KAAM,gBAAgB/K,EAAS0I,OAC/B/L,SAAUkO,GAAY,GACtBtO,MAAOiO,EACPQ,SAAUJ,EAAa,gBACRA,EACfK,IAAQjL,EAAS0I,OAAZ,YAER8B,GAELnT,gBAAA,SAAOqD,UAAU,qCACbrD,gBAAA,SACI2C,GAAI,+BAA+BgG,EAAS0I,OAC5CoC,KAAK,QACLC,KAAM,gBAAgB/K,EAAS0I,OAC/B/L,SAAUkO,GAAY,GACtBtO,MAAOkO,EACPO,QAASJ,EAAa,eACRA,EACdK,IAAQjL,EAAS0I,OAAZ,YAER+B,GAEJzK,EAASqI,mBACNhR,gBAAA,OAAKqD,UAAU,qCACXrD,gBAAA,QAAMqD,UAAU,2CAA2CiQ,GAC3DtT,gBAAA,UAAQqD,UAAU,uCAAuCyC,QAAS0N,GAAY,IACzEH,IAGT,OAqDMH,CACdhT,EAAMyQ,SACNzQ,EAAM2T,WACN3T,EAAM4T,kBACN5T,EAAMmT,gBACNnT,EAAM6R,kBAEVuB,YAAazB,EAAgB3R,EAAMyQ,SAASK,mBAAoB9Q,EAAM6R,kBACtEvB,kBAAmBtQ,EAAMyQ,SAASK,mBAClC5O,eAzDuB2R,EAACC,EAAkC3T,KAA2C,IAAA4T,EACrG,MAAMzB,EAAWnS,SAAgC,QAAjB4T,EAAf5T,EAAiB6R,uBAAe,IAAA+B,OAAA,EAAhCA,EAAkC9R,KAAK2Q,GAAUA,EAAOzQ,OAAS2R,EAAY5L,wBAC9F,OAAOoK,aAAQ,EAARA,EAAU9O,aAuDDqQ,CAAmB7T,EAAOA,EAAMG,iBAChD6T,eAAgB,CACZ7Q,UAAW,sC,kCC3OvB,gBAoDewlD,IA9BsC1pC,IAAA,IAAC,UAClD9b,EAAS,KACToQ,EAAI,MACJvO,EAAK,IACLigC,EAAG,IACH2jB,EAAG,KACHC,EAAI,aACJC,EAAY,aACZC,EAAY,aACZC,EAAY,SACZ5jD,EAAQ,OACR6jD,EAAM,GACNxmD,GACHwc,EAAA,OACGnf,gBAAA,SACIqD,UAAWA,EACXoQ,KAAMA,EACNvO,MAAOA,EACPigC,IAAKA,EACL2jB,IAAKA,EACLC,KAAMA,EAAI,gBACKC,EAAY,gBACZC,EAAY,gBACZC,EACf5jD,SAAUA,EACV6jD,OAAQA,EACRxmD,GAAIA,M,iHC/BZ,MAAMszB,EAAmBA,CACrBxX,EACA0gC,EACAz4B,EACAsC,EACAf,EACAgB,EACAC,EACAE,IAEIF,EACOlpB,2BAAA,KAAGkpB,GAEVzK,EACOA,EAAU7Z,IAAI+D,IAAW,IAAAy2C,EAC5B,OACIp/C,gBAAA,OAAKqD,UAAU,sBAAsBuQ,IAAK,GAAsB,QAAtBwrC,EAAGz2C,EAASgT,kBAAU,IAAAyjC,IAAI,MAAMtkC,IAASC,UAAUxD,cACxF5O,EAASgI,SACTqY,GAAiBrgB,EAAS8T,cACvBzc,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKkF,EAAS8T,cAAcvI,gBAAiBvL,EAAS8T,cAAcxJ,kBACzE,KACHtK,EAASyU,mBACNpd,gBAACm2B,OAAI,CAAC9yB,UAAU,gCACXsF,EAASgU,OACThU,EAASiU,cACTjU,EAASyU,oBAGdpd,2BAAA,KACK2I,EAASgU,OACThU,EAASiU,kBAO3BwM,EACHppB,gBAAA,OAAKqD,UAAU,wBACXrD,gBAAA,KAAGqD,UAAU,iBAAiB87C,GAC7Bl3B,GAGLjoB,2BAAA,KAAGipB,GA6HLo2B,EAA6BA,CAC/BC,EACA5gB,EACA6gB,EACAC,EACA72C,EACAL,KACA,IAAAm3C,EAEA,IAAIC,EAOJ,OALAA,GAHmE,QAA9CD,EAAwB92C,EAAS8T,qBAAa,IAAAgjC,OAAA,EAAtBA,EAAwBjvC,iBAGtC8uC,EAAa5gB,EACvC32B,mBAAiBC,cAAcM,KAChCo3C,EAAa/2C,EAASjH,MAAQiH,EAASjH,KAAKiP,SAASzJ,eAAiBoB,EAAwBi3C,EAAoBG,GAIlH1/C,2BAAA,KACIA,gBAAA,OAAKqD,UAAU,8CACXrD,gBAAA,KAAGqD,UAAW,8CAA8Cq8C,EAAWplC,uBACvEta,gBAAA,KAAGqD,UAAW,8CAA8Cq8C,EAAWplC,eAAkBolC,GA/CvEC,EAACh3C,EAA+B62C,KAAyB,IAAAI,EAAAC,EAAAC,EACvF,MAAMtvC,EAA6D,QAA9CovC,EAAwBj3C,EAAS8T,qBAAa,IAAAmjC,OAAA,EAAtBA,EAAwBpvC,gBACrE,OACIxQ,2BAAA,KACIA,gBAACm2B,OAAI,CAAC9yB,UAAU,oDACXmN,EACGxQ,gBAAA,KAAGqD,UAAU,uDACc,QADuCw8C,EAC7Dl3C,EAAS8T,qBAAa,IAAAojC,OAAA,EAAtBA,EAAwBz9C,eACxBo9C,EACsB,QADTM,EACbn3C,EAAS8T,qBAAa,IAAAqjC,OAAA,EAAtBA,EAAwBxsC,aAE7B,QAqCHqsC,CAA0Bh3C,EAAU62C,MA+FtC1qB,UAzC6B50B,IAAqB,IAAA6/C,EAAAC,EA/LtCnoB,EAuEAlO,EAwHsC,OAC7D3pB,gBAAA,MAAAwD,OAAAC,OAAA,CAAKJ,UAAWnD,EAAMmD,UAAWV,GAAIzC,EAAMyC,IAAQzC,EAAMg2B,uBAAuBh2B,IAC3EA,EAAM2oB,qCACN3oB,EAAMmE,QACK,QAAX07C,EAAC7/C,EAAMsI,YAAI,IAAAu3C,GAAVA,EAAYj+C,iBAAkB5B,EAAM2f,mBA5HnB8J,EA4HyDzpB,EAAM2f,iBA1HlF7f,2BAAA,KACIA,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKkmB,EAAWM,yBAChBN,EAAWO,iBACXP,EAAWU,oBACXV,EAAWY,mBAuHnBrqB,EAAMylB,sBAhDezlB,IACtBA,EAAM+e,gBAAkBrM,kBAAgBC,YAAY3S,EAAM+e,gBAEtDjf,gBAAA,OAAKqD,UAAU,wBACVnD,EAAM+e,eAAera,IAAIiZ,IAAY,IAAAoiC,EAClC,OACIjgD,gBAAA,OAAK4T,IAAKiK,EAAU,GAAGlC,WAAYtY,UAAU,+BACxCg8C,EACGn/C,EAAM4C,UAAUw8C,WAChBp/C,EAAM4C,UAAU47B,aAChBx+B,EAAM4C,UAAUo9C,kBAChBhgD,EAAM4C,UAAU08C,cAChB3hC,EAAU,GACwC,QADtCoiC,EACZ//C,EAAMsC,QAAQuH,cAAckR,eAAe9X,eAAO,IAAA88C,OAAA,EAAlDA,EAAoD13C,uBAEvD0tB,EACGpY,EACA3d,EAAM4C,UAAU4zB,cAChBx2B,EAAMwmB,iBACNxmB,EAAM8oB,cACN9oB,EAAM+nB,qBACN/nB,EAAM+oB,iBACN/oB,EAAMgpB,kBACNhpB,EAAMkpB,oBAQ3BlpB,EAAMkpB,eACTppB,gBAAA,OAAKqD,UAAU,uBACXrD,gBAAA,OAAKqD,UAAU,wBACXrD,gBAAA,KAAGqD,UAAU,iBAAiBnD,EAAM4C,UAAU4zB,eAC7Cx2B,EAAM+nB,uBAIfjoB,2BAAA,KAAGE,EAAM+oB,kBAULk3B,CAAqBjgD,GAErBF,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKvD,EAAMwmB,kBACXuP,EACG/1B,EAAM2d,UACN3d,EAAM4C,UAAU4zB,cAChBx2B,EAAMwmB,iBACNxmB,EAAM8oB,cACN9oB,EAAM+nB,qBACN/nB,EAAM+oB,iBACN/oB,EAAMgpB,kBACNhpB,EAAMkpB,iBAIjBlpB,EAAM+mB,qBACHjnB,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKvD,EAAMymB,qBACXzmB,EAAM+mB,oBACI,QAAV+4B,EAAA9/C,EAAMsI,YAAI,IAAAw3C,GAAVA,EAAYl+C,eArMMs+C,EAC/BC,EACAz5B,EACA1mB,IAEKmgD,EAKDrgD,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKmjB,GACLy5B,EAAoBC,SACpBD,EAAoBtb,SACpBsb,EAAoB/a,QACpB+a,EAAoB3yB,aARzBxtB,EAAMsC,QAAQC,UAAUC,MAAM,uDACvB,MA+LO09C,CAA2BlgD,EAAMonB,wBAAyBpnB,EAAM0mB,kBAAmB1mB,GA5KxEk2B,EAC7BmC,EACA3R,EACA1mB,IAEKq4B,EAKDv4B,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKmjB,GACL1mB,EAAM2mB,UACN0R,EAAkB+I,SAClB/I,EAAkBO,SAClBP,EAAkB4L,YAClB5L,EAAkBS,IAClBT,EAAkBM,eAAiBN,EAAkBM,eAAiB,KACtEN,EAAkB7K,aAXvBxtB,EAAMsC,QAAQC,UAAUC,MAAM,qDACvB,MAsKO0zB,CAAyBl2B,EAAMknB,sBAAuBlnB,EAAM0mB,kBAAmB1mB,IAzN1E23B,EA0NQ33B,EAAMopB,qBAzNlB1W,kBAAgBC,YAAYglB,EAAU3L,QAIrDlsB,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKo0B,EAAUhM,SACf,2DAJE,KAyNE3rB,EAAMsnB,2BACNtnB,EAAMwnB,sBACNxnB,EAAM2nB,uBAAyBjV,kBAAgBC,YAAY3S,EAAM2nB,uBAC9D7nB,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKvD,EAAM8nB,+BAAgC9nB,EAAM2nB,uBACtD,KACH3nB,EAAM+nB,qBACN/nB,EAAMioB,8BAGdjoB,EAAM8oB,iB,+EC/Rf,MAYMy/B,EAAqBC,IACvB,MAAM,yBAAEjX,EAAwB,kCAAEC,EAAiC,MAAE7yB,GAAU6pC,EAE/E,OACI1oD,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKguC,GACNzxC,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKiuC,GAAoC7yB,GAASA,EAAMja,IAAI+jD,MAKvEA,EAAwBhgB,IAC1B,MAAM,4BAAE0B,EAA2B,QAAEK,GAAY/B,EAEjD,OAAO3oC,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAK4mC,GAA8BK,IAGpCke,UA5B4C1oD,IACvD,MAAM,cAAEmxC,EAAa,WAAEG,EAAU,aAAE5L,EAAY,MAAEpb,GAAUtqB,EAE3D,OACIF,gBAACg9B,SAAMx5B,OAAAC,OAAA,GAAKmiC,GACR5lC,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAK4tC,IACT7mB,EACAi+B,EAAkBjX,M,wLCYzB,MAAO4X,UAAappD,gBAItBC,YAAYC,GACRC,MAAMD,GACN,MAAMiiB,EAAUtI,2BAAiB,QAAS3Z,EAAMsF,iBAAmBugB,oBAAkBqjC,MACrFzoD,KAAKqZ,WAAaC,iCAAuB/Z,EAAMsF,iBAAmB2c,GAE/DvU,SACH,OACI5N,gBAAA,OAAKqD,UAAW1C,KAAKT,MAAMmD,WACtB1C,KAAK0oD,YAAY1oD,KAAKT,QAK3BmpD,YAAYloD,GAChB,OAAGA,EAAOo7B,MAAQp7B,EAAOo7B,KAAK+sB,eAEtBtpD,gBAAA,IAAAwD,OAAAC,OAAA,CACI6X,KAAMna,EAAOo7B,KAAK+sB,eAAc,aACrB,QACP3oD,KAAKqZ,YAERrZ,KAAK4oD,aAAapoD,IAK5BR,KAAK4oD,aAAapoD,GAIjBooD,aAAapoD,GACjB,MAAMqoD,EAAgD,CAClD/oC,UAAW,CACPC,GAAI,CAAEC,EAAG,iBAAkBC,EAAG,EAAGC,EAAG,GACpCE,GAAI,CAAEJ,EAAG,iBAAkBC,EAAG,EAAGC,EAAG,IAExCG,UAAU,GAEd,OACIhhB,gBAACypD,IAAcjmD,OAAAC,OAAA,GACPtC,EAAOwoC,MAAK,CAChBh1B,aAAchU,KAAKT,MAAMyU,aACzBD,cAAevT,GAAUA,EAAOwoC,OAASxoC,EAAOwoC,MAAMj1B,eAAiB80C,EACvExf,oBAAoB,UACpBb,UAAY,CAACv1B,IAAKzS,EAAOwoC,OAAS,GAAI1uB,eAAgBta,KAAKT,MAAM+a,oBCpDjF,IAAayuC,EAAb,cAA6B1pD,YAIzBC,YAAYC,GACRC,MAAMD,GACN,MAAMiiB,EAAUtI,2BAAiB,QAAS3Z,EAAMsF,iBAAmBugB,oBAAkB2jC,SACrF/oD,KAAKqZ,WAAaC,iCAAuB/Z,EAAMsF,iBAAmB2c,GAG/DvU,SACH,OACI5N,gBAAC2F,SAAMnC,OAAAC,OAAA,CACHJ,UAAU,sBACVyC,QAASnF,KAAKT,MAAMypD,aACpBtlD,MAAO1D,KAAKT,MAAM4C,UAAU8mD,yBAAwB,aACxCjpD,KAAKT,MAAM4C,UAAU8mD,yBAAwB,gBAC1CjpD,KAAKT,MAAM2pD,WAAU,gBACrBlpD,KAAKT,MAAM4pD,UACtBnpD,KAAKqZ,eAnBZ0vC,EAAO15C,YAAA,CADnBK,KACYq5C,GChBP,MAAOK,UAA6B/pD,gBAI/B4N,WAmDIm8C,I,qlBCEf,IAAMC,EAAN,cAAqBhqD,gBAiBjBC,YAAYC,GACRC,MAAMD,GAmLH,KAAA+pD,qBAAwBC,GAAuB9+C,IAC9CzK,KAAKT,MAAMiB,OAAOgpD,gBAAkBxpD,KAAKT,MAAMiB,OAAOgpD,eAAeD,KACrEvpD,KAAKT,MAAMiB,OAAOgpD,eAAeD,GAAWE,SAAWh/C,EAAMopC,OAAOtvC,QApLxEvE,KAAK0pD,WAAarqD,cAClBW,KAAK2pD,cAAgB3pD,KAAK2pD,cAAcloC,KAAKzhB,MAC7CA,KAAK4pD,eAAiB5pD,KAAK4pD,eAAenoC,KAAKzhB,MAC/CA,KAAK6pD,SAAW7pD,KAAK6pD,SAASpoC,KAAKzhB,MACnCA,KAAKgN,MAAQ,CACTwtB,qBAAqB,EACrBsvB,mBAAmB,GAEvB9pD,KAAK6E,iBAAmB8F,6BAAmB3K,KAAKT,MAAMsC,QAAQU,QAAQqI,kBAAoB5K,KAAKT,MAAMsL,aAAc7K,KAAKT,MAAMuC,WAvBxH,kBAAsB,IAAAioD,EAAAz2B,EAC5B,MAAMyH,EAA6C,QAArCgvB,EAAG/pD,KAAKT,MAAMwB,KAAK+5B,0BAAkB,IAAAivB,OAAA,EAAlCA,EAAoC9oD,OAErD,MAD+F,SAA/D,QAAlBqyB,EAAAtzB,KAAKT,MAAMsC,eAAO,IAAAyxB,GAAS,QAATA,EAAlBA,EAAoB/wB,eAAO,IAAA+wB,GAAK,QAALA,EAA3BA,EAA6BvW,WAAG,IAAAuW,GAAU,QAAVA,EAAhCA,EAAkCE,gBAAQ,IAAAF,OAAA,EAA1CA,EAA4CG,kCAEnDsH,EAAWA,EAASztB,MAAQytB,EAASC,eAAY56B,EAEjD26B,EAAWA,EAASC,WAAaD,EAASztB,UAAOlN,EAElD,0BAA8B,IAAA4pD,EACpC,MAAMjvB,EAA6C,QAArCivB,EAAGhqD,KAAKT,MAAMwB,KAAK+5B,0BAAkB,IAAAkvB,OAAA,EAAlCA,EAAoC/oD,OACrD,OAAO85B,EAAWA,EAASkvB,OAASlvB,EAASkvB,WAAQ7pD,EAgBlD47B,oBACC7hB,IAA0BC,WAC1BM,OAAO+8B,iBAAiB,UAAWz3C,KAAK6pD,UAE5C99C,YACI,IAAM/L,KAAKT,MAAMwB,KAAK8G,KAAK5G,OAC3B,KACGjB,KAAK6H,KAAO7H,KAAKT,MAAMwB,KAAK8G,KAAK5G,SAIxCjB,KAAKi8B,qBAGFja,uBACC7H,IAA0BC,WAC1BM,OAAOwvC,oBAAoB,UAAWlqD,KAAK6pD,UAAU,GAKtD58C,SAAM,IAAAk9C,EACT,MAAM,GACFnoD,EAAE,SACFC,EACAlB,MAAM,mBAAE+5B,EACJhrB,2BAA4B7O,OAAQ6O,IAExCjO,SACIU,SAAS,KACL2S,IAEP,QACDrT,EACAM,WAAW,UACPg4B,IAEJn6B,KAAKT,MAEH6qD,EAAkBztC,IAAW,YAAa3c,KAAKT,MAAMiB,OAAOkC,WAE5Dq4B,EAAWD,GAAsBA,EAAmB75B,OACpDopD,EAAerqD,KAAKsqD,SAAS,YAC7BC,EAAcvqD,KAAKsqD,SAAS,WAC5BE,EAAaxqD,KAAKsqD,SAAS,UAC3BG,EAAkBzqD,KAAKsqD,SAAS,eAChCI,EAAqB1qD,KAAKsqD,SAAS,iBAEnCK,EAAsB3qD,KAAKsqD,SAAS,mBACpCM,EAAmB5qD,KAAKsqD,SAAS,oBACjCO,EAAoB7qD,KAAKsqD,SAAS,iBAElCQ,EAAW9qD,KAAKsqD,SAAS,QAEzBS,EAAaD,GAAYA,EAASzpD,QAAUypD,EAAS,GAAGvrD,MAAMiB,OAAOwoC,OAAS,GAE9EgiB,EAAWF,GAAYA,EAASzpD,SAAqB,QAAf8oD,EAAIW,EAAS,UAAE,IAAAX,OAAA,EAAXA,EAAa5qD,MAAMiB,OAAOyqD,YAAa,GAEjFl9C,EAASC,MAAA,GACPhO,KAAKT,OACLS,KAAKgN,OAAK,IACdisB,KAAM55B,gBAACopD,EAAI5lD,OAAAC,OAAA,GAAK,CAAE84B,KAAMovB,EAAUhiB,MAAO+hB,EAAWroD,UAAW,kBAAmBsR,aAAchU,KAAKT,MAAMsC,QAAQU,QAAQyR,aAAcsG,eAAgBta,KAAKT,MAAMsC,QAAQU,QAASsC,iBAAkB7E,KAAK6E,oBAC5M20B,oBACIn6B,gBAAC6rD,wBAAqB,CAClBxoD,UAAU,8BACV4Z,mBAAmB,EACnB6uC,oBAAqBnrD,KAAKT,MAAM4C,UAAUgpD,oBAC1CtpD,QAASA,EACTG,GAAIA,EACJC,SAAUA,EACV4C,iBAAkB7E,KAAK6E,iBACvB9D,KAAM,KAGd45B,mBACIt7B,gBAAC6rD,wBAAqB,CAClBxoD,UAAU,6BACV4Z,mBAAmB,EACnB6uC,oBAAqBnrD,KAAKT,MAAM4C,UAAUgpD,oBAC1CtpD,QAASA,EACTG,GAAIA,EACJC,SAAUA,EACV4C,iBAAkB7E,KAAK6E,iBACvB9D,KAAM,KAGdk+B,SAAWorB,GAAgBA,EAAahpD,OAAS,EAC3CgpD,EAAa,GACbhrD,gBAACg7B,oBAAiB,CAChBF,UAAWA,EACXt4B,QAAS7B,KAAKT,MAAMsC,QACpBG,GAAIhC,KAAKT,MAAMyC,GACfC,SAAUjC,KAAKT,MAAM0C,SACrBlB,KAAM,CAAE8G,KAAM7H,KAAK6H,QAE3BmxB,QAAS35B,gBAAC0pD,EAAOlmD,OAAAC,OAAA,GAAK,CAAEX,UAAWnC,KAAKT,MAAM4C,UAAW+mD,YAAalpD,KAAKgN,MAAMwtB,oBAAqB2uB,SAvDxF,oBAuD6GH,aAAchpD,KAAK2pD,cAAe9kD,iBAAkB7E,KAAK6E,oBACpL+1B,QAAS2vB,GAAeA,EAAYlpD,QAAUkpD,GAAe,GAC7D91B,OAAQ+1B,GAAcA,EAAWnpD,QAAUmpD,GAAc,GACzDlxB,YAAamxB,GAAmBA,EAAgBppD,QAAUopD,GAAmB,GAC7EtrB,gBAAiBwrB,GAAuBA,EAAoBtpD,QAAUspD,GAAuB,GAC7FvrB,aAAcwrB,GAAoBA,EAAiBvpD,QAAUupD,GAAoB,GACjFloD,UAAW0nD,EACX/wB,cAAewxB,GAAqBA,EAAkBxpD,QAAUwpD,GAAqB,GACrF3uB,UAAW,CACPxtB,YAAa1O,KAAKT,MAClBmD,UAAWia,IAAWytC,GACtB5mD,IAAK,UAET24B,gBAAiB,CACbz5B,UAAWia,IAAW,yBAE1Byf,sBAAuB,CACnB15B,UAAWia,IAAW,sBAE1BiiB,2BAA4B,CACxBl8B,UAAWia,IAAW,4BAE1Byc,QAAS,CACL12B,UAAWia,IAAW,uBAE1BkiB,oBAAqB,CACjBr7B,IAAKqmB,QACL7nB,GAlFU,oBAmFVU,UAAW,8BACXonB,QAAS9pB,KAAKgN,MAAMwtB,oBACpB4wB,cAAe,+CAA+CprD,KAAKgN,MAAMwtB,oBAAqC,GAAf,cAC/FzQ,OAAQ/pB,KAAK2pD,eAEjBzqB,iBACI7/B,gBAAC2qB,cAAW,CACRtnB,UAAU,0CACVqnB,OAAQ/pB,KAAK2pD,gBAGrB7qB,wBAAyB,CACrBt7B,IAAKymB,YACLvnB,UAAW,yCAEf63B,yBAA0B,CACtB73B,UAAW,0CAEfw4B,mCAAoC,CAChCx4B,UAAW,4BAA2B1C,KAAKgN,MAAM88C,kBAAoB,eAAiB,KAE1FjuB,0CAA2Cd,GAAY/6B,KAAKqrD,aAAe,CAEvErpD,GAAI,mBACJU,UAAW,kCACX06C,UAAW,SACXtzB,OAAQ9pB,KAAKgN,MAAM88C,kBACnBjW,OAAQ7zC,KAAK0pD,WACb3/B,OAAQ/pB,KAAK4pD,sBACZxpD,EACLg7B,WAAYp7B,KAAKsrD,iBAAiBvwB,EAAU7lB,EAAMlV,KAAKT,MAAM4C,WAC7Dg5B,YAAan7B,KAAKurD,kBAAkBxwB,EAAU7lB,EAAMlV,KAAKT,MAAM4C,WAC/D25B,0BAA2B97B,KAAKwrD,8BAA8BzwB,GAC9DM,aAAcr7B,KAAKyrD,iBAAiB1wB,GACpCgE,eAAgB2rB,GACTA,EAAmBrpD,QACnByO,GACCzQ,gBAAC+pD,EAAoBvmD,OAAAC,OAAA,GAAK9C,KAAKT,UAG3C,OAAOS,KAAKT,MAAM6P,WAAWrB,GAUzBkuB,qBAEJvhB,OAAO4hB,SAAW,KACdt8B,KAAKu8B,iBAETv8B,KAAKu8B,gBAGD+tB,SAASoB,GACb,MAAM,MAAEvkC,GAAUnnB,KAAKT,MACvB,OAAQ4nB,GAASA,EAAMukC,IAAavkC,EAAMukC,GAAUrqD,QAAU8lB,EAAMukC,IAAc,KAG9EJ,iBAAiBvwB,EAAgC7lB,EAAgD/S,GACrG,MAAMqf,EAAUtI,2BAAiB,QAASlZ,KAAK6E,iBAAkBugB,oBAAkBumC,QAC7EtyC,EAAaC,iCAAuBtZ,KAAK6E,iBAAkB2c,GACjE,OAAQuZ,GACJ17B,gBAAC2F,SAAMnC,OAAAC,OAAA,CACHJ,UAAU,2BACVgB,MAAOvB,EAAUypD,eACjBjxC,KAAMzF,GAAQA,EAAKkN,UAAS,aAChBjgB,EAAU0pD,mBACtB1mD,QAAS2mD,2BAAiB9rD,KAAK6E,iBAAkB2c,EAAS,YACtDnI,GAEJha,gBAAA,QAAMqD,UAAU,gCAA+B,eAAc,GAAOP,EAAUypD,iBAKlFL,kBAAkBxwB,EAAgC7lB,EAAgD/S,GACtG,MAAMqf,EAAUtI,2BAAiB,QAASlZ,KAAK6E,iBAAkBugB,oBAAkB2mC,SAC7E1yC,EAAaC,iCAAuBtZ,KAAK6E,iBAAkB2c,GACjE,OAAOuZ,GAAY/6B,KAAKqrD,aACpBhsD,gBAAC2F,SAAMnC,OAAAC,OAAA,CACHJ,UAAW,4BACXgB,MAAOvB,EAAU6pD,gBACjBrxC,KAAMzF,GAAQA,EAAK+2C,YAAc,GAAE,aACvB9pD,EAAU+pD,oBACtB/mD,QAAS2mD,2BAAiB9rD,KAAK6E,iBAAkB2c,EAAS,aACtDnI,GAEJha,gBAAA,QAAMqD,UAAU,iCAAgC,eAAc,GAAOP,EAAU6pD,kBAKnFR,8BAA8BzwB,GAClC,MAAMvZ,EAAUtI,2BAAiB,QAASlZ,KAAK6E,iBAAkBugB,oBAAkB+mC,WAC7E9yC,EAAaC,iCAAuBtZ,KAAK6E,iBAAkB2c,GACjE,OAAOuZ,GAAY/6B,KAAKqrD,aACpBhsD,gBAAC2F,SAAMnC,OAAAC,OAAA,CACHspD,SAAUpsD,KAAK0pD,WACfhnD,UAAW,4BAA2B,mBACrB,mBACjByC,QAASnF,KAAK4pD,eACd3kD,MAAM,OAAM,gBACGjF,KAAKgN,MAAM88C,mBACtBzwC,GAEJha,gBAAA,QAAMqD,UAAU,0BAA0B1C,KAAKqrD,aAC/ChsD,gBAAA,QAAMqD,UAAU,iCAAiC1C,KAAKqsD,sBAK1DZ,iBAAiB1wB,GACrB,MAAM,eAAEyuB,GAAmBxpD,KAAKT,MAAMiB,OAChCghB,EAAUtI,2BAAiB,QAASlZ,KAAK6E,iBAAkB,IACjE,GAAIk2B,GAAc/6B,KAAKqrD,aAAgB7B,GAAmBA,EAAenoD,OAGzE,OAAOmoD,EAAevlD,IAAI,CAACqoD,EAA0BpoD,KACjDsd,EAAQ0D,cAAcC,MAAQmnC,EAAI7C,SAClC,MAAMpwC,EAAaC,iCAAuBtZ,KAAK6E,iBAAkB2c,GAC3D+qC,EAAoC,CACtC7nD,UAAW4nD,EAAI5nD,UACfhC,UAAW,sCACX+mD,SAAU6C,EAAI7C,SACd+C,QAASF,EAAIE,QAAQ7D,eACrB8D,aAAcH,EAAIG,aAClBhpD,KAAM,SACNyxB,qBAAsB7b,GAG1B,OACIha,gBAAC8a,IAAa,CACVlH,IAAK/O,EACL03B,KAAM2wB,EACN/jB,UAAW,CAAEkkB,aAAc1sD,KAAKspD,qBAAqBplD,GAAQoW,eAAgBta,KAAKT,MAAMsC,QAAQU,aAMxGonD,gBACJ3pD,KAAKyf,SAAS,CACV+a,qBAAsBx6B,KAAKgN,MAAMwtB,sBAErCx6B,KAAKgN,MAAMwtB,qBAAuBx6B,KAAK2sD,WAAW3sD,KAAKgN,MAAMwtB,qBAGzDovB,iBACJ5pD,KAAKyf,SAAS,CACVqqC,mBAAoB9pD,KAAKgN,MAAM88C,oBAI/BD,SAAS5Q,GACTA,EAAE2T,UAAYriB,WAASsiB,SACvB7sD,KAAKyf,SAAS,CAAE+a,qBAAqB,IACrCx6B,KAAK2sD,YAAW,IAIhBA,WAAWG,GAEf,MAAMjwB,EAAaJ,SAASC,cAAc,cACpCF,EAA4CC,SAASC,cAAc,oBACnEC,EAAgBH,EAAwBA,EAAsBI,aAAe,EAE/EC,IACIiwB,GAAcrwB,SAASK,gBAAgBC,UAAYJ,EACnDE,EAAWG,UAAUC,IAAI,eACjBviB,OAAO+hB,SAASswB,KAAK/vB,UAAUgwB,SAAS,gBAChDnwB,EAAWG,UAAUhhB,OAAO,gBAKhCugB,cAAc0wB,GAGlB,MAAMzwB,EAA4CC,SAASC,cAAc,oBACnEC,EAAgBH,EAAwBA,EAAsBI,aAAe,EAC/E58B,KAAKgN,MAAMwtB,qBACXx6B,KAAK2sD,aAIT,MAAMzvB,EAAmCT,SAASC,cAAc,4BAC1DS,EAAiCV,SAASC,cAAc,6BACxDU,EAA2CX,SAASC,cAAc,2BAClEW,EAA4CZ,SAASC,cAAc,4BAEzE,GAAIQ,GAAgBC,GAAcC,GAAwBC,EAAuB,CAE7E,MAAMC,EAAeH,EAAWP,aAAeD,EAC3CF,SAASK,gBAAgBC,UAAYO,EACrCJ,EAAaF,UAAUC,IAAI,SAE3BC,EAAaF,UAAUhhB,OAAO,SAI9BygB,SAASK,gBAAgBC,UAAYJ,GACrCS,EAAqBJ,UAAUC,IAAI,SACnCI,EAAsBL,UAAUC,IAAI,WAEpCG,EAAqBJ,UAAUhhB,OAAO,SACtCqhB,EAAsBL,UAAUhhB,OAAO,aAvWzC3M,YAAA,CAATE,K,gCAQSF,YAAA,CAATE,K,wCAZC85C,EAAMh6C,YAAA,CADXK,KACK25C,GAiXSA,a,+7BC1Vf,IAAMxF,EAAN,cAA8BxkD,YAS1BC,YAAYC,GACRC,MAAMD,GAPO,KAAA2tD,gBAA0B,sBAE1B,KAAAC,sBAAgC,EAEhC,KAAAttD,iBAAiDR,cA6RjD,KAAAS,KAAOC,UAA0B,IAAAe,EAAA+E,EAC9C7F,KAAKT,MAAMU,YAAYH,KAAIkO,EAAC,CACxB9N,OAAQF,KAAKE,OACbG,SAAUL,KAAKK,SACfC,SAAUN,KAAKM,SACf8sD,YAAY,IACPptD,KAAKqtD,aAAe,CAAE9sD,OAAQ,eAGmB,QAAlCO,EAAGd,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAH,OAAA,EAA/BA,EAAiCwhC,eAExDtiC,KAAKT,MAAMU,YAAYoG,UACe,QAAnCR,EAAI7F,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAA4E,GAA/BA,EAAiCiE,iCACxC9J,KAAKT,MAAMU,YAAYqtD,SAEvBttD,KAAKT,MAAMwB,KAAKwsD,YAAYtsD,QAC5BjB,KAAKT,MAAMwB,KAAKC,SAASC,QACzBjB,KAAKT,MAAMwB,KAAKwsD,YAAYtsD,OAAOusD,aAAextD,KAAKT,MAAMwB,KAAKC,SAASC,OAAOC,aAAa2G,KAAK4lD,eAEpGztD,KAAKT,MAAMwB,KAAKC,SAASC,OAAOC,aAC3BwsD,oBAAoB,CAAEC,kBAAmB3tD,KAAKT,MAAMwB,KAAKwsD,YAAYtsD,OAAOusD,aAC5EhmD,MAAMzF,IACC/B,KAAK6B,QAAQC,YACb9B,KAAK6B,QAAQC,UAAU8e,QAAQ7e,GAC/B/B,KAAK6B,QAAQC,UAAU+e,MAAM,yCAMhC,KAAA3gB,OAAS,KACtBF,KAAKT,MAAMuC,UAAUgE,YAAY,6CAEjC9F,KAAKT,MAAMU,YAAY0F,cAGV,KAAAtF,SAAW,KACxBL,KAAKT,MAAMuC,UAAUgE,YAAY,+CAEjC9F,KAAK4tD,wBAGQ,KAAAttD,SAAW,KACxBN,KAAKT,MAAMuC,UAAUgE,YAAY,+CAEjC9F,KAAK4tD,wBAGQ,KAAAA,qBAAuB,KACpC,MAAMlnD,EAAgB1G,KAAKT,MAAMwB,KAAKC,SAASC,OAC3CyF,GAAiBA,EAAc47B,cAAgB,EAE/CtiC,KAAKT,MAAMU,YAAYoG,UAGvBrG,KAAKT,MAAMU,YAAYqtD,UAId,KAAAD,UAAY,IAErBrtD,KAAKT,MAAMsC,QAAQU,QAAQ2S,KAAKD,iBAChCjV,KAAKT,MAAMwB,KAAKwsD,YAAYtsD,QAC5BjB,KAAKT,MAAMwB,KAAKwsD,YAAYtsD,OAAOusD,YACnCxtD,KAAK6tD,iBA6FI,KAAAC,iBAAoBhqD,IACjC9D,KAAKT,MAAMuC,UAAUC,MAAM+B,GAC3B9D,KAAKT,MAAMU,YAAYyF,aAAY,GACnC1F,KAAKT,MAAMU,YAAY0F,aACvB3F,KAAKyf,SAAS,CACV3b,kBAIS,KAAAiqD,YAAc,KAC3B/tD,KAAKT,MAAMU,YAAYyF,aAAY,GACnC1F,KAAKyf,SAAS,CACV3b,aAAc,MAlclB9D,KAAKguD,iBAAmB3uD,cACxBW,KAAKiuD,oBAAsBjuD,KAAKiuD,oBAAoBxsC,KAAKzhB,MACzDA,KAAKkuD,qBAAuBluD,KAAKkuD,qBAAqBzsC,KAAKzhB,MAC3DA,KAAKmuD,eAAiBnuD,KAAKmuD,eAAe1sC,KAAKzhB,MAC/CA,KAAKouD,QAAUpuD,KAAKouD,QAAQ3sC,KAAKzhB,MACjCA,KAAKgN,MAAQ,CAAEqhD,eAAgBruD,KAAKsuD,WAAYC,uBAAuB,GAGjE,uBACN,MAAM1mD,EAAO7H,KAAKT,MAAMwB,KAAKC,SAASC,OAASjB,KAAKT,MAAMwB,KAAKC,SAASC,OAAOC,aAAa2G,UAAOzH,EACnG,IAAKyH,EACD,OAAO,EAKX,OADkBA,EAAK4wB,aAAe,GACnB,EAGb,kBACN,MAC6E,aAAxEz4B,KAAKT,MAAMwB,KAAKC,SAASC,QAAUjB,KAAKT,MAAMwB,KAAKC,SAAST,SACW,aAAvEP,KAAKT,MAAMwB,KAAKwsD,aAAevtD,KAAKT,MAAMwB,KAAKwsD,YAAYhtD,SAC8C,aAAzGP,KAAKT,MAAMwB,KAAKytD,8BAAgCxuD,KAAKT,MAAMwB,KAAKytD,6BAA6BjuD,QAI5F,iBACN,OAAOP,KAAKT,MAAMwB,KAAKytD,6BAA6BvtD,QAChDjB,KAAKT,MAAMwB,KAAKytD,6BAA6BvtD,OAAOwtD,gCAClDzuD,KAAKT,MAAMwB,KAAKytD,6BAA6BvtD,OAAOwtD,gCACpD,EAGH,0BAAuB,IAAAxoD,EAC1B4F,YACI,IAAM7L,KAAK8L,YACX/L,gBACUC,KAAKF,SAInBiM,YACI,IAAM/L,KAAKT,MAAMwB,KAAKC,SAASC,QAAUjB,KAAKT,MAAMwB,KAAKC,SAASC,OAAOC,aAAa2G,KACtF9H,UACIC,KAAK0uD,oBAIb3iD,YACI,IAAM/L,KAAKT,MAAMwB,KAAKwsD,YAAYtsD,OAClClB,UACIC,KAAK2uD,mBAIsB,QAAnC1oD,EAAIjG,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAgF,GAA/BA,EAAiCmG,4CACjCL,YACI,SAAA3F,EAAA,OAAqC,QAArCA,EAAMpG,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAmF,OAAA,EAA/BA,EAAiCkG,eACvCA,IACQA,GAAiBA,EAAcC,gBAAkBC,gBAAcq3C,iBAAmBv3C,EAAcxI,cAChG9D,KAAK8tD,iBAAiBxhD,EAAcxI,gBAKhDiI,YACI,SAAA3D,EAAA,OAAqC,QAArCA,EAAMpI,KAAKT,MAAMwB,KAAKC,SAASC,cAAM,IAAAmH,OAAA,EAA/BA,EAAiCsE,oBACvCA,IACQA,IAAuBC,iBAAek3C,iBACtCj3C,YAAqB5M,KAAKH,iBAAkBG,KAAKT,MAAMsC,QAAQuH,kBAO5EyD,sBAAsBC,EAAwCC,GACjE,OAAI/M,KAAKgN,QAAUD,GAAa/M,KAAKT,MAAMwB,OAAS+L,EAAU/L,KAM3DkM,SACH,MAAM,UACF9K,EAAS,WACTiN,EACAnP,aAAa,SAAEyN,EAAQ,QAAEF,IACzBxN,KAAKT,MAET,GAAIS,KAAKT,MAAMsC,QAAQU,QAAQ2S,KAAK05C,cAAkD,IAAlCC,wBAAsBC,QAEtE,OADA9uD,KAAKT,MAAMsC,QAAQC,UAAUgE,YAAY,gEAClC,KAGX,GACI9F,KAAKT,MAAMwB,KAAKwsD,aAChBvtD,KAAKT,MAAMwB,KAAKwsD,YAAYtsD,QAC5BjB,KAAKT,MAAMwB,KAAKwsD,YAAYtsD,OAAOusD,YACnCxtD,KAAK6tD,iBACP,CACE,MAAMN,EAAcvtD,KAAKT,MAAMwB,KAAKwsD,YAAYtsD,OAC1CyF,EAAgB1G,KAAKT,MAAMwB,KAAKC,SAASC,OAC/C,IAAIwgD,GAAgB,EACpB,MAAM39C,EAAe9D,KAAKgN,MAAMlJ,aAEhC,GAAI0J,EAAS,CACT,IAAK9G,GAAiD,IAAhCA,EAAc47B,cAChC,OAAO,KAEXmf,GAAgB,EAEpB,MAAMn/C,EAAgBtC,KAAKT,MAAMsC,QAAQU,QAAQC,QAwHjD,OAAO4M,EAvHQpB,IAAA,GACRhO,KAAKT,OAAK,IACbM,iBAAkBG,KAAKH,iBACvBwO,UAAW,CACPozC,gBACAC,kBAAmBl0C,GAEvBU,MAAOR,GAAY5J,GAAgBzE,gBAAC8O,IAActL,OAAAC,OAAA,GAAK,CAAEY,MAAOvB,EAAUmB,kBAAmBM,QAASE,KACtGw9C,gBAAiB,CACb5yC,YAAa1O,KAAKT,MAClBmD,UAAWia,IACP3c,KAAKktD,gBACL,CAAE,CAAIltD,KAAKktD,gBAAR,aAAqCzL,GACxCzhD,KAAKT,MAAMiB,OAAOkC,YAG1B6+C,YAAa,CACTxB,QAAS1gD,gBAAC0vD,UAAO,CAACC,WAAW,KAAKtsD,UAAc1C,KAAKktD,gBAAR,YAAoC1vB,KAAMr7B,EAAU8sD,qBACjG7N,kBACI/hD,gBAAC6vD,IAAa,CAACxsD,UAAc1C,KAAKktD,gBAAR,SAAiC1vB,KAAMr7B,EAAUgtD,2BAE/E7qB,OACIjlC,gBAAC2D,iBAAc,CACXN,UAAc1C,KAAKktD,gBAAR,kBACXlrD,GAAIhC,KAAKT,MAAMyC,GACfC,SAAUjC,KAAKT,MAAM0C,SACrBJ,QAAS7B,KAAKT,MAAMsC,QACpBd,KAAM,CAAEqB,MAAO,CAAEa,wBAAyByD,GAAiBA,EAAc47B,gBACzEn/B,cAAcb,aAAa,EAAbA,EAAec,WAAY,MAIrDo+C,WAAY,CACRzB,QAAS1gD,gBAAC0vD,UAAO,CAACC,WAAW,KAAKtsD,UAAc1C,KAAKktD,gBAAR,YAAoC1vB,KAAMr7B,EAAU8sD,qBACjGhP,OAAQ,CACJz8C,IAAK+3B,SACL74B,UAAc1C,KAAKktD,gBAAR,WACXvxB,iBAAkB37B,KAAKovD,gBACvB5zB,UAAcx7B,KAAKktD,gBAAR,gBACXzxB,WAAez7B,KAAKktD,gBAAR,iBACZxxB,eAAgB,OAEpBskB,WAAY3gD,gBAAC6vD,IAAa,CAACxsD,UAAc1C,KAAKktD,gBAAR,gBAAwC1vB,KAAM+vB,EAAYC,YAAc,KAC9GtN,aACIqN,EAAY8B,cACZ9B,EAAY8B,aAAaprD,IAAI,CAACqrD,EAAQprD,IAC3BlE,KAAKuvD,oBAAoBD,EAAQntD,EAAUqtD,qBAAsBrtD,EAAUstD,6BAE1FtP,uBAAwB,CACpBz9C,UAAc1C,KAAKktD,gBAAR,YAEf9M,8BAA+B,CAC3B19C,UAAc1C,KAAKktD,gBAAR,oBAEf7M,mBACIhhD,gBAACqwD,IAAc,CACXhtD,UAAc1C,KAAKktD,gBAAR,iBACX1vB,KAAMr7B,EAAUwtD,0BAChBlyB,QAAYz9B,KAAKT,MAAMyC,GAAd,WAGjBs+C,mBACIjhD,gBAACuwD,IAAc,CACXltD,UAAc1C,KAAKktD,gBAAR,iBACXvoD,SAAU3E,KAAKmuD,eACf3F,OAAQxoD,KAAKouD,QACbt7C,KAAK,SACLs1C,KAAK,MACL7jD,MAAOvE,KAAKgN,MAAMqhD,eAClB7pB,IAAK,EACL2jB,IAAKnoD,KAAKsuD,WACVjG,aAAcroD,KAAKsuD,WACnBhG,aAAc,EACdC,aAAcvoD,KAAKgN,MAAMqhD,eACzBrsD,GAAOhC,KAAKT,MAAMyC,GAAd,WAGZu+C,yBACIlhD,gBAAC2F,SAAM,CACHtC,UAAc1C,KAAKktD,gBAAR,kBACXxpD,MAAO1D,KAAKT,MAAM4C,UAAU0tD,gCAC5B1qD,QAASnF,KAAKiuD,oBACd/oD,SACIlF,KAAKgN,MAAMqhD,eAAiBruD,KAAKsuD,YACjCtuD,KAAKgN,MAAMqhD,gBAAkB,GAC7ByB,MAAM9vD,KAAKgN,MAAMqhD,iBACjBruD,KAAKgN,MAAMuhD,uBAGdvuD,KAAKT,MAAM4C,UAAU0tD,iCAG9BrP,kBAAmB95C,GAAiBA,EAAc47B,cAAgB,EAClEme,yBACIphD,gBAAC6vD,IAAa,CAACxsD,UAAc1C,KAAKktD,gBAAR,iBAAyC1vB,KAAMr7B,EAAUgtD,2BAEvFzO,0BACIrhD,gBAAC2D,iBAAc,CACXN,UAAc1C,KAAKktD,gBAAR,kBACXlrD,GAAIhC,KAAKT,MAAMyC,GACfC,SAAUjC,KAAKT,MAAM0C,SACrBJ,QAAS7B,KAAKT,MAAMsC,QACpBd,KAAM,CAAEqB,MAAO,CAAEa,wBAAyByD,GAAiBA,EAAc47B,gBACzEn/B,cAAcb,aAAa,EAAbA,EAAec,WAAY,KAGjDu9C,0BACIthD,gBAAC2F,SAAM,CACHtC,UAAU,iCACVgB,MAAO1D,KAAKT,MAAM4C,UAAU4tD,iCAC5B5qD,QAASnF,KAAKkuD,qBACd9B,SAAUpsD,KAAKguD,kBAEdhuD,KAAKT,MAAM4C,UAAU4tD,sCAS1C,OADA/vD,KAAKT,MAAMsC,QAAQC,UAAUC,MAAM,yDAC5B,KAGHqtD,gBACJ,MAAM9sD,EAAgBtC,KAAKT,MAAMsC,QAAQU,QAAQC,QACjD,OACInD,2BAAA,KACIA,gBAAA,KAAGqD,UAAc1C,KAAKktD,gBAAR,kBAA0CltD,KAAKT,MAAM4C,UAAUgtD,0BAC7E9vD,gBAAC2D,iBAAc,CACXN,UAAc1C,KAAKktD,gBAAR,kBACXlrD,GAAIhC,KAAKT,MAAMyC,GACfC,SAAUjC,KAAKT,MAAM0C,SACrBJ,QAAS7B,KAAKT,MAAMsC,QACpBd,KAAM,CAAEqB,MAAO,CAAEa,wBAAyBjD,KAAKsuD,aAC/CnrD,cAAcb,aAAa,EAAbA,EAAec,WAAY,MAMjDmsD,oBACJS,EACAb,EACAM,GAEA,MAAO,CACHx8C,IAAK+8C,EAAMC,eAAiB,GAC5BpP,2BAA4B,CACxBn+C,UAAc1C,KAAKktD,gBAAR,aAEfxpD,MAAOrE,gBAAC6vD,IAAa,CAACxsD,UAAc1C,KAAKktD,gBAAR,kBAA0C1vB,KAAMwyB,EAAMjtD,cACvF+9C,oBAAqBzhD,gBAAC6vD,IAAa,CAACxsD,UAAc1C,KAAKktD,gBAAR,sBAA8C1vB,KAAM2xB,IACnGpO,aACI1hD,gBAAC6vD,IAAa,CAACxsD,UAAc1C,KAAKktD,gBAAR,mBAA2C1vB,MAAOwyB,GAASA,EAAME,cAAet5C,aAE9GoqC,mBAAoB3hD,gBAAC6vD,IAAa,CAACxsD,UAAc1C,KAAKktD,gBAAR,qBAA6C1vB,KAAMiyB,IACjGxO,eACI5hD,gBAAC6vD,IAAa,CACVxsD,UAAc1C,KAAKktD,gBAAR,mBACX1vB,MAAOwyB,GAASA,EAAMG,oBAAqBv5C,cA0EnD,4BACJ5W,KAAKT,MAAMuC,UAAUgE,YAAY,2DAEjC,MAAMY,EAAgB1G,KAAKT,MAAMwB,KAAKC,SAASC,OAE1CyF,IAIL1G,KAAK+tD,oBACCrnD,EAAc0pD,oBAAoB,CAAEC,UAAWn5C,OAAOo5C,WAAWtwD,KAAKgN,MAAMqhD,eAAez3C,cACjG5W,KAAKyf,SAAS,CACV8uC,uBAAuB,KAIvB,6BACJvuD,KAAKT,MAAMuC,UAAUgE,YAAY,4DAEjC,MAAMY,EAAgB1G,KAAKT,MAAMwB,KAAKC,SAASC,OAE1CyF,IAIL1G,KAAK+tD,oBACCrnD,EAAc0pD,oBAAoB,CAAEC,UAAW,IACrDrwD,KAAKyf,SAAS,CACV4uC,eAAgB,KAIhBF,eAAe1jD,GACnB,MAAMlG,EAAQkG,EAAMC,cAAcnG,MAClCvE,KAAKyf,SAAS,CAAE4uC,eAAgB9pD,EAAMlD,OAAS,EAAI6V,OAAO3S,GAAS2S,OAAOo5C,WAAW/rD,GAAQgqD,uBAAuB,IAGhHH,QAAQ3jD,GACZ,MAAM8lD,EAAMr5C,OAAOo5C,WAAW7lD,EAAMC,cAAcnG,OAAOisD,QAAQ,GAC3D7lC,EAAU8R,SAASg0B,eAAkBzwD,KAAKT,MAAMyC,GAAd,UACpC2oB,GAAW4lC,IACX5lC,EAAQpmB,MAAQgsD,EAChBvwD,KAAKyf,SAAS,CAAE4uC,eAAgBn3C,OAAOo5C,WAAWC,MAIlD5B,iBACA3uD,KAAKT,MAAMU,YAAYywD,YAAc1wD,KAAKqtD,cAC1CrtD,KAAK0uD,kBACL1uD,KAAKT,MAAMU,YAAY0F,cAIvB+oD,kBACJ,MAAMiC,EAAO3wD,KAAKT,MAAMwB,KAAKwsD,YAAYtsD,OACnCD,EAAWhB,KAAKT,MAAMwB,KAAKC,SAASC,OACpC4G,EAAO7H,KAAKT,MAAMwB,KAAKC,SAASC,OAASjB,KAAKT,MAAMwB,KAAKC,SAASC,OAAOC,aAAa2G,UAAOzH,EAC7FkC,EAAgBtC,KAAKT,MAAMsC,QAAQU,QAAQC,QACjD,GAAImuD,GAAQA,EAAKnD,YAAc3lD,GAAQvF,EAAe,CAClD,MAAMa,EAAeb,EAAcc,UAAY,GACzCwtD,EAAqBC,sEAA4DhpD,EAAKU,GAAIooD,EAAKnD,WAAYrqD,GAIjHytD,EAAmBE,OAAOppB,QAAQqpB,YAAc,MAEhDC,8BAAoDJ,EAAoB5wD,KAAKT,MAAMsC,QAAQuH,eACtFrC,KAAKhH,UAAe,IAAAkxD,EACjBjxD,KAAKT,MAAMsC,QAAQuH,cAAc8nD,OAC7B,IAAIC,uCAAqCnxD,KAAKT,MAAMsC,QAAQU,QAAQ0c,aACpEqwC,GAEJ,MAAM8B,EAAqD,QAAzCH,EAAG3B,EAAOb,uCAA+B,IAAAwC,IAAIjxD,KAAKmtD,sBAGhEnsD,GAAYA,EAASshC,cAAgB8uB,SAC/BpwD,EAASovD,oBAAoB,CAAEC,UAAWe,IAGpDpxD,KAAKyf,SAAS,CAAE4uC,eAAgB+C,EAAc7C,uBAAuB,MAExE/mD,MAAMzF,IACH/B,KAAKT,MAAMsC,QAAQuH,cAActH,UAAUqd,UAAUpd,GACrD/B,KAAKT,MAAMsC,QAAQuH,cAActH,UAAU+e,MAAM,wDAxavDxR,YAAA,CAATE,K,qCAWSF,YAAA,CAATE,K,gCAQSF,YAAA,CAATE,K,+BA2ZDF,YAAA,CADCG,K,uCAhcCq0C,EAAex0C,YAAA,CAFpBI,kBACAC,KACKm0C,GAkdSA,a,2FC5hBf,MAAMwN,EAA6D7yC,IAAkC,IAAjC,oBAAE5P,EAAmB,KAAEC,GAAM2P,EAC7F,OAAK3P,GAAwB,IAAhBA,EAAKxN,OAKdhC,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAK8L,GACLC,EAAK5K,IAAKxC,GAEHpC,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKrB,EAAegB,eAAc,CAAEwQ,IAAKxR,EAAe0C,KAAI,aAAa,qCACzE1C,EAAe2C,YACf3C,EAAekB,YACflB,EAAeW,SAVzB,MAkBTkvD,EAA4DnQ,IAA2C,IAA1C,eAAE1+C,EAAc,YAAEE,EAAW,MAAEP,GAAO++C,EACrG,OACI9hD,gBAACm2B,OAAI3yB,OAAAC,OAAA,GAAKL,GACLE,EACAP,IAiCEmvD,UA5BkEhyD,IAC7E,MAAM,wBACFH,EAAuB,iBACvBS,EAAgB,UAChBwO,EAAS,gBACT3O,EAAe,uBACfoP,EAAsB,MACtBZ,EAAK,QACLa,EAAO,WACPE,EAAU,WACVC,EAAU,aACVC,GACA5P,EAEJ,OAEIF,gBAACg9B,SAAMx5B,OAAAC,OAAA,GAAK1D,EAAuB,CAAEspC,IAAK7oC,IACrCwO,EAAU1O,WAAaoP,EACvBV,EAAUV,SAAWO,EACrBG,EAAUT,YAAclO,GAAmBL,gBAACgyD,EAAkBxuD,OAAAC,OAAA,GAAKpD,IACnE2O,EAAUR,gBAAkBiB,GAA0BzP,gBAACiyD,EAAsBzuD,OAAAC,OAAA,GAAKgM,IAClFT,EAAUC,kBAAoBW,EAC9BZ,EAAUG,kBAAoBU,EAC9Bb,EAAUI,oBAAsBU,K,kCCnE7C,gBAyBeqiD,IAR8EhzC,IAAc,IAAb,MAAE9a,GAAO8a,EACnG,OAAK9a,EAIErE,gBAAA,KAAGqD,UAAU,6CAA6CgB,GAHtD,O,2sBC2Bf,MAAM+tD,EAAyDjzC,IAS1D,IAT2D,MAC5Dpc,EAAK,MACL43B,EAAK,QACLn4B,EAAO,GACPG,EAAE,SACFC,EAAQ,mBACRgrB,EAAkB,SAClBE,EAAQ,SACRgV,GACH3jB,EACG,OACInf,gBAAA,KAAGqD,UAAW,6BAA6By/B,GACvC9iC,gBAAA,QAAMqD,UAAU,8BAA8Bs3B,GAC7C53B,GAAmB,IAAVA,EACN/C,gBAAC2D,iBAAc,CACXjC,KAAM,CACFqB,MAAO,CAAEa,wBAAyBb,IAEtCc,cAAeiqB,EACftrB,QAASA,EACTG,GAAIA,EACJC,SAAUA,EACVS,UAAU,+BAGdrD,gBAAA,QAAMqD,UAAU,8BAA8BuqB,KAMxDykC,EAA8BA,CAChCnyD,EACA6C,EACA43B,EACAmI,IAGI9iC,gBAACoyD,EAAkB,CACfrvD,MAAOA,EACP43B,MAAOA,EACPn4B,QAAStC,EAAMsC,QACfG,GAAIzC,EAAMyC,GACVC,SAAU1C,EAAM0C,SAChBgrB,mBAAoB1tB,EAAM0tB,mBAC1BE,SAAU5tB,EAAM4tB,SAChBrrB,UAAWvC,EAAMuC,UACjBqgC,SAAUA,IAKhBE,EAA0B37B,GACpBA,GAAiBA,EAAc47B,eAAkB,EAYhDzW,EAAkBtsB,IAC3B,MAAM,YAAEk5B,EAAW,UAAE3wB,GAAcvI,EAAMsI,KACnC8pD,EAAe7pD,aAAS,EAATA,EAAWC,OAAOC,GAAYA,EAASwO,eACtD4G,EAAmC,CACrCuiC,SAAUgS,aAAY,EAAZA,EAAc1tD,IAAK2tD,GAClBF,EACHnyD,EACAqyD,EAAYC,cACZz3B,iBAAO76B,EAAMysB,aAAc4lC,EAAYE,WACvC,YAGR/kC,WAAY2kC,EAA4BnyD,EAAOk5B,EAAal5B,EAAMusB,gBAAiB,UAGvF,GAAIvsB,EAAMmH,cAAe,CACrB,MAAMo9B,EAzBiBC,EAACr9B,EAA+BmB,KAC3D,MAGMm8B,GAAsBt9B,EAAcu9B,iBAAmB,IAAIC,OAHzCC,CAACngC,EAAeogC,IAC7BpgC,GAASogC,EAASC,SAAW,GAEiD,GACnFC,GAAUz8B,EAAK4wB,aAAe,GAAK4J,EAAuB37B,GAChE,OAAO69B,KAAKC,IAAIR,EAAoBM,IAmBTP,CAAuBxkC,EAAMmH,cAAenH,EAAMsI,MACnEy6B,EAAgBD,EAAuB9iC,EAAMmH,eAC7Cg+B,GAA4BjM,GAAe,GAAKqL,EAAiBxB,EAEnEA,EAAgB,IAChBllB,EAAWunB,QAAU+sB,EAA4BnyD,GAAQ+iC,EAAe/iC,EAAMqlC,cAAgB,iBAAkB,YAGhHd,EAAiB,IACjB1mB,EAAWgnB,SAAWstB,EAClBnyD,GACCukC,EACDvkC,EAAMslC,eAAiB,mBACvB,cAIRznB,EAAW2P,WAAa2kC,EAA2B1jD,IAAC,GAC3CzO,GAAK,IAAE4tB,cAAU/sB,IACtBskC,EACAnlC,EAAMusB,gBACN,SAIR,OAAO1O,I,sJC5HJrd,eAAeqzB,EAClBvrB,EACA/F,EACAiwD,GAC2B,IAEvB37B,EACAC,EAHJ27B,IAAA77B,UAAA90B,OAAA,QAAAjB,IAAA+1B,UAAA,KAAAA,UAAA,GAIA,IACIC,QAAmBvuB,EACnBwuB,EAAcD,EAAWvuB,KAAKyuB,QAChC,MAAOv0B,GAGL,OAFAD,EAAU8e,QAAQ7e,GAClBD,EAAU+e,MAAM,uCACTwS,cAAYviB,UAGvB,IAAIulB,EAmCA,OADAv0B,EAAU8e,QAAQ,uDACXyS,cAAYviB,UAlCnB,IAAK,IAADmhD,EACA,MAAMz7B,QAAoD07B,mBAAiBz7B,yBACvE,CAAEttB,cAAe4oD,EAAa3oD,cAAe2nD,YAAa,QAC1D36B,EAAWvuB,KAAKU,GAChB8tB,GAGJ,aAAahD,cAAYviB,QAAkD,QAA3CmhD,EAACz7B,EAAiB27B,iCAAyB,IAAAF,SAAI7xD,GACjF,MAAO2B,GAEL,GAAIiwD,GAA8B,2DAAfjwD,EAAMgR,KAAmE,CACxF,UACUqjB,EAAWO,YAAY,IAC/B,MAAOC,GAGL,OAFA90B,EAAU8e,QAAQgW,GAClB90B,EAAU+e,MAAM,0BACTwS,cAAYviB,UAEvB,IAEI,aADMsiB,EAAkBvrB,EAAM/F,EAAWiwD,GAAc,GAChD1+B,cAAYviB,UACrB,MAAO+lB,GAGL,OAFA/0B,EAAU8e,QAAQiW,GAClB/0B,EAAU+e,MAAM,2BACTwS,cAAYviB,WAM3B,OAFAhP,EAAU8e,QAAQ7e,GAClBD,EAAU+e,MAAM,2BACTwS,cAAYviB,WAiExB/Q,eAAeihB,EAClBlL,EACAsgB,EACAt0B,EACAqb,EACAi1C,EACAx1C,GAEA,GAAIwZ,EAAY,CACZ,IAAIi8B,GAA0C,EAC9C,GAAIpgD,kBAAgBC,YAAYiL,IAAarH,EAAgC,CAAC,IAADw8C,EACzE,MAAMC,EAA6Cp1C,EAAS3b,KACvDuO,GAA2BA,EAAQuU,WAAa8tC,EAAiBx6C,WAEtEy6C,IAAmCE,KAA6C,QAAzBD,EAACC,EAAgBr8C,gBAAQ,IAAAo8C,IAAxBA,EAA0Bn8C,sBAElFk8C,GAAiC,EAGrC,MAAM7xC,EAAQ,CACV/P,WAAY2hD,EAAiB1hD,OAAQkG,WACrCqe,YAAarY,EACbsY,qBAAsB,CAAEm9B,mCAG5B,IACI,MAAMG,QAA4Cp8B,EAAWhB,uBAAuB5U,GACpF,aAAa6S,cAAYviB,QAAQ0hD,GACnC,MAAOzwD,GACLD,EAAU8e,QAAS7e,EAAgB6B,SACnC9B,EAAU+e,MAAM,wCAIxB,OAAOwS,cAAYviB","file":"static/js/7.c8074f9cfe9144b176ec.chunk.js","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { CheckoutModule, ErrorLocation, ICheckoutState } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelDeliveryOptionConfiguration, FilterDeliveryModeOption } from '@msdyn365-commerce/retail-proxy';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Address, CartLine, DeliveryOption } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { QueryResultSettingsProxy, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { action, computed, observable, reaction, when } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ErrorComponent } from '../../common/error';\nimport { ICheckoutDeliveryOptionsData } from './checkout-delivery-options.data';\nimport {\n filterDeliveryModeOption,\n ICheckoutDeliveryOptionsProps,\n useDefaultDeliveryOption\n} from './checkout-delivery-options.props.autogenerated';\nimport DescriptionComponent from './components/checkout-delivery-options.description';\nimport ErrorMessageComponent from './components/checkout-delivery-options.error-message';\nimport ErrorTitleComponent from './components/checkout-delivery-options.error-title';\nimport RadioButtonComponent from './components/checkout-delivery-options.radio-button';\nimport { focusOnCheckoutError } from '../../checkout-errors';\n\nexport interface ICheckoutDeliveryOptionsModuleProps\n extends ICheckoutDeliveryOptionsProps,\n IModuleStateProps {}\n\nexport interface ICheckoutDeliveryOption {\n DeliveryOption: INodeProps;\n description?: React.ReactNode;\n price?: React.ReactNode;\n}\n\nexport interface ICheckoutDeliveryOptionEdit extends ICheckoutDeliveryOption {\n code: string;\n radioButton?: React.ReactNode;\n}\n\nexport interface ICheckoutDeliveryOptionsList {\n DeliveryOptionsList: INodeProps;\n list: ICheckoutDeliveryOptionEdit[];\n}\n\nexport interface ICheckoutDeliveryOptionsError {\n Error: INodeProps;\n title: React.ReactNode;\n message: React.ReactNode;\n}\n\nexport interface ICheckoutDeliveryOptionsViewState {\n isLoading: boolean;\n isError: boolean;\n isShowList: boolean;\n isShowSelected: boolean;\n isShowSaveButton: boolean;\n isShowEditButton: boolean;\n isShowCancelButton: boolean;\n}\n\nexport interface ICheckoutDeliveryOptionsViewProps extends ICheckoutDeliveryOptionsProps<{}> {\n CheckoutDeliveryOptions: IModuleProps;\n selectedItemId: string;\n deliveryOptionsData: DeliveryOption[];\n isLoading: boolean;\n errorMessageData: string;\n viewState: ICheckoutDeliveryOptionsViewState;\n deliveryOptions?: ICheckoutDeliveryOptionsList;\n deliveryOptionSelected?: ICheckoutDeliveryOption;\n errorMessage?: ICheckoutDeliveryOptionsError;\n waiting?: React.ReactNode;\n saveButton?: React.ReactNode;\n editButton?: React.ReactNode;\n cancelButton?: React.ReactNode;\n alert?: React.ReactNode;\n checkoutErrorRef?: React.RefObject;\n onDeliveryOptionChange(event: React.ChangeEvent): void;\n onSave(): void;\n onEdit(): void;\n onCancel(): void;\n}\n\n/**\n *\n * CheckoutDeliveryOptions component.\n * @extends {React.Component>}\n */\n// @ts-expect-error\n@withModuleState\n@observer\nclass CheckoutDeliveryOptions extends React.Component {\n @observable private selectedItemId: string = '';\n\n @observable private deliveryOptions: DeliveryOption[] = [];\n\n @observable private isLoading: boolean = false;\n\n @observable private errorMessage?: string;\n\n @computed private get isDataReady(): boolean {\n return (this.props.data.checkout.result && this.props.data.checkout.status) === 'SUCCESS';\n }\n\n public get expressPaymentDetailsFromCartPage() {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const properties =\n this.props.data.cart?.result?.cart?.ExtensionProperties?.find(property => property.Key === 'expressPaymentDetails')?.Value\n ?.StringValue ?? '';\n\n return properties ? JSON.parse(properties) : null;\n }\n\n public get isExpressPaymentAppliedInCartPage(): boolean {\n return this.expressPaymentDetailsFromCartPage?.isExpressCheckoutAppliedInCartPage ?? false;\n }\n\n private cartDeliveryMode?: string;\n\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n private readonly telemetryContent?: ITelemetryContent;\n\n private readonly isSelectDefaultOptionEnabled?: boolean;\n\n private readonly checkoutErrorRef: React.RefObject = React.createRef();\n\n public constructor(props: ICheckoutDeliveryOptionsModuleProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.isSelectDefaultOptionEnabled =\n this.props.config.useDefaultDeliveryOption && this.props.config.useDefaultDeliveryOption !== useDefaultDeliveryOption.none;\n }\n\n public async componentDidMount(): Promise {\n when(\n () => this.isDataReady,\n async () => {\n await this.init();\n }\n );\n\n reaction(\n () => this.props.data.checkout.result?.shippingAddress,\n async () => {\n await this.loadDeliveryOptions();\n this.props.moduleState.setIsCancellable(false);\n\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n }\n );\n\n reaction(\n () => this.props.data.checkout.result?.isExpressCheckoutApplied,\n async isExpressCheckoutApplied => {\n if (isExpressCheckoutApplied && this.canShip() && !this.isExpressPaymentAppliedInCartPage) {\n await this.loadDeliveryOptions();\n this.props.moduleState.setIsCancellable(false);\n\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n }\n }\n );\n\n if (this.props.data.checkout.result?.shouldEnableCheckoutErrorDisplayMessaging) {\n reaction(\n () => this.props.data.checkout.result?.checkoutError,\n checkoutError => {\n if (\n checkoutError &&\n checkoutError.errorLocation === ErrorLocation.CheckoutDeliveryOptions &&\n checkoutError.errorMessage\n ) {\n this.setError(checkoutError.errorMessage);\n }\n }\n );\n\n reaction(\n () => this.props.data.checkout.result?.checkoutErrorFocus,\n checkoutErrorFocus => {\n if (checkoutErrorFocus === CheckoutModule.CheckoutDeliveryOptions) {\n focusOnCheckoutError(this.checkoutErrorRef, this.props.context.actionContext);\n }\n }\n );\n }\n }\n\n public shouldComponentUpdate(nextProps: ICheckoutDeliveryOptionsModuleProps, nextState: ICheckoutDeliveryOptionsViewState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.find(\n feature => feature.Name === multiplePickupStoreSwitchName\n )?.IsEnabled;\n\n if (!this.canShip()) {\n this.props.context.telemetry.error('Checkout delivery options content is empty, module wont render');\n return null;\n }\n\n const {\n moduleState: { isReady, isUpdating, hasError }\n } = this.props;\n const isError = !this.isLoading && hasError;\n const isShowList = !this.isLoading && !hasError && isUpdating && !this.isSelectDefaultOptionEnabled;\n const isShowSelected = !this.isLoading && !hasError && isReady;\n const { errorMessageTitle, deliveryOptionAriaLabel } = this.props.resources;\n\n const viewProps = {\n ...this.props,\n onDeliveryOptionChange: this.onDeliveryOptionChange,\n selectedItemId: this.selectedItemId,\n deliveryOptionsData: this.deliveryOptions,\n isLoading: this.isLoading,\n alert: this.errorMessage && ,\n errorMessageData: this.errorMessage,\n viewState: {\n isLoading: this.isLoading,\n isError,\n isShowList,\n isShowSelected,\n isShowSaveButton: isShowList && !this.props.moduleState.hasExternalSubmitGroup,\n isShowEditButton: isShowSelected && !this.props.moduleState.hasExternalSubmitGroup,\n isShowCancelButton: isShowList && !this.props.moduleState.hasExternalSubmitGroup && !!this.getSavedDeliveryOption()\n },\n CheckoutDeliveryOptions: {\n moduleProps: this.props,\n className: classname('ms-checkout-delivery-options', this.props.config.className)\n },\n deliveryOptions: {\n DeliveryOptionsList: {\n className: 'ms-checkout-delivery-options__list',\n role: 'list',\n 'aria-label': deliveryOptionAriaLabel\n },\n list: this.getDeliveryOptionList()\n },\n deliveryOptionSelected: this.getDeliveryOptionSelected(),\n errorMessage: this.getErrorMessage(),\n waiting: ,\n checkoutErrorRef: this.checkoutErrorRef,\n saveButton: this.getSaveButton(),\n editButton: this.getEditButton(),\n cancelButton: this.getCancelButton(),\n onSave: this.onSave,\n onEdit: this.onEdit,\n onCancel: this.onCancel\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n @action\n private readonly init = async (): Promise => {\n this.props.moduleState.init({\n onEdit: this.isSelectDefaultOptionEnabled ? undefined : this.onEdit,\n onCancel: this.isSelectDefaultOptionEnabled ? undefined : this.onCancel,\n onSubmit: this.isSelectDefaultOptionEnabled ? undefined : this.onSubmit,\n status:\n !(this.props.config.useDefaultDeliveryOption === useDefaultDeliveryOption.notDisplaySelectedDeliveryOption) &&\n this.canShip()\n ? 'updating'\n : 'disabled'\n });\n\n this.cartDeliveryMode = this.getSavedDeliveryOption();\n await this.loadDeliveryOptions();\n };\n\n private readonly canShip = (): boolean => {\n const hasInvoice = this.props.data.checkout.result?.checkoutCart.hasInvoiceLine;\n return !hasInvoice && this.getCartLinesForShipping().length > 0;\n };\n\n private readonly isDeliveryModeExists = (deliveryMode: string | undefined): boolean => {\n if (deliveryMode) {\n if (this.deliveryOptions.find(deliveryOption => deliveryOption.Code === deliveryMode)) {\n return true;\n }\n }\n return false;\n };\n\n private readonly getDeliveryOptionSelected = (): ICheckoutDeliveryOption | null => {\n const selectedItem = this.deliveryOptions.find(deliveryOption => deliveryOption.Code === this.selectedItemId);\n if (!selectedItem) {\n this.props.context.telemetry.error('Checkout delivery options content is empty, module wont render');\n return null;\n }\n\n const { id, typeName, context } = this.props;\n const { priceFree } = this.props.resources;\n const price = get(selectedItem, 'ShippingChargeAmount', 0);\n const channelConfig = this.props.context.request.channel;\n return {\n DeliveryOption: { className: 'ms-checkout-delivery-options__option-selected' },\n description: ,\n price: (\n \n )\n };\n };\n\n private readonly getErrorMessage = (): ICheckoutDeliveryOptionsError => {\n const { errorMessageTitle } = this.props.resources;\n return {\n // @ts-expect-error\n CheckoutDeliveryOptionsError: { tag: 'span', className: 'ms-address-form__error', role: 'alert', 'aria-live': 'assertive' },\n title: ,\n message: \n };\n };\n\n private readonly getDeliveryOptionList = (): ICheckoutDeliveryOptionEdit[] => {\n const count = this.deliveryOptions.length;\n const { priceFree } = this.props.resources;\n const { id, typeName, context } = this.props;\n const channelConfig = this.props.context.request.channel;\n\n return this.deliveryOptions.map((deliveryOption: DeliveryOption, index: number) => {\n return {\n DeliveryOption: { className: 'ms-checkout-delivery-options__option', role: 'listitem' },\n code: deliveryOption.Code || '',\n radioButton: (\n \n ),\n description: (\n \n ),\n price: (\n \n )\n };\n });\n };\n\n private readonly getSaveButton = (): React.ReactNode => {\n const { saveBtnLabel = 'Save' } = this.props.resources;\n return (\n \n {saveBtnLabel}\n \n );\n };\n\n private readonly getEditButton = (): React.ReactNode => {\n const { editBtnLabel = 'Change' } = this.props.resources;\n return (\n \n );\n };\n\n private readonly getCancelButton = (): React.ReactNode => {\n const { cancelBtnLabel = 'Cancel' } = this.props.resources;\n return (\n \n );\n };\n\n private readonly setError = (errorMessage: string): void => {\n this.props.telemetry.error(errorMessage);\n this.props.moduleState.setHasError(true);\n this.props.moduleState.onUpdating();\n this.errorMessage = errorMessage;\n };\n\n private readonly clearError = (): void => {\n this.props.moduleState.setHasError(false);\n this.errorMessage = undefined;\n };\n\n private readonly onSave = async (): Promise => {\n await this.onSubmit();\n };\n\n private readonly onEdit = async (): Promise => {\n this.props.telemetry.information('Delivery options onEdit is called.');\n\n this.clearError();\n this.onUpdating();\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n };\n\n private readonly onSubmit = async (): Promise => {\n this.props.telemetry.information('Delivery options onSubmit is called.');\n\n await this.updateCartDeliverySpecification(this.selectedItemId);\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n };\n\n private readonly onCancel = async (): Promise => {\n this.props.telemetry.information('Delivery options onCancel is called.');\n\n // Reset to the saved value\n const savedDeliveryOption = this.getSavedDeliveryOption();\n if (savedDeliveryOption) {\n this.selectedItemId = savedDeliveryOption;\n this.onReady();\n\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n } else {\n this.onUpdating();\n }\n };\n\n private readonly getSavedDeliveryOption = (): string | undefined => {\n const cartLinesForShipping = this.getCartLinesForShipping();\n return cartLinesForShipping[0] && cartLinesForShipping[0].DeliveryMode;\n };\n\n private readonly updateCartDeliverySpecification = async (deliveryModeId: string): Promise => {\n if (deliveryModeId.trim() === '') {\n return;\n }\n\n const { resources } = this.props;\n const checkoutState = this.props.data.checkout.result as ICheckoutState;\n const updateCartDeliverySpecificationInput = {\n deliveryModeId,\n shippingAddress: checkoutState.shippingAddress,\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined\n };\n\n this.clearError();\n this.onPending();\n\n await checkoutState.checkoutCart\n .updateCartDeliverySpecification(updateCartDeliverySpecificationInput)\n .then(response => {\n if (response.status === 'FAILED') {\n const errorMessage = `${response.errorDetails?.LocalizedMessage}`;\n this.setError(StringExtensions.isNullOrEmpty(errorMessage) ? resources.genericErrorMessage : errorMessage);\n }\n\n this.onReady();\n this.props.moduleState.setIsCancellable(true);\n })\n .catch(() => {\n this.setError(resources.genericErrorMessage);\n });\n };\n\n private readonly getCartLinesForShipping = (): CartLine[] => {\n const { request } = this.props.context;\n const pickupDeliveryModeCode = request && request.channel && request.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode = request && request.channel && request.channel.EmailDeliveryModeCode;\n\n return this.retailMultiplePickUpOptionEnabled\n ? ((this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart.CartLines) || []).filter(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\n ? cartLine.DeliveryMode !==\n this.channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(\n deliveryMode => deliveryMode === cartLine.DeliveryMode\n ) && cartLine.DeliveryMode !== emailDeliveryModeCode\n : cartLine\n )\n : ((this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart.CartLines) || []).filter(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\n ? cartLine.DeliveryMode !== pickupDeliveryModeCode && cartLine.DeliveryMode !== emailDeliveryModeCode\n : cartLine\n );\n };\n\n private readonly getDeliveryOptions = async (shippingAddress: Address): Promise => {\n if (!this.props.data.checkout.result) {\n return;\n }\n\n const { context, resources, config } = this.props;\n const cartState = this.props.data.checkout.result?.checkoutCart;\n const cartId = (cartState.cart as Cart).Id;\n\n if (context) {\n this.isLoading = true;\n this.deliveryOptions = [];\n this.selectedItemId = '';\n this.clearError();\n\n try {\n let originalDeliveryMode: string = '';\n const shippingCartLines = this.getCartLinesForShipping();\n const hasShippingDeliveryLines = shippingCartLines && shippingCartLines.length > 0 && shippingCartLines[0].DeliveryMode;\n if (hasShippingDeliveryLines) {\n // First store the delivery mode, so that we can restore the shipping information.\n originalDeliveryMode = shippingCartLines[0].DeliveryMode || '';\n\n // Clear the delivery information on retail server, so GetDeliveryOptions charge calculation works correctly\n const cart = cartState.cart;\n await cartState.clearCartLinesDeliveryInformation({\n cart,\n channelDeliveryOptionConfiguration: this.channelDeliveryOptionConfig\n });\n }\n\n // TODO: Check if we can move this getDeliveryOptions to checkout state\n let deliveryOptionFilter: FilterDeliveryModeOption;\n switch (config.filterDeliveryModeOption) {\n case filterDeliveryModeOption.none:\n deliveryOptionFilter = FilterDeliveryModeOption.None;\n break;\n case filterDeliveryModeOption.filterOutNonCarrierDeliveryMode:\n deliveryOptionFilter = FilterDeliveryModeOption.FilterOutNonCarrierDeliveryMode;\n break;\n default:\n deliveryOptionFilter = FilterDeliveryModeOption.FilterOutNonCarrierDeliveryMode;\n }\n const response = await getDeliveryOptionsAsync(\n {\n callerContext: context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context.actionContext)\n },\n cartId,\n shippingAddress,\n [],\n deliveryOptionFilter,\n true\n );\n\n if (hasShippingDeliveryLines) {\n await this.updateCartDeliverySpecification(originalDeliveryMode);\n }\n\n if (response && response.length > 0) {\n this.deliveryOptions = response;\n }\n } catch {\n this.setError(resources.genericErrorMessage);\n }\n\n if (this.deliveryOptions.length === 0) {\n this.setError(resources.deliveryOptionsNotFound);\n } else if (this.cartDeliveryMode && this.isDeliveryModeExists(this.cartDeliveryMode)) {\n this.selectedItemId = this.cartDeliveryMode;\n this.cartDeliveryMode = undefined;\n this.onReady();\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n this.props.data.checkout.result?.updateHasCartDeliveryMode({ newHasCartDeliveryMode: true });\n\n if (!this.props.data.checkout.result?.isPaymentVerificationRedirection) {\n await this.props.data.checkout.result.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n }\n } else {\n this.onUpdating();\n this.selectedItemId = this.deliveryOptions.length > 0 ? this.deliveryOptions[0].Code || '' : ''; // By default, select first delivery\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n this.props.data.checkout.result?.updateHasCartDeliveryMode({ newHasCartDeliveryMode: !!this.isSelectDefaultOptionEnabled });\n }\n\n this.isLoading = false;\n }\n };\n\n private readonly getStoredDeliveryOptions = async (): Promise => {\n if (!this.props.data.checkout.result) {\n return;\n }\n\n const { context } = this.props;\n const cartState = this.props.data.checkout.result.checkoutCart;\n\n if (context) {\n this.isLoading = true;\n this.deliveryOptions = [];\n this.selectedItemId = '';\n this.clearError();\n\n let originalDeliveryMode: string = '';\n const shippingCartLines = this.getCartLinesForShipping();\n const hasShippingDeliveryLines = shippingCartLines && shippingCartLines.length > 0 && shippingCartLines[0].DeliveryMode;\n if (hasShippingDeliveryLines) {\n // First store the delivery mode, so that we can restore the shipping information.\n originalDeliveryMode = shippingCartLines[0].DeliveryMode || '';\n\n // Clear the delivery information on retail server, so GetDeliveryOptions charge calculation works correctly\n const cart = cartState.cart;\n await cartState.clearCartLinesDeliveryInformation({\n cart,\n channelDeliveryOptionConfiguration: this.channelDeliveryOptionConfig\n });\n if (hasShippingDeliveryLines) {\n await this.updateCartDeliverySpecification(originalDeliveryMode);\n }\n }\n\n if (this.cartDeliveryMode) {\n this.selectedItemId = this.cartDeliveryMode;\n this.cartDeliveryMode = undefined;\n this.onReady();\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n this.props.data.checkout.result?.updateHasCartDeliveryMode({ newHasCartDeliveryMode: true });\n\n if (!this.props.data.checkout.result.isPaymentVerificationRedirection) {\n await this.props.data.checkout.result.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n }\n }\n\n this.isLoading = false;\n }\n };\n\n private readonly loadDeliveryOptions = async (): Promise => {\n const shippingAddress = this.props.data.checkout.result?.shippingAddress;\n\n if (this.canShip() && shippingAddress) {\n if (\n !this.props.data.checkout.result?.isPaymentVerificationRedirection ||\n this.isSelectDefaultOptionEnabled ||\n this.props.data.checkout.result?.isExpressCheckoutApplied\n ) {\n await this.getDeliveryOptions(shippingAddress);\n }\n\n if (this.props.data.checkout.result?.isPaymentVerificationRedirection) {\n await this.getStoredDeliveryOptions();\n }\n\n if (\n this.isSelectDefaultOptionEnabled ||\n this.props.data.checkout.result?.isExpressCheckoutApplied ||\n this.isExpressPaymentAppliedInCartPage\n ) {\n this.onSubmit();\n }\n }\n };\n\n private readonly onDeliveryOptionChange = (event: React.ChangeEvent) => {\n const deliveryModeId = event.currentTarget.value;\n this.selectedItemId = deliveryModeId;\n };\n\n private readonly onReady = () => {\n if (!(this.props.config.useDefaultDeliveryOption === useDefaultDeliveryOption.notDisplaySelectedDeliveryOption)) {\n this.props.moduleState.onReady();\n }\n };\n\n private readonly onUpdating = () => {\n if (!(this.props.config.useDefaultDeliveryOption === useDefaultDeliveryOption.notDisplaySelectedDeliveryOption)) {\n this.props.moduleState.onUpdating();\n }\n };\n\n private readonly onPending = () => {\n if (!this.isSelectDefaultOptionEnabled) {\n this.props.moduleState.onPending();\n }\n };\n}\n\nexport default CheckoutDeliveryOptions;\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n CartLine,\r\n ChannelDeliveryOptionConfiguration,\r\n DeliveryOption,\r\n OrgUnitLocation,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface IPickUpInStoreViewProps {\r\n callbacks: {\r\n toggleBopis(isBopisSelected: boolean): void;\r\n };\r\n defaultComponent?: React.ReactNode;\r\n orgUnitName?: string;\r\n isBopisSelected: boolean;\r\n ContainerProps: INodeProps;\r\n deliveryOption?: string;\r\n}\r\n\r\nexport interface IPickUpInStoreProps {\r\n cartline: CartLine;\r\n product: SimpleProduct;\r\n shipitText: string;\r\n pickUpInStoreText: string;\r\n changeStoreText: string;\r\n cartState: ICartState | undefined;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n orgUnitLocations?: OrgUnitLocation[] | undefined;\r\n deliveryOptions?: ProductDeliveryOptions;\r\n pickupDeliveryModeCode?: string;\r\n storeSelectorModuleId?: string;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n retailMulitplePickupFeatureState?: boolean;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\r\n const _onLocationChangedCallback = async (\r\n orgUnitLocation: OrgUnitLocation,\r\n cartState: ICartState | undefined,\r\n cartline: CartLine,\r\n deliveryMode?: string\r\n ) => {\r\n if (!cartState) {\r\n return Promise.resolve();\r\n }\r\n return cartState\r\n .updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n props.locationChangedHandler();\r\n }\r\n })\r\n .catch(error => {});\r\n };\r\n\r\n const _toggleBOPIS = (isBopisSelected: boolean) => {\r\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\r\n\r\n if (isBopisSelected) {\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n storeSelectorStateManager\r\n .openDialog({\r\n id: storeSelectorModuleId,\r\n product,\r\n alreadySelectedLocation: {\r\n OrgUnitNumber: cartline.FulfillmentStoreId\r\n },\r\n deliveryOptions: props.deliveryOptions,\r\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\r\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\r\n }\r\n })\r\n .catch(error => {});\r\n } else {\r\n if (!cartState) {\r\n return;\r\n }\r\n cartline.DeliveryMode = '';\r\n cartline.FulfillmentStoreId = '';\r\n cartline.ShippingAddress = {};\r\n cartState\r\n .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n props.locationChangedHandler();\r\n }\r\n })\r\n .catch(error => {});\r\n }\r\n };\r\n\r\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\r\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\r\n });\r\n\r\n if (foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n }\r\n return fulfillmentStoreId;\r\n };\r\n\r\n const _renderShippingMethod = (\r\n cartLine: CartLine,\r\n shipItText: string,\r\n pickupInStoretext: string,\r\n changeStoreText: string,\r\n orgUnitLocations: OrgUnitLocation[] | undefined\r\n ): JSX.Element => {\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\r\n const bopisSelected = !!cartLine.FulfillmentStoreId;\r\n\r\n const toggleBOPIS = (isBopisSelected: boolean) => {\r\n return () => {\r\n _toggleBOPIS(isBopisSelected);\r\n };\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {cartLine.FulfillmentStoreId ? (\r\n
\r\n {orgUnitName}\r\n \r\n
\r\n ) : null}\r\n \r\n );\r\n };\r\n\r\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\r\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\r\n return delivery?.Description;\r\n };\r\n\r\n /**\r\n * Method to check if we have atleast one common delivery code between product and channel.\r\n * @param productdeliveryOptions - Product DeliveryOption List.\r\n * @param storePickUpOptionList - Channel DeliveryOption List.\r\n * @returns Boolean flag.\r\n */\r\n const matchDeliveryOptions = (\r\n productdeliveryOptions: DeliveryOption[] | undefined,\r\n storePickUpOptionList: string[] | undefined\r\n ): boolean => {\r\n const deliveryOption: string[] = [];\r\n productdeliveryOptions?.map(delivery => {\r\n const pickup = storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code);\r\n if (pickup) {\r\n deliveryOption.push(pickup);\r\n }\r\n return deliveryOption;\r\n });\r\n\r\n return ArrayExtensions.hasElements(deliveryOption);\r\n };\r\n\r\n // If no delivery options present on the product, or none of the delivery options\r\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\r\n if (!props.deliveryOptions || !props.deliveryOptions.DeliveryOptions) {\r\n return undefined;\r\n }\r\n\r\n if (props.retailMulitplePickupFeatureState && props.channelDeliveryOptionConfig) {\r\n if (!matchDeliveryOptions(props.deliveryOptions.DeliveryOptions, props.channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\r\n return undefined;\r\n }\r\n } else if (\r\n !props.pickupDeliveryModeCode ||\r\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)\r\n ) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n callbacks: {\r\n toggleBopis: _toggleBOPIS\r\n },\r\n defaultComponent: _renderShippingMethod(\r\n props.cartline,\r\n props.shipitText,\r\n props.pickUpInStoreText,\r\n props.changeStoreText,\r\n props.orgUnitLocations\r\n ),\r\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\r\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\r\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\r\n ContainerProps: {\r\n className: 'msc-cart-line__bopis-container'\r\n }\r\n };\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n AddToOrderTemplateComponent,\r\n AddToWishlistComponent,\r\n CartLineItemComponent,\r\n IAddToOrderTemplateDialogResources,\r\n ICartlineResourceString,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources,\r\n IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport MsDyn365, {\r\n IAny,\r\n ICoreContext,\r\n IGeneric,\r\n IGridSettings,\r\n IImageSettings,\r\n ITelemetry,\r\n TelemetryEvent,\r\n isChannelTypeB2B\r\n} from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n AsyncResult,\r\n CartLine,\r\n CartLineValidationResultsByLineId,\r\n ChannelDeliveryOptionConfiguration,\r\n CommerceList,\r\n Customer,\r\n OrgUnitLocation,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport {\r\n ArrayExtensions,\r\n getInvoiceDetailsPageUrlSync,\r\n getProductUrlSync,\r\n IProductInventoryInformation,\r\n ObjectExtensions,\r\n OrderTemplate\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '@msdyn365-commerce-modules/cart';\r\nimport { IPickUpInStoreViewProps, PickUpInStore } from './citta-cart-pick-up-in-store';\r\n\r\nexport interface ICartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartlinesErrors: CartLineValidationResultsByLineId;\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: IProductInventoryInformation[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n catalogs?: ProductCatalog[];\r\n retailMulitplePickupFeatureState?: boolean;\r\n\r\n /* GridSettings for the product image in cartline */\r\n gridSettings: IGridSettings;\r\n\r\n /* ImageSettings for the product image in cartline */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext>;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n shipItText: string;\r\n pickitUpText: string;\r\n changeStoreText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n isStockCheckEnabled: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n defaultWishlistName: string;\r\n maxCartlineQuantity: number;\r\n includeErrors?: boolean;\r\n showShippingChargesForLineItems?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n hasInvoiceLine?: boolean;\r\n storeSelectorModuleId?: string;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\r\n\r\n addToOrderTemplateButtonText: string;\r\n addToOrderTemplateButtonTooltip: string;\r\n addToOrderTemplateMessage: string;\r\n addItemToOrderTemplateError: string;\r\n orderTemplates: OrderTemplate[] | undefined;\r\n customerInformation: Customer | undefined;\r\n shouldIgnoreWarehouse: boolean | undefined;\r\n productAvailability?: AsyncResult;\r\n productPickUpOptions?: ProductDeliveryOptions[] | undefined;\r\n hsoConfig?: number;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport interface ICartlinesViewProps {\r\n cartline: React.ReactNode;\r\n pickUpInStore?: IPickUpInStoreViewProps;\r\n remove: React.ReactNode;\r\n addToWishlist: React.ReactNode | undefined;\r\n addToOrderTemplate: React.ReactNode | undefined;\r\n\r\n error?: string;\r\n cartlineId?: string;\r\n hasError?: boolean;\r\n data?: {\r\n product?: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getCartItemAvailableQuantity = (\r\n isStockCheckEnabled: boolean,\r\n productAvailability: IProductInventoryInformation | undefined\r\n): number => {\r\n if (\r\n !isStockCheckEnabled ||\r\n !productAvailability ||\r\n !productAvailability.ProductAvailableQuantity ||\r\n !productAvailability.IsProductAvailable ||\r\n !productAvailability.ProductAvailableQuantity.AvailableQuantity\r\n ) {\r\n return 0;\r\n }\r\n\r\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n maxQuantityByConfig: number,\r\n isStockCheckEnabled: boolean,\r\n availableQuantityInStock: number,\r\n isQuantityLimitsFeatureEnabled: boolean,\r\n maxByQuantityLimitsFeature: number\r\n) => {\r\n if (isQuantityLimitsFeatureEnabled) {\r\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\r\n\r\n // If max by feature in not defined when feature is on then we suggest that there no max by feature\r\n // and consider available qty if stock check enabled and max from config in site settings.\r\n if (!maxByQuantityLimitsFeature) {\r\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\r\n }\r\n\r\n return isStockCheckEnabled\r\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\r\n ? maxByQuantityLimitsFeatureResult\r\n : availableQuantityInStock\r\n : maxByQuantityLimitsFeatureResult;\r\n }\r\n if (isStockCheckEnabled) {\r\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\r\n }\r\n return maxQuantityByConfig;\r\n};\r\n\r\nconst _getErrorMessage = (\r\n availableQuantityInStock: number,\r\n currentQuantity: number,\r\n props: ICartLineItemsProps,\r\n shouldSkipStockCheck: boolean,\r\n cartLine: CartLine,\r\n lineId: string | undefined\r\n): string | undefined => {\r\n const finalErrorMessages: string[] = [];\r\n\r\n const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\r\n if (isLoadingDeliveryOptions) {\r\n return undefined;\r\n }\r\n\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\r\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n if (props.shouldIgnoreWarehouse) {\r\n return productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId;\r\n }\r\n return (\r\n productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId &&\r\n productAvailability.InventLocationId === cartLine.WarehouseId\r\n );\r\n });\r\n if (foundProductAvailability === undefined) {\r\n return undefined;\r\n }\r\n }\r\n\r\n if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\r\n if (availableQuantityInStock <= 0) {\r\n finalErrorMessages.push(props.outOfStockText);\r\n } else if (availableQuantityInStock < currentQuantity) {\r\n if (availableQuantityInStock === 1) {\r\n finalErrorMessages.push(props.outOfRangeOneText);\r\n } else {\r\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\r\n }\r\n }\r\n }\r\n\r\n // Server-side validation\r\n const checkForErrors = props.cartlinesErrors.ValidationResultsPairs;\r\n const errorsFoundByLineId = checkForErrors?.filter(index => index.LineId === lineId);\r\n if (errorsFoundByLineId !== undefined) {\r\n for (const i of errorsFoundByLineId) {\r\n if (ArrayExtensions.hasElements(i.ValidationFailures)) {\r\n i.ValidationFailures.forEach(validation => {\r\n if (validation.ErrorContext !== undefined) {\r\n finalErrorMessages.push(validation.ErrorContext);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (ArrayExtensions.hasElements(finalErrorMessages)) {\r\n return finalErrorMessages.join(' ');\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\n/**\r\n * On Remove Click functionality.\r\n * @param removeItemClickHandler -Remove item click function.\r\n * @param cartline -CartLine.\r\n * @returns Remove change value.\r\n */\r\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\r\n removeItemClickHandler(cartline);\r\n};\r\n\r\n// eslint-disable-next-line complexity -- Auto-suppressed.\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct | undefined,\r\n props: ICartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: IProductInventoryInformation,\r\n productPickUpOptions?: ProductDeliveryOptions\r\n): ICartlinesViewProps => {\r\n const {\r\n imageSettings,\r\n gridSettings,\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n removeButtonText,\r\n removeItemClickHandler,\r\n moveToWishlistSuccessHandler,\r\n addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateDialogResources,\r\n createOrderTemplateDialogResources,\r\n itemAddedToOrderTemplateDialogResources,\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n addToWishlistButtonText,\r\n removeFromWishlistButtonText,\r\n orderTemplates,\r\n customerInformation,\r\n wishlists,\r\n defaultWishlistName,\r\n storeSelectorModuleId,\r\n hsoConfig\r\n } = props;\r\n\r\n const isAuthenticated = context.request.user.isAuthenticated;\r\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\r\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, foundProductAvailability);\r\n\r\n const maxQuantity =\r\n product &&\r\n _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n availableQuantityInStock,\r\n props.isQuantityLimitsFeatureEnabled,\r\n product?.Behavior?.MaximumQuantity || 0\r\n );\r\n\r\n // Skip stock check if the cart line is a service item or an invoice line\r\n //const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\r\n let shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\r\n \r\n if (hsoConfig) {\r\n const estimatedDateProperty = availableQuantityInStock\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'EstimatedDate'));\r\n\r\n const estimatedDateValue = estimatedDateProperty && estimatedDateProperty.Value && estimatedDateProperty.Value.StringValue;\r\n\r\n let estimatedDate = \"\";\r\n if (estimatedDateValue == undefined) {\r\n estimatedDate = \"\";\r\n } else {\r\n estimatedDate = estimatedDateValue.toString();\r\n }\r\n\r\n const StockThresholdprop = availableQuantityInStock\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'StockThreshold'));\r\n const StockThresholdpropval = StockThresholdprop && StockThresholdprop.Value && StockThresholdprop.Value.IntegerValue;\r\n let StockThreshold = 0;\r\n if (StockThresholdpropval != undefined) {\r\n StockThreshold = StockThresholdpropval;\r\n }\r\n\r\n let onhand = 0;\r\n if (availableQuantityInStock != undefined) {\r\n onhand = Number(availableQuantityInStock);\r\n }\r\n\r\n if (StockThreshold == 0) {\r\n shouldSkipStockCheck = true;\r\n } else {\r\n if (onhand >= StockThreshold) {\r\n shouldSkipStockCheck = true;\r\n } else {\r\n if (estimatedDate != \"\") {\r\n shouldSkipStockCheck = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\r\n ? undefined\r\n : _getErrorMessage(availableQuantityInStock, cartline.Quantity!, props, shouldSkipStockCheck, cartline, cartline.LineId);\r\n\r\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\r\n\r\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n\r\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\r\n const inventoryCode = foundProductAvailability\r\n ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\r\n : undefined;\r\n const productDimension = 4;\r\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\r\n const isCustomPriceSelected =\r\n product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value ===\r\n 'Custom';\r\n\r\n let productUrl: string | undefined;\r\n if (product) {\r\n productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\r\n\r\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\r\n const fullUrl = new URL(productUrl, window.location.href);\r\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\r\n productUrl = fullUrl.href;\r\n }\r\n } else {\r\n productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\r\n }\r\n\r\n return {\r\n data: {\r\n product,\r\n cartline\r\n },\r\n cartlineId: cartline.LineId,\r\n error: errorMessage,\r\n hasError: !shouldSkipStockCheck && props.isStockCheckEnabled ? cartline.Quantity! > (maxQuantity ?? 0) : false,\r\n cartline: (\r\n \r\n ),\r\n pickUpInStore: product\r\n ? PickUpInStore({\r\n storeSelectorModuleId,\r\n cartState: props.cartState,\r\n cartline,\r\n product,\r\n shipitText: props.shipItText,\r\n pickUpInStoreText: props.pickitUpText,\r\n changeStoreText: props.changeStoreText,\r\n storeSelectorStateManager: props.storeSelectorStateManager,\r\n orgUnitLocations: props.orgUnitLocations,\r\n deliveryOptions: productPickUpOptions,\r\n pickupDeliveryModeCode:\r\n cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\r\n retailMulitplePickupFeatureState: props.retailMulitplePickupFeatureState,\r\n channelDeliveryOptionConfig: props.channelDeliveryOptionConfig,\r\n locationChangedHandler: props.locationChangedHandler\r\n })\r\n : undefined,\r\n remove: (\r\n \r\n ),\r\n addToWishlist:\r\n isAuthenticated && product && !isCustomPriceSelected ? (\r\n \r\n ) : (\r\n undefined\r\n ),\r\n addToOrderTemplate:\r\n isAuthenticated && orderTemplates && product ? (\r\n \r\n ) : (\r\n undefined\r\n )\r\n };\r\n};\r\n\r\nexport const assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[] | null => {\r\n const reactNodes: ICartlinesViewProps[] = [];\r\n\r\n cartlines.map((cartline, index) => {\r\n let product;\r\n if (props.isQuantityLimitsFeatureEnabled) {\r\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\r\n // to check productId and WarehouseId for identification.\r\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\r\n } else {\r\n product = getProductByProductId(cartline.ProductId, products);\r\n }\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\r\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n if (props.shouldIgnoreWarehouse) {\r\n return productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId;\r\n }\r\n return (\r\n productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\r\n productAvailability.InventLocationId?.toUpperCase() === cartline.WarehouseId?.toUpperCase()\r\n );\r\n });\r\n }\r\n\r\n let productPickUpOptions;\r\n if (props.productPickUpOptions !== undefined && ArrayExtensions.hasElements(props.productPickUpOptions)) {\r\n productPickUpOptions = props.productPickUpOptions.find(deliveryOption => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, productPickUpOptions));\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component.\r\n * @param props\r\n */\r\nexport const CartLineItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return assembleCartlines(cartlines, products, props);\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport groupBy from 'lodash/groupBy';\r\n\r\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './citta-cart-line-items';\r\n\r\nconst _assembleGroupCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[][] | null => {\r\n const reactNodes: ICartlinesViewProps[][] = [];\r\n if (!products || products.length === 0) {\r\n props.context.telemetry.error('Products content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\r\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\r\n const groupDelivery = getGroupByDelivery(cartlines);\r\n const cartLinesGroup: CartLine[] = [];\r\n\r\n // 1) Group by store and pick up mode\r\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\r\n // @ts-expect-error\r\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\r\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\r\n });\r\n\r\n // 2) Create cartlines group\r\n Object.keys(cartLinesGroup).forEach(key => {\r\n const cartLines = cartLinesGroup[key];\r\n Object.keys(cartLines).forEach(index => {\r\n const cartLine = cartLines[index];\r\n const carLineViewProps = assembleCartlines(cartLine, products, props);\r\n if (carLineViewProps !== null) {\r\n reactNodes.push(carLineViewProps);\r\n }\r\n });\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\nconst _assembleGroupInvoiceCartlines = (\r\n cartLines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[][] | null => {\r\n const reactNodes: ICartlinesViewProps[][] = [];\r\n if (cartLines && cartLines.length > 0) {\r\n // Create invoice cartLines group\r\n const carLineViewProps = assembleCartlines(cartLines, products, props);\r\n if (carLineViewProps !== null) {\r\n reactNodes.push(carLineViewProps);\r\n }\r\n }\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLine Group component.\r\n * @param props\r\n */\r\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines, hasInvoiceLine } = props;\r\n return hasInvoiceLine\r\n ? _assembleGroupInvoiceCartlines(cartlines, products, props)\r\n : _assembleGroupCartlines(cartlines, products, props);\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n/**\r\n * IPromotionData entity interface.\r\n */\r\nexport interface IPromotionData {\r\n promotionOptions?: CartPromotionLine[];\r\n}\r\n\r\n/**\r\n * Calls the Retail API and returns a promotion data.\r\n * @param ctx\r\n */\r\nexport async function getPromotionData(ctx: IActionContext): Promise {\r\n const promotionData: IPromotionData = {};\r\n\r\n await getPromotionOptionsForCartLineItems(new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\r\n .then(promotionOptions => {\r\n if (promotionOptions) {\r\n promotionData.promotionOptions = promotionOptions;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n return {};\r\n });\r\n\r\n return promotionData;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n IAddToOrderTemplateDialogResources,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources,\r\n ILinesAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources,\r\n IWishlistActionSuccessResult,\r\n PromoCodeComponent,\r\n SaveCartToOrderTemplateComponent\r\n} from '@msdyn365-commerce/components';\r\nimport MsDyn365, { getUrlSync, IImageSettings, isChannelTypeB2B, isOboRequest } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResultsByLineId, LineValidationResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductDeliveryOptions, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\r\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport {\r\n ActiveCartProductsInput,\r\n ArrayExtensions,\r\n getActiveCartProductsAction,\r\n ICartLineInventoryValidationResult,\r\n ObjectExtensions,\r\n ProductPickUpOptionsForCartLineItems\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Alert,\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n INodeProps,\r\n IPayLoad,\r\n ITelemetryContent,\r\n TelemetryConstant,\r\n Waiting,\r\n updateMaxQuantityForCartLineItem,\r\n urlCheck\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport { getPickUpOptionsForCartLineItems } from './actions/get-pickup-options-for-citta-cartlines';\r\n\r\nimport { ICittaCartData } from './citta-cart.data';\r\nimport { ICittaCartProps, ICittaCartResources } from './citta-cart.props.autogenerated';\r\nimport { CartLineGroupItems } from './components/citta-cart-line-groups';\r\nimport { CartLineItems, ICartlinesViewProps } from './components/citta-cart-line-items';\r\nimport { cartPromotions, ICartLineItemViewProps } from './components/citta-cart-line-items-promotion';\r\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-citta-cart';\r\n\r\nimport { validateCartLinesInventory } from './components/hso-validate-cartlines-inventory';\r\n/**\r\n * Cart view props interface.\r\n */\r\nexport interface ICartViewProps extends ICittaCartProps {\r\n className: string;\r\n title?: React.ReactNode;\r\n CartlinesWrapper: INodeProps;\r\n cartlines?: ICartlinesViewProps[];\r\n cartLinesGroup?: ICartlinesViewProps[][];\r\n cart: ICartState | undefined;\r\n orderSummaryHeading: React.ReactNode;\r\n orderSummaryLineitems?: IOrderSummaryLines;\r\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\r\n OrderSummaryWrapper: INodeProps;\r\n OrderSummaryItems: INodeProps;\r\n OrderSummaryErrors?: IOrderSummaryErrors;\r\n checkoutAsGuestButton: React.ReactNode;\r\n checkoutAsSignInUserButton: React.ReactNode;\r\n storeSelector?: React.ReactNode;\r\n expressCheckoutButton?: React.ReactNode[];\r\n ExpressCheckoutSectionWrapper: INodeProps;\r\n backToShoppingButton: React.ReactNode;\r\n waitingComponent: React.ReactNode;\r\n promotionOptions?: ICartLineItemViewProps;\r\n promoCode: React.ReactNode;\r\n cartLoadingStatus: string;\r\n cartDataResult: boolean;\r\n multiplePickUpEnabled?: boolean;\r\n createTemplateFromCartButton: React.ReactNode;\r\n telemetryContent?: ITelemetryContent;\r\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n}\r\n\r\n/**\r\n * Order summary errors interface.\r\n */\r\nexport interface IOrderSummaryErrors {\r\n Wrapper: INodeProps;\r\n header: React.ReactNode;\r\n errors: React.ReactNode[];\r\n}\r\n\r\n/**\r\n * Cart component state interface.\r\n */\r\ninterface ICartComponentState {\r\n showPromotionDialog: boolean;\r\n cartlinesErrors: CartLineValidationResultsByLineId;\r\n promotionData: IPromotionData;\r\n isCartValid: boolean;\r\n productPickUpOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\n/**\r\n * Cart component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass Cart extends React.Component> {\r\n public state: ICartComponentState;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n private _isMounted: boolean = false;\r\n\r\n private readonly promotionPopupId: string = 'cart-promotion-popup';\r\n\r\n public constructor(props: ICittaCartProps) {\r\n super(props);\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\r\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\r\n\r\n this.state = {\r\n showPromotionDialog: false,\r\n promotionData: {},\r\n isCartValid: true,\r\n productPickUpOptions: undefined,\r\n cartlinesErrors: {}\r\n };\r\n }\r\n\r\n /**\r\n * Component did mount function.\r\n */\r\n public async componentDidMount(): Promise {\r\n this._isMounted = true;\r\n const {\r\n config,\r\n context: { actionContext }\r\n } = this.props;\r\n\r\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n await this.validateCart();\r\n }\r\n\r\n if (config.showAvailablePromotions) {\r\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\r\n this.setState({ promotionData: await getPromotionData(actionContext) });\r\n }\r\n\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n if (this._isMounted) {\r\n this.setState({ promotionData: await getPromotionData(actionContext) });\r\n }\r\n }\r\n );\r\n }\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n if (this._isMounted) {\r\n const input = new ProductPickUpOptionsForCartLineItems(actionContext.requestContext.apiSettings);\r\n this.setState({ productPickUpOptions: await getPickUpOptionsForCartLineItems(input, actionContext) });\r\n }\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Component will unmount function.\r\n */\r\n public componentWillUnmount(): void {\r\n this._isMounted = false;\r\n }\r\n\r\n /**\r\n * Should component update function.\r\n * @param nextProps - Next props.\r\n * @param nextState - Next state.\r\n * @returns True if component should update, false otherwise.\r\n */\r\n public shouldComponentUpdate(nextProps: ICittaCartProps, nextState: ICartComponentState): boolean {\r\n if (this.state === nextState && this.props.data === nextProps.data) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /* eslint-disable complexity -- Disabling complexity for render method */\r\n public render(): JSX.Element | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n products: { result: products }\r\n },\r\n context: {\r\n request: {\r\n user: { isAuthenticated, signInUrl }\r\n }\r\n },\r\n resources\r\n } = this.props;\r\n\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\r\n const checkoutURL = this.getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\r\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\r\n const cartLines = this._getCartLines();\r\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\r\n\r\n \r\n const HSOConfigprop = this.props.data.channelConfiguration.result\r\n && this.props.data.channelConfiguration.result.ExtensionProperties\r\n && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n if (HSOConfig == undefined) {\r\n HSOConfig = 0;\r\n }\r\n\r\n const validInventoryAcrossCartLines = validateCartLinesInventory(\r\n cart?.cart.CartLines ?? [],\r\n this.props.data.productAvailabilites.result ?? [],\r\n this.props.context.actionContext,\r\n products ?? [],\r\n emailDeliveryModeCode,\r\n HSOConfig\r\n );\r\n\r\n let hasError =\r\n !validInventoryAcrossCartLines?.isValid ||\r\n this._isCheckoutBlockedDueToUnavailableFunds() ||\r\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\r\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\r\n\r\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n const cartLinesGroup = cart?.hasInvoiceLine || multiplePickUpEnabled ? this.getCartLinesGroup() : null;\r\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\r\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\r\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\r\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n\r\n // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\r\n if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\r\n if (multiplePickUpEnabled && cartLinesGroup !== null) {\r\n for (const cartLineGroup of cartLinesGroup) {\r\n this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\r\n }\r\n }\r\n\r\n this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\r\n }\r\n\r\n const viewProps = {\r\n ...this.props,\r\n className: classnames('ms-cart'),\r\n title:

{resources.cartTitle}

,\r\n cart: this.props.data.cart.result,\r\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\r\n OrderSummaryWrapper: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary-wrapper' : 'msc-order-summary-wrapper' },\r\n OrderSummaryItems: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary__items' : 'msc-order-summary__items' },\r\n cartlines: cartLines,\r\n cartLinesGroup,\r\n promoCode: this._getPromoCode(),\r\n promotionOptions: this._getPromotions(),\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n telemetry: this.props.telemetry,\r\n id: this.props.id,\r\n multiplePickUpEnabled,\r\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\r\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\r\n cart?.hasInvoiceLine ? (\r\n

{resources.invoiceSummaryTitle}

\r\n ) : (\r\n

{resources.orderSummaryTitle}

\r\n )\r\n ) : null,\r\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\r\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\r\n checkoutAsSignInUserButton: !isCartEmpty ? (\r\n \r\n {resources.checkoutButtonTitle}\r\n \r\n ) : null,\r\n checkoutAsGuestButton:\r\n !isCartEmpty && !isAuthenticated && this.props.config.showGuestCheckoutButton ? (\r\n \r\n {resources.guestCheckoutButtonTitle}\r\n \r\n ) : null,\r\n expressCheckoutButton: !isCartEmpty ? this.props.slots.paymentExpress : null,\r\n ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\r\n backToShoppingButton: (\r\n \r\n {resources.backToShoppingButtonTitle}\r\n \r\n ),\r\n createTemplateFromCartButton:\r\n this._displayAddCartToTemplate() && products ? (\r\n \r\n ) : null,\r\n checkoutBlockedDueToUnavailableFunds: this._isCheckoutBlockedDueToUnavailableFunds() ? (\r\n \r\n \r\n \r\n {resources.checkoutBlockedDueToUnavailableFundsTitle}\r\n {resources.checkoutBlockedDueToUnavailableFundsMessage}\r\n \r\n \r\n ) : null,\r\n storeSelector:\r\n this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\r\n removeItemClickHandler: this.removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\r\n waitingComponent: ,\r\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\r\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\r\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\r\n telemetryContent: this.telemetryContent\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n /* eslint-enable complexity -- Disabling complexity for render method */\r\n\r\n /**\r\n * Promotion click event handler.\r\n * @param event - The mouse event.\r\n */\r\n private readonly promotionLinkClick = (event: React.MouseEvent) => {\r\n this.setState({\r\n showPromotionDialog: !this.state.showPromotionDialog\r\n });\r\n };\r\n\r\n /**\r\n * Promotion close button click.\r\n */\r\n private readonly promotionCloseButtonclick = () => {\r\n this._hidePromotionDialog();\r\n };\r\n\r\n /**\r\n * Hide promotion dialog.\r\n */\r\n private _hidePromotionDialog(): void {\r\n this.setState({\r\n showPromotionDialog: false\r\n });\r\n }\r\n\r\n /**\r\n * Display add to cart template.\r\n * @returns True if should display, false otherwise.\r\n */\r\n private _displayAddCartToTemplate(): boolean {\r\n const cart = this.props.data.cart?.result;\r\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\r\n return false;\r\n }\r\n\r\n if (\r\n isChannelTypeB2B(this.props.context.actionContext.requestContext) &&\r\n this.props.data.orderTemplates.result &&\r\n ArrayExtensions.hasElements(cart.cart?.CartLines) &&\r\n this.props.data.customerInformation.result\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Get promotions.\r\n * @returns React node with the promotions.\r\n */\r\n private _getPromotions(): React.ReactNode {\r\n return (\r\n this.props.config.showAvailablePromotions &&\r\n cartPromotions({\r\n id: this.promotionPopupId,\r\n showPromotionPopup: this.state.showPromotionDialog,\r\n onSeeAllClick: this.promotionLinkClick,\r\n onCloseButtonClick: this.promotionCloseButtonclick,\r\n promotions: this.state.promotionData.promotionOptions,\r\n resources: {\r\n promotionStringHeading: this.props.resources.promotionStringHeading,\r\n promotionLinkText: this.props.resources.promotionLinkText,\r\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\r\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\r\n }\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Add error message in cart line in case the quantity exceeds the current inventory.\r\n * @param cartLines - The cart lines.\r\n * @param cartLineInventoryValidationResult - The cart line inventory result.\r\n */\r\n private _updateCartLineErrorForInvalidInventory(\r\n cartLines: ICartlinesViewProps[] | null,\r\n cartLineInventoryValidationResult: ICartLineInventoryValidationResult\r\n ) {\r\n const { resources } = this.props;\r\n\r\n if (\r\n ArrayExtensions.hasElements(cartLines) &&\r\n !cartLineInventoryValidationResult.isValid &&\r\n ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)\r\n ) {\r\n for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\r\n const cartLine = cartLines?.find(element => element.data?.cartline.ProductId === productIdWithError);\r\n if (cartLine) {\r\n cartLine.error = resources.outOfStockErrorMessage;\r\n cartLine.hasError = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get order summary errors.\r\n * @param cartLines - The cart lines.\r\n * @returns Order summary errors.\r\n */\r\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\r\n const allErrors =\r\n (cartLines &&\r\n cartLines\r\n .map(cartline => {\r\n // Check if the product is service or not by product type\r\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n if (!isServiceItem && cartline.error) {\r\n const fullError =\r\n cartline.data && cartline.data.product?.Name\r\n ? `${cartline.data.product.Name}: ${cartline.error}`\r\n : cartline.error;\r\n\r\n return (\r\n
\r\n {fullError}\r\n
\r\n );\r\n }\r\n\r\n return null;\r\n })\r\n .filter((line): line is JSX.Element => !!line)) ||\r\n [];\r\n\r\n return {\r\n Wrapper: {\r\n tag: Alert,\r\n className: 'msc-alert',\r\n isOpen: allErrors.length > 0,\r\n color: 'danger',\r\n assertive: true,\r\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\r\n },\r\n header: (\r\n \r\n ),\r\n errors: allErrors\r\n };\r\n }\r\n\r\n private _isCheckoutBlockedDueToUnavailableFunds(): boolean {\r\n if (isOboRequest(this.props.context.request)) {\r\n const customerInfo = this.props.data.customerInformation && this.props.data.customerInformation?.result;\r\n return !!customerInfo && (!customerInfo.AllowOnAccountPayment || customerInfo.CreditLimit === 0);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets invoice summary line items.\r\n * @returns Invoice summary lines.\r\n */\r\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\r\n const {\r\n data: {\r\n cart: { result: cart }\r\n },\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n return cart?.hasInvoiceLine\r\n ? InvoiceSummary({\r\n orderTotalLabel: resources.totalAmountLabel,\r\n invoiceLabel: resources.invoiceLabel,\r\n cart: cart.cart,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n telemetry,\r\n id: this.props.id\r\n })\r\n : undefined;\r\n }\r\n\r\n /**\r\n * Gets order summary line items.\r\n * @returns Order summary lines.\r\n */\r\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n channelDeliveryOptionConfig\r\n },\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n const featureState = this.props?.data?.featureState;\r\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\r\n ?.IsEnabled;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n const isShowOrHideTaxEnabled = this.props.context.request.app.config?.isEnableShowOrHideSalesTaxECommerceEnabled === true;\r\n\r\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine\r\n ? OrderSummary({\r\n cart: cart!.cart,\r\n subTotalLabel: resources.itemsWithCountLabel,\r\n shippingLabel: resources.estimatedShippingLabel,\r\n otherChargeLabel: resources.otherCharges,\r\n taxLabel: resources.estimatedTaxLabel,\r\n orderTotalLabel: resources.orderTotal,\r\n totalDiscountsLabel: resources.totalDiscountsLabel,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n toBeCalculatedText: resources.yetToBeCalculatedText,\r\n freeText: resources.priceFree,\r\n channelConfiguration,\r\n retailMultiplePickUpOptionEnabled,\r\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\r\n telemetry,\r\n isTaxIncludedInPrice: cart!.cart.IsTaxIncludedInPrice,\r\n isShowTaxBreakup: isShowOrHideTaxEnabled\r\n })\r\n : undefined;\r\n }\r\n\r\n /**\r\n * Gets promo code.\r\n * @returns React node with the promo code.\r\n */\r\n private _getPromoCode(): React.ReactNode {\r\n const {\r\n data: {\r\n cart: { result: cart }\r\n },\r\n resources\r\n } = this.props;\r\n\r\n return (\r\n cart && (\r\n \r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Generate add to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns IAddToOrderTemplateDialogResources.\r\n */\r\n private _generateAddToOrderTemplateDialogResources(resources: ICittaCartResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n }\r\n\r\n /**\r\n * Generate item added to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns IItemAddedToOrderTemplateDialogResources.\r\n */\r\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICittaCartResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.freePriceText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n }\r\n\r\n /**\r\n * Generate lines added to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns ILinesAddedToOrderTemplateDialogResources.\r\n */\r\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICittaCartResources): ILinesAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\r\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\r\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\r\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\r\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\r\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\r\n };\r\n }\r\n\r\n /**\r\n * Generate duplicate items when adding to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\r\n */\r\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources: ICittaCartResources\r\n ): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n }\r\n\r\n /**\r\n * Generate order template name dialog resources.\r\n * @param resources - The resources.\r\n * @returns IOrderTemplateNameDialogResources.\r\n */\r\n private _generateOrderTemplateNameDialogResources(resources: ICittaCartResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n }\r\n\r\n /**\r\n * Gets the cart lines view props.\r\n * @returns ICartlinesViewProps [].\r\n */\r\n private _getCartLines(): ICartlinesViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this.getImageSettings(config.imageSettings);\r\n\r\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n\r\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n\r\n const HSOConfigprop = this.props.data.channelConfiguration.result\r\n && this.props.data.channelConfiguration.result.ExtensionProperties\r\n && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n if (HSOConfig == undefined) {\r\n HSOConfig = 0;\r\n }\r\n\r\n return ArrayExtensions.hasElements(cart?.cart.CartLines)\r\n ? CartLineItems({\r\n cartlines: cart!.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n catalogs: this.props.data.catalogs?.result,\r\n imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\r\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\r\n resources: {\r\n sizeString: \"Size:\" || resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n amountString: resources.productDimensionTypeAmount,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges,\r\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\r\n priceEditorResources: {\r\n ...resources\r\n }\r\n },\r\n telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this.removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\r\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\r\n wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources\r\n ),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates,\r\n customerInformation,\r\n productAvailability: this.props.data.productAvailabilites,\r\n hsoConfig: HSOConfig\r\n })\r\n : null;\r\n }\r\n\r\n /**\r\n * Gets the checkout URL.\r\n * @param isAuthenticated - Is authenticated flag.\r\n * @param guestCheckoutUrl - Guest checkout URL.\r\n * @param signInUrl -The sign in URL.\r\n * @returns The checkout URL.\r\n */\r\n private getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\r\n if (isAuthenticated) {\r\n return guestCheckoutUrl;\r\n }\r\n\r\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\r\n let returnURL = guestCheckoutUrl;\r\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\r\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\r\n }\r\n\r\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\r\n }\r\n\r\n /**\r\n * Gets the image settings.\r\n * @param imageSettings - Image settings.\r\n * @returns IImageSettings.\r\n */\r\n private readonly getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return (\r\n imageSettings || {\r\n viewports: {\r\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\r\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n }\r\n );\r\n };\r\n\r\n /**\r\n * Remove item from citta-cart handler.\r\n * @param cartlineToRemove - The cart line to remove.\r\n */\r\n private readonly removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result\r\n .removeCartLines(input)\r\n .then(() => {\r\n this.validateCart().catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n })\r\n .catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Move to wish list handler.\r\n * @param result - The wish list action success result.\r\n * @param cartline - The cart line.\r\n */\r\n private readonly moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this.removeItemFromCartHandler(cartline);\r\n }\r\n };\r\n\r\n /**\r\n * Updates the cart line quantity.\r\n * @param cartlineToUpdate - The cart line.\r\n * @param quantity - The quantity.\r\n * @param lineIndex - The line index.\r\n * @returns True if the cart line was updated, false otherwise.\r\n */\r\n private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\r\n cartLineQuantityUpdatedAsync(\r\n this.isQuantityLimitsFeatureEnabled,\r\n this.props.data.cart.result,\r\n this.props.telemetry,\r\n this.props.data.products.result,\r\n cartlineToUpdate,\r\n quantity\r\n )\r\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\r\n if (cartActionResult?.status === 'SUCCESS') {\r\n this.validateCart().catch(error => {\r\n this.props.telemetry.warning((error as Error).message);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n\r\n return true;\r\n }\r\n\r\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\r\n // Show update line error message.\r\n const lineUpdateFailure: LineValidationResult = {\r\n LineId: ObjectExtensions.isNullOrUndefined(cartlineToUpdate.LineId) ? '0' : cartlineToUpdate.LineId,\r\n ValidationFailures: [\r\n {\r\n ErrorContext: ArrayExtensions.hasElements(cartActionResult.validationResults)\r\n ? cartActionResult.validationResults[0].ErrorContext\r\n : '',\r\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\r\n }\r\n ]\r\n };\r\n\r\n this.setState({\r\n cartlinesErrors: { ValidationResultsPairs: [lineUpdateFailure] }\r\n });\r\n }\r\n\r\n return false;\r\n })\r\n .catch(() => {\r\n return false;\r\n });\r\n\r\n return false;\r\n };\r\n\r\n /**\r\n * Fulfillment store id is updated.\r\n */\r\n private readonly fulfillmentStoreIdUpdated = () => {\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n // Refresh products (in props.data) based on latest cart.\r\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\r\n .then(async () => this.validateCart())\r\n .catch((error: Error) => {\r\n this.props.telemetry.warning(error.message);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Validates cart.\r\n * @returns Void promise.\r\n */\r\n private async validateCart(): Promise {\r\n const {\r\n data: { cart },\r\n telemetry,\r\n context\r\n } = this.props;\r\n\r\n const validationResults: CartLineValidationResultsByLineId | undefined = await validateCartAsync(\r\n // this.isQuantityLimitsFeatureEnabled, //version upgrade commented the line as this is not part of validateCartAsync method\r\n cart,\r\n telemetry,\r\n context,\r\n true\r\n );\r\n\r\n const HSOConfigprop = this.props.data.channelConfiguration.result\r\n && this.props.data.channelConfiguration.result.ExtensionProperties\r\n && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n if (HSOConfig == undefined) {\r\n HSOConfig = 0;\r\n }\r\n if (HSOConfig) {\r\n this.setState({ isCartValid: true });\r\n }\r\n\r\n if (validationResults) {\r\n const isValid = !ArrayExtensions.hasElements(validationResults.ValidationResultsPairs);\r\n this.setState({\r\n cartlinesErrors: validationResults,\r\n isCartValid: isValid\r\n });\r\n } else {\r\n this.setState({ isCartValid: true });\r\n }\r\n\r\n return AsyncResult.resolve();\r\n }\r\n\r\n /**\r\n * Get order quantity limit feature flag.\r\n * @returns True if flag is enabled, false otherwise.\r\n */\r\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\r\n }\r\n\r\n try {\r\n const featureStatuses = await this.props.data.featureState;\r\n const isQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n if (!isQuantityLimitsFeatureEnabledInHq) {\r\n return false;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n try {\r\n const customerInfo = await this.props.data.customerInformation;\r\n return (\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n );\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get customer info');\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the cart lines group.\r\n * @returns ICartlinesViewProps [][].\r\n */\r\n private getCartLinesGroup(): ICartlinesViewProps[][] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this.getImageSettings(config.imageSettings);\r\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n\r\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n\r\n return this.props.data.products &&\r\n (cart?.hasInvoiceLine || this.props.data.products.result) &&\r\n cart &&\r\n cart.cart.CartLines &&\r\n cart.cart.CartLines.length > 0 &&\r\n this.props.data.channelDeliveryOptionConfig?.result\r\n ? CartLineGroupItems({\r\n cartlines: cart.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n catalogs: this.props.data.catalogs?.result,\r\n imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n hasInvoiceLine: cart?.hasInvoiceLine || false,\r\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n amountString: resources.productDimensionTypeAmount,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges,\r\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\r\n priceEditorResources: {\r\n ...resources\r\n }\r\n },\r\n telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this.removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\r\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\r\n wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources\r\n ),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates,\r\n customerInformation,\r\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\r\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\r\n productAvailability: this.props.data.productAvailabilites,\r\n productPickUpOptions: this.state.productPickUpOptions || this.props.data.cartLinesPickUpOptions?.result\r\n })\r\n : null;\r\n }\r\n}\r\n\r\nexport default Cart;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { CartLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nimport { ArrayExtensions, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\n/**\r\n * Cart line inventory validation result interface.\r\n */\r\nexport interface ICartLineInventoryValidationResult {\r\n /**\r\n * Define whether the cart lines inventory is valid across multiple cart lines.\r\n */\r\n readonly isValid: boolean;\r\n\r\n /**\r\n * Defines the list of product id with invalid inventory.\r\n */\r\n readonly productIdWithErrors: number[];\r\n}\r\n\r\n/**\r\n * Validates inventory across cart lines.\r\n * @param cartLines - The cart lines.\r\n * @param productAvailabilities - The product availability collection.\r\n * @param actionContext - The action context.\r\n * @param products - The products.\r\n * @param emailDeliveryModeCode - The emailDeliveryModeCode.\r\n * @returns True if all product quantity are available, false otherwise.\r\n */\r\n// eslint-disable-next-line complexity -- existing code.\r\nexport function validateCartLinesInventory(\r\n cartLines: CartLine[],\r\n productAvailabilities: IProductInventoryInformation[],\r\n actionContext: IActionContext,\r\n products?: SimpleProduct[],\r\n emailDeliveryModeCode?: string | undefined,\r\n hsoConfig?: number\r\n): ICartLineInventoryValidationResult {\r\n const cartLineMap = new Map();\r\n const defaultCartLineQuantity = 1;\r\n if (!actionContext.requestContext.app.config.enableStockCheck) {\r\n return {\r\n isValid: true,\r\n productIdWithErrors: []\r\n };\r\n }\r\n const productIdWithErrors = [];\r\n let isValid = true;\r\n\r\n if (ArrayExtensions.hasElements(cartLines) && ArrayExtensions.hasElements(productAvailabilities)) {\r\n // Consolidate products in different cart lines into single entry with the total cart quantity\r\n for (const cartLine of cartLines) {\r\n // Skip validation if is an invoice inline.\r\n if (cartLine.ProductId && !cartLine.IsInvoiceLine && !cartLine.IsGiftCardLine) {\r\n if (!cartLineMap.has(cartLine.ProductId)) {\r\n cartLineMap.set(cartLine.ProductId, cartLine.Quantity ?? defaultCartLineQuantity);\r\n } else {\r\n const cartLineTotal = cartLineMap.get(cartLine.ProductId) ?? 0;\r\n cartLineMap.delete(cartLine.ProductId);\r\n cartLineMap.set(cartLine.ProductId, cartLineTotal + (cartLine.Quantity ?? defaultCartLineQuantity));\r\n }\r\n }\r\n }\r\n\r\n // Hashing product availability object by product ID.\r\n const productAvailabilityMap = new Map();\r\n for (const productAvailability of productAvailabilities) {\r\n if (\r\n productAvailability.ProductAvailableQuantity.ProductId &&\r\n !productAvailabilityMap.has(productAvailability.ProductAvailableQuantity.ProductId)\r\n ) {\r\n productAvailabilityMap.set(productAvailability.ProductAvailableQuantity.ProductId, productAvailability);\r\n }\r\n }\r\n\r\n // Compare total quantity with the available quantity from the inventory API, also validate that the product is available.\r\n for (const productId of Array.from(cartLineMap.keys())) {\r\n const cartLineQty = cartLineMap.get(productId) ?? defaultCartLineQuantity;\r\n const productAvailability = productAvailabilityMap.get(productId);\r\n const availableQuantity = productAvailability?.ProductAvailableQuantity.AvailableQuantity ?? undefined;\r\n\r\n // If product is non-stocked or cartLine is electronic delivery, then no inventory check\r\n const cartLine = cartLines.find(line => line.ProductId === productId);\r\n const cartLineProduct = products?.find(product => product.RecordId === productId);\r\n let isStockedItem = true;\r\n if (cartLineProduct) {\r\n isStockedItem = !!cartLineProduct.Behavior?.IsStockedProduct;\r\n }\r\n const isEmailDelivery =\r\n cartLine?.DeliveryMode && cartLine.DeliveryMode !== '' ? cartLine.DeliveryMode === emailDeliveryModeCode : false;\r\n let shouldSkipInventoryCheck = !isStockedItem || isEmailDelivery;\r\n\r\n if (hsoConfig) {\r\n const estimatedDateProperty = availableQuantity\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'EstimatedDate'));\r\n\r\n const estimatedDateValue = estimatedDateProperty && estimatedDateProperty.Value && estimatedDateProperty.Value.StringValue;\r\n\r\n let estimatedDate = \"\";\r\n if (estimatedDateValue == undefined) {\r\n estimatedDate = \"\";\r\n } else {\r\n estimatedDate = estimatedDateValue.toString();\r\n }\r\n\r\n const StockThresholdprop = availableQuantity\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'StockThreshold'));\r\n const StockThresholdpropval = StockThresholdprop && StockThresholdprop.Value && StockThresholdprop.Value.IntegerValue;\r\n let StockThreshold = 0;\r\n if (StockThresholdpropval != undefined) {\r\n StockThreshold = StockThresholdpropval;\r\n }\r\n\r\n let onhand = 0;\r\n if (availableQuantity != undefined) {\r\n onhand = Number(availableQuantity);\r\n }\r\n\r\n if (StockThreshold == 0) {\r\n shouldSkipInventoryCheck = true;\r\n } else {\r\n if (onhand >= StockThreshold) {\r\n shouldSkipInventoryCheck = true;\r\n } else {\r\n if (estimatedDate != \"\") {\r\n shouldSkipInventoryCheck = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // If product is non-stocked or cartLine is electronic delivery, then no inventory check\r\n if (shouldSkipInventoryCheck) {\r\n continue;\r\n }\r\n if (!productAvailability?.IsProductAvailable || (availableQuantity && cartLineQty > availableQuantity)) {\r\n productIdWithErrors.push(productId);\r\n isValid = false;\r\n }\r\n }\r\n }\r\n return {\r\n isValid,\r\n productIdWithErrors\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ICartLineItemPromotion {\r\n id: string;\r\n showPromotionPopup: boolean;\r\n promotions: CartPromotionLine[] | undefined;\r\n resources: ICartLineItemPromotionResourceString;\r\n onSeeAllClick(event: React.MouseEvent): void;\r\n onCloseButtonClick(): void;\r\n}\r\n\r\nexport interface ICartLineItemViewProps {\r\n promotionMessageWrapper: INodeProps;\r\n promotionMessage: React.ReactNode;\r\n promotionSeeAllLink: React.ReactElement;\r\n promotionDialog: React.ReactNode;\r\n}\r\n\r\nexport interface ICartLineItemPromotionResourceString {\r\n promotionLinkText: string;\r\n promotionStringHeading: string;\r\n promotionPopupHeading: string;\r\n promotionCloseButtonAriaLabel: string;\r\n}\r\n\r\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\r\n const {\r\n id,\r\n showPromotionPopup,\r\n promotions,\r\n resources: { promotionLinkText, promotionPopupHeading },\r\n onCloseButtonClick,\r\n onSeeAllClick\r\n } = props;\r\n\r\n if (!ArrayExtensions.hasElements(promotions)) {\r\n return;\r\n }\r\n\r\n const titleId = `${id}_title`;\r\n const className = 'msc-cart__promotion';\r\n return {\r\n promotionMessageWrapper: {\r\n className: 'msc-cart__promotion'\r\n },\r\n promotionMessage: (\r\n <>\r\n \r\n {props.resources.promotionStringHeading}\r\n \r\n ),\r\n promotionSeeAllLink: (\r\n \r\n {` `}\r\n {promotionLinkText} {` `}\r\n \r\n ),\r\n promotionDialog: (\r\n \r\n \r\n
\r\n {promotionPopupHeading}\r\n
\r\n
\r\n \r\n
    \r\n {promotions.map(_promotion => {\r\n return (\r\n
  • \r\n {_promotion.Promotion?.OfferName} {` `}\r\n
  • \r\n );\r\n })}\r\n
\r\n
\r\n \r\n
\r\n )\r\n };\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n ICartlinesViewProps,\r\n ICartResources,\r\n ICartViewProps,\r\n IOrderSummaryErrors\r\n} from '@msdyn365-commerce-modules/cart';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources, IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources, IWishlistActionSuccessResult, PriceComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResults, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\r\nimport { validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport * as React from 'react';\r\nimport { CartLineItems } from '../../../components/citta-cart/cart-line-items';\r\nimport { ICartProps } from '../definition-extensions/cart.ext.props.autogenerated';\r\n\r\nimport CittaTelemetry from '../../../common/telemetry/citta-telemetry';\r\n// import PriceComponent from '../../../components/price-component'\r\n\r\ninterface ICartViewState {\r\n cartlinesErrors: LineDataValidationFailure[];\r\n}\r\n\r\n/**\r\n *\r\n * CartView\r\n * @extends {React.PureComponent}\r\n */\r\nexport class CartView extends React.PureComponent, ICartViewState> {\r\n private cittaTelemetry: CittaTelemetry = new CittaTelemetry(this.props.context.app.config.cittaInstrumentationKey);\r\n\r\n public state: ICartViewState = {\r\n cartlinesErrors: []\r\n };\r\n\r\n private createLogMessage = (message: string): string => {\r\n const url: string = decodeURI(window.location.search);\r\n const origin = window.location.origin;\r\n const logMessage = `${message} Url: - ${url} - Origin: ${origin}`;\r\n return logMessage;\r\n }\r\n\r\n private logMessage = (message: string): void => {\r\n this.cittaTelemetry.trace(this.createLogMessage(message));\r\n }\r\n\r\n // private isQuantityLimitsFeatureEnabled: boolean = true;\r\n private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n\r\n constructor(props: ICartViewProps & ICartProps<{}>) {\r\n super(props);\r\n\r\n this._renderCartlines = this._renderCartlines.bind(this);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n // if (this.isQuantityLimitsFeatureEnabled) {\r\n // await this._validateCart();\r\n // }\r\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n await this._validateCart();\r\n }\r\n\r\n this.logMessage('landed on cart page');\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n return (\r\n
\r\n {this.props.title}\r\n \r\n {this._renderCartlines()}\r\n \r\n {this.props.orderSummaryHeading &&\r\n < Node {...this.props.OrderSummaryWrapper}>\r\n {this.props.orderSummaryHeading}\r\n {_renderOrderSummarylines(this.props.orderSummaryLineitems, this.props.OrderSummaryItems, this.props)}\r\n {this.state.cartlinesErrors.length > 0 ? _renderErrorBlock(this.props.OrderSummaryErrors) : null}\r\n {_renderGIftCardError(this.props)}\r\n {this.props.config.freightCalculationText ?
{this.props.config.freightCalculationText}
: null}\r\n
\r\n {this.props.checkoutAsSignInUserButton}\r\n {this.props.context.request && this.props.context.request.user && this.props.context.request.user.isAuthenticated ? null :
{this.props.resources.orLabel}
}\r\n
\r\n {_renderBackToShoppingButton(this.props.resources)}\r\n {this.props.checkoutAsGuestButton}\r\n
\r\n
\r\n \r\n }\r\n {this.props.storeSelector}\r\n
\r\n );\r\n }\r\n\r\n private _renderCartlines(): JSX.Element[] | JSX.Element {\r\n const { emptyCartText } = this.props.resources;\r\n\r\n if (this.props.cartLoadingStatus) {\r\n return <>{this.props.cartLoadingStatus};\r\n }\r\n const cartLines = this._getCartLines();\r\n if (cartLines) {\r\n return cartLines.map((cartLine, index) => {\r\n return (\r\n
\r\n {cartLine.cartline}\r\n {_renderBOPISBlock(cartLine, this.props.resources, this.props.storeSelector)}\r\n
\r\n {cartLine.addToWishlist}\r\n {cartLine.remove}\r\n
\r\n
\r\n );\r\n });\r\n } else {\r\n return (this.props.cartDataResult ?\r\n (\r\n
\r\n

{emptyCartText}

\r\n {this.props.backToShoppingButton}\r\n
\r\n ) : <>{this.props.waitingComponent}\r\n );\r\n }\r\n }\r\n\r\n private _getCartLines(): ICartlinesViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: {\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n }\r\n },\r\n config: config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n\r\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ? (\r\n CartLineItems({\r\n cartlines: cart.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors: cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n imageSettings: imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.productDimensionTypeSize,\r\n colorString: \"Colour:\" || resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges\r\n },\r\n telemetry: telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\r\n wishlists: wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.props.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates: orderTemplates,\r\n customerInformation: customerInformation\r\n })\r\n ) : null;\r\n }\r\n\r\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return imageSettings || {\r\n viewports: {\r\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\r\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n }\r\n\r\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input)\r\n .then(() => {\r\n this._validateCart()\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n }\r\n\r\n private _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n }\r\n\r\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number): boolean => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineId: cartlineToUpdate.LineId!.toString(),\r\n newQuantity: quantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: this.isQuantityLimitsFeatureEnabled }\r\n };\r\n this.props.data.cart.result.updateCartLineQuantity(input)\r\n .then((result: ICartActionResult) => {\r\n if (result.status === 'SUCCESS') {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n return true;\r\n }\r\n return false;\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to update Cart Line quantity');\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _fulfillmentStoreIdUpdated = () => {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n }\r\n\r\n /**\r\n * Get order quantity limit feature flag.\r\n * @returns True if flag is enabled, false otherwise.\r\n */\r\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\r\n }\r\n\r\n try {\r\n const featureStatuses = await this.props.data.featureState;\r\n const isQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n if (!isQuantityLimitsFeatureEnabledInHq) {\r\n return false;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n try {\r\n const customerInfo = await this.props.data.customerInformation;\r\n return (\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n );\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get customer info');\r\n return false;\r\n }\r\n }\r\n\r\n private async _validateCart(retry: boolean = true): Promise {\r\n if (!this.isQuantityLimitsFeatureEnabled) {\r\n return AsyncResult.resolve();\r\n }\r\n\r\n const {\r\n data: { cart: cart }\r\n } = this.props;\r\n let cartResult: ICartState;\r\n try {\r\n cartResult = await cart;\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get cart');\r\n return AsyncResult.resolve();\r\n }\r\n const cartVersion = cartResult.cart?.Version;\r\n if (cartVersion) {\r\n try {\r\n const validationResult: CartLineValidationResults = await validateForCheckoutAsync({ callerContext: this.props.context.actionContext }, cartResult?.cart?.Id, cartVersion);\r\n this.setState({ cartlinesErrors: validationResult.ValidationFailuresByCartLines || [] });\r\n return AsyncResult.resolve();\r\n } catch (error) {\r\n if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n try {\r\n await cartResult.refreshCart({});\r\n } catch (refreshError) {\r\n this.props.telemetry.warning(refreshError);\r\n this.props.telemetry.debug('Unable to refresh Cart');\r\n return AsyncResult.resolve();\r\n }\r\n try {\r\n await this._validateCart(false);\r\n return AsyncResult.resolve();\r\n } catch (validateError) {\r\n this.props.telemetry.warning(validateError);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n } else {\r\n this.props.telemetry.warning('Cart version not found for Cart validation request.');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n }\r\n\r\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.freePriceText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n }\r\n\r\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n }\r\n\r\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n }\r\n}\r\nexport default CartView;\r\n\r\nfunction _renderBackToShoppingButton(resources: ICartResources): JSX.Element | null {\r\n return (\r\n \r\n {resources.backToShoppingButtonTitle}\r\n \r\n );\r\n}\r\n\r\nfunction _goToPreviousPage(): void {\r\n window.history.back();\r\n}\r\n\r\nconst _renderBOPISBlock = (cartLine: ICartlinesViewProps, resources: ICartResources, storeSelector: React.ReactNode | undefined): JSX.Element | null => {\r\n if (!cartLine.pickUpInStore || !storeSelector) {\r\n return null;\r\n }\r\n\r\n const { shipInsteadDisplayText, shipToAddressDisplayText, pickItUpDisplayText, pickUpAtStoreWithLocationText, changeStoreDisplayText } = resources;\r\n\r\n const isBopisSelected = cartLine.pickUpInStore.isBopisSelected;\r\n const toggleBopis = (event: React.MouseEvent) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(!isBopisSelected); };\r\n const changeStore = (event: React.MouseEvent) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(true); };\r\n\r\n return (\r\n \r\n
\r\n {isBopisSelected ? {pickUpAtStoreWithLocationText} : {shipToAddressDisplayText}}\r\n
\r\n {\r\n isBopisSelected &&\r\n
\r\n {cartLine.pickUpInStore.orgUnitName}\r\n \r\n
\r\n }\r\n \r\n
\r\n );\r\n};\r\n\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || errorData.errors.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {\"Please review cart errors before proceeding to checkout\"}\r\n \r\n );\r\n};\r\n\r\nconst _renderGIftCardError = (props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n function checkAvailability(arr:any, val:string) {\r\n return arr.some(function(arrVal:any) {\r\n return val === arrVal.data?.product?.ItemId;\r\n });\r\n }\r\n let hasGiftCard = checkAvailability(props.cartlines, \"GiftCard\");\r\n let cartlinesLength = props.cartlines?.length || 0;\r\n if(hasGiftCard && cartlinesLength > 1) {\r\n return (\r\n
\r\n {props.config.giftCardErrorMessage || \"At this stage, we cannot process gift cards with product. Please purchase gift cards in a separate transaction.\"}\r\n
\r\n );\r\n } else {\r\n return null\r\n }\r\n};\r\n\r\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n return null;\r\n }\r\n return (\r\n \r\n {props.promoCode}\r\n {_renderSubTotal(props)}\r\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\r\n {orderSummaryLines.shipping}\r\n {props.config.hideTaxLine ? null : orderSummaryLines.tax}\r\n {_renderAmountDue(props)}\r\n {/* {_renderTotalSavings(props)} */}\r\n \r\n );\r\n};\r\n\r\nfunction _renderSubTotal(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n const OrderSubTotal = props.data.cart.result?.cart?.NetPrice;\r\n return (\r\n

\r\n {OrderSubTotal && OrderSubTotal > 0 ? (\r\n <>\r\n {props.resources.subTotalHeadingLabel}\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}\r\n\r\n// function _renderTax(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n// const discountAmount = props.cart && props.cart.cart.DiscountAmount || 0;\r\n// const taxLabel = discountAmount > 0? props.resources.estimatedShippingLabel : props.resources.estimatedTaxLabel;\r\n// return (\r\n//

\r\n// {taxLabel}\r\n// {props.data.cart.result?.cart?.TaxAmount && props.data.cart.result?.cart?.TaxAmount > 0 ? (\r\n// \r\n// ) : (\r\n// {props.resources.yetToBeCalculatedText}\r\n// )}\r\n//

\r\n// );\r\n// }\r\n\r\nfunction _renderAmountDue(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n return (\r\n

\r\n {props.resources.totalAmountLabel}\r\n {props.data.cart.result?.cart?.TotalAmount || props.data.cart.result?.cart?.TotalAmount === 0 ? (\r\n \r\n ) : (\r\n {props.resources.yetToBeCalculatedText}\r\n )}\r\n

\r\n );\r\n}\r\n\r\n// function _renderTotalSavings(props: ICartViewProps): JSX.Element | null {\r\n\r\n// const DiscountAmountWithoutTax = props.data.cart.result?.cart?.DiscountAmountWithoutTax;\r\n// return (\r\n//

\r\n// {DiscountAmountWithoutTax && DiscountAmountWithoutTax > 0 ? (\r\n// <>\r\n// {props.resources.totalSavings}\r\n// \r\n// \r\n// ) : null}\r\n//

\r\n// );\r\n// }","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Find the product in array of products considering product id.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @returns - The found product.\n */\nexport function getProductByProductId(productId: number | undefined, products?: SimpleProduct[]): SimpleProduct | undefined {\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId;\n });\n }\n\n return undefined;\n}\n\n/**\n * Find the product in array of products considering product id and product behavior's warehouse.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @param warehouseId - Warehouse id of cartLine.\n * @param cartState - The cart start in case cart line has no warehouse.\n * @returns - The found product.\n */\nexport function getProductByProductIdAndWarehouse(\n productId: number | undefined,\n products?: SimpleProduct[],\n warehouseId?: string,\n cartState?: ICartState\n): SimpleProduct | undefined {\n const targetWarehouseValue = warehouseId ?? cartState?.cart.WarehouseId;\n\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId && product.Behavior?.InventoryLocationId === targetWarehouseValue;\n });\n }\n\n return undefined;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport * from './validate-cart';\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { IHeaderViewProps } from '@msdyn365-commerce-modules/header';\r\nimport { Collapse, Drawer, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { format } from '@msdyn365-commerce/retail-proxy';\r\nimport { IHeaderProps } from '../definition-extensions/header.ext.props.autogenerated';\r\nimport { CartIconComponent } from './components/cart-icon.component';\r\n// import { ContactInfoClass } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\n\r\n/**\r\n *\r\n * Header component\r\n * @extends {React.PureComponent>}\r\n */\r\nclass HeaderView extends React.Component> {\r\n constructor(props: IHeaderViewProps & IHeaderProps<{}>) {\r\n super(props);\r\n }\r\n\r\n public componentDidMount(): void {\r\n this._stickyHeaderSetup();\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n HeaderTag,\r\n HeaderContainer,\r\n HeaderTopBarContainer\r\n } = this.props;\r\n return (\r\n \r\n \r\n \r\n {this._renderTopBarLeft()}\r\n {this._renderTopBarCenter()}\r\n {this._renderTopBarRight()}\r\n \r\n {this._renderCollapseMenu()}\r\n \r\n {this._renderReactFragment(this.props.menuBar)}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _renderTopBarLeft = (): JSX.Element | null => {\r\n return (\r\n
\r\n {this.props.navIcon}\r\n {this.props.logo}\r\n {this._renderReactFragment(this.props.search)}\r\n
\r\n );\r\n }\r\n\r\n private _renderTopBarRight = (): JSX.Element | null => {\r\n const {Divider} = this.props;\r\n return (\r\n
\r\n {this._renderReactFragment(this.props.slots.countryPicker)}\r\n {this._renderReactFragment(this.props.slots.siteOptions)}\r\n {this._renderAccountBlock(false)}\r\n {this.props.wishListIconDesktop}\r\n \r\n
{this._renderCartIcon()}
\r\n
\r\n );\r\n }\r\n\r\n private _renderTopBarCenter = (): JSX.Element | null => {\r\n return (\r\n
\r\n {this._renderReactFragment(this.props.slots.cittaLogo)}\r\n
\r\n );\r\n }\r\n\r\n private _renderCartIcon = (): JSX.Element | null => {\r\n\r\n if (this.props.data.cart.result) {\r\n const cartItem = `${this.props.data.cart.result.totalItemsInCart}`;\r\n const itemCount = cartItem && parseInt(cartItem, 10) || 0;\r\n let label = this.props.resources.cartLabelNoItems || 'Shopping bag, having no items';\r\n if (itemCount === 1) {\r\n label = this.props.resources.cartLabelWithOneItem || 'Shopping bag, having one item';\r\n } else if (itemCount > 1) {\r\n label = this.props.resources.cartLabel && format(this.props.resources.cartLabel, cartItem) || `Shopping bag, having ${itemCount} items`;\r\n }\r\n return (\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n private _renderCollapseMenu = (): JSX.Element | null => {\r\n const {Divider, MobileMenuLinksContainer, mobileMenuCollapsed} = this.props;\r\n return (\r\n \r\n \r\n {this._renderReactFragment(this.props.search)}\r\n {this._renderMobileAccountBlock(true)}\r\n { this.props.wishListIconMobile }\r\n \r\n \r\n {this._renderReactFragment(this.props.menuBar)}\r\n \r\n );\r\n }\r\n\r\n private renderCustomerName = (): React.ReactChild => {\r\n const { accountInformation } = this.props.data;\r\n const customer = accountInformation && accountInformation.result;\r\n return (\r\n <>{customer ? customer.FirstName || customer.Name : ''}\r\n );\r\n };\r\n\r\n private _renderMobileAccountBlock = (renderForMobile: boolean): JSX.Element | null => {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n signOutLink,\r\n signInLink,\r\n accountLinks} = this.props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n const accountClassName = classnames('ms-header__drawer', AccountInfoDropdownParentContainer.className, renderForMobile ? 'account-mobile' : 'account-desktop');\r\n\r\n if (accountLinks) {\r\n return (\r\n \r\n
\r\n { accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false }\r\n {signOutLink}\r\n
\r\n
\r\n );\r\n } else if (signInLink) {\r\n return (\r\n \r\n {signInLink}\r\n \r\n );\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _renderAccountBlock = (renderForMobile: boolean): JSX.Element | null => {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks,\r\n } = this.props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n \r\n {accountInfoDropdownButton}\r\n \r\n { accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false }\r\n {signOutLink}\r\n \r\n \r\n );\r\n } else if (signInLink) {\r\n return (\r\n \r\n {signInLink}\r\n \r\n );\r\n }\r\n }\r\n this.props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n private _renderReactFragment = (items: React.ReactNode[]): JSX.Element | null => {\r\n return (\r\n \r\n {items && items.length\r\n ? items.map((slot: React.ReactNode, index: number) => {\r\n return {slot};\r\n })\r\n : null}\r\n \r\n );\r\n }\r\n\r\n private _stickyHeaderSetup(): void {\r\n // Set header update methods to trigger on scroll\r\n window.onscroll = () => {\r\n this._updateHeader();\r\n };\r\n this._updateHeader();\r\n }\r\n\r\n private _updateHeader(): void {\r\n // Get heights of cookie and promotion banners\r\n const headerAlertsContainer: HTMLElement | null = document.querySelector('.ms-promo-banner');\r\n const bannerHeights = headerAlertsContainer ? headerAlertsContainer.offsetHeight : 0;\r\n\r\n // triggers opacity change of header\r\n const headerElem = document.querySelector('.ms-header');\r\n if (headerElem) {\r\n if (document.documentElement.scrollTop > bannerHeights) {\r\n headerElem.classList.add('lock-opaque');\r\n } else {\r\n headerElem.classList.remove('lock-opaque');\r\n }\r\n }\r\n\r\n // Update sticky header position and opacity\r\n const stickyHeader: HTMLElement | null = document.querySelector('.ms-header__desktop-view');\r\n const headerLogo: HTMLElement | null = document.querySelector('.ms-header__topbar-center');\r\n const headerLeftActionItem: HTMLElement | null = document.querySelector('.ms-header__topbar-left');\r\n const headerRightActionItem: HTMLElement | null = document.querySelector('.ms-header__topbar-right');\r\n\r\n if (stickyHeader && headerLogo && headerLeftActionItem && headerRightActionItem) {\r\n // Fix center sticky header\r\n const navStickyPos = headerLogo.offsetHeight + bannerHeights;\r\n if (document.documentElement.scrollTop > navStickyPos) {\r\n stickyHeader.classList.add('fixed');\r\n } else {\r\n stickyHeader.classList.remove('fixed');\r\n }\r\n\r\n // Fix edge sticky headers\r\n if (document.documentElement.scrollTop > bannerHeights) {\r\n headerLeftActionItem.classList.add('fixed');\r\n headerRightActionItem.classList.add('fixed');\r\n } else {\r\n headerLeftActionItem.classList.remove('fixed');\r\n headerRightActionItem.classList.remove('fixed');\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default HeaderView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyLabelProps {\n className: string;\n text: string;\n htmlFor: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.className\n * @param root0.text\n * @param root0.htmlFor\n * @extends {React.FC}\n */\nconst CheckoutLoyaltyLabel: React.FC = ({ className, text, htmlFor }) => {\n return (\n \n );\n};\n\nexport default CheckoutLoyaltyLabel;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsDescriptionProps {\n description?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.description\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsDescription: React.FC = ({ description }) => {\n if (!description) {\n return null;\n }\n\n return {description};\n};\n\nexport default CheckoutDeliveryOptionsDescription;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\nimport MsDyn365, { ICoreContext, IGridSettings, IImageSettings, ITelemetry, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n OrgUnitLocation,\n ProductAvailableQuantity,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\n\nexport interface IFlyoutCartLineItemsProps {\n cartlines: CartLine[];\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n\n /**\n * GridSettings for the product image in cartline\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartline\n */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n removeButtonText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n maxCartlineQuantity: number;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isQuantityLimitsFeatureEnabled: boolean;\n\n outOfStockThreshold: number;\n isStockCheckEnabled: boolean;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\nexport interface IFlyoutCartLineItemViewProps {\n cartline: React.ReactNode;\n remove: React.ReactNode;\n storeLocation: React.ReactNode;\n hasError: boolean;\n\n data: {\n product: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n outOfStockThreshold: number,\n productAvailability?: ProductAvailableQuantity\n): number => {\n if (isStockCheckEnabled) {\n if (\n !productAvailability ||\n !productAvailability.AvailableQuantity ||\n productAvailability.AvailableQuantity <= 0 ||\n productAvailability.AvailableQuantity <= outOfStockThreshold\n ) {\n return 0;\n }\n return productAvailability.AvailableQuantity - outOfStockThreshold;\n }\n\n return 0;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number\n) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there is no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\n ? maxByQuantityLimitsFeatureResult\n : availableQuantityInStock\n : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct,\n props: IFlyoutCartLineItemsProps,\n index: number,\n foundProductAvailability?: ProductAvailableQuantity,\n foundProductDeliveryOptions?: ProductDeliveryOptions\n): IFlyoutCartLineItemViewProps => {\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText, removeItemClickHandler } = props;\n\n const availableQuantityInStock = _getCartItemAvailableQuantity(\n props.isStockCheckEnabled,\n props.outOfStockThreshold,\n foundProductAvailability\n );\n const maxQuantity =\n product &&\n _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0\n );\n\n // Check if the product is service or not by product type\n const isServiceItem = product.ItemTypeValue === ReleasedProductType.Service;\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n let productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n\n return {\n data: {\n product,\n cartline\n },\n hasError: !isServiceItem && props.isStockCheckEnabled ? cartline.Quantity! > maxQuantity : false,\n cartline: (\n \n ),\n remove: (\n \n {removeButtonText}\n \n ),\n storeLocation: _renderStoreLocation(cartline, props)\n };\n};\n\nconst _renderDeliveryLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): string | undefined => {\n let deliverylocation;\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartLine.ProductId;\n });\n }\n const delivery = foundProductDeliveryOption?.DeliveryOptions?.find(option => option.Code === cartLine.DeliveryMode);\n const location = delivery?.Description;\n\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n if (location) {\n deliverylocation = `${location}, ${orgUnitName}`;\n } else {\n deliverylocation = `${orgUnitName}`;\n }\n } else {\n deliverylocation = props.resources.shippingText;\n }\n return deliverylocation;\n};\n\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n if (orgUnitName) {\n return (\n
\n {orgUnitName}\n
\n );\n }\n }\n\n return null;\n};\n\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n};\n\nconst _assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: IFlyoutCartLineItemsProps\n): IFlyoutCartLineItemViewProps[] | null => {\n const reactNodes: IFlyoutCartLineItemViewProps[] = [];\n\n if (!products || products.length === 0) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\n });\n }\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n if (product) {\n reactNodes.push(\n _assembleNode(\n cartline,\n product,\n props,\n index,\n foundProductAvailability?.ProductAvailableQuantity,\n foundProductDeliveryOption\n )\n );\n }\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\n const { products, cartlines } = props;\n return _assembleCartlines(cartlines, products, props);\n};\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { IHeaderViewProps } from './citta-header';\r\n\r\nconst headerView: React.FC = props => {\r\n const {\r\n HeaderTag,\r\n HeaderContainer,\r\n HeaderTopBarContainer,\r\n HeaderTopBarRightContainer,\r\n MobileMenuContainer,\r\n MobileMenuBodyContainer,\r\n MobileMenuLinksContainer\r\n } = props;\r\n return (\r\n \r\n \r\n {_renderReactFragment(props.menuBar)}\r\n \r\n {props.navIcon}\r\n {props.logo}\r\n \r\n {_renderReactFragment(props.search)}\r\n {props.preferredStore}\r\n {_renderReactFragment(props.siteOptions)}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.cartIcon}\r\n \r\n \r\n \r\n \r\n {_renderReactFragment(props.search)}\r\n { props.MobileMenuHeader }\r\n {_renderReactFragment(props.menuBar)}\r\n \r\n {/* {_renderReactFragment(props.search)} */}\r\n { props.accountLinks ? props.accountLinks.map(link => link) : false }\r\n {_renderMobileAccountBlock(props)}\r\n { props.siteOptions }\r\n {/* { props.signInLink } */}\r\n {/* { props.signOutLink } */}\r\n \r\n \r\n \r\n {_renderReactFragment(props.categoryMenuBar)}\r\n {_renderReactFragment(props.customNavBar)}\r\n {_renderReactFragment(props.countryPicker)}\r\n \r\n \r\n );\r\n};\r\n\r\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks,\r\n } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n \r\n {accountInfoDropdownButton}\r\n \r\n { accountLinks ? accountLinks.map(link => link) : false }\r\n {signOutLink}\r\n \r\n \r\n \r\n );\r\n } else if (signInLink) {\r\n return (\r\n \r\n {signInLink}\r\n \r\n );\r\n }\r\n }\r\n props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n}\r\n\r\n\r\nfunction _renderMobileAccountBlock(props: IHeaderViewProps): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks,\r\n } = props;\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n \r\n {accountInfoDropdownButton}\r\n \r\n { accountLinks ? accountLinks.map(link => link) : false }\r\n {signOutLink}\r\n \r\n \r\n \r\n );\r\n } else if (signInLink) {\r\n return (\r\n \r\n {signInLink}\r\n \r\n );\r\n }\r\n }\r\n props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n}\r\n\r\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\r\n return (\r\n \r\n {items && items.length\r\n ? items.map((slot: React.ReactNode, index: number) => {\r\n return {slot};\r\n })\r\n : null}\r\n \r\n );\r\n}\r\n\r\nexport default headerView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { IPickUpInStoreViewProps, PickUpInStore } from '@msdyn365-commerce-modules/cart';\r\nimport { getProductUrlSync, IProductInventoryInformation, OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n AddToOrderTemplateComponent, AddToWishlistComponent, CartLineItemComponent,\r\n IAddToOrderTemplateDialogResources, ICartlineResourceString, IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources, IOrderTemplateNameDialogResources, IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry, TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, CommerceList, Customer, LineDataValidationFailure, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n// import { PropertyUserActionClass } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport * as React from 'react';\r\n\r\nexport interface ICartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartlinesErrors: LineDataValidationFailure[];\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: IProductInventoryInformation[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n /** GridSettings for the product image in cartline */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartline */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n shipItText: string;\r\n pickitUpText: string;\r\n changeStoreText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n isStockCheckEnabled: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n defaultWishlistName: string;\r\n maxCartlineQuantity: number;\r\n includeErrors?: boolean;\r\n showShippingChargesForLineItems?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n storeSelectorModuleId?: string;\r\n\r\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\r\n\r\n addToOrderTemplateButtonText: string;\r\n addToOrderTemplateMessage: string;\r\n addItemToOrderTemplateError: string;\r\n orderTemplates: OrderTemplate[] | undefined;\r\n customerInformation: Customer | undefined;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number): boolean;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport interface ICartlinesViewProps {\r\n cartline: React.ReactNode;\r\n pickUpInStore?: IPickUpInStoreViewProps;\r\n remove: React.ReactNode;\r\n addToWishlist: React.ReactNode | undefined;\r\n addToOrderTemplate: React.ReactNode | undefined;\r\n\r\n error?: string;\r\n\r\n data?: {\r\n product: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getProduct = (productId: number | undefined, products: SimpleProduct[]): SimpleProduct | undefined => {\r\n if (productId !== undefined && products) {\r\n return products.find(product => {\r\n return productId === product.RecordId;\r\n });\r\n }\r\n return undefined;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (maxCartlineQuantity: number, isStockCheckEnabled: boolean, productAvailability?: IProductInventoryInformation, productMaxQuantity?: number) => {\r\n const lineMaxQuantity = productMaxQuantity ? productMaxQuantity : maxCartlineQuantity;\r\n\r\n if (isStockCheckEnabled) {\r\n if (!productAvailability || !productAvailability.ProductAvailableQuantity || !productAvailability.IsProductAvailable || !productAvailability.ProductAvailableQuantity.AvailableQuantity) {\r\n return 0;\r\n }\r\n return productAvailability.ProductAvailableQuantity.AvailableQuantity ? productAvailability.ProductAvailableQuantity.AvailableQuantity : lineMaxQuantity;\r\n }\r\n\r\n return lineMaxQuantity;\r\n};\r\n\r\nconst _getErrorMessage = (maxQuantity: number, currentQuantity: number, props: ICartLineItemsProps, lineIndex: number, isServiceItem: boolean, eoqQuantity:number): string | undefined => {\r\n \r\n const finalErrorMessage: string[] = [];\r\n if (props.includeErrors) {\r\n if (props.isStockCheckEnabled && !isServiceItem) {\r\n if (maxQuantity <= 0) {\r\n finalErrorMessage.push(props.outOfStockText);\r\n } else if (maxQuantity < currentQuantity) {\r\n if (maxQuantity === 1) {\r\n finalErrorMessage.push(props.outOfRangeOneText);\r\n } else {\r\n finalErrorMessage.push(props.outOfRangeFormatText.replace('{numLeft}', maxQuantity.toString()));\r\n }\r\n }\r\n }\r\n }\r\n const eoqErrorMessage = `Must be purchased in multiples of ${eoqQuantity}`;\r\n\r\n // server-side validation\r\n props.cartlinesErrors\r\n .filter(i => i.LineIndex === lineIndex)\r\n .forEach(i => {\r\n if (\r\n i.DataValidationFailure?.ErrorResourceId === \"Microsoft_Dynamics_Commerce_Runtime_ItemQuantityViolatesMultiplicityOfConfiguredNumber\" ||\r\n i.DataValidationFailure?.ErrorResourceId === \"Microsoft_Dynamics_Commerce_Runtime_ItemQuantityLessThanMinimumAndViolatesMultiplicityOfConfiguredNumber\") {\r\n finalErrorMessage.push(eoqErrorMessage);\r\n } else if (i.DataValidationFailure?.ErrorContext) {\r\n finalErrorMessage.push(i.DataValidationFailure.ErrorContext);\r\n }\r\n });\r\n\r\n if (finalErrorMessage.length > 0) {\r\n return finalErrorMessage.join(' ');\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct,\r\n props: ICartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: IProductInventoryInformation,\r\n foundProductDeliveryOptions?: ProductDeliveryOptions)\r\n : ICartlinesViewProps => {\r\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText,\r\n removeItemClickHandler, moveToWishlistSuccessHandler, addToOrderTemplateButtonText,\r\n addToOrderTemplateDialogResources, createOrderTemplateDialogResources,\r\n itemAddedToOrderTemplateDialogResources, duplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n addToWishlistButtonText, removeFromWishlistButtonText, orderTemplates, customerInformation,\r\n wishlists, defaultWishlistName, storeSelectorModuleId } = props;\r\n\r\n const isAuthenticated = context.request.user.isAuthenticated;\r\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\r\n const maxQuantity = _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n foundProductAvailability,\r\n props.isQuantityLimitsFeatureEnabled ? product.Behavior?.MaximumQuantity : undefined);\r\n\r\n // check if the product is service or not by product type\r\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\r\n const isServiceItem = product.ItemTypeValue === PRODUCTASSERVICE;\r\n\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n const eoqQuantity:number =isB2B? product.Behavior?.MultipleOfQuantity || 1 : 1;\r\n const errorMessage = _getErrorMessage(maxQuantity, cartline.Quantity!, props, index, isServiceItem, eoqQuantity);\r\n\r\n const onRemoveClickHandler = (event: React.MouseEvent) => { removeItemClickHandler(cartline); };\r\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n\r\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\r\n const inventoryCode = foundProductAvailability ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}` : undefined;\r\n return {\r\n data: {\r\n product: product,\r\n cartline: cartline\r\n },\r\n error: errorMessage,\r\n cartline: (\r\n ),\r\n pickUpInStore: (\r\n PickUpInStore({\r\n storeSelectorModuleId: storeSelectorModuleId,\r\n cartState: props.cartState,\r\n cartline: cartline,\r\n product: product,\r\n shipitText: props.shipItText,\r\n pickUpInStoreText: props.pickitUpText,\r\n changeStoreText: props.changeStoreText,\r\n storeSelectorStateManager: props.storeSelectorStateManager,\r\n orgUnitLocations: props.orgUnitLocations,\r\n deliveryOptions: foundProductDeliveryOptions,\r\n pickupDeliveryModeCode: props.pickupDeliveryModeCode,\r\n locationChangedHandler: props.locationChangedHandler\r\n })\r\n ),\r\n remove: (\r\n \r\n {removeButtonText}\r\n \r\n ),\r\n addToWishlist: (\r\n isAuthenticated ? (\r\n \r\n ) :\r\n undefined\r\n ),\r\n addToOrderTemplate: (\r\n\r\n isAuthenticated && orderTemplates ? (\r\n //@ts-ignore\r\n \r\n ) :\r\n undefined\r\n )\r\n };\r\n};\r\n\r\nconst _assembleCartlines = (cartlines: CartLine[], products: SimpleProduct[] | undefined, props: ICartLineItemsProps): ICartlinesViewProps[] | null => {\r\n const reactNodes: ICartlinesViewProps[] = [];\r\n\r\n if (!products || products.length === 0) {\r\n props.context.telemetry.error('Products content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n cartlines.map((cartline, index) => {\r\n const product = _getProduct(cartline.ProductId, products);\r\n // console.log('product', product, 'cartline', cartline);\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\r\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\r\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\r\n });\r\n }\r\n let foundProductDeliveryOption;\r\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n if (product) {\r\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, foundProductDeliveryOption));\r\n }\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component\r\n */\r\n\r\nexport const CartLineItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return (\r\n _assembleCartlines(cartlines, products, props)\r\n );\r\n};","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ICartLineItemPromotion {\n id: string;\n showPromotionPopup: boolean;\n promotions: CartPromotionLine[] | undefined;\n resources: ICartLineItemPromotionResourceString;\n onSeeAllClick(event: React.MouseEvent): void;\n onCloseButtonClick(): void;\n}\n\nexport interface ICartLineItemViewProps {\n promotionMessageWrapper: INodeProps;\n promotionMessage: React.ReactNode;\n promotionSeeAllLink: React.ReactElement;\n promotionDialog: React.ReactNode;\n}\n\nexport interface ICartLineItemPromotionResourceString {\n promotionLinkText: string;\n promotionStringHeading: string;\n promotionPopupHeading: string;\n promotionCloseButtonAriaLabel: string;\n}\n\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\n const {\n id,\n showPromotionPopup,\n promotions,\n resources: { promotionLinkText, promotionPopupHeading },\n onCloseButtonClick,\n onSeeAllClick\n } = props;\n\n if (!ArrayExtensions.hasElements(promotions)) {\n return;\n }\n\n const titleId = `${id}_title`;\n const className = 'msc-cart__promotion';\n return {\n promotionMessageWrapper: {\n className: 'msc-cart__promotion'\n },\n promotionMessage: (\n <>\n \n {props.resources.promotionStringHeading}\n \n ),\n promotionSeeAllLink: (\n \n {` `}\n {promotionLinkText} {` `}\n \n ),\n promotionDialog: (\n \n \n
\n {promotionPopupHeading}\n
\n
\n \n
    \n {promotions.map(_promotion => {\n return (\n
  • \n {_promotion.Promotion?.OfferName} {` `}\n
  • \n );\n })}\n
\n
\n \n
\n )\n };\n};\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n ICartlinesViewProps,\r\n ICartResources,\r\n ICartViewProps,\r\n IOrderSummaryErrors\r\n} from '@msdyn365-commerce-modules/cart';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources, IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources, IWishlistActionSuccessResult, PriceComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResults, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\r\nimport { validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport * as React from 'react';\r\nimport { CartLineItems } from '../../../components/citta-cart/cart-line-items';\r\nimport { ICartProps } from '../definition-extensions/cart.ext.props.autogenerated';\r\n\r\nimport CittaTelemetry from '../../../common/telemetry/citta-telemetry';\r\n// import PriceComponent from '../../../components/price-component'\r\n\r\ninterface ICartViewState {\r\n cartlinesErrors: LineDataValidationFailure[];\r\n}\r\n\r\n/**\r\n *\r\n * CartView\r\n * @extends {React.PureComponent}\r\n */\r\nexport class CartView extends React.PureComponent, ICartViewState> {\r\n private cittaTelemetry: CittaTelemetry = new CittaTelemetry(this.props.context.app.config.cittaInstrumentationKey);\r\n\r\n public state: ICartViewState = {\r\n cartlinesErrors: []\r\n };\r\n\r\n private createLogMessage = (message: string): string => {\r\n const url: string = decodeURI(window.location.search);\r\n const origin = window.location.origin;\r\n const logMessage = `${message} Url: - ${url} - Origin: ${origin}`;\r\n return logMessage;\r\n }\r\n\r\n private logMessage = (message: string): void => {\r\n this.cittaTelemetry.trace(this.createLogMessage(message));\r\n }\r\n\r\n // private isQuantityLimitsFeatureEnabled: boolean = true;\r\n private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n\r\n constructor(props: ICartViewProps & ICartProps<{}>) {\r\n super(props);\r\n\r\n this._renderCartlines = this._renderCartlines.bind(this);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n // if (this.isQuantityLimitsFeatureEnabled) {\r\n // await this._validateCart();\r\n // }\r\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n await this._validateCart();\r\n }\r\n\r\n this.logMessage('landed on cart page');\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n return (\r\n
\r\n {this.props.title}\r\n \r\n {this._renderCartlines()}\r\n \r\n {this.props.orderSummaryHeading &&\r\n < Node {...this.props.OrderSummaryWrapper}>\r\n {this.props.orderSummaryHeading}\r\n {_renderOrderSummarylines(this.props.orderSummaryLineitems, this.props.OrderSummaryItems, this.props)}\r\n {this.state.cartlinesErrors.length > 0 ? _renderErrorBlock(this.props.OrderSummaryErrors) : null}\r\n {_renderUnder200sError(this.props)}\r\n {this.props.config.freightCalculationText ?
{this.props.config.freightCalculationText}
: null}\r\n
\r\n {this.props.checkoutAsSignInUserButton}\r\n {this.props.context.request && this.props.context.request.user && this.props.context.request.user.isAuthenticated ? null :
{this.props.resources.orLabel}
}\r\n
\r\n {_renderBackToShoppingButton(this.props.resources)}\r\n {this.props.checkoutAsGuestButton}\r\n
\r\n
\r\n \r\n }\r\n {this.props.storeSelector}\r\n
\r\n );\r\n }\r\n\r\n private _renderCartlines(): JSX.Element[] | JSX.Element {\r\n const { emptyCartText } = this.props.resources;\r\n\r\n if (this.props.cartLoadingStatus) {\r\n return <>{this.props.cartLoadingStatus};\r\n }\r\n const cartLines = this._getCartLines();\r\n if (cartLines) {\r\n return cartLines.map((cartLine, index) => {\r\n return (\r\n
\r\n {cartLine.cartline}\r\n {_renderBOPISBlock(cartLine, this.props.resources, this.props.storeSelector)}\r\n
\r\n {cartLine.addToWishlist}\r\n {cartLine.remove}\r\n
\r\n
\r\n );\r\n });\r\n } else {\r\n return (this.props.cartDataResult ?\r\n (\r\n
\r\n

{emptyCartText}

\r\n {this.props.backToShoppingButton}\r\n
\r\n ) : <>{this.props.waitingComponent}\r\n );\r\n }\r\n }\r\n\r\n private _getCartLines(): ICartlinesViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: {\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n }\r\n },\r\n config: config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n\r\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ? (\r\n CartLineItems({\r\n cartlines: cart.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors: cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n imageSettings: imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: \"Size:\" || resources.productDimensionTypeSize,\r\n colorString: \"Colour:\" || resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges\r\n },\r\n telemetry: telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\r\n wishlists: wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.props.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates: orderTemplates,\r\n customerInformation: customerInformation\r\n })\r\n ) : null;\r\n }\r\n\r\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return imageSettings || {\r\n viewports: {\r\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\r\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n }\r\n\r\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input)\r\n .then(() => {\r\n this._validateCart()\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n }\r\n\r\n private _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n }\r\n\r\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number): boolean => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineId: cartlineToUpdate.LineId!.toString(),\r\n newQuantity: quantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: this.isQuantityLimitsFeatureEnabled }\r\n };\r\n this.props.data.cart.result.updateCartLineQuantity(input)\r\n .then((result: ICartActionResult) => {\r\n if (result.status === 'SUCCESS') {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n return true;\r\n }\r\n return false;\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to update Cart Line quantity');\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _fulfillmentStoreIdUpdated = () => {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n }\r\n\r\n /**\r\n * Get order quantity limit feature flag.\r\n * @returns True if flag is enabled, false otherwise.\r\n */\r\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\r\n }\r\n\r\n try {\r\n const featureStatuses = await this.props.data.featureState;\r\n const isQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n if (!isQuantityLimitsFeatureEnabledInHq) {\r\n return false;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n try {\r\n const customerInfo = await this.props.data.customerInformation;\r\n return (\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n );\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get customer info');\r\n return false;\r\n }\r\n }\r\n\r\n private async _validateCart(retry: boolean = true): Promise {\r\n if (!this.isQuantityLimitsFeatureEnabled) {\r\n return AsyncResult.resolve();\r\n }\r\n\r\n const {\r\n data: { cart: cart }\r\n } = this.props;\r\n let cartResult: ICartState;\r\n try {\r\n cartResult = await cart;\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get cart');\r\n return AsyncResult.resolve();\r\n }\r\n const cartVersion = cartResult.cart?.Version;\r\n if (cartVersion) {\r\n try {\r\n const validationResult: CartLineValidationResults = await validateForCheckoutAsync({ callerContext: this.props.context.actionContext }, cartResult?.cart?.Id, cartVersion);\r\n this.setState({ cartlinesErrors: validationResult.ValidationFailuresByCartLines || [] });\r\n return AsyncResult.resolve();\r\n } catch (error) {\r\n if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n try {\r\n await cartResult.refreshCart({});\r\n } catch (refreshError) {\r\n this.props.telemetry.warning(refreshError);\r\n this.props.telemetry.debug('Unable to refresh Cart');\r\n return AsyncResult.resolve();\r\n }\r\n try {\r\n await this._validateCart(false);\r\n return AsyncResult.resolve();\r\n } catch (validateError) {\r\n this.props.telemetry.warning(validateError);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n } else {\r\n this.props.telemetry.warning('Cart version not found for Cart validation request.');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n }\r\n\r\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.freePriceText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n }\r\n\r\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n }\r\n\r\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n }\r\n}\r\nexport default CartView;\r\n\r\nfunction _renderBackToShoppingButton(resources: ICartResources): JSX.Element | null {\r\n return (\r\n \r\n {resources.backToShoppingButtonTitle}\r\n \r\n );\r\n}\r\n\r\nfunction _goToPreviousPage(): void {\r\n window.history.back();\r\n}\r\n\r\nconst _renderBOPISBlock = (cartLine: ICartlinesViewProps, resources: ICartResources, storeSelector: React.ReactNode | undefined): JSX.Element | null => {\r\n if (!cartLine.pickUpInStore || !storeSelector) {\r\n return null;\r\n }\r\n\r\n const { shipInsteadDisplayText, shipToAddressDisplayText, pickItUpDisplayText, pickUpAtStoreWithLocationText, changeStoreDisplayText } = resources;\r\n\r\n const isBopisSelected = cartLine.pickUpInStore.isBopisSelected;\r\n const toggleBopis = (event: React.MouseEvent) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(!isBopisSelected); };\r\n const changeStore = (event: React.MouseEvent) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(true); };\r\n\r\n return (\r\n \r\n
\r\n {isBopisSelected ? {pickUpAtStoreWithLocationText} : {shipToAddressDisplayText}}\r\n
\r\n {\r\n isBopisSelected &&\r\n
\r\n {cartLine.pickUpInStore.orgUnitName}\r\n \r\n
\r\n }\r\n \r\n
\r\n );\r\n};\r\n\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || errorData.errors.length === 0) {\r\n return null;\r\n }\r\n return (\r\n \r\n {\"Please review cart errors before proceeding to checkout\"}\r\n \r\n );\r\n};\r\n\r\nconst _renderUnder200sError = (props:any): JSX.Element | null => {\r\n const OrderSubTotal = props.data.cart.result?.cart?.SubtotalAmount;\r\n console.log('cart',props.data.cart.result?.cart);\r\n let isGiftCardOnly = props.data.cart.result?.cart && props.data.cart.result?.cart.CartLines && props.data.cart.result?.cart.CartLines.length === 1 && props.data.cart.result?.cart.CartLines[0].ItemId === \"GiftCard\";\r\n if(!isGiftCardOnly && OrderSubTotal < 200) {\r\n return (\r\n
\r\n
Your order must be a minimum of $200. Please update your cart to place an order.
\r\n
\r\n );\r\n }\r\n return null\r\n};\r\n\r\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n return null;\r\n }\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n return (\r\n \r\n {isB2B? null : props.promoCode}\r\n {isB2B? orderSummaryLines.subtotal : _renderSubTotal(props)}\r\n {props.config.hideTaxLine ? null : _renderTax(props)}\r\n {isB2B ? orderSummaryLines.subtotal : (orderSummaryLines.totalDiscounts ? orderSummaryLines.subtotal : null)}\r\n {isB2B? null : _renderAmountDue(props)}\r\n {isB2B? null : _renderTotalSavings(props)}\r\n \r\n );\r\n};\r\n\r\nfunction _renderSubTotal(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n const OrderSubTotal = props.data.cart.result?.cart?.NetPrice;\r\n return (\r\n

\r\n {OrderSubTotal && OrderSubTotal > 0 ? (\r\n <>\r\n {props.resources.subTotalHeadingLabel}\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}\r\n\r\nfunction _renderTax(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n const discountAmount = props.cart && props.cart.cart.DiscountAmount || 0;\r\n const taxLabel = discountAmount > 0? props.resources.estimatedShippingLabel : props.resources.estimatedTaxLabel;\r\n return (\r\n

\r\n {taxLabel}\r\n {props.data.cart.result?.cart?.TaxAmount && props.data.cart.result?.cart?.TaxAmount > 0 ? (\r\n \r\n ) : (\r\n {props.resources.yetToBeCalculatedText}\r\n )}\r\n

\r\n );\r\n}\r\n\r\nfunction _renderAmountDue(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n return (\r\n

\r\n {props.resources.amountDueLabel}\r\n {props.data.cart.result?.cart?.TotalAmount || props.data.cart.result?.cart?.TotalAmount === 0 ? (\r\n \r\n ) : (\r\n {props.resources.yetToBeCalculatedText}\r\n )}\r\n

\r\n );\r\n}\r\n\r\nfunction _renderTotalSavings(props: ICartViewProps): JSX.Element | null {\r\n\r\n const DiscountAmountWithoutTax = props.data.cart.result?.cart?.DiscountAmountWithoutTax;\r\n return (\r\n

\r\n {DiscountAmountWithoutTax && DiscountAmountWithoutTax > 0 ? (\r\n <>\r\n {props.resources.totalSavings}\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyTextProps {\n className: string;\n text?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.className\n * @param root0.text\n * @extends {React.FC}\n */\nconst CheckoutLoyaltyText: React.FC = ({ className, text }) => {\n if (!text) {\n return null;\n }\n\n return {text};\n};\n\nexport default CheckoutLoyaltyText;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n AddToOrderTemplateComponent,\n AddToWishlistComponent,\n CartLineItemComponent,\n IAddToOrderTemplateDialogResources,\n ICartlineResourceString,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult\n} from '@msdyn365-commerce/components';\nimport MsDyn365, {\n IAny,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageSettings,\n ITelemetry,\n TelemetryEvent,\n isChannelTypeB2B\n} from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResultsByLineId,\n ChannelDeliveryOptionConfiguration,\n CommerceList,\n Customer,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport {\n ArrayExtensions,\n getInvoiceDetailsPageUrlSync,\n getProductUrlSync,\n IProductInventoryInformation,\n isCartLineItemPickUpType,\n ObjectExtensions,\n OrderTemplate,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\nimport { IPickUpInStoreViewProps, PickUpInStore } from './cart-pick-up-in-store';\n\nexport interface ICartLineItemsProps {\n cartlines: CartLine[];\n cartlinesErrors: CartLineValidationResultsByLineId;\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n retailMulitplePickupFeatureState?: boolean;\n\n /* GridSettings for the product image in cartline */\n gridSettings: IGridSettings;\n\n /* ImageSettings for the product image in cartline */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext>;\n telemetry: ITelemetry;\n removeButtonText: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n shipItText: string;\n pickitUpText: string;\n changeStoreText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n isStockCheckEnabled: boolean;\n wishlists: CommerceList[] | undefined;\n defaultWishlistName: string;\n maxCartlineQuantity: number;\n includeErrors?: boolean;\n showShippingChargesForLineItems?: boolean;\n telemetryContent?: ITelemetryContent;\n isQuantityLimitsFeatureEnabled: boolean;\n hasInvoiceLine?: boolean;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n addToOrderTemplateButtonText: string;\n addToOrderTemplateButtonTooltip: string;\n addToOrderTemplateMessage: string;\n addItemToOrderTemplateError: string;\n orderTemplates: OrderTemplate[] | undefined;\n customerInformation: Customer | undefined;\n shouldIgnoreWarehouse: boolean | undefined;\n productAvailability?: AsyncResult;\n productPickUpOptions?: ProductDeliveryOptions[] | undefined;\n isMultipleCatalogFeatureEnabledInHq: boolean;\n catalogId?: number;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\n locationChangedHandler(): void;\n}\n\nexport interface ICartlinesViewProps {\n cartline: React.ReactNode;\n pickUpInStore?: IPickUpInStoreViewProps;\n remove: React.ReactNode;\n addToWishlist: React.ReactNode | undefined;\n addToOrderTemplate: React.ReactNode | undefined;\n\n error?: string;\n cartlineId?: string;\n hasError?: boolean;\n data?: {\n product?: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n productAvailability: IProductInventoryInformation | undefined\n): number => {\n if (\n !isStockCheckEnabled ||\n !productAvailability ||\n !productAvailability.ProductAvailableQuantity ||\n !productAvailability.IsProductAvailable ||\n !productAvailability.ProductAvailableQuantity.AvailableQuantity\n ) {\n return 0;\n }\n\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number\n) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\n ? maxByQuantityLimitsFeatureResult\n : availableQuantityInStock\n : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n};\n\nconst _getErrorMessage = (\n availableQuantityInStock: number,\n currentQuantity: number,\n props: ICartLineItemsProps,\n shouldSkipStockCheck: boolean,\n cartLine: CartLine,\n lineId: string | undefined,\n foundProductAvailability?: IProductInventoryInformation\n): string | undefined => {\n const finalErrorMessages: string[] = [];\n\n const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\n if (isLoadingDeliveryOptions) {\n return undefined;\n }\n // check availability passed as prop for each cartline\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n if (foundProductAvailability === undefined) {\n finalErrorMessages.push(props.outOfStockText);\n return finalErrorMessages.toString();\n }\n }\n if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\n if (availableQuantityInStock <= 0) {\n finalErrorMessages.push(props.outOfStockText);\n } else if (availableQuantityInStock < currentQuantity) {\n if (availableQuantityInStock === 1) {\n finalErrorMessages.push(props.outOfRangeOneText);\n } else {\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\n }\n }\n }\n\n // Server-side validation\n const checkForErrors = props.cartlinesErrors.ValidationResultsPairs;\n const errorsFoundByLineId = checkForErrors?.filter(index => index.LineId === lineId);\n if (errorsFoundByLineId !== undefined) {\n for (const i of errorsFoundByLineId) {\n if (ArrayExtensions.hasElements(i.ValidationFailures)) {\n i.ValidationFailures.forEach(validation => {\n if (validation.ErrorContext !== undefined) {\n finalErrorMessages.push(validation.ErrorContext);\n }\n });\n }\n }\n }\n\n if (ArrayExtensions.hasElements(finalErrorMessages)) {\n return finalErrorMessages.join(' ');\n }\n\n return undefined;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\n\n// eslint-disable-next-line complexity -- Auto-suppressed.\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct | undefined,\n props: ICartLineItemsProps,\n index: number,\n foundProductAvailability?: IProductInventoryInformation,\n productPickUpOptions?: ProductDeliveryOptions\n): ICartlinesViewProps => {\n const {\n imageSettings,\n gridSettings,\n id,\n typeName,\n context,\n resources,\n removeButtonText,\n removeItemClickHandler,\n moveToWishlistSuccessHandler,\n addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip,\n addToOrderTemplateDialogResources,\n createOrderTemplateDialogResources,\n itemAddedToOrderTemplateDialogResources,\n duplicateItemsWhenAddingToOrderTemplateDialogResources,\n addToWishlistButtonText,\n removeFromWishlistButtonText,\n orderTemplates,\n customerInformation,\n wishlists,\n defaultWishlistName,\n storeSelectorModuleId,\n isMultipleCatalogFeatureEnabledInHq\n } = props;\n\n const isAuthenticated = context.request.user.isAuthenticated;\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, foundProductAvailability);\n\n const maxQuantity =\n product &&\n _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0\n );\n\n // Skip stock check if the cart line is a service item or an invoice line\n const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\n\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\n ? undefined\n : _getErrorMessage(\n availableQuantityInStock,\n cartline.Quantity!,\n props,\n shouldSkipStockCheck,\n cartline,\n cartline.LineId,\n foundProductAvailability\n );\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\n\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\n const inventoryCode = foundProductAvailability\n ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\n : undefined;\n const productDimension = 4;\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\n const isCustomPriceSelected =\n product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value ===\n 'Custom';\n\n let productUrl: string | undefined;\n if (product) {\n productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n } else {\n productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\n }\n\n return {\n data: {\n product,\n cartline\n },\n cartlineId: cartline.LineId,\n error: errorMessage,\n hasError:\n (!shouldSkipStockCheck && props.isStockCheckEnabled ? cartline.Quantity! > (maxQuantity ?? 0) : false) ||\n (!ObjectExtensions.isNullOrUndefined(errorMessage) && !StringExtensions.isNullOrEmpty(errorMessage)),\n cartline: (\n \n ),\n pickUpInStore: product\n ? PickUpInStore({\n storeSelectorModuleId,\n cartState: props.cartState,\n cartline,\n product,\n shipitText: props.shipItText,\n pickUpInStoreText: props.pickitUpText,\n changeStoreText: props.changeStoreText,\n storeSelectorStateManager: props.storeSelectorStateManager,\n orgUnitLocations: props.orgUnitLocations,\n deliveryOptions: productPickUpOptions,\n pickupDeliveryModeCode:\n cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\n retailMulitplePickupFeatureState: props.retailMulitplePickupFeatureState,\n channelDeliveryOptionConfig: props.channelDeliveryOptionConfig,\n locationChangedHandler: props.locationChangedHandler\n })\n : undefined,\n remove: (\n \n ),\n addToWishlist:\n isAuthenticated && product && !isCustomPriceSelected ? (\n \n ) : (\n undefined\n ),\n addToOrderTemplate:\n isAuthenticated && orderTemplates && product ? (\n \n ) : (\n undefined\n )\n };\n};\n\nexport const assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[] | null => {\n const reactNodes: ICartlinesViewProps[] = [];\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n\n // check if cartlineitem is pickup item\n const isPickUpItem = isCartLineItemPickUpType(\n cartline,\n props.retailMulitplePickupFeatureState,\n props.channelDeliveryOptionConfig,\n props.pickupDeliveryModeCode\n );\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n if (!props.shouldIgnoreWarehouse && isPickUpItem) {\n // check warehouse only if siteBuilder setting is not \"Based on aggregate for shipping and pickup warehouses\" and cartlineitem is pickupitem\n return (\n productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\n productAvailability.InventLocationId?.toUpperCase() === cartline.WarehouseId?.toUpperCase()\n );\n }\n return productAvailability.ProductAvailableQuantity.ProductId === cartline.ProductId;\n });\n }\n\n let productPickUpOptions;\n if (props.productPickUpOptions !== undefined && ArrayExtensions.hasElements(props.productPickUpOptions)) {\n productPickUpOptions = props.productPickUpOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, productPickUpOptions));\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n * @param props\n */\nexport const CartLineItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return assembleCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelConfiguration, ChannelDeliveryOptionConfiguration } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport interface IOrderSummaryProps {\n subTotalLabel: string;\n shippingLabel: string;\n taxLabel: string;\n orderTotalLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n totalDiscountsLabel: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n id: string;\n typeName: string;\n otherChargeLabel?: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isTaxIncludedInPrice?: boolean;\n isShowTaxBreakup?: boolean;\n customerAccountLabel?: string;\n}\n\nexport interface IOrderSummaryLines {\n subtotal: React.ReactNode;\n shipping?: React.ReactNode;\n otherCharge?: React.ReactNode;\n tax: React.ReactNode;\n orderTotal: React.ReactNode;\n totalDiscounts?: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n customerAccount?: React.ReactNode;\n}\n\ninterface IOrderSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n priceCurrency?: string;\n}\n\ninterface IShippingOrderLine {\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n canShip?: boolean;\n hasDeliveryMethod?: boolean;\n hasShippingMethod?: boolean;\n freightFee?: number;\n}\n\nconst OrderSummaryLine: React.FC = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel,\n priceCurrency\n}) => {\n return (\n

\n {label}\n {price || price === 0 ? (\n \n ) : (\n {toBeCalculatedText}\n )}\n

\n );\n};\n\nconst _buildOrderSummarySection = (\n props: IOrderSummaryProps,\n price: number | undefined,\n cssLabel: string,\n label: string = ''\n): React.ReactNode => {\n return (\n \n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computedCustomerAccountAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.customerAccountAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nconst getDeliveryConfiguration = (\n cart: Cart,\n channelConfiguration: ChannelConfiguration,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n retailMultiplePickUpOptionEnabled?: boolean,\n isTaxIncludedInPrice?: boolean,\n isShowTaxBreakup?: boolean\n): IShippingOrderLine => {\n const pickupDeliveryModeCode = channelConfiguration && channelConfiguration.PickupDeliveryModeCode;\n const emailDeliveryModeCode = channelConfiguration && channelConfiguration.EmailDeliveryModeCode;\n const cartLines = cart.CartLines || [];\n const deliveryModes = cartLines.map(cartLine => cartLine.DeliveryMode);\n const taxOnShippingCharge = cart.TaxOnShippingCharge !== undefined ? cart.TaxOnShippingCharge : 0;\n const shippingChargeAmount = cart.ShippingChargeAmount !== undefined ? cart.ShippingChargeAmount : 0;\n\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True shippingChargeAmount\n // True True shippingChargeAmount\n // True false shippingChargeAmount + taxOnShippingCharge\n // if either of isTaxIncludedInPrice or isShowTaxBreakup is undefined then we will execute old logic\n let freightFee: number | undefined = 0;\n if (isTaxIncludedInPrice === undefined || isShowTaxBreakup === undefined) {\n freightFee = cart.ShippingChargeAmount;\n } else {\n freightFee = isTaxIncludedInPrice && !isShowTaxBreakup ? shippingChargeAmount + taxOnShippingCharge : cart.ShippingChargeAmount;\n }\n const canShip = deliveryModes.some(\n deliveryMode =>\n !(\n deliveryMode !== '' &&\n (deliveryMode ===\n getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) ||\n deliveryMode === emailDeliveryModeCode)\n )\n );\n const hasDeliveryMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== emailDeliveryModeCode);\n const hasShippingMethod = deliveryModes.some(\n deliveryMode =>\n !!deliveryMode &&\n deliveryMode !==\n getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) &&\n deliveryMode !== emailDeliveryModeCode\n );\n return {\n canShip,\n hasDeliveryMethod,\n hasShippingMethod,\n freightFee\n } as IShippingOrderLine;\n};\n\nconst getDeliveryMode = (\n deliveryMode?: string,\n featureSate: boolean = false,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n pickupDeliveryMode?: string\n) => {\n if (!featureSate) {\n return pickupDeliveryMode;\n }\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === deliveryMode);\n};\n\n// eslint-disable-next-line complexity\nexport const OrderSummary = (props: IOrderSummaryProps) => {\n const {\n SubtotalAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n SubtotalAmountWithoutTax,\n TaxAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n TaxOnNonShippingCharges,\n DiscountAmount = 0,\n TotalAmount,\n OtherChargeAmount\n } = props.cart;\n\n const { canShip, hasDeliveryMethod, hasShippingMethod, freightFee } = getDeliveryConfiguration(\n props.cart,\n props.channelConfiguration,\n props.channelDeliveryOptionConfig,\n props.retailMultiplePickUpOptionEnabled,\n props.isTaxIncludedInPrice,\n props.isShowTaxBreakup\n );\n\n let reactNodes: IOrderSummaryLines;\n // if either of isTaxIncludedInPrice or isShowTaxBreakup is undefined then we will execute old logic\n if (props.isTaxIncludedInPrice === undefined || props.isShowTaxBreakup === undefined) {\n reactNodes = {\n subtotal: _buildOrderSummarySection(props, SubtotalAmount, 'sub-total', props.subTotalLabel),\n tax: _buildOrderSummarySection(props, hasDeliveryMethod ? TaxAmount : undefined, 'tax-amount', props.taxLabel),\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge:\n (OtherChargeAmount && _buildOrderSummarySection(props, OtherChargeAmount, 'other-charges', props.otherChargeLabel)) ||\n undefined\n };\n } else {\n const otherChargeAmount = OtherChargeAmount !== undefined ? OtherChargeAmount : 0;\n const taxOnNonShippingCharges = TaxOnNonShippingCharges !== undefined ? TaxOnNonShippingCharges : 0;\n const isTaxGreaterThanZero = TaxAmount !== undefined && TaxAmount > 0;\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True otherChargeAmount\n // True True otherChargeAmount\n // True false otherChargeAmount+TaxOnNonShippingCharges\n\n const otherChargeAmountTotal =\n props.isTaxIncludedInPrice && !props.isShowTaxBreakup ? otherChargeAmount + taxOnNonShippingCharges : otherChargeAmount;\n\n const subtotalAmountActual = props.isTaxIncludedInPrice && props.isShowTaxBreakup ? SubtotalAmountWithoutTax : SubtotalAmount;\n\n reactNodes = {\n subtotal: _buildOrderSummarySection(props, subtotalAmountActual, 'sub-total', props.subTotalLabel),\n tax: props.isShowTaxBreakup\n ? _buildOrderSummarySection(\n props,\n hasDeliveryMethod || isTaxGreaterThanZero ? TaxAmount : undefined,\n 'tax-amount',\n props.taxLabel\n )\n : '',\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge:\n (OtherChargeAmount && _buildOrderSummarySection(props, otherChargeAmountTotal, 'other-charges', props.otherChargeLabel)) ||\n undefined\n };\n }\n if (canShip) {\n reactNodes.shipping = _buildOrderSummarySection(props, hasShippingMethod ? freightFee : undefined, 'shipping', props.shippingLabel);\n }\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const customerAccountAmount = _computedCustomerAccountAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount - customerAccountAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildOrderSummarySection(props, -loyaltyAmount, 'loyalty', props.loyaltyLabel || 'Loyalty amount');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildOrderSummarySection(props, -giftCardAmount, 'gift-card', props.giftcardLabel || 'Gift card amount');\n }\n\n if (customerAccountAmount > 0) {\n reactNodes.customerAccount = _buildOrderSummarySection(\n props,\n -customerAccountAmount,\n 'customer-credit-amount',\n props.customerAccountLabel || 'Customer Credit amount'\n );\n }\n\n reactNodes.orderTotal = _buildOrderSummarySection(\n { ...props, freeText: undefined },\n totalAmountAfterGiftCard,\n 'total',\n props.orderTotalLabel\n );\n }\n\n if (DiscountAmount > 0) {\n reactNodes.totalDiscounts = _buildOrderSummarySection(props, -DiscountAmount, 'total-discounts', props.totalDiscountsLabel);\n }\n\n return reactNodes;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsRadioButtonProps {\n isChecked: boolean;\n value?: string;\n ariaSetSize: number;\n ariaPosInSet: number;\n ariaLabel?: string;\n telemetryContent?: ITelemetryContent;\n onChange(event: React.ChangeEvent): void;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.isChecked\n * @param root0.value\n * @param root0.ariaSetSize\n * @param root0.ariaPosInSet\n * @param root0.ariaLabel\n * @param root0.telemetryContent\n * @param root0.onChange\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsRadioButton: React.FC = ({\n isChecked,\n value,\n ariaSetSize,\n ariaPosInSet,\n ariaLabel,\n telemetryContent,\n onChange\n}) => {\n if (!value) {\n return null;\n }\n\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.DeliveryOptions);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n\n return (\n \n );\n};\n\nexport default CheckoutDeliveryOptionsRadioButton;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n defaultDataScale,\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeContainerZoomStyle,\n removeInlineZoomStyle,\n SingleSlideCarousel,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\nimport { getAltText, IMediaData } from './utils/helper';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n isMobileImageZoomed?: boolean;\n mediaGalleryItems?: IMediaData[];\n isInitialLoad?: boolean;\n shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement | null;\n callbackToggle?(): void;\n callbackThumbnailClick?(index: number): void;\n callbackThumbnailKeyDown?(index: number): void;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems {\n items: ItemType[];\n keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map = new Map();\n\n private readonly fullScreenOverlayButtonRef: React.RefObject = React.createRef();\n private readonly player: React.RefObject = React.createRef();\n\n private mediaGalleryImages: IImageData[] = [];\n\n private fallbackImage?: string;\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly _zoomedImageSettings: IImageSettings;\n\n public constructor(props: IMediaGalleryProps) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n this.state = {\n activeIndex: 0,\n animating: false,\n isImageZoomed: false,\n modalIsOpen: false,\n isInitialLoad: true,\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation\n };\n\n this._zoomedImageSettings =\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public async componentDidMount(): Promise {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n this._setRenderType();\n if (!this.props.context.request.app?.config?.OmniChannelMedia) {\n if (source === imageSource.pageContext) {\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocationsForSelectedVariant.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n const product = this.props.data.product.result;\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant\n );\n\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n }\n }\n\n reaction(\n () => {\n const product = this.props.data.product.result;\n if (!product) {\n return null;\n }\n\n if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\n return `${product.RecordId}`;\n }\n\n return `${product.RecordId}-${product.productVariant.RecordId}`;\n },\n async () => {\n const product = this.props.data.product.result;\n let images: IImageData[] = [];\n if (product) {\n if (this.props.context.app?.config?.OmniChannelMedia) {\n images = await getProductImages(\n product.RecordId,\n this.shouldUseCmsAltText(),\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n product.Name,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n } else {\n images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n }\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n },\n { fireImmediately: true }\n );\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n }\n }\n\n public shouldComponentUpdate(nextProps: IMediaGalleryProps, nextState: IMediaGalleryState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const { id, config, resources } = this.props;\n\n const { className, showPaginationTooltip } = config;\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n if (this.props.data.product.result) {\n this.fallbackImage = getFallbackImageUrl(\n this.props.data.product.result.ItemId,\n this.props.context.request.apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\n }\n if (this.props.config.skipImageValidation && !this.state.mediaGalleryItems && this.state.isInitialLoad) {\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(\n this.props.context.actionContext.requestContext,\n this.shouldUseCmsAltText(),\n this.props.data.product.result?.Name,\n mediaLocation.AltText\n )\n };\n });\n const curatedImages = this.props.config.images ?? [];\n this.mediaGalleryImages = [...this._filterMasterImageFromVariant(images), ...curatedImages];\n }\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n callbackToggle: this.openModalDialog,\n callbackThumbnailClick: this._generateOnThumbnailClick,\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryCarouselItems.items,\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n indicatorAriaText: resources.ariaLabelForSlide,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: mediaGalleryCarouselItems.keys\n } as IComponentNodeProps,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n } as IComponentNodeProps,\n items: mediaGalleryThumbnailCarouselItems.items\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Zoomed out image on previous/next click.\n */\n public updateZoomedInImage(): void {\n this.setState({ isImageZoomed: false });\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n /**\n * On click next in carousel.\n */\n private readonly next = (): void => {\n removeInlineZoomStyle();\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n\n this.updateZoomedInImage();\n };\n\n /**\n * On click previous in carousel.\n */\n private readonly previous = (): void => {\n removeInlineZoomStyle();\n const images = this.state.mediaGalleryItems;\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n this.updateZoomedInImage();\n };\n\n private readonly goToIndex = (index: number): void => {\n const { autoplay } = this.props.config;\n const currentIndex = this.state.activeIndex;\n const mediaItems = this.state.mediaGalleryItems;\n if (autoplay && mediaItems) {\n if (mediaItems[`${index}`]?.mediaTypeValue === MediaType.Video) {\n this.player.current?.play();\n } else if (mediaItems[`${currentIndex}`].mediaTypeValue === MediaType.Video) {\n this.player.current?.pause();\n }\n }\n this.setState({ activeIndex: index });\n };\n\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n const defaultKey = 0;\n return {\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\n keys: ['empty']\n };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n return this.getVideoThumbNailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n } else {\n return this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n }\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const galleryImageSettings = this.props.config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n return this._renderCarouselItemImageView(\n zoomView,\n item,\n galleryImageSettings ?? this.defaultGalleryImageSettings,\n index\n );\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private async _setImages(images?: IMediaData[]): Promise {\n const curatedImage = this.props.config.images || [];\n const mediaToSet: IMediaData[] = this._filterMasterImageFromVariant(images);\n\n void Promise.all(\n mediaToSet.map(async mediaData => {\n if (mediaData.mediaTypeValue === MediaType.Video && mediaData.src) {\n try {\n const url = new URL(mediaData.src);\n const videoId = url.searchParams.get('CVID');\n if (videoId) {\n mediaData.videoData = await getVideoMetadataFromApi(videoId, this.props.context.actionContext);\n }\n } catch (error) {\n if (this.props.telemetry) {\n this.props.telemetry.debug('Error while fetching videoId');\n }\n }\n }\n return mediaData;\n })\n ).then(mediaData => {\n const mediaItems = mediaData.filter(element => {\n return (\n element.mediaTypeValue !== MediaType.Video ||\n (element.mediaTypeValue === MediaType.Video && element.videoData !== undefined)\n );\n });\n\n this.setState({\n mediaGalleryItems: [...mediaItems, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n });\n\n this.setState({\n mediaGalleryItems: [...mediaToSet, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n }\n\n private _setRenderType(): void {\n this.setState({\n isInitialLoad: false\n });\n }\n\n private _renderCarouselItemImageView(\n zoomView: string,\n media: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode {\n if (media.mediaTypeValue === MediaType.Video) {\n if (isInPopup || zoomView !== 'fullscreen') {\n return <>{this._renderCarouselItemVideo(media, index, imageSettings)};\n }\n return <>{this._renderVideoThumbnail(media, index, imageSettings)};\n } else {\n if (this.isMobile()) {\n if (isInPopup) {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n switch (zoomView) {\n case 'container': {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'inline': {\n return this._renderImageInlineOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'fullscreen': {\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n // No default\n }\n return <>{this._getCarouselItem(media, imageSettings, index, isInPopup)};\n }\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n const itemId = this.props.data.product.result?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n variantImages = variantImages.filter(item => {\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\n return !isApplicableForChildEntities;\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _renderCarouselItemVideo = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = this.props.config as IPlayerOptions;\n const playerResources = this.props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n const attributes = {\n id: `${this.props.id}__carousel-item__${index}`\n };\n return (\n \n );\n }\n return this._renderEmptyImage(imageSettings);\n };\n\n private readonly _getCarouselItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode => (\n \n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Gets the video thumbnail item to display media gallery.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render video.\n */\n private readonly getVideoThumbNailItem = (\n mediaData: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Ref Handler.\n * @param index -Remove item click function.\n * @returns Set inline zoom.\n */\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n this._inlineZoomDivRef.set(index, divRef);\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n \n \n \n \n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\n }\n\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent) {\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n if (!this.state.isMobileImageZoomed) {\n const bounds = target.getBoundingClientRect();\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n const positionX = event.clientX - bounds.left;\n const positionY = event.clientY - bounds.top;\n const scaledPositionX = positionX * dataScale;\n const scaledPositionY = positionY * dataScale;\n\n target.style.transform = `scale(${dataScale})`;\n target.classList.add(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = 'auto';\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n this.setState({\n isMobileImageZoomed: true\n });\n } else {\n target.style.transform = '';\n target.classList.remove(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = '';\n this.setState({\n isMobileImageZoomed: false\n });\n }\n }\n\n private _onInlineImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n \n
\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n
\n {}\n \n
\n
\n );\n }\n\n /**\n * Render the video thumbnail in full screen.\n * @param mediaData - Media Data.\n * @param index - Index\n * @param imageSettings - Image settings.\n * @returns - JSX.Element\n */\n private readonly _renderVideoThumbnail = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return (\n
\n \n
\n {}\n \n
\n
\n );\n };\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl ?? ''\n };\n }\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n
\n \n
\n );\n }\n\n private _getEmptyThumbnailItem(\n imageSettings: IImageSettings | undefined,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: 'empty',\n 'aria-label': '',\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => {\n const images = this.state.mediaGalleryItems;\n return images && this.state.activeIndex === images.length - 1;\n };\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n this.fullScreenOverlayButtonRef.current?.focus();\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n removeContainerZoomStyle();\n }\n\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\n ),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: false,\n keyboard: false,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n isDisabledFunctionality: this.state.isMobileImageZoomed\n } as IComponentNodeProps;\n const carousel = ;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel,\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n\n private shouldUseCmsAltText = (): boolean => {\n if (this.props.config.altTextSource === 'product') {\n return false;\n } else {\n return true;\n }\n };\n}\n\nexport default MediaGallery;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n ActiveCartProductsInput,\n QueryResultSettingsProxy,\n buildCacheKey,\n getActiveCartProductsAction\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Input class for pickup delivery options for items in cart.\n */\nexport class ProductPickUpOptionsForCartLineItems implements IActionInput {\n public readonly apiSettings: ICommerceApiSettings;\n\n public constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => buildCacheKey('ActiveCartLineItemsPickUpOptions', this.apiSettings);\n\n /**\n * Get Cachetype Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'ActiveCartLineItemsPickUpOptions';\n\n /**\n * Get Cachetype.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the GetPickUpOptionCartLineItems method.\n * @param inputData - The input data passed to the createInput method.\n * @returns - Input for data action.\n */\nconst createInput = (inputData: ICreateActionContext>) => {\n return new ProductPickUpOptionsForCartLineItems(inputData.requestContext.apiSettings);\n};\n\n/**\n * The action method for the GetPickUpOptionCartLineItems data action.\n * @param input - The action input.\n * @param context - The action context.\n * @returns - Order Template object.\n */\nexport async function getPickUpOptionsForCartLineItems(\n input: ProductPickUpOptionsForCartLineItems,\n context: IActionContext\n): Promise {\n // If no input is provided fail out\n if (!input.apiSettings.channelId) {\n throw new Error('[getPickUpOptionsForCartLineItems]No valid Input was provided, failing');\n }\n const cartState = await getCartState(context);\n const cart = cartState.cart;\n const products = await getActiveCartProductsAction(new ActiveCartProductsInput(), context);\n const filterOption = 4;\n const response: ProductDeliveryOptions[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code.\n if (cart === undefined || !ArrayExtensions.hasElements(products)) {\n return Promise.resolve(response);\n }\n\n const pickupoptions = await ProductsDataActions.getDeliveryOptionsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n products.map(product => product.RecordId),\n {},\n filterOption\n );\n\n return pickupoptions;\n}\n\n/**\n * The GetPickupOptionCartLineItems Data Action\n * Returns pickup options.\n */\nexport const getPickUpOptionsForCartLineItemsDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-pickup-options-for-cartlines',\n action: getPickUpOptionsForCartLineItems as IAction,\n input: createInput\n});\n\nexport default getPickUpOptionsForCartLineItemsDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport groupBy from 'lodash/groupBy';\n\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './cart-line-items';\n\nconst _assembleGroupCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (!products || products.length === 0) {\n props.context.telemetry.error('Products content is empty, module wont render');\n return null;\n }\n\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\n const groupDelivery = getGroupByDelivery(cartlines);\n const cartLinesGroup: CartLine[] = [];\n\n // 1) Group by store and pick up mode\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-expect-error\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\n });\n\n // 2) Create cartlines group\n Object.keys(cartLinesGroup).forEach(key => {\n const cartLines = cartLinesGroup[key];\n Object.keys(cartLines).forEach(index => {\n const cartLine = cartLines[index];\n const carLineViewProps = assembleCartlines(cartLine, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n });\n });\n\n return reactNodes;\n};\n\nconst _assembleGroupInvoiceCartlines = (\n cartLines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (cartLines && cartLines.length > 0) {\n // Create invoice cartLines group\n const carLineViewProps = assembleCartlines(cartLines, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n }\n return reactNodes;\n};\n\n/**\n * CartLine Group component.\n * @param props\n */\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\n const { products, cartlines, hasInvoiceLine } = props;\n return hasInvoiceLine\n ? _assembleGroupInvoiceCartlines(cartlines, products, props)\n : _assembleGroupCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IPromotionData entity interface.\n */\nexport interface IPromotionData {\n promotionOptions?: CartPromotionLine[];\n}\n\n/**\n * Calls the Retail API and returns a promotion data.\n * @param ctx\n */\nexport async function getPromotionData(ctx: IActionContext): Promise {\n const promotionData: IPromotionData = {};\n\n await getPromotionOptionsForCartLineItems(new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(promotionOptions => {\n if (promotionOptions) {\n promotionData.promotionOptions = promotionOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n return {};\n });\n\n return promotionData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n IAddToOrderTemplateDialogResources,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n ILinesAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult,\n PromoCodeComponent,\n SaveCartToOrderTemplateComponent\n} from '@msdyn365-commerce/components';\nimport MsDyn365, { getCatalogId, getUrlSync, IImageSettings, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, CartLine, CartLineValidationResultsByLineId, LineValidationResult } from '@msdyn365-commerce/retail-proxy';\nimport { FeatureState, ProductDeliveryOptions, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport {\n ActiveCartProductsInput,\n ArrayExtensions,\n getActiveCartProductsAction,\n ICartLineInventoryValidationResult,\n ObjectExtensions,\n validateCartLinesInventory,\n ProductPickUpOptionsForCartLineItems,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n TelemetryConstant,\n Waiting,\n updateMaxQuantityForCartLineItem,\n urlCheck\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\nimport { getPickUpOptionsForCartLineItems } from './actions/get-pickup-options-for-cartlines';\n\nimport { ICartData } from './cart.data';\nimport { ICartProps, ICartResources } from './cart.props.autogenerated';\nimport { CartLineGroupItems } from './components/cart-line-groups';\nimport { CartLineItems, ICartlinesViewProps } from './components/cart-line-items';\nimport { cartPromotions, ICartLineItemViewProps } from './components/cart-line-items-promotion';\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-cart';\n\n/**\n * Cart view props interface.\n */\nexport interface ICartViewProps extends ICartProps {\n className: string;\n title?: React.ReactNode;\n CartlinesWrapper: INodeProps;\n cartlines?: ICartlinesViewProps[];\n cartLinesGroup?: ICartlinesViewProps[][];\n cart: ICartState | undefined;\n orderSummaryHeading: React.ReactNode;\n orderSummaryLineitems?: IOrderSummaryLines;\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\n OrderSummaryWrapper: INodeProps;\n OrderSummaryItems: INodeProps;\n OrderSummaryErrors?: IOrderSummaryErrors;\n checkoutAsGuestButton: React.ReactNode;\n checkoutAsSignInUserButton: React.ReactNode;\n storeSelector?: React.ReactNode;\n expressCheckoutButton?: React.ReactNode[];\n ExpressCheckoutSectionWrapper: INodeProps;\n backToShoppingButton: React.ReactNode;\n waitingComponent: React.ReactNode;\n promotionOptions?: ICartLineItemViewProps;\n promoCode: React.ReactNode;\n cartLoadingStatus: string;\n cartDataResult: boolean;\n multiplePickUpEnabled?: boolean;\n createTemplateFromCartButton: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n}\n\n/**\n * Order summary errors interface.\n */\nexport interface IOrderSummaryErrors {\n Wrapper: INodeProps;\n header: React.ReactNode;\n errors: React.ReactNode[];\n}\n\n/**\n * Cart component state interface.\n */\ninterface ICartComponentState {\n showPromotionDialog: boolean;\n cartlinesErrors: CartLineValidationResultsByLineId;\n promotionData: IPromotionData;\n isCartValid: boolean;\n productPickUpOptions?: ProductDeliveryOptions[];\n}\n\n/**\n * Cart component.\n * @extends {React.PureComponent>}\n */\n@observer\nclass Cart extends React.Component> {\n public state: ICartComponentState;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n private isQuantityLimitsFeatureEnabled: boolean = false;\n\n private _isMounted: boolean = false;\n\n private readonly promotionPopupId: string = 'cart-promotion-popup';\n\n public constructor(props: ICartProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\n\n this.state = {\n showPromotionDialog: false,\n promotionData: {},\n isCartValid: true,\n productPickUpOptions: undefined,\n cartlinesErrors: {}\n };\n }\n\n /**\n * Component did mount function.\n */\n public async componentDidMount(): Promise {\n this._isMounted = true;\n const {\n config,\n context: { actionContext }\n } = this.props;\n\n this.isQuantityLimitsFeatureEnabled =\n (await this.getOrderQuantityLimitsFeatureFlag()) || (await this._isChannelLimitsFeatureEnabled());\n if (this.isQuantityLimitsFeatureEnabled) {\n await this.validateCart();\n }\n\n if (config.showAvailablePromotions) {\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n }\n );\n }\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n const input = new ProductPickUpOptionsForCartLineItems(actionContext.requestContext.apiSettings);\n this.setState({ productPickUpOptions: await getPickUpOptionsForCartLineItems(input, actionContext) });\n }\n }\n );\n }\n\n /**\n * Component will unmount function.\n */\n public componentWillUnmount(): void {\n this._isMounted = false;\n }\n\n /**\n * Should component update function.\n * @param nextProps - Next props.\n * @param nextState - Next state.\n * @returns True if component should update, false otherwise.\n */\n public shouldComponentUpdate(nextProps: ICartProps, nextState: ICartComponentState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n /* eslint-disable complexity -- Disabling complexity for render method */\n public render(): JSX.Element | null {\n const {\n data: {\n cart: { result: cart },\n products: { result: products }\n },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n resources\n } = this.props;\n\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n const checkoutURL = this.getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n const cartLines = this._getCartLines();\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.props.data.productAvailabilites.result ?? [],\n this.props.context.actionContext,\n products ?? [],\n emailDeliveryModeCode\n );\n\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const { featureState } = this.props.data;\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n const currentCatalogId = getCatalogId(this.props.context.request);\n validateCatalogId(currentCatalogId);\n const cartLinesGroup = cart?.hasInvoiceLine || multiplePickUpEnabled ? this.getCartLinesGroup() : null;\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n\n // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\n if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\n if (multiplePickUpEnabled && cartLinesGroup !== null) {\n for (const cartLineGroup of cartLinesGroup) {\n this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\n }\n }\n\n this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\n }\n\n const viewProps = {\n ...this.props,\n className: classnames('ms-cart'),\n title:

{resources.cartTitle}

,\n cart: this.props.data.cart.result,\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\n OrderSummaryWrapper: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary-wrapper' : 'msc-order-summary-wrapper' },\n OrderSummaryItems: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary__items' : 'msc-order-summary__items' },\n cartlines: cartLines,\n cartLinesGroup,\n promoCode: this._getPromoCode(),\n promotionOptions: this._getPromotions(),\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry: this.props.telemetry,\n id: this.props.id,\n multiplePickUpEnabled,\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\n cart?.hasInvoiceLine ? (\n

{resources.invoiceSummaryTitle}

\n ) : (\n

{resources.orderSummaryTitle}

\n )\n ) : null,\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\n checkoutAsSignInUserButton: !isCartEmpty ? (\n \n {resources.checkoutButtonTitle}\n \n ) : null,\n checkoutAsGuestButton:\n !isCartEmpty && !isAuthenticated && this.props.config.showGuestCheckoutButton ? (\n \n {resources.guestCheckoutButtonTitle}\n \n ) : null,\n expressCheckoutButton: !isCartEmpty ? this.props.slots.paymentExpress : null,\n ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\n backToShoppingButton: (\n \n {resources.backToShoppingButtonTitle}\n \n ),\n createTemplateFromCartButton:\n this._displayAddCartToTemplate() && products ? (\n \n ) : null,\n checkoutBlockedDueToUnavailableFunds: null,\n storeSelector:\n this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n waitingComponent: ,\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\n telemetryContent: this.telemetryContent\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n /* eslint-enable complexity -- Disabling complexity for render method */\n\n /**\n * Promotion click event handler.\n * @param event - The mouse event.\n */\n private readonly promotionLinkClick = (event: React.MouseEvent) => {\n this.setState({\n showPromotionDialog: !this.state.showPromotionDialog\n });\n };\n\n /**\n * Promotion close button click.\n */\n private readonly promotionCloseButtonclick = () => {\n this._hidePromotionDialog();\n };\n\n /**\n * Hide promotion dialog.\n */\n private _hidePromotionDialog(): void {\n this.setState({\n showPromotionDialog: false\n });\n }\n\n /**\n * Display add to cart template.\n * @returns True if should display, false otherwise.\n */\n private _displayAddCartToTemplate(): boolean {\n const cart = this.props.data.cart?.result;\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\n return false;\n }\n\n if (\n isChannelTypeB2B(this.props.context.actionContext.requestContext) &&\n this.props.data.orderTemplates.result &&\n ArrayExtensions.hasElements(cart.cart?.CartLines) &&\n this.props.data.customerInformation.result\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Get promotions.\n * @returns React node with the promotions.\n */\n private _getPromotions(): React.ReactNode {\n return (\n this.props.config.showAvailablePromotions &&\n cartPromotions({\n id: this.promotionPopupId,\n showPromotionPopup: this.state.showPromotionDialog,\n onSeeAllClick: this.promotionLinkClick,\n onCloseButtonClick: this.promotionCloseButtonclick,\n promotions: this.state.promotionData.promotionOptions,\n resources: {\n promotionStringHeading: this.props.resources.promotionStringHeading,\n promotionLinkText: this.props.resources.promotionLinkText,\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\n }\n })\n );\n }\n\n /**\n * Add error message in cart line in case the quantity exceeds the current inventory.\n * @param cartLines - The cart lines.\n * @param cartLineInventoryValidationResult - The cart line inventory result.\n */\n private _updateCartLineErrorForInvalidInventory(\n cartLines: ICartlinesViewProps[] | null,\n cartLineInventoryValidationResult: ICartLineInventoryValidationResult\n ) {\n const { resources } = this.props;\n\n if (\n ArrayExtensions.hasElements(cartLines) &&\n !cartLineInventoryValidationResult.isValid &&\n ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)\n ) {\n for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\n const cartLine = cartLines?.find(element => element.data?.cartline.ProductId === productIdWithError);\n if (cartLine) {\n cartLine.error = resources.outOfStockErrorMessage;\n cartLine.hasError = true;\n }\n }\n }\n }\n\n /**\n * Get order summary errors.\n * @param cartLines - The cart lines.\n * @returns Order summary errors.\n */\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\n const allErrors =\n (cartLines &&\n cartLines\n .map(cartline => {\n // Check if the product is service or not by product type\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\n\n if (!isServiceItem && cartline.error) {\n const fullError =\n cartline.data && cartline.data.product?.Name\n ? `${cartline.data.product.Name}: ${cartline.error}`\n : cartline.error;\n\n return (\n
\n {fullError}\n
\n );\n }\n\n return null;\n })\n .filter((line): line is JSX.Element => !!line)) ||\n [];\n\n return {\n Wrapper: {\n tag: Alert,\n className: 'msc-alert',\n isOpen: allErrors.length > 0,\n color: 'danger',\n assertive: true,\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\n },\n header: (\n \n ),\n errors: allErrors\n };\n }\n\n /**\n * Gets invoice summary line items.\n * @returns Invoice summary lines.\n */\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart }\n },\n telemetry,\n resources\n } = this.props;\n\n return cart?.hasInvoiceLine\n ? InvoiceSummary({\n orderTotalLabel: resources.totalAmountLabel,\n invoiceLabel: resources.invoiceLabel,\n cart: cart.cart,\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry,\n id: this.props.id\n })\n : undefined;\n }\n\n /**\n * Gets order summary line items.\n * @returns Order summary lines.\n */\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart },\n channelDeliveryOptionConfig\n },\n telemetry,\n resources\n } = this.props;\n\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const featureState = this.props?.data?.featureState;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\n ?.IsEnabled;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const isShowOrHideTaxEnabled = this.props.context.request.app.config?.isEnableShowOrHideSalesTaxECommerceEnabled === true;\n\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine\n ? OrderSummary({\n cart: cart!.cart,\n subTotalLabel: resources.itemsWithCountLabel,\n shippingLabel: resources.estimatedShippingLabel,\n otherChargeLabel: resources.otherCharges,\n taxLabel: resources.estimatedTaxLabel,\n orderTotalLabel: resources.orderTotal,\n totalDiscountsLabel: resources.totalDiscountsLabel,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n toBeCalculatedText: resources.yetToBeCalculatedText,\n freeText: resources.priceFree,\n channelConfiguration,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\n telemetry,\n isTaxIncludedInPrice: cart!.cart.IsTaxIncludedInPrice,\n isShowTaxBreakup: isShowOrHideTaxEnabled\n })\n : undefined;\n }\n\n /**\n * Gets promo code.\n * @returns React node with the promo code.\n */\n private _getPromoCode(): React.ReactNode {\n const {\n data: {\n cart: { result: cart }\n },\n resources\n } = this.props;\n\n return (\n cart && (\n \n )\n );\n }\n\n /**\n * Generate add to order template dialog resources.\n * @param resources - The resources.\n * @returns IAddToOrderTemplateDialogResources.\n */\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n }\n\n /**\n * Generate item added to order template dialog resources.\n * @param resources - The resources.\n * @returns IItemAddedToOrderTemplateDialogResources.\n */\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.freePriceText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n }\n\n /**\n * Generate lines added to order template dialog resources.\n * @param resources - The resources.\n * @returns ILinesAddedToOrderTemplateDialogResources.\n */\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICartResources): ILinesAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\n };\n }\n\n /**\n * Generate duplicate items when adding to order template dialog resources.\n * @param resources - The resources.\n * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\n */\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources: ICartResources\n ): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n }\n\n /**\n * Generate order template name dialog resources.\n * @param resources - The resources.\n * @returns IOrderTemplateNameDialogResources.\n */\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n /**\n * Gets the cart lines view props.\n * @returns ICartlinesViewProps [].\n */\n private _getCartLines(): ICartlinesViewProps[] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n this.props.data.featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled ||\n false;\n return ArrayExtensions.hasElements(cart?.cart.CartLines)\n ? CartLineItems({\n cartlines: cart!.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n productAvailability: this.props.data.productAvailabilites,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n\n /**\n * Gets the checkout URL.\n * @param isAuthenticated - Is authenticated flag.\n * @param guestCheckoutUrl - Guest checkout URL.\n * @param signInUrl -The sign in URL.\n * @returns The checkout URL.\n */\n private getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Gets the image settings.\n * @param imageSettings - Image settings.\n * @returns IImageSettings.\n */\n private readonly getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return (\n imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n }\n );\n };\n\n /**\n * Remove item from cart handler.\n * @param cartlineToRemove - The cart line to remove.\n */\n private readonly removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result\n .removeCartLines(input)\n .then(() => {\n this.validateCart().catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n /**\n * Move to wish list handler.\n * @param result - The wish list action success result.\n * @param cartline - The cart line.\n */\n private readonly moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\n if (result.status === 'ADDED' && cartline) {\n this.removeItemFromCartHandler(cartline);\n }\n };\n\n /**\n * Updates the cart line quantity.\n * @param cartlineToUpdate - The cart line.\n * @param quantity - The quantity.\n * @param lineIndex - The line index.\n * @returns True if the cart line was updated, false otherwise.\n */\n private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\n cartLineQuantityUpdatedAsync(\n this.isQuantityLimitsFeatureEnabled,\n this.props.data.cart.result,\n this.props.telemetry,\n this.props.data.products.result,\n cartlineToUpdate,\n quantity\n )\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\n if (cartActionResult?.status === 'SUCCESS') {\n this.validateCart().catch(error => {\n this.props.telemetry.warning((error as Error).message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n\n return true;\n }\n\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\n // Show update line error message.\n const lineUpdateFailure: LineValidationResult = {\n LineId: ObjectExtensions.isNullOrUndefined(cartlineToUpdate.LineId) ? '0' : cartlineToUpdate.LineId,\n ValidationFailures: [\n {\n ErrorContext: ArrayExtensions.hasElements(cartActionResult.validationResults)\n ? cartActionResult.validationResults[0].ErrorContext\n : '',\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\n }\n ]\n };\n\n this.setState({\n cartlinesErrors: { ValidationResultsPairs: [lineUpdateFailure] }\n });\n }\n\n return false;\n })\n .catch(() => {\n return false;\n });\n\n return false;\n };\n\n /**\n * Fulfillment store id is updated.\n */\n private readonly fulfillmentStoreIdUpdated = () => {\n if (this.isQuantityLimitsFeatureEnabled) {\n // Refresh products (in props.data) based on latest cart.\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\n .then(async () => this.validateCart())\n .catch((error: Error) => {\n this.props.telemetry.warning(error.message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n }\n };\n\n /**\n * Validates cart.\n * @returns Void promise.\n */\n private async validateCart(): Promise {\n if (!this.isQuantityLimitsFeatureEnabled) {\n this.setState({ isCartValid: true });\n return AsyncResult.resolve();\n }\n\n const {\n data: { cart },\n telemetry,\n context\n } = this.props;\n\n const validationResults: CartLineValidationResultsByLineId | undefined = await validateCartAsync(cart, telemetry, context, true);\n\n if (validationResults) {\n const isValid = !ArrayExtensions.hasElements(validationResults.ValidationResultsPairs);\n this.setState({\n cartlinesErrors: validationResults,\n isCartValid: isValid\n });\n } else {\n this.setState({ isCartValid: true });\n }\n\n return AsyncResult.resolve();\n }\n\n /**\n * Get order quantity limit feature flag.\n * @returns True if flag is enabled, false otherwise.\n */\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n try {\n const customerInfo = await this.props.data.customerInformation;\n return (\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n return false;\n }\n }\n\n private async _isChannelLimitsFeatureEnabled(): Promise {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled;\n\n return isChannelLimitsFeatureEnabledInHq ?? false;\n }\n\n /**\n * Gets the cart lines group.\n * @returns ICartlinesViewProps [][].\n */\n private getCartLinesGroup(): ICartlinesViewProps[][] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const { featureState } = this.props.data;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n return this.props.data.products &&\n (cart?.hasInvoiceLine || this.props.data.products.result) &&\n cart &&\n cart.cart.CartLines &&\n cart.cart.CartLines.length > 0 &&\n this.props.data.channelDeliveryOptionConfig?.result\n ? CartLineGroupItems({\n cartlines: cart.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n hasInvoiceLine: cart?.hasInvoiceLine || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n productAvailability: this.props.data.productAvailabilites,\n productPickUpOptions: this.state.productPickUpOptions || this.props.data.cartLinesPickUpOptions?.result,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n}\n\nexport default Cart;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n commerceApiRequest,\n commerceVideoMetadataRequest,\n getCatalogId,\n IActionContext,\n IImageData,\n IImageSettings,\n IVideoData\n} from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n getMediaLocationsForSelectedVariant,\n MediaLocationsForSelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getAltText } from './helper';\n\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\n const imageData: IImageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n if (mediaLocation.IsApplicableForChildEntities) {\n imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\n }\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n return new Promise<[IImageData, boolean]>(resolve => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageData.src!, true);\n\n http.addEventListener('load', () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n });\n\n http.addEventListener('error', () => {\n resolve([imageData, false]);\n });\n\n http.send();\n } catch {\n resolve([imageData, false]);\n }\n });\n}\n\nexport async function getValidProductImages(\n productId: number,\n channelId: number,\n actionContext: IActionContext,\n imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n });\n }\n\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\n/**\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\n * @param productId Product record id.\n * @param shouldUseCmsAltText Alt-text source to use.\n * @param channelId Current channel id.\n * @param actionContext Current action context.\n * @param productName Product name.\n * @param selectedProduct Currently selected variant product.\n * @returns List of images.\n */\n\nexport async function getProductImages(\n productId: number,\n shouldUseCmsAltText: boolean,\n channelId: number,\n actionContext: IActionContext,\n productName?: string,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n if (actionContext.requestContext?.params?.isPreview) {\n const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\n productId: productId,\n channelId: channelId,\n catalogId: catalogId\n });\n if (response.status !== 200) {\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\n return [];\n }\n const previewImageData = response?.data as MediaLocation[];\n if (previewImageData) {\n return previewImageData.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n }\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\nexport async function validateProductImages(\n mediaLocations: MediaLocation[],\n actionContext: IActionContext,\n imageSettings: IImageSettings\n): Promise {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate product images');\n return [];\n });\n}\n\n/**\n * GetVideoMetadataFromAPI - Makes API call to get video metadata.\n * @param videoId: Video Id\n * @param actionContext: Action context\n * @returns: Returns the meta data of the video.\n */\nexport async function getVideoMetadataFromApi(videoId: string, actionContext: IActionContext): Promise {\n let videoPlayerData: IVideoData | undefined;\n if (videoId) {\n const response = await commerceVideoMetadataRequest(actionContext.requestContext, [videoId]);\n\n if (response.status !== 200) {\n actionContext.telemetry.debug(`Unable to get video metadata for videoId: ${videoId}`);\n return;\n }\n\n const videoData = response.data as [];\n if (videoData && ArrayExtensions.hasElements(videoData)) {\n videoPlayerData = videoData[0];\n }\n }\n return videoPlayerData;\n}\n","/* eslint-disable no-duplicate-imports */\r\nimport { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { MediaLocation } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport async function getValidProductImages(productId: number, channelId: number, actionContext: IActionContext, imageSettings: IImageSettings): Promise {\r\n const actionInput = new MediaLocationsForSelectedVariantInput(\r\n productId,\r\n channelId,\r\n );\r\n\r\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n .then(mediaLocations => {\r\n if (mediaLocations) {\r\n return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\r\n .then(pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n });\r\n }\r\n\r\n return [];\r\n }).catch(error => {\r\n actionContext.telemetry.exception(error);\r\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\r\n return [];\r\n });\r\n}\r\n\r\nexport async function validateProductImages(mediaLocations: MediaLocation[], actionContext: IActionContext, imageSettings: IImageSettings): Promise {\r\n return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\r\n .then(pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n }).catch(error => {\r\n actionContext.telemetry.exception(error);\r\n actionContext.telemetry.debug('Unable to validate prodcut images');\r\n return [];\r\n });\r\n}\r\n\r\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation, imageSettings: IImageSettings): Promise<[IImageData, boolean]> {\r\n const imageData = {\r\n src: mediaLocation.Uri || '',\r\n altText: mediaLocation.AltText || ''\r\n };\r\n\r\n const imageSettingsVal = ((imageSettings.viewports?.lg!.q!).replace(/['\"]+/g, ''));\r\n\r\n if (imageData.src === '') {\r\n return [imageData, false];\r\n }\r\n\r\n const imageConcatVal = `${imageData.src}` + `&` + `${imageSettingsVal}`;\r\n\r\n return new Promise<[IImageData, boolean]>((resolve) => {\r\n try {\r\n const http = new XMLHttpRequest();\r\n http.open('HEAD', imageConcatVal, true);\r\n\r\n http.onload = () => {\r\n resolve([imageData, http.status === 200 || http.status === 201]);\r\n };\r\n\r\n http.onerror = () => {\r\n resolve([imageData, false]);\r\n };\r\n\r\n http.send();\r\n } catch (e) {\r\n resolve([imageData, false]);\r\n }\r\n });\r\n}\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* eslint-disable no-duplicate-imports */\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\r\n\r\nimport {\r\n IComponentNodeProps,\r\n ImagefullView,\r\n IModalViewProps,\r\n IModuleProps,\r\n inlineZoomImageOnHover,\r\n inlineZoomImageOnMouseMove,\r\n inlineZoomImageOnMouseOut,\r\n inlineZoomInit,\r\n INodeProps,\r\n ISingleSlideCarouselProps,\r\n KeyCodes,\r\n NodeTag,\r\n onContainerZoomInit,\r\n onMouseMoveLensContainer,\r\n onMouseOutLensContainer,\r\n onMouseOverImageContainer,\r\n removeInlineZoomStyle,\r\n SingleSlideCarousel\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n//@ts-ignore\r\nimport { imageSource, imageZoom, ICittaMediaGalleryData, ICittaMediaGalleryProps, thumbnailsOrientation } from '@msdyn365-commerce-modules/media-gallery';\r\nimport { getValidProductImages, validateProductImages } from './utils';\r\n\r\nexport interface IMediaGalleryState {\r\n animating: boolean;\r\n activeIndex: number;\r\n mediaGalleryItems: IImageData[] | undefined;\r\n isImageZoomed: boolean;\r\n modalIsOpen: boolean;\r\n lastUpdate?: number;\r\n}\r\n\r\nexport interface IMediaGalleryThumbnailsViewProps {\r\n ThumbnailsContainerProps: INodeProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n items?: IMediaGalleryThumbnailItemViewProps[];\r\n}\r\n\r\nexport interface IMediaGalleryThumbnailItemViewProps {\r\n ThumbnailItemContainerProps: INodeProps;\r\n Picture: React.ReactElement;\r\n}\r\n\r\nexport interface IMediaGalleryViewProps extends ICittaMediaGalleryProps {\r\n state: IMediaGalleryState;\r\n MediaGallery: IModuleProps;\r\n CarouselProps: INodeProps;\r\n Thumbnails: IMediaGalleryThumbnailsViewProps;\r\n Modal?:React.ReactElement|null;\r\n}\r\n\r\n/**\r\n * Media gallery component\r\n */\r\nclass MediaGallery extends React.Component, IMediaGalleryState> {\r\n private _inlineZoomDivRef: Map = new Map();\r\n private readonly defaultGalleryImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\r\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\r\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n private readonly defaultThumbnailImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\r\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n constructor(props: ICittaMediaGalleryProps) {\r\n super(props);\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this.state = { activeIndex: 0, animating: false, mediaGalleryItems: undefined, isImageZoomed: false, modalIsOpen:false };\r\n\r\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\r\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\r\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\r\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\r\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n const source = this.props.config.imageSource || imageSource.pageContext;\r\n const curatedImage = this.props.config.images || [];\r\n\r\n if (source === imageSource.pageContext) {\r\n reaction(\r\n () => (this.props.data.product.result ? this.props.data.product.result.RecordId : null),\r\n async () => {\r\n if (this.props.data.product.result) {\r\n const images = await getValidProductImages(\r\n this.props.data.product.result.RecordId,\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\r\n );\r\n this.setState({\r\n mediaGalleryItems: [...images, ...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: [...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n }\r\n }\r\n );\r\n }\r\n\r\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\r\n const images = await validateProductImages(\r\n this.props.data.mediaLocations.result,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\r\n );\r\n this.setState({\r\n mediaGalleryItems: [...images, ...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n } else if (source === imageSource.pageContext && this.props.data.product.result) {\r\n const images = await getValidProductImages(\r\n this.props.data.product.result.RecordId,\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\r\n );\r\n\r\n this.setState({\r\n mediaGalleryItems: [...images, ...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: [...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n id,\r\n config,\r\n resources\r\n } = this.props;\r\n\r\n const mediaGalleryItems = this.state.mediaGalleryItems;\r\n const { className, showPaginationTooltip } = config;\r\n const galleryImageSettings = config.galleryImageSettings;\r\n if(galleryImageSettings) {\r\n galleryImageSettings.cropFocalRegion = true;\r\n }\r\n const thumbnailImageSettings = config.thumbnailImageSettings;\r\n if(thumbnailImageSettings) {\r\n thumbnailImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\r\n const allowFullscreen:boolean = config.allowFullScreen || false;\r\n const zoomViewMode: string =\r\n config.imageZoom === imageZoom.inline\r\n ? imageZoom.inline\r\n : config.imageZoom === imageZoom.container\r\n ? imageZoom.container\r\n : '';\r\n const zoomView = allowFullscreen ? 'fullscreen': zoomViewMode;\r\n\r\n const viewProps: IMediaGalleryViewProps = {\r\n ...(this.props as ICittaMediaGalleryProps),\r\n state: this.state,\r\n MediaGallery: {\r\n moduleProps: this.props,\r\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\r\n },\r\n Modal: allowFullscreen ? this.imageModalSlider(zoomViewMode): null,\r\n CarouselProps: {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items:\r\n mediaGalleryItems &&\r\n mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(zoomView, item, galleryImageSettings || this.defaultGalleryImageSettings, index)),\r\n activeIndex: this.state.activeIndex,\r\n next: this.next,\r\n previous: this.previous,\r\n interval: false,\r\n directionTextPrev: resources.previousScreenshotFlipperText,\r\n directionTextNext: resources.nextScreenshotFlipperText,\r\n onIndicatorsClickHandler: this.goToIndex,\r\n showPaginationTooltip: showPaginationTooltip === true,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting,\r\n key: this.state.lastUpdate\r\n } as IComponentNodeProps,\r\n Thumbnails: {\r\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\r\n SingleSlideCarouselComponentProps: {\r\n tag: SingleSlideCarousel,\r\n className: 'ms-media-gallery__thumbnails',\r\n vertical: isVertical,\r\n flipperPrevLabel: resources.previousScreenshotFlipperText,\r\n flipperNextLabel: resources.nextScreenshotFlipperText,\r\n parentId: id,\r\n useTabList: true,\r\n key: this.state.lastUpdate\r\n } as IComponentNodeProps,\r\n items:\r\n mediaGalleryItems &&\r\n mediaGalleryItems.map((item: IImageData, index: number) => this._getThumbnailItem(item, thumbnailImageSettings || this.defaultThumbnailImageSettings, index, this.state.activeIndex))\r\n }\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private onExiting = () => {\r\n this.setState({ animating: true });\r\n };\r\n\r\n private onExited = () => {\r\n this.setState({ animating: false });\r\n };\r\n\r\n private next = (): void => {\r\n if (this.isLastItem() === undefined) {\r\n return;\r\n }\r\n\r\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private previous = (): void => {\r\n const nextIndex = this.isFirstItem()\r\n ? this.state.mediaGalleryItems\r\n ? this.state.mediaGalleryItems.length - 1\r\n : 0\r\n : this.state.activeIndex - 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private goToIndex = (index: number): void => {\r\n this.setState({ activeIndex: index });\r\n };\r\n\r\n private _renderCarouselItemImageView(zoomView: string, image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n if (zoomView === 'container') {\r\n return this._renderImageInContainerOnZoom(image, imageSettings, index);\r\n } else if (zoomView === 'inline') {\r\n return this._renderImageInlineOnZoom(image, imageSettings, index);\r\n } else if (zoomView === 'fullscreen') {\r\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\r\n } else {\r\n return {this._getCarouselItem(image, imageSettings, index)};\r\n }\r\n }\r\n\r\n private _getCarouselItem = (image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode => (\r\n \r\n );\r\n\r\n private _getThumbnailItem = (image: IImageData, imageSettings: IImageSettings, index: number, modifiedActiveIndex: number): IMediaGalleryThumbnailItemViewProps => {\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: index,\r\n 'aria-label': image.altText,\r\n 'aria-selected': modifiedActiveIndex === index,\r\n 'aria-controls': `${this.props.id}__carousel-item__${index}`,\r\n onClick: this._generateOnThumbnailClick(index),\r\n onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n };\r\n\r\n private _generateOnThumbnailKeyDown = (index: number) => {\r\n return (event: React.KeyboardEvent) => {\r\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\r\n event.preventDefault();\r\n\r\n this.goToIndex(index);\r\n }\r\n };\r\n };\r\n\r\n private _generateOnThumbnailClick = (index: number) => {\r\n return (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n\r\n this.goToIndex(index);\r\n };\r\n };\r\n\r\n private _renderImageInlineOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\r\n return (\r\n // tslint:disable-next-line: react-this-binding-issue\r\n
this._inlineZoomDivRef.set(index, divRef!)} data-scale={this.props.config.dataScale}>\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\r\n inlineZoomImageOnHover(event, this.props.config.dataScale);\r\n }\r\n\r\n private _onInlineImageClick(event: React.MouseEvent): void {\r\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\r\n return;\r\n }\r\n\r\n inlineZoomInit(event, this.props.config.dataScale);\r\n this.setState({\r\n isImageZoomed: true\r\n });\r\n }\r\n\r\n private _onImageMouseOut(event: React.MouseEvent): void {\r\n inlineZoomImageOnMouseOut(event);\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n\r\n }\r\n\r\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\r\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\r\n return;\r\n }\r\n\r\n onContainerZoomInit(event);\r\n\r\n this.setState({\r\n isImageZoomed: true\r\n });\r\n }\r\n\r\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\r\n onMouseOutLensContainer(event);\r\n\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n }\r\n\r\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\r\n return (\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n private _mapProductToImageData(product: SimpleProduct): IImageData {\r\n return {\r\n src: product.PrimaryImageUrl || ''\r\n };\r\n }\r\n\r\n private isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n private isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\r\n\r\n private openModalDialog = (): void => {\r\n this._toggleModal();\r\n }\r\n\r\n private _toggleModal(): void {\r\n if (this.state.modalIsOpen) {\r\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\r\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\r\n const image = parentDiv.children[1].querySelector('img');\r\n if (image) {\r\n image.removeAttribute('style');\r\n }\r\n }\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n }\r\n this.setState({\r\n isImageZoomed: false,\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n removeInlineZoomStyle();\r\n }\r\n\r\n private imageModalSlider=(ZoomView:string):React.ReactElement => {\r\n const {\r\n data: {\r\n product: { result: product }\r\n },\r\n resources,\r\n config\r\n } = this.props;\r\n let mediaGalleryItems = this.state.mediaGalleryItems;\r\n\r\n if (!mediaGalleryItems && product) {\r\n mediaGalleryItems = [this._mapProductToImageData(product)];\r\n }\r\n\r\n const galleryImageSettings = config.galleryImageSettings;\r\n if(galleryImageSettings) {\r\n galleryImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n const carouselprops = {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items:\r\n mediaGalleryItems &&\r\n mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(ZoomView, item, galleryImageSettings || this.defaultGalleryImageSettings, index)),\r\n activeIndex: this.state.activeIndex,\r\n next: this.next,\r\n previous: this.previous,\r\n interval: false,\r\n directionTextPrev: resources.previousScreenshotFlipperText,\r\n directionTextNext: resources.nextScreenshotFlipperText,\r\n onIndicatorsClickHandler: this.goToIndex,\r\n showPaginationTooltip: true,\r\n hideIndicator: true,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting,\r\n } as IComponentNodeProps;\r\n\r\n const carousel = ;\r\n\r\n const imageModalSliderProps:IModalViewProps = {\r\n modalIsOpen:this.state.modalIsOpen,\r\n ontoggle:this._toggleModal,\r\n galleryCarousel: carousel\r\n };\r\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\r\n }\r\n}\r\n\r\nexport default MediaGallery;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { format } from '@msdyn365-commerce-modules/utilities';\r\nimport { getUrlSync, IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nexport interface ICartIconData {\r\n cart: ICartState;\r\n}\r\n\r\nexport interface ICartIconComponentProps extends IComponentProps {\r\n className?: string;\r\n cartLabel: string;\r\n}\r\n\r\nexport interface ICartIconComponent extends IComponent {\r\n}\r\n\r\nconst CartIconComponentActions = {\r\n};\r\n\r\ninterface ICartIconState {\r\n countChanged: boolean;\r\n}\r\n\r\ninterface ICartLineData{\r\n quantity?: number;\r\n price?: number;\r\n item?: string;\r\n }\r\n\r\n/**\r\n *\r\n * CartIcon component\r\n * @extends {React.FC}\r\n */\r\n@observer\r\nclass CartIcon extends React.Component {\r\n private cartItemCount: string | undefined;\r\n\r\n constructor(props: ICartIconComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n countChanged: false\r\n };\r\n }\r\n public render(): JSX.Element {\r\n const { cartLabel, data: { cart } } = this.props;\r\n\r\n if (!cart) {\r\n return (\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n const cartLink = getUrlSync('cart', this.props.context.actionContext);\r\n\r\n const cartItem = `${this._getCartLineQuantities(cart.cart)}`;\r\n\r\n const label = format(cartLabel, cartItem) || `Shopping bag, ${cartItem} items`;\r\n\r\n if (!this.state.countChanged && this.cartItemCount && this.cartItemCount < cartItem) {\r\n this.setState({\r\n countChanged: true\r\n });\r\n // tslint:disable-next-line: no-floating-promises\r\n this._resetClass();\r\n }\r\n this.cartItemCount = cartItem;\r\n const hiddenCartLines = this._createHiddenCartLines(cart.cart);\r\n return (\r\n \r\n
\r\n ({cartItem})\r\n
\r\n {hiddenCartLines}\r\n
\r\n );\r\n }\r\n\r\n private _timeout(ms: number): Promise {\r\n // tslint:disable-next-line: no-string-based-set-timeout\r\n return new Promise(res => setTimeout(res, ms));\r\n }\r\n\r\n private async _resetClass(): Promise {\r\n await this._timeout(1500);\r\n this.setState({\r\n countChanged: false\r\n });\r\n return;\r\n }\r\n\r\n private _getCartLineQuantities = (cart: Cart | undefined): string => {\r\n if(!cart) {\r\n return '0';\r\n }\r\n\r\n let quantity = 0;\r\n\r\n if(cart.CartLines && cart.CartLines.length > 0) {\r\n cart.CartLines.forEach(cartLine => {\r\n quantity += cartLine.Quantity || 1;\r\n });\r\n }\r\n\r\n return quantity.toString();\r\n }\r\n\r\n private _createHiddenCartLines = (cart: Cart | undefined): any => {\r\n if (!cart || !cart.CartLines?.length) {\r\n return
;\r\n }\r\n\r\n let cartLines: ICartLineData[] = [];\r\n\r\n cart.CartLines?.forEach(line => {\r\n cartLines.push({\r\n quantity: line.Quantity,\r\n price: line.Price,\r\n item: line.ItemId\r\n });\r\n });\r\n\r\n return
;\r\n }\r\n}\r\n\r\n// @ts-ignore\r\nexport const CartIconComponent: React.FunctionComponent = msdyn365Commerce.createComponent(\r\n 'CartIcon',\r\n { component: CartIcon, ...CartIconComponentActions }\r\n);","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsErrorMessageProps {\n message?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.message\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsErrorMessage: React.FC = ({ message }) => {\n if (!message) {\n return null;\n }\n\n return

{message}

;\n};\n\nexport default CheckoutDeliveryOptionsErrorMessage;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ActiveCartProductsInput,\n getActiveCartProductsAction,\n getAvailabilitiesForCartLineItems,\n getDeliveryOptionsForCartLineItems,\n IProductInventoryInformation,\n ProductAvailabilitiesForCartLineItems,\n ProductDeliveryOptionsForCartLineItems\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IMiniCartData entity interface.\n */\nexport interface IMiniCartData {\n products?: SimpleProduct[];\n productAvailabilites?: IProductInventoryInformation[];\n deliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport const createInput = () => {\n return new ActiveCartProductsInput();\n};\n\n/**\n * Calls the Retail API and returns a mini cart data.\n * @param ctx\n * @param cartState\n */\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise {\n const miniCartData: IMiniCartData = {};\n\n const cart = cartState.cart;\n\n // If there are cart lines, make call to get products\n // If there are invocie linese, then there is no products, so don't make call to get products\n if (cart && cart.CartLines && cart.CartLines.length > 0 && !cartState.hasInvoiceLine) {\n await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx)\n .then(products => {\n if (products) {\n miniCartData.products = products;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getAvailabilitiesForCartLineItems(new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(availableQuantity => {\n if (availableQuantity) {\n miniCartData.productAvailabilites = availableQuantity;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getDeliveryOptionsForCartLineItems(new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(deliveryOptions => {\n if (deliveryOptions) {\n miniCartData.deliveryOptions = deliveryOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n }\n\n return miniCartData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartBehavior, CartIconComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n CartLineValidationResultsByLineId,\n OrgUnitLocation\n} from '@msdyn365-commerce/retail-proxy';\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { ArrayExtensions, validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n ITelemetryContent,\n TelemetryConstant,\n UncontrolledTooltip,\n updateMaxQuantityForCartLineItem,\n urlCheck\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport { ICartIconData } from './cart-icon.data';\nimport { cartLinesSortOrder, ICartIconProps } from './cart-icon.props.autogenerated';\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\n\nexport interface IMiniCartState {\n miniCartData: IMiniCartData;\n orgUnitLocations?: OrgUnitLocation[];\n isQuantityLimitsFeatureEnabled: boolean;\n isCartValid: boolean;\n}\n\nexport interface ICartIconViewProps extends ICartIconProps {\n className: string;\n cartIcon: React.ReactNode;\n FlyoutContainer?: INodeProps;\n CartlinesWrapper: INodeProps;\n miniCartWrapper: INodeProps;\n miniCartItemWrapper: INodeProps;\n cartlines?: IFlyoutCartLineItemViewProps[];\n flyoutTitle: React.ReactNode;\n totalPrice: React.ReactNode;\n checkoutAsGuestButton?: React.ReactNode;\n checkoutAsSignInUserButton?: React.ReactNode;\n goToCartButton?: React.ReactNode;\n waitingComponent?: React.ReactNode;\n isCartLoading: boolean;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\n/**\n *\n * Cart component.\n * @extends {React.PureComponent>}\n */\n@observer\nclass CartIcon extends React.Component, IMiniCartState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly checkoutBySignInAttributes: IDictionary | undefined;\n\n private readonly checkoutByGuestAttributes: IDictionary | undefined;\n\n private readonly viewShoppingBagAttributes: IDictionary | undefined;\n\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n private lastValidatedCartVersion: number | undefined;\n\n constructor(props: ICartIconProps) {\n super(props);\n this.state = {\n miniCartData: {},\n isCartValid: true,\n isQuantityLimitsFeatureEnabled: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\n this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\n this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n }\n\n public async componentDidMount(): Promise {\n const context = this.props.context.actionContext;\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n this.setState({\n miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\n });\n }\n );\n await this._setQuantityLimitsFeatureFlag();\n\n this.setState({\n orgUnitLocations: this.props.data.orgUnitLocations?.result\n });\n\n this._validateCart();\n }\n\n public componentDidUpdate(prevProps: ICartIconProps): void {\n this._validateCart();\n }\n\n public shouldComponentUpdate(nextProps: ICartIconProps, nextState: IMiniCartState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n config: { enableHoverCart, isAnonymousCheckout },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n context,\n resources\n } = this.props;\n\n const cart = (this.props.data.cart && this.props.data.cart.result) || undefined;\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\n const shouldShowMiniCart =\n cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\n const hasInvoiceLine = cart?.hasInvoiceLine;\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const cartLines = this._getCartLines();\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.state.miniCartData.productAvailabilites ?? [],\n this.props.context.actionContext,\n this.state.miniCartData.products ?? [],\n emailDeliveryModeCode\n );\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\n const totalItemsInCart = cart?.totalItemsInCart ? cart.totalItemsInCart : 0;\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', totalItemsInCart.toString());\n const flyoutTitle = resources.flyoutTitle;\n const flyoutTooltip = {\n tag: UncontrolledTooltip,\n shouldShowMiniCart,\n placement: 'bottom-end',\n hideArrow: true,\n className: 'ms-cart-icon__flyout-container',\n trigger: 'hover',\n displayMode: 'FLYOUT',\n target: id,\n shouldShowCloseButton: true,\n cartPageUrl: cartUrl,\n hideAriaHidden: true\n };\n\n // If there are invoice lines, don't update mini cart price\n const price = (cart && !cart.hasInvoiceLine && cart.cart.TotalAmount) || undefined;\n const priceString = price\n ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price))\n : '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.find(\n feature => feature.Name === multiplePickupStoreSwitchName\n )?.IsEnabled;\n\n const viewProps = {\n ...this.props,\n cartIcon: (\n \n ),\n cartlines: cartLines,\n FlyoutContainer: includeFlyout ? flyoutTooltip : undefined,\n CartlinesWrapper: {\n className: 'ms-cart-icon__cart-lines'\n },\n miniCartWrapper: {\n className: classnames('ms-cart-icon'),\n id: this.props.id\n },\n miniCartItemWrapper: {\n className: classnames('msc-cart-lines-item')\n },\n\n // If there are invoice lines, don't update mini cart checkout button\n // Checkout button will display by default to maintain backward compatibility. When Anonymous user checkout is enabled &&\n // user is authenticated then we will show the checkout button otherwise we will show the guest checkout button.\n checkoutAsSignInUserButton:\n !isCartEmpty && !hasInvoiceLine && (!isAnonymousCheckout || isAuthenticated) ? (\n \n {resources.checkoutButtonTitle}\n \n ) : null,\n checkoutAsGuestButton:\n isAnonymousCheckout && !isCartEmpty && !isAuthenticated ? (\n \n {resources.guestCheckoutButtonTitle}\n \n ) : null,\n goToCartButton: (\n \n {goToCartButtonText}\n \n ),\n checkoutBlockedDueToUnavailableFunds: null,\n flyoutTitle: {flyoutTitle},\n totalPrice:
{priceString}
\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _validateCart(): void {\n const {\n data: { cart }\n } = this.props;\n const cartVersion = cart.result?.cart?.Version ?? undefined;\n if (this.lastValidatedCartVersion === cartVersion) {\n return;\n }\n\n this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\n\n if (this.state.isQuantityLimitsFeatureEnabled) {\n validateCartAsync(cart, this.props.telemetry, this.props.context)\n .then((result: CartLineValidationResultsByLineId | undefined) => {\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result?.ValidationResultsPairs) });\n })\n .catch(() => {\n this.setState({ isCartValid: false });\n });\n } else {\n this.setState({ isCartValid: true });\n }\n }\n\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Sort cartline items.\n * @param cartlines - Cartlines to be sorted.\n * @param sortOrder - Ascending or descending.\n * @returns - Sorted cartlines.\n */\n private readonly getSortedCartLines = (cartlines: CartLine[], sortOrder?: cartLinesSortOrder): CartLine[] => {\n const lines: CartLine[] = [...cartlines];\n const zero: number = 0;\n\n if (sortOrder === cartLinesSortOrder.descending) {\n return lines.sort((item1, item2) => (item2.LineNumber ?? zero) - (item1.LineNumber ?? zero));\n }\n return lines.sort((item1, item2) => (item1.LineNumber ?? zero) - (item2.LineNumber ?? zero));\n };\n\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\n const {\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n const cart = this.props.data.cart && this.props.data.cart.result;\n\n // Cart-icon could be placed in each page\n // so we check cart content to reduce number of RS calls\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0\n ? FlyoutCartLineItems({\n cartlines: this.getSortedCartLines(cart.cart.CartLines, config.cartLinesSortOrder),\n products: this.state.miniCartData.products,\n productAvailabilites: this.state.miniCartData.productAvailabilites,\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\n imageSettings,\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n quantityDisplayString: resources.quantityDisplayText,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n inputQuantityAriaLabel: '', // Not used\n discountStringText: '', // Not used\n originalPriceText: '',\n currentPriceText: '',\n shippingChargesText: '',\n shippingText: resources.shippingText\n },\n telemetry,\n removeButtonText: resources.removeCartButtonText,\n outOfStockText: '', // Not used\n outOfRangeOneText: '', // Not used\n outOfRangeFormatText: '', // Not used\n cartState: cart,\n orgUnitLocations: this.state.orgUnitLocations,\n removeItemClickHandler: this._removeItemFromCartHandler,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n telemetryContent: this.telemetryContent,\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined,\n isQuantityLimitsFeatureEnabled: this.state.isQuantityLimitsFeatureEnabled,\n catalogs: this.props.data.catalogs?.result\n })\n : null;\n }\n\n private readonly _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return (\n imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n }\n );\n };\n\n private readonly _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result.removeCartLines(input).catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n private async _setQuantityLimitsFeatureFlag(): Promise {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n if (isChannelQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n return;\n }\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (!defaultOrderQuantityLimitsFeatureConfig || defaultOrderQuantityLimitsFeatureConfig === 'none') {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n } else {\n this.props.data.customerInformation\n .then(customerInfo => {\n const result =\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n this.setState({ isQuantityLimitsFeatureEnabled: result });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n });\n }\n }\n}\n\nexport default CartIcon;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartViewProps, IOrderSummaryErrors } from './cart';\nimport { ICartlinesViewProps } from './components/cart-line-items';\nimport { ICartLineItemViewProps } from './components/cart-line-items-promotion';\n\nconst _renderCartlines = (\n cartLines: ICartlinesViewProps[] | undefined,\n cartEmptyText: string,\n CartlinesWrapper: INodeProps,\n storeSelector: React.ReactNode | undefined,\n backToShoppingButton: React.ReactNode,\n waitingComponent: React.ReactNode,\n cartLoadingStatus: string,\n cartDataResult: boolean\n): JSX.Element[] | JSX.Element => {\n if (cartLoadingStatus) {\n return <>{cartLoadingStatus};\n }\n if (cartLines) {\n return cartLines.map(cartLine => {\n return (\n
\n {cartLine.cartline}\n {storeSelector && cartLine.pickUpInStore ? (\n {cartLine.pickUpInStore.defaultComponent}\n ) : null}\n {cartLine.addToOrderTemplate ? (\n \n {cartLine.remove}\n {cartLine.addToWishlist}\n {cartLine.addToOrderTemplate}\n \n ) : (\n <>\n {cartLine.remove}\n {cartLine.addToWishlist}\n \n )}\n
\n );\n });\n }\n return cartDataResult ? (\n
\n

{cartEmptyText}

\n {backToShoppingButton}\n
\n ) : (\n <>{waitingComponent}\n );\n};\n\n/**\n * Method will render error block.\n * @param errorData -The order summary errors interface.\n * @returns Jsx element.\n */\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\n return null;\n }\n return (\n \n {errorData.header}\n {errorData.errors}\n \n );\n};\n\n/**\n * Method will render invoice summary lines.\n * @param invoiceSummaryLines -The invoicesummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderInvoiceSummarylines = (\n invoiceSummaryLines: IInvoiceSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!invoiceSummaryLines) {\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\n return null;\n }\n return (\n \n {invoiceSummaryLines.invoices}\n {invoiceSummaryLines.giftCard}\n {invoiceSummaryLines.loyalty}\n {invoiceSummaryLines.orderTotal}\n \n );\n};\n\n/**\n * Method will render order summary lines.\n * @param orderSummaryLines -The ordersummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderOrderSummarylines = (\n orderSummaryLines: IOrderSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!orderSummaryLines) {\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\n return null;\n }\n return (\n \n {props.promoCode}\n {orderSummaryLines.subtotal}\n {orderSummaryLines.shipping}\n {orderSummaryLines.otherCharge}\n {orderSummaryLines.tax}\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\n {orderSummaryLines.orderTotal}\n \n );\n};\n\n/**\n * Method will render cart promotions.\n * @param promotions -The cartline item view props.\n * @returns Jsx element.\n */\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\n return (\n <>\n \n {promotions.promotionMessage}\n {promotions.promotionSeeAllLink}\n {promotions.promotionDialog}\n \n \n );\n};\n\n/**\n * Method will render cartlines group title.\n * @param cartLine -The cartline view props.\n * @param titleSeparate -The title separate.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n return (\n <>\n \n {isBopisSelected ? (\n

\n {cartLine.pickUpInStore?.deliveryOption}\n {titleSeparate}\n {cartLine.pickUpInStore?.orgUnitName}\n

\n ) : null}\n
\n \n );\n};\n\n/**\n * Method will render cartlines groups header title.\n * @param pickUpText -The pickup text for group.\n * @param shippingText -The shipping text for group.\n * @param emailShippingText -The email shipping text for group.\n * @param titleSeparate -The title separator.\n * @param cartLine -The cartline view props.\n * @param emailDeliveryModeCode -The email delivery code from channel.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupHeader = (\n pickUpText: string,\n shippingText: string,\n emailShippingText: string,\n titleSeparate: string,\n cartLine: ICartlinesViewProps,\n emailDeliveryModeCode?: string\n) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n let groupTitle: string;\n\n groupTitle = isBopisSelected ? pickUpText : shippingText;\n if (!StringExtensions.isNullOrEmpty(emailDeliveryModeCode)) {\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\n }\n\n return (\n <>\n
\n

\n

{groupTitle}

\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\n
\n \n );\n};\n\n/**\n * Method will render cartlines in groups.\n * @param props -The cartline.\n * @returns Jsx element.\n */\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\n return (\n
\n {props.cartLinesGroup.map(cartlines => {\n return (\n
\n {renderCartLinesGroupHeader(\n props.resources.pickUpText,\n props.resources.shippingText,\n props.resources.emailshippingText,\n props.resources.titleSeparate,\n cartlines[0],\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\n )}\n {_renderCartlines(\n cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n
\n );\n })}\n
\n );\n }\n return props.cartDataResult ? (\n
\n
\n

{props.resources.emptyCartText}

\n {props.backToShoppingButton}\n
\n
\n ) : (\n <>{props.waitingComponent}\n );\n};\n\nconst CartView: React.FC = (props: ICartViewProps) => (\n
\n {props.title}\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\n {props.multiplePickUpEnabled ? (\n renderCartLinesGroup(props)\n ) : (\n \n {_renderCartlines(\n props.cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n \n )}\n {props.orderSummaryHeading && (\n \n {props.orderSummaryHeading}\n {props.cart?.hasInvoiceLine\n ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\n : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\n {_renderErrorBlock(props.OrderSummaryErrors)}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.expressCheckoutButton && ArrayExtensions.hasElements(props.expressCheckoutButton) ? (\n {props.expressCheckoutButton}\n ) : null}\n {props.backToShoppingButton}\n {props.createTemplateFromCartButton}\n \n )}\n {props.storeSelector}\n
\n);\n\nexport default CartView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IImageData, IRequestContext, IVideoData } from '@msdyn365-commerce/core';\n\nexport enum MediaType {\n /**\n * The None.\n */\n None = 0,\n /**\n * The Image type.\n */\n Image = 1,\n /**\n * The video type.\n */\n Video = 2,\n /**\n * The file type.\n */\n File = 3\n}\n\nexport interface IMediaData extends IImageData {\n mediaTypeValue?: MediaType;\n displayOrder?: number;\n videoData?: IVideoData;\n}\n\n/**\n * Gets correct alt text for image based on configuration of site.\n * @param productName Product name.\n * @param context Current request context.\n * @param imageAltText Alt-text from CMS image.\n */\nexport function getAltText(\n context: IRequestContext,\n shouldUseCmsAltText: boolean,\n productName?: string,\n imageAltText?: string\n): string | undefined {\n if (!context?.app?.config?.OmniChannelMedia) {\n return productName;\n }\n if (shouldUseCmsAltText) {\n return imageAltText;\n }\n return productName;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICheckoutLoyaltyAdd, ICheckoutLoyaltyRewardPoint, ICheckoutLoyaltyShow, ICheckoutLoyaltyViewProps } from './checkout-loyalty';\n\nconst AddCheckoutLoyalty: React.FC = ({\n heading,\n cardNumber,\n drawer,\n rewardPoints,\n loyaltyAmountContainer,\n appliedLoyaltyAmountContainer,\n loyaltyAmountLabel,\n loyaltyAmountInput,\n loyaltyAmountApplyButton,\n showAppliedAmount,\n loyaltyAmountAppliedText,\n loyaltyAmountAppliedPrice,\n loyaltyAmountRemoveButton\n}) => {\n return (\n <>\n {heading}\n {cardNumber}\n \n {rewardPoints.map((rewardPoint: ICheckoutLoyaltyRewardPoint) => {\n return (\n \n {rewardPoint.title}\n {rewardPoint.availablePointsText}\n {rewardPoint.activePoints}\n {rewardPoint.expiringPointsText}\n {rewardPoint.expiringPoints}\n \n );\n })}\n \n \n {loyaltyAmountLabel}\n {loyaltyAmountInput}\n {loyaltyAmountApplyButton}\n {showAppliedAmount && (\n \n {loyaltyAmountAppliedText}\n {loyaltyAmountAppliedPrice}\n {loyaltyAmountRemoveButton}\n \n )}\n \n \n );\n};\n\nconst ShowCheckoutLoyalty: React.FC = ({ heading, coveredAmountText, amount }) => {\n return (\n <>\n {heading}\n {coveredAmountText}\n {amount}\n \n );\n};\n\nconst CheckoutLoyaltyView: React.FC = props => {\n const { checkoutLoyalty, checkoutErrorRef, alert, viewState, showLoyalty, addLoyalty } = props;\n\n return (\n \n {alert}\n {viewState.isShowLoyalty && }\n {viewState.isShowAddLoyalty && }\n \n );\n};\n\nexport default CheckoutLoyaltyView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartIconViewProps } from './cart-icon';\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\n\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\n if (!cartLines) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n return cartLines.map((cartLine, index) => {\n return (\n \n {cartLine.cartline}\n {cartLine.storeLocation}\n {cartLine.remove}\n \n );\n });\n};\n\nconst CartIconView: React.FC = (props: ICartIconViewProps) => (\n \n {props.cartIcon}\n {props.FlyoutContainer ? (\n \n {props.flyoutTitle}\n {props.checkoutBlockedDueToUnavailableFunds}\n {_renderCartlines(props.cartlines, props)}\n {props.totalPrice}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.goToCartButton}\n \n ) : (\n false\n )}\n \n);\n\nexport default CartIconView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport {\n CheckoutModule,\n ErrorCode,\n ErrorLocation,\n ErrorMessageResource,\n getCheckoutState,\n ICheckoutError,\n ICheckoutState\n} from '@msdyn365-commerce/global-state/';\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class -- create global class\nexport class CheckoutErrors {\n public static readonly ActionError: ICheckoutError = {\n errorCode: ErrorCode.ActionError,\n errorMessageResource: ErrorMessageResource.checkoutTimeoutErrorMessage,\n errorLocation: ErrorLocation.Checkout\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_BlockedLoyaltyCard: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_BlockedLoyaltyCard,\n errorMessageResource: ErrorMessageResource.blockedLoyaltyCardErrorMessage,\n errorLocation: ErrorLocation.CheckoutLoyalty\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_CustomerAccountLimitSignDifferentFromAmountDue: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountLimitSignDifferentFromAmountDue,\n errorMessageResource: ErrorMessageResource.customerAccountLimitSignDifferentFromAmountDueErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsAvailableCreditLimit: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsAvailableCreditLimit,\n errorMessageResource: ErrorMessageResource.customerAccountPaymentExceedsAvailableCreditLimitErrorMessage,\n errorLocation: ErrorLocation.Checkout\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsCustomerAccountFloorLimit: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsCustomerAccountFloorLimit,\n errorMessageResource: ErrorMessageResource.customerAccountPaymentExceedsCustomerAccountFloorLimitErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItems: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItems,\n errorMessageResource: ErrorMessageResource.customerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItemsErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentForCustomerWithoutAllowOnAccount: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentForCustomerWithoutAllowOnAccount,\n errorMessageResource: ErrorMessageResource.customerAccountPaymentForCustomerWithoutAllowOnAccountErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentNotAllowedForOpenInvoices: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentNotAllowedForOpenInvoices,\n errorMessageResource: ErrorMessageResource.customerAccountPaymentNotAllowedForOpenInvoicesErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_FraudRisk: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_FraudRisk,\n errorMessageResource: ErrorMessageResource.fraudRiskErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_GiftCardBalanceInquiryFailed: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_GiftCardBalanceInquiryFailed,\n errorMessageResource: ErrorMessageResource.giftCardBalanceInquiryFailedErrorMessage,\n errorLocation: ErrorLocation.CheckoutGiftCard\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_GiftCardCurrencyMismatch: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_GiftCardCurrencyMismatch,\n errorMessageResource: ErrorMessageResource.giftCardCurrencyMismatchErrorMessage,\n errorLocation: ErrorLocation.CheckoutGiftCard\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion,\n errorMessageResource: ErrorMessageResource.invalidCartVersionErrorMessage,\n errorLocation: ErrorLocation.Checkout\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_InvalidLoyaltyCardNumber: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_InvalidLoyaltyCardNumber,\n errorMessageResource: ErrorMessageResource.invalidLoyaltyCardNumberErrorMessage,\n errorLocation: ErrorLocation.CheckoutLoyalty\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest,\n errorMessageResource: ErrorMessageResource.invalidPaymentRequestErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest_Console: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest,\n errorMessageResource: ErrorMessageResource.invalidPaymentRequestConsoleErrorMessage,\n errorLocation: ErrorLocation.Console\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines,\n errorMessageResource: ErrorMessageResource.missingRequiredCartTenderLinesErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountPaymentsNotAllowed: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountPaymentsNotAllowed,\n errorMessageResource: ErrorMessageResource.multipleCustomerAccountPaymentsNotAllowedErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_NoMoreThanOneLoyaltyTender: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_NoMoreThanOneLoyaltyTender,\n errorMessageResource: ErrorMessageResource.noMoreThanOneLoyaltyTenderErrorMessage,\n errorLocation: ErrorLocation.CheckoutLoyalty\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_NoResponseFromGatewayForGiftCardBalanceInquiry: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_NoResponseFromGatewayForGiftCardBalanceInquiry,\n errorMessageResource: ErrorMessageResource.noResponseFromGatewayForGiftCardBalanceInquiryErrorMessage,\n errorLocation: ErrorLocation.CheckoutGiftCard\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_NoTenderLoyaltyCard: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_NoTenderLoyaltyCard,\n errorMessageResource: ErrorMessageResource.noTenderLoyaltyCardErrorMessage,\n errorLocation: ErrorLocation.CheckoutLoyalty\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_NotEnoughRewardPoints: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_NotEnoughRewardPoints,\n errorMessageResource: ErrorMessageResource.notEnoughRewardPointsErrorMessage,\n errorLocation: ErrorLocation.CheckoutLoyalty\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_PaymentAlreadyVoided: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_PaymentAlreadyVoided,\n errorMessageResource: ErrorMessageResource.paymentAlreadyVoidedErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_PaymentAmountExceedsGiftBalance: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_PaymentAmountExceedsGiftBalance,\n errorMessageResource: ErrorMessageResource.paymentAmountExceedsGiftBalanceErrorMessage,\n errorLocation: ErrorLocation.CheckoutGiftCard\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties,\n errorMessageResource: ErrorMessageResource.paymentRequiresMerchantPropertiesErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties_Console: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties,\n errorMessageResource: ErrorMessageResource.paymentRequiresMerchantPropertiesConsoleErrorMessage,\n errorLocation: ErrorLocation.Console\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_PaymentUsingUnauthorizedAccount: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_PaymentUsingUnauthorizedAccount,\n errorMessageResource: ErrorMessageResource.paymentUsingUnauthorizedAccountErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_RefundAmountMoreThanAllowed: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_RefundAmountMoreThanAllowed,\n errorMessageResource: ErrorMessageResource.refundAmountMoreThanAllowedErrorMessage,\n errorLocation: ErrorLocation.CheckoutLoyalty\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePayment: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePayment,\n errorMessageResource: ErrorMessageResource.unableToAuthorizePaymentErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardAdditionalContextRequired: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardAdditionalContextRequired,\n errorMessageResource: ErrorMessageResource.unableToAuthorizePaymentCardAdditionalContextRequiredErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardTypeMissingOrNotSupported: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardTypeMissingOrNotSupported,\n errorMessageResource: ErrorMessageResource.unableToAuthorizePaymentCardTypeMissingOrNotSupportedErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_UnableToCancelPayment: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_UnableToCancelPayment,\n errorMessageResource: ErrorMessageResource.unableToCancelPaymentErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_UnableToReadCardTokenInfo: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_UnableToReadCardTokenInfo,\n errorMessageResource: ErrorMessageResource.unableToReadCardTokenInfoErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_UnableToRetrieveCardPaymentAcceptResult: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_UnableToRetrieveCardPaymentAcceptResult,\n errorMessageResource: ErrorMessageResource.unableToRetrieveCardPaymentAcceptResultErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly checkoutErrorsList: ICheckoutError[] = [\n CheckoutErrors.ActionError,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_BlockedLoyaltyCard,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountLimitSignDifferentFromAmountDue,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsAvailableCreditLimit,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsCustomerAccountFloorLimit,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItems,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentForCustomerWithoutAllowOnAccount,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentNotAllowedForOpenInvoices,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_FraudRisk,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_GiftCardBalanceInquiryFailed,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_GiftCardCurrencyMismatch,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_InvalidLoyaltyCardNumber,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest_Console,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountPaymentsNotAllowed,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_NoMoreThanOneLoyaltyTender,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_NoResponseFromGatewayForGiftCardBalanceInquiry,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_NoTenderLoyaltyCard,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_NotEnoughRewardPoints,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_PaymentAlreadyVoided,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_PaymentAmountExceedsGiftBalance,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties_Console,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_PaymentUsingUnauthorizedAccount,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_RefundAmountMoreThanAllowed,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePayment,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardAdditionalContextRequired,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardTypeMissingOrNotSupported,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_UnableToCancelPayment,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_UnableToReadCardTokenInfo,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_UnableToRetrieveCardPaymentAcceptResult\n ];\n}\n\nexport async function setCheckoutErrors(\n errorCode: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resources: any,\n isExpressCheckoutApplied: boolean,\n ctx: IActionContext,\n apiError?: string | undefined\n): Promise {\n let clientCheckoutError: ICheckoutError | undefined;\n const consoleCheckoutErrors: ICheckoutError[] = [];\n\n const checkoutState: ICheckoutState = await getCheckoutState(ctx).catch((error: Error) => {\n ctx.telemetry.exception(error);\n throw error;\n });\n\n // find the checkout errors\n for (const checkoutError of CheckoutErrors.checkoutErrorsList) {\n if (errorCode === checkoutError.errorCode) {\n if (checkoutError.errorLocation === ErrorLocation.Console) {\n const consoleCheckoutError: ICheckoutError = {\n errorCode: checkoutError.errorCode,\n errorMessageResource: checkoutError.errorMessageResource,\n errorLocation: checkoutError.errorLocation\n };\n consoleCheckoutErrors.push(consoleCheckoutError);\n } else {\n if (clientCheckoutError) {\n ctx.telemetry.exception(new Error('Invalid number of client checkout errors.'));\n throw new Error('Invalid number of client checkout errors.');\n } else {\n clientCheckoutError = {\n errorCode: checkoutError.errorCode,\n errorMessageResource: checkoutError.errorMessageResource,\n errorLocation: checkoutError.errorLocation\n };\n }\n }\n }\n }\n\n // log the console checkout errors\n for (const consoleCheckoutError of consoleCheckoutErrors) {\n consoleCheckoutError.errorMessage = getCheckoutErrorMessage(resources, consoleCheckoutError.errorMessageResource!, apiError!);\n console.log(consoleCheckoutError.errorMessage);\n }\n\n // handle the client checkout error\n if (clientCheckoutError) {\n clientCheckoutError.errorMessage = getCheckoutErrorMessage(resources, clientCheckoutError.errorMessageResource!, apiError!);\n\n if (isExpressCheckoutApplied && clientCheckoutError.errorLocation === ErrorLocation.CheckoutPaymentInstrument) {\n clientCheckoutError.errorLocation = ErrorLocation.Checkout;\n }\n\n await checkoutState.updateCheckoutError({ newCheckoutError: clientCheckoutError });\n await checkoutState.updateShouldFocusOnCheckoutError({ newShouldFocusOnCheckoutError: true });\n } else {\n // if could not map to any checkout error(s), show the API error message over generic error\n if (consoleCheckoutErrors.length === 0) {\n const genericError = {\n errorLocation: ErrorLocation.Checkout\n };\n if (apiError) {\n genericError['errorMessage'] = apiError;\n } else {\n genericError['errorMessage'] = resources.genericErrorMessage;\n }\n\n await checkoutState.updateCheckoutError({ newCheckoutError: genericError });\n await checkoutState.updateShouldFocusOnCheckoutError({ newShouldFocusOnCheckoutError: true });\n }\n }\n}\n\nexport async function focusOnCheckoutError(checkoutErrorRef: React.RefObject, ctx: IActionContext): Promise {\n const checkoutState: ICheckoutState = await getCheckoutState(ctx).catch((error: Error) => {\n ctx.telemetry.exception(error);\n throw error;\n });\n\n checkoutErrorRef.current && checkoutErrorRef.current.scrollIntoView();\n\n await checkoutState.updateCheckoutErrorFocus({ newCheckoutErrorFocus: CheckoutModule.None });\n await checkoutState.updateShouldFocusOnCheckoutError({ newShouldFocusOnCheckoutError: false });\n}\n\nexport async function setCheckoutErrorFocus(checkoutModuleId: string, ctx: IActionContext): Promise {\n const checkoutState: ICheckoutState = await getCheckoutState(ctx).catch((error: Error) => {\n ctx.telemetry.exception(error);\n throw error;\n });\n\n for (const checkoutModule of Object.keys(CheckoutModule)) {\n if (checkoutModuleId.includes(CheckoutModule[checkoutModule])) {\n await checkoutState.updateCheckoutErrorFocus({ newCheckoutErrorFocus: CheckoutModule[checkoutModule] });\n return;\n }\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getCheckoutErrorMessage(resources: any, errorMessageResource: ErrorMessageResource, errorMessageFromAPI: string): string {\n const errorResource = Object.keys(resources).find(resource => resource === errorMessageResource);\n // return API error when error resource string is not found in checkout definition file\n return errorResource !== undefined ? resources[errorResource] : errorMessageFromAPI;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\n/**\n * The payment error.\n */\nexport interface IPaymentError {\n title: string;\n message: string;\n className?: string;\n}\n\n/**\n * The payment error.\n * @param param0 - First param.\n * @param param0.title - Title.\n * @param param0.message - Message.\n * @param param0.className - ClassName.\n * @returns React node.\n */\nexport const ErrorComponent: React.FC = ({ title, message, className = 'ms-checkout-payment-instrument' }) => (\n
\n

{title}

\n

{message}

\n
\n);\n","/* eslint-disable no-duplicate-imports */\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '@msdyn365-commerce-modules/media-gallery';\r\n\r\nconst MediaGalleryView: React.FC = props => {\r\n const {CarouselProps, Thumbnails, MediaGallery, Modal} = props;\r\n\r\n return (\r\n \r\n \r\n {Modal}\r\n {_renderThumbnails(Thumbnails)}\r\n \r\n );\r\n};\r\n\r\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\r\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\r\n\r\n return (\r\n \r\n \r\n {items && items.map(_renderThumbnailItem)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\r\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\r\n\r\n return (\r\n \r\n {Picture}\r\n \r\n );\r\n};\r\n\r\nexport default MediaGalleryView;","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n DeliveryOption,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPickUpInStoreViewProps {\n callbacks: {\n toggleBopis(isBopisSelected: boolean): void;\n };\n defaultComponent?: React.ReactNode;\n orgUnitName?: string;\n isBopisSelected: boolean;\n ContainerProps: INodeProps;\n deliveryOption?: string;\n}\n\nexport interface IPickUpInStoreProps {\n cartline: CartLine;\n product: SimpleProduct;\n shipitText: string;\n pickUpInStoreText: string;\n changeStoreText: string;\n cartState: ICartState | undefined;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n orgUnitLocations?: OrgUnitLocation[] | undefined;\n deliveryOptions?: ProductDeliveryOptions;\n pickupDeliveryModeCode?: string;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n retailMulitplePickupFeatureState?: boolean;\n locationChangedHandler(): void;\n}\n\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\n const _onLocationChangedCallback = async (\n orgUnitLocation: OrgUnitLocation,\n cartState: ICartState | undefined,\n cartline: CartLine,\n deliveryMode?: string\n ) => {\n if (!cartState) {\n return Promise.resolve();\n }\n return cartState\n .updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n };\n\n const _toggleBOPIS = (isBopisSelected: boolean) => {\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\n\n if (isBopisSelected) {\n if (!storeSelectorStateManager) {\n return;\n }\n storeSelectorStateManager\n .openDialog({\n id: storeSelectorModuleId,\n product,\n alreadySelectedLocation: {\n OrgUnitNumber: cartline.FulfillmentStoreId\n },\n deliveryOptions: props.deliveryOptions,\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\n }\n })\n .catch(error => {});\n } else {\n if (!cartState) {\n return;\n }\n cartline.DeliveryMode = '';\n cartline.FulfillmentStoreId = '';\n cartline.ShippingAddress = {};\n cartState\n .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n }\n };\n\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n };\n\n const _renderShippingMethod = (\n cartLine: CartLine,\n shipItText: string,\n pickupInStoretext: string,\n changeStoreText: string,\n orgUnitLocations: OrgUnitLocation[] | undefined\n ): JSX.Element => {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\n const bopisSelected = !!cartLine.FulfillmentStoreId;\n\n const toggleBOPIS = (isBopisSelected: boolean) => {\n return () => {\n _toggleBOPIS(isBopisSelected);\n };\n };\n\n return (\n <>\n \n \n {cartLine.FulfillmentStoreId ? (\n
\n {orgUnitName}\n \n
\n ) : null}\n \n );\n };\n\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\n return delivery?.Description;\n };\n\n /**\n * Method to check if we have atleast one common delivery code between product and channel.\n * @param productdeliveryOptions - Product DeliveryOption List.\n * @param storePickUpOptionList - Channel DeliveryOption List.\n * @returns Boolean flag.\n */\n const matchDeliveryOptions = (\n productdeliveryOptions: DeliveryOption[] | undefined,\n storePickUpOptionList: string[] | undefined\n ): boolean => {\n const deliveryOption: string[] = [];\n productdeliveryOptions?.map(delivery => {\n const pickup = storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code);\n if (pickup) {\n deliveryOption.push(pickup);\n }\n return deliveryOption;\n });\n\n return ArrayExtensions.hasElements(deliveryOption);\n };\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!props.deliveryOptions || !props.deliveryOptions.DeliveryOptions) {\n return undefined;\n }\n\n if (props.retailMulitplePickupFeatureState && props.channelDeliveryOptionConfig) {\n if (!matchDeliveryOptions(props.deliveryOptions.DeliveryOptions, props.channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\n return undefined;\n }\n } else if (\n !props.pickupDeliveryModeCode ||\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)\n ) {\n return undefined;\n }\n\n return {\n callbacks: {\n toggleBopis: _toggleBOPIS\n },\n defaultComponent: _renderShippingMethod(\n props.cartline,\n props.shipitText,\n props.pickUpInStoreText,\n props.changeStoreText,\n props.orgUnitLocations\n ),\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\n ContainerProps: {\n className: 'msc-cart-line__bopis-container'\n }\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyInput {\n className: string;\n type: string;\n value: string | number;\n min: number;\n max: number;\n ariaValueMax: number;\n ariaValueMin: number;\n ariaValueNow: number;\n id: string;\n step: string;\n onChange(event: React.ChangeEvent): void;\n onBlur(event: React.FocusEvent): void;\n}\n\nconst AdressInput: React.FC = ({\n className,\n type,\n value,\n min,\n max,\n step,\n ariaValueMax,\n ariaValueMin,\n ariaValueNow,\n onChange,\n onBlur,\n id\n}) => (\n \n);\n\nexport default AdressInput;\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICartViewProps, IOrderSummaryErrors } from './citta-cart';\r\nimport { ICartlinesViewProps } from './components/citta-cart-line-items';\r\nimport { ICartLineItemViewProps } from './components/citta-cart-line-items-promotion';\r\n\r\nconst _renderCartlines = (\r\n cartLines: ICartlinesViewProps[] | undefined,\r\n cartEmptyText: string,\r\n CartlinesWrapper: INodeProps,\r\n storeSelector: React.ReactNode | undefined,\r\n backToShoppingButton: React.ReactNode,\r\n waitingComponent: React.ReactNode,\r\n cartLoadingStatus: string,\r\n cartDataResult: boolean\r\n): JSX.Element[] | JSX.Element => {\r\n if (cartLoadingStatus) {\r\n return <>{cartLoadingStatus};\r\n }\r\n if (cartLines) {\r\n return cartLines.map(cartLine => {\r\n return (\r\n
\r\n {cartLine.cartline}\r\n {storeSelector && cartLine.pickUpInStore ? (\r\n {cartLine.pickUpInStore.defaultComponent}\r\n ) : null}\r\n {cartLine.addToOrderTemplate ? (\r\n \r\n {cartLine.remove}\r\n {cartLine.addToWishlist}\r\n {cartLine.addToOrderTemplate}\r\n \r\n ) : (\r\n <>\r\n {cartLine.remove}\r\n {cartLine.addToWishlist}\r\n \r\n )}\r\n
\r\n );\r\n });\r\n }\r\n return cartDataResult ? (\r\n
\r\n

{cartEmptyText}

\r\n {backToShoppingButton}\r\n
\r\n ) : (\r\n <>{waitingComponent}\r\n );\r\n};\r\n\r\n/**\r\n * Method will render error block.\r\n * @param errorData -The order summary errors interface.\r\n * @returns Jsx element.\r\n */\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\r\n return null;\r\n }\r\n return (\r\n \r\n {\"Please review cart errors before proceeding to checkout\"}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render invoice summary lines.\r\n * @param invoiceSummaryLines -The invoicesummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderInvoiceSummarylines = (\r\n invoiceSummaryLines: IInvoiceSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!invoiceSummaryLines) {\r\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\r\n return null;\r\n }\r\n return (\r\n \r\n {invoiceSummaryLines.invoices}\r\n {invoiceSummaryLines.giftCard}\r\n {invoiceSummaryLines.loyalty}\r\n {invoiceSummaryLines.orderTotal}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render order summary lines.\r\n * @param orderSummaryLines -The ordersummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderOrderSummarylines = (\r\n orderSummaryLines: IOrderSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\r\n return null;\r\n }\r\n return (\r\n \r\n {props.promoCode}\r\n {orderSummaryLines.subtotal}\r\n {orderSummaryLines.shipping}\r\n {orderSummaryLines.otherCharge}\r\n {orderSummaryLines.tax}\r\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\r\n {orderSummaryLines.orderTotal}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cart promotions.\r\n * @param promotions -The cartline item view props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\r\n return (\r\n <>\r\n \r\n {promotions.promotionMessage}\r\n {promotions.promotionSeeAllLink}\r\n {promotions.promotionDialog}\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines group title.\r\n * @param cartLine -The cartline view props.\r\n * @param titleSeparate -The title separate.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\r\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n return (\r\n <>\r\n \r\n {isBopisSelected ? (\r\n

\r\n {cartLine.pickUpInStore?.deliveryOption}\r\n {titleSeparate}\r\n {cartLine.pickUpInStore?.orgUnitName}\r\n

\r\n ) : null}\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines groups header title.\r\n * @param pickUpText -The pickup text for group.\r\n * @param shippingText -The shipping text for group.\r\n * @param emailShippingText -The email shipping text for group.\r\n * @param titleSeparate -The title separator.\r\n * @param cartLine -The cartline view props.\r\n * @param emailDeliveryModeCode -The email delivery code from channel.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupHeader = (\r\n pickUpText: string,\r\n shippingText: string,\r\n emailShippingText: string,\r\n titleSeparate: string,\r\n cartLine: ICartlinesViewProps,\r\n emailDeliveryModeCode?: string\r\n) => {\r\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n let groupTitle: string;\r\n\r\n groupTitle = isBopisSelected ? pickUpText : shippingText;\r\n if (!StringExtensions.isNullOrEmpty(emailDeliveryModeCode)) {\r\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n

\r\n

{groupTitle}

\r\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines in groups.\r\n * @param props -The cartline.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\r\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\r\n return (\r\n
\r\n {props.cartLinesGroup.map(cartlines => {\r\n return (\r\n
\r\n {renderCartLinesGroupHeader(\r\n props.resources.pickUpText,\r\n props.resources.shippingText,\r\n props.resources.emailshippingText,\r\n props.resources.titleSeparate,\r\n cartlines[0],\r\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\r\n )}\r\n {_renderCartlines(\r\n cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult\r\n )}\r\n
\r\n );\r\n })}\r\n
\r\n );\r\n }\r\n return props.cartDataResult ? (\r\n
\r\n
\r\n

{props.resources.emptyCartText}

\r\n {props.backToShoppingButton}\r\n
\r\n
\r\n ) : (\r\n <>{props.waitingComponent}\r\n );\r\n};\r\n\r\nconst CartView: React.FC = (props: ICartViewProps) => (\r\n
\r\n {props.checkoutBlockedDueToUnavailableFunds}\r\n {props.title}\r\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\r\n {props.multiplePickUpEnabled ? (\r\n renderCartLinesGroup(props)\r\n ) : (\r\n \r\n {_renderCartlines(\r\n props.cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult\r\n )}\r\n \r\n )}\r\n {props.orderSummaryHeading && (\r\n \r\n {props.orderSummaryHeading}\r\n {props.cart?.hasInvoiceLine\r\n ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\r\n : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\r\n {_renderErrorBlock(props.OrderSummaryErrors)}\r\n {props.checkoutAsSignInUserButton}\r\n {props.checkoutAsGuestButton}\r\n {props.expressCheckoutButton && ArrayExtensions.hasElements(props.expressCheckoutButton) ? (\r\n {props.expressCheckoutButton}\r\n ) : null}\r\n {props.backToShoppingButton}\r\n {props.createTemplateFromCartButton}\r\n \r\n )}\r\n {props.storeSelector}\r\n
\r\n);\r\n\r\nexport default CartView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC = props => {\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n return (\n \n \n {Modal}\n {_renderThumbnails(Thumbnails)}\n \n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n \n {items && items.map(_renderThumbnailItem)}\n \n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return {Picture};\n};\n\nexport default MediaGalleryView;\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport interface ILogoProps {\r\n image: Msdyn365.IImageData;\r\n gridSettings?: Msdyn365.IGridSettings;\r\n link?: Msdyn365.ILinkData;\r\n className?: string;\r\n telemetryContent?: ITelemetryContent;\r\n requestContext: Msdyn365.IRequestContext;\r\n}\r\n\r\n// export interface ILinkData {\r\n// // linkUrl: Msdyn365.ILinkData;\r\n// destinationUrl?: string;\r\n// // openInNewTab?: boolean;\r\n// // linkText?: string;\r\n// }\r\n\r\n/**\r\n *\r\n * Logo component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class Logo extends React.PureComponent {\r\n\r\n private attributes?: Msdyn365.IDictionary;\r\n\r\n constructor(props: ILogoProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n public render():JSX.Element {\r\n return(\r\n
\r\n {this._renderLogo(this.props)}\r\n
\r\n );\r\n }\r\n\r\n private _renderLogo(config: ILogoProps):JSX.Element {\r\n if(config.link && config.link.destinationUrl) {\r\n return(\r\n \r\n {this._renderImage(config)}\r\n \r\n );\r\n }\r\n return(\r\n this._renderImage(config)\r\n );\r\n }\r\n\r\n private _renderImage(config: ILogoProps): JSX.Element {\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=132&h=28&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=160&h=48&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default Logo;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { ICittaHeaderResources } from '../citta-header.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: ICittaHeaderResources;\r\n isExpanded: boolean;\r\n targetId: string;\r\n telemetryContent?: ITelemetryContent;\r\n toggleNavBar(): void;\r\n}\r\n\r\n/**\r\n *\r\n * NavIcon component\r\n * @extends {React.PureComponent}\r\n */\r\n\r\n@observer\r\nexport class NavIcon extends React.Component {\r\n\r\n private attributes?: Msdyn365.IDictionary;\r\n\r\n constructor(props: INavIconProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n\r\n public render():JSX.Element {\r\n return (\r\n \r\n );\r\n }\r\n}","// import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { ICittaHeaderData } from '../citta-header.data';\r\nimport { ICittaHeaderProps } from '../citta-header.props.autogenerated';\r\n\r\n/**\r\n * The header preferred store component\r\n */\r\n// @observer\r\nexport class HeaderPreferredStore extends React.PureComponent> {\r\n\r\n // public handleClick = () => { return this._findPreferreStoreOnClick(this.props); };\r\n\r\n public render(): JSX.Element | undefined {\r\n // const {\r\n // data: {\r\n // storeSelectorStateManager: { result: storeSelectorStateManager }\r\n // },\r\n // slots,\r\n // resources\r\n // } = this.props;\r\n // if (slots && slots.storeSelector && slots.storeSelector.length) {\r\n // const storeName = storeSelectorStateManager!.preferredStore && storeSelectorStateManager!.preferredStore.StoreName ?\r\n // storeSelectorStateManager!.preferredStore.StoreName :\r\n // resources.headerPreferredStoreText;\r\n\r\n // return (\r\n //
\r\n // \r\n // {slots.storeSelector}\r\n //
\r\n // );\r\n // }\r\n\r\n return undefined;\r\n }\r\n\r\n // private async _findPreferreStoreOnClick(props: ICittaHeaderProps): Promise {\r\n // const { data: { storeSelectorStateManager: { result: storeSelectorStateManager } }, modules } = props;\r\n // if (!storeSelectorStateManager) {\r\n // return;\r\n // }\r\n // let storeSelectorId: string = '';\r\n // if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n // storeSelectorId = modules.storeSelector[0].id;\r\n // }\r\n // storeSelectorStateManager.openDialog({\r\n // id: storeSelectorId,\r\n // showMapViewLink: false,\r\n // onLocationSelected: orgUnitLocation => {\r\n // return Promise.resolve();\r\n // }\r\n // }).catch((error: Error) => {\r\n // if (props.telemetry) {\r\n // props.telemetry.error(error.message);\r\n // props.telemetry.debug('Unable to set preferred store');\r\n // }\r\n // return;\r\n // });\r\n // }\r\n}\r\n\r\nexport default HeaderPreferredStore;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes, Modal,\r\n ModalBody, ModalHeader, onTelemetryClick, TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { WishListIconComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { computed, reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { ICittaHeaderData } from './citta-header.data';\r\nimport { ICittaHeaderProps, ICittaHeaderResources, IMyAccountLinksData } from './citta-header.props.autogenerated';\r\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\r\nimport { CartIconComponent } from '../../themes/citta/views/components/cart-icon.component';\r\n\r\n\r\nexport interface IHeaderState {\r\n mobileMenuCollapsed: boolean;\r\n signinPopoverOpen: boolean;\r\n}\r\n\r\nexport interface IHeaderViewProps extends ICittaHeaderProps, IHeaderState {\r\n logo: React.ReactNode;\r\n wishListIconDesktop: React.ReactNode;\r\n wishListIconMobile: React.ReactNode;\r\n cartIcon: React.ReactNode;\r\n navIcon: React.ReactNode;\r\n className: string;\r\n menuBar: React.ReactNode[];\r\n search: React.ReactNode[];\r\n siteOptions: React.ReactNode[];\r\n categoryMenuBar: React.ReactNode[];\r\n customNavBar: React.ReactNode[];\r\n countryPicker: React.ReactNode[];\r\n HeaderTag: IModuleProps;\r\n HeaderContainer: INodeProps;\r\n MobileMenuContainer: INodeProps;\r\n MobileMenuHeader: React.ReactNode;\r\n MobileMenuBodyContainer: INodeProps;\r\n MobileMenuLinksContainer: INodeProps;\r\n HeaderTopBarContainer: INodeProps;\r\n HeaderTopBarRightContainer: INodeProps;\r\n Divider: INodeProps;\r\n\r\n AccountInfoDropdownParentContainer?: INodeProps;\r\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\r\n accountInfoDropdownButton?: React.ReactNode;\r\n\r\n signOutLink?: React.ReactNode;\r\n signInLink?: React.ReactNode;\r\n accountLinks?: React.ReactNode[];\r\n preferredStore?: React.ReactNode;\r\n}\r\n\r\n/**\r\n *\r\n * Header component\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass Header extends React.PureComponent, IHeaderState> {\r\n private popOverRef: React.RefObject;\r\n private telemetryContent: ITelemetryContent;\r\n private cart: ICartState | undefined;\r\n @computed public get displayName(): Readonly {\r\n const customer = this.props.data.accountInformation?.result;\r\n const isB2B = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n if(isB2B){\r\n return customer ? customer.Name || customer.FirstName : undefined;\r\n }\r\n return customer ? customer.FirstName || customer.Name : undefined;\r\n }\r\n @computed public get accountEmailAddress(): Readonly {\r\n const customer = this.props.data.accountInformation?.result;\r\n return customer ? customer.Email || customer.Email : undefined;\r\n }\r\n\r\n constructor(props: ICittaHeaderProps) {\r\n super(props);\r\n this.popOverRef = React.createRef();\r\n this._toggleNavbar = this._toggleNavbar.bind(this);\r\n this._togglePopover = this._togglePopover.bind(this);\r\n this._keydown = this._keydown.bind(this);\r\n this.state = {\r\n mobileMenuCollapsed: true,\r\n signinPopoverOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.addEventListener('keydown', this._keydown);\r\n }\r\n reaction(\r\n () => this.props.data.cart.result,\r\n () => {\r\n this.cart = this.props.data.cart.result;\r\n }\r\n );\r\n\r\n this._stickyHeaderSetup();\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.removeEventListener('keydown', this._keydown, false);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity max-func-body-length\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n data: { accountInformation,\r\n storeSelectorStateManager: {result: storeSelectorStateManager}\r\n },\r\n context: {\r\n request: {\r\n user\r\n }\r\n },\r\n context,\r\n resources: {\r\n cartLabel\r\n }\r\n } = this.props; \r\n\r\n const headerClassName = classnames('ms-header', this.props.config.className);\r\n const navbarKey = 'header-nav-mobile';\r\n const customer = accountInformation && accountInformation.result;\r\n const cartIconSlot = this._getSlot('cartIcon');\r\n const menuBarSlot = this._getSlot('menuBar');\r\n const searchSlot = this._getSlot('search');\r\n const siteOptionsSlot = this._getSlot('siteOptions');\r\n const preferredStoreSlot = this._getSlot('storeSelector');\r\n\r\n const categoryMenuBarSlot = this._getSlot('categoryMenuBar');\r\n const customNavBarSlot = this._getSlot('customNavMenuBar');\r\n const countryPickerSlot = this._getSlot('countryPicker');\r\n\r\n const logoSlot = this._getSlot('logo');\r\n // @ts-ignore\r\n const logoImage = logoSlot && logoSlot.length && logoSlot[0].props.config.image || {};\r\n // @ts-ignore\r\n const logoLink = logoSlot && logoSlot.length && logoSlot[0]?.props.config.imageLink || '';\r\n\r\n const viewProps: IHeaderViewProps = {\r\n ...(this.props as ICittaHeaderProps),\r\n ...(this.state),\r\n logo: ,\r\n wishListIconDesktop: (\r\n \r\n ),\r\n wishListIconMobile: (\r\n \r\n ),\r\n cartIcon: (cartIconSlot && cartIconSlot.length > 0)\r\n ? cartIconSlot[0]\r\n : , \r\n navIcon: ,\r\n menuBar: menuBarSlot && menuBarSlot.length && menuBarSlot || [],\r\n search: searchSlot && searchSlot.length && searchSlot || [],\r\n siteOptions: siteOptionsSlot && siteOptionsSlot.length && siteOptionsSlot || [],\r\n categoryMenuBar: categoryMenuBarSlot && categoryMenuBarSlot.length && categoryMenuBarSlot || [],\r\n customNavBar: customNavBarSlot && customNavBarSlot.length && customNavBarSlot || [],\r\n className: headerClassName,\r\n countryPicker: countryPickerSlot && countryPickerSlot.length && countryPickerSlot || [],\r\n HeaderTag: {\r\n moduleProps: this.props,\r\n className: classnames(headerClassName),\r\n tag: 'header'\r\n },\r\n HeaderContainer: {\r\n className: classnames('ms-header__container')\r\n },\r\n HeaderTopBarContainer: {\r\n className: classnames('ms-header__topbar')\r\n },\r\n HeaderTopBarRightContainer: {\r\n className: classnames('ms-header__topbar-right')\r\n },\r\n Divider: {\r\n className: classnames('ms-header__divider')\r\n },\r\n MobileMenuContainer: {\r\n tag: Modal,\r\n id: navbarKey,\r\n className: 'ms-header__mobile-hamburger',\r\n isOpen: !this.state.mobileMenuCollapsed,\r\n wrapClassName: `ms-header__citta-modal citta-header-mobile ${!this.state.mobileMenuCollapsed ? 'modal-open' : ''}`,\r\n toggle: this._toggleNavbar\r\n },\r\n MobileMenuHeader: (\r\n \r\n ),\r\n MobileMenuBodyContainer: {\r\n tag: ModalBody,\r\n className: 'ms-header__mobile-hamburger-menu-body',\r\n },\r\n MobileMenuLinksContainer: {\r\n className: 'ms-header__mobile-hamburger-menu-links',\r\n },\r\n AccountInfoDropdownParentContainer: {\r\n className: `ms-header__account-info ${this.state.signinPopoverOpen ? 'account-open' : ''}`\r\n },\r\n AccountInfoDropdownPopoverConentContainer: customer && this.displayName && {\r\n // tag: Popover,\r\n id: 'myprofilePopover',\r\n className: 'ms-header__account-info-content',\r\n placement: 'bottom',\r\n isOpen: this.state.signinPopoverOpen,\r\n target: this.popOverRef,\r\n toggle: this._togglePopover,\r\n } || undefined,\r\n signInLink: this._getSigninButton(customer, user, this.props.resources),\r\n signOutLink: this._getSignOutButton(customer, user, this.props.resources),\r\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(customer),\r\n accountLinks: this._getAccountLinks(customer),\r\n preferredStore: preferredStoreSlot\r\n && preferredStoreSlot.length\r\n && storeSelectorStateManager\r\n && ()\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /* Handle link text change*/\r\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent) => {\r\n if (this.props.config.myAccountLinks && this.props.config.myAccountLinks[linkIndex]) {\r\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\r\n }\r\n }\r\n\r\n private _stickyHeaderSetup(): void {\r\n // Set header update methods to trigger on scroll\r\n window.onscroll = () => {\r\n this._updateHeader();\r\n };\r\n this._updateHeader();\r\n }\r\n\r\n private _getSlot(slotName: string): React.ReactNode[] | null {\r\n const { slots } = this.props;\r\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\r\n }\r\n\r\n private _getSigninButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: ICittaHeaderResources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return !customer && (\r\n \r\n {resources.signInLinkText}\r\n \r\n );\r\n }\r\n\r\n private _getSignOutButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: ICittaHeaderResources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n \r\n {resources.signOutLinkText}\r\n \r\n );\r\n }\r\n\r\n private _getAccountInfoDropdownButton(customer: Customer | undefined): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n \r\n {this.displayName}\r\n {this.accountEmailAddress}\r\n \r\n );\r\n }\r\n\r\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\r\n const { myAccountLinks } = this.props.config;\r\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n if(!customer || ! this.displayName || !myAccountLinks || !myAccountLinks.length) {\r\n return undefined;\r\n }\r\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\r\n payLoad.contentAction.etext = cta.linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n const editableLink: MsDyn365.ILinksData = {\r\n ariaLabel: cta.ariaLabel,\r\n className: 'ms-signin-info__account-link-button',\r\n linkText: cta.linkText,\r\n linkUrl: cta.linkUrl.destinationUrl,\r\n openInNewTab: cta.openInNewTab,\r\n role: 'button',\r\n additionalProperties: attributes\r\n };\r\n\r\n return (\r\n \r\n );\r\n });\r\n }\r\n\r\n private _toggleNavbar(): void {\r\n this.setState({\r\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\r\n });\r\n this.state.mobileMenuCollapsed && this._setHeader(this.state.mobileMenuCollapsed);\r\n }\r\n\r\n private _togglePopover(): void {\r\n this.setState({\r\n signinPopoverOpen: !this.state.signinPopoverOpen\r\n });\r\n }\r\n\r\n private _keydown(e: KeyboardEvent): void {\r\n if (e.keyCode === KeyCodes.Escape) {\r\n this.setState({ mobileMenuCollapsed: true });\r\n this._setHeader(true);\r\n }\r\n }\r\n\r\n private _setHeader(lockHeader?: boolean): void {\r\n // Get heights of cookie and promotion banners\r\n const headerElem = document.querySelector('.ms-header');\r\n const headerAlertsContainer: HTMLElement | null = document.querySelector('.ms-promo-banner');\r\n const bannerHeights = headerAlertsContainer ? headerAlertsContainer.offsetHeight : 0;\r\n // triggers opacity change of header\r\n if (headerElem) {\r\n if (lockHeader || document.documentElement.scrollTop > bannerHeights) {\r\n headerElem.classList.add('lock-opaque');\r\n } else if (!window.document.body.classList.contains('search-open')) { \r\n headerElem.classList.remove('lock-opaque');\r\n }\r\n }\r\n }\r\n\r\n private _updateHeader(isInMobileMenu?: boolean): void {\r\n // triggers opacity change of header\r\n // Get heights of cookie and promotion banners\r\n const headerAlertsContainer: HTMLElement | null = document.querySelector('.ms-promo-banner');\r\n const bannerHeights = headerAlertsContainer ? headerAlertsContainer.offsetHeight : 0;\r\n if (this.state.mobileMenuCollapsed) {\r\n this._setHeader();\r\n }\r\n\r\n // Update sticky header position and opacity\r\n const stickyHeader: HTMLElement | null = document.querySelector('.ms-header__desktop-view');\r\n const headerLogo: HTMLElement | null = document.querySelector('.ms-header__topbar-center');\r\n const headerLeftActionItem: HTMLElement | null = document.querySelector('.ms-header__topbar-left');\r\n const headerRightActionItem: HTMLElement | null = document.querySelector('.ms-header__topbar-right');\r\n\r\n if (stickyHeader && headerLogo && headerLeftActionItem && headerRightActionItem) {\r\n // Fix center sticky header\r\n const navStickyPos = headerLogo.offsetHeight + bannerHeights;\r\n if (document.documentElement.scrollTop > navStickyPos) {\r\n stickyHeader.classList.add('fixed');\r\n } else {\r\n stickyHeader.classList.remove('fixed');\r\n }\r\n\r\n // Fix edge sticky headers\r\n if (document.documentElement.scrollTop > bannerHeights) {\r\n headerLeftActionItem.classList.add('fixed');\r\n headerRightActionItem.classList.add('fixed');\r\n } else {\r\n headerLeftActionItem.classList.remove('fixed');\r\n headerRightActionItem.classList.remove('fixed');\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default Header;","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { callActionOrExecute } from '@msdyn365-commerce/retail-proxy';\nimport { createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { LoyaltyPointRedemptionEstimate, LoyaltyRewardPoint } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IModuleStateProps, withModuleState, EnabledPaymentsForOBO } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { GetLoyaltyTransactionEstimationInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Drawer, Heading, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport { CheckoutModule, ErrorLocation } from '@msdyn365-commerce/global-state';\nimport classnames from 'classnames';\nimport { action, computed, reaction, when } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ICheckoutLoyaltyData } from './checkout-loyalty.data';\nimport { ICheckoutLoyaltyProps } from './checkout-loyalty.props.autogenerated';\nimport InputComponent from './components/checkout-loyalty-input';\nimport LabelComponent from './components/checkout-loyalty-label';\nimport TextComponent from './components/checkout-loyalty-text';\nimport { ErrorComponent } from '../../common/error';\nimport { focusOnCheckoutError } from '../../checkout-errors';\n\nexport interface ICheckoutLoyaltyState {\n dollarsApplied: number;\n isFetchingLoyaltyCard: boolean;\n errorMessage?: string;\n}\n\nexport interface ICheckoutLoyaltyModuleProps extends ICheckoutLoyaltyProps, IModuleStateProps {}\n\nexport interface ICheckoutLoyaltyViewState {\n isShowLoyalty: boolean;\n isShowAddLoyalty: boolean;\n}\n\nexport interface ICheckoutLoyaltyShow {\n heading: React.ReactNode;\n coveredAmountText: React.ReactNode;\n amount: React.ReactNode;\n}\n\nexport interface ICheckoutLoyaltyRewardPoint {\n checkoutLoyaltyRewardPoint: INodeProps;\n key: string;\n title: React.ReactNode;\n availablePointsText: React.ReactNode;\n activePoints: React.ReactNode;\n expiringPointsText: React.ReactNode;\n expiringPoints: React.ReactNode;\n}\n\nexport interface ICheckoutLoyaltyAdd {\n heading: React.ReactNode;\n cardNumber: React.ReactNode;\n drawer: INodeProps;\n rewardPoints: ICheckoutLoyaltyRewardPoint[];\n loyaltyAmountContainer: INodeProps;\n appliedLoyaltyAmountContainer: INodeProps;\n loyaltyAmountLabel: React.ReactNode;\n loyaltyAmountInput: React.ReactNode;\n loyaltyAmountApplyButton: React.ReactNode;\n showAppliedAmount: boolean;\n loyaltyAmountAppliedText: React.ReactNode;\n loyaltyAmountAppliedPrice: React.ReactNode;\n loyaltyAmountRemoveButton: React.ReactNode;\n}\n\nexport interface ICheckoutLoyaltyViewProps extends ICheckoutLoyaltyModuleProps {\n checkoutLoyalty: IModuleProps;\n viewState: ICheckoutLoyaltyViewState;\n showLoyalty: ICheckoutLoyaltyShow;\n addLoyalty: ICheckoutLoyaltyAdd;\n alert?: React.ReactNode;\n checkoutErrorRef?: React.RefObject;\n}\n\n/**\n *\n * CheckoutLoyalty component.\n * @extends {React.Component>}\n */\n// @ts-expect-error\n\n@withModuleState\n@observer\nclass CheckoutLoyalty extends React.Component {\n private readonly _dialogToggleRef: React.RefObject | undefined;\n\n private readonly moduleClassName: string = 'ms-checkout-loyalty';\n\n private readonly _defaultLoyaltyPoints: number = 0;\n\n private readonly checkoutErrorRef: React.RefObject = React.createRef();\n\n constructor(props: ICheckoutLoyaltyModuleProps) {\n super(props);\n this._dialogToggleRef = React.createRef();\n this._applyLoyaltyPoints = this._applyLoyaltyPoints.bind(this);\n this._removeLoyaltyPoints = this._removeLoyaltyPoints.bind(this);\n this._onInputChange = this._onInputChange.bind(this);\n this._onBlur = this._onBlur.bind(this);\n this.state = { dollarsApplied: this.maxDollars, isFetchingLoyaltyCard: false };\n }\n\n @computed get shouldPayLoyalty(): boolean {\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n if (!cart) {\n return false;\n }\n\n // Use loyalty when cart is not full of free items\n const amountDue = cart.TotalAmount || 0;\n return amountDue > 0;\n }\n\n @computed get isDataReady(): boolean {\n return (\n (this.props.data.checkout.result && this.props.data.checkout.status) === 'SUCCESS' &&\n (this.props.data.loyaltyCard && this.props.data.loyaltyCard.status) !== 'LOADING' &&\n (this.props.data.loyaltyTransactionEstimation && this.props.data.loyaltyTransactionEstimation.status) !== 'LOADING'\n );\n }\n\n @computed get maxDollars(): number {\n return this.props.data.loyaltyTransactionEstimation.result &&\n this.props.data.loyaltyTransactionEstimation.result.MaxCurrencyValueOfLoyaltyPoints\n ? this.props.data.loyaltyTransactionEstimation.result.MaxCurrencyValueOfLoyaltyPoints\n : 0;\n }\n\n public async componentDidMount(): Promise {\n when(\n () => this.isDataReady,\n async () => {\n await this.init();\n }\n );\n\n reaction(\n () => this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart,\n async () => {\n this._updateEstimate();\n }\n );\n\n reaction(\n () => this.props.data.loyaltyCard.result,\n async () => {\n this._updateLoyalty();\n }\n );\n\n if (this.props.data.checkout.result?.shouldEnableCheckoutErrorDisplayMessaging) {\n reaction(\n () => this.props.data.checkout.result?.checkoutError,\n checkoutError => {\n if (checkoutError && checkoutError.errorLocation === ErrorLocation.CheckoutLoyalty && checkoutError.errorMessage) {\n this._setErrorMessage(checkoutError.errorMessage);\n }\n }\n );\n\n reaction(\n () => this.props.data.checkout.result?.checkoutErrorFocus,\n checkoutErrorFocus => {\n if (checkoutErrorFocus === CheckoutModule.CheckoutLoyalty) {\n focusOnCheckoutError(this.checkoutErrorRef, this.props.context.actionContext);\n }\n }\n );\n }\n }\n\n public shouldComponentUpdate(nextProps: ICheckoutLoyaltyModuleProps, nextState: ICheckoutLoyaltyState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const {\n resources,\n renderView,\n moduleState: { hasError, isReady }\n } = this.props;\n\n if (this.props.context.request.user.isOBORequest && EnabledPaymentsForOBO.Loyalty === 0) {\n this.props.context.telemetry.information('isOBORequest is enabled, Checkout loyalty module wont render');\n return null;\n }\n\n if (\n this.props.data.loyaltyCard &&\n this.props.data.loyaltyCard.result &&\n this.props.data.loyaltyCard.result.CardNumber &&\n this.shouldPayLoyalty\n ) {\n const loyaltyCard = this.props.data.loyaltyCard.result;\n const checkoutState = this.props.data.checkout.result;\n let isShowLoyalty = false;\n const errorMessage = this.state.errorMessage;\n\n if (isReady) {\n if (!checkoutState || checkoutState.loyaltyAmount === 0) {\n return null;\n }\n isShowLoyalty = true;\n }\n const channelConfig = this.props.context.request.channel;\n const viewProps = {\n ...this.props,\n checkoutErrorRef: this.checkoutErrorRef,\n viewState: {\n isShowLoyalty,\n isShowAddLoyalty: !isReady\n },\n alert: hasError && errorMessage && ,\n checkoutLoyalty: {\n moduleProps: this.props,\n className: classnames(\n this.moduleClassName,\n { [`${this.moduleClassName}__applied`]: isShowLoyalty },\n this.props.config.className\n )\n },\n showLoyalty: {\n heading: ,\n coveredAmountText: (\n \n ),\n amount: (\n \n )\n },\n addLoyalty: {\n heading: ,\n drawer: {\n tag: Drawer,\n className: `${this.moduleClassName}__drawer`,\n toggleButtonText: this._drawerHeader(),\n openGlyph: `${this.moduleClassName}__drawer-open`,\n closeGlyph: `${this.moduleClassName}__drawer-close`,\n glyphPlacement: 'end'\n },\n cardNumber: ,\n rewardPoints:\n loyaltyCard.RewardPoints &&\n loyaltyCard.RewardPoints.map((points, index) => {\n return this._renderPointSection(points, resources.availablePointsLabel, resources.expiringLoyaltyPointsLabel);\n }),\n loyaltyAmountContainer: {\n className: `${this.moduleClassName}__amount`\n },\n appliedLoyaltyAmountContainer: {\n className: `${this.moduleClassName}__applied-amount`\n },\n loyaltyAmountLabel: (\n \n ),\n loyaltyAmountInput: (\n \n ),\n loyaltyAmountApplyButton: (\n this.maxDollars ||\n this.state.dollarsApplied <= 0 ||\n isNaN(this.state.dollarsApplied) ||\n this.state.isFetchingLoyaltyCard\n }\n >\n {this.props.resources.applyCheckoutLoyaltyPaymentText}\n \n ),\n showAppliedAmount: checkoutState && checkoutState.loyaltyAmount > 0,\n loyaltyAmountAppliedText: (\n \n ),\n loyaltyAmountAppliedPrice: (\n \n ),\n loyaltyAmountRemoveButton: (\n \n {this.props.resources.removeCheckoutLoyaltyPaymentText}\n \n )\n }\n };\n\n return renderView(viewProps) as React.ReactElement;\n }\n this.props.context.telemetry.error('Checkout loyalty content is empty, module wont render');\n return null;\n }\n\n private _drawerHeader(): JSX.Element {\n const channelConfig = this.props.context.request.channel;\n return (\n <>\n

{this.props.resources.loyaltyCoveredAmountText}

\n \n \n );\n }\n\n private _renderPointSection(\n point: LoyaltyRewardPoint,\n loyaltyCoveredAmountText: string,\n expiringLoyaltyPointsLabel: string\n ): ICheckoutLoyaltyRewardPoint {\n return {\n key: point.RewardPointId || '',\n checkoutLoyaltyRewardPoint: {\n className: `${this.moduleClassName}__program`\n },\n title: ,\n availablePointsText: ,\n activePoints: (\n \n ),\n expiringPointsText: ,\n expiringPoints: (\n \n )\n };\n }\n\n private readonly init = async (): Promise => {\n this.props.moduleState.init({\n onEdit: this.onEdit,\n onCancel: this.onCancel,\n onSubmit: this.onSubmit,\n isRequired: false,\n ...(!this.isEnabled() && { status: 'disabled' })\n });\n\n const savedLoyaltyAmount = this.props.data.checkout.result?.loyaltyAmount;\n if (savedLoyaltyAmount) {\n this.props.moduleState.onReady();\n } else if (this.props.data.checkout.result?.isPaymentVerificationRedirection) {\n this.props.moduleState.onSkip();\n } else if (\n this.props.data.loyaltyCard.result &&\n this.props.data.checkout.result &&\n this.props.data.loyaltyCard.result.CardNumber !== this.props.data.checkout.result.checkoutCart.cart.LoyaltyCardId\n ) {\n this.props.data.checkout.result.checkoutCart\n .updateLoyaltyCardId({ loyaltyCardNumber: this.props.data.loyaltyCard.result.CardNumber })\n .catch(error => {\n if (this.context.telemetry) {\n this.context.telemetry.warning(error);\n this.context.telemetry.debug('Unable to update the loyalty card');\n }\n });\n }\n };\n\n private readonly onEdit = () => {\n this.props.telemetry.information('Payment section loyalty onEdit is called.');\n\n this.props.moduleState.onUpdating();\n };\n\n private readonly onCancel = () => {\n this.props.telemetry.information('Payment section loyalty onCancel is called.');\n\n this.handleCancelOrSubmit();\n };\n\n private readonly onSubmit = () => {\n this.props.telemetry.information('Payment section loyalty onSubmit is called.');\n\n this.handleCancelOrSubmit();\n };\n\n private readonly handleCancelOrSubmit = () => {\n const checkoutState = this.props.data.checkout.result;\n if (checkoutState && checkoutState.loyaltyAmount > 0) {\n // Show summary screen\n this.props.moduleState.onReady();\n } else {\n // Skip the module\n this.props.moduleState.onSkip();\n }\n };\n\n private readonly isEnabled = () => {\n return (\n this.props.context.request.user.isAuthenticated &&\n this.props.data.loyaltyCard.result &&\n this.props.data.loyaltyCard.result.CardNumber &&\n this.shouldPayLoyalty\n );\n };\n\n private async _applyLoyaltyPoints(): Promise {\n this.props.telemetry.information('Payment section loyalty apply button onClick is called.');\n\n const checkoutState = this.props.data.checkout.result;\n\n if (!checkoutState) {\n return;\n }\n\n this._clearError();\n await checkoutState.updateLoyaltyAmount({ newAmount: Number.parseFloat(this.state.dollarsApplied.toString()) });\n this.setState({\n isFetchingLoyaltyCard: true\n });\n }\n\n private async _removeLoyaltyPoints(): Promise {\n this.props.telemetry.information('Payment section loyalty remove button onClick is called.');\n\n const checkoutState = this.props.data.checkout.result;\n\n if (!checkoutState) {\n return;\n }\n\n this._clearError();\n await checkoutState.updateLoyaltyAmount({ newAmount: 0 });\n this.setState({\n dollarsApplied: 0\n });\n }\n\n private _onInputChange(event: React.ChangeEvent): void {\n const value = event.currentTarget.value;\n this.setState({ dollarsApplied: value.length > 0 ? Number(value) : Number.parseFloat(value), isFetchingLoyaltyCard: false });\n }\n\n private _onBlur(event: React.FocusEvent): void {\n const num = Number.parseFloat(event.currentTarget.value).toFixed(2);\n const element = document.getElementById(`${this.props.id}-label`) as HTMLInputElement;\n if (element && num) {\n element.value = num;\n this.setState({ dollarsApplied: Number.parseFloat(num) });\n }\n }\n\n private _updateLoyalty(): void {\n if (this.props.moduleState.isDisabled && this.isEnabled()) {\n this._updateEstimate();\n this.props.moduleState.onUpdating();\n }\n }\n\n private _updateEstimate(): void {\n const card = this.props.data.loyaltyCard.result;\n const checkout = this.props.data.checkout.result;\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n const channelConfig = this.props.context.request.channel;\n if (card && card.CardNumber && cart && channelConfig) {\n const currencyCode = channelConfig.Currency || '';\n const loyalPointsRequest = createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput(cart.Id, card.CardNumber, currencyCode);\n\n // @ts-expect-error\n // Due to bug 23214358, this is getting improperly cached. Need to turn on cache bypass for now to work around issue\n loyalPointsRequest._query.options.bypassCache = 'get';\n\n callActionOrExecute(loyalPointsRequest, this.props.context.actionContext)\n .then(async points => {\n this.props.context.actionContext.update(\n new GetLoyaltyTransactionEstimationInput(this.props.context.request.apiSettings),\n points\n );\n const newMaxPoints = points.MaxCurrencyValueOfLoyaltyPoints ?? this._defaultLoyaltyPoints;\n\n // If points are already applied, ensure you don't apply more points than max\n if (checkout && checkout.loyaltyAmount > newMaxPoints) {\n await checkout.updateLoyaltyAmount({ newAmount: newMaxPoints });\n }\n\n this.setState({ dollarsApplied: newMaxPoints, isFetchingLoyaltyCard: false });\n })\n .catch(error => {\n this.props.context.actionContext.telemetry.exception(error);\n this.props.context.actionContext.telemetry.debug('Error getting Loyalty Point Redemption Estimate');\n });\n }\n }\n\n @action\n private readonly _setErrorMessage = (errorMessage: string): void => {\n this.props.telemetry.error(errorMessage);\n this.props.moduleState.setHasError(true);\n this.props.moduleState.onUpdating();\n this.setState({\n errorMessage\n });\n };\n\n private readonly _clearError = (): void => {\n this.props.moduleState.setHasError(false);\n this.setState({\n errorMessage: ''\n });\n };\n}\n\nexport default CheckoutLoyalty;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport {\n ICheckoutDeliveryOption,\n ICheckoutDeliveryOptionEdit,\n ICheckoutDeliveryOptionsList,\n ICheckoutDeliveryOptionsViewProps\n} from './checkout-delivery-options';\n\nconst DeliveryOptionList: React.FC = ({ DeliveryOptionsList, list }) => {\n if (!list || list.length === 0) {\n return null;\n }\n\n return (\n \n {list.map((deliveryOption: ICheckoutDeliveryOptionEdit) => {\n return (\n \n {deliveryOption.radioButton}\n {deliveryOption.description}\n {deliveryOption.price}\n \n );\n })}\n \n );\n};\n\nconst DeliveryOptionSelected: React.FC = ({ DeliveryOption, description, price }) => {\n return (\n \n {description}\n {price}\n \n );\n};\n\nconst CheckoutDeliveryOptionsView: React.FC = props => {\n const {\n CheckoutDeliveryOptions,\n checkoutErrorRef,\n viewState,\n deliveryOptions,\n deliveryOptionSelected,\n alert,\n waiting,\n saveButton,\n editButton,\n cancelButton\n } = props;\n\n return (\n // TODO: All wrapper div should be provided by viewProps. Once SDK provide the sln, update markup.\n \n {viewState.isLoading && waiting}\n {viewState.isError && alert}\n {viewState.isShowList && deliveryOptions && }\n {viewState.isShowSelected && deliveryOptionSelected && }\n {viewState.isShowSaveButton && saveButton}\n {viewState.isShowEditButton && editButton}\n {viewState.isShowCancelButton && cancelButton}\n \n );\n};\n\nexport default CheckoutDeliveryOptionsView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsErrorTitleProps {\n title?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.title\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsErrorTitle: React.FC = ({ title }) => {\n if (!title) {\n return null;\n }\n\n return

{title}

;\n};\n\nexport default CheckoutDeliveryOptionsErrorTitle;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IInvoiceSummaryProps {\n orderTotalLabel: string;\n invoiceLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n id: string;\n typeName: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n}\n\nexport interface IInvoiceSummaryLines {\n orderTotal: React.ReactNode;\n invoices: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n}\n\ninterface IInvoiceSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n}\n\nconst InvoiceSummaryLine: React.FC = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel\n}) => {\n return (\n

\n {label}\n {price || price === 0 ? (\n \n ) : (\n {toBeCalculatedText}\n )}\n

\n );\n};\n\nconst _buildPaymentSummarySection = (\n props: IInvoiceSummaryProps,\n price: number | undefined,\n label: string,\n cssLabel: string\n): React.ReactNode => {\n return (\n \n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nexport const InvoiceSummary = (props: IInvoiceSummaryProps) => {\n const { TotalAmount, CartLines } = props.cart;\n const invoiceLines = CartLines?.filter(cartLine => cartLine.IsInvoiceLine);\n const reactNodes: IInvoiceSummaryLines = {\n invoices: invoiceLines?.map((invoiceLine: CartLine) => {\n return _buildPaymentSummarySection(\n props,\n invoiceLine.InvoiceAmount,\n format(props.invoiceLabel, invoiceLine.InvoiceId),\n 'invoice'\n );\n }),\n orderTotal: _buildPaymentSummarySection(props, TotalAmount, props.orderTotalLabel, 'total')\n };\n\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildPaymentSummarySection(props, -loyaltyAmount, props.loyaltyLabel || 'Loyalty amount', 'loyalty');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildPaymentSummarySection(\n props,\n -giftCardAmount,\n props.giftcardLabel || 'Gift card amount',\n 'gift-card'\n );\n }\n\n reactNodes.orderTotal = _buildPaymentSummarySection(\n { ...props, freeText: undefined },\n totalAmountAfterGiftCard,\n props.orderTotalLabel,\n 'total'\n );\n }\n\n return reactNodes;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResults,\n CartLineValidationResultsByLineId,\n CartsDataActions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ITelemetry } from '@msdyn365-commerce/telemetry-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Validate the cart.\n * @param isQuantityLimitsFeatureEnabled -- Is the quantity limits feature enabled.\n * @param cart -- The cart state to validate.\n * @param telemetry -- The telemetry.\n * @param propsContext -- The props context.\n * @param shouldRetry -- Should retry.\n * @returns A list of line data validation failures.\n */\nexport async function validateCartAsync(\n cart: AsyncResult,\n telemetry: ITelemetry,\n propsContext: ICoreContext,\n shouldRetry: boolean = true\n): Promise {\n let cartResult: ICartState;\n let cartVersion: number | undefined;\n try {\n cartResult = await cart;\n cartVersion = cartResult.cart.Version;\n } catch (error) {\n telemetry.warning(error);\n telemetry.debug('Unable to get cart or cart version.');\n return AsyncResult.resolve();\n }\n\n if (cartVersion) {\n try {\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\n { callerContext: propsContext.actionContext, bypassCache: 'none' },\n cartResult.cart.Id,\n cartVersion\n );\n\n return await AsyncResult.resolve(validationResult.ValidationResultsByLineId ?? undefined);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- error type is not defined.\n if (shouldRetry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n try {\n await cartResult.refreshCart({});\n } catch (refreshError) {\n telemetry.warning(refreshError);\n telemetry.debug('Unable to refresh Cart');\n return AsyncResult.resolve();\n }\n try {\n await validateCartAsync(cart, telemetry, propsContext, false);\n return AsyncResult.resolve();\n } catch (validateError) {\n telemetry.warning(validateError);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n }\n\n telemetry.warning(error);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n } else {\n telemetry.warning('Cart version not found for Cart validation request.');\n return AsyncResult.resolve();\n }\n}\n\n/**\n * Check if cart line quantity update is success.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function isCartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult.status === 'SUCCESS');\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve(false);\n}\n\n/**\n * Update cart line with cart action result.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function cartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult);\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve();\n}\n"],"sourceRoot":""}