simpo-component-library 3.6.915 → 3.6.917
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/esm2022/lib/components/delete-hover-element/delete-hover-element.component.mjs +3 -3
- package/esm2022/lib/components/document/document.component.mjs +3 -3
- package/esm2022/lib/components/hover-elements/hover-elements.component.mjs +3 -7
- package/esm2022/lib/components/image-loading/image-loading.component.mjs +3 -3
- package/esm2022/lib/components/payment-details/payment-details.component.mjs +3 -3
- package/esm2022/lib/constants/business.constant.mjs +1 -1
- package/esm2022/lib/directive/alignment.directive.mjs +1 -1
- package/esm2022/lib/directive/blur-content.directive.mjs +1 -1
- package/esm2022/lib/directive/borderlessImage.directive.mjs +1 -1
- package/esm2022/lib/directive/button-directive.directive.mjs +7 -1
- package/esm2022/lib/directive/color.directive.mjs +1 -1
- package/esm2022/lib/directive/column-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/container-alignment.directive.mjs +1 -1
- package/esm2022/lib/directive/container-fir.directive.mjs +1 -1
- package/esm2022/lib/directive/content-title-spacing.directive.mjs +1 -1
- package/esm2022/lib/directive/contenteditable.directive.mjs +1 -1
- package/esm2022/lib/directive/corner-directive.mjs +1 -1
- package/esm2022/lib/directive/height.directive.mjs +1 -1
- package/esm2022/lib/directive/hover-animation.directive.mjs +1 -1
- package/esm2022/lib/directive/hoverborder.directive.mjs +1 -1
- package/esm2022/lib/directive/icon-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/image-container.directive.mjs +1 -1
- package/esm2022/lib/directive/letters-only.directive.mjs +1 -1
- package/esm2022/lib/directive/numbers-only.directive.mjs +1 -1
- package/esm2022/lib/directive/position-layout-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/set-dynamic-background.directive.mjs +1 -1
- package/esm2022/lib/directive/spacing-horizontal.directive.mjs +1 -1
- package/esm2022/lib/directive/spacing.directive.mjs +1 -1
- package/esm2022/lib/directive/text-background-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/text-size.directive.mjs +1 -1
- package/esm2022/lib/directive/translate-onhover.directive.mjs +1 -1
- package/esm2022/lib/directive/wrap-containers.directive.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/address/address.component.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/authenticate-user/authenticate-user.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/cart/cart.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/checkout/checkout.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/checkout/checkout.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/customer-review/customer-review.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/customer-review/customer-review.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/featured-category/featured-collection.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/item-varient/item-varient.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/new-collection/new-collection.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/new-collection/new-collection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/pagnination/pagnination.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/passbook-transactions/passbook-transactions.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-list/product-list.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/refer-earn/refer-earn.component.mjs +14 -8
- package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.component.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/scheme-details/scheme-details.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/scheme-selection/scheme-selection.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/schemes/schemes.component.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/small-product-listing/small-product-listing.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/store-list/store-list.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/store-list/store-list.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/store-page/store-page.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/store-page/store-page.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/user-profile/user-profile.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.model.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/BaseCollection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/Collection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/PincodeLocation.model.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/PincodeLocationInter.model.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/cart.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/category.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/order.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/product.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/review.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/user.modal.mjs +1 -1
- package/esm2022/lib/elements/address-list/address-list.component.mjs +3 -3
- package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +3 -3
- package/esm2022/lib/elements/button/button.component.mjs +3 -3
- package/esm2022/lib/elements/button/button.model.mjs +1 -1
- package/esm2022/lib/elements/card-skeleton-loader/card-skeleton-loader.component.mjs +3 -3
- package/esm2022/lib/elements/heading-element/heading-element.component.mjs +3 -3
- package/esm2022/lib/elements/index.mjs +1 -1
- package/esm2022/lib/elements/list-home-appointment/list-home-appointment.component.mjs +3 -3
- package/esm2022/lib/elements/media-selector/media-selector.component.mjs +1 -1
- package/esm2022/lib/elements/portfolio/portfolio.component.mjs +3 -3
- package/esm2022/lib/elements/property/property.component.mjs +3 -3
- package/esm2022/lib/elements/schedule-video-call/schedule-video-call.component.mjs +1 -1
- package/esm2022/lib/elements/svg-divider/svg-divider.component.mjs +3 -3
- package/esm2022/lib/elements/text/text.component.mjs +3 -3
- package/esm2022/lib/elements/text-editor/text-editor.component.mjs +3 -3
- package/esm2022/lib/pipes/amount.pipe.mjs +1 -1
- package/esm2022/lib/sections/add-new-section/add-new-section.component.mjs +3 -3
- package/esm2022/lib/sections/appointment-form/appointment-booking/appointment-booking/appointment-booking.component.mjs +1 -1
- package/esm2022/lib/sections/appointment-form/appointment-form.component.mjs +1 -1
- package/esm2022/lib/sections/appointment-form/appointment-form.model.mjs +1 -1
- package/esm2022/lib/sections/banner-carousel/banner-carousel.model.mjs +1 -1
- package/esm2022/lib/sections/banner-grid-section/banner-grid-section.component.mjs +1 -1
- package/esm2022/lib/sections/blog-list/blog-list.model.mjs +1 -1
- package/esm2022/lib/sections/choose-us-section/choose-us-section.component.mjs +1 -1
- package/esm2022/lib/sections/choose-us-section/choose-us-section.model.mjs +1 -1
- package/esm2022/lib/sections/countdown-banner/countdown-banner.component.mjs +24 -4
- package/esm2022/lib/sections/faq-section/faq-section.component.mjs +1 -1
- package/esm2022/lib/sections/faq-section/faq-section.modal.mjs +1 -1
- package/esm2022/lib/sections/features-section/features-section.model.mjs +1 -1
- package/esm2022/lib/sections/footer/footer.component.mjs +3 -3
- package/esm2022/lib/sections/header-section/header-section.component.mjs +3 -3
- package/esm2022/lib/sections/header-section/header-section.model.mjs +1 -1
- package/esm2022/lib/sections/header-text/header-text.model.mjs +1 -1
- package/esm2022/lib/sections/image-background/image-background/image-background.component.mjs +13 -7
- package/esm2022/lib/sections/image-carousel-section/image-carousel-section.component.mjs +1 -1
- package/esm2022/lib/sections/image-carousel-section/image-carousel.model.mjs +1 -1
- package/esm2022/lib/sections/image-grid-section/image-grid-section.component.mjs +1 -1
- package/esm2022/lib/sections/image-section/image-section.component.mjs +1 -1
- package/esm2022/lib/sections/image-section/image-section.model.mjs +1 -1
- package/esm2022/lib/sections/location-section/location-section.component.mjs +1 -1
- package/esm2022/lib/sections/location-section/location-section.modal.mjs +1 -1
- package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +7 -17
- package/esm2022/lib/sections/logo-showcase/logo-showcase.modal.mjs +1 -1
- package/esm2022/lib/sections/moving-text/moving-text.component.mjs +3 -3
- package/esm2022/lib/sections/moving-text/moving-text.modal.mjs +1 -1
- package/esm2022/lib/sections/new-services/new-services.component.mjs +1 -1
- package/esm2022/lib/sections/new-services/new-services.model.mjs +1 -1
- package/esm2022/lib/sections/new-testimonials/new-testimonials.component.mjs +1 -1
- package/esm2022/lib/sections/new-testimonials/new-testimonials.model.mjs +1 -1
- package/esm2022/lib/sections/news-letter-component/news-letter-component.component.mjs +1 -1
- package/esm2022/lib/sections/news-letter-component/news-letter.modal.mjs +1 -1
- package/esm2022/lib/sections/overlapping-image/overlapping-image.component.mjs +1 -1
- package/esm2022/lib/sections/pricing-section/pricing-section.modal.mjs +1 -1
- package/esm2022/lib/sections/process-modern/process-modern.component.mjs +1 -1
- package/esm2022/lib/sections/process-modern/process-modern.model.mjs +1 -1
- package/esm2022/lib/sections/process-section/process-section.modal.mjs +1 -1
- package/esm2022/lib/sections/product-info-section/product-info-section.component.mjs +1 -1
- package/esm2022/lib/sections/property-component/property-component.component.mjs +3 -3
- package/esm2022/lib/sections/property-component/property-component.modal.mjs +1 -1
- package/esm2022/lib/sections/property-list/property-list.component.mjs +3 -3
- package/esm2022/lib/sections/property-list/property-list.modal.mjs +1 -1
- package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.component.mjs +1 -1
- package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.model.mjs +1 -1
- package/esm2022/lib/sections/registration-form/registration-form.component.mjs +3 -3
- package/esm2022/lib/sections/registration-form/registrationForm.model.mjs +1 -1
- package/esm2022/lib/sections/scheme-detail/scheme-detail.component.mjs +1 -1
- package/esm2022/lib/sections/scheme-detail/scheme-detail.modal.mjs +1 -1
- package/esm2022/lib/sections/skeleton-loader-section/skeleton-loader-section.component.mjs +3 -3
- package/esm2022/lib/sections/team-member-section/team-member-section.component.mjs +1 -1
- package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +1 -1
- package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-masonry/testimonial-masonry.component.mjs +1 -1
- package/esm2022/lib/sections/testimonial-section/testimonial-section.component.mjs +1 -1
- package/esm2022/lib/sections/testimonial-section/testimonial-section.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-slider/testimonial-slider.component.mjs +1 -1
- package/esm2022/lib/sections/testimonial-video/testimonial-video.component.mjs +1 -1
- package/esm2022/lib/sections/testimonial-video/testimonial-video.model.mjs +1 -1
- package/esm2022/lib/sections/text-section/text-section.model.mjs +1 -1
- package/esm2022/lib/sections/usp-video-section/usp-video-section.component.mjs +3 -3
- package/esm2022/lib/sections/usp-video-section/usp-video-section.model.mjs +1 -1
- package/esm2022/lib/sections/video-carousel-section/video-carousel-section.component.mjs +1 -1
- package/esm2022/lib/sections/video-grid-section/video-grid-section.component.mjs +3 -3
- package/esm2022/lib/sections/video-section/video-section.component.mjs +3 -3
- package/esm2022/lib/sections/video-section/video-section.model.mjs +1 -1
- package/esm2022/lib/sections/view-blog/view-blog.component.mjs +1 -1
- package/esm2022/lib/services/endUser.service.mjs +1 -1
- package/esm2022/lib/services/image-upload-service.service.mjs +1 -1
- package/esm2022/lib/services/rest.service.mjs +2 -2
- package/esm2022/lib/styles/index.mjs +1 -1
- package/fesm2022/simpo-component-library.mjs +153 -129
- package/fesm2022/simpo-component-library.mjs.map +1 -1
- package/lib/components/hover-elements/hover-elements.component.d.ts +0 -1
- package/lib/ecommerce/sections/featured-category/featured-category.component.d.ts +1 -1
- package/lib/ecommerce/sections/featured-category/featured-collection.component.d.ts +1 -1
- package/lib/ecommerce/sections/new-collection/new-collection.component.d.ts +1 -1
- package/lib/ecommerce/sections/refer-earn/refer-earn.component.d.ts +2 -1
- package/lib/sections/countdown-banner/countdown-banner.component.d.ts +2 -1
- package/lib/sections/image-background/image-background/image-background.component.d.ts +2 -1
- package/lib/sections/image-grid-hotspot/image-grid-hotspot.component.d.ts +1 -1
- package/lib/sections/image-grid-section/image-grid-section.component.d.ts +1 -1
- package/lib/sections/logo-showcase/logo-showcase.component.d.ts +2 -5
- package/package.json +1 -1
- package/simpo-component-library-3.6.917.tgz +0 -0
- package/simpo-component-library-3.6.915.tgz +0 -0
|
@@ -993,7 +993,7 @@ export class ProductDescComponent extends BaseSection {
|
|
|
993
993
|
});
|
|
994
994
|
}
|
|
995
995
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductDescComponent, deps: [{ token: PLATFORM_ID }, { token: i1.EventsService }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i3.RestService }, { token: i4.CartService }, { token: i5.StorageServiceService }, { token: i6.MessageService }, { token: i7.Meta }, { token: i7.Title }, { token: i8.MatBottomSheet }, { token: i0.Renderer2 }, { token: i9.MatDialog }, { token: i10.AnalyticsService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
996
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProductDescComponent, isStandalone: true, selector: "simpo-product-desc", inputs: { data: "data", responseData: "responseData", index: "index", edit: "edit", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor" }, host: { listeners: { "window: resize": "getScreenSize($event)" } }, providers: [MessageService], viewQueries: [{ propertyName: "reviewComponent", first: true, predicate: CustomerReviewComponent, descendants: true }, { propertyName: "aboveHeight", first: true, predicate: ["aboveHeight"], descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "imageSection", first: true, predicate: ["imageSection"], descendants: true }, { propertyName: "detailSection", first: true, predicate: ["detailSection"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!isLoading\">\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <section class=\"total-container\" [id]=\"data?.id\" [simpoBackground]=\"styles?.background\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\r\n\r\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\r\n </div> -->\r\n <section class=\"container\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" [spacingHorizontal]=\"stylesLayout\"\r\n [simpoLayout]=\"styles?.layout\" #container>\r\n <!-- <div class=\"display-none\"><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\"\r\n (click)=\"routeToHome()\">Home</a> /\r\n <span>{{ responseData?.name | titlecase }}</span>\r\n </div> -->\r\n <div class=\"row m-0 w-100 mt-lg-4 h-auto overflow-visible\" #aboveHeight>\r\n <div class=\"col-lg-6 col-sm-12 image-section-modern\" #imageSection>\r\n <div class=\"d-flex flex-column justify-content-start gap-1\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-sm-12 detail-section-modern \" #detailSection>\r\n <div class=\"product-hero-card-modern\">\r\n <ng-container *ngIf=\"isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.deliveryEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.deliveryEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"DeliverySection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.storesEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.storesEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"StoreSection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.appointmentBookingEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.appointmentBookingEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"TryAtHome\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.videoCallEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"videoCallSchedule\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.brandPromiseEnabled\">\r\n <ng-container *ngTemplateOutlet=\"branding\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n\r\n <!-- Moved descriptors to Details tab below -->\r\n\r\n <!-- <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\"\r\n [innerHTML]=\"responseData.brief\"></div> -->\r\n <!-- Moved tags to Details tab below -->\r\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\r\n <!-- <ng-container>\r\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\r\n </ng-container> -->\r\n </div>\r\n </div>\r\n <!-- Tabs Navigation -->\r\n <div class=\"product-tabs-container\">\r\n <ul class=\"tabs-list\">\r\n <li class=\"tab-item\" [class.active]=\"activeTab == 'Details'\"\r\n [style.color]=\"activeTab == 'Details' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'Details' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('Details')\">Details</li>\r\n <li class=\"tab-item\" *ngIf=\"reviewsData\" [class.active]=\"activeTab == 'Reviews'\"\r\n [style.color]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('Reviews')\">Reviews</li>\r\n <li class=\"tab-item\" *ngIf=\"materialBasedPricing\" [class.active]=\"activeTab == 'PriceBreakup'\"\r\n [style.color]=\"activeTab == 'PriceBreakup' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'PriceBreakup' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('PriceBreakup')\">Price Breakup</li>\r\n </ul>\r\n </div>\r\n\r\n <!-- Tab Content -->\r\n <div class=\"tab-content-pane\">\r\n <div *ngIf=\"activeTab == 'Details'\">\r\n <!-- Integrated descriptors and tags here -->\r\n <div class=\"mt-2\">\r\n <ng-container *ngTemplateOutlet=\"descriptors\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"activeTab == 'Reviews'\">\r\n <ng-container *ngTemplateOutlet=\"ReviewsSection\"></ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"activeTab == 'PriceBreakup'\">\r\n <div class=\"pb-glass-container mt-2\">\r\n\r\n <!-- One card per material \u2014 generic, works for any material type -->\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"pb-glass-card\">\r\n <div class=\"pb-glass-header\"\r\n [style.background]=\"styles?.background?.accentColor\"\r\n [style.color]=\"'#fff'\">\r\n {{ ele?.materialName | titlecase }}\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Purity</span>\r\n <span class=\"pb-value\">{{ ele?.purity }}</span>\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Net Weight</span>\r\n <span class=\"pb-value\">{{ ele?.quantity }} {{ ele?.unit | titlecase }}</span>\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Rate / {{ ele?.unit | titlecase }}</span>\r\n <span class=\"pb-value\">\u20B9{{ ele?.pricePerUnit | number:'1.2-2' }}</span>\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Value</span>\r\n <span class=\"pb-value\">\u20B9{{ (ele?.quantity * ele?.pricePerUnit) | number:'1.2-2' }}</span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Making Charges card -->\r\n <div class=\"pb-glass-card\">\r\n <div class=\"pb-glass-header\"\r\n [style.background]=\"styles?.background?.accentColor\"\r\n [style.color]=\"'#fff'\">\r\n Making Charges\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Net Weight</span>\r\n <span class=\"pb-value\">{{ responseData?.baseWeight }}</span>\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Making Charge %</span>\r\n <span class=\"pb-value\">{{ responseData?.makingChargePercentage }}%</span>\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Value</span>\r\n <span class=\"pb-value\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Summary card -->\r\n <div class=\"pb-summary-card\">\r\n <div class=\"pb-summary-row\">\r\n <span>Total Value</span>\r\n <span>\u20B9{{ responseData?.jewelryPriceBreakup?.priceWithoutTax | number:'1.2-2' }}</span>\r\n </div>\r\n <div class=\"pb-summary-row\">\r\n <span>Tax ({{ responseData?.jewelryPriceBreakup?.taxRef?.taxPercent }}% GST)</span>\r\n <span>\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}</span>\r\n </div>\r\n <div class=\"pb-grand-total\"\r\n [style.background]=\"styles?.background?.accentColor\"\r\n [style.color]=\"'#fff'\">\r\n <span>TOTAL</span>\r\n <span>\u20B9{{ (responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) | number:'1.2-2' }}</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n <ng-container *ngIf=\"recentViewItemList?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"recentViewItemList\"\r\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\r\n </ng-container>\r\n <!-- <ng-container *ngIf=\"recentViewItemList?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\r\n [isRelatedProduct]=\"true\"></simpo-featured-products>\r\n </ng-container> -->\r\n <!-- <ng-container>\r\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\r\n </ng-container> -->\r\n\r\n <ng-container *ngIf=\"styles?.devider?.display\">\r\n <simpo-svg-divider [dividerType]=\"styles?.devider?.deviderType\"\r\n [color]=\"nextComponentColor?.color\"></simpo-svg-divider>\r\n </ng-container>\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>\r\n\r\n\r\n<div class=\"mobile-footer\">\r\n <div class=\"icons\">\r\n <div (click)=\"goToCart()\">\r\n <mat-icon>shopping_cart</mat-icon>\r\n </div>\r\n <div>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n </div>\r\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\r\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\">Out of\r\n Stock</button>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\r\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\"\r\n [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n</div>\r\n\r\n<ng-template #ReviewSection>\r\n <div class=\"review-sec\">\r\n <div class=\"title\">Customer Review</div>\r\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\r\n <span>Be the first to write a review</span>\r\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add\r\n Review' : 'Cancel Review'}}</button>\r\n <ng-container *ngIf=\"showReview\">\r\n <hr />\r\n <div class=\"user-review\">\r\n <div class=\"title\">Write a review</div>\r\n <span class=\"secondary-text\">RATING</span>\r\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\r\n <div>\r\n <span class=\"secondary-text\">Review Title</span>\r\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\r\n </div>\r\n <div>\r\n <span class=\"secondary-text\">Review</span>\r\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\r\n </div>\r\n <div class=\"review-action-btn\">\r\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\r\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"addProductReview()\"\r\n [disabled]=\"productReview == 0 && !reviewTitle?.length && !reviewDescription?.length\">Submit\r\n review</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #SocialIcons>\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\r\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\r\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\r\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\r\n <div style=\"position: relative;margin-right: 10px;\">\r\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\"\r\n [sectionId]=\"data?.id\"></simpo-socia-icons>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #ActionBtn>\r\n <div class=\"button-parent\">\r\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\r\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\">Out of\r\n Stock</button>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\r\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\"\r\n [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && IsEcommerce\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && IsEcommerce\" class=\"w-75 mt-2\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? buyNow() : ''\">Buy Now</button>\r\n </div>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && !IsEcommerce\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\" (click)=\"raiseLead()\"><mat-icon style=\"height:14px !important\">\r\n message</mat-icon>Notify Me</button>\r\n </div>\r\n <div class=\"favourite\" *ngIf=\"IsEcommerce\" (click)=\"isItemAsFavorite ? removeToFavourite() : addToFavourite()\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n <div class=\"share-icon\" (click)=\"shareProduct()\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\">share</mat-icon>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #variants>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style1'\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"mb-3\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style2' && selectedVarient.size > 0\">\r\n <ng-container>\r\n <div class=\"row mt-2 style2-container w-100\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div *ngFor=\"let item of selectedVarient | keyvalue\" class=\"px-3 py-2 varient-item\"\r\n [class]=\"getClass(selectedVarient)\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"variant-head\">{{item.key | titlecase}}</div>\r\n <div class=\"variant-value text-start fw-semibold\">\r\n {{item.value |\r\n titlecase}}</div>\r\n </div>\r\n <div class=\"cursor-pointer p-0\" [class]=\"getClass(selectedVarient)\">\r\n <div class=\"custom-text d-flex align-items-center justify-content-center h-100 p-2\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightVariant\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">CUSTOMISE\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc>\r\n <div class=\"product-info-minimal\">\r\n <!-- Item Code -->\r\n <div class=\"item-code-row\" *ngIf=\"responseData?.itemCode\">\r\n <span class=\"item-code-value\">{{ formatItemCode(responseData?.itemCode) }}</span>\r\n </div>\r\n\r\n <!-- Title and Price Row -->\r\n <div class=\"title-price-row-modern\">\r\n <h1 class=\"product-title-modern\">{{responseData?.name}}</h1>\r\n <div class=\"product-price-modern\">\r\n <span [innerHTML]=\"currency\"></span> {{responseData?.price?.sellingPrice}}\r\n </div>\r\n </div>\r\n\r\n <!-- Rating Row -->\r\n <div class=\"rating-row-modern\" *ngIf=\"responseData?.averageRating\">\r\n <p-rating [(ngModel)]=\"responseData.averageRating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\r\n <span class=\"rating-score\">{{responseData?.averageRating | number:'1.1-1'}}</span>\r\n <span class=\"separator\">|</span>\r\n <span class=\"reviews-link\" [style.color]=\"styles?.background?.accentColor\">\r\n {{responseData?.totalReviewCount}} reviews</span>\r\n </div>\r\n\r\n <!-- Brief Description -->\r\n <div class=\"product-brief-modern\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData?.brief | sanitizeHtml\">\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #descriptors>\r\n <div class=\"row prod-desc mt-2\">\r\n <div>\r\n <!-- <div class=\"product-header d-flex align-items-center justify-content-between\">\r\n <span class=\"header-text\" *ngIf=\"responseData?.descriptor || responseData?.materials\">Product Details</span>\r\n <div class=\"pricebreakup-btn d-flex align-items-center justify-content-center cursor-pointer\"\r\n *ngIf=\"materialBasedPricing\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasRightPriceBreakup\"\r\n [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\r\n <mat-icon>add</mat-icon> PRICE BREAKUP\r\n </div>\r\n </div> -->\r\n <div class=\"description\">\r\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name | sanitizeHtml\"\r\n [style.background]=\"data?.styles?.background?.color\"></div>\r\n </div>\r\n <!-- <ng-container *ngIf=\"materialBasedPricing\">\r\n <div class=\"jewellery-table-container\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor(ele.materialType)\">\r\n {{ele?.materialName | titlecase}}\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor(ele.materialType)\">\r\n <div class=\"col-6 metal-purity\">\r\n <div class=\"row-header\">\r\n Net Weight/{{ele?.unit | titlecase}}\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.quantity + \" \" + (ele?.unit | titlecase)}}\r\n </div>\r\n </div>\r\n <div class=\"col-6 metal-purity\">\r\n <div class=\"row-header\">\r\n Purity\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.purity |\r\n titlecase}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container> -->\r\n </div>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #ImageSection>\r\n <ng-container *ngIf=\"!varientLoading && (isMobile || data?.styles?.gridStyle == 'Style1')\">\r\n <div class=\"style-1-vertical d-flex flex-column w-100\">\r\n <div class=\"main-image-container p-0\">\r\n <div class=\"item-img rounded-3\">\r\n <lib-ngx-image-zoom *ngIf=\"currentImg\" [thumbImage]=\"currentImg\" [fullImage]=\"currentImg\" [zoomMode]=\"'hover'\"\r\n [magnification]=\"0.4\" [enableScrollZoom]=\"false\">\r\n </lib-ngx-image-zoom>\r\n <img *ngIf=\"!currentImg\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\"\r\n class=\"w-100 h-100 object-fit-cover\">\r\n </div>\r\n </div>\r\n <div class=\"thumbnail-row py-3 d-flex gap-2 overflow-auto hide-scroll\">\r\n <img class=\"img thumbnail-img\" *ngFor=\"let img of itemImages\" [src]=\"img.imgUrl\" (click)=\"changeImg(img.imgUrl)\"\r\n [class.active-thumb]=\"currentImg == img.imgUrl\"\r\n style=\"cursor: pointer; min-width: 80px; width: 80px; height: 80px; object-fit: cover; border-radius: 8px; border: 2px solid transparent;\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!varientLoading && (!isMobile && data?.styles?.gridStyle == 'Style2')\">\r\n <div class=\"bento-masonry-container\">\r\n <div *ngFor=\"let img of itemImages; let i = index\" class=\"bento-item-modern\">\r\n <img [src]=\"img.imgUrl\" class=\"bento-img-modern\" (click)=\"changeImg(img.imgUrl)\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"item-img\" *ngIf=\"varientLoading\">\r\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '100%',\r\n 'border-radius': '10px'\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #branding>\r\n <div class=\"row w-100\">\r\n <ng-container *ngFor=\"let brand of brandPromises\">\r\n <div class=\"col-4 d-flex flex-column align-items-center g-2\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"brand?.logoUrl\" alt=\"\" class=\"w-h-40 p-0 rounded-circle\">\r\n <div class=\"brand-text w-100 text-center py-2\">\r\n {{brand?.title | titlecase}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #videoCallSchedule>\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container>\r\n <div class=\"row w-100 video-container\">\r\n <div class=\"col-4 video-call-img\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/355007c175362077266611289-229221023_small.gif\"\r\n alt=\"\" class=\"w-100 h-100 \">\r\n </div>\r\n <div class=\"col-8 align-content-center\">\r\n <div class=\"video-head-text\">\r\n Live Video Call\r\n </div>\r\n <div class=\"sub-text\">\r\n Join a live video call with our consultants to see your favourite designs up close!\r\n </div>\r\n <button class=\"sch-btn text-center cursor-pointer\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(2)\" [buttonId]=\"getButtonId(2)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(2)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n Schedule a Video Call\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #DeliverySection>\r\n <div class=\"delivery-container\">\r\n <h2 class=\"delivery-title\">Delivery, Stores & Trial</h2>\r\n\r\n <!-- Location Section -->\r\n <div class=\"location-section mb-2\">\r\n <div class=\"location-container d-flex align-items-center justify-content-between\"\r\n [style.borderColor]=\"styles?.background?.accentColor\">\r\n <div class=\"d-flex align-items-center flex-grow-1 me-2\" style=\"width: calc(100% - 100px);\">\r\n <div class=\"d-flex mx-1\"><mat-icon\r\n class=\"gps d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" class=\"postal-code-input flex-grow-1\" placeholder=\"Enter PinCode\" [(ngModel)]=\"pincode\"\r\n style=\"width: 100%;\">\r\n </div>\r\n <button class=\"btn locate-btn\" (click)=\"getStoreDetails()\">Submit</button>\r\n </div>\r\n <div *ngIf=\"!isPinCode\" style=\"color: red;\">Pin code must be 6 digits.</div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(pincode?.toString().length ?? 0) == 6\">\r\n <!-- Free Delivery Section -->\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-gift\">\r\n <polyline points=\"20 12 20 22 4 22 4 12\"></polyline>\r\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"5\"></rect>\r\n <line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"7\"></line>\r\n <path d=\"M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z\"></path>\r\n <path d=\"M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z\"></path>\r\n </svg>\r\n </span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges == 0\">Expected\r\n Delivery by {{ getDateAfterxDays() | date:'d MMM' }}</span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges > 0\">Your\r\n expected Order will\r\n Deliver by {{ getDateAfterxDays() | date:'d MMM' }} with a Delivery Charge of\r\n \u20B9 {{ecomConfigs?.deliveryCharges | number:'1.2-2'}}</span>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #TryAtHome>\r\n <!-- Try At Home Section -->\r\n <div class=\"try-home-section\">\r\n <div class=\"d-flex align-items-start try-home-item\">\r\n <span class=\"home-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-home\">\r\n <path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"></path>\r\n <polyline points=\"9 22 9 12 15 12 15 22\"></polyline>\r\n </svg>\r\n </span>\r\n <div class=\"try-home-details\">\r\n <div class=\"try-home-header\">\r\n <span class=\"try-home-text\">Try At Home</span>\r\n <span class=\"free-text\"> (It's Free)</span>\r\n </div>\r\n <div class=\"home-appointment-text\">Home Appointment <span>Available to try from 29 Jul</span></div>\r\n <!-- <div class=\"appointment-text\">\r\n Home Appointment <span class=\"appointment-available\">Available to try from 28 Jun</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex-align-items-center justify-content-center w-100\">\r\n <button class=\"book-appointment-btn\" (click)=\"addToTrialCart()\" *ngIf=\"!isItemAddedAsTrial\">Try at\r\n HOME</button>\r\n <button class=\"book-appointment-btn\" *ngIf=\"isItemAddedAsTrial\">HOME APPOINTMENT BOOKED</button>\r\n </div>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #StoreSection>\r\n <!-- Nearest Store Section -->\r\n <ng-container\r\n *ngIf=\"storeDetails?.nearbyStore?.storeName && storeDetails?.nearbyStore?.storeName?.length > 0\">\r\n <div class=\"store-section\">\r\n <div class=\"d-flex align-items-center store-item\">\r\n <span class=\"store-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\r\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\r\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\r\n </svg>\r\n </span>\r\n <div class=\"store-details\">\r\n <div class=\"store-text\">\r\n <span class=\"store-label\">Nearest Store - </span>\r\n <span class=\"store-name\">{{ storeDetails?.nearbyStore?.storeName | titlecase}}</span>\r\n <!-- <span class=\"store-distance\"> (4km)</span> -->\r\n </div>\r\n <!-- <div class=\"availability-section\">\r\n <span class=\"availability-badge\">\u23F0 AVAILABLE BY 28 JUN</span>\r\n </div> -->\r\n <!-- <div class=\"other-stores-text\">\r\n Also Available in <span class=\"other-stores-link\">18 other stores</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center w-100\">\r\n <button class=\"find-store-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"onFindInStore(storeDetails?.nearbyStore?.id)\">FIND IN\r\n STORE</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #emptyStore>\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\r\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\r\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\r\n </svg>\r\n </span>\r\n <span class=\"delivery-text\">No Stores are available</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-variant\" tabindex=\"-1\" id=\"offcanvasRightVariant\"\r\n aria-labelledby=\"offcanvasRightLabel\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price px-3 pb-2\">\r\n <div class=\"price-text\">Price</div>\r\n <div class=\"d-flex g-3 align-items-center\">\r\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.discountedPrice}}</div>\r\n <div class=\"price\"\r\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\"\r\n [ngClass]=\"{'text-decoration-line-through': responseData?.price?.discountedPrice}\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}</div>\r\n </div>\r\n </div>\r\n <div class=\"varient-container h-100 p-3\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"varient-data\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"confirm-btn w-100 p-3 text-center cursor-pointer\" data-bs-dismiss=\"offcanvas\"\r\n [style.background]=\"data?.styles?.background?.accentColor\" style=\"color: white;\">Confirm\r\n Customization</div>\r\n</div>\r\n\r\n<ng-template #dialogBox>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header d-flex align-item-center\">\r\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\r\n <div class=\"schedule-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon (click)=\"matCloseDialog()\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"modal-body h-100\">\r\n <div class=\"row h-100 w-100 video-call-container\">\r\n <div class=\"col-6 h-100\" *ngIf=\"!isMobile\">\r\n <img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/557699c1753779503913freepik-overhead-shot-a-person-holding-a-smartphone-with-a-1029_vmg8GqHj (online-video-cutter.com).gif\"\r\n alt=\"\" class=\"w-100 h-100\" style=\"object-fit: cover;\">\r\n </div>\r\n <div class=\"col-6 position-relative h-100 call-details\">\r\n <!-- Name Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\r\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\r\n (input)=\"onInputChange('username')\">\r\n </div>\r\n\r\n <!-- <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\r\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\r\n (input)=\"onInputChange('email')\">\r\n </div> -->\r\n\r\n <!-- Mobile Number Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\r\n <div class=\"sub-text-call\">IN +91</div>\r\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\r\n (input)=\"onInputChange('mobileNumber')\" (wheel)=\"$event.preventDefault()\">\r\n </div>\r\n\r\n\r\n <!-- Pincode Input with Validation -->\r\n <!-- <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\r\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-0\">\r\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\r\n (input)=\"onInputChange('pincode')\">\r\n </div> -->\r\n <div class=\"language my-3\">\r\n <div class=\"mini-text mb-2\">Language Preference</div>\r\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\r\n <ng-container *ngFor=\"let lang of languages\">\r\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\r\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectedLang = lang\"\r\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\r\n {{lang}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"selectedLang == 'Others'\">\r\n <div class=\"input-field my-3\">\r\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\r\n </div>\r\n </ng-container>\r\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" [disabled]=\"isSubmitting\" [style.background]=\"data?.styles?.background?.accentColor\" [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\r\n <ng-container *ngIf=\"isSubmitting\">\r\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n SCHEDULING...\r\n </ng-container>\r\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\r\n <div (click)=\"scheduleVideoCall()\" class=\"d-flex align-items-center\">\r\n <mat-icon>video_call</mat-icon> \r\n SCHEDULE A VIDEO CALL\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"scheduled\">\r\n <mat-icon>check_circle</mat-icon> \r\n SCHEDULED SUCCESSFULLY\r\n </ng-container>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-small overflow-scroll\" tabindex=\"-1\" id=\"offcanvasRightPriceBreakup\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price p-10-20\">\r\n <div class=\"price-break-header\">{{responseData?.name}}</div>\r\n </div>\r\n <div class=\"price-breakup h-100 w-100\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"price-container mb-3 p-10-20\">\r\n <div class=\"price-container-header\">\r\n {{ ele.materialType + \" BREAKUP\" }}\r\n </div>\r\n <div class=\"row w-100 header-row\">\r\n <div class=\"col-3 text-center\">COMPONENT</div>\r\n <div class=\"col-3 text-center\">RATE</div>\r\n <div class=\"col-3 text-center\">WEIGHT</div>\r\n <div class=\"col-3 text-center\">FINAL VALUE</div>\r\n </div>\r\n <div class=\"row w-100 value-row\">\r\n <div class=\"col-3 text-center\">{{ ele.purity | titlecase }}</div>\r\n <div class=\"col-3 text-center\">\u20B9{{ getPricePerGram(ele.pricePerUnit,ele.materialType) |\r\n number:'1.2-2' }}</div>\r\n <div class=\"col-3 text-center\">{{ele.quantity + ' ' + (ele.unit | titlecase)}}</div>\r\n <div class=\"col-3 text-center total\">\u20B9{{ ele.pricePerUnit * ele.quantity | number }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"price-container mb-3 p-10-30 py-0 border-unset\">\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Making Charges</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Tax Amount</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Total Amount</div>\r\n <div class=\"col-6 text-end total\">\r\n \u20B9{{(responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #ReviewsSection>\r\n <div class=\"rv-section\" *ngIf=\"reviewsData\">\r\n\r\n <!-- Header: Title + Average | Bar Chart -->\r\n <div class=\"rv-header\">\r\n <div class=\"rv-header-left\">\r\n <h2 class=\"rv-title\">Reviews & Ratings</h2>\r\n <div class=\"rv-average-row\">\r\n <!-- filled stars -->\r\n <div class=\"rv-stars\">\r\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n <span class=\"rv-avg-num\">{{responseData?.averageRating | number:'1.1-1'}}</span>\r\n <span class=\"rv-avg-label\">average</span>\r\n </div>\r\n <div class=\"rv-count\" [style.color]=\"styles?.background?.accentColor || '#10b981'\">\r\n {{responseData?.totalReviewCount | number}} Reviews\r\n </div>\r\n </div>\r\n\r\n <div class=\"rv-bars\">\r\n <ng-container *ngFor=\"let rating of [5,4,3,2,1]\">\r\n <div class=\"rv-bar-row\">\r\n <span class=\"rv-bar-label\">{{rating}}</span>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n <div class=\"rv-bar-track\">\r\n <div class=\"rv-bar-fill\" [style.width.%]=\"getPercentage(rating)\"></div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Review Cards Grid -->\r\n <div class=\"rv-grid\">\r\n <ng-container *ngFor=\"let review of reviewsData\">\r\n <ng-container *ngIf=\"review.review\">\r\n <div class=\"rv-card\">\r\n <div class=\"rv-card-top\">\r\n <div class=\"rv-reviewer\">\r\n <img [src]=\"'https://ui-avatars.com/api/?name=' + (review?.userName ?? 'U') + '&background=random'\"\r\n class=\"rv-avatar\" alt=\"\">\r\n <div class=\"rv-name-date\">\r\n <span class=\"rv-name\">{{review?.userName ?? 'Anonymous'}}</span>\r\n <span class=\"rv-date\">{{review?.createdAt | date:'d MMM y'}}</span>\r\n </div>\r\n </div>\r\n <!-- Star rating -->\r\n <div class=\"rv-card-stars\">\r\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\r\n <svg *ngIf=\"s <= review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n <svg *ngIf=\"s > review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" style=\"opacity:0.25\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <p class=\"rv-text\">{{review?.review ?? 'No comment provided.'}}</p>\r\n\r\n <!-- Review Images -->\r\n <div class=\"rv-images\" *ngIf=\"review?.reviewImages?.length\">\r\n <a *ngFor=\"let img of review.reviewImages\" [href]=\"img.imgUrl\" target=\"_blank\" class=\"rv-img-link\">\r\n <img [src]=\"img.imgUrl\" alt=\"Review image\" class=\"rv-img-thumb\" onerror=\"this.style.display='none'\">\r\n </a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"text-center mt-4\" *ngIf=\"(reviewsData?.length ?? 0) > 3\">\r\n <button class=\"write-review-btn\" (click)=\"loadMoreReviews()\">Load More Reviews</button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"modal fade\" id=\"exampleModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" role=\"dialog\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-dialog-centered video-modal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-body\" style=\"height: 100%;\">\r\n <video controls muted playsinline style=\"width: 100%; height: 100%;\">\r\n <source\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/371647c1753962084265clideo_editor_48bc93c24e18470888c661bb09e437da (online-video-cutter.com).mp4\"\r\n type=\"video/mp4\">\r\n Your browser does not support the video tag.\r\n </video>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal fade\" id=\"reviewModal\" tabindex=\"-1\" aria-labelledby=\"reviewModalLabel\" role=\"dialog\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog review-modal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h1 class=\"modal-title fs-5\"></h1>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"detail-review-container\">\r\n <div class=\"image-section\">\r\n <div class=\"product-image\">\r\n <div class=\"backward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex-1\"\r\n *ngIf=\"currentImageIndex > 0\">\u25BC</div>\r\n <img [src]=\"selectedReview?.reviewImages?.[currentImageIndex]?.imgUrl\" alt=\"\">\r\n <div class=\"forward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex+1\"\r\n *ngIf=\"currentImageIndex < selectedReview?.images?.length - 1\">\u25B2</div>\r\n <!-- <div class=\"earbuds-container\">\r\n <div class=\"charging-case\"></div>\r\n <div class=\"earbud left\"></div>\r\n <div class=\"earbud right\"></div>\r\n </div> -->\r\n </div>\r\n <!-- <div class=\"navigation-arrows\">\r\n </div> -->\r\n </div>\r\n\r\n <div class=\"review-section\">\r\n <div class=\"reviewer-header\">\r\n <div class=\"reviewer-avatar\">\uD83D\uDC64</div>\r\n <div class=\"reviewer-name\">{{selectedReview?.userName ?? \"-\"}}</div>\r\n </div>\r\n\r\n <div class=\"detail-rating\" *ngIf=\"selectedReview?.rating\">\r\n <p-rating [(ngModel)]=\"selectedReview.rating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\r\n </div>\r\n\r\n <div class=\"review-date\">\r\n Reviewed in India on 24 July 2025\r\n </div>\r\n\r\n <div class=\"review-text\">\r\n {{selectedReview?.review ?? \"-\"}}\r\n </div>\r\n\r\n <div class=\"images-section\">\r\n <h3>Images in this review</h3>\r\n <div class=\"review-images\">\r\n <div class=\"review-image\" [ngClass]=\"{'selected': currentImageIndex == i}\"\r\n *ngFor=\"let img of selectedReview?.reviewImages ?? [];let i = index\" (click)=\"currentImageIndex = i\">\r\n <img [src]=\"img.imgUrl\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".product-desc{display:flex}::ng-deep .product-desc table,::ng-deep .brief-desc table{border-collapse:collapse;width:100%;margin:10px 0}::ng-deep .product-desc table td,::ng-deep .product-desc table th,::ng-deep .brief-desc table td,::ng-deep .brief-desc table th{border:1px solid #dddddd!important;text-align:left;padding:8px}*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}::ng-deep .smooth-panel .p-panel-header{cursor:pointer;background:transparent;border:unset;font-size:18px;font-weight:700;padding:0}::ng-deep .smooth-panel .p-panel-content{border:unset;padding:0}.jewel-container{border-radius:12px;box-shadow:#63636333 0 2px 8px}.jewel-header{padding:8px 10px;border-radius:12px 12px 0 0;font-size:15px;font-weight:700;color:#4f3267}.br-p{border-radius:0 0 12px 12px;padding:10px 0}.row-header{font-size:13px;font-weight:700;color:#4f3267}.row-content{color:#4e555e}.jewellery-table-container{border-radius:12px}.jewellery-table{width:100%;border-collapse:collapse;border:1px solid #ddd;transition:all .3s ease}.jewellery-table th,.jewellery-table td{border:1px solid #ddd;padding:12px;text-align:left;transition:background-color .2s ease}.material-header td{background-color:#f8f9fa;font-weight:700;font-size:16px}.column-header{background-color:#f1f1f1}.column-header th{font-weight:600}.material-row:hover{background-color:#f5f5f5}.charges-header th,.total-header th,.total-header td{background-color:#eaeaea;font-weight:700}.total-row td{font-weight:700;font-size:18px;background-color:#f8f8f8}@media screen and (max-width: 600px){.jewellery-table{font-size:14px}.jewellery-table th,.jewellery-table td{padding:8px}}.share-icon,.favourite{border-radius:50%!important;height:30px;width:30px;padding:6px;display:flex;align-items:center;justify-content:center;background-color:#f1f5f9!important;cursor:pointer;transition:all .2s ease;border:none!important}:is(.share-icon,.favourite) mat-icon{font-size:20px;width:20px;height:20px;display:flex;align-items:center;justify-content:center}.share-icon:hover,.favourite:hover{background-color:#e2e8f0!important;transform:scale(1.05)}.header-text{font-size:17px;font-weight:bolder}.pricebreakup-btn{font-size:11px;font-weight:700;padding:8px;border-radius:8px;letter-spacing:.5px}.pricebreakup-btn mat-icon{font-size:18px;display:flex;align-items:center}.img-list{display:flex;gap:5px;max-height:460px}.img-list img{height:100px;width:100px;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:100%;aspect-ratio:1/1;overflow:hidden}.item-img img{width:100%!important;height:100%!important;object-fit:cover}.price{font-weight:600;font-size:24px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:1px solid;align-items:center;gap:15px;height:44px;width:75%;justify-content:space-between;border-radius:12px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.fc{font-size:17px;font-weight:700}.tab-group{display:flex;gap:10px}.tab{font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black;max-width:max-content}.discount-price{font-size:1.4rem}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#f7f7f7;padding:11px 20px;border-radius:12px;margin-top:unset!important;width:70%!important;border:1px solid #d3d3d347}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#f7f7f7;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:7px 25px;cursor:pointer;font-weight:600}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:5px;height:44px!important;justify-content:space-between;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:14px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.w-h-40{width:40px!important;height:40px!important}.height{height:auto;overflow-y:visible}.mobile-footer{display:none}video{border-radius:18px}@media (min-width: 1024px){.zoom:hover{transform:scale(1.04);transition:transform .2s ease-in-out;overflow:hidden}.product-heading{font-size:20px;font-weight:600;margin-top:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.product-desc{font-size:13px}.brief-desc{font-size:16px;margin-top:unset!important}.total-container{padding-top:10px!important;padding-bottom:4rem!important}.out-of-stock,.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important;height:348px}.item-img img{width:100%;height:348px!important}.display-none{display:none}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{width:25%;border:2px solid lightgray;cursor:pointer}.input-field{margin-top:.7rem!important;margin-bottom:.7rem!important}.prod-desc{margin-top:20px}.video-call-container{margin:0!important}.product-img{height:220px}.call-details{width:100%!important;padding:3%!important}.send-btn{padding:.5rem 1rem!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%;height:auto}.product-heading{font-size:23px;font-weight:600}.discount-price{font-size:1.7rem!important}.header-text{font-size:20px!important}}.send-btn{font-size:14px!important;padding:1rem;display:flex;align-items:center;justify-content:center;text-transform:uppercase;font-weight:600}.send-btn mat-icon{height:20px;width:20px;font-size:18px}a{text-decoration:none}.brief-desc{font-size:14px;color:#4e555e}.total-container{height:auto;position:relative;display:block!important;overflow:visible}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%;margin:unset!important}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}}@media (min-width:1024px){.product-headig{font-size:35px}}.mat-accordion .mat-expansion-panel:last-of-type{box-shadow:none}@media (min-width: 1400px){.container{max-width:unset;width:95%;height:100vh;overflow-y:auto}}.width-max{width:max-content}.fw-600{font-weight:600}.cursor-pointer{cursor:pointer}.offcanvas-variant{border-radius:30px 0 0 30px}.varient-header,.varient-price{background:#f7f7f7}.varient-header{border-radius:30px 0 0}.confirm-btn{border-radius:0 0 0 30px;position:absolute!important;bottom:0!important}.style2-container{border:1px solid;border-radius:12px;margin:0}.varient-item{border-right:1px solid;align-content:center}.variant-head{font-size:12px;color:#33363e}.varient-data{margin-bottom:25px;border-bottom:1px solid black;padding-bottom:25px}.variant-value{font-size:.9rem;color:#000}.custom-text{border-radius:0 8px 8px 0;font-size:.9rem;font-weight:600}.scroll-wrap{flex-wrap:nowrap}.brand-text{word-wrap:break-word;white-space:normal;font-size:12px;font-weight:600;line-height:20px}.video-container{border:1px solid rgb(240,240,240);margin:10px 0;border-radius:12px}.video-head-text{font-size:16px;font-weight:700}.sub-text{font-size:11px;color:#6f7377;margin-bottom:10px}.sch-btn{font-size:1.2rem!important;color:#fff;padding:3px 0;margin-top:5px}.tax-text{font-size:.7rem;color:#6f7377}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.delivery-container{margin:35px 0 15px;background-color:transparent}.delivery-title{font-size:16px;font-weight:600;margin:0 0 12px;line-height:1.2;margin-bottom:.5rem!important}.location-container{border:1px solid #cfcfcf;border-radius:12px;padding:10px;margin-bottom:5px;width:100%}.location-icon{width:20px;height:20px;background-color:#374151;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.location-icon:before{content:\"\";width:8px;height:8px;background-color:#fff;border-radius:50%;position:absolute}.postal-code-input{font-size:12px;font-weight:600;letter-spacing:.5px;border:none;outline:none;background:transparent;width:90%}.postal-code-input::placeholder{font-weight:500}.locate-btn{background:none!important;border:none!important;font-weight:600;color:#111827;font-size:13px!important;padding:0!important;box-shadow:none!important;width:auto!important;white-space:nowrap}.gps{font-size:17px}.locate-btn:focus{box-shadow:none!important}.delivery-section{margin-bottom:15px;border:1px solid rgb(240,240,240);padding:10px;border-radius:12px}.delivery-icon{font-size:18px;color:#ec4899;margin-right:14px;width:20px}.delivery-text{font-size:14px;font-weight:700}.store-section{border:1px solid rgb(240,240,240);padding:10px;border-radius:12px;margin-bottom:15px}.store-item{margin-bottom:11px}.store-icon{font-size:18px;color:#f97316;margin-right:14px;margin-top:2px;width:20px}.store-details{flex:1}.store-text{font-size:14px}.store-name{font-weight:700}.availability-section{margin-bottom:6px}.availability-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;color:#d97706;background-color:#fef3c7;padding:4px 8px;border-radius:12px;letter-spacing:.5px}.other-stores-text{font-size:14px;color:#6b7280;line-height:1.4}.other-stores-link{color:#6b46c1;cursor:pointer;text-decoration:underline}.other-stores-link:hover{color:#553c9a}.find-store-btn{width:100%!important;padding:8px 20px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px}.try-home-section{border-radius:12px;padding:10px;border:1px solid rgb(240,240,240)}.try-home-item{margin-bottom:10px;padding:0}.home-icon{font-size:18px;color:#6b46c1;margin-right:14px;margin-top:2px;width:20px}.try-home-details{flex:1}.try-home-text{font-size:14px;font-weight:700;color:#374151}.free-text{font-size:14px;color:#6b7280}.appointment-text{font-size:14px;color:#6b7280;line-height:1.4}.appointment-available{font-weight:500;color:#374151}.book-appointment-btn{background:#111827;color:#fff;border:none;padding:10px 20px;border-radius:12px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px;transition:all .2s ease;width:100%}.book-appointment-btn:hover{background:#000;transform:translateY(-1px);box-shadow:0 4px 8px #0000001a}@media (max-width: 480px){.container{display:flex;align-items:center;flex-direction:column}.location-section{padding:12px 0}.try-home-section{padding:20px}}.w-90{width:90%}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.w-12{width:12%!important}.w-88{width:88%!important}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;position:absolute;bottom:20px;left:10px;width:95%!important}.mini-text{font-size:13px}.lang{font-size:12px;align-content:center;background:#f6f3f9}.error-border{border:2px solid #dc3545!important}.offcanvas-small{height:72vh;top:25%;width:35%;border-radius:50px 0 0 50px}.rating{width:max-content;border:1px solid;border-radius:20px;padding:0 10px;margin-bottom:.5rem}.rating-no{padding-right:7px;margin:0;border-right:1px solid;font-size:.75rem}.p-10-20{padding:10px 30px}.price-break-header{font-size:19px;font-weight:600}.price-container{border-bottom:1px solid rgb(233,233,233)}.price-container-header{font-size:14px;font-weight:600;color:#333}.total-ratings{font-size:.75rem}.header-row .col-3{font-size:12px;font-weight:500;color:#666}.value-row .col-3{font-size:14px;font-weight:400;color:#333}.value-row .col-3.total{font-weight:600}.summary-row .col-6{font-size:15px;font-weight:500;color:#333;padding:unset}.summary-row .col-6.total{font-weight:600;padding-right:10px}.summary-row{padding:0 42px}.error-border{border:2px solid #e74c3c!important;box-shadow:0 0 5px #e74c3c4d!important}.form-control,.input-field input{transition:border-color .3s ease,box-shadow .3s ease}.error-border:focus{border-color:#e74c3c!important;box-shadow:0 0 8px #e74c3c80!important}.input-field input:focus{transform:scale(1.02)}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:-.125em;border:.125em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:.875rem;height:.875rem;border-width:.125em}@keyframes spinner-border{to{transform:rotate(360deg)}}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.rv-section{padding:2rem 0;background:transparent}.rv-header{display:flex;justify-content:space-between;align-items:flex-start;gap:3rem}.rv-header-left{flex:1}.rv-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:.75rem}.rv-average-row{display:flex;align-items:center;gap:.5rem;margin-bottom:.4rem}.rv-stars{display:flex;gap:2px}.rv-avg-num{font-size:1.4rem;font-weight:700;color:#111827}.rv-avg-label{font-size:.95rem;color:#6b7280;font-weight:400}.rv-count{font-size:.9rem;font-weight:600}.rv-bars{flex:1;max-width:420px;display:flex;flex-direction:column;gap:6px}.rv-bar-row{display:flex;align-items:center;gap:3px}.rv-bar-label{font-size:15px;font-weight:600;color:#111827;width:10px;text-align:right;flex-shrink:0}.rv-bar-track{flex:1;height:10px;background-color:#f3f4f6;border-radius:3px;overflow:hidden}.rv-bar-fill{height:100%;background-color:#eab308;border-radius:3px}.rv-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem}.rv-card{padding:12px;border:1px solid #e5e7eb;border-radius:10px;background:#fff}.rv-card-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:.85rem}.rv-reviewer{display:flex;align-items:center;gap:.7rem}.rv-avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;flex-shrink:0}.rv-name-date{display:flex;flex-direction:column;gap:2px}.rv-name{font-size:16px;font-weight:600;color:#374151}.rv-date{font-size:.75rem;color:#9ca3af}.rv-card-stars{display:flex;gap:2px;flex-shrink:0}.rv-text{font-size:.88rem;line-height:1.65;color:#4b5563;margin:0}.rv-images{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}.rv-img-link{display:block;flex-shrink:0;border-radius:8px;overflow:hidden;border:1px solid #e5e7eb}.rv-img-thumb{width:72px;height:72px;object-fit:cover;display:block;transition:transform .2s ease}.rv-img-link:hover .rv-img-thumb{transform:scale(1.05)}@media (max-width: 768px){.rv-header{flex-direction:column;gap:1.5rem}.rv-bars{max-width:100%}.rv-grid{grid-template-columns:1fr}}.review-section{padding:4rem 1rem;border-top:1px solid #f3f4f6;margin-top:4rem;background:transparent!important}.review-summary-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4rem;gap:3rem}.rating-summary-left{flex:1}.rating-summary-left h2.reviews-header-title{font-size:1.75rem;font-weight:700;margin-bottom:0;color:#111827}.average-score-container{display:flex;align-items:center;gap:.75rem;margin-bottom:.5rem}.average-score{color:#111827;display:flex;align-items:baseline;gap:8px}.average-score .score-num{font-size:1.5rem;font-weight:700}.average-score .score-text{font-size:1.1rem;font-weight:400;color:#111827}.total-reviews-count{font-weight:600;font-size:1.1rem;display:block}.rating-distribution{flex:1;max-width:480px}.rating-bar-row{display:flex;align-items:center;gap:1.25rem;margin-bottom:.85rem}.star-label{display:flex;align-items:center;justify-content:flex-start;width:35px;line-height:1}.progress-bar-bg{flex:1;height:12px;background-color:#f3f4f6;border-radius:9999px;overflow:hidden}.progress-bar-fill{height:100%;background-color:#eab308;border-radius:9999px}.review-actions-bar-minimal{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem}.write-review-btn-minimal{padding:.6rem 1.25rem;background:#f8f9fa;color:#4b5563;border:none;border-radius:8px;font-weight:500;font-size:.9rem;cursor:pointer;transition:all .2s}.write-review-btn-minimal:hover{background:#e5e7eb}.sort-dropdown-minimal select{padding:.6rem 2.25rem .6rem 1rem;border:1px solid #d1d5db;border-radius:8px;background:#fff;font-size:.9rem;color:#4b5563;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%236b7280'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right .75rem center;background-size:1rem;cursor:pointer}.reviews-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1.5rem}.review-card{padding:1.5rem;border:1px solid #e5e7eb;border-radius:12px;background:#fff;box-shadow:none}.review-divider{margin:2rem 0;border:none;border-top:1px solid #f3f4f6}.reviews-header-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:0}.review-card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1.25rem}.reviewer-info{display:flex;align-items:center;gap:1rem}.reviewer-avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#f3f4f6}.reviewer-name{font-weight:600;font-size:.95rem;color:#374151}.review-date-text{font-size:.8rem;color:#9ca3af}.reviewer-name-date{display:flex;flex-direction:row;align-items:center;gap:8px}.review-card-rating{display:flex;gap:2px}.review-card-text{font-size:1rem;line-height:1.7;color:#4b5563}.product-tabs-container{border-bottom:1px solid #f3f4f6;margin-bottom:8px}.tab-item{padding:1rem 0;font-weight:600;font-size:1.1rem;color:#6b7280;cursor:pointer;position:relative;transition:color .2s}.tab-content-pane h3{font-size:1.5rem;font-weight:700;margin-bottom:1.5rem}.tab-content-pane p{color:#4b5563;line-height:1.8;font-size:1.05rem}@media (max-width: 1024px){.reviews-grid{grid-template-columns:1fr}}@media (max-width: 768px){.review-summary-header{flex-direction:column;gap:2rem}.rating-distribution{max-width:100%}.bento-grid{height:auto;display:flex;flex-direction:column}.tabs-list{gap:1.5rem;overflow-x:auto}}.home-appointment-text{font-size:.8rem;color:#4e555e}.home-appointment-text span{font-weight:600}.video-call-img{height:120px;margin:0;padding:0;border-radius:45px}.video-call-img img{border-top-left-radius:12px;border-bottom-left-radius:12px}.discount{background:#fff3f2;padding:15px 15px 20px;margin-top:14px;border-radius:8px;display:flex;flex-direction:column;gap:5px;position:relative}.discount p{margin-bottom:0;color:#4f3267;font-weight:700;font-size:1rem}.discount .offer{color:#eb4f5c}.discount:before{content:\"\";display:block;height:44px;width:4px;background:#eb4f5c;position:absolute;left:0;top:16px;border-top-right-radius:20px;border-bottom-right-radius:20px}.metal-purity{display:flex;flex-direction:column;gap:10px}.scrollable-content{height:100%;max-height:95vh;overflow-y:auto}.style-2-img{max-height:70%;height:100%!important}.ring-size-video{background:#f0ebff;display:flex;justify-content:space-between;align-items:center;height:45px;padding:12px;border-radius:10px;margin-top:20px;margin-bottom:20px}.ring-size-video .text{color:#4f3267;font-size:.9rem}.ring-size-video .learn-how{color:#de57e9;font-weight:700;font-size:1rem;display:flex;gap:5px;align-items:center;cursor:pointer}.ring-size-video .learn-how mat-icon{font-size:20px;display:flex;align-items:center}.ring-size-video p{margin-bottom:0}.video-modal{height:90vh!important;width:90vw!important;max-width:none}.video-modal .modal-body{padding:0}.review-section{border-radius:10px;padding:15px}.review-img{display:flex;gap:10px;margin-top:10px}.review-img img{max-width:100px;max-height:140px}.detail-review-container{display:flex;max-width:1200px;margin:0 auto;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 10px #0000001a}.image-section{flex:1;background:#000;position:relative;min-height:400px}.product-image{width:100%;height:100%;object-fit:cover;background:linear-gradient(135deg,#e8e8e8,#d0d0d0);display:flex;align-items:center;justify-content:center;max-height:400px;position:relative}.product-image img{height:100%;width:100%;object-fit:contain}.earbuds-container{position:relative;width:300px;height:200px}.charging-case{width:200px;height:120px;background:linear-gradient(145deg,#f0f0f0,#e0e0e0);border-radius:25px;position:absolute;top:40px;left:50px;box-shadow:inset 0 4px 8px #0000001a}.charging-case:before{content:\"\";position:absolute;inset:10px;background:linear-gradient(145deg,#e8e8e8,#d8d8d8);border-radius:15px;box-shadow:inset 0 2px 4px #0000001a}.earbud{position:absolute;width:45px;height:15px;background:linear-gradient(145deg,#2a2a2a,#1a1a1a);border-radius:8px;box-shadow:0 2px 4px #0003}.earbud:before{content:\"noise\";position:absolute;top:2px;left:50%;transform:translate(-50%);font-size:6px;color:#888;font-weight:300}.earbud.left{top:70px;left:80px}.earbud.right{top:90px;left:130px}.earbud.right:before{color:#ff6b35}.review-section{flex:1;padding:30px;background:#fafafa}.reviewer-header{display:flex;align-items:center;margin-bottom:15px}.reviewer-avatar{width:40px;height:40px;background:#ccc;border-radius:50%;margin-right:12px;display:flex;align-items:center;justify-content:center;font-size:18px;color:#666}.reviewer-name{font-size:16px;font-weight:500;color:#333}.detail-rating{margin:10px 0}.stars{display:flex;gap:2px;margin-bottom:5px}.star{color:#ff9500;font-size:18px}.thumbs{display:flex;gap:5px}.thumb{color:#ff9500;font-size:16px}.review-date{font-size:14px;color:#666;margin:15px 0}.review-text{font-size:16px;line-height:1.5;color:#333;margin-bottom:25px}.images-section h3{font-size:16px;color:#666;margin-bottom:15px;font-weight:500}.review-images{display:flex;gap:10px}.review-image{width:60px;height:60px;background:#ddd;border-radius:6px;border:2px solid #e0e0e0;cursor:pointer;transition:border-color .3s}.review-image img{width:100%;height:100%}.review-image:hover,.review-image.selected{border-color:#007185}.navigation-arrows{position:absolute;top:20px;right:20px;display:flex;flex-direction:column;gap:10px}.arrow{width:40px;height:40px;background:#fffc;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:18px;color:#666;transition:background-color .3s;position:absolute;transform:rotate(90deg)}.backward-arrow{left:10px}.forward-arrow{right:10px}.arrow:hover{background:#fff}@media (max-width: 768px){.review-container{flex-direction:column}.image-section{min-height:300px}.review-section{padding:20px}}.review-modal{max-width:none;width:70vw}.review-modal .modal-body{padding:0}@media screen and (max-width: 475px){.offcanvas-small{height:100vh;width:100%;top:0}.review-modal{margin:0;height:100%;width:100%}.detail-review-container{flex-direction:column;height:100%}.product-image{max-height:289px}.image-section{min-height:289px}.video-modal{margin:0;height:100vh!important;width:100vw!important;overflow:hidden}}.modal{z-index:100000033}.breadcrumbs-modern{font-size:.85rem;color:#6b7280;margin-bottom:.5rem}.breadcrumb-item.active{color:#111827;font-weight:500}.product-title-modern{font-size:2rem;font-weight:800;color:#111827;margin:0;line-height:1.2;font-family:var(--website-font-family)}.product-price-modern{font-size:1.75rem;font-weight:700;color:#111827;font-family:var(--website-font-family)}.rating-line-modern{margin-top:.25rem}.rating-score-text{font-weight:700;font-size:1rem;color:#111827}.rating-count-text{font-size:.95rem;color:#10b981;font-weight:600;cursor:pointer}.product-description-brief{font-size:1rem;line-height:1.7;color:#4b5563;margin-top:1.5rem}.low-stock-text{color:#dc2626;font-weight:700;font-size:.875rem}.variants-modern-container{margin:2.5rem 0}.varient-key{font-size:.9rem;font-weight:800;color:#111827;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.75rem}.color-swatch-modern{width:36px;height:36px;border-radius:50%;cursor:pointer;border:3px solid white;box-shadow:0 0 0 1px #e5e7eb;transition:all .25s cubic-bezier(.4,0,.2,1)}.color-swatch-modern:hover{transform:scale(1.15)}.color-swatch-modern.active{box-shadow:0 0 0 2px #111827}.box-varient-modern{padding:.75rem 1.5rem;border:2px solid #f3f4f6;border-radius:10px;font-size:.95rem;font-weight:700;color:#374151;cursor:pointer;transition:all .2s;min-width:70px;text-align:center;background:#fff}.box-varient-modern:hover{border-color:#d1d5db;background:#f9fafb}.box-varient-modern.active{border-color:#111827;background:#111827;color:#fff}.quantity-container{margin-top:1rem}.quantity-selector-modern{border:1px solid #e5e7eb;border-radius:12px;width:fit-content;background:#f9fafb;padding:2px}.qty-btn{width:44px;height:44px;border:none;background:transparent;font-size:1.5rem;color:#111827;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;border-radius:10px}.qty-btn:hover:not(:disabled){background:#fff;box-shadow:0 2px 4px #0000000d}.qty-btn:disabled{color:#d1d5db;cursor:not-allowed}.qty-display{width:50px;text-align:center;font-weight:700;color:#111827;font-size:1.1rem}.out-of-stock-modern{background:#f3f4f6;color:#9ca3af;padding:1.1rem 2.5rem;border:none;border-radius:14px;font-weight:800;font-size:1.1rem;cursor:not-allowed}.wishlist-btn-modern{width:56px;height:56px;border:2px solid #f3f4f6;border-radius:14px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;background:#fff}.wishlist-btn-modern:hover{background:#fef2f2;border-color:#fecaca}.wishlist-btn-modern mat-icon{font-size:26px}.thumbnail-column{padding-right:15px!important}.thumbnail-list::-webkit-scrollbar{display:none}.thumbnail-list{-ms-overflow-style:none;scrollbar-width:none}.image-section-modern{padding-right:2.5rem!important;padding-left:0!important;width:60%!important;max-width:60%!important;flex:0 0 60%!important;margin-top:0!important}.detail-section-modern{padding-left:.5rem!important;padding-right:0!important;width:40%!important;max-width:40%!important;flex:0 0 40%!important;margin-top:0!important}.thumbnail-column{width:90px!important;flex:0 0 90px!important}.item-img{width:100%!important;max-width:100%;margin:0;border-radius:20px;overflow:hidden;background:#f9fafb;position:relative}lib-ngx-image-zoom{width:100%!important;display:block!important}::ng-deep .ngx-image-zoom-container{width:100%!important;height:auto!important;aspect-ratio:1/1}.style-1-vertical{display:flex;flex-direction:column;width:100%}.main-image-container{width:100%;aspect-ratio:1 / 1}.thumbnail-row{display:flex;gap:8px;overflow-x:auto;padding:12px 0}.thumbnail-img{min-width:80px;width:80px;height:80px;object-fit:cover;border-radius:8px;border:2px solid transparent;cursor:pointer;transition:border-color .2s}.active-thumb{border-width:2px;border-style:solid}.bento-grid{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:1fr 1fr;gap:15px;width:100%;aspect-ratio:5/4}.bento-item-large{grid-row:span 2;border-radius:24px;overflow:hidden}.bento-item-small{border-radius:20px;overflow:hidden}.bento-grid img{width:100%;height:100%;object-fit:cover;transition:transform .4s ease}.bento-grid img:hover{transform:scale(1.05)}@media (max-width: 991px){.image-section-modern,.detail-section-modern{width:100%!important;max-width:100%!important;flex:0 0 100%!important;padding:0!important}.bento-grid{grid-template-columns:1fr;grid-template-rows:auto;aspect-ratio:auto}.bento-item-large{grid-row:span 1}}.bento-masonry-container{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:1fr;gap:16px;width:100%}.bento-item-modern{border-radius:16px;overflow:hidden;background:#fdfdfd;aspect-ratio:1 / 1;transition:all .4s cubic-bezier(.4,0,.2,1)}.bento-img-modern{width:100%;height:100%;display:block;object-fit:cover;background:#fdfdfd;cursor:pointer;transition:transform .6s ease}.bento-item-modern:hover{transform:translateY(-4px);box-shadow:0 12px 30px #00000014}.bento-item-modern:hover .bento-img-modern{transform:scale(1.03)}.detail-section-modern{position:sticky;top:0;height:max-content;max-height:calc(100vh - 100px);overflow-y:auto;overflow-x:hidden;padding-left:2rem!important;scrollbar-width:none}.detail-section-modern::-webkit-scrollbar{display:none}.product-hero-card-modern{border:none;box-shadow:none;z-index:10;position:relative}.tabs-list{display:flex;justify-content:flex-start;gap:10px;list-style:none;padding:0;margin-bottom:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap}.tabs-list::-webkit-scrollbar{display:none}.tab-item{font-size:1rem;font-weight:600;color:#6b7280;padding:.5rem 1rem;border-radius:0;cursor:pointer;transition:all .25s;background:transparent;border-bottom:2px solid transparent;white-space:nowrap;flex-shrink:0}.tab-item:hover{background:transparent;color:#111827}.tab-content-pane{padding-top:.5rem}@media (max-width: 1024px){.product-hero-card-modern{padding:25px}.tab-content-pane{width:100%}}@media (max-width: 991px){.bento-masonry-container{grid-template-columns:1fr;grid-auto-rows:auto}.bento-item-modern.featured{grid-row:span 1;aspect-ratio:1 / 1}.product-hero-card-modern{position:static;padding:0;box-shadow:none;border:none;background:transparent;z-index:auto}.detail-section-modern{padding-left:0!important;margin-top:2rem;position:static!important;max-height:none!important;height:auto!important;overflow-y:visible!important;overflow-x:visible!important}.image-section-modern{padding-right:0!important}.tab-item{padding:.6rem 1rem;font-size:.95rem}.product-tabs-container{padding:0 4px}}.product-info-minimal{display:flex;flex-direction:column}.breadcrumbs-modern{display:flex;align-items:center;gap:8px;font-size:.95rem;color:#6b7280;font-weight:500}.breadcrumbs-modern .dot{font-size:1.2rem;line-height:1}.title-price-row-modern{display:flex;justify-content:space-between;align-items:flex-start;gap:20px}.product-title-modern{font-size:1.5rem;font-weight:800;color:#111827;margin:0;line-height:1.2}.product-price-modern{font-size:1.5rem;font-weight:500;color:#111827;white-space:nowrap}.rating-row-modern{display:flex;align-items:center;gap:12px;font-size:1rem;flex-wrap:wrap}.rating-score{font-weight:700;color:#111827}.separator{color:#e5e7eb}.reviews-link{font-weight:600}::ng-deep .rating-row-modern p-rating .p-rating-icon.p-rating-icon-active svg,::ng-deep .rating-row-modern p-rating .p-icon{color:#eab308!important;fill:#eab308!important}::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) svg,::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) .p-icon{color:#eab308!important;fill:#eab308!important;opacity:.25}.product-brief-modern{font-size:.95rem;line-height:1.7;color:#4b5563;margin-top:.5rem;text-align:justify}.write-review-btn{display:inline-flex;align-items:center;justify-content:center;padding:.65rem 1.75rem;background:#f8f9fa;color:#374151;border:1px solid #e5e7eb;border-radius:10px;font-size:.9rem;font-weight:600;cursor:pointer;transition:all .2s ease;letter-spacing:.02em}.write-review-btn:hover{background:#f1f3f5;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 8px #00000012}@media (max-width: 991px){.product-title-modern,.product-price-modern{font-size:1.3rem}}@media (max-width: 480px){.title-price-row-modern{flex-direction:column;gap:4px}.product-title-modern{font-size:1.2rem}.product-price-modern{font-size:1.2rem;white-space:normal}.rv-section{padding:1rem 0}.rv-header{gap:1rem}.rv-title{font-size:1.15rem;margin-bottom:.5rem}.rv-avg-num{font-size:1.15rem}.rv-bars{max-width:100%;width:100%}.rv-grid{grid-template-columns:1fr;gap:.75rem}.rv-card{padding:10px}.rv-name{font-size:14px}.tabs-list{gap:0}.tab-item{padding:.55rem 1rem;font-size:.9rem}.header-text{font-size:15px!important}.product-header{flex-wrap:wrap;gap:8px}.pricebreakup-btn{font-size:10px;padding:6px}.write-review-btn{width:100%;padding:.65rem 1rem}}.pb-glass-container{padding:16px;border-radius:16px}.pb-glass-card{background:#fff9;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.85);border-radius:12px;margin-bottom:12px;overflow:hidden}.pb-glass-header{padding:10px 16px;font-weight:700;font-size:12px;letter-spacing:1.5px;text-transform:uppercase}.pb-glass-row{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;font-size:14px;border-bottom:1px solid rgba(0,0,0,.04)}.pb-glass-row:last-child{border-bottom:none}.pb-glass-row:nth-child(2n){background:#f8fafc99}.pb-label{color:#6b7280;font-weight:500}.pb-value{font-weight:600;color:#1f2937}.pb-summary-card{background:#ffffffb3;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(203,213,225,.5);border-radius:12px;overflow:hidden}.pb-summary-row{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;font-size:14px;color:#374151;border-bottom:1px solid rgba(0,0,0,.05)}.pb-grand-total{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;font-weight:700;font-size:16px;letter-spacing:.5px}.item-code-row{margin-bottom:6px}.item-code-value{display:inline-block;padding:2px 10px;border-radius:999px;background:#f1f5f9;color:#475569;font-size:11px;font-weight:600;letter-spacing:.6px;text-transform:uppercase;border:1px solid #e2e8f0}.buy-now-btn{background:transparent!important;border:1.5px solid currentColor!important;color:inherit!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i11.DecimalPipe, name: "number" }, { kind: "pipe", type: i11.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i11.DatePipe, name: "date" }, { kind: "pipe", type: i11.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i12.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i13.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i14.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i15.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue", "backgroundInfo"] }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "ngmodule", type: NgxImageZoomModule }, { kind: "component", type: i16.NgxImageZoomComponent, selector: "lib-ngx-image-zoom", inputs: ["thumbImage", "fullImage", "zoomMode", "magnification", "minZoomRatio", "maxZoomRatio", "scrollStepSize", "enableLens", "lensWidth", "lensHeight", "circularLens", "enableScrollZoom", "altText", "titleText"], outputs: ["zoomScroll", "zoomPosition", "imagesLoaded"] }, { kind: "component", type: FeaturedProductsComponent, selector: "simpo-featured-products", inputs: ["data", "responseData", "index", "isRelatedProduct", "isBrowseProduct", "edit", "customClass", "delete", "nextComponentColor"], outputs: ["changeDetailProduct"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "component", type: SociaIconsComponent, selector: "simpo-socia-icons", inputs: ["socialIconData", "color", "sectionId", "iconColor"] }, { kind: "ngmodule", type: RatingModule }, { kind: "component", type: i17.Rating, selector: "p-rating", inputs: ["disabled", "readonly", "stars", "cancel", "iconOnClass", "iconOnStyle", "iconOffClass", "iconOffStyle", "iconCancelClass", "iconCancelStyle", "autofocus"], outputs: ["onRate", "onCancel", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i18.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: SvgDividerComponent, selector: "simpo-svg-divider", inputs: ["dividerType", "color"] }, { kind: "directive", type: ButtonEditorDirective, selector: "button[appButtonEditor]", inputs: ["appButtonEditor", "buttonData", "buttonStyle", "backgroundInfo", "sectionId", "buttonId", "itemIndex"] }, { kind: "directive", type: SpacingHorizontalDirective, selector: "[spacingHorizontal]", inputs: ["spacingHorizontal", "isHeader"] }, { kind: "pipe", type: SanitizeHtmlPipe, name: "sanitizeHtml" }, { kind: "ngmodule", type: NgxSkeletonLoaderModule }] }); }
|
|
996
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProductDescComponent, isStandalone: true, selector: "simpo-product-desc", inputs: { data: "data", responseData: "responseData", index: "index", edit: "edit", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor" }, host: { listeners: { "window: resize": "getScreenSize($event)" } }, providers: [MessageService], viewQueries: [{ propertyName: "reviewComponent", first: true, predicate: CustomerReviewComponent, descendants: true }, { propertyName: "aboveHeight", first: true, predicate: ["aboveHeight"], descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "imageSection", first: true, predicate: ["imageSection"], descendants: true }, { propertyName: "detailSection", first: true, predicate: ["detailSection"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!isLoading\">\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n <section class=\"total-container\" [id]=\"data?.id\" [simpoBackground]=\"styles?.background\" simpoHover\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\n\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\n </div> -->\n <section class=\"container\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" [spacingHorizontal]=\"stylesLayout\"\n [simpoLayout]=\"styles?.layout\" #container>\n <!-- <div class=\"display-none\"><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\"\n (click)=\"routeToHome()\">Home</a> /\n <span>{{ responseData?.name | titlecase }}</span>\n </div> -->\n <div class=\"row m-0 w-100 mt-lg-4 h-auto overflow-visible\" #aboveHeight>\n <div class=\"col-lg-6 col-sm-12 image-section-modern\" #imageSection>\n <div class=\"d-flex flex-column justify-content-start gap-1\">\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\n </div>\n </div>\n <div class=\"col-lg-6 col-sm-12 detail-section-modern \" #detailSection>\n <div class=\"product-hero-card-modern\">\n <ng-container *ngIf=\"isMobile\">\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\n\n <ng-container *ngIf=\"!isMobile\">\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!isMobile\">\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\n </ng-container>\n </div>\n\n\n <ng-container *ngIf=\"ecomConfigs?.deliveryEnabled\">\n <!-- *ngIf=\"ecomConfigs?.deliveryEnabled\" -->\n <ng-container *ngTemplateOutlet=\"DeliverySection\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"ecomConfigs?.storesEnabled\">\n <!-- *ngIf=\"ecomConfigs?.storesEnabled\" -->\n <ng-container *ngTemplateOutlet=\"StoreSection\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"ecomConfigs?.appointmentBookingEnabled\">\n <!-- *ngIf=\"ecomConfigs?.appointmentBookingEnabled\" -->\n <ng-container *ngTemplateOutlet=\"TryAtHome\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"ecomConfigs?.videoCallEnabled\">\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\n <ng-container *ngTemplateOutlet=\"videoCallSchedule\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"ecomConfigs?.brandPromiseEnabled\">\n <ng-container *ngTemplateOutlet=\"branding\"></ng-container>\n </ng-container>\n\n\n\n <!-- Moved descriptors to Details tab below -->\n\n <!-- <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\"\n [innerHTML]=\"responseData.brief\"></div> -->\n <!-- Moved tags to Details tab below -->\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\n <!-- <ng-container>\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\n </ng-container> -->\n </div>\n </div>\n <!-- Tabs Navigation -->\n <div class=\"product-tabs-container\">\n <ul class=\"tabs-list\">\n <li class=\"tab-item\" [class.active]=\"activeTab == 'Details'\"\n [style.color]=\"activeTab == 'Details' ? styles?.background?.accentColor : ''\"\n [style.borderColor]=\"activeTab == 'Details' ? styles?.background?.accentColor : 'transparent'\"\n (click)=\"changeTab('Details')\">Details</li>\n <li class=\"tab-item\" *ngIf=\"reviewsData\" [class.active]=\"activeTab == 'Reviews'\"\n [style.color]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : ''\"\n [style.borderColor]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : 'transparent'\"\n (click)=\"changeTab('Reviews')\">Reviews</li>\n <li class=\"tab-item\" *ngIf=\"materialBasedPricing\" [class.active]=\"activeTab == 'PriceBreakup'\"\n [style.color]=\"activeTab == 'PriceBreakup' ? styles?.background?.accentColor : ''\"\n [style.borderColor]=\"activeTab == 'PriceBreakup' ? styles?.background?.accentColor : 'transparent'\"\n (click)=\"changeTab('PriceBreakup')\">Price Breakup</li>\n </ul>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content-pane\">\n <div *ngIf=\"activeTab == 'Details'\">\n <!-- Integrated descriptors and tags here -->\n <div class=\"mt-2\">\n <ng-container *ngTemplateOutlet=\"descriptors\"></ng-container>\n </div>\n </div>\n\n <div *ngIf=\"activeTab == 'Reviews'\">\n <ng-container *ngTemplateOutlet=\"ReviewsSection\"></ng-container>\n </div>\n\n <div *ngIf=\"activeTab == 'PriceBreakup'\">\n <div class=\"pb-glass-container mt-2\">\n\n <!-- One card per material \u2014 generic, works for any material type -->\n <ng-container *ngFor=\"let ele of responseData?.materials\">\n <div class=\"pb-glass-card\">\n <div class=\"pb-glass-header\"\n [style.background]=\"styles?.background?.accentColor\"\n [style.color]=\"'#fff'\">\n {{ ele?.materialName | titlecase }}\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Purity</span>\n <span class=\"pb-value\">{{ ele?.purity }}</span>\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Net Weight</span>\n <span class=\"pb-value\">{{ ele?.quantity }} {{ ele?.unit | titlecase }}</span>\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Rate / {{ ele?.unit | titlecase }}</span>\n <span class=\"pb-value\">\u20B9{{ ele?.pricePerUnit | number:'1.2-2' }}</span>\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Value</span>\n <span class=\"pb-value\">\u20B9{{ (ele?.quantity * ele?.pricePerUnit) | number:'1.2-2' }}</span>\n </div>\n </div>\n </ng-container>\n\n <!-- Making Charges card -->\n <div class=\"pb-glass-card\">\n <div class=\"pb-glass-header\"\n [style.background]=\"styles?.background?.accentColor\"\n [style.color]=\"'#fff'\">\n Making Charges\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Net Weight</span>\n <span class=\"pb-value\">{{ responseData?.baseWeight }}</span>\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Making Charge %</span>\n <span class=\"pb-value\">{{ responseData?.makingChargePercentage }}%</span>\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Value</span>\n <span class=\"pb-value\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}</span>\n </div>\n </div>\n\n <!-- Summary card -->\n <div class=\"pb-summary-card\">\n <div class=\"pb-summary-row\">\n <span>Total Value</span>\n <span>\u20B9{{ responseData?.jewelryPriceBreakup?.priceWithoutTax | number:'1.2-2' }}</span>\n </div>\n <div class=\"pb-summary-row\">\n <span>Tax ({{ responseData?.jewelryPriceBreakup?.taxRef?.taxPercent }}% GST)</span>\n <span>\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}</span>\n </div>\n <div class=\"pb-grand-total\"\n [style.background]=\"styles?.background?.accentColor\"\n [style.color]=\"'#fff'\">\n <span>TOTAL</span>\n <span>\u20B9{{ (responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) | number:'1.2-2' }}</span>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </section>\n <ng-container *ngIf=\"recentViewItemList?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"recentViewItemList\"\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\n </ng-container>\n <!-- <ng-container *ngIf=\"recentViewItemList?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\n [isRelatedProduct]=\"true\"></simpo-featured-products>\n </ng-container> -->\n <!-- <ng-container>\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\n </ng-container> -->\n\n <ng-container *ngIf=\"styles?.devider?.display\">\n <simpo-svg-divider [dividerType]=\"styles?.devider?.deviderType\"\n [color]=\"nextComponentColor?.color\"></simpo-svg-divider>\n </ng-container>\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\n </div>\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\n </div>\n </section>\n</ng-container>\n\n\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '40vh',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n}\">\n</ngx-skeleton-loader>\n\n\n<div class=\"mobile-footer\">\n <div class=\"icons\">\n <div (click)=\"goToCart()\">\n <mat-icon>shopping_cart</mat-icon>\n </div>\n <div>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\n </div>\n </div>\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\">Out of\n Stock</button>\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\n </div>\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\"\n [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\" class=\"w-75\">\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\"\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\n </div>\n</div>\n\n<ng-template #ReviewSection>\n <div class=\"review-sec\">\n <div class=\"title\">Customer Review</div>\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\n <span>Be the first to write a review</span>\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add\n Review' : 'Cancel Review'}}</button>\n <ng-container *ngIf=\"showReview\">\n <hr />\n <div class=\"user-review\">\n <div class=\"title\">Write a review</div>\n <span class=\"secondary-text\">RATING</span>\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\n <div>\n <span class=\"secondary-text\">Review Title</span>\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\n </div>\n <div>\n <span class=\"secondary-text\">Review</span>\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\n </div>\n <div class=\"review-action-btn\">\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\n (click)=\"addProductReview()\"\n [disabled]=\"productReview == 0 && !reviewTitle?.length && !reviewDescription?.length\">Submit\n review</button>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #SocialIcons>\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\n <div style=\"position: relative;margin-right: 10px;\">\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\"\n [sectionId]=\"data?.id\"></simpo-socia-icons>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #ActionBtn>\n <div class=\"button-parent\">\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\">Out of\n Stock</button>\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\n </div>\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\"\n [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\"\n (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && IsEcommerce\" class=\"w-75\">\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\"\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\n </div>\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && IsEcommerce\" class=\"w-75 mt-2\">\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\"\n (click)=\"!edit ? buyNow() : ''\">Buy Now</button>\n </div>\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && !IsEcommerce\" class=\"w-75\">\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\" (click)=\"raiseLead()\"><mat-icon style=\"height:14px !important\">\n message</mat-icon>Notify Me</button>\n </div>\n <div class=\"favourite\" *ngIf=\"IsEcommerce\" (click)=\"isItemAsFavorite ? removeToFavourite() : addToFavourite()\">\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\"\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\n </div>\n <div class=\"share-icon\" (click)=\"shareProduct()\">\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\">share</mat-icon>\n </div>\n </div>\n</ng-template>\n\n<ng-template #variants>\n <ng-container *ngIf=\"data?.styles?.customization == 'Style1'\">\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\n <div class=\"mb-3\">\n <div class=\"varient-key\">{{varient.key}}</div>\n <div class=\"d-flex\" style=\"gap: 5px;\">\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"data?.styles?.customization == 'Style2' && selectedVarient.size > 0\">\n <ng-container>\n <div class=\"row mt-2 style2-container w-100\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div *ngFor=\"let item of selectedVarient | keyvalue\" class=\"px-3 py-2 varient-item\"\n [class]=\"getClass(selectedVarient)\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"variant-head\">{{item.key | titlecase}}</div>\n <div class=\"variant-value text-start fw-semibold\">\n {{item.value |\n titlecase}}</div>\n </div>\n <div class=\"cursor-pointer p-0\" [class]=\"getClass(selectedVarient)\">\n <div class=\"custom-text d-flex align-items-center justify-content-center h-100 p-2\" data-bs-toggle=\"offcanvas\"\n data-bs-target=\"#offcanvasRightVariant\" [style.background]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">CUSTOMISE\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #ProductDesc>\n <div class=\"product-info-minimal\">\n <!-- Item Code -->\n <div class=\"item-code-row\" *ngIf=\"responseData?.itemCode\">\n <span class=\"item-code-value\">{{ formatItemCode(responseData?.itemCode) }}</span>\n </div>\n\n <!-- Title and Price Row -->\n <div class=\"title-price-row-modern\">\n <h1 class=\"product-title-modern\">{{responseData?.name}}</h1>\n <div class=\"product-price-modern\">\n <span [innerHTML]=\"currency\"></span> {{responseData?.price?.sellingPrice}}\n </div>\n </div>\n\n <!-- Rating Row -->\n <div class=\"rating-row-modern\" *ngIf=\"responseData?.averageRating\">\n <p-rating [(ngModel)]=\"responseData.averageRating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\n <span class=\"rating-score\">{{responseData?.averageRating | number:'1.1-1'}}</span>\n <span class=\"separator\">|</span>\n <span class=\"reviews-link\" [style.color]=\"styles?.background?.accentColor\">\n {{responseData?.totalReviewCount}} reviews</span>\n </div>\n\n <!-- Brief Description -->\n <div class=\"product-brief-modern\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData?.brief | sanitizeHtml\">\n </div>\n </div>\n</ng-template>\n\n<ng-template #descriptors>\n <div class=\"row prod-desc mt-2\">\n <div>\n <!-- <div class=\"product-header d-flex align-items-center justify-content-between\">\n <span class=\"header-text\" *ngIf=\"responseData?.descriptor || responseData?.materials\">Product Details</span>\n <div class=\"pricebreakup-btn d-flex align-items-center justify-content-center cursor-pointer\"\n *ngIf=\"materialBasedPricing\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasRightPriceBreakup\"\n [style.background]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\n <mat-icon>add</mat-icon> PRICE BREAKUP\n </div>\n </div> -->\n <div class=\"description\">\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\n [innerHTML]=\"responseData?.descriptor?.name | sanitizeHtml\"\n [style.background]=\"data?.styles?.background?.color\"></div>\n </div>\n <!-- <ng-container *ngIf=\"materialBasedPricing\">\n <div class=\"jewellery-table-container\">\n <ng-container *ngFor=\"let ele of responseData?.materials\">\n <div class=\"jewel-container mt-2\">\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor(ele.materialType)\">\n {{ele?.materialName | titlecase}}\n </div>\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor(ele.materialType)\">\n <div class=\"col-6 metal-purity\">\n <div class=\"row-header\">\n Net Weight/{{ele?.unit | titlecase}}\n </div>\n <div class=\"row-content\">\n {{ele.quantity + \" \" + (ele?.unit | titlecase)}}\n </div>\n </div>\n <div class=\"col-6 metal-purity\">\n <div class=\"row-header\">\n Purity\n </div>\n <div class=\"row-content\">\n {{ele.purity |\n titlecase}}\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container> -->\n </div>\n </div>\n\n</ng-template>\n\n<ng-template #ImageSection>\n <ng-container *ngIf=\"!varientLoading && (isMobile || data?.styles?.gridStyle == 'Style1')\">\n <div class=\"style-1-vertical d-flex flex-column w-100\">\n <div class=\"main-image-container p-0\">\n <div class=\"item-img rounded-3\">\n <lib-ngx-image-zoom *ngIf=\"currentImg\" [thumbImage]=\"currentImg\" [fullImage]=\"currentImg\" [zoomMode]=\"'hover'\"\n [magnification]=\"0.4\" [enableScrollZoom]=\"false\">\n </lib-ngx-image-zoom>\n <img *ngIf=\"!currentImg\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\"\n class=\"w-100 h-100 object-fit-cover\">\n </div>\n </div>\n <div class=\"thumbnail-row py-3 d-flex gap-2 overflow-auto hide-scroll\">\n <img class=\"img thumbnail-img\" *ngFor=\"let img of itemImages\" [src]=\"img.imgUrl\" (click)=\"changeImg(img.imgUrl)\"\n [class.active-thumb]=\"currentImg == img.imgUrl\"\n style=\"cursor: pointer; min-width: 80px; width: 80px; height: 80px; object-fit: cover; border-radius: 8px; border: 2px solid transparent;\"\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!varientLoading && (!isMobile && data?.styles?.gridStyle == 'Style2')\">\n <div class=\"bento-masonry-container\">\n <div *ngFor=\"let img of itemImages; let i = index\" class=\"bento-item-modern\">\n <img [src]=\"img.imgUrl\" class=\"bento-img-modern\" (click)=\"changeImg(img.imgUrl)\">\n </div>\n </div>\n </ng-container>\n\n <div class=\"item-img\" *ngIf=\"varientLoading\">\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '100%',\n 'border-radius': '10px'\n }\">\n </ngx-skeleton-loader>\n </div>\n</ng-template>\n\n<ng-template #branding>\n <div class=\"row w-100\">\n <ng-container *ngFor=\"let brand of brandPromises\">\n <div class=\"col-4 d-flex flex-column align-items-center g-2\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n [src]=\"brand?.logoUrl\" alt=\"\" class=\"w-h-40 p-0 rounded-circle\">\n <div class=\"brand-text w-100 text-center py-2\">\n {{brand?.title | titlecase}}\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #videoCallSchedule>\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\n <ng-container>\n <div class=\"row w-100 video-container\">\n <div class=\"col-4 video-call-img\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/355007c175362077266611289-229221023_small.gif\"\n alt=\"\" class=\"w-100 h-100 \">\n </div>\n <div class=\"col-8 align-content-center\">\n <div class=\"video-head-text\">\n Live Video Call\n </div>\n <div class=\"sub-text\">\n Join a live video call with our consultants to see your favourite designs up close!\n </div>\n <button class=\"sch-btn text-center cursor-pointer\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(2)\" [buttonId]=\"getButtonId(2)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(2)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\n Schedule a Video Call\n </button>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #DeliverySection>\n <div class=\"delivery-container\">\n <h2 class=\"delivery-title\">Delivery, Stores & Trial</h2>\n\n <!-- Location Section -->\n <div class=\"location-section mb-2\">\n <div class=\"location-container d-flex align-items-center justify-content-between\"\n [style.borderColor]=\"styles?.background?.accentColor\">\n <div class=\"d-flex align-items-center flex-grow-1 me-2\" style=\"width: calc(100% - 100px);\">\n <div class=\"d-flex mx-1\"><mat-icon\n class=\"gps d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\n </div>\n <input type=\"number\" class=\"postal-code-input flex-grow-1\" placeholder=\"Enter PinCode\" [(ngModel)]=\"pincode\"\n style=\"width: 100%;\">\n </div>\n <button class=\"btn locate-btn\" (click)=\"getStoreDetails()\">Submit</button>\n </div>\n <div *ngIf=\"!isPinCode\" style=\"color: red;\">Pin code must be 6 digits.</div>\n </div>\n\n <ng-container *ngIf=\"(pincode?.toString().length ?? 0) == 6\">\n <!-- Free Delivery Section -->\n <div class=\"delivery-section\">\n <div class=\"d-flex align-items-center\">\n <span class=\"delivery-icon d-flex align-items-center\">\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" class=\"feather feather-gift\">\n <polyline points=\"20 12 20 22 4 22 4 12\"></polyline>\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"5\"></rect>\n <line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"7\"></line>\n <path d=\"M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z\"></path>\n <path d=\"M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z\"></path>\n </svg>\n </span>\n\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges == 0\">Expected\n Delivery by {{ getDateAfterxDays() | date:'d MMM' }}</span>\n\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges > 0\">Your\n expected Order will\n Deliver by {{ getDateAfterxDays() | date:'d MMM' }} with a Delivery Charge of\n \u20B9 {{ecomConfigs?.deliveryCharges | number:'1.2-2'}}</span>\n </div>\n </div>\n\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #TryAtHome>\n <!-- Try At Home Section -->\n <div class=\"try-home-section\">\n <div class=\"d-flex align-items-start try-home-item\">\n <span class=\"home-icon d-flex align-items-center\">\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" class=\"feather feather-home\">\n <path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"></path>\n <polyline points=\"9 22 9 12 15 12 15 22\"></polyline>\n </svg>\n </span>\n <div class=\"try-home-details\">\n <div class=\"try-home-header\">\n <span class=\"try-home-text\">Try At Home</span>\n <span class=\"free-text\"> (It's Free)</span>\n </div>\n <div class=\"home-appointment-text\">Home Appointment <span>Available to try from 29 Jul</span></div>\n <!-- <div class=\"appointment-text\">\n Home Appointment <span class=\"appointment-available\">Available to try from 28 Jun</span>\n </div> -->\n </div>\n </div>\n <div class=\"d-flex-align-items-center justify-content-center w-100\">\n <button class=\"book-appointment-btn\" (click)=\"addToTrialCart()\" *ngIf=\"!isItemAddedAsTrial\">Try at\n HOME</button>\n <button class=\"book-appointment-btn\" *ngIf=\"isItemAddedAsTrial\">HOME APPOINTMENT BOOKED</button>\n </div>\n </div>\n\n</ng-template>\n\n<ng-template #StoreSection>\n <!-- Nearest Store Section -->\n <ng-container\n *ngIf=\"storeDetails?.nearbyStore?.storeName && storeDetails?.nearbyStore?.storeName?.length > 0\">\n <div class=\"store-section\">\n <div class=\"d-flex align-items-center store-item\">\n <span class=\"store-icon d-flex align-items-center\">\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\n </svg>\n </span>\n <div class=\"store-details\">\n <div class=\"store-text\">\n <span class=\"store-label\">Nearest Store - </span>\n <span class=\"store-name\">{{ storeDetails?.nearbyStore?.storeName | titlecase}}</span>\n <!-- <span class=\"store-distance\"> (4km)</span> -->\n </div>\n <!-- <div class=\"availability-section\">\n <span class=\"availability-badge\">\u23F0 AVAILABLE BY 28 JUN</span>\n </div> -->\n <!-- <div class=\"other-stores-text\">\n Also Available in <span class=\"other-stores-link\">18 other stores</span>\n </div> -->\n </div>\n </div>\n <div class=\"d-flex justify-content-center w-100\">\n <button class=\"find-store-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(1)\" (click)=\"onFindInStore(storeDetails?.nearbyStore?.id)\">FIND IN\n STORE</button>\n </div>\n </div>\n </ng-container>\n <ng-template #emptyStore>\n <div class=\"delivery-section\">\n <div class=\"d-flex align-items-center\">\n <span class=\"delivery-icon d-flex align-items-center\">\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\n </svg>\n </span>\n <span class=\"delivery-text\">No Stores are available</span>\n </div>\n </div>\n </ng-template>\n</ng-template>\n\n<div class=\"offcanvas offcanvas-end offcanvas-variant\" tabindex=\"-1\" id=\"offcanvasRightVariant\"\n aria-labelledby=\"offcanvasRightLabel\">\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\n <mat-icon data-bs-dismiss=\"offcanvas\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\n </div>\n <div class=\"varient-price px-3 pb-2\">\n <div class=\"price-text\">Price</div>\n <div class=\"d-flex g-3 align-items-center\">\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\n [innerHTML]='currency'></span>\n {{responseData?.price?.discountedPrice}}</div>\n <div class=\"price\"\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\"\n [ngClass]=\"{'text-decoration-line-through': responseData?.price?.discountedPrice}\"><span\n [innerHTML]='currency'></span>\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}</div>\n </div>\n </div>\n <div class=\"varient-container h-100 p-3\">\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\n <div class=\"varient-data\">\n <div class=\"varient-key\">{{varient.key}}</div>\n <div class=\"d-flex\" style=\"gap: 5px;\">\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"confirm-btn w-100 p-3 text-center cursor-pointer\" data-bs-dismiss=\"offcanvas\"\n [style.background]=\"data?.styles?.background?.accentColor\" style=\"color: white;\">Confirm\n Customization</div>\n</div>\n\n<ng-template #dialogBox>\n <div class=\"modal-content\">\n <div class=\"modal-header d-flex align-item-center\">\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\n <div class=\"schedule-header d-flex align-items-center justify-content-end p-2\">\n <mat-icon (click)=\"matCloseDialog()\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\n </div>\n </div>\n <div class=\"modal-body h-100\">\n <div class=\"row h-100 w-100 video-call-container\">\n <div class=\"col-6 h-100\" *ngIf=\"!isMobile\">\n <img\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/557699c1753779503913freepik-overhead-shot-a-person-holding-a-smartphone-with-a-1029_vmg8GqHj (online-video-cutter.com).gif\"\n alt=\"\" class=\"w-100 h-100\" style=\"object-fit: cover;\">\n </div>\n <div class=\"col-6 position-relative h-100 call-details\">\n <!-- Name Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\n (input)=\"onInputChange('username')\">\n </div>\n\n <!-- <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\n (input)=\"onInputChange('email')\">\n </div> -->\n\n <!-- Mobile Number Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\n <div class=\"sub-text-call\">IN +91</div>\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\n (input)=\"onInputChange('mobileNumber')\" (wheel)=\"$event.preventDefault()\">\n </div>\n\n\n <!-- Pincode Input with Validation -->\n <!-- <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-0\">\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\n </div>\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\n (input)=\"onInputChange('pincode')\">\n </div> -->\n <div class=\"language my-3\">\n <div class=\"mini-text mb-2\">Language Preference</div>\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\n <ng-container *ngFor=\"let lang of languages\">\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectedLang = lang\"\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\n {{lang}}\n </div>\n </ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"selectedLang == 'Others'\">\n <div class=\"input-field my-3\">\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\n </div>\n </ng-container>\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" [disabled]=\"isSubmitting\" [style.background]=\"data?.styles?.background?.accentColor\" [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\n <ng-container *ngIf=\"isSubmitting\">\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n SCHEDULING...\n </ng-container>\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\n <div (click)=\"scheduleVideoCall()\" class=\"d-flex align-items-center\">\n <mat-icon>video_call</mat-icon> \n SCHEDULE A VIDEO CALL\n </div>\n </ng-container>\n <ng-container *ngIf=\"scheduled\">\n <mat-icon>check_circle</mat-icon> \n SCHEDULED SUCCESSFULLY\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<div class=\"offcanvas offcanvas-end offcanvas-small overflow-scroll\" tabindex=\"-1\" id=\"offcanvasRightPriceBreakup\">\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\n <mat-icon data-bs-dismiss=\"offcanvas\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\n </div>\n <div class=\"varient-price p-10-20\">\n <div class=\"price-break-header\">{{responseData?.name}}</div>\n </div>\n <div class=\"price-breakup h-100 w-100\">\n <ng-container *ngFor=\"let ele of responseData?.materials\">\n <div class=\"price-container mb-3 p-10-20\">\n <div class=\"price-container-header\">\n {{ ele.materialType + \" BREAKUP\" }}\n </div>\n <div class=\"row w-100 header-row\">\n <div class=\"col-3 text-center\">COMPONENT</div>\n <div class=\"col-3 text-center\">RATE</div>\n <div class=\"col-3 text-center\">WEIGHT</div>\n <div class=\"col-3 text-center\">FINAL VALUE</div>\n </div>\n <div class=\"row w-100 value-row\">\n <div class=\"col-3 text-center\">{{ ele.purity | titlecase }}</div>\n <div class=\"col-3 text-center\">\u20B9{{ getPricePerGram(ele.pricePerUnit,ele.materialType) |\n number:'1.2-2' }}</div>\n <div class=\"col-3 text-center\">{{ele.quantity + ' ' + (ele.unit | titlecase)}}</div>\n <div class=\"col-3 text-center total\">\u20B9{{ ele.pricePerUnit * ele.quantity | number }}</div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"price-container mb-3 p-10-30 py-0 border-unset\">\n <div class=\"row w-100 summary-row\">\n <div class=\"col-6 text-start\">Making Charges</div>\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}\n </div>\n </div>\n <div class=\"row w-100 summary-row\">\n <div class=\"col-6 text-start\">Tax Amount</div>\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}\n </div>\n </div>\n <div class=\"row w-100 summary-row\">\n <div class=\"col-6 text-start\">Total Amount</div>\n <div class=\"col-6 text-end total\">\n \u20B9{{(responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) |\n number:'1.2-2'}}\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #ReviewsSection>\n <div class=\"rv-section\" *ngIf=\"reviewsData\">\n\n <!-- Header: Title + Average | Bar Chart -->\n <div class=\"rv-header\">\n <div class=\"rv-header-left\">\n <h2 class=\"rv-title\">Reviews & Ratings</h2>\n <div class=\"rv-average-row\">\n <!-- filled stars -->\n <div class=\"rv-stars\">\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\n fill=\"#eab308\" />\n </svg>\n </ng-container>\n </div>\n <span class=\"rv-avg-num\">{{responseData?.averageRating | number:'1.1-1'}}</span>\n <span class=\"rv-avg-label\">average</span>\n </div>\n <div class=\"rv-count\" [style.color]=\"styles?.background?.accentColor || '#10b981'\">\n {{responseData?.totalReviewCount | number}} Reviews\n </div>\n </div>\n\n <div class=\"rv-bars\">\n <ng-container *ngFor=\"let rating of [5,4,3,2,1]\">\n <div class=\"rv-bar-row\">\n <span class=\"rv-bar-label\">{{rating}}</span>\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\n fill=\"#eab308\" />\n </svg>\n <div class=\"rv-bar-track\">\n <div class=\"rv-bar-fill\" [style.width.%]=\"getPercentage(rating)\"></div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Review Cards Grid -->\n <div class=\"rv-grid\">\n <ng-container *ngFor=\"let review of reviewsData\">\n <ng-container *ngIf=\"review.review\">\n <div class=\"rv-card\">\n <div class=\"rv-card-top\">\n <div class=\"rv-reviewer\">\n <img [src]=\"'https://ui-avatars.com/api/?name=' + (review?.userName ?? 'U') + '&background=random'\"\n class=\"rv-avatar\" alt=\"\">\n <div class=\"rv-name-date\">\n <span class=\"rv-name\">{{review?.userName ?? 'Anonymous'}}</span>\n <span class=\"rv-date\">{{review?.createdAt | date:'d MMM y'}}</span>\n </div>\n </div>\n <!-- Star rating -->\n <div class=\"rv-card-stars\">\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\n <svg *ngIf=\"s <= review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\n fill=\"#eab308\" />\n </svg>\n <svg *ngIf=\"s > review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" style=\"opacity:0.25\">\n <path\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\n fill=\"#eab308\" />\n </svg>\n </ng-container>\n </div>\n </div>\n <p class=\"rv-text\">{{review?.review ?? 'No comment provided.'}}</p>\n\n <!-- Review Images -->\n <div class=\"rv-images\" *ngIf=\"review?.reviewImages?.length\">\n <a *ngFor=\"let img of review.reviewImages\" [href]=\"img.imgUrl\" target=\"_blank\" class=\"rv-img-link\">\n <img [src]=\"img.imgUrl\" alt=\"Review image\" class=\"rv-img-thumb\" onerror=\"this.style.display='none'\">\n </a>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n\n <div class=\"text-center mt-4\" *ngIf=\"(reviewsData?.length ?? 0) > 3\">\n <button class=\"write-review-btn\" (click)=\"loadMoreReviews()\">Load More Reviews</button>\n </div>\n </div>\n</ng-template>\n\n<div class=\"modal fade\" id=\"exampleModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" role=\"dialog\"\n aria-hidden=\"true\">\n <div class=\"modal-dialog modal-dialog-centered video-modal\">\n <div class=\"modal-content\">\n <div class=\"modal-body\" style=\"height: 100%;\">\n <video controls muted playsinline style=\"width: 100%; height: 100%;\">\n <source\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/371647c1753962084265clideo_editor_48bc93c24e18470888c661bb09e437da (online-video-cutter.com).mp4\"\n type=\"video/mp4\">\n Your browser does not support the video tag.\n </video>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"modal fade\" id=\"reviewModal\" tabindex=\"-1\" aria-labelledby=\"reviewModalLabel\" role=\"dialog\"\n aria-hidden=\"true\">\n <div class=\"modal-dialog review-modal\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h1 class=\"modal-title fs-5\"></h1>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"detail-review-container\">\n <div class=\"image-section\">\n <div class=\"product-image\">\n <div class=\"backward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex-1\"\n *ngIf=\"currentImageIndex > 0\">\u25BC</div>\n <img [src]=\"selectedReview?.reviewImages?.[currentImageIndex]?.imgUrl\" alt=\"\">\n <div class=\"forward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex+1\"\n *ngIf=\"currentImageIndex < selectedReview?.images?.length - 1\">\u25B2</div>\n <!-- <div class=\"earbuds-container\">\n <div class=\"charging-case\"></div>\n <div class=\"earbud left\"></div>\n <div class=\"earbud right\"></div>\n </div> -->\n </div>\n <!-- <div class=\"navigation-arrows\">\n </div> -->\n </div>\n\n <div class=\"review-section\">\n <div class=\"reviewer-header\">\n <div class=\"reviewer-avatar\">\uD83D\uDC64</div>\n <div class=\"reviewer-name\">{{selectedReview?.userName ?? \"-\"}}</div>\n </div>\n\n <div class=\"detail-rating\" *ngIf=\"selectedReview?.rating\">\n <p-rating [(ngModel)]=\"selectedReview.rating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\n </div>\n\n <div class=\"review-date\">\n Reviewed in India on 24 July 2025\n </div>\n\n <div class=\"review-text\">\n {{selectedReview?.review ?? \"-\"}}\n </div>\n\n <div class=\"images-section\">\n <h3>Images in this review</h3>\n <div class=\"review-images\">\n <div class=\"review-image\" [ngClass]=\"{'selected': currentImageIndex == i}\"\n *ngFor=\"let img of selectedReview?.reviewImages ?? [];let i = index\" (click)=\"currentImageIndex = i\">\n <img [src]=\"img.imgUrl\" alt=\"\">\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n</div>", styles: [".product-desc{display:flex}::ng-deep .product-desc table,::ng-deep .brief-desc table{border-collapse:collapse;width:100%;margin:10px 0}::ng-deep .product-desc table td,::ng-deep .product-desc table th,::ng-deep .brief-desc table td,::ng-deep .brief-desc table th{border:1px solid #dddddd!important;text-align:left;padding:8px}*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}::ng-deep .smooth-panel .p-panel-header{cursor:pointer;background:transparent;border:unset;font-size:18px;font-weight:700;padding:0}::ng-deep .smooth-panel .p-panel-content{border:unset;padding:0}.jewel-container{border-radius:12px;box-shadow:#63636333 0 2px 8px}.jewel-header{padding:8px 10px;border-radius:12px 12px 0 0;font-size:15px;font-weight:700;color:#4f3267}.br-p{border-radius:0 0 12px 12px;padding:10px 0}.row-header{font-size:13px;font-weight:700;color:#4f3267}.row-content{color:#4e555e}.jewellery-table-container{border-radius:12px}.jewellery-table{width:100%;border-collapse:collapse;border:1px solid #ddd;transition:all .3s ease}.jewellery-table th,.jewellery-table td{border:1px solid #ddd;padding:12px;text-align:left;transition:background-color .2s ease}.material-header td{background-color:#f8f9fa;font-weight:700;font-size:16px}.column-header{background-color:#f1f1f1}.column-header th{font-weight:600}.material-row:hover{background-color:#f5f5f5}.charges-header th,.total-header th,.total-header td{background-color:#eaeaea;font-weight:700}.total-row td{font-weight:700;font-size:18px;background-color:#f8f8f8}@media screen and (max-width: 600px){.jewellery-table{font-size:14px}.jewellery-table th,.jewellery-table td{padding:8px}}.share-icon,.favourite{border-radius:50%!important;height:30px;width:30px;padding:6px;display:flex;align-items:center;justify-content:center;background-color:#f1f5f9!important;cursor:pointer;transition:all .2s ease;border:none!important}:is(.share-icon,.favourite) mat-icon{font-size:20px;width:20px;height:20px;display:flex;align-items:center;justify-content:center}.share-icon:hover,.favourite:hover{background-color:#e2e8f0!important;transform:scale(1.05)}.header-text{font-size:17px;font-weight:bolder}.pricebreakup-btn{font-size:11px;font-weight:700;padding:8px;border-radius:8px;letter-spacing:.5px}.pricebreakup-btn mat-icon{font-size:18px;display:flex;align-items:center}.img-list{display:flex;gap:5px;max-height:460px}.img-list img{height:100px;width:100px;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:100%;aspect-ratio:1/1;overflow:hidden}.item-img img{width:100%!important;height:100%!important;object-fit:cover}.price{font-weight:600;font-size:24px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:1px solid;align-items:center;gap:15px;height:44px;width:75%;justify-content:space-between;border-radius:12px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.fc{font-size:17px;font-weight:700}.tab-group{display:flex;gap:10px}.tab{font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black;max-width:max-content}.discount-price{font-size:1.4rem}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#f7f7f7;padding:11px 20px;border-radius:12px;margin-top:unset!important;width:70%!important;border:1px solid #d3d3d347}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#f7f7f7;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:7px 25px;cursor:pointer;font-weight:600}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:5px;height:44px!important;justify-content:space-between;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:14px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.w-h-40{width:40px!important;height:40px!important}.height{height:auto;overflow-y:visible}.mobile-footer{display:none}video{border-radius:18px}@media (min-width: 1024px){.zoom:hover{transform:scale(1.04);transition:transform .2s ease-in-out;overflow:hidden}.product-heading{font-size:20px;font-weight:600;margin-top:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.product-desc{font-size:13px}.brief-desc{font-size:16px;margin-top:unset!important}.total-container{padding-top:10px!important;padding-bottom:4rem!important}.out-of-stock,.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important;height:348px}.item-img img{width:100%;height:348px!important}.display-none{display:none}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{width:25%;border:2px solid lightgray;cursor:pointer}.input-field{margin-top:.7rem!important;margin-bottom:.7rem!important}.prod-desc{margin-top:20px}.video-call-container{margin:0!important}.product-img{height:220px}.call-details{width:100%!important;padding:3%!important}.send-btn{padding:.5rem 1rem!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%;height:auto}.product-heading{font-size:23px;font-weight:600}.discount-price{font-size:1.7rem!important}.header-text{font-size:20px!important}}.send-btn{font-size:14px!important;padding:1rem;display:flex;align-items:center;justify-content:center;text-transform:uppercase;font-weight:600}.send-btn mat-icon{height:20px;width:20px;font-size:18px}a{text-decoration:none}.brief-desc{font-size:14px;color:#4e555e}.total-container{height:auto;position:relative;display:block!important;overflow:visible}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%;margin:unset!important}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}}@media (min-width:1024px){.product-headig{font-size:35px}}.mat-accordion .mat-expansion-panel:last-of-type{box-shadow:none}@media (min-width: 1400px){.container{max-width:unset;width:95%;height:100vh;overflow-y:auto}}.width-max{width:max-content}.fw-600{font-weight:600}.cursor-pointer{cursor:pointer}.offcanvas-variant{border-radius:30px 0 0 30px}.varient-header,.varient-price{background:#f7f7f7}.varient-header{border-radius:30px 0 0}.confirm-btn{border-radius:0 0 0 30px;position:absolute!important;bottom:0!important}.style2-container{border:1px solid;border-radius:12px;margin:0}.varient-item{border-right:1px solid;align-content:center}.variant-head{font-size:12px;color:#33363e}.varient-data{margin-bottom:25px;border-bottom:1px solid black;padding-bottom:25px}.variant-value{font-size:.9rem;color:#000}.custom-text{border-radius:0 8px 8px 0;font-size:.9rem;font-weight:600}.scroll-wrap{flex-wrap:nowrap}.brand-text{word-wrap:break-word;white-space:normal;font-size:12px;font-weight:600;line-height:20px}.video-container{border:1px solid rgb(240,240,240);margin:10px 0;border-radius:12px}.video-head-text{font-size:16px;font-weight:700}.sub-text{font-size:11px;color:#6f7377;margin-bottom:10px}.sch-btn{font-size:1.2rem!important;color:#fff;padding:3px 0;margin-top:5px}.tax-text{font-size:.7rem;color:#6f7377}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.delivery-container{margin:35px 0 15px;background-color:transparent}.delivery-title{font-size:16px;font-weight:600;margin:0 0 12px;line-height:1.2;margin-bottom:.5rem!important}.location-container{border:1px solid #cfcfcf;border-radius:12px;padding:10px;margin-bottom:5px;width:100%}.location-icon{width:20px;height:20px;background-color:#374151;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.location-icon:before{content:\"\";width:8px;height:8px;background-color:#fff;border-radius:50%;position:absolute}.postal-code-input{font-size:12px;font-weight:600;letter-spacing:.5px;border:none;outline:none;background:transparent;width:90%}.postal-code-input::placeholder{font-weight:500}.locate-btn{background:none!important;border:none!important;font-weight:600;color:#111827;font-size:13px!important;padding:0!important;box-shadow:none!important;width:auto!important;white-space:nowrap}.gps{font-size:17px}.locate-btn:focus{box-shadow:none!important}.delivery-section{margin-bottom:15px;border:1px solid rgb(240,240,240);padding:10px;border-radius:12px}.delivery-icon{font-size:18px;color:#ec4899;margin-right:14px;width:20px}.delivery-text{font-size:14px;font-weight:700}.store-section{border:1px solid rgb(240,240,240);padding:10px;border-radius:12px;margin-bottom:15px}.store-item{margin-bottom:11px}.store-icon{font-size:18px;color:#f97316;margin-right:14px;margin-top:2px;width:20px}.store-details{flex:1}.store-text{font-size:14px}.store-name{font-weight:700}.availability-section{margin-bottom:6px}.availability-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;color:#d97706;background-color:#fef3c7;padding:4px 8px;border-radius:12px;letter-spacing:.5px}.other-stores-text{font-size:14px;color:#6b7280;line-height:1.4}.other-stores-link{color:#6b46c1;cursor:pointer;text-decoration:underline}.other-stores-link:hover{color:#553c9a}.find-store-btn{width:100%!important;padding:8px 20px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px}.try-home-section{border-radius:12px;padding:10px;border:1px solid rgb(240,240,240)}.try-home-item{margin-bottom:10px;padding:0}.home-icon{font-size:18px;color:#6b46c1;margin-right:14px;margin-top:2px;width:20px}.try-home-details{flex:1}.try-home-text{font-size:14px;font-weight:700;color:#374151}.free-text{font-size:14px;color:#6b7280}.appointment-text{font-size:14px;color:#6b7280;line-height:1.4}.appointment-available{font-weight:500;color:#374151}.book-appointment-btn{background:#111827;color:#fff;border:none;padding:10px 20px;border-radius:12px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px;transition:all .2s ease;width:100%}.book-appointment-btn:hover{background:#000;transform:translateY(-1px);box-shadow:0 4px 8px #0000001a}@media (max-width: 480px){.container{display:flex;align-items:center;flex-direction:column}.location-section{padding:12px 0}.try-home-section{padding:20px}}.w-90{width:90%}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.w-12{width:12%!important}.w-88{width:88%!important}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;position:absolute;bottom:20px;left:10px;width:95%!important}.mini-text{font-size:13px}.lang{font-size:12px;align-content:center;background:#f6f3f9}.error-border{border:2px solid #dc3545!important}.offcanvas-small{height:72vh;top:25%;width:35%;border-radius:50px 0 0 50px}.rating{width:max-content;border:1px solid;border-radius:20px;padding:0 10px;margin-bottom:.5rem}.rating-no{padding-right:7px;margin:0;border-right:1px solid;font-size:.75rem}.p-10-20{padding:10px 30px}.price-break-header{font-size:19px;font-weight:600}.price-container{border-bottom:1px solid rgb(233,233,233)}.price-container-header{font-size:14px;font-weight:600;color:#333}.total-ratings{font-size:.75rem}.header-row .col-3{font-size:12px;font-weight:500;color:#666}.value-row .col-3{font-size:14px;font-weight:400;color:#333}.value-row .col-3.total{font-weight:600}.summary-row .col-6{font-size:15px;font-weight:500;color:#333;padding:unset}.summary-row .col-6.total{font-weight:600;padding-right:10px}.summary-row{padding:0 42px}.error-border{border:2px solid #e74c3c!important;box-shadow:0 0 5px #e74c3c4d!important}.form-control,.input-field input{transition:border-color .3s ease,box-shadow .3s ease}.error-border:focus{border-color:#e74c3c!important;box-shadow:0 0 8px #e74c3c80!important}.input-field input:focus{transform:scale(1.02)}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:-.125em;border:.125em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:.875rem;height:.875rem;border-width:.125em}@keyframes spinner-border{to{transform:rotate(360deg)}}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.rv-section{padding:2rem 0;background:transparent}.rv-header{display:flex;justify-content:space-between;align-items:flex-start;gap:3rem}.rv-header-left{flex:1}.rv-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:.75rem}.rv-average-row{display:flex;align-items:center;gap:.5rem;margin-bottom:.4rem}.rv-stars{display:flex;gap:2px}.rv-avg-num{font-size:1.4rem;font-weight:700;color:#111827}.rv-avg-label{font-size:.95rem;color:#6b7280;font-weight:400}.rv-count{font-size:.9rem;font-weight:600}.rv-bars{flex:1;max-width:420px;display:flex;flex-direction:column;gap:6px}.rv-bar-row{display:flex;align-items:center;gap:3px}.rv-bar-label{font-size:15px;font-weight:600;color:#111827;width:10px;text-align:right;flex-shrink:0}.rv-bar-track{flex:1;height:10px;background-color:#f3f4f6;border-radius:3px;overflow:hidden}.rv-bar-fill{height:100%;background-color:#eab308;border-radius:3px}.rv-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem}.rv-card{padding:12px;border:1px solid #e5e7eb;border-radius:10px;background:#fff}.rv-card-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:.85rem}.rv-reviewer{display:flex;align-items:center;gap:.7rem}.rv-avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;flex-shrink:0}.rv-name-date{display:flex;flex-direction:column;gap:2px}.rv-name{font-size:16px;font-weight:600;color:#374151}.rv-date{font-size:.75rem;color:#9ca3af}.rv-card-stars{display:flex;gap:2px;flex-shrink:0}.rv-text{font-size:.88rem;line-height:1.65;color:#4b5563;margin:0}.rv-images{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}.rv-img-link{display:block;flex-shrink:0;border-radius:8px;overflow:hidden;border:1px solid #e5e7eb}.rv-img-thumb{width:72px;height:72px;object-fit:cover;display:block;transition:transform .2s ease}.rv-img-link:hover .rv-img-thumb{transform:scale(1.05)}@media (max-width: 768px){.rv-header{flex-direction:column;gap:1.5rem}.rv-bars{max-width:100%}.rv-grid{grid-template-columns:1fr}}.review-section{padding:4rem 1rem;border-top:1px solid #f3f4f6;margin-top:4rem;background:transparent!important}.review-summary-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4rem;gap:3rem}.rating-summary-left{flex:1}.rating-summary-left h2.reviews-header-title{font-size:1.75rem;font-weight:700;margin-bottom:0;color:#111827}.average-score-container{display:flex;align-items:center;gap:.75rem;margin-bottom:.5rem}.average-score{color:#111827;display:flex;align-items:baseline;gap:8px}.average-score .score-num{font-size:1.5rem;font-weight:700}.average-score .score-text{font-size:1.1rem;font-weight:400;color:#111827}.total-reviews-count{font-weight:600;font-size:1.1rem;display:block}.rating-distribution{flex:1;max-width:480px}.rating-bar-row{display:flex;align-items:center;gap:1.25rem;margin-bottom:.85rem}.star-label{display:flex;align-items:center;justify-content:flex-start;width:35px;line-height:1}.progress-bar-bg{flex:1;height:12px;background-color:#f3f4f6;border-radius:9999px;overflow:hidden}.progress-bar-fill{height:100%;background-color:#eab308;border-radius:9999px}.review-actions-bar-minimal{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem}.write-review-btn-minimal{padding:.6rem 1.25rem;background:#f8f9fa;color:#4b5563;border:none;border-radius:8px;font-weight:500;font-size:.9rem;cursor:pointer;transition:all .2s}.write-review-btn-minimal:hover{background:#e5e7eb}.sort-dropdown-minimal select{padding:.6rem 2.25rem .6rem 1rem;border:1px solid #d1d5db;border-radius:8px;background:#fff;font-size:.9rem;color:#4b5563;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%236b7280'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right .75rem center;background-size:1rem;cursor:pointer}.reviews-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1.5rem}.review-card{padding:1.5rem;border:1px solid #e5e7eb;border-radius:12px;background:#fff;box-shadow:none}.review-divider{margin:2rem 0;border:none;border-top:1px solid #f3f4f6}.reviews-header-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:0}.review-card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1.25rem}.reviewer-info{display:flex;align-items:center;gap:1rem}.reviewer-avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#f3f4f6}.reviewer-name{font-weight:600;font-size:.95rem;color:#374151}.review-date-text{font-size:.8rem;color:#9ca3af}.reviewer-name-date{display:flex;flex-direction:row;align-items:center;gap:8px}.review-card-rating{display:flex;gap:2px}.review-card-text{font-size:1rem;line-height:1.7;color:#4b5563}.product-tabs-container{border-bottom:1px solid #f3f4f6;margin-bottom:8px}.tab-item{padding:1rem 0;font-weight:600;font-size:1.1rem;color:#6b7280;cursor:pointer;position:relative;transition:color .2s}.tab-content-pane h3{font-size:1.5rem;font-weight:700;margin-bottom:1.5rem}.tab-content-pane p{color:#4b5563;line-height:1.8;font-size:1.05rem}@media (max-width: 1024px){.reviews-grid{grid-template-columns:1fr}}@media (max-width: 768px){.review-summary-header{flex-direction:column;gap:2rem}.rating-distribution{max-width:100%}.bento-grid{height:auto;display:flex;flex-direction:column}.tabs-list{gap:1.5rem;overflow-x:auto}}.home-appointment-text{font-size:.8rem;color:#4e555e}.home-appointment-text span{font-weight:600}.video-call-img{height:120px;margin:0;padding:0;border-radius:45px}.video-call-img img{border-top-left-radius:12px;border-bottom-left-radius:12px}.discount{background:#fff3f2;padding:15px 15px 20px;margin-top:14px;border-radius:8px;display:flex;flex-direction:column;gap:5px;position:relative}.discount p{margin-bottom:0;color:#4f3267;font-weight:700;font-size:1rem}.discount .offer{color:#eb4f5c}.discount:before{content:\"\";display:block;height:44px;width:4px;background:#eb4f5c;position:absolute;left:0;top:16px;border-top-right-radius:20px;border-bottom-right-radius:20px}.metal-purity{display:flex;flex-direction:column;gap:10px}.scrollable-content{height:100%;max-height:95vh;overflow-y:auto}.style-2-img{max-height:70%;height:100%!important}.ring-size-video{background:#f0ebff;display:flex;justify-content:space-between;align-items:center;height:45px;padding:12px;border-radius:10px;margin-top:20px;margin-bottom:20px}.ring-size-video .text{color:#4f3267;font-size:.9rem}.ring-size-video .learn-how{color:#de57e9;font-weight:700;font-size:1rem;display:flex;gap:5px;align-items:center;cursor:pointer}.ring-size-video .learn-how mat-icon{font-size:20px;display:flex;align-items:center}.ring-size-video p{margin-bottom:0}.video-modal{height:90vh!important;width:90vw!important;max-width:none}.video-modal .modal-body{padding:0}.review-section{border-radius:10px;padding:15px}.review-img{display:flex;gap:10px;margin-top:10px}.review-img img{max-width:100px;max-height:140px}.detail-review-container{display:flex;max-width:1200px;margin:0 auto;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 10px #0000001a}.image-section{flex:1;background:#000;position:relative;min-height:400px}.product-image{width:100%;height:100%;object-fit:cover;background:linear-gradient(135deg,#e8e8e8,#d0d0d0);display:flex;align-items:center;justify-content:center;max-height:400px;position:relative}.product-image img{height:100%;width:100%;object-fit:contain}.earbuds-container{position:relative;width:300px;height:200px}.charging-case{width:200px;height:120px;background:linear-gradient(145deg,#f0f0f0,#e0e0e0);border-radius:25px;position:absolute;top:40px;left:50px;box-shadow:inset 0 4px 8px #0000001a}.charging-case:before{content:\"\";position:absolute;inset:10px;background:linear-gradient(145deg,#e8e8e8,#d8d8d8);border-radius:15px;box-shadow:inset 0 2px 4px #0000001a}.earbud{position:absolute;width:45px;height:15px;background:linear-gradient(145deg,#2a2a2a,#1a1a1a);border-radius:8px;box-shadow:0 2px 4px #0003}.earbud:before{content:\"noise\";position:absolute;top:2px;left:50%;transform:translate(-50%);font-size:6px;color:#888;font-weight:300}.earbud.left{top:70px;left:80px}.earbud.right{top:90px;left:130px}.earbud.right:before{color:#ff6b35}.review-section{flex:1;padding:30px;background:#fafafa}.reviewer-header{display:flex;align-items:center;margin-bottom:15px}.reviewer-avatar{width:40px;height:40px;background:#ccc;border-radius:50%;margin-right:12px;display:flex;align-items:center;justify-content:center;font-size:18px;color:#666}.reviewer-name{font-size:16px;font-weight:500;color:#333}.detail-rating{margin:10px 0}.stars{display:flex;gap:2px;margin-bottom:5px}.star{color:#ff9500;font-size:18px}.thumbs{display:flex;gap:5px}.thumb{color:#ff9500;font-size:16px}.review-date{font-size:14px;color:#666;margin:15px 0}.review-text{font-size:16px;line-height:1.5;color:#333;margin-bottom:25px}.images-section h3{font-size:16px;color:#666;margin-bottom:15px;font-weight:500}.review-images{display:flex;gap:10px}.review-image{width:60px;height:60px;background:#ddd;border-radius:6px;border:2px solid #e0e0e0;cursor:pointer;transition:border-color .3s}.review-image img{width:100%;height:100%}.review-image:hover,.review-image.selected{border-color:#007185}.navigation-arrows{position:absolute;top:20px;right:20px;display:flex;flex-direction:column;gap:10px}.arrow{width:40px;height:40px;background:#fffc;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:18px;color:#666;transition:background-color .3s;position:absolute;transform:rotate(90deg)}.backward-arrow{left:10px}.forward-arrow{right:10px}.arrow:hover{background:#fff}@media (max-width: 768px){.review-container{flex-direction:column}.image-section{min-height:300px}.review-section{padding:20px}}.review-modal{max-width:none;width:70vw}.review-modal .modal-body{padding:0}@media screen and (max-width: 475px){.offcanvas-small{height:100vh;width:100%;top:0}.review-modal{margin:0;height:100%;width:100%}.detail-review-container{flex-direction:column;height:100%}.product-image{max-height:289px}.image-section{min-height:289px}.video-modal{margin:0;height:100vh!important;width:100vw!important;overflow:hidden}}.modal{z-index:100000033}.breadcrumbs-modern{font-size:.85rem;color:#6b7280;margin-bottom:.5rem}.breadcrumb-item.active{color:#111827;font-weight:500}.product-title-modern{font-size:2rem;font-weight:800;color:#111827;margin:0;line-height:1.2;font-family:var(--website-font-family)}.product-price-modern{font-size:1.75rem;font-weight:700;color:#111827;font-family:var(--website-font-family)}.rating-line-modern{margin-top:.25rem}.rating-score-text{font-weight:700;font-size:1rem;color:#111827}.rating-count-text{font-size:.95rem;color:#10b981;font-weight:600;cursor:pointer}.product-description-brief{font-size:1rem;line-height:1.7;color:#4b5563;margin-top:1.5rem}.low-stock-text{color:#dc2626;font-weight:700;font-size:.875rem}.variants-modern-container{margin:2.5rem 0}.varient-key{font-size:.9rem;font-weight:800;color:#111827;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.75rem}.color-swatch-modern{width:36px;height:36px;border-radius:50%;cursor:pointer;border:3px solid white;box-shadow:0 0 0 1px #e5e7eb;transition:all .25s cubic-bezier(.4,0,.2,1)}.color-swatch-modern:hover{transform:scale(1.15)}.color-swatch-modern.active{box-shadow:0 0 0 2px #111827}.box-varient-modern{padding:.75rem 1.5rem;border:2px solid #f3f4f6;border-radius:10px;font-size:.95rem;font-weight:700;color:#374151;cursor:pointer;transition:all .2s;min-width:70px;text-align:center;background:#fff}.box-varient-modern:hover{border-color:#d1d5db;background:#f9fafb}.box-varient-modern.active{border-color:#111827;background:#111827;color:#fff}.quantity-container{margin-top:1rem}.quantity-selector-modern{border:1px solid #e5e7eb;border-radius:12px;width:fit-content;background:#f9fafb;padding:2px}.qty-btn{width:44px;height:44px;border:none;background:transparent;font-size:1.5rem;color:#111827;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;border-radius:10px}.qty-btn:hover:not(:disabled){background:#fff;box-shadow:0 2px 4px #0000000d}.qty-btn:disabled{color:#d1d5db;cursor:not-allowed}.qty-display{width:50px;text-align:center;font-weight:700;color:#111827;font-size:1.1rem}.out-of-stock-modern{background:#f3f4f6;color:#9ca3af;padding:1.1rem 2.5rem;border:none;border-radius:14px;font-weight:800;font-size:1.1rem;cursor:not-allowed}.wishlist-btn-modern{width:56px;height:56px;border:2px solid #f3f4f6;border-radius:14px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;background:#fff}.wishlist-btn-modern:hover{background:#fef2f2;border-color:#fecaca}.wishlist-btn-modern mat-icon{font-size:26px}.thumbnail-column{padding-right:15px!important}.thumbnail-list::-webkit-scrollbar{display:none}.thumbnail-list{-ms-overflow-style:none;scrollbar-width:none}.image-section-modern{padding-right:2.5rem!important;padding-left:0!important;width:60%!important;max-width:60%!important;flex:0 0 60%!important;margin-top:0!important}.detail-section-modern{padding-left:.5rem!important;padding-right:0!important;width:40%!important;max-width:40%!important;flex:0 0 40%!important;margin-top:0!important}.thumbnail-column{width:90px!important;flex:0 0 90px!important}.item-img{width:100%!important;max-width:100%;margin:0;border-radius:20px;overflow:hidden;background:#f9fafb;position:relative}lib-ngx-image-zoom{width:100%!important;display:block!important}::ng-deep .ngx-image-zoom-container{width:100%!important;height:auto!important;aspect-ratio:1/1}.style-1-vertical{display:flex;flex-direction:column;width:100%}.main-image-container{width:100%;aspect-ratio:1 / 1}.thumbnail-row{display:flex;gap:8px;overflow-x:auto;padding:12px 0}.thumbnail-img{min-width:80px;width:80px;height:80px;object-fit:cover;border-radius:8px;border:2px solid transparent;cursor:pointer;transition:border-color .2s}.active-thumb{border-width:2px;border-style:solid}.bento-grid{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:1fr 1fr;gap:15px;width:100%;aspect-ratio:5/4}.bento-item-large{grid-row:span 2;border-radius:24px;overflow:hidden}.bento-item-small{border-radius:20px;overflow:hidden}.bento-grid img{width:100%;height:100%;object-fit:cover;transition:transform .4s ease}.bento-grid img:hover{transform:scale(1.05)}@media (max-width: 991px){.image-section-modern,.detail-section-modern{width:100%!important;max-width:100%!important;flex:0 0 100%!important;padding:0!important}.bento-grid{grid-template-columns:1fr;grid-template-rows:auto;aspect-ratio:auto}.bento-item-large{grid-row:span 1}}.bento-masonry-container{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:1fr;gap:16px;width:100%}.bento-item-modern{border-radius:16px;overflow:hidden;background:#fdfdfd;aspect-ratio:1 / 1;transition:all .4s cubic-bezier(.4,0,.2,1)}.bento-img-modern{width:100%;height:100%;display:block;object-fit:cover;background:#fdfdfd;cursor:pointer;transition:transform .6s ease}.bento-item-modern:hover{transform:translateY(-4px);box-shadow:0 12px 30px #00000014}.bento-item-modern:hover .bento-img-modern{transform:scale(1.03)}.detail-section-modern{position:sticky;top:0;height:max-content;max-height:calc(100vh - 100px);overflow-y:auto;overflow-x:hidden;padding-left:2rem!important;scrollbar-width:none}.detail-section-modern::-webkit-scrollbar{display:none}.product-hero-card-modern{border:none;box-shadow:none;z-index:10;position:relative}.tabs-list{display:flex;justify-content:flex-start;gap:10px;list-style:none;padding:0;margin-bottom:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap}.tabs-list::-webkit-scrollbar{display:none}.tab-item{font-size:1rem;font-weight:600;color:#6b7280;padding:.5rem 1rem;border-radius:0;cursor:pointer;transition:all .25s;background:transparent;border-bottom:2px solid transparent;white-space:nowrap;flex-shrink:0}.tab-item:hover{background:transparent;color:#111827}.tab-content-pane{padding-top:.5rem}@media (max-width: 1024px){.product-hero-card-modern{padding:25px}.tab-content-pane{width:100%}}@media (max-width: 991px){.bento-masonry-container{grid-template-columns:1fr;grid-auto-rows:auto}.bento-item-modern.featured{grid-row:span 1;aspect-ratio:1 / 1}.product-hero-card-modern{position:static;padding:0;box-shadow:none;border:none;background:transparent;z-index:auto}.detail-section-modern{padding-left:0!important;margin-top:2rem;position:static!important;max-height:none!important;height:auto!important;overflow-y:visible!important;overflow-x:visible!important}.image-section-modern{padding-right:0!important}.tab-item{padding:.6rem 1rem;font-size:.95rem}.product-tabs-container{padding:0 4px}}.product-info-minimal{display:flex;flex-direction:column}.breadcrumbs-modern{display:flex;align-items:center;gap:8px;font-size:.95rem;color:#6b7280;font-weight:500}.breadcrumbs-modern .dot{font-size:1.2rem;line-height:1}.title-price-row-modern{display:flex;justify-content:space-between;align-items:flex-start;gap:20px}.product-title-modern{font-size:1.5rem;font-weight:800;color:#111827;margin:0;line-height:1.2}.product-price-modern{font-size:1.5rem;font-weight:500;color:#111827;white-space:nowrap}.rating-row-modern{display:flex;align-items:center;gap:12px;font-size:1rem;flex-wrap:wrap}.rating-score{font-weight:700;color:#111827}.separator{color:#e5e7eb}.reviews-link{font-weight:600}::ng-deep .rating-row-modern p-rating .p-rating-icon.p-rating-icon-active svg,::ng-deep .rating-row-modern p-rating .p-icon{color:#eab308!important;fill:#eab308!important}::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) svg,::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) .p-icon{color:#eab308!important;fill:#eab308!important;opacity:.25}.product-brief-modern{font-size:.95rem;line-height:1.7;color:#4b5563;margin-top:.5rem;text-align:justify}.write-review-btn{display:inline-flex;align-items:center;justify-content:center;padding:.65rem 1.75rem;background:#f8f9fa;color:#374151;border:1px solid #e5e7eb;border-radius:10px;font-size:.9rem;font-weight:600;cursor:pointer;transition:all .2s ease;letter-spacing:.02em}.write-review-btn:hover{background:#f1f3f5;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 8px #00000012}@media (max-width: 991px){.product-title-modern,.product-price-modern{font-size:1.3rem}}@media (max-width: 480px){.title-price-row-modern{flex-direction:column;gap:4px}.product-title-modern{font-size:1.2rem}.product-price-modern{font-size:1.2rem;white-space:normal}.rv-section{padding:1rem 0}.rv-header{gap:1rem}.rv-title{font-size:1.15rem;margin-bottom:.5rem}.rv-avg-num{font-size:1.15rem}.rv-bars{max-width:100%;width:100%}.rv-grid{grid-template-columns:1fr;gap:.75rem}.rv-card{padding:10px}.rv-name{font-size:14px}.tabs-list{gap:0}.tab-item{padding:.55rem 1rem;font-size:.9rem}.header-text{font-size:15px!important}.product-header{flex-wrap:wrap;gap:8px}.pricebreakup-btn{font-size:10px;padding:6px}.write-review-btn{width:100%;padding:.65rem 1rem}}.pb-glass-container{padding:16px;border-radius:16px}.pb-glass-card{background:#fff9;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.85);border-radius:12px;margin-bottom:12px;overflow:hidden}.pb-glass-header{padding:10px 16px;font-weight:700;font-size:12px;letter-spacing:1.5px;text-transform:uppercase}.pb-glass-row{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;font-size:14px;border-bottom:1px solid rgba(0,0,0,.04)}.pb-glass-row:last-child{border-bottom:none}.pb-glass-row:nth-child(2n){background:#f8fafc99}.pb-label{color:#6b7280;font-weight:500}.pb-value{font-weight:600;color:#1f2937}.pb-summary-card{background:#ffffffb3;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(203,213,225,.5);border-radius:12px;overflow:hidden}.pb-summary-row{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;font-size:14px;color:#374151;border-bottom:1px solid rgba(0,0,0,.05)}.pb-grand-total{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;font-weight:700;font-size:16px;letter-spacing:.5px}.item-code-row{margin-bottom:6px}.item-code-value{display:inline-block;padding:2px 10px;border-radius:999px;background:#f1f5f9;color:#475569;font-size:11px;font-weight:600;letter-spacing:.6px;text-transform:uppercase;border:1px solid #e2e8f0}.buy-now-btn{background:transparent!important;border:1.5px solid currentColor!important;color:inherit!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i11.DecimalPipe, name: "number" }, { kind: "pipe", type: i11.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i11.DatePipe, name: "date" }, { kind: "pipe", type: i11.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i12.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i13.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i14.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i15.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue", "backgroundInfo"] }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "ngmodule", type: NgxImageZoomModule }, { kind: "component", type: i16.NgxImageZoomComponent, selector: "lib-ngx-image-zoom", inputs: ["thumbImage", "fullImage", "zoomMode", "magnification", "minZoomRatio", "maxZoomRatio", "scrollStepSize", "enableLens", "lensWidth", "lensHeight", "circularLens", "enableScrollZoom", "altText", "titleText"], outputs: ["zoomScroll", "zoomPosition", "imagesLoaded"] }, { kind: "component", type: FeaturedProductsComponent, selector: "simpo-featured-products", inputs: ["data", "responseData", "index", "isRelatedProduct", "isBrowseProduct", "edit", "customClass", "delete", "nextComponentColor"], outputs: ["changeDetailProduct"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "component", type: SociaIconsComponent, selector: "simpo-socia-icons", inputs: ["socialIconData", "color", "sectionId", "iconColor"] }, { kind: "ngmodule", type: RatingModule }, { kind: "component", type: i17.Rating, selector: "p-rating", inputs: ["disabled", "readonly", "stars", "cancel", "iconOnClass", "iconOnStyle", "iconOffClass", "iconOffStyle", "iconCancelClass", "iconCancelStyle", "autofocus"], outputs: ["onRate", "onCancel", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i18.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: SvgDividerComponent, selector: "simpo-svg-divider", inputs: ["dividerType", "color"] }, { kind: "directive", type: ButtonEditorDirective, selector: "button[appButtonEditor]", inputs: ["appButtonEditor", "buttonData", "buttonStyle", "backgroundInfo", "sectionId", "buttonId", "itemIndex"] }, { kind: "directive", type: SpacingHorizontalDirective, selector: "[spacingHorizontal]", inputs: ["spacingHorizontal", "isHeader"] }, { kind: "pipe", type: SanitizeHtmlPipe, name: "sanitizeHtml" }, { kind: "ngmodule", type: NgxSkeletonLoaderModule }] }); }
|
|
997
997
|
}
|
|
998
998
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductDescComponent, decorators: [{
|
|
999
999
|
type: Component,
|
|
@@ -1025,7 +1025,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1025
1025
|
SpacingHorizontalDirective,
|
|
1026
1026
|
SanitizeHtmlPipe,
|
|
1027
1027
|
NgxSkeletonLoaderModule
|
|
1028
|
-
], providers: [MessageService], template: "<ng-container *ngIf=\"!isLoading\">\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <section class=\"total-container\" [id]=\"data?.id\" [simpoBackground]=\"styles?.background\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\r\n\r\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\r\n </div> -->\r\n <section class=\"container\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" [spacingHorizontal]=\"stylesLayout\"\r\n [simpoLayout]=\"styles?.layout\" #container>\r\n <!-- <div class=\"display-none\"><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\"\r\n (click)=\"routeToHome()\">Home</a> /\r\n <span>{{ responseData?.name | titlecase }}</span>\r\n </div> -->\r\n <div class=\"row m-0 w-100 mt-lg-4 h-auto overflow-visible\" #aboveHeight>\r\n <div class=\"col-lg-6 col-sm-12 image-section-modern\" #imageSection>\r\n <div class=\"d-flex flex-column justify-content-start gap-1\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-sm-12 detail-section-modern \" #detailSection>\r\n <div class=\"product-hero-card-modern\">\r\n <ng-container *ngIf=\"isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.deliveryEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.deliveryEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"DeliverySection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.storesEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.storesEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"StoreSection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.appointmentBookingEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.appointmentBookingEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"TryAtHome\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.videoCallEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"videoCallSchedule\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.brandPromiseEnabled\">\r\n <ng-container *ngTemplateOutlet=\"branding\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n\r\n <!-- Moved descriptors to Details tab below -->\r\n\r\n <!-- <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\"\r\n [innerHTML]=\"responseData.brief\"></div> -->\r\n <!-- Moved tags to Details tab below -->\r\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\r\n <!-- <ng-container>\r\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\r\n </ng-container> -->\r\n </div>\r\n </div>\r\n <!-- Tabs Navigation -->\r\n <div class=\"product-tabs-container\">\r\n <ul class=\"tabs-list\">\r\n <li class=\"tab-item\" [class.active]=\"activeTab == 'Details'\"\r\n [style.color]=\"activeTab == 'Details' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'Details' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('Details')\">Details</li>\r\n <li class=\"tab-item\" *ngIf=\"reviewsData\" [class.active]=\"activeTab == 'Reviews'\"\r\n [style.color]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('Reviews')\">Reviews</li>\r\n <li class=\"tab-item\" *ngIf=\"materialBasedPricing\" [class.active]=\"activeTab == 'PriceBreakup'\"\r\n [style.color]=\"activeTab == 'PriceBreakup' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'PriceBreakup' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('PriceBreakup')\">Price Breakup</li>\r\n </ul>\r\n </div>\r\n\r\n <!-- Tab Content -->\r\n <div class=\"tab-content-pane\">\r\n <div *ngIf=\"activeTab == 'Details'\">\r\n <!-- Integrated descriptors and tags here -->\r\n <div class=\"mt-2\">\r\n <ng-container *ngTemplateOutlet=\"descriptors\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"activeTab == 'Reviews'\">\r\n <ng-container *ngTemplateOutlet=\"ReviewsSection\"></ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"activeTab == 'PriceBreakup'\">\r\n <div class=\"pb-glass-container mt-2\">\r\n\r\n <!-- One card per material \u2014 generic, works for any material type -->\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"pb-glass-card\">\r\n <div class=\"pb-glass-header\"\r\n [style.background]=\"styles?.background?.accentColor\"\r\n [style.color]=\"'#fff'\">\r\n {{ ele?.materialName | titlecase }}\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Purity</span>\r\n <span class=\"pb-value\">{{ ele?.purity }}</span>\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Net Weight</span>\r\n <span class=\"pb-value\">{{ ele?.quantity }} {{ ele?.unit | titlecase }}</span>\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Rate / {{ ele?.unit | titlecase }}</span>\r\n <span class=\"pb-value\">\u20B9{{ ele?.pricePerUnit | number:'1.2-2' }}</span>\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Value</span>\r\n <span class=\"pb-value\">\u20B9{{ (ele?.quantity * ele?.pricePerUnit) | number:'1.2-2' }}</span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Making Charges card -->\r\n <div class=\"pb-glass-card\">\r\n <div class=\"pb-glass-header\"\r\n [style.background]=\"styles?.background?.accentColor\"\r\n [style.color]=\"'#fff'\">\r\n Making Charges\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Net Weight</span>\r\n <span class=\"pb-value\">{{ responseData?.baseWeight }}</span>\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Making Charge %</span>\r\n <span class=\"pb-value\">{{ responseData?.makingChargePercentage }}%</span>\r\n </div>\r\n <div class=\"pb-glass-row\">\r\n <span class=\"pb-label\">Value</span>\r\n <span class=\"pb-value\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Summary card -->\r\n <div class=\"pb-summary-card\">\r\n <div class=\"pb-summary-row\">\r\n <span>Total Value</span>\r\n <span>\u20B9{{ responseData?.jewelryPriceBreakup?.priceWithoutTax | number:'1.2-2' }}</span>\r\n </div>\r\n <div class=\"pb-summary-row\">\r\n <span>Tax ({{ responseData?.jewelryPriceBreakup?.taxRef?.taxPercent }}% GST)</span>\r\n <span>\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}</span>\r\n </div>\r\n <div class=\"pb-grand-total\"\r\n [style.background]=\"styles?.background?.accentColor\"\r\n [style.color]=\"'#fff'\">\r\n <span>TOTAL</span>\r\n <span>\u20B9{{ (responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) | number:'1.2-2' }}</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n <ng-container *ngIf=\"recentViewItemList?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"recentViewItemList\"\r\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\r\n </ng-container>\r\n <!-- <ng-container *ngIf=\"recentViewItemList?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\r\n [isRelatedProduct]=\"true\"></simpo-featured-products>\r\n </ng-container> -->\r\n <!-- <ng-container>\r\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\r\n </ng-container> -->\r\n\r\n <ng-container *ngIf=\"styles?.devider?.display\">\r\n <simpo-svg-divider [dividerType]=\"styles?.devider?.deviderType\"\r\n [color]=\"nextComponentColor?.color\"></simpo-svg-divider>\r\n </ng-container>\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>\r\n\r\n\r\n<div class=\"mobile-footer\">\r\n <div class=\"icons\">\r\n <div (click)=\"goToCart()\">\r\n <mat-icon>shopping_cart</mat-icon>\r\n </div>\r\n <div>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n </div>\r\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\r\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\">Out of\r\n Stock</button>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\r\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\"\r\n [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n</div>\r\n\r\n<ng-template #ReviewSection>\r\n <div class=\"review-sec\">\r\n <div class=\"title\">Customer Review</div>\r\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\r\n <span>Be the first to write a review</span>\r\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add\r\n Review' : 'Cancel Review'}}</button>\r\n <ng-container *ngIf=\"showReview\">\r\n <hr />\r\n <div class=\"user-review\">\r\n <div class=\"title\">Write a review</div>\r\n <span class=\"secondary-text\">RATING</span>\r\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\r\n <div>\r\n <span class=\"secondary-text\">Review Title</span>\r\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\r\n </div>\r\n <div>\r\n <span class=\"secondary-text\">Review</span>\r\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\r\n </div>\r\n <div class=\"review-action-btn\">\r\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\r\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"addProductReview()\"\r\n [disabled]=\"productReview == 0 && !reviewTitle?.length && !reviewDescription?.length\">Submit\r\n review</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #SocialIcons>\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\r\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\r\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\r\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\r\n <div style=\"position: relative;margin-right: 10px;\">\r\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\"\r\n [sectionId]=\"data?.id\"></simpo-socia-icons>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #ActionBtn>\r\n <div class=\"button-parent\">\r\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\r\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\">Out of\r\n Stock</button>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\r\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\"\r\n [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && IsEcommerce\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && IsEcommerce\" class=\"w-75 mt-2\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? buyNow() : ''\">Buy Now</button>\r\n </div>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && !IsEcommerce\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\" (click)=\"raiseLead()\"><mat-icon style=\"height:14px !important\">\r\n message</mat-icon>Notify Me</button>\r\n </div>\r\n <div class=\"favourite\" *ngIf=\"IsEcommerce\" (click)=\"isItemAsFavorite ? removeToFavourite() : addToFavourite()\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n <div class=\"share-icon\" (click)=\"shareProduct()\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\">share</mat-icon>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #variants>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style1'\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"mb-3\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style2' && selectedVarient.size > 0\">\r\n <ng-container>\r\n <div class=\"row mt-2 style2-container w-100\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div *ngFor=\"let item of selectedVarient | keyvalue\" class=\"px-3 py-2 varient-item\"\r\n [class]=\"getClass(selectedVarient)\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"variant-head\">{{item.key | titlecase}}</div>\r\n <div class=\"variant-value text-start fw-semibold\">\r\n {{item.value |\r\n titlecase}}</div>\r\n </div>\r\n <div class=\"cursor-pointer p-0\" [class]=\"getClass(selectedVarient)\">\r\n <div class=\"custom-text d-flex align-items-center justify-content-center h-100 p-2\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightVariant\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">CUSTOMISE\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc>\r\n <div class=\"product-info-minimal\">\r\n <!-- Item Code -->\r\n <div class=\"item-code-row\" *ngIf=\"responseData?.itemCode\">\r\n <span class=\"item-code-value\">{{ formatItemCode(responseData?.itemCode) }}</span>\r\n </div>\r\n\r\n <!-- Title and Price Row -->\r\n <div class=\"title-price-row-modern\">\r\n <h1 class=\"product-title-modern\">{{responseData?.name}}</h1>\r\n <div class=\"product-price-modern\">\r\n <span [innerHTML]=\"currency\"></span> {{responseData?.price?.sellingPrice}}\r\n </div>\r\n </div>\r\n\r\n <!-- Rating Row -->\r\n <div class=\"rating-row-modern\" *ngIf=\"responseData?.averageRating\">\r\n <p-rating [(ngModel)]=\"responseData.averageRating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\r\n <span class=\"rating-score\">{{responseData?.averageRating | number:'1.1-1'}}</span>\r\n <span class=\"separator\">|</span>\r\n <span class=\"reviews-link\" [style.color]=\"styles?.background?.accentColor\">\r\n {{responseData?.totalReviewCount}} reviews</span>\r\n </div>\r\n\r\n <!-- Brief Description -->\r\n <div class=\"product-brief-modern\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData?.brief | sanitizeHtml\">\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #descriptors>\r\n <div class=\"row prod-desc mt-2\">\r\n <div>\r\n <!-- <div class=\"product-header d-flex align-items-center justify-content-between\">\r\n <span class=\"header-text\" *ngIf=\"responseData?.descriptor || responseData?.materials\">Product Details</span>\r\n <div class=\"pricebreakup-btn d-flex align-items-center justify-content-center cursor-pointer\"\r\n *ngIf=\"materialBasedPricing\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasRightPriceBreakup\"\r\n [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\r\n <mat-icon>add</mat-icon> PRICE BREAKUP\r\n </div>\r\n </div> -->\r\n <div class=\"description\">\r\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name | sanitizeHtml\"\r\n [style.background]=\"data?.styles?.background?.color\"></div>\r\n </div>\r\n <!-- <ng-container *ngIf=\"materialBasedPricing\">\r\n <div class=\"jewellery-table-container\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor(ele.materialType)\">\r\n {{ele?.materialName | titlecase}}\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor(ele.materialType)\">\r\n <div class=\"col-6 metal-purity\">\r\n <div class=\"row-header\">\r\n Net Weight/{{ele?.unit | titlecase}}\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.quantity + \" \" + (ele?.unit | titlecase)}}\r\n </div>\r\n </div>\r\n <div class=\"col-6 metal-purity\">\r\n <div class=\"row-header\">\r\n Purity\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.purity |\r\n titlecase}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container> -->\r\n </div>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #ImageSection>\r\n <ng-container *ngIf=\"!varientLoading && (isMobile || data?.styles?.gridStyle == 'Style1')\">\r\n <div class=\"style-1-vertical d-flex flex-column w-100\">\r\n <div class=\"main-image-container p-0\">\r\n <div class=\"item-img rounded-3\">\r\n <lib-ngx-image-zoom *ngIf=\"currentImg\" [thumbImage]=\"currentImg\" [fullImage]=\"currentImg\" [zoomMode]=\"'hover'\"\r\n [magnification]=\"0.4\" [enableScrollZoom]=\"false\">\r\n </lib-ngx-image-zoom>\r\n <img *ngIf=\"!currentImg\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\"\r\n class=\"w-100 h-100 object-fit-cover\">\r\n </div>\r\n </div>\r\n <div class=\"thumbnail-row py-3 d-flex gap-2 overflow-auto hide-scroll\">\r\n <img class=\"img thumbnail-img\" *ngFor=\"let img of itemImages\" [src]=\"img.imgUrl\" (click)=\"changeImg(img.imgUrl)\"\r\n [class.active-thumb]=\"currentImg == img.imgUrl\"\r\n style=\"cursor: pointer; min-width: 80px; width: 80px; height: 80px; object-fit: cover; border-radius: 8px; border: 2px solid transparent;\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!varientLoading && (!isMobile && data?.styles?.gridStyle == 'Style2')\">\r\n <div class=\"bento-masonry-container\">\r\n <div *ngFor=\"let img of itemImages; let i = index\" class=\"bento-item-modern\">\r\n <img [src]=\"img.imgUrl\" class=\"bento-img-modern\" (click)=\"changeImg(img.imgUrl)\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"item-img\" *ngIf=\"varientLoading\">\r\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '100%',\r\n 'border-radius': '10px'\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #branding>\r\n <div class=\"row w-100\">\r\n <ng-container *ngFor=\"let brand of brandPromises\">\r\n <div class=\"col-4 d-flex flex-column align-items-center g-2\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"brand?.logoUrl\" alt=\"\" class=\"w-h-40 p-0 rounded-circle\">\r\n <div class=\"brand-text w-100 text-center py-2\">\r\n {{brand?.title | titlecase}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #videoCallSchedule>\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container>\r\n <div class=\"row w-100 video-container\">\r\n <div class=\"col-4 video-call-img\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/355007c175362077266611289-229221023_small.gif\"\r\n alt=\"\" class=\"w-100 h-100 \">\r\n </div>\r\n <div class=\"col-8 align-content-center\">\r\n <div class=\"video-head-text\">\r\n Live Video Call\r\n </div>\r\n <div class=\"sub-text\">\r\n Join a live video call with our consultants to see your favourite designs up close!\r\n </div>\r\n <button class=\"sch-btn text-center cursor-pointer\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(2)\" [buttonId]=\"getButtonId(2)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(2)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n Schedule a Video Call\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #DeliverySection>\r\n <div class=\"delivery-container\">\r\n <h2 class=\"delivery-title\">Delivery, Stores & Trial</h2>\r\n\r\n <!-- Location Section -->\r\n <div class=\"location-section mb-2\">\r\n <div class=\"location-container d-flex align-items-center justify-content-between\"\r\n [style.borderColor]=\"styles?.background?.accentColor\">\r\n <div class=\"d-flex align-items-center flex-grow-1 me-2\" style=\"width: calc(100% - 100px);\">\r\n <div class=\"d-flex mx-1\"><mat-icon\r\n class=\"gps d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" class=\"postal-code-input flex-grow-1\" placeholder=\"Enter PinCode\" [(ngModel)]=\"pincode\"\r\n style=\"width: 100%;\">\r\n </div>\r\n <button class=\"btn locate-btn\" (click)=\"getStoreDetails()\">Submit</button>\r\n </div>\r\n <div *ngIf=\"!isPinCode\" style=\"color: red;\">Pin code must be 6 digits.</div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(pincode?.toString().length ?? 0) == 6\">\r\n <!-- Free Delivery Section -->\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-gift\">\r\n <polyline points=\"20 12 20 22 4 22 4 12\"></polyline>\r\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"5\"></rect>\r\n <line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"7\"></line>\r\n <path d=\"M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z\"></path>\r\n <path d=\"M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z\"></path>\r\n </svg>\r\n </span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges == 0\">Expected\r\n Delivery by {{ getDateAfterxDays() | date:'d MMM' }}</span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges > 0\">Your\r\n expected Order will\r\n Deliver by {{ getDateAfterxDays() | date:'d MMM' }} with a Delivery Charge of\r\n \u20B9 {{ecomConfigs?.deliveryCharges | number:'1.2-2'}}</span>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #TryAtHome>\r\n <!-- Try At Home Section -->\r\n <div class=\"try-home-section\">\r\n <div class=\"d-flex align-items-start try-home-item\">\r\n <span class=\"home-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-home\">\r\n <path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"></path>\r\n <polyline points=\"9 22 9 12 15 12 15 22\"></polyline>\r\n </svg>\r\n </span>\r\n <div class=\"try-home-details\">\r\n <div class=\"try-home-header\">\r\n <span class=\"try-home-text\">Try At Home</span>\r\n <span class=\"free-text\"> (It's Free)</span>\r\n </div>\r\n <div class=\"home-appointment-text\">Home Appointment <span>Available to try from 29 Jul</span></div>\r\n <!-- <div class=\"appointment-text\">\r\n Home Appointment <span class=\"appointment-available\">Available to try from 28 Jun</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex-align-items-center justify-content-center w-100\">\r\n <button class=\"book-appointment-btn\" (click)=\"addToTrialCart()\" *ngIf=\"!isItemAddedAsTrial\">Try at\r\n HOME</button>\r\n <button class=\"book-appointment-btn\" *ngIf=\"isItemAddedAsTrial\">HOME APPOINTMENT BOOKED</button>\r\n </div>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #StoreSection>\r\n <!-- Nearest Store Section -->\r\n <ng-container\r\n *ngIf=\"storeDetails?.nearbyStore?.storeName && storeDetails?.nearbyStore?.storeName?.length > 0\">\r\n <div class=\"store-section\">\r\n <div class=\"d-flex align-items-center store-item\">\r\n <span class=\"store-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\r\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\r\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\r\n </svg>\r\n </span>\r\n <div class=\"store-details\">\r\n <div class=\"store-text\">\r\n <span class=\"store-label\">Nearest Store - </span>\r\n <span class=\"store-name\">{{ storeDetails?.nearbyStore?.storeName | titlecase}}</span>\r\n <!-- <span class=\"store-distance\"> (4km)</span> -->\r\n </div>\r\n <!-- <div class=\"availability-section\">\r\n <span class=\"availability-badge\">\u23F0 AVAILABLE BY 28 JUN</span>\r\n </div> -->\r\n <!-- <div class=\"other-stores-text\">\r\n Also Available in <span class=\"other-stores-link\">18 other stores</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center w-100\">\r\n <button class=\"find-store-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"onFindInStore(storeDetails?.nearbyStore?.id)\">FIND IN\r\n STORE</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #emptyStore>\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\r\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\r\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\r\n </svg>\r\n </span>\r\n <span class=\"delivery-text\">No Stores are available</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-variant\" tabindex=\"-1\" id=\"offcanvasRightVariant\"\r\n aria-labelledby=\"offcanvasRightLabel\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price px-3 pb-2\">\r\n <div class=\"price-text\">Price</div>\r\n <div class=\"d-flex g-3 align-items-center\">\r\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.discountedPrice}}</div>\r\n <div class=\"price\"\r\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\"\r\n [ngClass]=\"{'text-decoration-line-through': responseData?.price?.discountedPrice}\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}</div>\r\n </div>\r\n </div>\r\n <div class=\"varient-container h-100 p-3\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"varient-data\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"confirm-btn w-100 p-3 text-center cursor-pointer\" data-bs-dismiss=\"offcanvas\"\r\n [style.background]=\"data?.styles?.background?.accentColor\" style=\"color: white;\">Confirm\r\n Customization</div>\r\n</div>\r\n\r\n<ng-template #dialogBox>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header d-flex align-item-center\">\r\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\r\n <div class=\"schedule-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon (click)=\"matCloseDialog()\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"modal-body h-100\">\r\n <div class=\"row h-100 w-100 video-call-container\">\r\n <div class=\"col-6 h-100\" *ngIf=\"!isMobile\">\r\n <img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/557699c1753779503913freepik-overhead-shot-a-person-holding-a-smartphone-with-a-1029_vmg8GqHj (online-video-cutter.com).gif\"\r\n alt=\"\" class=\"w-100 h-100\" style=\"object-fit: cover;\">\r\n </div>\r\n <div class=\"col-6 position-relative h-100 call-details\">\r\n <!-- Name Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\r\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\r\n (input)=\"onInputChange('username')\">\r\n </div>\r\n\r\n <!-- <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\r\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\r\n (input)=\"onInputChange('email')\">\r\n </div> -->\r\n\r\n <!-- Mobile Number Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\r\n <div class=\"sub-text-call\">IN +91</div>\r\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\r\n (input)=\"onInputChange('mobileNumber')\" (wheel)=\"$event.preventDefault()\">\r\n </div>\r\n\r\n\r\n <!-- Pincode Input with Validation -->\r\n <!-- <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\r\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-0\">\r\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\r\n (input)=\"onInputChange('pincode')\">\r\n </div> -->\r\n <div class=\"language my-3\">\r\n <div class=\"mini-text mb-2\">Language Preference</div>\r\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\r\n <ng-container *ngFor=\"let lang of languages\">\r\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\r\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectedLang = lang\"\r\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\r\n {{lang}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"selectedLang == 'Others'\">\r\n <div class=\"input-field my-3\">\r\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\r\n </div>\r\n </ng-container>\r\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" [disabled]=\"isSubmitting\" [style.background]=\"data?.styles?.background?.accentColor\" [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\r\n <ng-container *ngIf=\"isSubmitting\">\r\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n SCHEDULING...\r\n </ng-container>\r\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\r\n <div (click)=\"scheduleVideoCall()\" class=\"d-flex align-items-center\">\r\n <mat-icon>video_call</mat-icon> \r\n SCHEDULE A VIDEO CALL\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"scheduled\">\r\n <mat-icon>check_circle</mat-icon> \r\n SCHEDULED SUCCESSFULLY\r\n </ng-container>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-small overflow-scroll\" tabindex=\"-1\" id=\"offcanvasRightPriceBreakup\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price p-10-20\">\r\n <div class=\"price-break-header\">{{responseData?.name}}</div>\r\n </div>\r\n <div class=\"price-breakup h-100 w-100\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"price-container mb-3 p-10-20\">\r\n <div class=\"price-container-header\">\r\n {{ ele.materialType + \" BREAKUP\" }}\r\n </div>\r\n <div class=\"row w-100 header-row\">\r\n <div class=\"col-3 text-center\">COMPONENT</div>\r\n <div class=\"col-3 text-center\">RATE</div>\r\n <div class=\"col-3 text-center\">WEIGHT</div>\r\n <div class=\"col-3 text-center\">FINAL VALUE</div>\r\n </div>\r\n <div class=\"row w-100 value-row\">\r\n <div class=\"col-3 text-center\">{{ ele.purity | titlecase }}</div>\r\n <div class=\"col-3 text-center\">\u20B9{{ getPricePerGram(ele.pricePerUnit,ele.materialType) |\r\n number:'1.2-2' }}</div>\r\n <div class=\"col-3 text-center\">{{ele.quantity + ' ' + (ele.unit | titlecase)}}</div>\r\n <div class=\"col-3 text-center total\">\u20B9{{ ele.pricePerUnit * ele.quantity | number }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"price-container mb-3 p-10-30 py-0 border-unset\">\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Making Charges</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Tax Amount</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Total Amount</div>\r\n <div class=\"col-6 text-end total\">\r\n \u20B9{{(responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #ReviewsSection>\r\n <div class=\"rv-section\" *ngIf=\"reviewsData\">\r\n\r\n <!-- Header: Title + Average | Bar Chart -->\r\n <div class=\"rv-header\">\r\n <div class=\"rv-header-left\">\r\n <h2 class=\"rv-title\">Reviews & Ratings</h2>\r\n <div class=\"rv-average-row\">\r\n <!-- filled stars -->\r\n <div class=\"rv-stars\">\r\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n <span class=\"rv-avg-num\">{{responseData?.averageRating | number:'1.1-1'}}</span>\r\n <span class=\"rv-avg-label\">average</span>\r\n </div>\r\n <div class=\"rv-count\" [style.color]=\"styles?.background?.accentColor || '#10b981'\">\r\n {{responseData?.totalReviewCount | number}} Reviews\r\n </div>\r\n </div>\r\n\r\n <div class=\"rv-bars\">\r\n <ng-container *ngFor=\"let rating of [5,4,3,2,1]\">\r\n <div class=\"rv-bar-row\">\r\n <span class=\"rv-bar-label\">{{rating}}</span>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n <div class=\"rv-bar-track\">\r\n <div class=\"rv-bar-fill\" [style.width.%]=\"getPercentage(rating)\"></div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Review Cards Grid -->\r\n <div class=\"rv-grid\">\r\n <ng-container *ngFor=\"let review of reviewsData\">\r\n <ng-container *ngIf=\"review.review\">\r\n <div class=\"rv-card\">\r\n <div class=\"rv-card-top\">\r\n <div class=\"rv-reviewer\">\r\n <img [src]=\"'https://ui-avatars.com/api/?name=' + (review?.userName ?? 'U') + '&background=random'\"\r\n class=\"rv-avatar\" alt=\"\">\r\n <div class=\"rv-name-date\">\r\n <span class=\"rv-name\">{{review?.userName ?? 'Anonymous'}}</span>\r\n <span class=\"rv-date\">{{review?.createdAt | date:'d MMM y'}}</span>\r\n </div>\r\n </div>\r\n <!-- Star rating -->\r\n <div class=\"rv-card-stars\">\r\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\r\n <svg *ngIf=\"s <= review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n <svg *ngIf=\"s > review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" style=\"opacity:0.25\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <p class=\"rv-text\">{{review?.review ?? 'No comment provided.'}}</p>\r\n\r\n <!-- Review Images -->\r\n <div class=\"rv-images\" *ngIf=\"review?.reviewImages?.length\">\r\n <a *ngFor=\"let img of review.reviewImages\" [href]=\"img.imgUrl\" target=\"_blank\" class=\"rv-img-link\">\r\n <img [src]=\"img.imgUrl\" alt=\"Review image\" class=\"rv-img-thumb\" onerror=\"this.style.display='none'\">\r\n </a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"text-center mt-4\" *ngIf=\"(reviewsData?.length ?? 0) > 3\">\r\n <button class=\"write-review-btn\" (click)=\"loadMoreReviews()\">Load More Reviews</button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"modal fade\" id=\"exampleModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" role=\"dialog\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-dialog-centered video-modal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-body\" style=\"height: 100%;\">\r\n <video controls muted playsinline style=\"width: 100%; height: 100%;\">\r\n <source\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/371647c1753962084265clideo_editor_48bc93c24e18470888c661bb09e437da (online-video-cutter.com).mp4\"\r\n type=\"video/mp4\">\r\n Your browser does not support the video tag.\r\n </video>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal fade\" id=\"reviewModal\" tabindex=\"-1\" aria-labelledby=\"reviewModalLabel\" role=\"dialog\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog review-modal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h1 class=\"modal-title fs-5\"></h1>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"detail-review-container\">\r\n <div class=\"image-section\">\r\n <div class=\"product-image\">\r\n <div class=\"backward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex-1\"\r\n *ngIf=\"currentImageIndex > 0\">\u25BC</div>\r\n <img [src]=\"selectedReview?.reviewImages?.[currentImageIndex]?.imgUrl\" alt=\"\">\r\n <div class=\"forward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex+1\"\r\n *ngIf=\"currentImageIndex < selectedReview?.images?.length - 1\">\u25B2</div>\r\n <!-- <div class=\"earbuds-container\">\r\n <div class=\"charging-case\"></div>\r\n <div class=\"earbud left\"></div>\r\n <div class=\"earbud right\"></div>\r\n </div> -->\r\n </div>\r\n <!-- <div class=\"navigation-arrows\">\r\n </div> -->\r\n </div>\r\n\r\n <div class=\"review-section\">\r\n <div class=\"reviewer-header\">\r\n <div class=\"reviewer-avatar\">\uD83D\uDC64</div>\r\n <div class=\"reviewer-name\">{{selectedReview?.userName ?? \"-\"}}</div>\r\n </div>\r\n\r\n <div class=\"detail-rating\" *ngIf=\"selectedReview?.rating\">\r\n <p-rating [(ngModel)]=\"selectedReview.rating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\r\n </div>\r\n\r\n <div class=\"review-date\">\r\n Reviewed in India on 24 July 2025\r\n </div>\r\n\r\n <div class=\"review-text\">\r\n {{selectedReview?.review ?? \"-\"}}\r\n </div>\r\n\r\n <div class=\"images-section\">\r\n <h3>Images in this review</h3>\r\n <div class=\"review-images\">\r\n <div class=\"review-image\" [ngClass]=\"{'selected': currentImageIndex == i}\"\r\n *ngFor=\"let img of selectedReview?.reviewImages ?? [];let i = index\" (click)=\"currentImageIndex = i\">\r\n <img [src]=\"img.imgUrl\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".product-desc{display:flex}::ng-deep .product-desc table,::ng-deep .brief-desc table{border-collapse:collapse;width:100%;margin:10px 0}::ng-deep .product-desc table td,::ng-deep .product-desc table th,::ng-deep .brief-desc table td,::ng-deep .brief-desc table th{border:1px solid #dddddd!important;text-align:left;padding:8px}*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}::ng-deep .smooth-panel .p-panel-header{cursor:pointer;background:transparent;border:unset;font-size:18px;font-weight:700;padding:0}::ng-deep .smooth-panel .p-panel-content{border:unset;padding:0}.jewel-container{border-radius:12px;box-shadow:#63636333 0 2px 8px}.jewel-header{padding:8px 10px;border-radius:12px 12px 0 0;font-size:15px;font-weight:700;color:#4f3267}.br-p{border-radius:0 0 12px 12px;padding:10px 0}.row-header{font-size:13px;font-weight:700;color:#4f3267}.row-content{color:#4e555e}.jewellery-table-container{border-radius:12px}.jewellery-table{width:100%;border-collapse:collapse;border:1px solid #ddd;transition:all .3s ease}.jewellery-table th,.jewellery-table td{border:1px solid #ddd;padding:12px;text-align:left;transition:background-color .2s ease}.material-header td{background-color:#f8f9fa;font-weight:700;font-size:16px}.column-header{background-color:#f1f1f1}.column-header th{font-weight:600}.material-row:hover{background-color:#f5f5f5}.charges-header th,.total-header th,.total-header td{background-color:#eaeaea;font-weight:700}.total-row td{font-weight:700;font-size:18px;background-color:#f8f8f8}@media screen and (max-width: 600px){.jewellery-table{font-size:14px}.jewellery-table th,.jewellery-table td{padding:8px}}.share-icon,.favourite{border-radius:50%!important;height:30px;width:30px;padding:6px;display:flex;align-items:center;justify-content:center;background-color:#f1f5f9!important;cursor:pointer;transition:all .2s ease;border:none!important}:is(.share-icon,.favourite) mat-icon{font-size:20px;width:20px;height:20px;display:flex;align-items:center;justify-content:center}.share-icon:hover,.favourite:hover{background-color:#e2e8f0!important;transform:scale(1.05)}.header-text{font-size:17px;font-weight:bolder}.pricebreakup-btn{font-size:11px;font-weight:700;padding:8px;border-radius:8px;letter-spacing:.5px}.pricebreakup-btn mat-icon{font-size:18px;display:flex;align-items:center}.img-list{display:flex;gap:5px;max-height:460px}.img-list img{height:100px;width:100px;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:100%;aspect-ratio:1/1;overflow:hidden}.item-img img{width:100%!important;height:100%!important;object-fit:cover}.price{font-weight:600;font-size:24px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:1px solid;align-items:center;gap:15px;height:44px;width:75%;justify-content:space-between;border-radius:12px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.fc{font-size:17px;font-weight:700}.tab-group{display:flex;gap:10px}.tab{font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black;max-width:max-content}.discount-price{font-size:1.4rem}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#f7f7f7;padding:11px 20px;border-radius:12px;margin-top:unset!important;width:70%!important;border:1px solid #d3d3d347}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#f7f7f7;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:7px 25px;cursor:pointer;font-weight:600}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:5px;height:44px!important;justify-content:space-between;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:14px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.w-h-40{width:40px!important;height:40px!important}.height{height:auto;overflow-y:visible}.mobile-footer{display:none}video{border-radius:18px}@media (min-width: 1024px){.zoom:hover{transform:scale(1.04);transition:transform .2s ease-in-out;overflow:hidden}.product-heading{font-size:20px;font-weight:600;margin-top:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.product-desc{font-size:13px}.brief-desc{font-size:16px;margin-top:unset!important}.total-container{padding-top:10px!important;padding-bottom:4rem!important}.out-of-stock,.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important;height:348px}.item-img img{width:100%;height:348px!important}.display-none{display:none}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{width:25%;border:2px solid lightgray;cursor:pointer}.input-field{margin-top:.7rem!important;margin-bottom:.7rem!important}.prod-desc{margin-top:20px}.video-call-container{margin:0!important}.product-img{height:220px}.call-details{width:100%!important;padding:3%!important}.send-btn{padding:.5rem 1rem!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%;height:auto}.product-heading{font-size:23px;font-weight:600}.discount-price{font-size:1.7rem!important}.header-text{font-size:20px!important}}.send-btn{font-size:14px!important;padding:1rem;display:flex;align-items:center;justify-content:center;text-transform:uppercase;font-weight:600}.send-btn mat-icon{height:20px;width:20px;font-size:18px}a{text-decoration:none}.brief-desc{font-size:14px;color:#4e555e}.total-container{height:auto;position:relative;display:block!important;overflow:visible}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%;margin:unset!important}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}}@media (min-width:1024px){.product-headig{font-size:35px}}.mat-accordion .mat-expansion-panel:last-of-type{box-shadow:none}@media (min-width: 1400px){.container{max-width:unset;width:95%;height:100vh;overflow-y:auto}}.width-max{width:max-content}.fw-600{font-weight:600}.cursor-pointer{cursor:pointer}.offcanvas-variant{border-radius:30px 0 0 30px}.varient-header,.varient-price{background:#f7f7f7}.varient-header{border-radius:30px 0 0}.confirm-btn{border-radius:0 0 0 30px;position:absolute!important;bottom:0!important}.style2-container{border:1px solid;border-radius:12px;margin:0}.varient-item{border-right:1px solid;align-content:center}.variant-head{font-size:12px;color:#33363e}.varient-data{margin-bottom:25px;border-bottom:1px solid black;padding-bottom:25px}.variant-value{font-size:.9rem;color:#000}.custom-text{border-radius:0 8px 8px 0;font-size:.9rem;font-weight:600}.scroll-wrap{flex-wrap:nowrap}.brand-text{word-wrap:break-word;white-space:normal;font-size:12px;font-weight:600;line-height:20px}.video-container{border:1px solid rgb(240,240,240);margin:10px 0;border-radius:12px}.video-head-text{font-size:16px;font-weight:700}.sub-text{font-size:11px;color:#6f7377;margin-bottom:10px}.sch-btn{font-size:1.2rem!important;color:#fff;padding:3px 0;margin-top:5px}.tax-text{font-size:.7rem;color:#6f7377}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.delivery-container{margin:35px 0 15px;background-color:transparent}.delivery-title{font-size:16px;font-weight:600;margin:0 0 12px;line-height:1.2;margin-bottom:.5rem!important}.location-container{border:1px solid #cfcfcf;border-radius:12px;padding:10px;margin-bottom:5px;width:100%}.location-icon{width:20px;height:20px;background-color:#374151;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.location-icon:before{content:\"\";width:8px;height:8px;background-color:#fff;border-radius:50%;position:absolute}.postal-code-input{font-size:12px;font-weight:600;letter-spacing:.5px;border:none;outline:none;background:transparent;width:90%}.postal-code-input::placeholder{font-weight:500}.locate-btn{background:none!important;border:none!important;font-weight:600;color:#111827;font-size:13px!important;padding:0!important;box-shadow:none!important;width:auto!important;white-space:nowrap}.gps{font-size:17px}.locate-btn:focus{box-shadow:none!important}.delivery-section{margin-bottom:15px;border:1px solid rgb(240,240,240);padding:10px;border-radius:12px}.delivery-icon{font-size:18px;color:#ec4899;margin-right:14px;width:20px}.delivery-text{font-size:14px;font-weight:700}.store-section{border:1px solid rgb(240,240,240);padding:10px;border-radius:12px;margin-bottom:15px}.store-item{margin-bottom:11px}.store-icon{font-size:18px;color:#f97316;margin-right:14px;margin-top:2px;width:20px}.store-details{flex:1}.store-text{font-size:14px}.store-name{font-weight:700}.availability-section{margin-bottom:6px}.availability-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;color:#d97706;background-color:#fef3c7;padding:4px 8px;border-radius:12px;letter-spacing:.5px}.other-stores-text{font-size:14px;color:#6b7280;line-height:1.4}.other-stores-link{color:#6b46c1;cursor:pointer;text-decoration:underline}.other-stores-link:hover{color:#553c9a}.find-store-btn{width:100%!important;padding:8px 20px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px}.try-home-section{border-radius:12px;padding:10px;border:1px solid rgb(240,240,240)}.try-home-item{margin-bottom:10px;padding:0}.home-icon{font-size:18px;color:#6b46c1;margin-right:14px;margin-top:2px;width:20px}.try-home-details{flex:1}.try-home-text{font-size:14px;font-weight:700;color:#374151}.free-text{font-size:14px;color:#6b7280}.appointment-text{font-size:14px;color:#6b7280;line-height:1.4}.appointment-available{font-weight:500;color:#374151}.book-appointment-btn{background:#111827;color:#fff;border:none;padding:10px 20px;border-radius:12px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px;transition:all .2s ease;width:100%}.book-appointment-btn:hover{background:#000;transform:translateY(-1px);box-shadow:0 4px 8px #0000001a}@media (max-width: 480px){.container{display:flex;align-items:center;flex-direction:column}.location-section{padding:12px 0}.try-home-section{padding:20px}}.w-90{width:90%}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.w-12{width:12%!important}.w-88{width:88%!important}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;position:absolute;bottom:20px;left:10px;width:95%!important}.mini-text{font-size:13px}.lang{font-size:12px;align-content:center;background:#f6f3f9}.error-border{border:2px solid #dc3545!important}.offcanvas-small{height:72vh;top:25%;width:35%;border-radius:50px 0 0 50px}.rating{width:max-content;border:1px solid;border-radius:20px;padding:0 10px;margin-bottom:.5rem}.rating-no{padding-right:7px;margin:0;border-right:1px solid;font-size:.75rem}.p-10-20{padding:10px 30px}.price-break-header{font-size:19px;font-weight:600}.price-container{border-bottom:1px solid rgb(233,233,233)}.price-container-header{font-size:14px;font-weight:600;color:#333}.total-ratings{font-size:.75rem}.header-row .col-3{font-size:12px;font-weight:500;color:#666}.value-row .col-3{font-size:14px;font-weight:400;color:#333}.value-row .col-3.total{font-weight:600}.summary-row .col-6{font-size:15px;font-weight:500;color:#333;padding:unset}.summary-row .col-6.total{font-weight:600;padding-right:10px}.summary-row{padding:0 42px}.error-border{border:2px solid #e74c3c!important;box-shadow:0 0 5px #e74c3c4d!important}.form-control,.input-field input{transition:border-color .3s ease,box-shadow .3s ease}.error-border:focus{border-color:#e74c3c!important;box-shadow:0 0 8px #e74c3c80!important}.input-field input:focus{transform:scale(1.02)}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:-.125em;border:.125em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:.875rem;height:.875rem;border-width:.125em}@keyframes spinner-border{to{transform:rotate(360deg)}}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.rv-section{padding:2rem 0;background:transparent}.rv-header{display:flex;justify-content:space-between;align-items:flex-start;gap:3rem}.rv-header-left{flex:1}.rv-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:.75rem}.rv-average-row{display:flex;align-items:center;gap:.5rem;margin-bottom:.4rem}.rv-stars{display:flex;gap:2px}.rv-avg-num{font-size:1.4rem;font-weight:700;color:#111827}.rv-avg-label{font-size:.95rem;color:#6b7280;font-weight:400}.rv-count{font-size:.9rem;font-weight:600}.rv-bars{flex:1;max-width:420px;display:flex;flex-direction:column;gap:6px}.rv-bar-row{display:flex;align-items:center;gap:3px}.rv-bar-label{font-size:15px;font-weight:600;color:#111827;width:10px;text-align:right;flex-shrink:0}.rv-bar-track{flex:1;height:10px;background-color:#f3f4f6;border-radius:3px;overflow:hidden}.rv-bar-fill{height:100%;background-color:#eab308;border-radius:3px}.rv-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem}.rv-card{padding:12px;border:1px solid #e5e7eb;border-radius:10px;background:#fff}.rv-card-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:.85rem}.rv-reviewer{display:flex;align-items:center;gap:.7rem}.rv-avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;flex-shrink:0}.rv-name-date{display:flex;flex-direction:column;gap:2px}.rv-name{font-size:16px;font-weight:600;color:#374151}.rv-date{font-size:.75rem;color:#9ca3af}.rv-card-stars{display:flex;gap:2px;flex-shrink:0}.rv-text{font-size:.88rem;line-height:1.65;color:#4b5563;margin:0}.rv-images{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}.rv-img-link{display:block;flex-shrink:0;border-radius:8px;overflow:hidden;border:1px solid #e5e7eb}.rv-img-thumb{width:72px;height:72px;object-fit:cover;display:block;transition:transform .2s ease}.rv-img-link:hover .rv-img-thumb{transform:scale(1.05)}@media (max-width: 768px){.rv-header{flex-direction:column;gap:1.5rem}.rv-bars{max-width:100%}.rv-grid{grid-template-columns:1fr}}.review-section{padding:4rem 1rem;border-top:1px solid #f3f4f6;margin-top:4rem;background:transparent!important}.review-summary-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4rem;gap:3rem}.rating-summary-left{flex:1}.rating-summary-left h2.reviews-header-title{font-size:1.75rem;font-weight:700;margin-bottom:0;color:#111827}.average-score-container{display:flex;align-items:center;gap:.75rem;margin-bottom:.5rem}.average-score{color:#111827;display:flex;align-items:baseline;gap:8px}.average-score .score-num{font-size:1.5rem;font-weight:700}.average-score .score-text{font-size:1.1rem;font-weight:400;color:#111827}.total-reviews-count{font-weight:600;font-size:1.1rem;display:block}.rating-distribution{flex:1;max-width:480px}.rating-bar-row{display:flex;align-items:center;gap:1.25rem;margin-bottom:.85rem}.star-label{display:flex;align-items:center;justify-content:flex-start;width:35px;line-height:1}.progress-bar-bg{flex:1;height:12px;background-color:#f3f4f6;border-radius:9999px;overflow:hidden}.progress-bar-fill{height:100%;background-color:#eab308;border-radius:9999px}.review-actions-bar-minimal{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem}.write-review-btn-minimal{padding:.6rem 1.25rem;background:#f8f9fa;color:#4b5563;border:none;border-radius:8px;font-weight:500;font-size:.9rem;cursor:pointer;transition:all .2s}.write-review-btn-minimal:hover{background:#e5e7eb}.sort-dropdown-minimal select{padding:.6rem 2.25rem .6rem 1rem;border:1px solid #d1d5db;border-radius:8px;background:#fff;font-size:.9rem;color:#4b5563;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%236b7280'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right .75rem center;background-size:1rem;cursor:pointer}.reviews-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1.5rem}.review-card{padding:1.5rem;border:1px solid #e5e7eb;border-radius:12px;background:#fff;box-shadow:none}.review-divider{margin:2rem 0;border:none;border-top:1px solid #f3f4f6}.reviews-header-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:0}.review-card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1.25rem}.reviewer-info{display:flex;align-items:center;gap:1rem}.reviewer-avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#f3f4f6}.reviewer-name{font-weight:600;font-size:.95rem;color:#374151}.review-date-text{font-size:.8rem;color:#9ca3af}.reviewer-name-date{display:flex;flex-direction:row;align-items:center;gap:8px}.review-card-rating{display:flex;gap:2px}.review-card-text{font-size:1rem;line-height:1.7;color:#4b5563}.product-tabs-container{border-bottom:1px solid #f3f4f6;margin-bottom:8px}.tab-item{padding:1rem 0;font-weight:600;font-size:1.1rem;color:#6b7280;cursor:pointer;position:relative;transition:color .2s}.tab-content-pane h3{font-size:1.5rem;font-weight:700;margin-bottom:1.5rem}.tab-content-pane p{color:#4b5563;line-height:1.8;font-size:1.05rem}@media (max-width: 1024px){.reviews-grid{grid-template-columns:1fr}}@media (max-width: 768px){.review-summary-header{flex-direction:column;gap:2rem}.rating-distribution{max-width:100%}.bento-grid{height:auto;display:flex;flex-direction:column}.tabs-list{gap:1.5rem;overflow-x:auto}}.home-appointment-text{font-size:.8rem;color:#4e555e}.home-appointment-text span{font-weight:600}.video-call-img{height:120px;margin:0;padding:0;border-radius:45px}.video-call-img img{border-top-left-radius:12px;border-bottom-left-radius:12px}.discount{background:#fff3f2;padding:15px 15px 20px;margin-top:14px;border-radius:8px;display:flex;flex-direction:column;gap:5px;position:relative}.discount p{margin-bottom:0;color:#4f3267;font-weight:700;font-size:1rem}.discount .offer{color:#eb4f5c}.discount:before{content:\"\";display:block;height:44px;width:4px;background:#eb4f5c;position:absolute;left:0;top:16px;border-top-right-radius:20px;border-bottom-right-radius:20px}.metal-purity{display:flex;flex-direction:column;gap:10px}.scrollable-content{height:100%;max-height:95vh;overflow-y:auto}.style-2-img{max-height:70%;height:100%!important}.ring-size-video{background:#f0ebff;display:flex;justify-content:space-between;align-items:center;height:45px;padding:12px;border-radius:10px;margin-top:20px;margin-bottom:20px}.ring-size-video .text{color:#4f3267;font-size:.9rem}.ring-size-video .learn-how{color:#de57e9;font-weight:700;font-size:1rem;display:flex;gap:5px;align-items:center;cursor:pointer}.ring-size-video .learn-how mat-icon{font-size:20px;display:flex;align-items:center}.ring-size-video p{margin-bottom:0}.video-modal{height:90vh!important;width:90vw!important;max-width:none}.video-modal .modal-body{padding:0}.review-section{border-radius:10px;padding:15px}.review-img{display:flex;gap:10px;margin-top:10px}.review-img img{max-width:100px;max-height:140px}.detail-review-container{display:flex;max-width:1200px;margin:0 auto;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 10px #0000001a}.image-section{flex:1;background:#000;position:relative;min-height:400px}.product-image{width:100%;height:100%;object-fit:cover;background:linear-gradient(135deg,#e8e8e8,#d0d0d0);display:flex;align-items:center;justify-content:center;max-height:400px;position:relative}.product-image img{height:100%;width:100%;object-fit:contain}.earbuds-container{position:relative;width:300px;height:200px}.charging-case{width:200px;height:120px;background:linear-gradient(145deg,#f0f0f0,#e0e0e0);border-radius:25px;position:absolute;top:40px;left:50px;box-shadow:inset 0 4px 8px #0000001a}.charging-case:before{content:\"\";position:absolute;inset:10px;background:linear-gradient(145deg,#e8e8e8,#d8d8d8);border-radius:15px;box-shadow:inset 0 2px 4px #0000001a}.earbud{position:absolute;width:45px;height:15px;background:linear-gradient(145deg,#2a2a2a,#1a1a1a);border-radius:8px;box-shadow:0 2px 4px #0003}.earbud:before{content:\"noise\";position:absolute;top:2px;left:50%;transform:translate(-50%);font-size:6px;color:#888;font-weight:300}.earbud.left{top:70px;left:80px}.earbud.right{top:90px;left:130px}.earbud.right:before{color:#ff6b35}.review-section{flex:1;padding:30px;background:#fafafa}.reviewer-header{display:flex;align-items:center;margin-bottom:15px}.reviewer-avatar{width:40px;height:40px;background:#ccc;border-radius:50%;margin-right:12px;display:flex;align-items:center;justify-content:center;font-size:18px;color:#666}.reviewer-name{font-size:16px;font-weight:500;color:#333}.detail-rating{margin:10px 0}.stars{display:flex;gap:2px;margin-bottom:5px}.star{color:#ff9500;font-size:18px}.thumbs{display:flex;gap:5px}.thumb{color:#ff9500;font-size:16px}.review-date{font-size:14px;color:#666;margin:15px 0}.review-text{font-size:16px;line-height:1.5;color:#333;margin-bottom:25px}.images-section h3{font-size:16px;color:#666;margin-bottom:15px;font-weight:500}.review-images{display:flex;gap:10px}.review-image{width:60px;height:60px;background:#ddd;border-radius:6px;border:2px solid #e0e0e0;cursor:pointer;transition:border-color .3s}.review-image img{width:100%;height:100%}.review-image:hover,.review-image.selected{border-color:#007185}.navigation-arrows{position:absolute;top:20px;right:20px;display:flex;flex-direction:column;gap:10px}.arrow{width:40px;height:40px;background:#fffc;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:18px;color:#666;transition:background-color .3s;position:absolute;transform:rotate(90deg)}.backward-arrow{left:10px}.forward-arrow{right:10px}.arrow:hover{background:#fff}@media (max-width: 768px){.review-container{flex-direction:column}.image-section{min-height:300px}.review-section{padding:20px}}.review-modal{max-width:none;width:70vw}.review-modal .modal-body{padding:0}@media screen and (max-width: 475px){.offcanvas-small{height:100vh;width:100%;top:0}.review-modal{margin:0;height:100%;width:100%}.detail-review-container{flex-direction:column;height:100%}.product-image{max-height:289px}.image-section{min-height:289px}.video-modal{margin:0;height:100vh!important;width:100vw!important;overflow:hidden}}.modal{z-index:100000033}.breadcrumbs-modern{font-size:.85rem;color:#6b7280;margin-bottom:.5rem}.breadcrumb-item.active{color:#111827;font-weight:500}.product-title-modern{font-size:2rem;font-weight:800;color:#111827;margin:0;line-height:1.2;font-family:var(--website-font-family)}.product-price-modern{font-size:1.75rem;font-weight:700;color:#111827;font-family:var(--website-font-family)}.rating-line-modern{margin-top:.25rem}.rating-score-text{font-weight:700;font-size:1rem;color:#111827}.rating-count-text{font-size:.95rem;color:#10b981;font-weight:600;cursor:pointer}.product-description-brief{font-size:1rem;line-height:1.7;color:#4b5563;margin-top:1.5rem}.low-stock-text{color:#dc2626;font-weight:700;font-size:.875rem}.variants-modern-container{margin:2.5rem 0}.varient-key{font-size:.9rem;font-weight:800;color:#111827;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.75rem}.color-swatch-modern{width:36px;height:36px;border-radius:50%;cursor:pointer;border:3px solid white;box-shadow:0 0 0 1px #e5e7eb;transition:all .25s cubic-bezier(.4,0,.2,1)}.color-swatch-modern:hover{transform:scale(1.15)}.color-swatch-modern.active{box-shadow:0 0 0 2px #111827}.box-varient-modern{padding:.75rem 1.5rem;border:2px solid #f3f4f6;border-radius:10px;font-size:.95rem;font-weight:700;color:#374151;cursor:pointer;transition:all .2s;min-width:70px;text-align:center;background:#fff}.box-varient-modern:hover{border-color:#d1d5db;background:#f9fafb}.box-varient-modern.active{border-color:#111827;background:#111827;color:#fff}.quantity-container{margin-top:1rem}.quantity-selector-modern{border:1px solid #e5e7eb;border-radius:12px;width:fit-content;background:#f9fafb;padding:2px}.qty-btn{width:44px;height:44px;border:none;background:transparent;font-size:1.5rem;color:#111827;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;border-radius:10px}.qty-btn:hover:not(:disabled){background:#fff;box-shadow:0 2px 4px #0000000d}.qty-btn:disabled{color:#d1d5db;cursor:not-allowed}.qty-display{width:50px;text-align:center;font-weight:700;color:#111827;font-size:1.1rem}.out-of-stock-modern{background:#f3f4f6;color:#9ca3af;padding:1.1rem 2.5rem;border:none;border-radius:14px;font-weight:800;font-size:1.1rem;cursor:not-allowed}.wishlist-btn-modern{width:56px;height:56px;border:2px solid #f3f4f6;border-radius:14px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;background:#fff}.wishlist-btn-modern:hover{background:#fef2f2;border-color:#fecaca}.wishlist-btn-modern mat-icon{font-size:26px}.thumbnail-column{padding-right:15px!important}.thumbnail-list::-webkit-scrollbar{display:none}.thumbnail-list{-ms-overflow-style:none;scrollbar-width:none}.image-section-modern{padding-right:2.5rem!important;padding-left:0!important;width:60%!important;max-width:60%!important;flex:0 0 60%!important;margin-top:0!important}.detail-section-modern{padding-left:.5rem!important;padding-right:0!important;width:40%!important;max-width:40%!important;flex:0 0 40%!important;margin-top:0!important}.thumbnail-column{width:90px!important;flex:0 0 90px!important}.item-img{width:100%!important;max-width:100%;margin:0;border-radius:20px;overflow:hidden;background:#f9fafb;position:relative}lib-ngx-image-zoom{width:100%!important;display:block!important}::ng-deep .ngx-image-zoom-container{width:100%!important;height:auto!important;aspect-ratio:1/1}.style-1-vertical{display:flex;flex-direction:column;width:100%}.main-image-container{width:100%;aspect-ratio:1 / 1}.thumbnail-row{display:flex;gap:8px;overflow-x:auto;padding:12px 0}.thumbnail-img{min-width:80px;width:80px;height:80px;object-fit:cover;border-radius:8px;border:2px solid transparent;cursor:pointer;transition:border-color .2s}.active-thumb{border-width:2px;border-style:solid}.bento-grid{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:1fr 1fr;gap:15px;width:100%;aspect-ratio:5/4}.bento-item-large{grid-row:span 2;border-radius:24px;overflow:hidden}.bento-item-small{border-radius:20px;overflow:hidden}.bento-grid img{width:100%;height:100%;object-fit:cover;transition:transform .4s ease}.bento-grid img:hover{transform:scale(1.05)}@media (max-width: 991px){.image-section-modern,.detail-section-modern{width:100%!important;max-width:100%!important;flex:0 0 100%!important;padding:0!important}.bento-grid{grid-template-columns:1fr;grid-template-rows:auto;aspect-ratio:auto}.bento-item-large{grid-row:span 1}}.bento-masonry-container{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:1fr;gap:16px;width:100%}.bento-item-modern{border-radius:16px;overflow:hidden;background:#fdfdfd;aspect-ratio:1 / 1;transition:all .4s cubic-bezier(.4,0,.2,1)}.bento-img-modern{width:100%;height:100%;display:block;object-fit:cover;background:#fdfdfd;cursor:pointer;transition:transform .6s ease}.bento-item-modern:hover{transform:translateY(-4px);box-shadow:0 12px 30px #00000014}.bento-item-modern:hover .bento-img-modern{transform:scale(1.03)}.detail-section-modern{position:sticky;top:0;height:max-content;max-height:calc(100vh - 100px);overflow-y:auto;overflow-x:hidden;padding-left:2rem!important;scrollbar-width:none}.detail-section-modern::-webkit-scrollbar{display:none}.product-hero-card-modern{border:none;box-shadow:none;z-index:10;position:relative}.tabs-list{display:flex;justify-content:flex-start;gap:10px;list-style:none;padding:0;margin-bottom:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap}.tabs-list::-webkit-scrollbar{display:none}.tab-item{font-size:1rem;font-weight:600;color:#6b7280;padding:.5rem 1rem;border-radius:0;cursor:pointer;transition:all .25s;background:transparent;border-bottom:2px solid transparent;white-space:nowrap;flex-shrink:0}.tab-item:hover{background:transparent;color:#111827}.tab-content-pane{padding-top:.5rem}@media (max-width: 1024px){.product-hero-card-modern{padding:25px}.tab-content-pane{width:100%}}@media (max-width: 991px){.bento-masonry-container{grid-template-columns:1fr;grid-auto-rows:auto}.bento-item-modern.featured{grid-row:span 1;aspect-ratio:1 / 1}.product-hero-card-modern{position:static;padding:0;box-shadow:none;border:none;background:transparent;z-index:auto}.detail-section-modern{padding-left:0!important;margin-top:2rem;position:static!important;max-height:none!important;height:auto!important;overflow-y:visible!important;overflow-x:visible!important}.image-section-modern{padding-right:0!important}.tab-item{padding:.6rem 1rem;font-size:.95rem}.product-tabs-container{padding:0 4px}}.product-info-minimal{display:flex;flex-direction:column}.breadcrumbs-modern{display:flex;align-items:center;gap:8px;font-size:.95rem;color:#6b7280;font-weight:500}.breadcrumbs-modern .dot{font-size:1.2rem;line-height:1}.title-price-row-modern{display:flex;justify-content:space-between;align-items:flex-start;gap:20px}.product-title-modern{font-size:1.5rem;font-weight:800;color:#111827;margin:0;line-height:1.2}.product-price-modern{font-size:1.5rem;font-weight:500;color:#111827;white-space:nowrap}.rating-row-modern{display:flex;align-items:center;gap:12px;font-size:1rem;flex-wrap:wrap}.rating-score{font-weight:700;color:#111827}.separator{color:#e5e7eb}.reviews-link{font-weight:600}::ng-deep .rating-row-modern p-rating .p-rating-icon.p-rating-icon-active svg,::ng-deep .rating-row-modern p-rating .p-icon{color:#eab308!important;fill:#eab308!important}::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) svg,::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) .p-icon{color:#eab308!important;fill:#eab308!important;opacity:.25}.product-brief-modern{font-size:.95rem;line-height:1.7;color:#4b5563;margin-top:.5rem;text-align:justify}.write-review-btn{display:inline-flex;align-items:center;justify-content:center;padding:.65rem 1.75rem;background:#f8f9fa;color:#374151;border:1px solid #e5e7eb;border-radius:10px;font-size:.9rem;font-weight:600;cursor:pointer;transition:all .2s ease;letter-spacing:.02em}.write-review-btn:hover{background:#f1f3f5;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 8px #00000012}@media (max-width: 991px){.product-title-modern,.product-price-modern{font-size:1.3rem}}@media (max-width: 480px){.title-price-row-modern{flex-direction:column;gap:4px}.product-title-modern{font-size:1.2rem}.product-price-modern{font-size:1.2rem;white-space:normal}.rv-section{padding:1rem 0}.rv-header{gap:1rem}.rv-title{font-size:1.15rem;margin-bottom:.5rem}.rv-avg-num{font-size:1.15rem}.rv-bars{max-width:100%;width:100%}.rv-grid{grid-template-columns:1fr;gap:.75rem}.rv-card{padding:10px}.rv-name{font-size:14px}.tabs-list{gap:0}.tab-item{padding:.55rem 1rem;font-size:.9rem}.header-text{font-size:15px!important}.product-header{flex-wrap:wrap;gap:8px}.pricebreakup-btn{font-size:10px;padding:6px}.write-review-btn{width:100%;padding:.65rem 1rem}}.pb-glass-container{padding:16px;border-radius:16px}.pb-glass-card{background:#fff9;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.85);border-radius:12px;margin-bottom:12px;overflow:hidden}.pb-glass-header{padding:10px 16px;font-weight:700;font-size:12px;letter-spacing:1.5px;text-transform:uppercase}.pb-glass-row{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;font-size:14px;border-bottom:1px solid rgba(0,0,0,.04)}.pb-glass-row:last-child{border-bottom:none}.pb-glass-row:nth-child(2n){background:#f8fafc99}.pb-label{color:#6b7280;font-weight:500}.pb-value{font-weight:600;color:#1f2937}.pb-summary-card{background:#ffffffb3;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(203,213,225,.5);border-radius:12px;overflow:hidden}.pb-summary-row{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;font-size:14px;color:#374151;border-bottom:1px solid rgba(0,0,0,.05)}.pb-grand-total{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;font-weight:700;font-size:16px;letter-spacing:.5px}.item-code-row{margin-bottom:6px}.item-code-value{display:inline-block;padding:2px 10px;border-radius:999px;background:#f1f5f9;color:#475569;font-size:11px;font-weight:600;letter-spacing:.6px;text-transform:uppercase;border:1px solid #e2e8f0}.buy-now-btn{background:transparent!important;border:1.5px solid currentColor!important;color:inherit!important}\n"] }]
|
|
1028
|
+
], providers: [MessageService], template: "<ng-container *ngIf=\"!isLoading\">\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n <section class=\"total-container\" [id]=\"data?.id\" [simpoBackground]=\"styles?.background\" simpoHover\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\n\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\n </div> -->\n <section class=\"container\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" [spacingHorizontal]=\"stylesLayout\"\n [simpoLayout]=\"styles?.layout\" #container>\n <!-- <div class=\"display-none\"><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\"\n (click)=\"routeToHome()\">Home</a> /\n <span>{{ responseData?.name | titlecase }}</span>\n </div> -->\n <div class=\"row m-0 w-100 mt-lg-4 h-auto overflow-visible\" #aboveHeight>\n <div class=\"col-lg-6 col-sm-12 image-section-modern\" #imageSection>\n <div class=\"d-flex flex-column justify-content-start gap-1\">\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\n </div>\n </div>\n <div class=\"col-lg-6 col-sm-12 detail-section-modern \" #detailSection>\n <div class=\"product-hero-card-modern\">\n <ng-container *ngIf=\"isMobile\">\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\n\n <ng-container *ngIf=\"!isMobile\">\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!isMobile\">\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\n </ng-container>\n </div>\n\n\n <ng-container *ngIf=\"ecomConfigs?.deliveryEnabled\">\n <!-- *ngIf=\"ecomConfigs?.deliveryEnabled\" -->\n <ng-container *ngTemplateOutlet=\"DeliverySection\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"ecomConfigs?.storesEnabled\">\n <!-- *ngIf=\"ecomConfigs?.storesEnabled\" -->\n <ng-container *ngTemplateOutlet=\"StoreSection\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"ecomConfigs?.appointmentBookingEnabled\">\n <!-- *ngIf=\"ecomConfigs?.appointmentBookingEnabled\" -->\n <ng-container *ngTemplateOutlet=\"TryAtHome\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"ecomConfigs?.videoCallEnabled\">\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\n <ng-container *ngTemplateOutlet=\"videoCallSchedule\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"ecomConfigs?.brandPromiseEnabled\">\n <ng-container *ngTemplateOutlet=\"branding\"></ng-container>\n </ng-container>\n\n\n\n <!-- Moved descriptors to Details tab below -->\n\n <!-- <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\"\n [innerHTML]=\"responseData.brief\"></div> -->\n <!-- Moved tags to Details tab below -->\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\n <!-- <ng-container>\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\n </ng-container> -->\n </div>\n </div>\n <!-- Tabs Navigation -->\n <div class=\"product-tabs-container\">\n <ul class=\"tabs-list\">\n <li class=\"tab-item\" [class.active]=\"activeTab == 'Details'\"\n [style.color]=\"activeTab == 'Details' ? styles?.background?.accentColor : ''\"\n [style.borderColor]=\"activeTab == 'Details' ? styles?.background?.accentColor : 'transparent'\"\n (click)=\"changeTab('Details')\">Details</li>\n <li class=\"tab-item\" *ngIf=\"reviewsData\" [class.active]=\"activeTab == 'Reviews'\"\n [style.color]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : ''\"\n [style.borderColor]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : 'transparent'\"\n (click)=\"changeTab('Reviews')\">Reviews</li>\n <li class=\"tab-item\" *ngIf=\"materialBasedPricing\" [class.active]=\"activeTab == 'PriceBreakup'\"\n [style.color]=\"activeTab == 'PriceBreakup' ? styles?.background?.accentColor : ''\"\n [style.borderColor]=\"activeTab == 'PriceBreakup' ? styles?.background?.accentColor : 'transparent'\"\n (click)=\"changeTab('PriceBreakup')\">Price Breakup</li>\n </ul>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content-pane\">\n <div *ngIf=\"activeTab == 'Details'\">\n <!-- Integrated descriptors and tags here -->\n <div class=\"mt-2\">\n <ng-container *ngTemplateOutlet=\"descriptors\"></ng-container>\n </div>\n </div>\n\n <div *ngIf=\"activeTab == 'Reviews'\">\n <ng-container *ngTemplateOutlet=\"ReviewsSection\"></ng-container>\n </div>\n\n <div *ngIf=\"activeTab == 'PriceBreakup'\">\n <div class=\"pb-glass-container mt-2\">\n\n <!-- One card per material \u2014 generic, works for any material type -->\n <ng-container *ngFor=\"let ele of responseData?.materials\">\n <div class=\"pb-glass-card\">\n <div class=\"pb-glass-header\"\n [style.background]=\"styles?.background?.accentColor\"\n [style.color]=\"'#fff'\">\n {{ ele?.materialName | titlecase }}\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Purity</span>\n <span class=\"pb-value\">{{ ele?.purity }}</span>\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Net Weight</span>\n <span class=\"pb-value\">{{ ele?.quantity }} {{ ele?.unit | titlecase }}</span>\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Rate / {{ ele?.unit | titlecase }}</span>\n <span class=\"pb-value\">\u20B9{{ ele?.pricePerUnit | number:'1.2-2' }}</span>\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Value</span>\n <span class=\"pb-value\">\u20B9{{ (ele?.quantity * ele?.pricePerUnit) | number:'1.2-2' }}</span>\n </div>\n </div>\n </ng-container>\n\n <!-- Making Charges card -->\n <div class=\"pb-glass-card\">\n <div class=\"pb-glass-header\"\n [style.background]=\"styles?.background?.accentColor\"\n [style.color]=\"'#fff'\">\n Making Charges\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Net Weight</span>\n <span class=\"pb-value\">{{ responseData?.baseWeight }}</span>\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Making Charge %</span>\n <span class=\"pb-value\">{{ responseData?.makingChargePercentage }}%</span>\n </div>\n <div class=\"pb-glass-row\">\n <span class=\"pb-label\">Value</span>\n <span class=\"pb-value\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}</span>\n </div>\n </div>\n\n <!-- Summary card -->\n <div class=\"pb-summary-card\">\n <div class=\"pb-summary-row\">\n <span>Total Value</span>\n <span>\u20B9{{ responseData?.jewelryPriceBreakup?.priceWithoutTax | number:'1.2-2' }}</span>\n </div>\n <div class=\"pb-summary-row\">\n <span>Tax ({{ responseData?.jewelryPriceBreakup?.taxRef?.taxPercent }}% GST)</span>\n <span>\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}</span>\n </div>\n <div class=\"pb-grand-total\"\n [style.background]=\"styles?.background?.accentColor\"\n [style.color]=\"'#fff'\">\n <span>TOTAL</span>\n <span>\u20B9{{ (responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) | number:'1.2-2' }}</span>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </section>\n <ng-container *ngIf=\"recentViewItemList?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"recentViewItemList\"\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\n </ng-container>\n <!-- <ng-container *ngIf=\"recentViewItemList?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\n [isRelatedProduct]=\"true\"></simpo-featured-products>\n </ng-container> -->\n <!-- <ng-container>\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\n </ng-container> -->\n\n <ng-container *ngIf=\"styles?.devider?.display\">\n <simpo-svg-divider [dividerType]=\"styles?.devider?.deviderType\"\n [color]=\"nextComponentColor?.color\"></simpo-svg-divider>\n </ng-container>\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\n </div>\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\n </div>\n </section>\n</ng-container>\n\n\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '40vh',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n}\">\n</ngx-skeleton-loader>\n\n\n<div class=\"mobile-footer\">\n <div class=\"icons\">\n <div (click)=\"goToCart()\">\n <mat-icon>shopping_cart</mat-icon>\n </div>\n <div>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\n </div>\n </div>\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\">Out of\n Stock</button>\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\n </div>\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\"\n [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\" class=\"w-75\">\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\"\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\n </div>\n</div>\n\n<ng-template #ReviewSection>\n <div class=\"review-sec\">\n <div class=\"title\">Customer Review</div>\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\n <span>Be the first to write a review</span>\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add\n Review' : 'Cancel Review'}}</button>\n <ng-container *ngIf=\"showReview\">\n <hr />\n <div class=\"user-review\">\n <div class=\"title\">Write a review</div>\n <span class=\"secondary-text\">RATING</span>\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\n <div>\n <span class=\"secondary-text\">Review Title</span>\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\n </div>\n <div>\n <span class=\"secondary-text\">Review</span>\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\n </div>\n <div class=\"review-action-btn\">\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\n (click)=\"addProductReview()\"\n [disabled]=\"productReview == 0 && !reviewTitle?.length && !reviewDescription?.length\">Submit\n review</button>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #SocialIcons>\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\n <div style=\"position: relative;margin-right: 10px;\">\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\"\n [sectionId]=\"data?.id\"></simpo-socia-icons>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #ActionBtn>\n <div class=\"button-parent\">\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\">Out of\n Stock</button>\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\n </div>\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\"\n [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\"\n (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && IsEcommerce\" class=\"w-75\">\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\"\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\n </div>\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && IsEcommerce\" class=\"w-75 mt-2\">\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\"\n (click)=\"!edit ? buyNow() : ''\">Buy Now</button>\n </div>\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && !IsEcommerce\" class=\"w-75\">\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\" (click)=\"raiseLead()\"><mat-icon style=\"height:14px !important\">\n message</mat-icon>Notify Me</button>\n </div>\n <div class=\"favourite\" *ngIf=\"IsEcommerce\" (click)=\"isItemAsFavorite ? removeToFavourite() : addToFavourite()\">\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\"\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\n </div>\n <div class=\"share-icon\" (click)=\"shareProduct()\">\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\">share</mat-icon>\n </div>\n </div>\n</ng-template>\n\n<ng-template #variants>\n <ng-container *ngIf=\"data?.styles?.customization == 'Style1'\">\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\n <div class=\"mb-3\">\n <div class=\"varient-key\">{{varient.key}}</div>\n <div class=\"d-flex\" style=\"gap: 5px;\">\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"data?.styles?.customization == 'Style2' && selectedVarient.size > 0\">\n <ng-container>\n <div class=\"row mt-2 style2-container w-100\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div *ngFor=\"let item of selectedVarient | keyvalue\" class=\"px-3 py-2 varient-item\"\n [class]=\"getClass(selectedVarient)\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"variant-head\">{{item.key | titlecase}}</div>\n <div class=\"variant-value text-start fw-semibold\">\n {{item.value |\n titlecase}}</div>\n </div>\n <div class=\"cursor-pointer p-0\" [class]=\"getClass(selectedVarient)\">\n <div class=\"custom-text d-flex align-items-center justify-content-center h-100 p-2\" data-bs-toggle=\"offcanvas\"\n data-bs-target=\"#offcanvasRightVariant\" [style.background]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">CUSTOMISE\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #ProductDesc>\n <div class=\"product-info-minimal\">\n <!-- Item Code -->\n <div class=\"item-code-row\" *ngIf=\"responseData?.itemCode\">\n <span class=\"item-code-value\">{{ formatItemCode(responseData?.itemCode) }}</span>\n </div>\n\n <!-- Title and Price Row -->\n <div class=\"title-price-row-modern\">\n <h1 class=\"product-title-modern\">{{responseData?.name}}</h1>\n <div class=\"product-price-modern\">\n <span [innerHTML]=\"currency\"></span> {{responseData?.price?.sellingPrice}}\n </div>\n </div>\n\n <!-- Rating Row -->\n <div class=\"rating-row-modern\" *ngIf=\"responseData?.averageRating\">\n <p-rating [(ngModel)]=\"responseData.averageRating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\n <span class=\"rating-score\">{{responseData?.averageRating | number:'1.1-1'}}</span>\n <span class=\"separator\">|</span>\n <span class=\"reviews-link\" [style.color]=\"styles?.background?.accentColor\">\n {{responseData?.totalReviewCount}} reviews</span>\n </div>\n\n <!-- Brief Description -->\n <div class=\"product-brief-modern\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData?.brief | sanitizeHtml\">\n </div>\n </div>\n</ng-template>\n\n<ng-template #descriptors>\n <div class=\"row prod-desc mt-2\">\n <div>\n <!-- <div class=\"product-header d-flex align-items-center justify-content-between\">\n <span class=\"header-text\" *ngIf=\"responseData?.descriptor || responseData?.materials\">Product Details</span>\n <div class=\"pricebreakup-btn d-flex align-items-center justify-content-center cursor-pointer\"\n *ngIf=\"materialBasedPricing\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasRightPriceBreakup\"\n [style.background]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\n <mat-icon>add</mat-icon> PRICE BREAKUP\n </div>\n </div> -->\n <div class=\"description\">\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\n [innerHTML]=\"responseData?.descriptor?.name | sanitizeHtml\"\n [style.background]=\"data?.styles?.background?.color\"></div>\n </div>\n <!-- <ng-container *ngIf=\"materialBasedPricing\">\n <div class=\"jewellery-table-container\">\n <ng-container *ngFor=\"let ele of responseData?.materials\">\n <div class=\"jewel-container mt-2\">\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor(ele.materialType)\">\n {{ele?.materialName | titlecase}}\n </div>\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor(ele.materialType)\">\n <div class=\"col-6 metal-purity\">\n <div class=\"row-header\">\n Net Weight/{{ele?.unit | titlecase}}\n </div>\n <div class=\"row-content\">\n {{ele.quantity + \" \" + (ele?.unit | titlecase)}}\n </div>\n </div>\n <div class=\"col-6 metal-purity\">\n <div class=\"row-header\">\n Purity\n </div>\n <div class=\"row-content\">\n {{ele.purity |\n titlecase}}\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container> -->\n </div>\n </div>\n\n</ng-template>\n\n<ng-template #ImageSection>\n <ng-container *ngIf=\"!varientLoading && (isMobile || data?.styles?.gridStyle == 'Style1')\">\n <div class=\"style-1-vertical d-flex flex-column w-100\">\n <div class=\"main-image-container p-0\">\n <div class=\"item-img rounded-3\">\n <lib-ngx-image-zoom *ngIf=\"currentImg\" [thumbImage]=\"currentImg\" [fullImage]=\"currentImg\" [zoomMode]=\"'hover'\"\n [magnification]=\"0.4\" [enableScrollZoom]=\"false\">\n </lib-ngx-image-zoom>\n <img *ngIf=\"!currentImg\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\"\n class=\"w-100 h-100 object-fit-cover\">\n </div>\n </div>\n <div class=\"thumbnail-row py-3 d-flex gap-2 overflow-auto hide-scroll\">\n <img class=\"img thumbnail-img\" *ngFor=\"let img of itemImages\" [src]=\"img.imgUrl\" (click)=\"changeImg(img.imgUrl)\"\n [class.active-thumb]=\"currentImg == img.imgUrl\"\n style=\"cursor: pointer; min-width: 80px; width: 80px; height: 80px; object-fit: cover; border-radius: 8px; border: 2px solid transparent;\"\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!varientLoading && (!isMobile && data?.styles?.gridStyle == 'Style2')\">\n <div class=\"bento-masonry-container\">\n <div *ngFor=\"let img of itemImages; let i = index\" class=\"bento-item-modern\">\n <img [src]=\"img.imgUrl\" class=\"bento-img-modern\" (click)=\"changeImg(img.imgUrl)\">\n </div>\n </div>\n </ng-container>\n\n <div class=\"item-img\" *ngIf=\"varientLoading\">\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '100%',\n 'border-radius': '10px'\n }\">\n </ngx-skeleton-loader>\n </div>\n</ng-template>\n\n<ng-template #branding>\n <div class=\"row w-100\">\n <ng-container *ngFor=\"let brand of brandPromises\">\n <div class=\"col-4 d-flex flex-column align-items-center g-2\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n [src]=\"brand?.logoUrl\" alt=\"\" class=\"w-h-40 p-0 rounded-circle\">\n <div class=\"brand-text w-100 text-center py-2\">\n {{brand?.title | titlecase}}\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #videoCallSchedule>\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\n <ng-container>\n <div class=\"row w-100 video-container\">\n <div class=\"col-4 video-call-img\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/355007c175362077266611289-229221023_small.gif\"\n alt=\"\" class=\"w-100 h-100 \">\n </div>\n <div class=\"col-8 align-content-center\">\n <div class=\"video-head-text\">\n Live Video Call\n </div>\n <div class=\"sub-text\">\n Join a live video call with our consultants to see your favourite designs up close!\n </div>\n <button class=\"sch-btn text-center cursor-pointer\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(2)\" [buttonId]=\"getButtonId(2)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(2)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\n Schedule a Video Call\n </button>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #DeliverySection>\n <div class=\"delivery-container\">\n <h2 class=\"delivery-title\">Delivery, Stores & Trial</h2>\n\n <!-- Location Section -->\n <div class=\"location-section mb-2\">\n <div class=\"location-container d-flex align-items-center justify-content-between\"\n [style.borderColor]=\"styles?.background?.accentColor\">\n <div class=\"d-flex align-items-center flex-grow-1 me-2\" style=\"width: calc(100% - 100px);\">\n <div class=\"d-flex mx-1\"><mat-icon\n class=\"gps d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\n </div>\n <input type=\"number\" class=\"postal-code-input flex-grow-1\" placeholder=\"Enter PinCode\" [(ngModel)]=\"pincode\"\n style=\"width: 100%;\">\n </div>\n <button class=\"btn locate-btn\" (click)=\"getStoreDetails()\">Submit</button>\n </div>\n <div *ngIf=\"!isPinCode\" style=\"color: red;\">Pin code must be 6 digits.</div>\n </div>\n\n <ng-container *ngIf=\"(pincode?.toString().length ?? 0) == 6\">\n <!-- Free Delivery Section -->\n <div class=\"delivery-section\">\n <div class=\"d-flex align-items-center\">\n <span class=\"delivery-icon d-flex align-items-center\">\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" class=\"feather feather-gift\">\n <polyline points=\"20 12 20 22 4 22 4 12\"></polyline>\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"5\"></rect>\n <line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"7\"></line>\n <path d=\"M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z\"></path>\n <path d=\"M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z\"></path>\n </svg>\n </span>\n\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges == 0\">Expected\n Delivery by {{ getDateAfterxDays() | date:'d MMM' }}</span>\n\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges > 0\">Your\n expected Order will\n Deliver by {{ getDateAfterxDays() | date:'d MMM' }} with a Delivery Charge of\n \u20B9 {{ecomConfigs?.deliveryCharges | number:'1.2-2'}}</span>\n </div>\n </div>\n\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #TryAtHome>\n <!-- Try At Home Section -->\n <div class=\"try-home-section\">\n <div class=\"d-flex align-items-start try-home-item\">\n <span class=\"home-icon d-flex align-items-center\">\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" class=\"feather feather-home\">\n <path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"></path>\n <polyline points=\"9 22 9 12 15 12 15 22\"></polyline>\n </svg>\n </span>\n <div class=\"try-home-details\">\n <div class=\"try-home-header\">\n <span class=\"try-home-text\">Try At Home</span>\n <span class=\"free-text\"> (It's Free)</span>\n </div>\n <div class=\"home-appointment-text\">Home Appointment <span>Available to try from 29 Jul</span></div>\n <!-- <div class=\"appointment-text\">\n Home Appointment <span class=\"appointment-available\">Available to try from 28 Jun</span>\n </div> -->\n </div>\n </div>\n <div class=\"d-flex-align-items-center justify-content-center w-100\">\n <button class=\"book-appointment-btn\" (click)=\"addToTrialCart()\" *ngIf=\"!isItemAddedAsTrial\">Try at\n HOME</button>\n <button class=\"book-appointment-btn\" *ngIf=\"isItemAddedAsTrial\">HOME APPOINTMENT BOOKED</button>\n </div>\n </div>\n\n</ng-template>\n\n<ng-template #StoreSection>\n <!-- Nearest Store Section -->\n <ng-container\n *ngIf=\"storeDetails?.nearbyStore?.storeName && storeDetails?.nearbyStore?.storeName?.length > 0\">\n <div class=\"store-section\">\n <div class=\"d-flex align-items-center store-item\">\n <span class=\"store-icon d-flex align-items-center\">\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\n </svg>\n </span>\n <div class=\"store-details\">\n <div class=\"store-text\">\n <span class=\"store-label\">Nearest Store - </span>\n <span class=\"store-name\">{{ storeDetails?.nearbyStore?.storeName | titlecase}}</span>\n <!-- <span class=\"store-distance\"> (4km)</span> -->\n </div>\n <!-- <div class=\"availability-section\">\n <span class=\"availability-badge\">\u23F0 AVAILABLE BY 28 JUN</span>\n </div> -->\n <!-- <div class=\"other-stores-text\">\n Also Available in <span class=\"other-stores-link\">18 other stores</span>\n </div> -->\n </div>\n </div>\n <div class=\"d-flex justify-content-center w-100\">\n <button class=\"find-store-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(1)\" (click)=\"onFindInStore(storeDetails?.nearbyStore?.id)\">FIND IN\n STORE</button>\n </div>\n </div>\n </ng-container>\n <ng-template #emptyStore>\n <div class=\"delivery-section\">\n <div class=\"d-flex align-items-center\">\n <span class=\"delivery-icon d-flex align-items-center\">\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\n </svg>\n </span>\n <span class=\"delivery-text\">No Stores are available</span>\n </div>\n </div>\n </ng-template>\n</ng-template>\n\n<div class=\"offcanvas offcanvas-end offcanvas-variant\" tabindex=\"-1\" id=\"offcanvasRightVariant\"\n aria-labelledby=\"offcanvasRightLabel\">\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\n <mat-icon data-bs-dismiss=\"offcanvas\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\n </div>\n <div class=\"varient-price px-3 pb-2\">\n <div class=\"price-text\">Price</div>\n <div class=\"d-flex g-3 align-items-center\">\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\n [innerHTML]='currency'></span>\n {{responseData?.price?.discountedPrice}}</div>\n <div class=\"price\"\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\"\n [ngClass]=\"{'text-decoration-line-through': responseData?.price?.discountedPrice}\"><span\n [innerHTML]='currency'></span>\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}</div>\n </div>\n </div>\n <div class=\"varient-container h-100 p-3\">\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\n <div class=\"varient-data\">\n <div class=\"varient-key\">{{varient.key}}</div>\n <div class=\"d-flex\" style=\"gap: 5px;\">\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"confirm-btn w-100 p-3 text-center cursor-pointer\" data-bs-dismiss=\"offcanvas\"\n [style.background]=\"data?.styles?.background?.accentColor\" style=\"color: white;\">Confirm\n Customization</div>\n</div>\n\n<ng-template #dialogBox>\n <div class=\"modal-content\">\n <div class=\"modal-header d-flex align-item-center\">\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\n <div class=\"schedule-header d-flex align-items-center justify-content-end p-2\">\n <mat-icon (click)=\"matCloseDialog()\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\n </div>\n </div>\n <div class=\"modal-body h-100\">\n <div class=\"row h-100 w-100 video-call-container\">\n <div class=\"col-6 h-100\" *ngIf=\"!isMobile\">\n <img\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/557699c1753779503913freepik-overhead-shot-a-person-holding-a-smartphone-with-a-1029_vmg8GqHj (online-video-cutter.com).gif\"\n alt=\"\" class=\"w-100 h-100\" style=\"object-fit: cover;\">\n </div>\n <div class=\"col-6 position-relative h-100 call-details\">\n <!-- Name Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\n (input)=\"onInputChange('username')\">\n </div>\n\n <!-- <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\n (input)=\"onInputChange('email')\">\n </div> -->\n\n <!-- Mobile Number Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\n <div class=\"sub-text-call\">IN +91</div>\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\n (input)=\"onInputChange('mobileNumber')\" (wheel)=\"$event.preventDefault()\">\n </div>\n\n\n <!-- Pincode Input with Validation -->\n <!-- <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-0\">\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\n </div>\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\n (input)=\"onInputChange('pincode')\">\n </div> -->\n <div class=\"language my-3\">\n <div class=\"mini-text mb-2\">Language Preference</div>\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\n <ng-container *ngFor=\"let lang of languages\">\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectedLang = lang\"\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\n {{lang}}\n </div>\n </ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"selectedLang == 'Others'\">\n <div class=\"input-field my-3\">\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\n </div>\n </ng-container>\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" [disabled]=\"isSubmitting\" [style.background]=\"data?.styles?.background?.accentColor\" [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\n <ng-container *ngIf=\"isSubmitting\">\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n SCHEDULING...\n </ng-container>\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\n <div (click)=\"scheduleVideoCall()\" class=\"d-flex align-items-center\">\n <mat-icon>video_call</mat-icon> \n SCHEDULE A VIDEO CALL\n </div>\n </ng-container>\n <ng-container *ngIf=\"scheduled\">\n <mat-icon>check_circle</mat-icon> \n SCHEDULED SUCCESSFULLY\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<div class=\"offcanvas offcanvas-end offcanvas-small overflow-scroll\" tabindex=\"-1\" id=\"offcanvasRightPriceBreakup\">\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\n <mat-icon data-bs-dismiss=\"offcanvas\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\n </div>\n <div class=\"varient-price p-10-20\">\n <div class=\"price-break-header\">{{responseData?.name}}</div>\n </div>\n <div class=\"price-breakup h-100 w-100\">\n <ng-container *ngFor=\"let ele of responseData?.materials\">\n <div class=\"price-container mb-3 p-10-20\">\n <div class=\"price-container-header\">\n {{ ele.materialType + \" BREAKUP\" }}\n </div>\n <div class=\"row w-100 header-row\">\n <div class=\"col-3 text-center\">COMPONENT</div>\n <div class=\"col-3 text-center\">RATE</div>\n <div class=\"col-3 text-center\">WEIGHT</div>\n <div class=\"col-3 text-center\">FINAL VALUE</div>\n </div>\n <div class=\"row w-100 value-row\">\n <div class=\"col-3 text-center\">{{ ele.purity | titlecase }}</div>\n <div class=\"col-3 text-center\">\u20B9{{ getPricePerGram(ele.pricePerUnit,ele.materialType) |\n number:'1.2-2' }}</div>\n <div class=\"col-3 text-center\">{{ele.quantity + ' ' + (ele.unit | titlecase)}}</div>\n <div class=\"col-3 text-center total\">\u20B9{{ ele.pricePerUnit * ele.quantity | number }}</div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"price-container mb-3 p-10-30 py-0 border-unset\">\n <div class=\"row w-100 summary-row\">\n <div class=\"col-6 text-start\">Making Charges</div>\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}\n </div>\n </div>\n <div class=\"row w-100 summary-row\">\n <div class=\"col-6 text-start\">Tax Amount</div>\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}\n </div>\n </div>\n <div class=\"row w-100 summary-row\">\n <div class=\"col-6 text-start\">Total Amount</div>\n <div class=\"col-6 text-end total\">\n \u20B9{{(responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) |\n number:'1.2-2'}}\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #ReviewsSection>\n <div class=\"rv-section\" *ngIf=\"reviewsData\">\n\n <!-- Header: Title + Average | Bar Chart -->\n <div class=\"rv-header\">\n <div class=\"rv-header-left\">\n <h2 class=\"rv-title\">Reviews & Ratings</h2>\n <div class=\"rv-average-row\">\n <!-- filled stars -->\n <div class=\"rv-stars\">\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\n fill=\"#eab308\" />\n </svg>\n </ng-container>\n </div>\n <span class=\"rv-avg-num\">{{responseData?.averageRating | number:'1.1-1'}}</span>\n <span class=\"rv-avg-label\">average</span>\n </div>\n <div class=\"rv-count\" [style.color]=\"styles?.background?.accentColor || '#10b981'\">\n {{responseData?.totalReviewCount | number}} Reviews\n </div>\n </div>\n\n <div class=\"rv-bars\">\n <ng-container *ngFor=\"let rating of [5,4,3,2,1]\">\n <div class=\"rv-bar-row\">\n <span class=\"rv-bar-label\">{{rating}}</span>\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\n fill=\"#eab308\" />\n </svg>\n <div class=\"rv-bar-track\">\n <div class=\"rv-bar-fill\" [style.width.%]=\"getPercentage(rating)\"></div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Review Cards Grid -->\n <div class=\"rv-grid\">\n <ng-container *ngFor=\"let review of reviewsData\">\n <ng-container *ngIf=\"review.review\">\n <div class=\"rv-card\">\n <div class=\"rv-card-top\">\n <div class=\"rv-reviewer\">\n <img [src]=\"'https://ui-avatars.com/api/?name=' + (review?.userName ?? 'U') + '&background=random'\"\n class=\"rv-avatar\" alt=\"\">\n <div class=\"rv-name-date\">\n <span class=\"rv-name\">{{review?.userName ?? 'Anonymous'}}</span>\n <span class=\"rv-date\">{{review?.createdAt | date:'d MMM y'}}</span>\n </div>\n </div>\n <!-- Star rating -->\n <div class=\"rv-card-stars\">\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\n <svg *ngIf=\"s <= review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\n fill=\"#eab308\" />\n </svg>\n <svg *ngIf=\"s > review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" style=\"opacity:0.25\">\n <path\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\n fill=\"#eab308\" />\n </svg>\n </ng-container>\n </div>\n </div>\n <p class=\"rv-text\">{{review?.review ?? 'No comment provided.'}}</p>\n\n <!-- Review Images -->\n <div class=\"rv-images\" *ngIf=\"review?.reviewImages?.length\">\n <a *ngFor=\"let img of review.reviewImages\" [href]=\"img.imgUrl\" target=\"_blank\" class=\"rv-img-link\">\n <img [src]=\"img.imgUrl\" alt=\"Review image\" class=\"rv-img-thumb\" onerror=\"this.style.display='none'\">\n </a>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n\n <div class=\"text-center mt-4\" *ngIf=\"(reviewsData?.length ?? 0) > 3\">\n <button class=\"write-review-btn\" (click)=\"loadMoreReviews()\">Load More Reviews</button>\n </div>\n </div>\n</ng-template>\n\n<div class=\"modal fade\" id=\"exampleModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" role=\"dialog\"\n aria-hidden=\"true\">\n <div class=\"modal-dialog modal-dialog-centered video-modal\">\n <div class=\"modal-content\">\n <div class=\"modal-body\" style=\"height: 100%;\">\n <video controls muted playsinline style=\"width: 100%; height: 100%;\">\n <source\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/371647c1753962084265clideo_editor_48bc93c24e18470888c661bb09e437da (online-video-cutter.com).mp4\"\n type=\"video/mp4\">\n Your browser does not support the video tag.\n </video>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"modal fade\" id=\"reviewModal\" tabindex=\"-1\" aria-labelledby=\"reviewModalLabel\" role=\"dialog\"\n aria-hidden=\"true\">\n <div class=\"modal-dialog review-modal\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h1 class=\"modal-title fs-5\"></h1>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"detail-review-container\">\n <div class=\"image-section\">\n <div class=\"product-image\">\n <div class=\"backward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex-1\"\n *ngIf=\"currentImageIndex > 0\">\u25BC</div>\n <img [src]=\"selectedReview?.reviewImages?.[currentImageIndex]?.imgUrl\" alt=\"\">\n <div class=\"forward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex+1\"\n *ngIf=\"currentImageIndex < selectedReview?.images?.length - 1\">\u25B2</div>\n <!-- <div class=\"earbuds-container\">\n <div class=\"charging-case\"></div>\n <div class=\"earbud left\"></div>\n <div class=\"earbud right\"></div>\n </div> -->\n </div>\n <!-- <div class=\"navigation-arrows\">\n </div> -->\n </div>\n\n <div class=\"review-section\">\n <div class=\"reviewer-header\">\n <div class=\"reviewer-avatar\">\uD83D\uDC64</div>\n <div class=\"reviewer-name\">{{selectedReview?.userName ?? \"-\"}}</div>\n </div>\n\n <div class=\"detail-rating\" *ngIf=\"selectedReview?.rating\">\n <p-rating [(ngModel)]=\"selectedReview.rating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\n </div>\n\n <div class=\"review-date\">\n Reviewed in India on 24 July 2025\n </div>\n\n <div class=\"review-text\">\n {{selectedReview?.review ?? \"-\"}}\n </div>\n\n <div class=\"images-section\">\n <h3>Images in this review</h3>\n <div class=\"review-images\">\n <div class=\"review-image\" [ngClass]=\"{'selected': currentImageIndex == i}\"\n *ngFor=\"let img of selectedReview?.reviewImages ?? [];let i = index\" (click)=\"currentImageIndex = i\">\n <img [src]=\"img.imgUrl\" alt=\"\">\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n</div>", styles: [".product-desc{display:flex}::ng-deep .product-desc table,::ng-deep .brief-desc table{border-collapse:collapse;width:100%;margin:10px 0}::ng-deep .product-desc table td,::ng-deep .product-desc table th,::ng-deep .brief-desc table td,::ng-deep .brief-desc table th{border:1px solid #dddddd!important;text-align:left;padding:8px}*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}::ng-deep .smooth-panel .p-panel-header{cursor:pointer;background:transparent;border:unset;font-size:18px;font-weight:700;padding:0}::ng-deep .smooth-panel .p-panel-content{border:unset;padding:0}.jewel-container{border-radius:12px;box-shadow:#63636333 0 2px 8px}.jewel-header{padding:8px 10px;border-radius:12px 12px 0 0;font-size:15px;font-weight:700;color:#4f3267}.br-p{border-radius:0 0 12px 12px;padding:10px 0}.row-header{font-size:13px;font-weight:700;color:#4f3267}.row-content{color:#4e555e}.jewellery-table-container{border-radius:12px}.jewellery-table{width:100%;border-collapse:collapse;border:1px solid #ddd;transition:all .3s ease}.jewellery-table th,.jewellery-table td{border:1px solid #ddd;padding:12px;text-align:left;transition:background-color .2s ease}.material-header td{background-color:#f8f9fa;font-weight:700;font-size:16px}.column-header{background-color:#f1f1f1}.column-header th{font-weight:600}.material-row:hover{background-color:#f5f5f5}.charges-header th,.total-header th,.total-header td{background-color:#eaeaea;font-weight:700}.total-row td{font-weight:700;font-size:18px;background-color:#f8f8f8}@media screen and (max-width: 600px){.jewellery-table{font-size:14px}.jewellery-table th,.jewellery-table td{padding:8px}}.share-icon,.favourite{border-radius:50%!important;height:30px;width:30px;padding:6px;display:flex;align-items:center;justify-content:center;background-color:#f1f5f9!important;cursor:pointer;transition:all .2s ease;border:none!important}:is(.share-icon,.favourite) mat-icon{font-size:20px;width:20px;height:20px;display:flex;align-items:center;justify-content:center}.share-icon:hover,.favourite:hover{background-color:#e2e8f0!important;transform:scale(1.05)}.header-text{font-size:17px;font-weight:bolder}.pricebreakup-btn{font-size:11px;font-weight:700;padding:8px;border-radius:8px;letter-spacing:.5px}.pricebreakup-btn mat-icon{font-size:18px;display:flex;align-items:center}.img-list{display:flex;gap:5px;max-height:460px}.img-list img{height:100px;width:100px;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:100%;aspect-ratio:1/1;overflow:hidden}.item-img img{width:100%!important;height:100%!important;object-fit:cover}.price{font-weight:600;font-size:24px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:1px solid;align-items:center;gap:15px;height:44px;width:75%;justify-content:space-between;border-radius:12px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.fc{font-size:17px;font-weight:700}.tab-group{display:flex;gap:10px}.tab{font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black;max-width:max-content}.discount-price{font-size:1.4rem}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#f7f7f7;padding:11px 20px;border-radius:12px;margin-top:unset!important;width:70%!important;border:1px solid #d3d3d347}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#f7f7f7;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:7px 25px;cursor:pointer;font-weight:600}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:5px;height:44px!important;justify-content:space-between;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:14px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.w-h-40{width:40px!important;height:40px!important}.height{height:auto;overflow-y:visible}.mobile-footer{display:none}video{border-radius:18px}@media (min-width: 1024px){.zoom:hover{transform:scale(1.04);transition:transform .2s ease-in-out;overflow:hidden}.product-heading{font-size:20px;font-weight:600;margin-top:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.product-desc{font-size:13px}.brief-desc{font-size:16px;margin-top:unset!important}.total-container{padding-top:10px!important;padding-bottom:4rem!important}.out-of-stock,.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important;height:348px}.item-img img{width:100%;height:348px!important}.display-none{display:none}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{width:25%;border:2px solid lightgray;cursor:pointer}.input-field{margin-top:.7rem!important;margin-bottom:.7rem!important}.prod-desc{margin-top:20px}.video-call-container{margin:0!important}.product-img{height:220px}.call-details{width:100%!important;padding:3%!important}.send-btn{padding:.5rem 1rem!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%;height:auto}.product-heading{font-size:23px;font-weight:600}.discount-price{font-size:1.7rem!important}.header-text{font-size:20px!important}}.send-btn{font-size:14px!important;padding:1rem;display:flex;align-items:center;justify-content:center;text-transform:uppercase;font-weight:600}.send-btn mat-icon{height:20px;width:20px;font-size:18px}a{text-decoration:none}.brief-desc{font-size:14px;color:#4e555e}.total-container{height:auto;position:relative;display:block!important;overflow:visible}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%;margin:unset!important}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}}@media (min-width:1024px){.product-headig{font-size:35px}}.mat-accordion .mat-expansion-panel:last-of-type{box-shadow:none}@media (min-width: 1400px){.container{max-width:unset;width:95%;height:100vh;overflow-y:auto}}.width-max{width:max-content}.fw-600{font-weight:600}.cursor-pointer{cursor:pointer}.offcanvas-variant{border-radius:30px 0 0 30px}.varient-header,.varient-price{background:#f7f7f7}.varient-header{border-radius:30px 0 0}.confirm-btn{border-radius:0 0 0 30px;position:absolute!important;bottom:0!important}.style2-container{border:1px solid;border-radius:12px;margin:0}.varient-item{border-right:1px solid;align-content:center}.variant-head{font-size:12px;color:#33363e}.varient-data{margin-bottom:25px;border-bottom:1px solid black;padding-bottom:25px}.variant-value{font-size:.9rem;color:#000}.custom-text{border-radius:0 8px 8px 0;font-size:.9rem;font-weight:600}.scroll-wrap{flex-wrap:nowrap}.brand-text{word-wrap:break-word;white-space:normal;font-size:12px;font-weight:600;line-height:20px}.video-container{border:1px solid rgb(240,240,240);margin:10px 0;border-radius:12px}.video-head-text{font-size:16px;font-weight:700}.sub-text{font-size:11px;color:#6f7377;margin-bottom:10px}.sch-btn{font-size:1.2rem!important;color:#fff;padding:3px 0;margin-top:5px}.tax-text{font-size:.7rem;color:#6f7377}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.delivery-container{margin:35px 0 15px;background-color:transparent}.delivery-title{font-size:16px;font-weight:600;margin:0 0 12px;line-height:1.2;margin-bottom:.5rem!important}.location-container{border:1px solid #cfcfcf;border-radius:12px;padding:10px;margin-bottom:5px;width:100%}.location-icon{width:20px;height:20px;background-color:#374151;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.location-icon:before{content:\"\";width:8px;height:8px;background-color:#fff;border-radius:50%;position:absolute}.postal-code-input{font-size:12px;font-weight:600;letter-spacing:.5px;border:none;outline:none;background:transparent;width:90%}.postal-code-input::placeholder{font-weight:500}.locate-btn{background:none!important;border:none!important;font-weight:600;color:#111827;font-size:13px!important;padding:0!important;box-shadow:none!important;width:auto!important;white-space:nowrap}.gps{font-size:17px}.locate-btn:focus{box-shadow:none!important}.delivery-section{margin-bottom:15px;border:1px solid rgb(240,240,240);padding:10px;border-radius:12px}.delivery-icon{font-size:18px;color:#ec4899;margin-right:14px;width:20px}.delivery-text{font-size:14px;font-weight:700}.store-section{border:1px solid rgb(240,240,240);padding:10px;border-radius:12px;margin-bottom:15px}.store-item{margin-bottom:11px}.store-icon{font-size:18px;color:#f97316;margin-right:14px;margin-top:2px;width:20px}.store-details{flex:1}.store-text{font-size:14px}.store-name{font-weight:700}.availability-section{margin-bottom:6px}.availability-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;color:#d97706;background-color:#fef3c7;padding:4px 8px;border-radius:12px;letter-spacing:.5px}.other-stores-text{font-size:14px;color:#6b7280;line-height:1.4}.other-stores-link{color:#6b46c1;cursor:pointer;text-decoration:underline}.other-stores-link:hover{color:#553c9a}.find-store-btn{width:100%!important;padding:8px 20px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px}.try-home-section{border-radius:12px;padding:10px;border:1px solid rgb(240,240,240)}.try-home-item{margin-bottom:10px;padding:0}.home-icon{font-size:18px;color:#6b46c1;margin-right:14px;margin-top:2px;width:20px}.try-home-details{flex:1}.try-home-text{font-size:14px;font-weight:700;color:#374151}.free-text{font-size:14px;color:#6b7280}.appointment-text{font-size:14px;color:#6b7280;line-height:1.4}.appointment-available{font-weight:500;color:#374151}.book-appointment-btn{background:#111827;color:#fff;border:none;padding:10px 20px;border-radius:12px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px;transition:all .2s ease;width:100%}.book-appointment-btn:hover{background:#000;transform:translateY(-1px);box-shadow:0 4px 8px #0000001a}@media (max-width: 480px){.container{display:flex;align-items:center;flex-direction:column}.location-section{padding:12px 0}.try-home-section{padding:20px}}.w-90{width:90%}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.w-12{width:12%!important}.w-88{width:88%!important}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;position:absolute;bottom:20px;left:10px;width:95%!important}.mini-text{font-size:13px}.lang{font-size:12px;align-content:center;background:#f6f3f9}.error-border{border:2px solid #dc3545!important}.offcanvas-small{height:72vh;top:25%;width:35%;border-radius:50px 0 0 50px}.rating{width:max-content;border:1px solid;border-radius:20px;padding:0 10px;margin-bottom:.5rem}.rating-no{padding-right:7px;margin:0;border-right:1px solid;font-size:.75rem}.p-10-20{padding:10px 30px}.price-break-header{font-size:19px;font-weight:600}.price-container{border-bottom:1px solid rgb(233,233,233)}.price-container-header{font-size:14px;font-weight:600;color:#333}.total-ratings{font-size:.75rem}.header-row .col-3{font-size:12px;font-weight:500;color:#666}.value-row .col-3{font-size:14px;font-weight:400;color:#333}.value-row .col-3.total{font-weight:600}.summary-row .col-6{font-size:15px;font-weight:500;color:#333;padding:unset}.summary-row .col-6.total{font-weight:600;padding-right:10px}.summary-row{padding:0 42px}.error-border{border:2px solid #e74c3c!important;box-shadow:0 0 5px #e74c3c4d!important}.form-control,.input-field input{transition:border-color .3s ease,box-shadow .3s ease}.error-border:focus{border-color:#e74c3c!important;box-shadow:0 0 8px #e74c3c80!important}.input-field input:focus{transform:scale(1.02)}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:-.125em;border:.125em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:.875rem;height:.875rem;border-width:.125em}@keyframes spinner-border{to{transform:rotate(360deg)}}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.rv-section{padding:2rem 0;background:transparent}.rv-header{display:flex;justify-content:space-between;align-items:flex-start;gap:3rem}.rv-header-left{flex:1}.rv-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:.75rem}.rv-average-row{display:flex;align-items:center;gap:.5rem;margin-bottom:.4rem}.rv-stars{display:flex;gap:2px}.rv-avg-num{font-size:1.4rem;font-weight:700;color:#111827}.rv-avg-label{font-size:.95rem;color:#6b7280;font-weight:400}.rv-count{font-size:.9rem;font-weight:600}.rv-bars{flex:1;max-width:420px;display:flex;flex-direction:column;gap:6px}.rv-bar-row{display:flex;align-items:center;gap:3px}.rv-bar-label{font-size:15px;font-weight:600;color:#111827;width:10px;text-align:right;flex-shrink:0}.rv-bar-track{flex:1;height:10px;background-color:#f3f4f6;border-radius:3px;overflow:hidden}.rv-bar-fill{height:100%;background-color:#eab308;border-radius:3px}.rv-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem}.rv-card{padding:12px;border:1px solid #e5e7eb;border-radius:10px;background:#fff}.rv-card-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:.85rem}.rv-reviewer{display:flex;align-items:center;gap:.7rem}.rv-avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;flex-shrink:0}.rv-name-date{display:flex;flex-direction:column;gap:2px}.rv-name{font-size:16px;font-weight:600;color:#374151}.rv-date{font-size:.75rem;color:#9ca3af}.rv-card-stars{display:flex;gap:2px;flex-shrink:0}.rv-text{font-size:.88rem;line-height:1.65;color:#4b5563;margin:0}.rv-images{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}.rv-img-link{display:block;flex-shrink:0;border-radius:8px;overflow:hidden;border:1px solid #e5e7eb}.rv-img-thumb{width:72px;height:72px;object-fit:cover;display:block;transition:transform .2s ease}.rv-img-link:hover .rv-img-thumb{transform:scale(1.05)}@media (max-width: 768px){.rv-header{flex-direction:column;gap:1.5rem}.rv-bars{max-width:100%}.rv-grid{grid-template-columns:1fr}}.review-section{padding:4rem 1rem;border-top:1px solid #f3f4f6;margin-top:4rem;background:transparent!important}.review-summary-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4rem;gap:3rem}.rating-summary-left{flex:1}.rating-summary-left h2.reviews-header-title{font-size:1.75rem;font-weight:700;margin-bottom:0;color:#111827}.average-score-container{display:flex;align-items:center;gap:.75rem;margin-bottom:.5rem}.average-score{color:#111827;display:flex;align-items:baseline;gap:8px}.average-score .score-num{font-size:1.5rem;font-weight:700}.average-score .score-text{font-size:1.1rem;font-weight:400;color:#111827}.total-reviews-count{font-weight:600;font-size:1.1rem;display:block}.rating-distribution{flex:1;max-width:480px}.rating-bar-row{display:flex;align-items:center;gap:1.25rem;margin-bottom:.85rem}.star-label{display:flex;align-items:center;justify-content:flex-start;width:35px;line-height:1}.progress-bar-bg{flex:1;height:12px;background-color:#f3f4f6;border-radius:9999px;overflow:hidden}.progress-bar-fill{height:100%;background-color:#eab308;border-radius:9999px}.review-actions-bar-minimal{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem}.write-review-btn-minimal{padding:.6rem 1.25rem;background:#f8f9fa;color:#4b5563;border:none;border-radius:8px;font-weight:500;font-size:.9rem;cursor:pointer;transition:all .2s}.write-review-btn-minimal:hover{background:#e5e7eb}.sort-dropdown-minimal select{padding:.6rem 2.25rem .6rem 1rem;border:1px solid #d1d5db;border-radius:8px;background:#fff;font-size:.9rem;color:#4b5563;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%236b7280'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right .75rem center;background-size:1rem;cursor:pointer}.reviews-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1.5rem}.review-card{padding:1.5rem;border:1px solid #e5e7eb;border-radius:12px;background:#fff;box-shadow:none}.review-divider{margin:2rem 0;border:none;border-top:1px solid #f3f4f6}.reviews-header-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:0}.review-card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1.25rem}.reviewer-info{display:flex;align-items:center;gap:1rem}.reviewer-avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#f3f4f6}.reviewer-name{font-weight:600;font-size:.95rem;color:#374151}.review-date-text{font-size:.8rem;color:#9ca3af}.reviewer-name-date{display:flex;flex-direction:row;align-items:center;gap:8px}.review-card-rating{display:flex;gap:2px}.review-card-text{font-size:1rem;line-height:1.7;color:#4b5563}.product-tabs-container{border-bottom:1px solid #f3f4f6;margin-bottom:8px}.tab-item{padding:1rem 0;font-weight:600;font-size:1.1rem;color:#6b7280;cursor:pointer;position:relative;transition:color .2s}.tab-content-pane h3{font-size:1.5rem;font-weight:700;margin-bottom:1.5rem}.tab-content-pane p{color:#4b5563;line-height:1.8;font-size:1.05rem}@media (max-width: 1024px){.reviews-grid{grid-template-columns:1fr}}@media (max-width: 768px){.review-summary-header{flex-direction:column;gap:2rem}.rating-distribution{max-width:100%}.bento-grid{height:auto;display:flex;flex-direction:column}.tabs-list{gap:1.5rem;overflow-x:auto}}.home-appointment-text{font-size:.8rem;color:#4e555e}.home-appointment-text span{font-weight:600}.video-call-img{height:120px;margin:0;padding:0;border-radius:45px}.video-call-img img{border-top-left-radius:12px;border-bottom-left-radius:12px}.discount{background:#fff3f2;padding:15px 15px 20px;margin-top:14px;border-radius:8px;display:flex;flex-direction:column;gap:5px;position:relative}.discount p{margin-bottom:0;color:#4f3267;font-weight:700;font-size:1rem}.discount .offer{color:#eb4f5c}.discount:before{content:\"\";display:block;height:44px;width:4px;background:#eb4f5c;position:absolute;left:0;top:16px;border-top-right-radius:20px;border-bottom-right-radius:20px}.metal-purity{display:flex;flex-direction:column;gap:10px}.scrollable-content{height:100%;max-height:95vh;overflow-y:auto}.style-2-img{max-height:70%;height:100%!important}.ring-size-video{background:#f0ebff;display:flex;justify-content:space-between;align-items:center;height:45px;padding:12px;border-radius:10px;margin-top:20px;margin-bottom:20px}.ring-size-video .text{color:#4f3267;font-size:.9rem}.ring-size-video .learn-how{color:#de57e9;font-weight:700;font-size:1rem;display:flex;gap:5px;align-items:center;cursor:pointer}.ring-size-video .learn-how mat-icon{font-size:20px;display:flex;align-items:center}.ring-size-video p{margin-bottom:0}.video-modal{height:90vh!important;width:90vw!important;max-width:none}.video-modal .modal-body{padding:0}.review-section{border-radius:10px;padding:15px}.review-img{display:flex;gap:10px;margin-top:10px}.review-img img{max-width:100px;max-height:140px}.detail-review-container{display:flex;max-width:1200px;margin:0 auto;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 10px #0000001a}.image-section{flex:1;background:#000;position:relative;min-height:400px}.product-image{width:100%;height:100%;object-fit:cover;background:linear-gradient(135deg,#e8e8e8,#d0d0d0);display:flex;align-items:center;justify-content:center;max-height:400px;position:relative}.product-image img{height:100%;width:100%;object-fit:contain}.earbuds-container{position:relative;width:300px;height:200px}.charging-case{width:200px;height:120px;background:linear-gradient(145deg,#f0f0f0,#e0e0e0);border-radius:25px;position:absolute;top:40px;left:50px;box-shadow:inset 0 4px 8px #0000001a}.charging-case:before{content:\"\";position:absolute;inset:10px;background:linear-gradient(145deg,#e8e8e8,#d8d8d8);border-radius:15px;box-shadow:inset 0 2px 4px #0000001a}.earbud{position:absolute;width:45px;height:15px;background:linear-gradient(145deg,#2a2a2a,#1a1a1a);border-radius:8px;box-shadow:0 2px 4px #0003}.earbud:before{content:\"noise\";position:absolute;top:2px;left:50%;transform:translate(-50%);font-size:6px;color:#888;font-weight:300}.earbud.left{top:70px;left:80px}.earbud.right{top:90px;left:130px}.earbud.right:before{color:#ff6b35}.review-section{flex:1;padding:30px;background:#fafafa}.reviewer-header{display:flex;align-items:center;margin-bottom:15px}.reviewer-avatar{width:40px;height:40px;background:#ccc;border-radius:50%;margin-right:12px;display:flex;align-items:center;justify-content:center;font-size:18px;color:#666}.reviewer-name{font-size:16px;font-weight:500;color:#333}.detail-rating{margin:10px 0}.stars{display:flex;gap:2px;margin-bottom:5px}.star{color:#ff9500;font-size:18px}.thumbs{display:flex;gap:5px}.thumb{color:#ff9500;font-size:16px}.review-date{font-size:14px;color:#666;margin:15px 0}.review-text{font-size:16px;line-height:1.5;color:#333;margin-bottom:25px}.images-section h3{font-size:16px;color:#666;margin-bottom:15px;font-weight:500}.review-images{display:flex;gap:10px}.review-image{width:60px;height:60px;background:#ddd;border-radius:6px;border:2px solid #e0e0e0;cursor:pointer;transition:border-color .3s}.review-image img{width:100%;height:100%}.review-image:hover,.review-image.selected{border-color:#007185}.navigation-arrows{position:absolute;top:20px;right:20px;display:flex;flex-direction:column;gap:10px}.arrow{width:40px;height:40px;background:#fffc;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:18px;color:#666;transition:background-color .3s;position:absolute;transform:rotate(90deg)}.backward-arrow{left:10px}.forward-arrow{right:10px}.arrow:hover{background:#fff}@media (max-width: 768px){.review-container{flex-direction:column}.image-section{min-height:300px}.review-section{padding:20px}}.review-modal{max-width:none;width:70vw}.review-modal .modal-body{padding:0}@media screen and (max-width: 475px){.offcanvas-small{height:100vh;width:100%;top:0}.review-modal{margin:0;height:100%;width:100%}.detail-review-container{flex-direction:column;height:100%}.product-image{max-height:289px}.image-section{min-height:289px}.video-modal{margin:0;height:100vh!important;width:100vw!important;overflow:hidden}}.modal{z-index:100000033}.breadcrumbs-modern{font-size:.85rem;color:#6b7280;margin-bottom:.5rem}.breadcrumb-item.active{color:#111827;font-weight:500}.product-title-modern{font-size:2rem;font-weight:800;color:#111827;margin:0;line-height:1.2;font-family:var(--website-font-family)}.product-price-modern{font-size:1.75rem;font-weight:700;color:#111827;font-family:var(--website-font-family)}.rating-line-modern{margin-top:.25rem}.rating-score-text{font-weight:700;font-size:1rem;color:#111827}.rating-count-text{font-size:.95rem;color:#10b981;font-weight:600;cursor:pointer}.product-description-brief{font-size:1rem;line-height:1.7;color:#4b5563;margin-top:1.5rem}.low-stock-text{color:#dc2626;font-weight:700;font-size:.875rem}.variants-modern-container{margin:2.5rem 0}.varient-key{font-size:.9rem;font-weight:800;color:#111827;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.75rem}.color-swatch-modern{width:36px;height:36px;border-radius:50%;cursor:pointer;border:3px solid white;box-shadow:0 0 0 1px #e5e7eb;transition:all .25s cubic-bezier(.4,0,.2,1)}.color-swatch-modern:hover{transform:scale(1.15)}.color-swatch-modern.active{box-shadow:0 0 0 2px #111827}.box-varient-modern{padding:.75rem 1.5rem;border:2px solid #f3f4f6;border-radius:10px;font-size:.95rem;font-weight:700;color:#374151;cursor:pointer;transition:all .2s;min-width:70px;text-align:center;background:#fff}.box-varient-modern:hover{border-color:#d1d5db;background:#f9fafb}.box-varient-modern.active{border-color:#111827;background:#111827;color:#fff}.quantity-container{margin-top:1rem}.quantity-selector-modern{border:1px solid #e5e7eb;border-radius:12px;width:fit-content;background:#f9fafb;padding:2px}.qty-btn{width:44px;height:44px;border:none;background:transparent;font-size:1.5rem;color:#111827;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;border-radius:10px}.qty-btn:hover:not(:disabled){background:#fff;box-shadow:0 2px 4px #0000000d}.qty-btn:disabled{color:#d1d5db;cursor:not-allowed}.qty-display{width:50px;text-align:center;font-weight:700;color:#111827;font-size:1.1rem}.out-of-stock-modern{background:#f3f4f6;color:#9ca3af;padding:1.1rem 2.5rem;border:none;border-radius:14px;font-weight:800;font-size:1.1rem;cursor:not-allowed}.wishlist-btn-modern{width:56px;height:56px;border:2px solid #f3f4f6;border-radius:14px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;background:#fff}.wishlist-btn-modern:hover{background:#fef2f2;border-color:#fecaca}.wishlist-btn-modern mat-icon{font-size:26px}.thumbnail-column{padding-right:15px!important}.thumbnail-list::-webkit-scrollbar{display:none}.thumbnail-list{-ms-overflow-style:none;scrollbar-width:none}.image-section-modern{padding-right:2.5rem!important;padding-left:0!important;width:60%!important;max-width:60%!important;flex:0 0 60%!important;margin-top:0!important}.detail-section-modern{padding-left:.5rem!important;padding-right:0!important;width:40%!important;max-width:40%!important;flex:0 0 40%!important;margin-top:0!important}.thumbnail-column{width:90px!important;flex:0 0 90px!important}.item-img{width:100%!important;max-width:100%;margin:0;border-radius:20px;overflow:hidden;background:#f9fafb;position:relative}lib-ngx-image-zoom{width:100%!important;display:block!important}::ng-deep .ngx-image-zoom-container{width:100%!important;height:auto!important;aspect-ratio:1/1}.style-1-vertical{display:flex;flex-direction:column;width:100%}.main-image-container{width:100%;aspect-ratio:1 / 1}.thumbnail-row{display:flex;gap:8px;overflow-x:auto;padding:12px 0}.thumbnail-img{min-width:80px;width:80px;height:80px;object-fit:cover;border-radius:8px;border:2px solid transparent;cursor:pointer;transition:border-color .2s}.active-thumb{border-width:2px;border-style:solid}.bento-grid{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:1fr 1fr;gap:15px;width:100%;aspect-ratio:5/4}.bento-item-large{grid-row:span 2;border-radius:24px;overflow:hidden}.bento-item-small{border-radius:20px;overflow:hidden}.bento-grid img{width:100%;height:100%;object-fit:cover;transition:transform .4s ease}.bento-grid img:hover{transform:scale(1.05)}@media (max-width: 991px){.image-section-modern,.detail-section-modern{width:100%!important;max-width:100%!important;flex:0 0 100%!important;padding:0!important}.bento-grid{grid-template-columns:1fr;grid-template-rows:auto;aspect-ratio:auto}.bento-item-large{grid-row:span 1}}.bento-masonry-container{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:1fr;gap:16px;width:100%}.bento-item-modern{border-radius:16px;overflow:hidden;background:#fdfdfd;aspect-ratio:1 / 1;transition:all .4s cubic-bezier(.4,0,.2,1)}.bento-img-modern{width:100%;height:100%;display:block;object-fit:cover;background:#fdfdfd;cursor:pointer;transition:transform .6s ease}.bento-item-modern:hover{transform:translateY(-4px);box-shadow:0 12px 30px #00000014}.bento-item-modern:hover .bento-img-modern{transform:scale(1.03)}.detail-section-modern{position:sticky;top:0;height:max-content;max-height:calc(100vh - 100px);overflow-y:auto;overflow-x:hidden;padding-left:2rem!important;scrollbar-width:none}.detail-section-modern::-webkit-scrollbar{display:none}.product-hero-card-modern{border:none;box-shadow:none;z-index:10;position:relative}.tabs-list{display:flex;justify-content:flex-start;gap:10px;list-style:none;padding:0;margin-bottom:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap}.tabs-list::-webkit-scrollbar{display:none}.tab-item{font-size:1rem;font-weight:600;color:#6b7280;padding:.5rem 1rem;border-radius:0;cursor:pointer;transition:all .25s;background:transparent;border-bottom:2px solid transparent;white-space:nowrap;flex-shrink:0}.tab-item:hover{background:transparent;color:#111827}.tab-content-pane{padding-top:.5rem}@media (max-width: 1024px){.product-hero-card-modern{padding:25px}.tab-content-pane{width:100%}}@media (max-width: 991px){.bento-masonry-container{grid-template-columns:1fr;grid-auto-rows:auto}.bento-item-modern.featured{grid-row:span 1;aspect-ratio:1 / 1}.product-hero-card-modern{position:static;padding:0;box-shadow:none;border:none;background:transparent;z-index:auto}.detail-section-modern{padding-left:0!important;margin-top:2rem;position:static!important;max-height:none!important;height:auto!important;overflow-y:visible!important;overflow-x:visible!important}.image-section-modern{padding-right:0!important}.tab-item{padding:.6rem 1rem;font-size:.95rem}.product-tabs-container{padding:0 4px}}.product-info-minimal{display:flex;flex-direction:column}.breadcrumbs-modern{display:flex;align-items:center;gap:8px;font-size:.95rem;color:#6b7280;font-weight:500}.breadcrumbs-modern .dot{font-size:1.2rem;line-height:1}.title-price-row-modern{display:flex;justify-content:space-between;align-items:flex-start;gap:20px}.product-title-modern{font-size:1.5rem;font-weight:800;color:#111827;margin:0;line-height:1.2}.product-price-modern{font-size:1.5rem;font-weight:500;color:#111827;white-space:nowrap}.rating-row-modern{display:flex;align-items:center;gap:12px;font-size:1rem;flex-wrap:wrap}.rating-score{font-weight:700;color:#111827}.separator{color:#e5e7eb}.reviews-link{font-weight:600}::ng-deep .rating-row-modern p-rating .p-rating-icon.p-rating-icon-active svg,::ng-deep .rating-row-modern p-rating .p-icon{color:#eab308!important;fill:#eab308!important}::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) svg,::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) .p-icon{color:#eab308!important;fill:#eab308!important;opacity:.25}.product-brief-modern{font-size:.95rem;line-height:1.7;color:#4b5563;margin-top:.5rem;text-align:justify}.write-review-btn{display:inline-flex;align-items:center;justify-content:center;padding:.65rem 1.75rem;background:#f8f9fa;color:#374151;border:1px solid #e5e7eb;border-radius:10px;font-size:.9rem;font-weight:600;cursor:pointer;transition:all .2s ease;letter-spacing:.02em}.write-review-btn:hover{background:#f1f3f5;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 8px #00000012}@media (max-width: 991px){.product-title-modern,.product-price-modern{font-size:1.3rem}}@media (max-width: 480px){.title-price-row-modern{flex-direction:column;gap:4px}.product-title-modern{font-size:1.2rem}.product-price-modern{font-size:1.2rem;white-space:normal}.rv-section{padding:1rem 0}.rv-header{gap:1rem}.rv-title{font-size:1.15rem;margin-bottom:.5rem}.rv-avg-num{font-size:1.15rem}.rv-bars{max-width:100%;width:100%}.rv-grid{grid-template-columns:1fr;gap:.75rem}.rv-card{padding:10px}.rv-name{font-size:14px}.tabs-list{gap:0}.tab-item{padding:.55rem 1rem;font-size:.9rem}.header-text{font-size:15px!important}.product-header{flex-wrap:wrap;gap:8px}.pricebreakup-btn{font-size:10px;padding:6px}.write-review-btn{width:100%;padding:.65rem 1rem}}.pb-glass-container{padding:16px;border-radius:16px}.pb-glass-card{background:#fff9;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.85);border-radius:12px;margin-bottom:12px;overflow:hidden}.pb-glass-header{padding:10px 16px;font-weight:700;font-size:12px;letter-spacing:1.5px;text-transform:uppercase}.pb-glass-row{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;font-size:14px;border-bottom:1px solid rgba(0,0,0,.04)}.pb-glass-row:last-child{border-bottom:none}.pb-glass-row:nth-child(2n){background:#f8fafc99}.pb-label{color:#6b7280;font-weight:500}.pb-value{font-weight:600;color:#1f2937}.pb-summary-card{background:#ffffffb3;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(203,213,225,.5);border-radius:12px;overflow:hidden}.pb-summary-row{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;font-size:14px;color:#374151;border-bottom:1px solid rgba(0,0,0,.05)}.pb-grand-total{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;font-weight:700;font-size:16px;letter-spacing:.5px}.item-code-row{margin-bottom:6px}.item-code-value{display:inline-block;padding:2px 10px;border-radius:999px;background:#f1f5f9;color:#475569;font-size:11px;font-weight:600;letter-spacing:.6px;text-transform:uppercase;border:1px solid #e2e8f0}.buy-now-btn{background:transparent!important;border:1.5px solid currentColor!important;color:inherit!important}\n"] }]
|
|
1029
1029
|
}], ctorParameters: () => [{ type: Object, decorators: [{
|
|
1030
1030
|
type: Inject,
|
|
1031
1031
|
args: [PLATFORM_ID]
|
|
@@ -1062,4 +1062,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1062
1062
|
type: HostListener,
|
|
1063
1063
|
args: ["window: resize", ["$event"]]
|
|
1064
1064
|
}] } });
|
|
1065
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXNjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtZGVzYy9wcm9kdWN0LWRlc2MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1kZXNjL3Byb2R1Y3QtZGVzYy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBMEIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sRUFBRSxxQkFBcUIsRUFBbUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRyxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRXpGLE9BQU8sV0FBVyxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU1qRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQs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T0FBTzt3QkFDUCxjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixtQkFBbUI7d0JBQ25CLHdCQUF3Qjt3QkFDeEIsa0JBQWtCO3dCQUNsQixtQkFBbUI7d0JBQ25CLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQix5QkFBeUI7d0JBQ3pCLG9CQUFvQjt3QkFDcEIsbUJBQW1CO3dCQUNuQixZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsV0FBVzt3QkFDWCx1QkFBdUI7d0JBQ3ZCLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLHFCQUFxQjt3QkFDckIsMEJBQTBCO3dCQUMxQixnQkFBZ0I7d0JBQ2hCLHVCQUF1QjtxQkFDeEIsYUFDVSxDQUFDLGNBQWMsQ0FBQzs7MEJBa0N4QixNQUFNOzJCQUFDLFdBQVc7Z1lBN0JrQyxlQUFlO3NCQUFyRSxTQUFTO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFM0IsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUNBLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDSyxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0csYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUVqQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFrWE4sYUFBYTtzQkFEWixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIFBMQVRGT1JNX0lELCBSZW5kZXJlcjIsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUHJvZHVjdERlc2NNb2RhbCwgUHJvZHVjdERlc2NTdHlsZXNNb2RhbCB9IGZyb20gJy4vcHJvZHVjdC1kZXNjLm1vZGFsJztcclxuaW1wb3J0IHsgY2hlY2tJdGVtQWxyZWFkeUFkZGVkLCBJdGVtSW1hZ2UsIEl0ZW1WYXJpYW50LCBQcm9kdWN0IH0gZnJvbSAnLi4vLi4vc3R5bGVzL3Byb2R1Y3QubW9kYWwnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9idXR0b24tZGlyZWN0aXZlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEJhY2tncm91bmRNb2RlbCwgQnV0dG9uTW9kZWwsIExheU91dE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vc3R5bGVzL3N0eWxlLm1vZGVsJztcclxuaW1wb3J0IEJhc2VTZWN0aW9uIGZyb20gJy4uLy4uLy4uL3NlY3Rpb25zL0Jhc2VTZWN0aW9uJztcclxuaW1wb3J0IHsgQW5pbWF0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2FuaW1hdGlvbi1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBIb3ZlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9ob3Zlci1lbGVtZW50LWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENvbnRlbnRGaXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvY29udGVudC1maXQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2ltcG9Db21wb25lbnRNb2R1bGUgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2luZGV4JztcclxuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4uLy4vLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyLCBVcmxTZWdtZW50IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE5neEltYWdlWm9vbU1vZHVsZSB9IGZyb20gJ25neC1pbWFnZS16b29tJztcclxuaW1wb3J0IHsgRmVhdHVyZWRQcm9kdWN0c0NvbXBvbmVudCB9IGZyb20gXCIuLi9mZWF0dXJlZC1wcm9kdWN0cy9mZWF0dXJlZC1wcm9kdWN0cy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRmVhdHVyZWRQcm9kdWN0TW9kYWwgfSBmcm9tICcuLi9mZWF0dXJlZC1wcm9kdWN0cy9mZWF0dXJlZC1wcm9kdWN0cy5tb2RhbCc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IE9yZGVyZWRJdGVtcyB9IGZyb20gJy4uLy4uL3N0eWxlcy9PcmRlcmVkSXRlbXMubW9kYWwnO1xyXG5pbXBvcnQgeyBCVVNJTkVTU19DT05TVEFOVFMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvYnVzaW5lc3MuY29uc3RhbnQnO1xyXG5pbXBvcnQgeyBUb2FzdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9hc3QnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IE1ldGEsIFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nQ29uZmlnIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgSXRlbVZhcmllbnRDb21wb25lbnQgfSBmcm9tICcuLi9pdGVtLXZhcmllbnQvaXRlbS12YXJpZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1hdEJvdHRvbVNoZWV0LCBNYXRCb3R0b21TaGVldE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JvdHRvbS1zaGVldCc7XHJcbmltcG9ydCB7IEJhY2tncm91bmREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYmFja2dyb3VuZC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTaW1wb1dyYXBDb21udGFpbmVyIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL3dyYXAtY29udGFpbmVycy5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDb2xvckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9jb2xvci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTb2NpYUljb25zQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZWxlbWVudHMvc29jaWEtaWNvbnMvc29jaWEtaWNvbnMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUmF0aW5nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9yYXRpbmcnO1xyXG5pbXBvcnQgeyBSZXZpZXcgfSBmcm9tICcuLi8uLi9zdHlsZXMvcmV2aWV3Lm1vZGFsJztcclxuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL3N0eWxlcy91c2VyLm1vZGFsJztcclxuaW1wb3J0IHsgU3BlZWREaWFsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9zcGVlZGRpYWwnO1xyXG5pbXBvcnQgeyBDdXN0b21lclJldmlld0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NlY3Rpb25zL2N1c3RvbWVyLXJldmlldy9jdXN0b21lci1yZXZpZXcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUGFuZWxNb2R1bGUgfSBmcm9tICdwcmltZW5nL3BhbmVsJztcclxuaW1wb3J0IHsgU3ZnRGl2aWRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2VsZW1lbnRzL3N2Zy1kaXZpZGVyL3N2Zy1kaXZpZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvcm5lckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9jb3JuZXItZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQnV0dG9uRWRpdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2J1dHRvbi1lZGl0b3IuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU3BhY2luZ0hvcml6b250YWxEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvc3BhY2luZy1ob3Jpem9udGFsLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNhbml0aXplSHRtbFBpcGUgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zYW5pdGl6ZUh0bWwnO1xyXG5pbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYW5hbHl0aWNzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ3hTa2VsZXRvbkxvYWRlck1vZHVsZSB9IGZyb20gJ25neC1za2VsZXRvbi1sb2FkZXInO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzaW1wby1wcm9kdWN0LWRlc2MnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBTaW1wb0NvbXBvbmVudE1vZHVsZSxcclxuICAgIE1hdEljb24sXHJcbiAgICBDb2xvckRpcmVjdGl2ZSxcclxuICAgIC8vRElSRUNUSVZFXHJcbiAgICBTaW1wb1dyYXBDb21udGFpbmVyLFxyXG4gICAgQmFja2dyb3VuZERpcmVjdGl2ZSxcclxuICAgIEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSxcclxuICAgIEFuaW1hdGlvbkRpcmVjdGl2ZSxcclxuICAgIENvbnRlbnRGaXREaXJlY3RpdmUsXHJcbiAgICBIb3ZlckRpcmVjdGl2ZSxcclxuICAgIE5neEltYWdlWm9vbU1vZHVsZSxcclxuICAgIEZlYXR1cmVkUHJvZHVjdHNDb21wb25lbnQsXHJcbiAgICBNYXRCb3R0b21TaGVldE1vZHVsZSxcclxuICAgIFNvY2lhSWNvbnNDb21wb25lbnQsXHJcbiAgICBSYXRpbmdNb2R1bGUsXHJcbiAgICBTcGVlZERpYWxNb2R1bGUsXHJcbiAgICBUb2FzdE1vZHVsZSxcclxuICAgIEN1c3RvbWVyUmV2aWV3Q29tcG9uZW50LFxyXG4gICAgUGFuZWxNb2R1bGUsXHJcbiAgICBTdmdEaXZpZGVyQ29tcG9uZW50LFxyXG4gICAgQ29ybmVyRGlyZWN0aXZlLFxyXG4gICAgQnV0dG9uRWRpdG9yRGlyZWN0aXZlLFxyXG4gICAgU3BhY2luZ0hvcml6b250YWxEaXJlY3RpdmUsXHJcbiAgICBTYW5pdGl6ZUh0bWxQaXBlLFxyXG4gICAgTmd4U2tlbGV0b25Mb2FkZXJNb2R1bGVcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1kZXNjLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vcHJvZHVjdC1kZXNjLmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9kdWN0RGVzY0NvbXBvbmVudCBleHRlbmRzIEJhc2VTZWN0aW9uIHtcclxuICBAVmlld0NoaWxkKEN1c3RvbWVyUmV2aWV3Q29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgcmV2aWV3Q29tcG9uZW50ITogQ3VzdG9tZXJSZXZpZXdDb21wb25lbnQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2Fib3ZlSGVpZ2h0JykgYWJvdmVIZWlnaHQhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdjb250YWluZXInKSBjb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdpbWFnZVNlY3Rpb24nKSBpbWFnZVNlY3Rpb24hOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdkZXRhaWxTZWN0aW9uJykgZGV0YWlsU2VjdGlvbiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG5cclxuICBASW5wdXQoKSBkYXRhPzogUHJvZHVjdERlc2NNb2RhbDtcclxuICBASW5wdXQoKSByZXNwb25zZURhdGEhOiBQcm9kdWN0O1xyXG4gIEBJbnB1dCgpIGluZGV4PzogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGVkaXQ/OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGRlbGV0ZT86IGJvb2xlYW47XHJcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3M/OiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIG5leHRDb21wb25lbnRDb2xvcj86IEJhY2tncm91bmRNb2RlbDtcclxuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZmVhdHVyZVByb2R1Y3REYXRhOiBGZWF0dXJlZFByb2R1Y3RNb2RhbCB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyByZWNlbnRWaWV3ZWREYXRhOiBGZWF0dXJlZFByb2R1Y3RNb2RhbCB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyB2YXJpZW50czogTWFwPHN0cmluZywgc3RyaW5nW10+ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xyXG4gIHB1YmxpYyBzZWxlY3RlZFZhcmllbnQ6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG5cclxuICBwdWJsaWMgcmVsYXRlZFByb2R1Y3REYXRhOiBQcm9kdWN0W10gPSBbXTtcclxuICBwdWJsaWMgcHJvZHVjdFJldmlldzogbnVtYmVyID0gMDtcclxuICBwdWJsaWMgdG90YWxSZXZpZXc6IG51bWJlciA9IDU7XHJcbiAgcHVibGljIHNob3dSZXZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2VsZWN0ZWRSZXZpZXc6IGFueTtcclxuICBwdWJsaWMgY3VycmVudEltYWdlSW5kZXg6IG51bWJlciA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBPYmplY3QsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ldmVudFNlcnZpY2U6IEV2ZW50c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc3RTZXJ2aWNlOiBSZXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1ldGFUYWdTZXJ2aWNlOiBNZXRhLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0aXRsZVNlcnZpY2U6IFRpdGxlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBib3R0b21TaGVldDogTWF0Qm90dG9tU2hlZXQsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIG1hdERpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBhbmFseXRpY3NTZXJ2aWNlOiBBbmFseXRpY3NTZXJ2aWNlXHJcbiAgKSB7XHJcblxyXG4gICAgc3VwZXIoKVxyXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgdGhpcy5nZXRTY3JlZW5TaXplKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9ldmVudFNlcnZpY2Uuc2hvd0xvYWRpbmdTY3JlZW4uc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHJlc3BvbnNlO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGJ1dHRvbklkPzogc3RyaW5nO1xyXG4gIGJ1dHRvbj86IEJ1dHRvbk1vZGVsXHJcbiAgc3R5bGVzPzogUHJvZHVjdERlc2NTdHlsZXNNb2RhbDtcclxuICBzdWJJbmR1c3RyeU5hbWU6IHN0cmluZyA9ICcnXHJcbiAgaXNJdGVtQXNGYXZvcml0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzSXRlbUFkZGVkQXNUcmlhbDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgcHJpdmF0ZSBVU0VSX0NBUlQ6IE9yZGVyZWRJdGVtc1tdIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBVU0VSX1dJU0hMSVNUOiBPcmRlcmVkSXRlbXNbXSB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBpdGVtSW1hZ2VzOiBJdGVtSW1hZ2VbXSA9IFtdO1xyXG4gIGl0ZW1zOiBNZW51SXRlbVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgYnVzaW5lc3NEZXRhaWxzOiBhbnk7XHJcbiAgdHJpYWxDYXJ0SXRlbTogYW55W10gPSBbXVxyXG4gIHVzZXJEZXRhaWxzOiBhbnk7XHJcbiAgdXNlcklkOiBhbnk7XHJcbiAgcmVjb21tZWRlZERhdGE6IFByb2R1Y3RbXSA9IFtdO1xyXG5cclxuICBpc1BpbkNvZGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHRvU2hvd0luSmV3ZWxsZXJ5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgSXNFY29tbWVyY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtYXRlcmlhbEJhc2VkUHJpY2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGFjdGl2ZVRhYjogc3RyaW5nID0gJ0RldGFpbHMnO1xyXG5cclxuICBjaGFuZ2VUYWIodGFiOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiO1xyXG4gIH1cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGxldCB1c2VyRGV0YWlscyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcicpIHx8ICcnO1xyXG4gICAgaWYgKHVzZXJEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMudXNlckRldGFpbHMgPSBKU09OLnBhcnNlKHVzZXJEZXRhaWxzKTtcclxuICAgICAgdGhpcy51c2VySWQgPSB0aGlzLnVzZXJEZXRhaWxzPy51c2VySWQ7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh3aW5kb3c/LmxvY2F0aW9uPy5vcmlnaW4/LmluY2x1ZGVzKCdjYXJhdGxhbmUnKSB8fCB3aW5kb3c/LmxvY2F0aW9uPy5vcmlnaW4/LmluY2x1ZGVzKCdvcnJhJykpIHtcclxuICAgICAgdGhpcy50b1Nob3dJbkpld2VsbGVyeSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRFY29tbWVyY2VDb25maWdzKCk7XHJcbiAgICB0aGlzLnN1YkluZHVzdHJ5TmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzdWJJbmR1c3RyeU5hbWUnKSA/PyBcIlwiO1xyXG4gICAgdGhpcy5tYXRlcmlhbEJhc2VkUHJpY2luZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdpc01hdGVyaWFsQmFzZWRQcmljaW5nJykgPT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgdGhpcy5mZWF0dXJlUHJvZHVjdERhdGEgPSBuZXcgRmVhdHVyZWRQcm9kdWN0TW9kYWwodGhpcy5kYXRhKTtcclxuICAgIHRoaXMucmVjZW50Vmlld2VkRGF0YSA9IG5ldyBGZWF0dXJlZFByb2R1Y3RNb2RhbCh0aGlzLmRhdGEsIHRydWUpO1xyXG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLmRhdGE/LnN0eWxlcztcclxuICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUltYWdlcyAmJiB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUltYWdlc1swXSAmJiB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUltYWdlc1swXT8uaW1nVXJsKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEltZyA9IHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmwgPz8gXCJcIlxyXG4gICAgfVxyXG4gICAgdGhpcy5idXR0b24gPSB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1swXTtcclxuICAgIHRoaXMuYnV0dG9uSWQgPSAodGhpcy5kYXRhID8gdGhpcy5kYXRhLmlkIDogJycpICsgKHRoaXMuYnV0dG9uID8gdGhpcy5idXR0b24uaWQgOiAnJyk7XHJcblxyXG4gICAgdGhpcy5waW5jb2RlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3BpbmNvZGUnKTtcclxuICAgIGlmICh0aGlzLnBpbmNvZGUpIHtcclxuICAgICAgdGhpcy5nZXRTdG9yZURldGFpbHMoKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXRlbXMgPSBbXHJcbiAgICAgIC8vIHtcclxuICAgICAgLy8gICBpY29uOiBcInBpIHBpLWhlYXJ0XCIsXHJcbiAgICAgIC8vICAgY29tbWFuZDogKCkgPT4ge1xyXG4gICAgICAvLyAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvd2lzaGxpc3QnXSk7XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWNvbjogXCJwaSBwaS1zaGFyZS1hbHRcIixcclxuICAgICAgICBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlUHJvZHVjdCgpO1xyXG4gICAgICAgICAgLy8gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xyXG4gICAgICAgICAgLy8gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnQ29waWVkJywgZGV0YWlsOiAnWW91IGNhbiBzaGFyZSB0aGUgdXJsJywga2V5OiAnd2lzaGxpc3QnIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgXTtcclxuICAgIHRoaXMuZ2V0UHJvZHVjdEJ5Q2F0ZWdvcnkoKTtcclxuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gcmVzcG9uc2U7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5Jc0Vjb21tZXJjZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwid2Vic2l0ZVR5cGVcIikgIT0gJ1NUQVRJQycgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnVybC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJyZW50VXJsID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lIHx8ICcnO1xyXG4gICAgICBjb25zdCBjbGVhblVybCA9IGN1cnJlbnRVcmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdO1xyXG4gICAgICBjb25zdCBzZWdtZW50cyA9IGNsZWFuVXJsLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pLm1hcCgoc2VnbWVudCkgPT4gZGVjb2RlVVJJQ29tcG9uZW50KHNlZ21lbnQpKTtcclxuXHJcbiAgICAgIGNvbnN0IGRldGFpbHNJbmRleCA9IHNlZ21lbnRzLmZpbmRJbmRleCgoc2VnbWVudCkgPT4gc2VnbWVudCA9PT0gJ2RldGFpbHMnKTtcclxuICAgICAgY29uc3Qgc2x1Z05hbWUgPSBkZXRhaWxzSW5kZXggPj0gMCA/IHNlZ21lbnRzW2RldGFpbHNJbmRleCArIDFdIDogXCJhbnQtZXNwb3J0cy1nbTEwMC0zNjAwLWRwaS13aXJlZC1yZ2ItZ2FtaW5nLW1vdXNlLWJsYWNrd2hpdGVcIjtcclxuICAgICAgY29uc3Qgcm91dGVWYXJpZW50SWQgPSBkZXRhaWxzSW5kZXggPj0gMCA/IHNlZ21lbnRzW2RldGFpbHNJbmRleCArIDJdIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgaWYgKHNsdWdOYW1lKSB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBUcmFja2luZyBBbmFseXRpY3NcclxuICAgICAgICB0aGlzLmFuYWx5dGljc1NlcnZpY2Uuc3RhcnROZXdDb250ZXh0KHtcclxuICAgICAgICAgICdQUk9EVUNUX0lEJzogc2x1Z05hbWUsXHJcbiAgICAgICAgfSwgJ1BST0RVQ1RfVklFVycpXHJcblxyXG5cclxuICAgICAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFByb2R1Y3REZXRhaWxzVjIoc2x1Z05hbWUpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlWzBdO1xyXG4gICAgICAgICAgdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50LCBpZHg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICB2YXJpZW50LnF1YW50aXR5ID0gMDtcclxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKCh2YXJpZW50S2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoaWR4ID09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVmFyaWVudC5zZXQodmFyaWVudEtleSwgdmFyaWVudC5wcm9wZXJ0aWVzW3ZhcmllbnRLZXldKTtcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMudmFyaWVudHMuZ2V0KHZhcmllbnRLZXkpPy5pbmNsdWRlcyh2YXJpZW50LnByb3BlcnRpZXNbdmFyaWVudEtleV0pKVxyXG4gICAgICAgICAgICAgICAgdGhpcy52YXJpZW50cy5zZXQodmFyaWVudEtleSwgWy4uLih0aGlzLnZhcmllbnRzLmdldCh2YXJpZW50S2V5KSA/PyBbXSksIHZhcmllbnQucHJvcGVydGllc1t2YXJpZW50S2V5XV0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmdldFJlbGF0ZWRQcm9kdWN0cygpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGNvbnN0IGl0ZW1WYXJpYW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KCk7XHJcbiAgICAgICAgICBpZiAoaXRlbVZhcmlhbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcyA9IGl0ZW1WYXJpYW50LnZhcmlhbnRJbWFnZXM7XHJcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCA9IGl0ZW1WYXJpYW50LnZhcmlhbnRJZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudGl0bGVTZXJ2aWNlLnNldFRpdGxlKHRoaXMucmVzcG9uc2VEYXRhPy5uYW1lKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5yZXNwb25zZURhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5pdGVtSW1hZ2VzID0gdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcztcclxuICAgICAgICAgICAgdGhpcy5nZXRSZXZpZXdzKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSWQpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlckNhcnQoKS50aGVuKChjYXJ0UmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICBjYXJ0UmVzcG9uc2Uub25zdWNjZXNzID0gKGNhcnREYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuVVNFUl9DQVJUID0gY2FydERhdGEudGFyZ2V0LnJlc3VsdCBhcyB1bmtub3duIGFzIE9yZGVyZWRJdGVtc1tdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5VU0VSX0NBUlQ/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtSWQgPT0gdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtVmFyaWFudCAmJiBpdGVtLnZhcmllbnRJZCA9PSBpdGVtVmFyaWFudC52YXJpYW50SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVZhcmlhbnQucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJXaGlzaGxpc3QoKS50aGVuKCh3aXNobGlzdFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgd2lzaGxpc3RSZXNwb25zZS5vbnN1Y2Nlc3MgPSAod2hpc2xpc3REYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuVVNFUl9XSVNITElTVCA9IHdoaXNsaXN0RGF0YS50YXJnZXQucmVzdWx0IGFzIHVua25vd24gYXMgT3JkZXJlZEl0ZW1zW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtSWQgPT0gdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1WYXJpYW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVZhcmlhbnQgJiYgaXRlbVZhcmlhbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1WYXJpYW50Lndpc2hsaXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5jaGVja0l0ZW1BbHJlYWR5QWRkZWRJblRyaWFsKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEltZyA9IHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzPy5bMF0/LmltZ1VybDtcclxuICAgICAgICAgICAgdGhpcy5nZXRQcm9kdWN0QnlDYXRlZ29yeSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgLy8gdGhpcy5nZXRQcm9kdWN0RGVzY3JpcHRpb25SZWNvbW1lbmRhdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIC8vIE9ubHkgYXR0YWNoIGN1c3RvbSBzY3JvbGwgbGlzdGVuZXJzIG9uIGRlc2t0b3Ag4oCUIG9uIG1vYmlsZSB0aGVzZSBjYW5cclxuICAgIC8vIGNhbGwgZS5wcmV2ZW50RGVmYXVsdCgpIGFuZCBibG9jayB0b3VjaC9jbGljayBldmVudHMgb24gdGhlIHRhYnMuXHJcbiAgICBpZiAodGhpcy5pc01vYmlsZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgYWJvdmUgPSB0aGlzLmFib3ZlSGVpZ2h0Py5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgaW1nRGl2ID0gdGhpcy5pbWFnZVNlY3Rpb24/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBkZXRhaWxEaXYgPSB0aGlzLmRldGFpbFNlY3Rpb24/Lm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgLy8gU3RlcCAxOiBzY3JvbGwgYmV0d2VlbiBpbWFnZSBhbmQgZGV0YWlsLCB0aGVuIGNvbnRhaW5lciBvbmNlIGRldGFpbCBpcyBleGhhdXN0ZWRcclxuICAgIGltZ0Rpdj8uYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZTogV2hlZWxFdmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBhdEJvdHRvbSA9IGltZ0Rpdi5zY3JvbGxUb3AgKyBpbWdEaXYuY2xpZW50SGVpZ2h0ID49IGltZ0Rpdi5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgIGNvbnN0IGF0VG9wID0gaW1nRGl2LnNjcm9sbFRvcCA9PT0gMDtcclxuXHJcbiAgICAgIGlmIChlLmRlbHRhWSA+IDAgJiYgYXRCb3R0b20pIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY29uc3QgZGV0YWlsQXRCb3R0b20gPSBkZXRhaWxEaXYuc2Nyb2xsVG9wICsgZGV0YWlsRGl2LmNsaWVudEhlaWdodCA+PSBkZXRhaWxEaXYuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgICAgIGlmICghZGV0YWlsQXRCb3R0b20pIHtcclxuICAgICAgICAgIGRldGFpbERpdi5zY3JvbGxUb3AgKz0gZS5kZWx0YVk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgKz0gZS5kZWx0YVk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGUuZGVsdGFZIDwgMCAmJiBhdFRvcCkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBjb25zdCBkZXRhaWxBdFRvcCA9IGRldGFpbERpdi5zY3JvbGxUb3AgPT09IDA7XHJcbiAgICAgICAgaWYgKCFkZXRhaWxBdFRvcCkge1xyXG4gICAgICAgICAgZGV0YWlsRGl2LnNjcm9sbFRvcCArPSBlLmRlbHRhWTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCArPSBlLmRlbHRhWTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFN0ZXAgMjogYWZ0ZXIgZGV0YWlsIHNlY3Rpb24sIGNvbnRpbnVlIHRvIFJldmlld3NcclxuICAgIGRldGFpbERpdj8uYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZTogV2hlZWxFdmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBhdEJvdHRvbSA9IGRldGFpbERpdi5zY3JvbGxUb3AgKyBkZXRhaWxEaXYuY2xpZW50SGVpZ2h0ID49IGRldGFpbERpdi5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgIGNvbnN0IGF0VG9wID0gZGV0YWlsRGl2LnNjcm9sbFRvcCA9PT0gMDtcclxuXHJcbiAgICAgIGlmIChlLmRlbHRhWSA+IDAgJiYgYXRCb3R0b20pIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCArPSBlLmRlbHRhWTtcclxuICAgICAgfSBlbHNlIGlmIChlLmRlbHRhWSA8IDAgJiYgYXRUb3ApIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgaW1nRGl2LnNjcm9sbFRvcCArPSBlLmRlbHRhWTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHZhcmllbnRMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcmVjZW50Vmlld0l0ZW1MaXN0OiBQcm9kdWN0W10gPSBbXTtcclxuICBnZXRSZWxhdGVkUHJvZHVjdHMoKSB7XHJcbiAgICBjb25zdCB1c2VyRGV0YWlsczogVXNlciB8IG51bGwgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKTtcclxuICAgIGlmICghIXVzZXJEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UmVjZW50Vmlld1Byb2R1Y3QodXNlckRldGFpbHMudXNlcklkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZWNlbnRWaWV3SXRlbUxpc3QgPSByZXNwb25zZTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbiAgc2VsZWN0VmFyaWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy52YXJpZW50TG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnNlbGVjdGVkVmFyaWVudC5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgICB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50KSA9PiB7XHJcbiAgICAgIGxldCBmb3VuZFZhcmllbnQgPSB0cnVlO1xyXG4gICAgICBPYmplY3Qua2V5cyh2YXJpZW50LnByb3BlcnRpZXMpLmZvckVhY2goKHByb3BlcnR5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBmb3VuZFZhcmllbnQgPSAodGhpcy5zZWxlY3RlZFZhcmllbnQuZ2V0KHByb3BlcnR5KSA9PSB2YXJpZW50LnByb3BlcnRpZXNbcHJvcGVydHldKSAmJiBmb3VuZFZhcmllbnQ7XHJcbiAgICAgIH0pXHJcbiAgICAgIGlmIChmb3VuZFZhcmllbnQpIHtcclxuICAgICAgICB0aGlzLml0ZW1JbWFnZXMgPSB2YXJpZW50LnZhcmlhbnRJbWFnZXM7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50SW1nID0gdGhpcy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmw7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucHJpY2UgPSB2YXJpZW50Lml0ZW1WYXJpYW50UHJpY2U7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUludmVudG9yeSA9IHZhcmllbnQuaXRlbUludmVudG9yeTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQgPSB2YXJpZW50LnZhcmlhbnRJZDtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IHRoaXMuZ2V0VmFyaWVudFF1YW50aXR5KHZhcmllbnQpO1xyXG4gICAgICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IHRoaXMuaXNWYXJpZW50UHJlc2VudEluV2lzaHRsaXN0KHZhcmllbnQpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tJdGVtQWxyZWFkeUFkZGVkSW5UcmlhbCgpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudmFyaWVudExvYWRpbmcgPSBmYWxzZTtcclxuICAgIH0sIDMwMCk7XHJcbiAgfVxyXG4gIHJhaXNlTGVhZCgpIHtcclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCk7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgYnVzaW5lc3NJZDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSxcclxuICAgICAgZW1haWw6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5lbWFpbCxcclxuICAgICAgbWVzc2FnZTogXCJcIixcclxuICAgICAgbW9iaWxlTm86IFwiXCIsXHJcbiAgICAgIG1vcmVJbmZvOiB7XHJcbiAgICAgICAgTmFtZTogdXNlckRldGFpbHM/LmNvbnRhY3Q/Lm5hbWUsXHJcbiAgICAgICAgXCJNb2JpbGUgTnVtYmVyXCI6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5tb2JpbGUsXHJcbiAgICAgICAgRW1haWw6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5lbWFpbCxcclxuICAgICAgICBcIkxlYWQgU291cmNlXCI6IFwiV2Vic2l0ZVwiLFxyXG4gICAgICAgIFwiTGVhZCBTdGF0dXNcIjogXCJORVdcIlxyXG4gICAgICB9LFxyXG4gICAgICBuYW1lOiB1c2VyRGV0YWlscz8uY29udGFjdD8ubmFtZVxyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5jcmVhdGVMZWFkKHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LmRhdGEpIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1RoYW5rIHlvdScsIGRldGFpbDogJ091ciB0ZWFtIHdpbGwgY29udGFjdCB5b3Ugc29vbicgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiAnRXJyb3Igb2NjdXJlZCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyJyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG4gIGdldEl0ZW1WYXJpZW50KCk6IEl0ZW1WYXJpYW50IHwgbnVsbCB7XHJcbiAgICBsZXQgc2VsZWN0ZWRWYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSBudWxsO1xyXG4gICAgdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5mb3JFYWNoKCh2YXJpZW50OiBJdGVtVmFyaWFudCkgPT4ge1xyXG4gICAgICBsZXQgZm91bmRWYXJpZW50ID0gdHJ1ZTtcclxuICAgICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgZm91bmRWYXJpZW50ID0gKHRoaXMuc2VsZWN0ZWRWYXJpZW50LmdldChwcm9wZXJ0eSkgPT0gdmFyaWVudC5wcm9wZXJ0aWVzW3Byb3BlcnR5XSkgJiYgZm91bmRWYXJpZW50O1xyXG4gICAgICB9KVxyXG4gICAgICBpZiAoZm91bmRWYXJpZW50KVxyXG4gICAgICAgIHNlbGVjdGVkVmFyaWVudCA9IHZhcmllbnQ7XHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiBzZWxlY3RlZFZhcmllbnQ7XHJcbiAgfVxyXG5cclxuICBjaGVja0l0ZW1BbHJlYWR5QWRkZWRJblRyaWFsKCkge1xyXG4gICAgbGV0IHVzZXI6IFVzZXIgfCBudWxsID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKClcclxuICAgIGlmICh1c2VyKSB7XHJcbiAgICAgIGxldCByZXF1ZXN0OiBjaGVja0l0ZW1BbHJlYWR5QWRkZWQgPSBuZXcgY2hlY2tJdGVtQWxyZWFkeUFkZGVkKHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JZCwgdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkLCB1c2VyLnVzZXJJZCwgJ1RSSUFMX0NBUlQnKVxyXG4gICAgICB0aGlzLnJlc3RTZXJ2aWNlLmNoZWNrSXRlbUFscmVhZHlBZGRlZChyZXF1ZXN0KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc0l0ZW1BZGRlZEFzVHJpYWwgPSByZXMuZGF0YVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5nZXRUcmlhbENhcnRJbmRleERCRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0VHJpYWxDYXJ0SW5kZXhEQkRhdGEoKSB7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFRyaWFsQ2FydCgpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHJlc3BvbnNlLm9uc3VjY2VzcyA9ICh1c2VyVHJpYWxDYXJ0UmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCB0cmlhbENhcnRJdGVtOiBPcmRlcmVkSXRlbXNbXSA9IHVzZXJUcmlhbENhcnRSZXNwb25zZS50YXJnZXQucmVzdWx0O1xyXG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdHJpYWxDYXJ0SXRlbSkge1xyXG4gICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09PSB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSWQgJiYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID09IDAgfHwgdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkID09PSBpdGVtLnZhcmllbnRJZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0l0ZW1BZGRlZEFzVHJpYWwgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHNoYXJlUHJvZHVjdCgpIHtcclxuICAgIG5hdmlnYXRvci5zaGFyZSh7XHJcbiAgICAgIHRpdGxlOiAnQnV5ICcgKyB0aGlzLnJlc3BvbnNlRGF0YT8ubmFtZSxcclxuICAgICAgdGV4dDogdGhpcy5yZXNwb25zZURhdGEuYnJpZWY/LnJlcGxhY2UoLzxcXC9bXj5dKyg+fCQpL2csIFwiXCIpLFxyXG4gICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnU2hhcmVkJywgZGV0YWlsOiAnUHJvZHVjdCBzaGFyZWQnLCBrZXk6ICd3aXNobGlzdCcgfSkpXHJcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdTaGFyZWQnLCBkZXRhaWw6ICdGYWlsZWQgdG8gc2hhcmUgcHJvZHVjdC4gVHJ5IEFnYWluLicsIGtleTogJ3dpc2hsaXN0JyB9KSk7XHJcblxyXG4gIH1cclxuICByb3V0ZVRvSG9tZSgpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKTtcclxuICB9XHJcblxyXG4gIHNjcmVlbldpZHRoOiBhbnk7XHJcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzogcmVzaXplXCIsIFtcIiRldmVudFwiXSlcclxuICBnZXRTY3JlZW5TaXplKCkge1xyXG4gICAgdGhpcy5zY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gIH1cclxuXHJcbiAgY3VycmVudEltZzogYW55O1xyXG4gIGNoYW5nZUltZyh1cmw6IGFueSkge1xyXG4gICAgdGhpcy5jdXJyZW50SW1nID0gdXJsO1xyXG4gIH1cclxuXHJcbiAgZ2V0S2V5cyh2YXJpZW50OiBPYmplY3QpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXModmFyaWVudCk7XHJcbiAgfVxyXG5cclxuICBnb1RvQ2FydCgpOiB2b2lkIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NhcnQnXSk7XHJcbiAgfVxyXG5cclxuICBidXlOb3coKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkZFRvQ2FydCgpO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY2FydCddLCB7IHF1ZXJ5UGFyYW1zOiB7IGNoZWNrb3V0OiB0cnVlIH0gfSk7XHJcbiAgfVxyXG5cclxuICBhZGRUb0NhcnQodHlwZTogJ0FERCcgfCAnU1VCU1RSQUNUJyA9ICdBREQnKSB7XHJcbiAgICBpZiAodGhpcy5pc0l0ZW1PdXRPZlN0b2NrKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICd3YXJuJywgc3VtbWFyeTogJ0NhcnQnLCBkZXRhaWw6ICdJdGVtIGlzIG5vdCBhdmFpbGFibGUgYXMgb2Ygbm93LiBXZSB3aWxsIG5vdGlmeSB5b3Ugb25jZSBhdmFpbGFibGUnIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xyXG4gICAgICBpZiAoaXRlbVZhcmllbnQpIHtcclxuICAgICAgICBpdGVtVmFyaWVudC5xdWFudGl0eSArPSAodHlwZSA9PSAnQUREJyA/IDEgOiAtMSk7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSBpdGVtVmFyaWVudC5xdWFudGl0eTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW52ZW50b3J5ID0gaXRlbVZhcmllbnQuaXRlbUludmVudG9yeTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW1hZ2VzID0gaXRlbVZhcmllbnQudmFyaWFudEltYWdlcztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5KSB7XHJcbiAgICAgICAgbGV0IGlzUHJlc2VudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtLnZhcmllbnRJZCA9PSB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpIHtcclxuICAgICAgICAgICAgaXRlbS5xdWFudGl0eSA9IHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5O1xyXG4gICAgICAgICAgICBpc1ByZXNlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgaWYgKCFpc1ByZXNlbnQpXHJcbiAgICAgICAgICB0aGlzLlVTRVJfQ0FSVD8ucHVzaChuZXcgT3JkZXJlZEl0ZW1zKHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLlVTRVJfQ0FSVCA9IHRoaXMuVVNFUl9DQVJUPy5maWx0ZXIoKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4gaXRlbS52YXJpZW50SWQgIT0gdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKSA/PyBbXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9DYXJ0KHRoaXMucmVzcG9uc2VEYXRhIGFzIFByb2R1Y3QsIGl0ZW1WYXJpZW50Py52YXJpYW50SWQpO1xyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGlmICghdGhpcy5yZXNwb25zZURhdGE/LnF1YW50aXR5KVxyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gMDtcclxuICAgICAgaWYgKHR5cGUgPT0gJ0FERCcpIHtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSArPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5IC09IDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvQ2FydCh0aGlzLnJlc3BvbnNlRGF0YSBhcyBQcm9kdWN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdvVG9GaWx0ZXIoY2F0ZWdvcnk6IHN0cmluZykge1xyXG4gICAgY2F0ZWdvcnkgPSBjYXRlZ29yeS5yZXBsYWNlQWxsKFwiIFwiLCBcIl9cIilcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbGlzdCddLCB7IHF1ZXJ5UGFyYW1zOiB7IGNhdGVnb3J5OiBjYXRlZ29yeSB9IH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkVG9GYXZvdXJpdGUoKSB7XHJcbiAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSB0cnVlO1xyXG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnU3VjY2VzcycsIGRldGFpbDogJ0l0ZW0gYWRkZWQgdG8geW91ciB3aXNobGlzdCcsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcclxuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUludmVudG9yeSA9IGl0ZW1WYXJpZW50Lml0ZW1JbnZlbnRvcnk7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50LnZhcmlhbnRJbWFnZXM7XHJcbiAgICAgICAgaXRlbVZhcmllbnQud2lzaGxpc3QgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvRmF2b3VyaXRlKHRoaXMucmVzcG9uc2VEYXRhIGFzIFByb2R1Y3QsIGl0ZW1WYXJpZW50LnZhcmlhbnRJZCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvRmF2b3VyaXRlKHRoaXMucmVzcG9uc2VEYXRhIGFzIFByb2R1Y3QpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNJdGVtQXNGYXZvcml0ZSkge1xyXG4gICAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LnB1c2gobmV3IE9yZGVyZWRJdGVtcyh0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLlVTRVJfV0lTSExJU1QgPSB0aGlzLlVTRVJfV0lTSExJU1Q/LmZpbHRlcigoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiBpdGVtLnZhcmllbnRJZCAhPSB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpID8/IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuICByZW1vdmVUb0Zhdm91cml0ZSgpIHtcclxuICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnU3VjY2VzcycsIGRldGFpbDogJ0l0ZW0gcmVtb3ZlZCBmcm9tIHlvdXIgd2lzaGxpc3QnLCBrZXk6ICd3aXNobGlzdCcgfSk7XHJcbiAgICBpZiAodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KCk7XHJcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xyXG4gICAgICAgIGl0ZW1WYXJpZW50Lndpc2hsaXN0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5yZW1vdmVJdGVtRnJvbUZhdm91cml0ZSh0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlbW92ZUl0ZW1Gcm9tRmF2b3VyaXRlKHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRQcm9kdWN0QnlDYXRlZ29yeSgpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UHJvZHVjdEJ5Q2F0ZWdvcnlJZCh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5pdGVtQ2F0ZWdvcmllcz8uWzBdPy5yZWZJZCA/PyBcIlwiKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZWxhdGVkUHJvZHVjdERhdGEgPSByZXNwb25zZS5kYXRhPy5maWx0ZXIoKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JZCAhPSBwcm9kdWN0Lml0ZW1JZCk7XHJcbiAgICAgIGlmICh0aGlzLnJlbGF0ZWRQcm9kdWN0RGF0YT8ubGVuZ3RoID09IDApXHJcbiAgICAgICAgdGhpcy5nZXRQcm9kdWN0QnlDb2xsZWN0aW9uKCk7XHJcbiAgICB9KVxyXG4gIH1cclxuICBnZXRQcm9kdWN0QnlDb2xsZWN0aW9uKCkge1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRQcm9kdWN0QnlDb2xsZWN0aW9uSWQodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1DYXRlZ29yaXNhdGlvbj8uaXRlbUNvbGxlY3Rpb24/LlswXS5yZWZJZCA/PyBcIlwiKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZWxhdGVkUHJvZHVjdERhdGEgPSByZXNwb25zZS5kYXRhPy5maWx0ZXIoKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JZCAhPSBwcm9kdWN0Lml0ZW1JZCk7XHJcbiAgICB9KVxyXG4gIH1cclxuICBjaGFuZ2VQcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2RldGFpbHMnLCBwcm9kdWN0LnNsdWdpZmllZE5hbWUsIHByb2R1Y3QudmFyaWVudElkXSk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA9IDA7XHJcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICB9XHJcbiAgZ2V0S2V5QnlJZHgocHJvcGVydHk6IGFueSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BlcnR5KVtpbmRleF07XHJcbiAgfVxyXG4gIGlzVmFyaWVudEF2YWlsYWJsZSh2YXJpZW50OiBhbnkpOiBib29sZWFuIHtcclxuXHJcbiAgICAvLyB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50KT0+IHtcclxuICAgIC8vICAgbGV0IGZvdW5kVmFyaWVudCA9IHRydWU7XHJcbiAgICAvLyAgIE9iamVjdC5rZXlzKHZhcmllbnQucHJvcGVydGllcykuZm9yRWFjaCgocHJvcGVydHk6IHN0cmluZyk9PiB7XHJcbiAgICAvLyAgICAgLy8gZm91bmRWYXJpZW50ID0gKHZhcmllbnRLZXkgPT0gdmFyaWVudC5wcm9wZXJ0aWVzW3Byb3BlcnR5XSkgJiYgZm91bmRWYXJpZW50O1xyXG4gICAgLy8gICB9KVxyXG4gICAgLy8gfSlcclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIHJldmlld1RpdGxlOiBzdHJpbmcgPSBcIlwiO1xyXG4gIHJldmlld0Rlc2NyaXB0aW9uOiBzdHJpbmcgPSBcIlwiO1xyXG4gIGFkZFByb2R1Y3RSZXZpZXcoKSB7XHJcbiAgICBjb25zdCB1c2VyRGV0YWlsczogVXNlciB8IG51bGwgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5yZXZpZXdUaXRsZS5sZW5ndGggPT0gMCAmJiB0aGlzLnJldmlld0Rlc2NyaXB0aW9uLmxlbmd0aCA9PSAwICYmIHRoaXMucHJvZHVjdFJldmlldyA9PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKCF1c2VyRGV0YWlscykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdMb2dpbicsIGRldGFpbDogJ1BsZWFzZSBsb2dpbiB0byBwb3N0IHJldmlldycsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGF5bG9hZDogUmV2aWV3ID0ge1xyXG4gICAgICBwcm9kdWN0SWQ6IHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JZCxcclxuICAgICAgdXNlcklkOiB1c2VyRGV0YWlscy51c2VySWQsXHJcbiAgICAgIHJhdGluZzogdGhpcy5wcm9kdWN0UmV2aWV3LFxyXG4gICAgICByZXZpZXc6IHRoaXMucmV2aWV3RGVzY3JpcHRpb24sXHJcbiAgICAgIHVzZXJOYW1lOiB1c2VyRGV0YWlscz8uY29udGFjdD8ubmFtZSxcclxuICAgICAgdGl0bGU6IHRoaXMucmV2aWV3VGl0bGUsXHJcbiAgICAgIHByb2R1Y3RJbWFnZXM6IFtdXHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmFkZFJldmlldyhwYXlsb2FkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd1JldmlldyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnJlc3BvbnNlRGF0YS5yYXRpbmcgKz0gMTtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnUmV2aWV3JywgZGV0YWlsOiAnVGhhbmtzIGZvciBnaXZpbmcgeW91ciBmZWVkYmFjaycsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuICAgICAgaWYgKHRoaXMucmV2aWV3Q29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5yZXZpZXdDb21wb25lbnQuZ2V0QWxsUmV2aWV3cygpO1xyXG4gICAgICB9XHJcbiAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ1JldmlldycsIGRldGFpbDogZXJyb3I/LmVycm9yPy5tZXNzYWdlLCBrZXk6ICd3aXNobGlzdCcgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRWYXJpZW50UXVhbnRpdHkocHJvZHVjdFZhcmllbnQ6IEl0ZW1WYXJpYW50KTogbnVtYmVyIHtcclxuICAgIGxldCBpdGVtUXVhbnRpdHk6IG51bWJlciA9IDA7XHJcbiAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgICAgIGlmIChwcm9kdWN0VmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpXHJcbiAgICAgICAgaXRlbVF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcclxuICAgIH0pXHJcbiAgICByZXR1cm4gaXRlbVF1YW50aXR5O1xyXG4gIH1cclxuICBwcml2YXRlIGlzVmFyaWVudFByZXNlbnRJbldpc2h0bGlzdChwcm9kdWN0VmFyaWVudDogSXRlbVZhcmlhbnQpOiBib29sZWFuIHtcclxuICAgIGxldCBwcmVzZW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xyXG4gICAgICBpZiAocHJvZHVjdFZhcmllbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKVxyXG4gICAgICAgIHByZXNlbnQgPSB0cnVlO1xyXG4gICAgfSlcclxuICAgIHJldHVybiBwcmVzZW50O1xyXG4gIH1cclxuXHJcbiAgZWRpdFNlY3Rpb24oKSB7XHJcblxyXG4gICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDQ3NSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuX2V2ZW50U2VydmljZS50b2dnbGVFZGl0b3JFdmVudC5lbWl0KGZhbHNlKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLl9ldmVudFNlcnZpY2UuZWRpdFNlY3Rpb24uZW1pdCh7IGRhdGE6IHRoaXMuZGF0YSB9KTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNJdGVtT3V0T2ZTdG9jaygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrID09IDA7XHJcbiAgfVxyXG4gIGdldCBjdXJyZW5jeSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEJVU0lORVNTX0NPTlNUQU5UUy5DVVJSRU5DWTtcclxuICB9XHJcbiAgZ2V0IGlzSXRlbUxvd1N0b2NrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2sgPCA1O1xyXG4gIH1cclxuICBnZXQgaXNNb2JpbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggPD0gNDc1O1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2FyYXQoY2FyYXQ6IGFueSkge1xyXG4gICAgc3dpdGNoIChjYXJhdCkge1xyXG4gICAgICBjYXNlICdLMjQnOlxyXG4gICAgICAgIHJldHVybiBcIjI0IENhcmF0c1wiXHJcbiAgICAgIGNhc2UgJ0syMic6XHJcbiAgICAgICAgcmV0dXJuIFwiMjIgQ2FyYXRzXCJcclxuICAgICAgY2FzZSAnSzE4JzpcclxuICAgICAgICByZXR1cm4gXCIxOCBDYXJhdHNcIlxyXG4gICAgICBjYXNlICdLMTQnOlxyXG4gICAgICAgIHJldHVybiBcIjE0IENhcmF0c1wiXHJcbiAgICAgIGNhc2UgJ0sxMCc6XHJcbiAgICAgICAgcmV0dXJuIFwiMTAgQ2FyYXRzXCJcclxuICAgICAgY2FzZSAnSzk5OSc6XHJcbiAgICAgICAgcmV0dXJuIFwiOTkuOSUgUHVyZVwiXHJcbiAgICAgIGNhc2UgJ0s5MjUnOlxyXG4gICAgICAgIHJldHVybiBcIjkyLjUlIFB1cmVcIlxyXG4gICAgICBjYXNlICdLOTAwJzpcclxuICAgICAgICByZXR1cm4gXCI5MCUgUHVyZVwiXHJcbiAgICAgIGNhc2UgJ1ZTJzpcclxuICAgICAgICByZXR1cm4gXCJWZXJ5IFNsaWdodGx5IEluY2x1ZGVkXCJcclxuICAgICAgY2FzZSAnU0knOlxyXG4gICAgICAgIHJldHVybiBcIlNsaWdodGx5IEluY2x1ZGVkXCJcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gXCIyNCBDYXJhdHNcIlxyXG4gICAgfVxyXG4gIH1cclxuICBnZXRQcmljZVBlckdyYW0ocHJpY2U6IGFueSwgbWF0ZXJpYWxUeXBlOiBzdHJpbmcpIHtcclxuICAgIGlmIChtYXRlcmlhbFR5cGUgPT09ICdESUFNT05EJyB8fCBtYXRlcmlhbFR5cGUgPT09ICdHT0xEJykge1xyXG4gICAgICByZXR1cm4gcHJpY2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlzRGVzY3JpcHRpb25Db2xsYXBzZWQgPSBmYWxzZTtcclxuXHJcbiAgdG9nZ2xlRGVzY3JpcHRpb24oKSB7XHJcbiAgICB0aGlzLmlzRGVzY3JpcHRpb25Db2xsYXBzZWQgPSAhdGhpcy5pc0Rlc2NyaXB0aW9uQ29sbGFwc2VkO1xyXG4gIH1cclxuICBpc1ByaWNlQnJlYWt1cCA9IGZhbHNlXHJcbiAgdG9nZ2xlUHJpY2VCcmVha0Rvd24oKSB7XHJcbiAgICB0aGlzLmlzUHJpY2VCcmVha3VwID0gIXRoaXMuaXNQcmljZUJyZWFrdXA7XHJcbiAgfVxyXG4gIGdldERpZmZlcmVuY2Uoc2VsbGluZ1ByaWNlOiBhbnksIG1ycDogYW55KTogbnVtYmVyIHtcclxuICAgIGlmICghc2VsbGluZ1ByaWNlIHx8ICFtcnApXHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgcmV0dXJuIG1ycCAtIHNlbGxpbmdQcmljZTtcclxuICB9XHJcbiAgZ2V0QmFja2dyb3VuZENvbG9yKHR5cGU6IHN0cmluZykge1xyXG4gICAgLy8gc3dpdGNoICh0eXBlKSB7XHJcbiAgICAvLyAgIGNhc2UgXCJHT0xEXCI6XHJcbiAgICAvLyAgICAgcmV0dXJuIFwiI0ZGRjREMVwiXHJcbiAgICAvLyAgIGNhc2UgXCJESUFNT05EXCI6XHJcbiAgICAvLyAgICAgcmV0dXJuIFwiI0VGRTFGNFwiXHJcbiAgICAvLyAgIGNhc2UgXCJTSUxWRVJcIjpcclxuICAgIC8vICAgICByZXR1cm4gXCJsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCAjRkFGQUZBIDAlLCAjRkZGRkZGIDEwMCUpXCJcclxuICAgIC8vICAgZGVmYXVsdDpcclxuICAgIC8vICAgICByZXR1cm4gXCIjZTJmNmZmXCJcclxuICAgIC8vIH1cclxuICAgIHJldHVybiBcIiNGRkY5RjVcIlxyXG4gIH1cclxuICBnZXRIZWFkZXJDb2xvcih0eXBlOiBzdHJpbmcpIHtcclxuICAgIC8vIHN3aXRjaCAodHlwZSkge1xyXG4gICAgLy8gICBjYXNlIFwiR09MRFwiOlxyXG4gICAgLy8gICAgIHJldHVybiBcIiNGRkYzRTlcIlxyXG4gICAgLy8gICBjYXNlIFwiRElBTU9ORFwiOlxyXG4gICAgLy8gICAgIHJldHVybiBcIiM5RDQzQjhcIlxyXG4gICAgLy8gICBjYXNlIFwiU0lMVkVSXCI6XHJcbiAgICAvLyAgICAgcmV0dXJuIFwibGluZWFyLWdyYWRpZW50KDE4MGRlZywgI0JEQkRCRCAwJSwgI0UyRTJFMiAxMDAlKVwiXHJcbiAgICAvLyAgIGRlZmF1bHQ6XHJcbiAgICAvLyAgICAgcmV0dXJuIFwibGluZWFyLWdyYWRpZW50KDE1OWRlZywgcmdiYSg2NSwxMDUsMjI1LDEpIDAlLCByZ2JhKDEzNywyMDcsMjQwLDEpIDEwMCUpXCJcclxuICAgIC8vIH1cclxuICAgIHJldHVybiBcIiNGRkYzRTlcIlxyXG4gIH1cclxuICBmb3JtYXRJdGVtQ29kZShjb2RlOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiBjb2RlPy5yZXBsYWNlQWxsKCdfJywgJyAnKS5yZXBsYWNlQWxsKCctJywgJyAnKSA/PyAnJztcclxuICB9XHJcblxyXG4gIGdldFRleHRDb2xvcihjb2xvcjogYW55KSB7XHJcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAxMzA7XHJcbiAgICBjb25zdCByID0gcGFyc2VJbnQoY29sb3Iuc2xpY2UoMSwgMyksIDE2KTtcclxuICAgIGNvbnN0IGcgPSBwYXJzZUludChjb2xvci5zbGljZSgzLCA1KSwgMTYpO1xyXG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDUsIDcpLCAxNik7XHJcbiAgICBjb25zdCBicmlnaHRuZXNzID0gKHIgKiAyOTkgKyBnICogNTg3ICsgYiAqIDExNCkgLyAxMDAwO1xyXG5cclxuICAgIHJldHVybiBicmlnaHRuZXNzID4gdGhyZXNob2xkID8gJyMwMDAwMDAnIDogJyNmZmZmZmYnO1xyXG4gIH1cclxuICBsYW5ndWFnZXM6IHN0cmluZ1tdID0gW1wiRW5nbGlzaFwiLCBcIlRlbHVndVwiLCBcIkhpbmRpXCIsIFwiVGFtaWxcIiwgXCJLYW5uYWRhXCIsIFwiTWFsYXlhbGFtXCIsIFwiT3RoZXJzXCJdXHJcbiAgc2VsZWN0ZWRMYW5nOiBzdHJpbmcgPSB0aGlzLmxhbmd1YWdlc1swXVxyXG5cclxuICBnZXRDbGFzcyhtYXA6IGFueSkge1xyXG4gICAgaWYgKG1hcC5zaXplID09IDEpXHJcbiAgICAgIHJldHVybiAnY29sLTYnXHJcbiAgICBlbHNlIGlmIChtYXAuc2l6ZSA9PSAyKVxyXG4gICAgICByZXR1cm4gJ2NvbC00J1xyXG4gICAgZWxzZSBpZiAobWFwLnNpemUgPT0gMylcclxuICAgICAgcmV0dXJuICdjb2wtMydcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuICd3aWR0aC1tYXgnO1xyXG4gIH1cclxuICBvbkZpbmRJblN0b3JlKGlkOiBzdHJpbmcpIHtcclxuICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3N0b3JlJ10sIHsgcXVlcnlQYXJhbXM6IHsgc3RvcmVJZDogaWQgfSB9KTtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3N0b3JlLWxpc3QnXSk7XHJcbiAgfVxyXG5cclxuICBvbkJvb2tBcHBvaW50bWVudCgpIHtcclxuXHJcbiAgfVxyXG4gIGlzRGV0YWlsczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHBpbmNvZGU6IGFueTtcclxuICBzdG9yZURldGFpbHM6IGFueTtcclxuICBnZXRTdG9yZURldGFpbHMoKSB7XHJcbiAgICBpZiAodGhpcy5waW5jb2RlID09IG51bGwgfHwgdGhpcy5waW5jb2RlLnRvU3RyaW5nKCkubGVuZ3RoICE9IDYpIHtcclxuICAgICAgdGhpcy5pc1BpbkNvZGUgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRTdG9yZUxvY2F0b3JEZXRhaWxzKHRoaXMucGluY29kZS50b1N0cmluZygpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuaXNEZXRhaWxzID0gdHJ1ZTtcclxuICAgICAgdGhpcy5zdG9yZURldGFpbHMgPSByZXM/LmRhdGE7XHJcbiAgICAgIHRoaXMuaXNQaW5Db2RlID0gdHJ1ZTtcclxuICAgIH0sXHJcbiAgICAgIChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IGVycj8uZXJyb3I/Lm1lc3NhZ2UsIGtleTogJ1N0b3JlIExvY2F0b3InIH0pO1xyXG4gICAgICB9KVxyXG4gIH1cclxuICBicmFuZFByb21pc2VzOiBhbnlbXSA9IFtdO1xyXG4gIGVjb21Db25maWdzOiBhbnk7XHJcbiAgZ2V0RWNvbW1lcmNlQ29uZmlncygpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0RWNvbW1lcmNlQ29uZmlncygpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5icmFuZFByb21pc2VzID0gcmVzPy5kYXRhPy5icmFuZFByb21pc2VzXHJcbiAgICAgIHRoaXMuZWNvbUNvbmZpZ3MgPSByZXM/LmRhdGFcclxuICAgIH0pXHJcbiAgfVxyXG4gIGxvY2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG90aGVyTGFuZ3VhZ2U6IHN0cmluZyA9ICcnO1xyXG5cclxuICB2aWRlb0NhbGxQYXlsb2FkOiBhbnkgPSB7XHJcbiAgICBidXNpbmVzc0lkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NJZCcpID8/IFwiXCIsXHJcbiAgICBtb2JpbGVOdW1iZXI6IFwiXCIsXHJcbiAgICBwaW5jb2RlOiBcIlwiLFxyXG4gICAgdXNlcm5hbWU6IFwiXCIsXHJcbiAgICBlbWFpbDogXCJcIixcclxuICAgIG1lc3NhZ2U6IGBgLFxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGlvbkVycm9yczogYW55ID0ge1xyXG4gICAgdXNlcm5hbWU6IGZhbHNlLFxyXG4gICAgbW9iaWxlTnVtYmVyOiBmYWxzZSxcclxuICAgIC8vIHBpbmNvZGU6IGZhbHNlLFxyXG4gICAgLy8gZW1haWw6IGZhbHNlXHJcbiAgfTtcclxuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzY2hlZHVsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzY2hlZHVsZVZpZGVvQ2FsbCgpIHtcclxuICAgIGlmICh0aGlzLmlzU3VibWl0dGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc2V0VmFsaWRhdGlvbkVycm9ycygpO1xyXG4gICAgbGV0IGhhc0Vycm9ycyA9IGZhbHNlO1xyXG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQudXNlcm5hbWU/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMudXNlcm5hbWUgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5tb2JpbGVOdW1iZXIgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyLnRvU3RyaW5nKCkubGVuZ3RoICE9PSAxMCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMubW9iaWxlTnVtYmVyID0gdHJ1ZTtcclxuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vIGlmICghdGhpcy52aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGUpIHtcclxuICAgIC8vICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLnBpbmNvZGUgPSB0cnVlO1xyXG4gICAgLy8gICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgLy8gfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZS50b1N0cmluZygpLmxlbmd0aCAhPT0gNikge1xyXG4gICAgLy8gICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucGluY29kZSA9IHRydWU7XHJcbiAgICAvLyAgIGhhc0Vycm9ycyA9IHRydWU7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQuZW1haWw/LnRyaW0oKSkge1xyXG4gICAgLy8gICB0aGlzLnZhbGlkYXRpb25FcnJvcnMuZW1haWwgPSB0cnVlO1xyXG4gICAgLy8gICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgLy8gfSBlbHNlIGlmICghL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvLnRlc3QodGhpcy52aWRlb0NhbGxQYXlsb2FkLmVtYWlsKSkge1xyXG4gICAgLy8gICB0aGlzLnZhbGlkYXRpb25FcnJvcnMuZW1haWwgPSB0cnVlO1xyXG4gICAgLy8gICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gfHwgIXRoaXMudmlkZW9DYWxsUGF5bG9hZC5waW5jb2RlXHJcbiAgICBpZiAoaGFzRXJyb3JzKSB7XHJcbiAgICAgIGlmICghdGhpcy52aWRlb0NhbGxQYXlsb2FkLnVzZXJuYW1lPy50cmltKCkgfHwgIXRoaXMudmlkZW9DYWxsUGF5bG9hZC5tb2JpbGVOdW1iZXIpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgICAgICBzZXZlcml0eTogJ3dhcm4nLFxyXG4gICAgICAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxyXG4gICAgICAgICAgZGV0YWlsOiAnUGxlYXNlIGZpbGwgYWxsIHRoZSByZXF1aXJlZCBkZXRhaWxzJyxcclxuICAgICAgICAgIGtleTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy52aWRlb0NhbGxQYXlsb2FkLm1vYmlsZU51bWJlci50b1N0cmluZygpLmxlbmd0aCAhPT0gMTApIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgICAgICBzZXZlcml0eTogJ3dhcm4nLFxyXG4gICAgICAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxyXG4gICAgICAgICAgZGV0YWlsOiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgMTAtZGlnaXQgbW9iaWxlIG51bWJlcicsXHJcbiAgICAgICAgICBrZXk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIH0gZWxzZSBpZiAodGhpcy52aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGUudG9TdHJpbmcoKS5sZW5ndGggIT09IDYpIHtcclxuICAgICAgLy8gICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgIC8vICAgICBzZXZlcml0eTogJ3dhcm4nLFxyXG4gICAgICAvLyAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxyXG4gICAgICAvLyAgICAgZGV0YWlsOiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgNi1kaWdpdCBwaW5jb2RlJyxcclxuICAgICAgLy8gICAgIGtleTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnXHJcbiAgICAgIC8vICAgfSk7XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gZWxzZSBpZiAoIXRoaXMudmlkZW9DYWxsUGF5bG9hZC5lbWFpbD8udHJpbSgpIHx8ICEvXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Mix9JC8udGVzdCh0aGlzLnZpZGVvQ2FsbFBheWxvYWQuZW1haWwpKSB7XHJcbiAgICAgIC8vICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAvLyAgICAgc2V2ZXJpdHk6ICd3YXJuJyxcclxuICAgICAgLy8gICAgIHN1bW1hcnk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJyxcclxuICAgICAgLy8gICAgIGRldGFpbDogJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnLFxyXG4gICAgICAvLyAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcclxuICAgICAgLy8gICB9KTtcclxuICAgICAgLy8gfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy52aWRlb0NhbGxQYXlsb2FkLm1lc3NhZ2UgPSB0aGlzLnZpZGVvQ2FsbFBheWxvYWQubWVzc2FnZSArIGBIaSwgSSd2ZSBqdXN0IHNjaGVkdWxlZCBhIHZpZGVvIGNhbGwgd2l0aCB5b3UgZm9yIHRoaXMgcHJvZHVjdCAke3RoaXMucmVzcG9uc2VEYXRhPy5uYW1lfS4gSXQncyBpbXBvcnRhbnQgYW5kIEknZCBhcHByZWNpYXRlIHlvdXIgdGltZSDigJQgbG9va2luZyBmb3J3YXJkIHRvIGNvbm5lY3RpbmcgYXMgc29vbiBhcyBwb3NzaWJsZSAgaW4gJHt0aGlzLnNlbGVjdGVkTGFuZyA9PSAnT3RoZXJzJyA/IHRoaXMub3RoZXJMYW5ndWFnZSA6IHRoaXMuc2VsZWN0ZWRMYW5nfSBsYW5ndWFnZWA7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLnBvc3RWaWRlb0NhbGxEZXRhaWxzKHRoaXMudmlkZW9DYWxsUGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgICAgICBzZXZlcml0eTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxyXG4gICAgICAgICAgZGV0YWlsOiAnWW91ciBWaWRlbyBDYWxsIGlzIFNjaGVkdWxlZCBTdWNjZXNzZnVsbHknLFxyXG4gICAgICAgICAga2V5OiAnVmlkZW8gU2NoZWR1bGluZydcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2NoZWR1bGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKClcclxuICAgICAgfSxcclxuICAgICAgKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcclxuICAgICAgICAgIHN1bW1hcnk6ICdFcnJvcicsXHJcbiAgICAgICAgICBkZXRhaWw6IGVycj8uZXJyb3I/Lm1lc3NhZ2UsXHJcbiAgICAgICAgICBrZXk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICByZXNldFZhbGlkYXRpb25FcnJvcnMoKSB7XHJcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMgPSB7XHJcbiAgICAgIHVzZXJuYW1lOiBmYWxzZSxcclxuICAgICAgbW9iaWxlTnVtYmVyOiBmYWxzZSxcclxuICAgICAgcGluY29kZTogZmFsc2VcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZXNldEZvcm0oKSB7XHJcbiAgICB0aGlzLnZpZGVvQ2FsbFBheWxvYWQgPSB7XHJcbiAgICAgIHVzZXJuYW1lOiAnJyxcclxuICAgICAgbW9iaWxlTnVtYmVyOiAnJyxcclxuICAgICAgcGluY29kZTogJycsXHJcbiAgICAgIG1lc3NhZ2U6ICcnXHJcbiAgICB9O1xyXG4gICAgdGhpcy5yZXNldFZhbGlkYXRpb25FcnJvcnMoKTtcclxuICB9XHJcbiAgb25JbnB1dENoYW5nZShmaWVsZDogYW55KSB7XHJcbiAgICBpZiAodGhpcy52YWxpZGF0aW9uRXJyb3JzW2ZpZWxkXSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnNbZmllbGRdID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNsb3NlTW9kYWwoKSB7XHJcbiAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhhbXBsZU1vZGFsQ2VudGVyJyk7XHJcbiAgICBpZiAobW9kYWxFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKG1vZGFsRWxlbWVudCwgJ2RhdGEtYnMtZGlzbWlzcycsICdtb2RhbCcpO1xyXG4gICAgICBtb2RhbEVsZW1lbnQuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEJ1dHRvbklkKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1tpbmRleF0/LmlkID8/IFwiXCI7XHJcbiAgfVxyXG4gIGdldEJ1dHRvblN0eWxlKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1tpbmRleF0/LnN0eWxlcztcclxuICB9XHJcbiAgb3BlbkRpYWxvZ0JveCh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBjb25zdCBjb25maWc6IE1hdERpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgcGFuZWxDbGFzczogJycsXHJcbiAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnNjcmVlbldpZHRoID4gNDc1KSB7XHJcbiAgICAgIGNvbmZpZy5wYW5lbENsYXNzID0gJ3ZpZGVvLWNhbGwtZGlhbG9nJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbmZpZy53aWR0aCA9ICcxMDB2dyc7XHJcbiAgICAgIGNvbmZpZy5oZWlnaHQgPSAnMTAwdmgnO1xyXG4gICAgICBjb25maWcubWF4V2lkdGggPSAnMTAwdncnO1xyXG4gICAgICBjb25maWcucGFuZWxDbGFzcyA9ICdhcHBvaW50bWVudC1mb3JtJztcclxuICAgIH1cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMubWF0RGlhbG9nLm9wZW4odGVtcGxhdGUsIGNvbmZpZyk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG1hdENsb3NlRGlhbG9nKCkge1xyXG4gICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlRGlhbG9nKCkge1xyXG4gICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcclxuICB9XHJcblxyXG4gIGdldFJhdGluZ3Mobm9vZnJhdGluZ3M6IGFueSkge1xyXG4gICAgaWYgKG5vb2ZyYXRpbmdzID49IDEwMDApIHtcclxuICAgICAgcmV0dXJuIChub29mcmF0aW5ncyAvIDEwMDApLnRvRml4ZWQoMSkgKyBcIksrXCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChub29mcmF0aW5ncyA+IDEwMDAwMDApIHtcclxuICAgICAgcmV0dXJuIChub29mcmF0aW5ncyAvIDEwMDAwMDApLnRvRml4ZWQoMSkgKyBcIk1cIjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gbm9vZnJhdGluZ3M7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRUb1RyaWFsQ2FydCgpIHtcclxuICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcclxuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUludmVudG9yeSA9IGl0ZW1WYXJpZW50Lml0ZW1JbnZlbnRvcnk7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50LnZhcmlhbnRJbWFnZXM7XHJcbiAgICAgICAgaXRlbVZhcmllbnQud2lzaGxpc3QgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvVHJpYWwodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCwgaXRlbVZhcmllbnQudmFyaWFudElkKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9UcmlhbCh0aGlzLnJlc3BvbnNlRGF0YSBhcyBQcm9kdWN0KTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNJdGVtQWRkZWRBc1RyaWFsID0gdHJ1ZTtcclxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1N1Y2Nlc3MnLCBkZXRhaWw6ICdJdGVtIGFkZGVkIHRvIHlvdXIgdHJhaWwgY2FydCcsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NhcnQnXSwgeyBxdWVyeVBhcmFtczogeyBjYXJ0VHlwZTogJ1RSSUFMJyB9IH0pXHJcbiAgfVxyXG4gIHJldmlld3NEYXRhOiBhbnlbXSA9IFtdXHJcbiAgcmF0aW5nQ291bnRzOiBhbnlcclxuICBwYWdlTnVtYmVyOiBudW1iZXIgPSAwXHJcbiAgbG9hZE1vcmVSZXZpZXdzKCkge1xyXG4gICAgdGhpcy5wYWdlTnVtYmVyKys7XHJcbiAgICB0aGlzLmdldFJldmlld3ModGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JZCk7XHJcbiAgfVxyXG4gIGdldFJldmlld3MocHJvZHVjdElkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UmV2aWV3c0J5UHJvZHVjdElkKHByb2R1Y3RJZCwgdGhpcy5wYWdlTnVtYmVyKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZXZpZXdzRGF0YSA9IFsuLi50aGlzLnJldmlld3NEYXRhLCAuLi5yZXNwb25zZT8uZGF0YT8udXNlclJldmlld3NdO1xyXG4gICAgICB0aGlzLnJhdGluZ0NvdW50cyA9IHJlc3BvbnNlPy5kYXRhPy5vdmVyYWxsUmF0aW5nQ291bnRcclxuICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IGVycm9yPy5lcnJvcj8ubWVzc2FnZSwga2V5OiAnUmV2aWV3cycgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0UGVyY2VudGFnZShyYXRpbmc6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMucmF0aW5nQ291bnRzICYmIHRoaXMucmF0aW5nQ291bnRzW3JhdGluZ10pIHtcclxuICAgICAgbGV0IHBlcmNlbnQgPSAodGhpcy5yYXRpbmdDb3VudHNbcmF0aW5nXSAvIHRoaXMucmVzcG9uc2VEYXRhPy50b3RhbFJldmlld0NvdW50KSAqIDEwMFxyXG4gICAgICByZXR1cm4gcGVyY2VudC50b0ZpeGVkKDApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcwJztcclxuICB9XHJcblxyXG4gIGdldFJHQkEoYmdDb2xvcjogYW55LCBvcGFjaXR5OiBudW1iZXIpOiBhbnkge1xyXG4gICAgY29uc3QgciA9IHBhcnNlSW50KGJnQ29sb3Iuc2xpY2UoMSwgMyksIDE2KTtcclxuICAgIGNvbnN0IGcgPSBwYXJzZUludChiZ0NvbG9yLnNsaWNlKDMsIDUpLCAxNik7XHJcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoYmdDb2xvci5zbGljZSg1LCA3KSwgMTYpO1xyXG4gICAgcmV0dXJuIGByZ2JhKCR7cn0sICR7Z30sICR7Yn0sICR7b3BhY2l0eSAvIDEwMH0pYDtcclxuICB9XHJcblxyXG4gIHNob3dEZXRhaWxSZXZpZXcocmV2aWV3OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRSZXZpZXcgPSByZXZpZXdcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVuUmV2aWV3RGV0YWlsJyk/LmNsaWNrKClcclxuICB9XHJcbiAgZ2V0IHN0eWxlc0xheW91dCgpIHtcclxuICAgIHJldHVybiB7IC4uLnRoaXMuc3R5bGVzPy5sYXlvdXQgfSBhcyBMYXlPdXRNb2RlbDtcclxuICB9XHJcblxyXG4gIGdldERhdGVBZnRlcnhEYXlzKCk6IERhdGUge1xyXG4gICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgY3VycmVudERhdGUuc2V0RGF0ZShjdXJyZW50RGF0ZS5nZXREYXRlKCkgKyAodGhpcy5lY29tQ29uZmlncz8uZXhwZWN0ZWREZWxpdmVyeURhdGUgPz8gNykpO1xyXG4gICAgcmV0dXJuIGN1cnJlbnREYXRlO1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJvZHVjdERlc2NyaXB0aW9uUmVjb21tZW5kYXRpb25zKCkge1xyXG4gICAgLy8gdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IGJ1c2luZXNzSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NJZCcpO1xyXG4gICAgY29uc3QgdXNlcklkID0gdGhpcy51c2VySWQ7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFByb2R1Y3REZXNjcmlwdGlvblJlY29tbWVuZGF0aW9ucyhidXNpbmVzc0lkLCB1c2VySWQpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnJlY29tbWVkZWREYXRhID0gQXJyYXkuaXNBcnJheShyZXNwb25zZT8uZGF0YSkgPyByZXNwb25zZS5kYXRhIDogW107XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlckNhcnQoKS50aGVuKChjYXJ0UmVzcG9uc2UpID0+IHtcclxuICAgICAgICBjYXJ0UmVzcG9uc2Uub25zdWNjZXNzID0gKGNhcnREYXRhOiBhbnkpID0+IHtcclxuXHJcbiAgICAgICAgICAvLyB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuVVNFUl9DQVJUID0gY2FydERhdGEudGFyZ2V0LnJlc3VsdCBhcyB1bmtub3duIGFzIE9yZGVyZWRJdGVtc1tdO1xyXG4gICAgICAgICAgdGhpcy5yZWNvbW1lZGVkRGF0YT8uZm9yRWFjaCgocHJvZHVjdDogUHJvZHVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09IHByb2R1Y3QucHJvZHVjdElkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50ID0gcHJvZHVjdD8uaXRlbVZhcmlhbnQ/LlswXTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1WYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3QuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50LnZhcmlhbnRJbWFnZXMgPz8gW107XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5wcmljZSA9IGl0ZW1WYXJpZW50Lml0ZW1WYXJpYW50UHJpY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHByb2R1Y3QucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgLy8gdGhpcy5hcGlMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcldoaXNobGlzdCgpLnRoZW4oKHdpc2hsaXN0UmVzcG9uc2UpID0+IHtcclxuICAgICAgICB3aXNobGlzdFJlc3BvbnNlLm9uc3VjY2VzcyA9ICh3aGlzbGlzdERhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUID0gd2hpc2xpc3REYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXTtcclxuXHJcbiAgICAgICAgICB0aGlzLnJlY29tbWVkZWREYXRhPy5mb3JFYWNoKChwcm9kdWN0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtSWQgPT0gcHJvZHVjdC5wcm9kdWN0SWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9kdWN0Py5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgPSBwcm9kdWN0Py5pdGVtVmFyaWFudD8uWzBdO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbVZhcmllbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5pdGVtSW1hZ2VzID0gaXRlbVZhcmllbnQ/LnZhcmlhbnRJbWFnZXMgPz8gW107XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5wcmljZSA9IGl0ZW1WYXJpZW50Lml0ZW1WYXJpYW50UHJpY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC53aGlzbGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBwcm9kdWN0LndoaXNsaXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxufVxyXG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxyXG4gIDxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCIga2V5PVwid2lzaGxpc3RcIlxyXG4gICAgW3Nob3dUcmFuc2Zvcm1PcHRpb25zXT1cImlzTW9iaWxlID8gJ3RyYW5zbGF0ZVkoLTEwMCUpJyA6ICcnXCI+PC9wLXRvYXN0PlxyXG4gIDxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCJcclxuICAgIFtzaG93VHJhbnNmb3JtT3B0aW9uc109XCJpc01vYmlsZSA/ICd0cmFuc2xhdGVZKC0xMDAlKScgOiAnJ1wiPjwvcC10b2FzdD5cclxuICA8cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiIGtleT1cIlZpZGVvIENhbGwgU2NoZWR1bGVcIlxyXG4gICAgW3Nob3dUcmFuc2Zvcm1PcHRpb25zXT1cImlzTW9iaWxlID8gJ3RyYW5zbGF0ZVkoLTEwMCUpJyA6ICcnXCI+PC9wLXRvYXN0PlxyXG4gIDxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCIga2V5PVwiVmlkZW8gU2NoZWR1bGluZ1wiXHJcbiAgICBbc2hvd1RyYW5zZm9ybU9wdGlvbnNdPVwiaXNNb2JpbGUgPyAndHJhbnNsYXRlWSgtMTAwJSknIDogJydcIj48L3AtdG9hc3Q+XHJcbiAgPHNlY3Rpb24gY2xhc3M9XCJ0b3RhbC1jb250YWluZXJcIiBbaWRdPVwiZGF0YT8uaWRcIiBbc2ltcG9CYWNrZ3JvdW5kXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIHNpbXBvSG92ZXJcclxuICAgIChob3ZlcmluZyk9XCJzaG93RWRpdFRhYnMoJGV2ZW50KVwiIFthdHRyLnN0eWxlXT1cImN1c3RvbUNsYXNzXCI+XHJcblxyXG4gICAgPCEtLSA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiIGNsYXNzPVwic3BlZWRkaWFsLWxpbmVhclwiICpuZ0lmPVwiaXNNb2JpbGVcIj5cclxuICAgICAgPHAtc3BlZWREaWFsIFttb2RlbF09XCJpdGVtc1wiIGRpcmVjdGlvbj1cInVwXCIgW2J1dHRvblN0eWxlXT1cInsnYm9yZGVyLXJhZGl1cyc6ICc1MCUnLCAnaGVpZ2h0JzogJzMwcHgnfVwiIC8+XHJcbiAgICA8L2Rpdj4gLS0+XHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cImNvbnRhaW5lclwiIFtpZF09XCJkYXRhPy5pZFwiIFtzaW1wb0FuaW1hdGlvbl09XCJzdHlsZXM/LmFuaW1hdGlvblwiIFtzcGFjaW5nSG9yaXpvbnRhbF09XCJzdHlsZXNMYXlvdXRcIlxyXG4gICAgICBbc2ltcG9MYXlvdXRdPVwic3R5bGVzPy5sYXlvdXRcIiAjY29udGFpbmVyPlxyXG4gICAgICA8IS0tIDxkaXYgY2xhc3M9XCJkaXNwbGF5LW5vbmVcIj48YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOiAjMDI2N0MxXCJcclxuICAgICAgICAgIChjbGljayk9XCJyb3V0ZVRvSG9tZSgpXCI+SG9tZTwvYT4gL1xyXG4gICAgICAgIDxzcGFuPnt7IHJlc3BvbnNlRGF0YT8ubmFtZSB8IHRpdGxlY2FzZSB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG0tMCB3LTEwMCBtdC1sZy00IGgtYXV0byBvdmVyZmxvdy12aXNpYmxlXCIgI2Fib3ZlSGVpZ2h0PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNiBjb2wtc20tMTIgaW1hZ2Utc2VjdGlvbi1tb2Rlcm5cIiAjaW1hZ2VTZWN0aW9uPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgZ2FwLTFcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkltYWdlU2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy02IGNvbC1zbS0xMiBkZXRhaWwtc2VjdGlvbi1tb2Rlcm4gXCIgI2RldGFpbFNlY3Rpb24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1oZXJvLWNhcmQtbW9kZXJuXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc01vYmlsZVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ2YXJpYW50c1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJQcm9kdWN0RGVzY1wiPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc01vYmlsZVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ2YXJpYW50c1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNNb2JpbGVcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiQWN0aW9uQnRuXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlY29tQ29uZmlncz8uZGVsaXZlcnlFbmFibGVkXCI+XHJcbiAgICAgICAgICAgIDwhLS0gKm5nSWY9XCJlY29tQ29uZmlncz8uZGVsaXZlcnlFbmFibGVkXCIgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJEZWxpdmVyeVNlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlY29tQ29uZmlncz8uc3RvcmVzRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICA8IS0tICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LnN0b3Jlc0VuYWJsZWRcIiAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlN0b3JlU2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVjb21Db25maWdzPy5hcHBvaW50bWVudEJvb2tpbmdFbmFibGVkXCI+XHJcbiAgICAgICAgICAgIDwhLS0gKm5nSWY9XCJlY29tQ29uZmlncz8uYXBwb2ludG1lbnRCb29raW5nRW5hYmxlZFwiIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiVHJ5QXRIb21lXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIj5cclxuICAgICAgICAgICAgPCEtLSAqbmdJZj1cImVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCIgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ2aWRlb0NhbGxTY2hlZHVsZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVjb21Db25maWdzPy5icmFuZFByb21pc2VFbmFibGVkXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJicmFuZGluZ1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuXHJcbiAgICAgICAgICA8IS0tIE1vdmVkIGRlc2NyaXB0b3JzIHRvIERldGFpbHMgdGFiIGJlbG93IC0tPlxyXG5cclxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInByb2R1Y3QtZGVzYyBib2R5LWxhcmdlIGQtYmxvY2tcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8uYnJpZWZcIlxyXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cInJlc3BvbnNlRGF0YS5icmllZlwiPjwvZGl2PiAtLT5cclxuICAgICAgICAgIDwhLS0gTW92ZWQgdGFncyB0byBEZXRhaWxzIHRhYiBiZWxvdyAtLT5cclxuICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlNvY2lhbEljb25zXCI+PC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiUmV2aWV3U2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSBUYWJzIE5hdmlnYXRpb24gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXRhYnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPHVsIGNsYXNzPVwidGFicy1saXN0XCI+XHJcbiAgICAgICAgICA8bGkgY2xhc3M9XCJ0YWItaXRlbVwiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09ICdEZXRhaWxzJ1wiXHJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJhY3RpdmVUYWIgPT0gJ0RldGFpbHMnID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICcnXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImFjdGl2ZVRhYiA9PSAnRGV0YWlscycgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJ3RyYW5zcGFyZW50J1wiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VUYWIoJ0RldGFpbHMnKVwiPkRldGFpbHM8L2xpPlxyXG4gICAgICAgICAgPGxpIGNsYXNzPVwidGFiLWl0ZW1cIiAqbmdJZj1cInJldmlld3NEYXRhXCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIgPT0gJ1Jldmlld3MnXCJcclxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImFjdGl2ZVRhYiA9PSAnUmV2aWV3cycgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxyXG4gICAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiYWN0aXZlVGFiID09ICdSZXZpZXdzJyA/IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAndHJhbnNwYXJlbnQnXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVRhYignUmV2aWV3cycpXCI+UmV2aWV3czwvbGk+XHJcbiAgICAgICAgICA8bGkgY2xhc3M9XCJ0YWItaXRlbVwiICpuZ0lmPVwibWF0ZXJpYWxCYXNlZFByaWNpbmdcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYiA9PSAnUHJpY2VCcmVha3VwJ1wiXHJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJhY3RpdmVUYWIgPT0gJ1ByaWNlQnJlYWt1cCcgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxyXG4gICAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiYWN0aXZlVGFiID09ICdQcmljZUJyZWFrdXAnID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICd0cmFuc3BhcmVudCdcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGFiKCdQcmljZUJyZWFrdXAnKVwiPlByaWNlIEJyZWFrdXA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBUYWIgQ29udGVudCAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50LXBhbmVcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlVGFiID09ICdEZXRhaWxzJ1wiPlxyXG4gICAgICAgICAgPCEtLSBJbnRlZ3JhdGVkIGRlc2NyaXB0b3JzIGFuZCB0YWdzIGhlcmUgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVzY3JpcHRvcnNcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlVGFiID09ICdSZXZpZXdzJ1wiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlJldmlld3NTZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVUYWIgPT0gJ1ByaWNlQnJlYWt1cCdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi1nbGFzcy1jb250YWluZXIgbXQtMlwiPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBPbmUgY2FyZCBwZXIgbWF0ZXJpYWwg4oCUIGdlbmVyaWMsIHdvcmtzIGZvciBhbnkgbWF0ZXJpYWwgdHlwZSAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWxlIG9mIHJlc3BvbnNlRGF0YT8ubWF0ZXJpYWxzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBiLWdsYXNzLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi1nbGFzcy1oZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIicjZmZmJ1wiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBlbGU/Lm1hdGVyaWFsTmFtZSB8IHRpdGxlY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItZ2xhc3Mtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGItbGFiZWxcIj5QdXJpdHk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGItdmFsdWVcIj57eyBlbGU/LnB1cml0eSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBiLWdsYXNzLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBiLWxhYmVsXCI+TmV0IFdlaWdodDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYi12YWx1ZVwiPnt7IGVsZT8ucXVhbnRpdHkgfX0ge3sgZWxlPy51bml0IHwgdGl0bGVjYXNlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItZ2xhc3Mtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGItbGFiZWxcIj5SYXRlIC8ge3sgZWxlPy51bml0IHwgdGl0bGVjYXNlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBiLXZhbHVlXCI+4oK5e3sgZWxlPy5wcmljZVBlclVuaXQgfCBudW1iZXI6JzEuMi0yJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBiLWdsYXNzLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBiLWxhYmVsXCI+VmFsdWU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGItdmFsdWVcIj7igrl7eyAoZWxlPy5xdWFudGl0eSAqIGVsZT8ucHJpY2VQZXJVbml0KSB8IG51bWJlcjonMS4yLTInIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBNYWtpbmcgQ2hhcmdlcyBjYXJkIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItZ2xhc3MtY2FyZFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi1nbGFzcy1oZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiJyNmZmYnXCI+XHJcbiAgICAgICAgICAgICAgICBNYWtpbmcgQ2hhcmdlc1xyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi1nbGFzcy1yb3dcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGItbGFiZWxcIj5OZXQgV2VpZ2h0PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYi12YWx1ZVwiPnt7IHJlc3BvbnNlRGF0YT8uYmFzZVdlaWdodCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItZ2xhc3Mtcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBiLWxhYmVsXCI+TWFraW5nIENoYXJnZSAlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYi12YWx1ZVwiPnt7IHJlc3BvbnNlRGF0YT8ubWFraW5nQ2hhcmdlUGVyY2VudGFnZSB9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBiLWdsYXNzLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYi1sYWJlbFwiPlZhbHVlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYi12YWx1ZVwiPuKCuXt7IHJlc3BvbnNlRGF0YT8uamV3ZWxyeVByaWNlQnJlYWt1cD8ubWFraW5nQ2hhcmdlQW1vdW50IHwgbnVtYmVyOicxLjItMicgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBTdW1tYXJ5IGNhcmQgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi1zdW1tYXJ5LWNhcmRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItc3VtbWFyeS1yb3dcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlRvdGFsIFZhbHVlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+4oK5e3sgcmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy5wcmljZVdpdGhvdXRUYXggfCBudW1iZXI6JzEuMi0yJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItc3VtbWFyeS1yb3dcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlRheCAoe3sgcmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy50YXhSZWY/LnRheFBlcmNlbnQgfX0lIEdTVCk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj7igrl7eyByZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/LnRheEFtb3VudCB8IG51bWJlcjonMS4yLTInIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi1ncmFuZC10b3RhbFwiXHJcbiAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCInI2ZmZidcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlRPVEFMPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+4oK5e3sgKHJlc3BvbnNlRGF0YT8uamV3ZWxyeVByaWNlQnJlYWt1cD8ucHJpY2VXaXRob3V0VGF4ICsgcmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy50YXhBbW91bnQpIHwgbnVtYmVyOicxLjItMicgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvc2VjdGlvbj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNlbnRWaWV3SXRlbUxpc3Q/Lmxlbmd0aFwiPlxyXG4gICAgICA8c2ltcG8tZmVhdHVyZWQtcHJvZHVjdHMgW2VkaXRdPVwiZmFsc2VcIiBbZGF0YV09XCJmZWF0dXJlUHJvZHVjdERhdGFcIiBbcmVzcG9uc2VEYXRhXT1cInJlY2VudFZpZXdJdGVtTGlzdFwiXHJcbiAgICAgICAgW2lzUmVsYXRlZFByb2R1Y3RdPVwidHJ1ZVwiIChjaGFuZ2VEZXRhaWxQcm9kdWN0KT1cImNoYW5nZVByb2R1Y3QoJGV2ZW50KVwiPjwvc2ltcG8tZmVhdHVyZWQtcHJvZHVjdHM+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlY2VudFZpZXdJdGVtTGlzdD8ubGVuZ3RoXCI+XHJcbiAgICAgIDxzaW1wby1mZWF0dXJlZC1wcm9kdWN0cyBbZWRpdF09XCJmYWxzZVwiIFtkYXRhXT1cInJlY2VudFZpZXdlZERhdGFcIiBbcmVzcG9uc2VEYXRhXT1cInJlY2VudFZpZXdJdGVtTGlzdFwiXHJcbiAgICAgICAgW2lzUmVsYXRlZFByb2R1Y3RdPVwidHJ1ZVwiPjwvc2ltcG8tZmVhdHVyZWQtcHJvZHVjdHM+XHJcbiAgICA8L25nLWNvbnRhaW5lcj4gLS0+XHJcbiAgICA8IS0tIDxuZy1jb250YWluZXI+XHJcbiAgICAgIDxzaW1wby1jdXN0b21lci1yZXZpZXcgW2RhdGFdPVwiZGF0YVwiPjwvc2ltcG8tY3VzdG9tZXItcmV2aWV3PlxyXG4gICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdHlsZXM/LmRldmlkZXI/LmRpc3BsYXlcIj5cclxuICAgICAgPHNpbXBvLXN2Zy1kaXZpZGVyIFtkaXZpZGVyVHlwZV09XCJzdHlsZXM/LmRldmlkZXI/LmRldmlkZXJUeXBlXCJcclxuICAgICAgICBbY29sb3JdPVwibmV4dENvbXBvbmVudENvbG9yPy5jb2xvclwiPjwvc2ltcG8tc3ZnLWRpdmlkZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxkaXYgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBlZGl0fVwiICpuZ0lmPVwic2hvd0VkaXRvcnNcIj5cclxuICAgICAgPHNpbXBvLWhvdmVyLWVsZW1lbnRzIFtkYXRhXT1cImRhdGFcIiBbaW5kZXhdPVwiaW5kZXhcIiBbZWRpdE9wdGlvbnNdPVwiZWRpdFwiPjwvc2ltcG8taG92ZXItZWxlbWVudHM+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJzaG93RGVsZXRlXCIgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBkZWxldGV9XCI+XHJcbiAgICAgIDxzaW1wby1kZWxldGUtaG92ZXItZWxlbWVudCBbZGF0YV09XCJkYXRhXCIgW2luZGV4XT1cImluZGV4XCI+PC9zaW1wby1kZWxldGUtaG92ZXItZWxlbWVudD5cclxuICAgIDwvZGl2PlxyXG4gIDwvc2VjdGlvbj5cclxuPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuPG5neC1za2VsZXRvbi1sb2FkZXIgKm5nSWY9XCJpc0xvYWRpbmdcIiBjb3VudD1cIjFcIiBhcHBlYXJhbmNlPVwiY2lyY2xlXCIgW3RoZW1lXT1cIntcclxuICB3aWR0aDogJzEwMCUnLFxyXG4gIGhlaWdodDogJzQwdmgnLFxyXG4gICdib3JkZXItcmFkaXVzJzogJzEwcHgnLFxyXG4gICdwb3NpdGlvbic6ICdyZWxhdGl2ZScsXHJcbiAgJ3JpZ2h0JzogJzVweCdcclxufVwiPlxyXG48L25neC1za2VsZXRvbi1sb2FkZXI+XHJcblxyXG5cclxuPGRpdiBjbGFzcz1cIm1vYmlsZS1mb290ZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwiaWNvbnNcIj5cclxuICAgIDxkaXYgKGNsaWNrKT1cImdvVG9DYXJ0KClcIj5cclxuICAgICAgPG1hdC1pY29uPnNob3BwaW5nX2NhcnQ8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwiYWRkVG9GYXZvdXJpdGUoKVwiXHJcbiAgICAgICAgKm5nSWY9XCIhaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlX2JvcmRlcjwvbWF0LWljb24+XHJcbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIChjbGljayk9XCJyZW1vdmVUb0Zhdm91cml0ZSgpXCJcclxuICAgICAgICAqbmdJZj1cImlzSXRlbUFzRmF2b3JpdGVcIj5mYXZvcml0ZTwvbWF0LWljb24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8YnV0dG9uIGNsYXNzPVwib3V0LW9mLXN0b2NrIHRleHQtY2VudGVyXCIgKm5nSWY9XCJpc0l0ZW1PdXRPZlN0b2NrXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCJcclxuICAgIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgwKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgwKVwiIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxyXG4gICAgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDApXCI+T3V0IG9mXHJcbiAgICBTdG9jazwvYnV0dG9uPlxyXG4gIDxkaXYgY2xhc3M9XCJxdWFudGl0eVwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIlxyXG4gICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwbHVzXCIgKGNsaWNrKT1cImFkZFRvQ2FydCgnU1VCU1RSQUNUJylcIiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPi08L2Rpdj5cclxuICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGZjXCJcclxuICAgICAgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj57e3Jlc3BvbnNlRGF0YT8ucXVhbnRpdHl9fTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1pbnVzXCIgKGNsaWNrKT1cImFkZFRvQ2FydCgnQUREJylcIiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPis8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8YnV0dG9uICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiBlY29tQ29uZmlncz8udmlkZW9DYWxsRW5hYmxlZFwiIGNsYXNzPVwic2VuZC1idG4gdy0xMDBcIlxyXG4gICAgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDApXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDApXCJcclxuICAgIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIiBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIiAoY2xpY2spPVwiIWVkaXQgPyBvcGVuRGlhbG9nQm94KGRpYWxvZ0JveCkgOiAnJ1wiPlxyXG4gICAgPG1hdC1pY29uPnZpZGVvY2FtPC9tYXQtaWNvbj5MSVZFIFZJREVPIENBTEw8L2J1dHRvbj5cclxuICA8ZGl2ICpuZ0lmPVwiIXJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2tcIiBjbGFzcz1cInctNzVcIj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJzZW5kLWJ0biB3LTEwMFwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlXHJcbiAgICAgIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgwKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgwKVwiIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxyXG4gICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIlxyXG4gICAgICAoY2xpY2spPVwiIWVkaXQgPyBhZGRUb0NhcnQoKSA6ICcnXCI+PG1hdC1pY29uPnNob3BwaW5nX2NhcnQ8L21hdC1pY29uPnt7ZGF0YT8uYWN0aW9uPy5idXR0b25zPy5bMF0/LmNvbnRlbnQ/LmxhYmVsfX08L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI1Jldmlld1NlY3Rpb24+XHJcbiAgPGRpdiBjbGFzcz1cInJldmlldy1zZWNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPkN1c3RvbWVyIFJldmlldzwvZGl2PlxyXG4gICAgPHAtcmF0aW5nIFtjYW5jZWxdPVwiZmFsc2VcIiBbcmVhZG9ubHldPVwidHJ1ZVwiIFsobmdNb2RlbCldPVwidG90YWxSZXZpZXdcIiAvPlxyXG4gICAgPHNwYW4+QmUgdGhlIGZpcnN0IHRvIHdyaXRlIGEgcmV2aWV3PC9zcGFuPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cIm10LTNcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbaWRdPVwiYnV0dG9uSWRcIiBbYnV0dG9uU3R5bGVdPVwiYnV0dG9uPy5zdHlsZXNcIlxyXG4gICAgICBbYmFja2dyb3VuZEluZm9dPVwic3R5bGVzPy5iYWNrZ3JvdW5kXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIChjbGljayk9XCJzaG93UmV2aWV3ID0gIXNob3dSZXZpZXdcIj57eyAhc2hvd1JldmlldyA/ICdBZGRcclxuICAgICAgUmV2aWV3JyA6ICdDYW5jZWwgUmV2aWV3J319PC9idXR0b24+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1Jldmlld1wiPlxyXG4gICAgICA8aHIgLz5cclxuICAgICAgPGRpdiBjbGFzcz1cInVzZXItcmV2aWV3XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+V3JpdGUgYSByZXZpZXc8L2Rpdj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlY29uZGFyeS10ZXh0XCI+UkFUSU5HPC9zcGFuPlxyXG4gICAgICAgIDxwLXJhdGluZyBbKG5nTW9kZWwpXT1cInByb2R1Y3RSZXZpZXdcIiBbY2FuY2VsXT1cImZhbHNlXCIgW3JlYWRvbmx5XT1cImZhbHNlXCIgLz5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiPlJldmlldyBUaXRsZTwvc3Bhbj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiR2l2ZSB5b3VyIHJldmlldyBhIHRpdGxlXCIgWyhuZ01vZGVsKV09XCJyZXZpZXdUaXRsZVwiPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlY29uZGFyeS10ZXh0XCI+UmV2aWV3PC9zcGFuPlxyXG4gICAgICAgICAgPHRleHRhcmVhIHBsYWNlaG9sZGVyPVwiV3JpdGUgeW91ciBjb21tZW50cyBoZXJlXCIgWyhuZ01vZGVsKV09XCJyZXZpZXdEZXNjcmlwdGlvblwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJldmlldy1hY3Rpb24tYnRuXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwic2hvd1JldmlldyA9IGZhbHNlXCI+Q2FuY2VsIHJldmlldzwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbaWRdPVwiYnV0dG9uSWRcIiBbYnV0dG9uU3R5bGVdPVwiYnV0dG9uPy5zdHlsZXNcIlxyXG4gICAgICAgICAgICBbYmFja2dyb3VuZEluZm9dPVwic3R5bGVzPy5iYWNrZ3JvdW5kXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkUHJvZHVjdFJldmlldygpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInByb2R1Y3RSZXZpZXcgPT0gMCAmJiAhcmV2aWV3VGl0bGU/Lmxlbmd0aCAmJiAhcmV2aWV3RGVzY3JpcHRpb24/Lmxlbmd0aFwiPlN1Ym1pdFxyXG4gICAgICAgICAgICByZXZpZXc8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjU29jaWFsSWNvbnM+XHJcbiAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBhbGlnbi1pdGVtcy1sZy1jZW50ZXIgZmxleC1jb2x1bW4gZmxleC1sZy1yb3cgZ2FwLWxnLTAgZ2FwLTNcIlxyXG4gICAgICBbbmdDbGFzc109XCJkYXRhPy5jb250ZW50Py5zb2NpYWxMaW5rcz8uZGlzcGxheSA/ICdqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbicgOiAnanVzdGlmeS1jb250ZW50LWVuZCdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBtdC0wXCIgKm5nSWY9XCJkYXRhPy5jb250ZW50Py5zb2NpYWxMaW5rcz8uZGlzcGxheVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YT8uY29udGVudD8uc29jaWFsTGlua3M/LmNoYW5uZWxzXCI+XHJcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO21hcmdpbi1yaWdodDogMTBweDtcIj5cclxuICAgICAgICAgICAgPHNpbXBvLXNvY2lhLWljb25zIFtzb2NpYWxJY29uRGF0YV09XCJpdGVtXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIj48L3NpbXBvLXNvY2lhLWljb25zPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI0FjdGlvbkJ0bj5cclxuICA8ZGl2IGNsYXNzPVwiYnV0dG9uLXBhcmVudFwiPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cIm91dC1vZi1zdG9jayB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiaXNJdGVtT3V0T2ZTdG9ja1wiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXHJcbiAgICAgIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgwKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgwKVwiIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxyXG4gICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIj5PdXQgb2ZcclxuICAgICAgU3RvY2s8L2J1dHRvbj5cclxuICAgIDxkaXYgY2xhc3M9XCJxdWFudGl0eVwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIlxyXG4gICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGx1c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ1NVQlNUUkFDVCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4tPC9kaXY+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGZjXCJcclxuICAgICAgICBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPnt7cmVzcG9uc2VEYXRhPy5xdWFudGl0eX19PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtaW51c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ0FERCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4rPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxidXR0b24gKm5nSWY9XCJyZXNwb25zZURhdGE/LnF1YW50aXR5ICYmIGVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCIgY2xhc3M9XCJzZW5kLWJ0biB3LTEwMFwiXHJcbiAgICAgIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgwKVwiXHJcbiAgICAgIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgwKVwiIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIiBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIlxyXG4gICAgICAoY2xpY2spPVwiIWVkaXQgPyBvcGVuRGlhbG9nQm94KGRpYWxvZ0JveCkgOiAnJ1wiPlxyXG4gICAgICA8bWF0LWljb24+dmlkZW9jYW08L21hdC1pY29uPkxJVkUgVklERU8gQ0FMTDwvYnV0dG9uPlxyXG4gICAgPGRpdiAqbmdJZj1cIighcmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9jaykgJiYgSXNFY29tbWVyY2VcIiBjbGFzcz1cInctNzVcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIHctMTAwXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgc2ltcG9CdXR0b25EaXJlY3RpdmVcclxuICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIlxyXG4gICAgICAgIChjbGljayk9XCIhZWRpdCA/IGFkZFRvQ2FydCgpIDogJydcIj48bWF0LWljb24+c2hvcHBpbmdfY2FydDwvbWF0LWljb24+e3tkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXT8uY29udGVudD8ubGFiZWx9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiKCFyZXNwb25zZURhdGE/LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrKSAmJiBJc0Vjb21tZXJjZVwiIGNsYXNzPVwidy03NSBtdC0yXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJzZW5kLWJ0biB3LTEwMFwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlXHJcbiAgICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDApXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDApXCIgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXHJcbiAgICAgICAgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDApXCJcclxuICAgICAgICAoY2xpY2spPVwiIWVkaXQgPyBidXlOb3coKSA6ICcnXCI+QnV5IE5vdzwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiKCFyZXNwb25zZURhdGE/LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrKSAmJiAhSXNFY29tbWVyY2VcIiBjbGFzcz1cInctNzVcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIHctMTAwXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgc2ltcG9CdXR0b25EaXJlY3RpdmVcclxuICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIiAoY2xpY2spPVwicmFpc2VMZWFkKClcIj48bWF0LWljb24gc3R5bGU9XCJoZWlnaHQ6MTRweCAhaW1wb3J0YW50XCI+XHJcbiAgICAgICAgICBtZXNzYWdlPC9tYXQtaWNvbj5Ob3RpZnkgTWU8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZhdm91cml0ZVwiICpuZ0lmPVwiSXNFY29tbWVyY2VcIiAoY2xpY2spPVwiaXNJdGVtQXNGYXZvcml0ZSA/IHJlbW92ZVRvRmF2b3VyaXRlKCkgOiBhZGRUb0Zhdm91cml0ZSgpXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgKm5nSWY9XCIhaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlX2JvcmRlcjwvbWF0LWljb24+XHJcbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiICpuZ0lmPVwiaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlPC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoYXJlLWljb25cIiAoY2xpY2spPVwic2hhcmVQcm9kdWN0KClcIj5cclxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+c2hhcmU8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3ZhcmlhbnRzPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5zdHlsZXM/LmN1c3RvbWl6YXRpb24gPT0gJ1N0eWxlMSdcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmllbnQgb2YgdmFyaWVudHMgfCBrZXl2YWx1ZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWtleVwiPnt7dmFyaWVudC5rZXl9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiBzdHlsZT1cImdhcDogNXB4O1wiPlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdmFyaWVudFZhbHVlIG9mIHZhcmllbnQudmFsdWVcIiBjbGFzcz1cInZhcmllbnQtdGFnXCJcclxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkVmFyaWVudC5nZXQodmFyaWVudC5rZXkpID09IHZhcmllbnRWYWx1ZSA/ICd3aGl0ZScgOiBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJzZWxlY3RlZFZhcmllbnQuZ2V0KHZhcmllbnQua2V5KSA9PSB2YXJpZW50VmFsdWUgPyBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VmFyaWVudCh2YXJpZW50LmtleSwgdmFyaWVudFZhbHVlKVwiPnt7dmFyaWVudFZhbHVlIHwgdGl0bGVjYXNlfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8uc3R5bGVzPy5jdXN0b21pemF0aW9uID09ICdTdHlsZTInICYmIHNlbGVjdGVkVmFyaWVudC5zaXplID4gMFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yIHN0eWxlMi1jb250YWluZXIgdy0xMDBcIiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2VsZWN0ZWRWYXJpZW50IHwga2V5dmFsdWVcIiBjbGFzcz1cInB4LTMgcHktMiB2YXJpZW50LWl0ZW1cIlxyXG4gICAgICAgICAgW2NsYXNzXT1cImdldENsYXNzKHNlbGVjdGVkVmFyaWVudClcIiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZhcmlhbnQtaGVhZFwiPnt7aXRlbS5rZXkgfCB0aXRsZWNhc2V9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZhcmlhbnQtdmFsdWUgdGV4dC1zdGFydCBmdy1zZW1pYm9sZFwiPlxyXG4gICAgICAgICAgICB7e2l0ZW0udmFsdWUgfFxyXG4gICAgICAgICAgICB0aXRsZWNhc2V9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBwLTBcIiBbY2xhc3NdPVwiZ2V0Q2xhc3Moc2VsZWN0ZWRWYXJpZW50KVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10ZXh0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMCBwLTJcIiBkYXRhLWJzLXRvZ2dsZT1cIm9mZmNhbnZhc1wiXHJcbiAgICAgICAgICAgIGRhdGEtYnMtdGFyZ2V0PVwiI29mZmNhbnZhc1JpZ2h0VmFyaWFudFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0VGV4dENvbG9yKGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IpXCI+Q1VTVE9NSVNFXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjUHJvZHVjdERlc2M+XHJcbiAgPGRpdiBjbGFzcz1cInByb2R1Y3QtaW5mby1taW5pbWFsXCI+XHJcbiAgICA8IS0tIEl0ZW0gQ29kZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJpdGVtLWNvZGUtcm93XCIgKm5nSWY9XCJyZXNwb25zZURhdGE/Lml0ZW1Db2RlXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiaXRlbS1jb2RlLXZhbHVlXCI+e3sgZm9ybWF0SXRlbUNvZGUocmVzcG9uc2VEYXRhPy5pdGVtQ29kZSkgfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFRpdGxlIGFuZCBQcmljZSBSb3cgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGl0bGUtcHJpY2Utcm93LW1vZGVyblwiPlxyXG4gICAgICA8aDEgY2xhc3M9XCJwcm9kdWN0LXRpdGxlLW1vZGVyblwiPnt7cmVzcG9uc2VEYXRhPy5uYW1lfX08L2gxPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1wcmljZS1tb2Rlcm5cIj5cclxuICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImN1cnJlbmN5XCI+PC9zcGFuPiB7e3Jlc3BvbnNlRGF0YT8ucHJpY2U/LnNlbGxpbmdQcmljZX19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBSYXRpbmcgUm93IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJhdGluZy1yb3ctbW9kZXJuXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmF2ZXJhZ2VSYXRpbmdcIj5cclxuICAgICAgPHAtcmF0aW5nIFsobmdNb2RlbCldPVwicmVzcG9uc2VEYXRhLmF2ZXJhZ2VSYXRpbmdcIiBbY2FuY2VsXT1cImZhbHNlXCIgW3JlYWRvbmx5XT1cInRydWVcIj48L3AtcmF0aW5nPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInJhdGluZy1zY29yZVwiPnt7cmVzcG9uc2VEYXRhPy5hdmVyYWdlUmF0aW5nIHwgbnVtYmVyOicxLjEtMSd9fTwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJzZXBhcmF0b3JcIj58PC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInJldmlld3MtbGlua1wiIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XHJcbiAgICAgICAge3tyZXNwb25zZURhdGE/LnRvdGFsUmV2aWV3Q291bnR9fSByZXZpZXdzPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBCcmllZiBEZXNjcmlwdGlvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWJyaWVmLW1vZGVyblwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5icmllZlwiIFtpbm5lckhUTUxdPVwicmVzcG9uc2VEYXRhPy5icmllZiB8IHNhbml0aXplSHRtbFwiPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2Rlc2NyaXB0b3JzPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgcHJvZC1kZXNjIG10LTJcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInByb2R1Y3QtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10ZXh0XCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmRlc2NyaXB0b3IgfHwgcmVzcG9uc2VEYXRhPy5tYXRlcmlhbHNcIj5Qcm9kdWN0IERldGFpbHM8L3NwYW4+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByaWNlYnJlYWt1cC1idG4gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICpuZ0lmPVwibWF0ZXJpYWxCYXNlZFByaWNpbmdcIiBkYXRhLWJzLXRvZ2dsZT1cIm9mZmNhbnZhc1wiIGRhdGEtYnMtdGFyZ2V0PVwiI29mZmNhbnZhc1JpZ2h0UHJpY2VCcmVha3VwXCJcclxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldFRleHRDb2xvcihkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+IFBSSUNFIEJSRUFLVVBcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIj5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDtcIiBjbGFzcz1cImJvZHktbGFyZ2UgYnJpZWYtZGVzY1wiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5kZXNjcmlwdG9yXCJcclxuICAgICAgICAgIFtpbm5lckhUTUxdPVwicmVzcG9uc2VEYXRhPy5kZXNjcmlwdG9yPy5uYW1lIHwgc2FuaXRpemVIdG1sXCJcclxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uY29sb3JcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1hdGVyaWFsQmFzZWRQcmljaW5nXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImpld2VsbGVyeS10YWJsZS1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZSBvZiByZXNwb25zZURhdGE/Lm1hdGVyaWFsc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiamV3ZWwtY29udGFpbmVyIG10LTJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiamV3ZWwtaGVhZGVyXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0SGVhZGVyQ29sb3IoZWxlLm1hdGVyaWFsVHlwZSlcIj5cclxuICAgICAgICAgICAgICAgIHt7ZWxlPy5tYXRlcmlhbE5hbWUgfCB0aXRsZWNhc2V9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbS0wIHctMTAwIGJyLXBcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRCYWNrZ3JvdW5kQ29sb3IoZWxlLm1hdGVyaWFsVHlwZSlcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtZXRhbC1wdXJpdHlcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICBOZXQgV2VpZ2h0L3t7ZWxlPy51bml0IHwgdGl0bGVjYXNlfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ZWxlLnF1YW50aXR5ICsgXCIgXCIgKyAoZWxlPy51bml0IHwgdGl0bGVjYXNlKX19XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWV0YWwtcHVyaXR5XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUHVyaXR5XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2VsZS5wdXJpdHkgfFxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlY2FzZX19XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjSW1hZ2VTZWN0aW9uPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdmFyaWVudExvYWRpbmcgJiYgKGlzTW9iaWxlIHx8IGRhdGE/LnN0eWxlcz8uZ3JpZFN0eWxlID09ICdTdHlsZTEnKVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInN0eWxlLTEtdmVydGljYWwgZC1mbGV4IGZsZXgtY29sdW1uIHctMTAwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYWluLWltYWdlLWNvbnRhaW5lciBwLTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1pbWcgcm91bmRlZC0zXCI+XHJcbiAgICAgICAgICA8bGliLW5neC1pbWFnZS16b29tICpuZ0lmPVwiY3VycmVudEltZ1wiIFt0aHVtYkltYWdlXT1cImN1cnJlbnRJbWdcIiBbZnVsbEltYWdlXT1cImN1cnJlbnRJbWdcIiBbem9vbU1vZGVdPVwiJ2hvdmVyJ1wiXHJcbiAgICAgICAgICAgIFttYWduaWZpY2F0aW9uXT1cIjAuNFwiIFtlbmFibGVTY3JvbGxab29tXT1cImZhbHNlXCI+XHJcbiAgICAgICAgICA8L2xpYi1uZ3gtaW1hZ2Utem9vbT5cclxuICAgICAgICAgIDxpbWcgKm5nSWY9XCIhY3VycmVudEltZ1wiIHNyYz1cImh0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGdcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInctMTAwIGgtMTAwIG9iamVjdC1maXQtY292ZXJcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0aHVtYm5haWwtcm93IHB5LTMgZC1mbGV4IGdhcC0yIG92ZXJmbG93LWF1dG8gaGlkZS1zY3JvbGxcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiaW1nIHRodW1ibmFpbC1pbWdcIiAqbmdGb3I9XCJsZXQgaW1nIG9mIGl0ZW1JbWFnZXNcIiBbc3JjXT1cImltZy5pbWdVcmxcIiAoY2xpY2spPVwiY2hhbmdlSW1nKGltZy5pbWdVcmwpXCJcclxuICAgICAgICAgIFtjbGFzcy5hY3RpdmUtdGh1bWJdPVwiY3VycmVudEltZyA9PSBpbWcuaW1nVXJsXCJcclxuICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBtaW4td2lkdGg6IDgwcHg7IHdpZHRoOiA4MHB4OyBoZWlnaHQ6IDgwcHg7IG9iamVjdC1maXQ6IGNvdmVyOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1wiXHJcbiAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiaW1nLmltZ1VybCA9PSBjdXJyZW50SW1nID8gZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICd0cmFuc3BhcmVudCdcIj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF2YXJpZW50TG9hZGluZyAmJiAoIWlzTW9iaWxlICYmIGRhdGE/LnN0eWxlcz8uZ3JpZFN0eWxlID09ICdTdHlsZTInKVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImJlbnRvLW1hc29ucnktY29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGltZyBvZiBpdGVtSW1hZ2VzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJiZW50by1pdGVtLW1vZGVyblwiPlxyXG4gICAgICAgIDxpbWcgW3NyY109XCJpbWcuaW1nVXJsXCIgY2xhc3M9XCJiZW50by1pbWctbW9kZXJuXCIgKGNsaWNrKT1cImNoYW5nZUltZyhpbWcuaW1nVXJsKVwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiaXRlbS1pbWdcIiAqbmdJZj1cInZhcmllbnRMb2FkaW5nXCI+XHJcbiAgICA8bmd4LXNrZWxldG9uLWxvYWRlciBjb3VudD1cIjFcIiBhcHBlYXJhbmNlPVwiY2lyY2xlXCIgW3RoZW1lXT1cIntcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgICdib3JkZXItcmFkaXVzJzogJzEwcHgnXHJcbiAgICB9XCI+XHJcbiAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2JyYW5kaW5nPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDBcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJyYW5kIG9mIGJyYW5kUHJvbWlzZXNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC00IGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZy0yXCI+XHJcbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIG9uZXJyb3I9XCJ0aGlzLnNyYz0naHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZydcIlxyXG4gICAgICAgICAgW3NyY109XCJicmFuZD8ubG9nb1VybFwiIGFsdD1cIlwiIGNsYXNzPVwidy1oLTQwIHAtMCByb3VuZGVkLWNpcmNsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJicmFuZC10ZXh0IHctMTAwIHRleHQtY2VudGVyIHB5LTJcIj5cclxuICAgICAgICAgIHt7YnJhbmQ/LnRpdGxlIHwgdGl0bGVjYXNlfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdmlkZW9DYWxsU2NoZWR1bGU+XHJcbiAgPCEtLSAqbmdJZj1cImVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCIgLS0+XHJcbiAgPG5nLWNvbnRhaW5lcj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDAgdmlkZW8tY29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCB2aWRlby1jYWxsLWltZ1wiPlxyXG4gICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy8zNTUwMDdjMTc1MzYyMDc3MjY2NjExMjg5LTIyOTIyMTAyM19zbWFsbC5naWZcIlxyXG4gICAgICAgICAgYWx0PVwiXCIgY2xhc3M9XCJ3LTEwMCBoLTEwMCBcIj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOCBhbGlnbi1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1oZWFkLXRleHRcIj5cclxuICAgICAgICAgIExpdmUgVmlkZW8gQ2FsbFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGV4dFwiPlxyXG4gICAgICAgICAgSm9pbiBhIGxpdmUgdmlkZW8gY2FsbCB3aXRoIG91ciBjb25zdWx0YW50cyB0byBzZWUgeW91ciBmYXZvdXJpdGUgZGVzaWducyB1cCBjbG9zZSFcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2NoLWJ0biB0ZXh0LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlXHJcbiAgICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMilcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMilcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgyKVwiIChjbGljayk9XCIhZWRpdCA/IG9wZW5EaWFsb2dCb3goZGlhbG9nQm94KSA6ICcnXCI+XHJcbiAgICAgICAgICBTY2hlZHVsZSBhIFZpZGVvIENhbGxcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjRGVsaXZlcnlTZWN0aW9uPlxyXG4gIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1jb250YWluZXJcIj5cclxuICAgIDxoMiBjbGFzcz1cImRlbGl2ZXJ5LXRpdGxlXCI+RGVsaXZlcnksIFN0b3JlcyAmIFRyaWFsPC9oMj5cclxuXHJcbiAgICA8IS0tIExvY2F0aW9uIFNlY3Rpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tc2VjdGlvbiBtYi0yXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXHJcbiAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWdyb3ctMSBtZS0yXCIgc3R5bGU9XCJ3aWR0aDogY2FsYygxMDAlIC0gMTAwcHgpO1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBteC0xXCI+PG1hdC1pY29uXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJncHMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+Z3BzX2ZpeGVkPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInBvc3RhbC1jb2RlLWlucHV0IGZsZXgtZ3Jvdy0xXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBQaW5Db2RlXCIgWyhuZ01vZGVsKV09XCJwaW5jb2RlXCJcclxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGxvY2F0ZS1idG5cIiAoY2xpY2spPVwiZ2V0U3RvcmVEZXRhaWxzKClcIj5TdWJtaXQ8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNQaW5Db2RlXCIgc3R5bGU9XCJjb2xvcjogcmVkO1wiPlBpbiBjb2RlIG11c3QgYmUgNiBkaWdpdHMuPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHBpbmNvZGU/LnRvU3RyaW5nKCkubGVuZ3RoID8/IDApID09IDZcIj5cclxuICAgICAgPCEtLSBGcmVlIERlbGl2ZXJ5IFNlY3Rpb24gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1zZWN0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGVsaXZlcnktaWNvbiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxzdmcgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiXHJcbiAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBjbGFzcz1cImZlYXRoZXIgZmVhdGhlci1naWZ0XCI+XHJcbiAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjIwIDEyIDIwIDIyIDQgMjIgNCAxMlwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiN1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCI1XCI+PC9yZWN0PlxyXG4gICAgICAgICAgICAgIDxsaW5lIHgxPVwiMTJcIiB5MT1cIjIyXCIgeDI9XCIxMlwiIHkyPVwiN1wiPjwvbGluZT5cclxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDdINy41YTIuNSAyLjUgMCAwIDEgMC01QzExIDIgMTIgNyAxMiA3elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDdoNC41YTIuNSAyLjUgMCAwIDAgMC01QzEzIDIgMTIgNyAxMiA3elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZWxpdmVyeS10ZXh0XCIgKm5nSWY9XCJlY29tQ29uZmlncz8uZGVsaXZlcnlDaGFyZ2VzID09IDBcIj5FeHBlY3RlZFxyXG4gICAgICAgICAgICBEZWxpdmVyeSBieSB7eyBnZXREYXRlQWZ0ZXJ4RGF5cygpIHwgZGF0ZTonZCBNTU0nIH19PC9zcGFuPlxyXG5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGVsaXZlcnktdGV4dFwiICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LmRlbGl2ZXJ5Q2hhcmdlcyA+IDBcIj5Zb3VyXHJcbiAgICAgICAgICAgIGV4cGVjdGVkIE9yZGVyIHdpbGxcclxuICAgICAgICAgICAgRGVsaXZlciBieSB7eyBnZXREYXRlQWZ0ZXJ4RGF5cygpIHwgZGF0ZTonZCBNTU0nIH19IHdpdGggYSBEZWxpdmVyeSBDaGFyZ2Ugb2ZcclxuICAgICAgICAgICAg4oK5IHt7ZWNvbUNvbmZpZ3M/LmRlbGl2ZXJ5Q2hhcmdlcyB8IG51bWJlcjonMS4yLTInfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNUcnlBdEhvbWU+XHJcbiAgPCEtLSBUcnkgQXQgSG9tZSBTZWN0aW9uIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJ0cnktaG9tZS1zZWN0aW9uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IHRyeS1ob21lLWl0ZW1cIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJob21lLWljb24gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgIDxzdmcgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgY2xhc3M9XCJmZWF0aGVyIGZlYXRoZXItaG9tZVwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk0zIDlsOS03IDkgN3YxMWEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiOSAyMiA5IDEyIDE1IDEyIDE1IDIyXCI+PC9wb2x5bGluZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHJ5LWhvbWUtZGV0YWlsc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0cnktaG9tZS1oZWFkZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJ5LWhvbWUtdGV4dFwiPlRyeSBBdCBIb21lPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcmVlLXRleHRcIj4gKEl0J3MgRnJlZSk8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhvbWUtYXBwb2ludG1lbnQtdGV4dFwiPkhvbWUgQXBwb2ludG1lbnQgPHNwYW4+QXZhaWxhYmxlIHRvIHRyeSBmcm9tIDI5IEp1bDwvc3Bhbj48L2Rpdj5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJhcHBvaW50bWVudC10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgSG9tZSBBcHBvaW50bWVudCA8c3BhbiBjbGFzcz1cImFwcG9pbnRtZW50LWF2YWlsYWJsZVwiPkF2YWlsYWJsZSB0byB0cnkgZnJvbSAyOCBKdW48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgtYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJvb2stYXBwb2ludG1lbnQtYnRuXCIgKGNsaWNrKT1cImFkZFRvVHJpYWxDYXJ0KClcIiAqbmdJZj1cIiFpc0l0ZW1BZGRlZEFzVHJpYWxcIj5UcnkgYXRcclxuICAgICAgICBIT01FPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJib29rLWFwcG9pbnRtZW50LWJ0blwiICpuZ0lmPVwiaXNJdGVtQWRkZWRBc1RyaWFsXCI+SE9NRSBBUFBPSU5UTUVOVCBCT09LRUQ8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjU3RvcmVTZWN0aW9uPlxyXG4gIDwhLS0gTmVhcmVzdCBTdG9yZSBTZWN0aW9uIC0tPlxyXG4gIDxuZy1jb250YWluZXJcclxuICAgICpuZ0lmPVwic3RvcmVEZXRhaWxzPy5uZWFyYnlTdG9yZT8uc3RvcmVOYW1lICYmIHN0b3JlRGV0YWlscz8ubmVhcmJ5U3RvcmU/LnN0b3JlTmFtZT8ubGVuZ3RoID4gMFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInN0b3JlLXNlY3Rpb25cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgc3RvcmUtaXRlbVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3RvcmUtaWNvbiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICA8c3ZnIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiXHJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBjbGFzcz1cImZlYXRoZXIgZmVhdGhlci1zaG9wcGluZy1iYWdcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk02IDJMMyA2djE0YTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDItMlY2bC0zLTR6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICA8bGluZSB4MT1cIjNcIiB5MT1cIjZcIiB4Mj1cIjIxXCIgeTI9XCI2XCI+PC9saW5lPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTE2IDEwYTQgNCAwIDAgMS04IDBcIj48L3BhdGg+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlLWRldGFpbHNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS10ZXh0XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RvcmUtbGFiZWxcIj5OZWFyZXN0IFN0b3JlIC0gPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0b3JlLW5hbWVcIj57eyBzdG9yZURldGFpbHM/Lm5lYXJieVN0b3JlPy5zdG9yZU5hbWUgfCB0aXRsZWNhc2V9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInN0b3JlLWRpc3RhbmNlXCI+ICg0a20pPC9zcGFuPiAtLT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiYXZhaWxhYmlsaXR5LXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2YWlsYWJpbGl0eS1iYWRnZVwiPuKPsCBBVkFJTEFCTEUgQlkgMjggSlVOPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJvdGhlci1zdG9yZXMtdGV4dFwiPlxyXG4gICAgICAgICAgICAgIEFsc28gQXZhaWxhYmxlIGluIDxzcGFuIGNsYXNzPVwib3RoZXItc3RvcmVzLWxpbmtcIj4xOCBvdGhlciBzdG9yZXM8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciB3LTEwMFwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJmaW5kLXN0b3JlLWJ0biB3LTEwMFwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlXHJcbiAgICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMSlcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMSlcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgxKVwiIChjbGljayk9XCJvbkZpbmRJblN0b3JlKHN0b3JlRGV0YWlscz8ubmVhcmJ5U3RvcmU/LmlkKVwiPkZJTkQgSU5cclxuICAgICAgICAgIFNUT1JFPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbiAgPG5nLXRlbXBsYXRlICNlbXB0eVN0b3JlPlxyXG4gICAgPGRpdiBjbGFzcz1cImRlbGl2ZXJ5LXNlY3Rpb25cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRlbGl2ZXJ5LWljb24gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgPHN2ZyBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIlxyXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgY2xhc3M9XCJmZWF0aGVyIGZlYXRoZXItc2hvcHBpbmctYmFnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNiAyTDMgNnYxNGEyIDIgMCAwIDAgMiAyaDE0YTIgMiAwIDAgMCAyLTJWNmwtMy00elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgPGxpbmUgeDE9XCIzXCIgeTE9XCI2XCIgeDI9XCIyMVwiIHkyPVwiNlwiPjwvbGluZT5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xNiAxMGE0IDQgMCAwIDEtOCAwXCI+PC9wYXRoPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGVsaXZlcnktdGV4dFwiPk5vIFN0b3JlcyBhcmUgYXZhaWxhYmxlPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48ZGl2IGNsYXNzPVwib2ZmY2FudmFzIG9mZmNhbnZhcy1lbmQgb2ZmY2FudmFzLXZhcmlhbnRcIiB0YWJpbmRleD1cIi0xXCIgaWQ9XCJvZmZjYW52YXNSaWdodFZhcmlhbnRcIlxyXG4gIGFyaWEtbGFiZWxsZWRieT1cIm9mZmNhbnZhc1JpZ2h0TGFiZWxcIj5cclxuICA8ZGl2IGNsYXNzPVwidmFyaWVudC1oZWFkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtZW5kIHAtMlwiPlxyXG4gICAgPG1hdC1pY29uIGRhdGEtYnMtZGlzbWlzcz1cIm9mZmNhbnZhc1wiXHJcbiAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGZzLTVcIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInZhcmllbnQtcHJpY2UgcHgtMyBwYi0yXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHJpY2UtdGV4dFwiPlByaWNlPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4ICBnLTMgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwcmljZVwiIFtuZ0NsYXNzXT1cInsnZGlzY291bnQtcHJpY2UnOiByZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2V9XCJcclxuICAgICAgICAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZSAmJiByZXNwb25zZURhdGEucHJpY2UuZGlzY291bnRlZFByaWNlID4gMFwiPjxzcGFuXHJcbiAgICAgICAgICBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cclxuICAgICAgICB7e3Jlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZX19PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwcmljZVwiXHJcbiAgICAgICAgKm5nSWY9XCJyZXNwb25zZURhdGE/LnByaWNlPy5zZWxsaW5nUHJpY2UgJiYgZ2V0RGlmZmVyZW5jZShyZXNwb25zZURhdGE/LnByaWNlPy5zZWxsaW5nUHJpY2UsIHJlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZSkgPiAyXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7J3RleHQtZGVjb3JhdGlvbi1saW5lLXRocm91Z2gnOiByZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2V9XCI+PHNwYW5cclxuICAgICAgICAgIFtpbm5lckhUTUxdPSdjdXJyZW5jeSc+PC9zcGFuPlxyXG4gICAgICAgIHt7cmVzcG9uc2VEYXRhPy5wcmljZT8uc2VsbGluZ1ByaWNlIHwgbnVtYmVyOicxLjAtMCd9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInZhcmllbnQtY29udGFpbmVyIGgtMTAwIHAtM1wiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWVudCBvZiB2YXJpZW50cyB8IGtleXZhbHVlXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWRhdGFcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidmFyaWVudC1rZXlcIj57e3ZhcmllbnQua2V5fX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgc3R5bGU9XCJnYXA6IDVweDtcIj5cclxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHZhcmllbnRWYWx1ZSBvZiB2YXJpZW50LnZhbHVlXCIgY2xhc3M9XCJ2YXJpZW50LXRhZ1wiXHJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzZWxlY3RlZFZhcmllbnQuZ2V0KHZhcmllbnQua2V5KSA9PSB2YXJpZW50VmFsdWUgPyAnd2hpdGUnIDogZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwic2VsZWN0ZWRWYXJpZW50LmdldCh2YXJpZW50LmtleSkgPT0gdmFyaWVudFZhbHVlID8gZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICcnXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFZhcmllbnQodmFyaWVudC5rZXksIHZhcmllbnRWYWx1ZSlcIj57e3ZhcmllbnRWYWx1ZSB8IHRpdGxlY2FzZX19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbmZpcm0tYnRuIHctMTAwIHAtMyB0ZXh0LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiIGRhdGEtYnMtZGlzbWlzcz1cIm9mZmNhbnZhc1wiXHJcbiAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgc3R5bGU9XCJjb2xvcjogd2hpdGU7XCI+Q29uZmlybVxyXG4gICAgQ3VzdG9taXphdGlvbjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGlhbG9nQm94PlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtLWNlbnRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZy12aWRlbyB3LTEwMCBweS0yIHRleHQtY2VudGVyXCI+TGl2ZSBWaWRlbyBjYWxsIGF0IHlvdXIgY29udmVuaWVuY2UhPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzY2hlZHVsZS1oZWFkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtZW5kIHAtMlwiPlxyXG4gICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwibWF0Q2xvc2VEaWFsb2coKVwiXHJcbiAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmcy01XCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgaC0xMDBcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBoLTEwMCB3LTEwMCB2aWRlby1jYWxsLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBoLTEwMFwiICpuZ0lmPVwiIWlzTW9iaWxlXCI+XHJcbiAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvNTU3Njk5YzE3NTM3Nzk1MDM5MTNmcmVlcGlrLW92ZXJoZWFkLXNob3QtYS1wZXJzb24taG9sZGluZy1hLXNtYXJ0cGhvbmUtd2l0aC1hLTEwMjlfdm1nOEdxSGogKG9ubGluZS12aWRlby1jdXR0ZXIuY29tKS5naWZcIlxyXG4gICAgICAgICAgICBhbHQ9XCJcIiBjbGFzcz1cInctMTAwIGgtMTAwXCIgc3R5bGU9XCJvYmplY3QtZml0OiBjb3ZlcjtcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgcG9zaXRpb24tcmVsYXRpdmUgaC0xMDAgY2FsbC1kZXRhaWxzXCI+XHJcbiAgICAgICAgICA8IS0tIE5hbWUgSW5wdXQgd2l0aCBWYWxpZGF0aW9uIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkIG15LTNcIiBbY2xhc3MuZXJyb3ItYm9yZGVyXT1cInZhbGlkYXRpb25FcnJvcnMudXNlcm5hbWVcIj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBOYW1lKlwiIFsobmdNb2RlbCldPVwidmlkZW9DYWxsUGF5bG9hZC51c2VybmFtZVwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJ3VzZXJuYW1lJylcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkIG15LTNcIiBbY2xhc3MuZXJyb3ItYm9yZGVyXT1cInZhbGlkYXRpb25FcnJvcnMuZW1haWxcIj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJlbWFpbFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgRW1haWwqXCIgWyhuZ01vZGVsKV09XCJ2aWRlb0NhbGxQYXlsb2FkLmVtYWlsXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgnZW1haWwnKVwiPlxyXG4gICAgICAgICAgPC9kaXY+IC0tPlxyXG5cclxuICAgICAgICAgIDwhLS0gTW9iaWxlIE51bWJlciBJbnB1dCB3aXRoIFZhbGlkYXRpb24gLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZmllbGQgbXktM1wiIFtjbGFzcy5lcnJvci1ib3JkZXJdPVwidmFsaWRhdGlvbkVycm9ycy5tb2JpbGVOdW1iZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10ZXh0LWNhbGxcIj5JTiArOTE8L2Rpdj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBwbGFjZWhvbGRlcj1cIkVudGVyIE1vYmlsZSpcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgnbW9iaWxlTnVtYmVyJylcIiAod2hlZWwpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICA8IS0tIFBpbmNvZGUgSW5wdXQgd2l0aCBWYWxpZGF0aW9uIC0tPlxyXG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiaW5wdXQtZmllbGQgbXktM1wiIFtjbGFzcy5lcnJvci1ib3JkZXJdPVwidmFsaWRhdGlvbkVycm9ycy5waW5jb2RlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGV4dC1jYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHctMTIgYm9yZGVyLTBcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJmLTE4IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPmdwc19maXhlZDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgUGluIENvZGUqXCIgY2xhc3M9XCJ3LTg4XCIgWyhuZ01vZGVsKV09XCJ2aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGVcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCdwaW5jb2RlJylcIj5cclxuICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZSBteS0zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW5pLXRleHQgbWItMlwiPkxhbmd1YWdlIFByZWZlcmVuY2U8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhbmd1YWdlLWNvbnRhaW5lciBkLWZsZXggZ2FwLTIgZmxleC13cmFwIG10LTFcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsYW5nIG9mIGxhbmd1YWdlc1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhbmcgcHgtMiBweS0xIHJvdW5kZWQgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJsYW5nID09IHNlbGVjdGVkTGFuZyA/IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZExhbmcgPSBsYW5nXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImxhbmcgPT0gc2VsZWN0ZWRMYW5nID8gZ2V0VGV4dENvbG9yKGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IpIDogJyMwMDAwMDAnXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7bGFuZ319XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZExhbmcgPT0gJ090aGVycydcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkIG15LTNcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIE90aGVyIExhbmd1YWdlXCIgWyhuZ01vZGVsKV09XCJvdGhlckxhbmd1YWdlXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidmlkZW8tYnRuIG10LTIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgW2Rpc2FibGVkXT1cImlzU3VibWl0dGluZ1wiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiBbc3R5bGUuY29sb3JdPVwiZ2V0VGV4dENvbG9yKGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IpXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1N1Ym1pdHRpbmdcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc20gbWUtMlwiIHJvbGU9XCJzdGF0dXNcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICBTQ0hFRFVMSU5HLi4uXHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU3VibWl0dGluZyAmJiAhc2NoZWR1bGVkXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwic2NoZWR1bGVWaWRlb0NhbGwoKVwiIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPnZpZGVvX2NhbGw8L21hdC1pY29uPiZuYnNwO1xyXG4gICAgICAgICAgICAgICAgU0NIRURVTEUgQSBWSURFTyBDQUxMXHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2NoZWR1bGVkXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgU0NIRURVTEVEIFNVQ0NFU1NGVUxMWVxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPGRpdiBjbGFzcz1cIm9mZmNhbnZhcyBvZmZjYW52YXMtZW5kIG9mZmNhbnZhcy1zbWFsbCBvdmVyZmxvdy1zY3JvbGxcIiB0YWJpbmRleD1cIi0xXCIgaWQ9XCJvZmZjYW52YXNSaWdodFByaWNlQnJlYWt1cFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1lbmQgcC0yXCI+XHJcbiAgICA8bWF0LWljb24gZGF0YS1icy1kaXNtaXNzPVwib2ZmY2FudmFzXCJcclxuICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZnMtNVwiPmNsb3NlPC9tYXQtaWNvbj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwidmFyaWVudC1wcmljZSBwLTEwLTIwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHJpY2UtYnJlYWstaGVhZGVyXCI+e3tyZXNwb25zZURhdGE/Lm5hbWV9fTwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJwcmljZS1icmVha3VwIGgtMTAwIHctMTAwXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGUgb2YgcmVzcG9uc2VEYXRhPy5tYXRlcmlhbHNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInByaWNlLWNvbnRhaW5lciBtYi0zIHAtMTAtMjBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJpY2UtY29udGFpbmVyLWhlYWRlclwiPlxyXG4gICAgICAgICAge3sgZWxlLm1hdGVyaWFsVHlwZSArIFwiIEJSRUFLVVBcIiB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDAgaGVhZGVyLXJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyXCI+Q09NUE9ORU5UPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXJcIj5SQVRFPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXJcIj5XRUlHSFQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPkZJTkFMIFZBTFVFPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMCB2YWx1ZS1yb3dcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPnt7IGVsZS5wdXJpdHkgfCB0aXRsZWNhc2UgfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPuKCuXt7IGdldFByaWNlUGVyR3JhbShlbGUucHJpY2VQZXJVbml0LGVsZS5tYXRlcmlhbFR5cGUpIHxcclxuICAgICAgICAgICAgbnVtYmVyOicxLjItMicgfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPnt7ZWxlLnF1YW50aXR5ICsgJyAnICsgKGVsZS51bml0IHwgdGl0bGVjYXNlKX19PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXIgdG90YWxcIj7igrl7eyBlbGUucHJpY2VQZXJVbml0ICogZWxlLnF1YW50aXR5IHwgbnVtYmVyIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInByaWNlLWNvbnRhaW5lciBtYi0zIHAtMTAtMzAgcHktMCBib3JkZXItdW5zZXRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMCBzdW1tYXJ5LXJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiB0ZXh0LXN0YXJ0XCI+TWFraW5nIENoYXJnZXM8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgdGV4dC1lbmQgdG90YWxcIj7igrl7eyByZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/Lm1ha2luZ0NoYXJnZUFtb3VudCB8IG51bWJlcjonMS4yLTInIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHN1bW1hcnktcm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHRleHQtc3RhcnRcIj5UYXggQW1vdW50PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHRleHQtZW5kIHRvdGFsXCI+4oK5e3sgcmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy50YXhBbW91bnQgfCBudW1iZXI6JzEuMi0yJyB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMCBzdW1tYXJ5LXJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiB0ZXh0LXN0YXJ0XCI+VG90YWwgQW1vdW50PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHRleHQtZW5kIHRvdGFsXCI+XHJcbiAgICAgICAgICDigrl7eyhyZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/LnByaWNlV2l0aG91dFRheCArIHJlc3BvbnNlRGF0YT8uamV3ZWxyeVByaWNlQnJlYWt1cD8udGF4QW1vdW50KSB8XHJcbiAgICAgICAgICBudW1iZXI6JzEuMi0yJ319XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNSZXZpZXdzU2VjdGlvbj5cclxuICA8ZGl2IGNsYXNzPVwicnYtc2VjdGlvblwiICpuZ0lmPVwicmV2aWV3c0RhdGFcIj5cclxuXHJcbiAgICA8IS0tIEhlYWRlcjogVGl0bGUgKyBBdmVyYWdlIHwgQmFyIENoYXJ0IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJ2LWhlYWRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicnYtaGVhZGVyLWxlZnRcIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJydi10aXRsZVwiPlJldmlld3MgJmFtcDsgUmF0aW5nczwvaDI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJ2LWF2ZXJhZ2Utcm93XCI+XHJcbiAgICAgICAgICA8IS0tIGZpbGxlZCBzdGFycyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1zdGFyc1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzIG9mIFsxLDIsMyw0LDVdXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICBkPVwiTTEzLjk3MTggNS4zNjQ1M0MxMy45Mzk4IDUuMjYyOTggMTMuODc5OCA1LjE3MjUyIDEzLjc5ODYgNS4xMDM1NkMxMy43MTc1IDUuMDM0NiAxMy42MTg2IDQuOTg5OTQgMTMuNTEzMiA0Ljk3NDcyTDkuMzcwNDMgNC4zNzA4OEw3LjUxMzA3IDAuNjE3OTU1QzcuNDYwMjEgMC41MjkyNzEgNy4zODUyMiAwLjQ1NTgzNCA3LjI5NTQ1IDAuNDA0ODM2QzcuMjA1NjggMC4zNTM4MzggNy4xMDQyIDAuMzI3MDI2IDcuMDAwOTYgMC4zMjcwMjZDNi44OTc3MSAwLjMyNzAyNiA2Ljc5NjI0IDAuMzUzODM4IDYuNzA2NDcgMC40MDQ4MzZDNi42MTY3IDAuNDU1ODM0IDYuNTQxNzEgMC41MjkyNzEgNi40ODg4NSAwLjYxNzk1NUw0LjYzMTQ5IDQuMzcwODhMMC40ODg3NDYgNC45NzQ3MkMwLjM4MzM2MyA0Ljk4OTk0IDAuMjg0NDE2IDUuMDM0NiAwLjIwMzI4NiA1LjEwMzU2QzAuMTIyMTU3IDUuMTcyNTIgMC4wNjIxNDA3IDUuMjYyOTggMC4wMzAxNCA1LjM2NDUzQy0wLjAwNDAyMjg2IDUuNDY1NzEgLTAuMDA5MjQ0MjggNS41NzQ0MiAwLjAxNTA2NDUgNS42Nzg0MUMwLjAzOTM3MzMgNS43ODI0IDAuMDkyMjQ1NyA1Ljg3NzUzIDAuMTY3NzIyIDUuOTUzMDhMMy4xNzkyNCA4Ljg3Mjg3TDIuNDY4NCAxMy4wMDAzQzIuNDUwMzggMTMuMTA2NiAyLjQ2MjI5IDEzLjIxNTggMi41MDI3OCAxMy4zMTU3QzIuNTQzMjggMTMuNDE1NiAyLjYxMDc3IDEzLjUwMjIgMi42OTc3IDEzLjU2NTlDMi43ODQ3NyAxMy42MjggMi44ODc0NiAxMy42NjQ0IDIuOTk0MTYgMTMuNjcxMkMzLjEwMDg3IDEzLjY3OCAzLjIwNzMzIDEzLjY1NDcgMy4zMDE1MyAxMy42MDQyTDcuMDAwOTYgMTEuNjU1MUwxMC43MDggMTMuNjA0MkMxMC43OSAxMy42NDkxIDEwLjg4MiAxMy42NzI4IDEwLjk3NTUgMTMuNjczQzExLjA5NTggMTMuNjcxNiAxMS4yMTI5IDEzLjYzNDMgMTEuMzExOSAxMy41NjU5QzExLjM5ODggMTMuNTAyMiAxMS40NjYzIDEzLjQxNTYgMTEuNTA2OCAxMy4zMTU3QzExLjU0NzMgMTMuMjE1OCAxMS41NTkyIDEzLjEwNjYgMTEuNTQxMiAxMy4wMDAzTDEwLjgyMjcgOC44NzI4N0wxMy44MjY2IDUuOTUzMDhDMTMuOTAzMyA1Ljg3ODM1IDEzLjk1NzcgNS43ODM2IDEzLjk4MzMgNS42Nzk1N0MxNC4wMDkgNS41NzU1NCAxNC4wMDUgNS40NjY0IDEzLjk3MTggNS4zNjQ1M1pcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiI2VhYjMwOFwiIC8+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJ2LWF2Zy1udW1cIj57e3Jlc3BvbnNlRGF0YT8uYXZlcmFnZVJhdGluZyB8IG51bWJlcjonMS4xLTEnfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJ2LWF2Zy1sYWJlbFwiPmF2ZXJhZ2U8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJ2LWNvdW50XCIgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgfHwgJyMxMGI5ODEnXCI+XHJcbiAgICAgICAgICB7e3Jlc3BvbnNlRGF0YT8udG90YWxSZXZpZXdDb3VudCB8IG51bWJlcn19IFJldmlld3NcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicnYtYmFyc1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJhdGluZyBvZiBbNSw0LDMsMiwxXVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJ2LWJhci1yb3dcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJydi1iYXItbGFiZWxcIj57e3JhdGluZ319PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xMy45NzE4IDUuMzY0NTNDMTMuOTM5OCA1LjI2Mjk4IDEzLjg3OTggNS4xNzI1MiAxMy43OTg2IDUuMTAzNTZDMTMuNzE3NSA1LjAzNDYgMTMuNjE4NiA0Ljk4OTk0IDEzLjUxMzIgNC45NzQ3Mkw5LjM3MDQzIDQuMzcwODhMNy41MTMwNyAwLjYxNzk1NUM3LjQ2MDIxIDAuNTI5MjcxIDcuMzg1MjIgMC40NTU4MzQgNy4yOTU0NSAwLjQwNDgzNkM3LjIwNTY4IDAuMzUzODM4IDcuMTA0MiAwLjMyNzAyNiA3LjAwMDk2IDAuMzI3MDI2QzYuODk3NzEgMC4zMjcwMjYgNi43OTYyNCAwLjM1MzgzOCA2LjcwNjQ3IDAuNDA0ODM2QzYuNjE2NyAwLjQ1NTgzNCA2LjU0MTcxIDAuNTI5MjcxIDYuNDg4ODUgMC42MTc5NTVMNC42MzE0OSA0LjM3MDg4TDAuNDg4NzQ2IDQuOTc0NzJDMC4zODMzNjMgNC45ODk5NCAwLjI4NDQxNiA1LjAzNDYgMC4yMDMyODYgNS4xMDM1NkMwLjEyMjE1NyA1LjE3MjUyIDAuMDYyMTQwNyA1LjI2Mjk4IDAuMDMwMTQgNS4zNjQ1M0MtMC4wMDQwMjI4NiA1LjQ2NTcxIC0wLjAwOTI0NDI4IDUuNTc0NDIgMC4wMTUwNjQ1IDUuNjc4NDFDMC4wMzkzNzMzIDUuNzgyNCAwLjA5MjI0NTcgNS44Nzc1MyAwLjE2NzcyMiA1Ljk1MzA4TDMuMTc5MjQgOC44NzI4N0wyLjQ2ODQgMTMuMDAwM0MyLjQ1MDM4IDEzLjEwNjYgMi40NjIyOSAxMy4yMTU4IDIuNTAyNzggMTMuMzE1N0MyLjU0MzI4IDEzLjQxNTYgMi42MTA3NyAxMy41MDIyIDIuNjk3NyAxMy41NjU5QzIuNzg0NzcgMTMuNjI4IDIuODg3NDYgMTMuNjY0NCAyLjk5NDE2IDEzLjY3MTJDMy4xMDA4NyAxMy42NzggMy4yMDczMyAxMy42NTQ3IDMuMzAxNTMgMTMuNjA0Mkw3LjAwMDk2IDExLjY1NTFMMTAuNzA4IDEzLjYwNDJDMTAuNzkgMTMuNjQ5MSAxMC44ODIgMTMuNjcyOCAxMC45NzU1IDEzLjY3M0MxMS4wOTU4IDEzLjY3MTYgMTEuMjEyOSAxMy42MzQzIDExLjMxMTkgMTMuNTY1OUMxMS4zOTg4IDEzLjUwMjIgMTEuNDY2MyAxMy40MTU2IDExLjUwNjggMTMuMzE1N0MxMS41NDczIDEzLjIxNTggMTEuNTU5MiAxMy4xMDY2IDExLjU0MTIgMTMuMDAwM0wxMC44MjI3IDguODcyODdMMTMuODI2NiA1Ljk1MzA4QzEzLjkwMzMgNS44NzgzNSAxMy45NTc3IDUuNzgzNiAxMy45ODMzIDUuNjc5NTdDMTQuMDA5IDUuNTc1NTQgMTQuMDA1IDUuNDY2NCAxMy45NzE4IDUuMzY0NTNaXCJcclxuICAgICAgICAgICAgICAgIGZpbGw9XCIjZWFiMzA4XCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1iYXItdHJhY2tcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnYtYmFyLWZpbGxcIiBbc3R5bGUud2lkdGguJV09XCJnZXRQZXJjZW50YWdlKHJhdGluZylcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFJldmlldyBDYXJkcyBHcmlkIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJ2LWdyaWRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmV2aWV3IG9mIHJldmlld3NEYXRhXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJldmlldy5yZXZpZXdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1jYXJkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1jYXJkLXRvcFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1yZXZpZXdlclwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIidodHRwczovL3VpLWF2YXRhcnMuY29tL2FwaS8/bmFtZT0nICsgKHJldmlldz8udXNlck5hbWUgPz8gJ1UnKSArICcmYmFja2dyb3VuZD1yYW5kb20nXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJydi1hdmF0YXJcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1uYW1lLWRhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJydi1uYW1lXCI+e3tyZXZpZXc/LnVzZXJOYW1lID8/ICdBbm9ueW1vdXMnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnYtZGF0ZVwiPnt7cmV2aWV3Py5jcmVhdGVkQXQgfCBkYXRlOidkIE1NTSB5J319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCEtLSBTdGFyIHJhdGluZyAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnYtY2FyZC1zdGFyc1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcyBvZiBbMSwyLDMsNCw1XVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicyA8PSByZXZpZXcucmF0aW5nXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTMuOTcxOCA1LjM2NDUzQzEzLjkzOTggNS4yNjI5OCAxMy44Nzk4IDUuMTcyNTIgMTMuNzk4NiA1LjEwMzU2QzEzLjcxNzUgNS4wMzQ2IDEzLjYxODYgNC45ODk5NCAxMy41MTMyIDQuOTc0NzJMOS4zNzA0MyA0LjM3MDg4TDcuNTEzMDcgMC42MTc5NTVDNy40NjAyMSAwLjUyOTI3MSA3LjM4NTIyIDAuNDU1ODM0IDcuMjk1NDUgMC40MDQ4MzZDNy4yMDU2OCAwLjM1MzgzOCA3LjEwNDIgMC4zMjcwMjYgNy4wMDA5NiAwLjMyNzAyNkM2Ljg5NzcxIDAuMzI3MDI2IDYuNzk2MjQgMC4zNTM4MzggNi43MDY0NyAwLjQwNDgzNkM2LjYxNjcgMC40NTU4MzQgNi41NDE3MSAwLjUyOTI3MSA2LjQ4ODg1IDAuNjE3OTU1TDQuNjMxNDkgNC4zNzA4OEwwLjQ4ODc0NiA0Ljk3NDcyQzAuMzgzMzYzIDQuOTg5OTQgMC4yODQ0MTYgNS4wMzQ2IDAuMjAzMjg2IDUuMTAzNTZDMC4xMjIxNTcgNS4xNzI1MiAwLjA2MjE0MDcgNS4yNjI5OCAwLjAzMDE0IDUuMzY0NTNDLTAuMDA0MDIyODYgNS40NjU3MSAtMC4wMDkyNDQyOCA1LjU3NDQyIDAuMDE1MDY0NSA1LjY3ODQxQzAuMDM5MzczMyA1Ljc4MjQgMC4wOTIyNDU3IDUuODc3NTMgMC4xNjc3MjIgNS45NTMwOEwzLjE3OTI0IDguODcyODdMMi40Njg0IDEzLjAwMDNDMi40NTAzOCAxMy4xMDY2IDIuNDYyMjkgMTMuMjE1OCAyLjUwMjc4IDEzLjMxNTdDMi41NDMyOCAxMy40MTU2IDIuNjEwNzcgMTMuNTAyMiAyLjY5NzcgMTMuNTY1OUMyLjc4NDc3IDEzLjYyOCAyLjg4NzQ2IDEzLjY2NDQgMi45OTQxNiAxMy42NzEyQzMuMTAwODcgMTMuNjc4IDMuMjA3MzMgMTMuNjU0NyAzLjMwMTUzIDEzLjYwNDJMNy4wMDA5NiAxMS42NTUxTDEwLjcwOCAxMy42MDQyQzEwLjc5IDEzLjY0OTEgMTAuODgyIDEzLjY3MjggMTAuOTc1NSAxMy42NzNDMTEuMDk1OCAxMy42NzE2IDExLjIxMjkgMTMuNjM0MyAxMS4zMTE5IDEzLjU2NTlDMTEuMzk4OCAxMy41MDIyIDExLjQ2NjMgMTMuNDE1NiAxMS41MDY4IDEzLjMxNTdDMTEuNTQ3MyAxMy4yMTU4IDExLjU1OTIgMTMuMTA2NiAxMS41NDEyIDEzLjAwMDNMMTAuODIyNyA4Ljg3Mjg3TDEzLjgyNjYgNS45NTMwOEMxMy45MDMzIDUuODc4MzUgMTMuOTU3NyA1Ljc4MzYgMTMuOTgzMyA1LjY3OTU3QzE0LjAwOSA1LjU3NTU0IDE0LjAwNSA1LjQ2NjQgMTMuOTcxOCA1LjM2NDUzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI2VhYjMwOFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicyA+IHJldmlldy5yYXRpbmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHlsZT1cIm9wYWNpdHk6MC4yNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEzLjk3MTggNS4zNjQ1M0MxMy45Mzk4IDUuMjYyOTggMTMuODc5OCA1LjE3MjUyIDEzLjc5ODYgNS4xMDM1NkMxMy43MTc1IDUuMDM0NiAxMy42MTg2IDQuOTg5OTQgMTMuNTEzMiA0Ljk3NDcyTDkuMzcwNDMgNC4zNzA4OEw3LjUxMzA3IDAuNjE3OTU1QzcuNDYwMjEgMC41MjkyNzEgNy4zODUyMiAwLjQ1NTgzNCA3LjI5NTQ1IDAuNDA0ODM2QzcuMjA1NjggMC4zNTM4MzggNy4xMDQyIDAuMzI3MDI2IDcuMDAwOTYgMC4zMjcwMjZDNi44OTc3MSAwLjMyNzAyNiA2Ljc5NjI0IDAuMzUzODM4IDYuNzA2NDcgMC40MDQ4MzZDNi42MTY3IDAuNDU1ODM0IDYuNTQxNzEgMC41MjkyNzEgNi40ODg4NSAwLjYxNzk1NUw0LjYzMTQ5IDQuMzcwODhMMC40ODg3NDYgNC45NzQ3MkMwLjM4MzM2MyA0Ljk4OTk0IDAuMjg0NDE2IDUuMDM0NiAwLjIwMzI4NiA1LjEwMzU2QzAuMTIyMTU3IDUuMTcyNTIgMC4wNjIxNDA3IDUuMjYyOTggMC4wMzAxNCA1LjM2NDUzQy0wLjAwNDAyMjg2IDUuNDY1NzEgLTAuMDA5MjQ0MjggNS41NzQ0MiAwLjAxNTA2NDUgNS42Nzg0MUMwLjAzOTM3MzMgNS43ODI0IDAuMDkyMjQ1NyA1Ljg3NzUzIDAuMTY3NzIyIDUuOTUzMDhMMy4xNzkyNCA4Ljg3Mjg3TDIuNDY4NCAxMy4wMDAzQzIuNDUwMzggMTMuMTA2NiAyLjQ2MjI5IDEzLjIxNTggMi41MDI3OCAxMy4zMTU3QzIuNTQzMjggMTMuNDE1NiAyLjYxMDc3IDEzLjUwMjIgMi42OTc3IDEzLjU2NTlDMi43ODQ3NyAxMy42MjggMi44ODc0NiAxMy42NjQ0IDIuOTk0MTYgMTMuNjcxMkMzLjEwMDg3IDEzLjY3OCAzLjIwNzMzIDEzLjY1NDcgMy4zMDE1MyAxMy42MDQyTDcuMDAwOTYgMTEuNjU1MUwxMC43MDggMTMuNjA0MkMxMC43OSAxMy42NDkxIDEwLjg4MiAxMy42NzI4IDEwLjk3NTUgMTMuNjczQzExLjA5NTggMTMuNjcxNiAxMS4yMTI5IDEzLjYzNDMgMTEuMzExOSAxMy41NjU5QzExLjM5ODggMTMuNTAyMiAxMS40NjYzIDEzLjQxNTYgMTEuNTA2OCAxMy4zMTU3QzExLjU0NzMgMTMuMjE1OCAxMS41NTkyIDEzLjEwNjYgMTEuNTQxMiAxMy4wMDAzTDEwLjgyMjcgOC44NzI4N0wxMy44MjY2IDUuOTUzMDhDMTMuOTAzMyA1Ljg3ODM1IDEzLjk1NzcgNS43ODM2IDEzLjk4MzMgNS42Nzk1N0MxNC4wMDkgNS41NzU1NCAxNC4wMDUgNS40NjY0IDEzLjk3MTggNS4zNjQ1M1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNlYWIzMDhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJydi10ZXh0XCI+e3tyZXZpZXc/LnJldmlldyA/PyAnTm8gY29tbWVudCBwcm92aWRlZC4nfX08L3A+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFJldmlldyBJbWFnZXMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1pbWFnZXNcIiAqbmdJZj1cInJldmlldz8ucmV2aWV3SW1hZ2VzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICA8YSAqbmdGb3I9XCJsZXQgaW1nIG9mIHJldmlldy5yZXZpZXdJbWFnZXNcIiBbaHJlZl09XCJpbWcuaW1nVXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJydi1pbWctbGlua1wiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltZy5pbWdVcmxcIiBhbHQ9XCJSZXZpZXcgaW1hZ2VcIiBjbGFzcz1cInJ2LWltZy10aHVtYlwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBtdC00XCIgKm5nSWY9XCIocmV2aWV3c0RhdGE/Lmxlbmd0aCA/PyAwKSA+IDNcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIndyaXRlLXJldmlldy1idG5cIiAoY2xpY2spPVwibG9hZE1vcmVSZXZpZXdzKClcIj5Mb2FkIE1vcmUgUmV2aWV3czwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48ZGl2IGNsYXNzPVwibW9kYWwgZmFkZVwiIGlkPVwiZXhhbXBsZU1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cImV4YW1wbGVNb2RhbExhYmVsXCIgcm9sZT1cImRpYWxvZ1wiXHJcbiAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQgdmlkZW8tbW9kYWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7XCI+XHJcbiAgICAgICAgPHZpZGVvIGNvbnRyb2xzIG11dGVkIHBsYXlzaW5saW5lIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcIj5cclxuICAgICAgICAgIDxzb3VyY2VcclxuICAgICAgICAgICAgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy8zNzE2NDdjMTc1Mzk2MjA4NDI2NWNsaWRlb19lZGl0b3JfNDhiYzkzYzI0ZTE4NDcwODg4YzY2MWJiMDllNDM3ZGEgKG9ubGluZS12aWRlby1jdXR0ZXIuY29tKS5tcDRcIlxyXG4gICAgICAgICAgICB0eXBlPVwidmlkZW8vbXA0XCI+XHJcbiAgICAgICAgICBZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdmlkZW8gdGFnLlxyXG4gICAgICAgIDwvdmlkZW8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cInJldmlld01vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cInJldmlld01vZGFsTGFiZWxcIiByb2xlPVwiZGlhbG9nXCJcclxuICBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIHJldmlldy1tb2RhbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1vZGFsLXRpdGxlIGZzLTVcIj48L2gxPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yZXZpZXctY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2Utc2VjdGlvblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1pbWFnZVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWNrd2FyZC1hcnJvdyBhcnJvd1wiIChjbGljayk9XCJjdXJyZW50SW1hZ2VJbmRleCA9IGN1cnJlbnRJbWFnZUluZGV4LTFcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50SW1hZ2VJbmRleCA+IDBcIj7ilrw8L2Rpdj5cclxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwic2VsZWN0ZWRSZXZpZXc/LnJldmlld0ltYWdlcz8uW2N1cnJlbnRJbWFnZUluZGV4XT8uaW1nVXJsXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcndhcmQtYXJyb3cgYXJyb3dcIiAoY2xpY2spPVwiY3VycmVudEltYWdlSW5kZXggPSBjdXJyZW50SW1hZ2VJbmRleCsxXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudEltYWdlSW5kZXggPCBzZWxlY3RlZFJldmlldz8uaW1hZ2VzPy5sZW5ndGggLSAxXCI+4payPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZWFyYnVkcy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFyZ2luZy1jYXNlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWFyYnVkIGxlZnRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlYXJidWQgcmlnaHRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJuYXZpZ2F0aW9uLWFycm93c1wiPlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmV2aWV3LXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlld2VyLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXdlci1hdmF0YXJcIj7wn5GkPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlld2VyLW5hbWVcIj57e3NlbGVjdGVkUmV2aWV3Py51c2VyTmFtZSA/PyBcIi1cIn19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yYXRpbmdcIiAqbmdJZj1cInNlbGVjdGVkUmV2aWV3Py5yYXRpbmdcIj5cclxuICAgICAgICAgICAgICA8cC1yYXRpbmcgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFJldmlldy5yYXRpbmdcIiBbY2FuY2VsXT1cImZhbHNlXCIgW3JlYWRvbmx5XT1cInRydWVcIj48L3AtcmF0aW5nPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctZGF0ZVwiPlxyXG4gICAgICAgICAgICAgIFJldmlld2VkIGluIEluZGlhIG9uIDI0IEp1bHkgMjAyNVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctdGV4dFwiPlxyXG4gICAgICAgICAgICAgIHt7c2VsZWN0ZWRSZXZpZXc/LnJldmlldyA/PyBcIi1cIn19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlcy1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgPGgzPkltYWdlcyBpbiB0aGlzIHJldmlldzwvaDM+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlldy1pbWFnZXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctaW1hZ2VcIiBbbmdDbGFzc109XCJ7J3NlbGVjdGVkJzogY3VycmVudEltYWdlSW5kZXggPT0gaX1cIlxyXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaW1nIG9mIHNlbGVjdGVkUmV2aWV3Py5yZXZpZXdJbWFnZXMgPz8gW107bGV0IGkgPSBpbmRleFwiIChjbGljayk9XCJjdXJyZW50SW1hZ2VJbmRleCA9IGlcIj5cclxuICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltZy5pbWdVcmxcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
|
|
1065
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXNjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtZGVzYy9wcm9kdWN0LWRlc2MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1kZXNjL3Byb2R1Y3QtZGVzYy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBMEIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sRUFBRSxxQkFBcUIsRUFBbUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRyxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRXpGLE9BQU8sV0FBVyxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU1qRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQs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T0FBTzt3QkFDUCxjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixtQkFBbUI7d0JBQ25CLHdCQUF3Qjt3QkFDeEIsa0JBQWtCO3dCQUNsQixtQkFBbUI7d0JBQ25CLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQix5QkFBeUI7d0JBQ3pCLG9CQUFvQjt3QkFDcEIsbUJBQW1CO3dCQUNuQixZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsV0FBVzt3QkFDWCx1QkFBdUI7d0JBQ3ZCLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLHFCQUFxQjt3QkFDckIsMEJBQTBCO3dCQUMxQixnQkFBZ0I7d0JBQ2hCLHVCQUF1QjtxQkFDeEIsYUFDVSxDQUFDLGNBQWMsQ0FBQzs7MEJBa0N4QixNQUFNOzJCQUFDLFdBQVc7Z1lBN0JrQyxlQUFlO3NCQUFyRSxTQUFTO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFM0IsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUNBLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDSyxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0csYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUVqQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFrWE4sYUFBYTtzQkFEWixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIFBMQVRGT1JNX0lELCBSZW5kZXJlcjIsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFByb2R1Y3REZXNjTW9kYWwsIFByb2R1Y3REZXNjU3R5bGVzTW9kYWwgfSBmcm9tICcuL3Byb2R1Y3QtZGVzYy5tb2RhbCc7XG5pbXBvcnQgeyBjaGVja0l0ZW1BbHJlYWR5QWRkZWQsIEl0ZW1JbWFnZSwgSXRlbVZhcmlhbnQsIFByb2R1Y3QgfSBmcm9tICcuLi8uLi9zdHlsZXMvcHJvZHVjdC5tb2RhbCc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQnV0dG9uRGlyZWN0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2J1dHRvbi1kaXJlY3RpdmUuZGlyZWN0aXZlJztcbmltcG9ydCB7IEJhY2tncm91bmRNb2RlbCwgQnV0dG9uTW9kZWwsIExheU91dE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vc3R5bGVzL3N0eWxlLm1vZGVsJztcbmltcG9ydCBCYXNlU2VjdGlvbiBmcm9tICcuLi8uLi8uLi9zZWN0aW9ucy9CYXNlU2VjdGlvbic7XG5pbXBvcnQgeyBBbmltYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYW5pbWF0aW9uLWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBIb3ZlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9ob3Zlci1lbGVtZW50LWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDb250ZW50Rml0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2NvbnRlbnQtZml0LWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTaW1wb0NvbXBvbmVudE1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW5kZXgnO1xuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4uLy4vLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciwgVXJsU2VnbWVudCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2FydC5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE5neEltYWdlWm9vbU1vZHVsZSB9IGZyb20gJ25neC1pbWFnZS16b29tJztcbmltcG9ydCB7IEZlYXR1cmVkUHJvZHVjdHNDb21wb25lbnQgfSBmcm9tIFwiLi4vZmVhdHVyZWQtcHJvZHVjdHMvZmVhdHVyZWQtcHJvZHVjdHMuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBGZWF0dXJlZFByb2R1Y3RNb2RhbCB9IGZyb20gJy4uL2ZlYXR1cmVkLXByb2R1Y3RzL2ZlYXR1cmVkLXByb2R1Y3RzLm1vZGFsJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBPcmRlcmVkSXRlbXMgfSBmcm9tICcuLi8uLi9zdHlsZXMvT3JkZXJlZEl0ZW1zLm1vZGFsJztcbmltcG9ydCB7IEJVU0lORVNTX0NPTlNUQU5UUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9idXNpbmVzcy5jb25zdGFudCc7XG5pbXBvcnQgeyBUb2FzdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9hc3QnO1xuaW1wb3J0IHsgTWVudUl0ZW0sIE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgTWV0YSwgVGl0bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nQ29uZmlnIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEl0ZW1WYXJpZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vaXRlbS12YXJpZW50L2l0ZW0tdmFyaWVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0Qm90dG9tU2hlZXQsIE1hdEJvdHRvbVNoZWV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYm90dG9tLXNoZWV0JztcbmltcG9ydCB7IEJhY2tncm91bmREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYmFja2dyb3VuZC1kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2ltcG9XcmFwQ29tbnRhaW5lciB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS93cmFwLWNvbnRhaW5lcnMuZGlyZWN0aXZlJztcbmltcG9ydCB7IENvbG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2NvbG9yLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTb2NpYUljb25zQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZWxlbWVudHMvc29jaWEtaWNvbnMvc29jaWEtaWNvbnMuY29tcG9uZW50JztcbmltcG9ydCB7IFJhdGluZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcmF0aW5nJztcbmltcG9ydCB7IFJldmlldyB9IGZyb20gJy4uLy4uL3N0eWxlcy9yZXZpZXcubW9kYWwnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL3N0eWxlcy91c2VyLm1vZGFsJztcbmltcG9ydCB7IFNwZWVkRGlhbE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc3BlZWRkaWFsJztcbmltcG9ydCB7IEN1c3RvbWVyUmV2aWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2VjdGlvbnMvY3VzdG9tZXItcmV2aWV3L2N1c3RvbWVyLXJldmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFuZWxNb2R1bGUgfSBmcm9tICdwcmltZW5nL3BhbmVsJztcbmltcG9ydCB7IFN2Z0RpdmlkZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9lbGVtZW50cy9zdmctZGl2aWRlci9zdmctZGl2aWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29ybmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2Nvcm5lci1kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQnV0dG9uRWRpdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2J1dHRvbi1lZGl0b3IuZGlyZWN0aXZlJztcbmltcG9ydCB7IFNwYWNpbmdIb3Jpem9udGFsRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL3NwYWNpbmctaG9yaXpvbnRhbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2FuaXRpemVIdG1sUGlwZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3Nhbml0aXplSHRtbCc7XG5pbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYW5hbHl0aWNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd4U2tlbGV0b25Mb2FkZXJNb2R1bGUgfSBmcm9tICduZ3gtc2tlbGV0b24tbG9hZGVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2ltcG8tcHJvZHVjdC1kZXNjJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBTaW1wb0NvbXBvbmVudE1vZHVsZSxcbiAgICBNYXRJY29uLFxuICAgIENvbG9yRGlyZWN0aXZlLFxuICAgIC8vRElSRUNUSVZFXG4gICAgU2ltcG9XcmFwQ29tbnRhaW5lcixcbiAgICBCYWNrZ3JvdW5kRGlyZWN0aXZlLFxuICAgIEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSxcbiAgICBBbmltYXRpb25EaXJlY3RpdmUsXG4gICAgQ29udGVudEZpdERpcmVjdGl2ZSxcbiAgICBIb3ZlckRpcmVjdGl2ZSxcbiAgICBOZ3hJbWFnZVpvb21Nb2R1bGUsXG4gICAgRmVhdHVyZWRQcm9kdWN0c0NvbXBvbmVudCxcbiAgICBNYXRCb3R0b21TaGVldE1vZHVsZSxcbiAgICBTb2NpYUljb25zQ29tcG9uZW50LFxuICAgIFJhdGluZ01vZHVsZSxcbiAgICBTcGVlZERpYWxNb2R1bGUsXG4gICAgVG9hc3RNb2R1bGUsXG4gICAgQ3VzdG9tZXJSZXZpZXdDb21wb25lbnQsXG4gICAgUGFuZWxNb2R1bGUsXG4gICAgU3ZnRGl2aWRlckNvbXBvbmVudCxcbiAgICBDb3JuZXJEaXJlY3RpdmUsXG4gICAgQnV0dG9uRWRpdG9yRGlyZWN0aXZlLFxuICAgIFNwYWNpbmdIb3Jpem9udGFsRGlyZWN0aXZlLFxuICAgIFNhbml0aXplSHRtbFBpcGUsXG4gICAgTmd4U2tlbGV0b25Mb2FkZXJNb2R1bGVcbiAgXSxcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1kZXNjLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Byb2R1Y3QtZGVzYy5jb21wb25lbnQuY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0RGVzY0NvbXBvbmVudCBleHRlbmRzIEJhc2VTZWN0aW9uIHtcbiAgQFZpZXdDaGlsZChDdXN0b21lclJldmlld0NvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pIHJldmlld0NvbXBvbmVudCE6IEN1c3RvbWVyUmV2aWV3Q29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoJ2Fib3ZlSGVpZ2h0JykgYWJvdmVIZWlnaHQhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJykgY29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2ltYWdlU2VjdGlvbicpIGltYWdlU2VjdGlvbiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdkZXRhaWxTZWN0aW9uJykgZGV0YWlsU2VjdGlvbiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBJbnB1dCgpIGRhdGE/OiBQcm9kdWN0RGVzY01vZGFsO1xuICBASW5wdXQoKSByZXNwb25zZURhdGEhOiBQcm9kdWN0O1xuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgZWRpdD86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGRlbGV0ZT86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGN1c3RvbUNsYXNzPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIG5leHRDb21wb25lbnRDb2xvcj86IEJhY2tncm91bmRNb2RlbDtcbiAgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBmZWF0dXJlUHJvZHVjdERhdGE6IEZlYXR1cmVkUHJvZHVjdE1vZGFsIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyByZWNlbnRWaWV3ZWREYXRhOiBGZWF0dXJlZFByb2R1Y3RNb2RhbCB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgdmFyaWVudHM6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHVibGljIHNlbGVjdGVkVmFyaWVudDogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgcHVibGljIHJlbGF0ZWRQcm9kdWN0RGF0YTogUHJvZHVjdFtdID0gW107XG4gIHB1YmxpYyBwcm9kdWN0UmV2aWV3OiBudW1iZXIgPSAwO1xuICBwdWJsaWMgdG90YWxSZXZpZXc6IG51bWJlciA9IDU7XG4gIHB1YmxpYyBzaG93UmV2aWV3OiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBzZWxlY3RlZFJldmlldzogYW55O1xuICBwdWJsaWMgY3VycmVudEltYWdlSW5kZXg6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBPYmplY3QsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZXZlbnRTZXJ2aWNlOiBFdmVudHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXN0U2VydmljZTogUmVzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YVRhZ1NlcnZpY2U6IE1ldGEsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0aXRsZVNlcnZpY2U6IFRpdGxlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYm90dG9tU2hlZXQ6IE1hdEJvdHRvbVNoZWV0LFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIG1hdERpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgYW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzU2VydmljZVxuICApIHtcblxuICAgIHN1cGVyKClcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgdGhpcy5nZXRTY3JlZW5TaXplKCk7XG4gICAgfVxuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHJlc3BvbnNlO1xuICAgIH0pXG4gIH1cblxuICBidXR0b25JZD86IHN0cmluZztcbiAgYnV0dG9uPzogQnV0dG9uTW9kZWxcbiAgc3R5bGVzPzogUHJvZHVjdERlc2NTdHlsZXNNb2RhbDtcbiAgc3ViSW5kdXN0cnlOYW1lOiBzdHJpbmcgPSAnJ1xuICBpc0l0ZW1Bc0Zhdm9yaXRlOiBib29sZWFuID0gZmFsc2U7XG4gIGlzSXRlbUFkZGVkQXNUcmlhbDogYm9vbGVhbiA9IGZhbHNlXG4gIHByaXZhdGUgVVNFUl9DQVJUOiBPcmRlcmVkSXRlbXNbXSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIFVTRVJfV0lTSExJU1Q6IE9yZGVyZWRJdGVtc1tdIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBpdGVtSW1hZ2VzOiBJdGVtSW1hZ2VbXSA9IFtdO1xuICBpdGVtczogTWVudUl0ZW1bXSB8IG51bGwgPSBudWxsO1xuICBidXNpbmVzc0RldGFpbHM6IGFueTtcbiAgdHJpYWxDYXJ0SXRlbTogYW55W10gPSBbXVxuICB1c2VyRGV0YWlsczogYW55O1xuICB1c2VySWQ6IGFueTtcbiAgcmVjb21tZWRlZERhdGE6IFByb2R1Y3RbXSA9IFtdO1xuXG4gIGlzUGluQ29kZTogYm9vbGVhbiA9IHRydWU7XG4gIHRvU2hvd0luSmV3ZWxsZXJ5OiBib29sZWFuID0gZmFsc2U7XG4gIElzRWNvbW1lcmNlOiBib29sZWFuID0gZmFsc2U7XG4gIG1hdGVyaWFsQmFzZWRQcmljaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGFjdGl2ZVRhYjogc3RyaW5nID0gJ0RldGFpbHMnO1xuXG4gIGNoYW5nZVRhYih0YWI6IHN0cmluZykge1xuICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiO1xuICB9XG4gIG5nT25Jbml0KCkge1xuICAgIGxldCB1c2VyRGV0YWlscyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcicpIHx8ICcnO1xuICAgIGlmICh1c2VyRGV0YWlscykge1xuICAgICAgdGhpcy51c2VyRGV0YWlscyA9IEpTT04ucGFyc2UodXNlckRldGFpbHMpO1xuICAgICAgdGhpcy51c2VySWQgPSB0aGlzLnVzZXJEZXRhaWxzPy51c2VySWQ7XG5cbiAgICB9XG5cbiAgICBpZiAod2luZG93Py5sb2NhdGlvbj8ub3JpZ2luPy5pbmNsdWRlcygnY2FyYXRsYW5lJykgfHwgd2luZG93Py5sb2NhdGlvbj8ub3JpZ2luPy5pbmNsdWRlcygnb3JyYScpKSB7XG4gICAgICB0aGlzLnRvU2hvd0luSmV3ZWxsZXJ5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmdldEVjb21tZXJjZUNvbmZpZ3MoKTtcbiAgICB0aGlzLnN1YkluZHVzdHJ5TmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzdWJJbmR1c3RyeU5hbWUnKSA/PyBcIlwiO1xuICAgIHRoaXMubWF0ZXJpYWxCYXNlZFByaWNpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaXNNYXRlcmlhbEJhc2VkUHJpY2luZycpID09ICd0cnVlJyA/IHRydWUgOiBmYWxzZTtcbiAgICB0aGlzLmZlYXR1cmVQcm9kdWN0RGF0YSA9IG5ldyBGZWF0dXJlZFByb2R1Y3RNb2RhbCh0aGlzLmRhdGEpO1xuICAgIHRoaXMucmVjZW50Vmlld2VkRGF0YSA9IG5ldyBGZWF0dXJlZFByb2R1Y3RNb2RhbCh0aGlzLmRhdGEsIHRydWUpO1xuICAgIHRoaXMuc3R5bGVzID0gdGhpcy5kYXRhPy5zdHlsZXM7XG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzICYmIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzWzBdICYmIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmwpIHtcbiAgICAgIHRoaXMuY3VycmVudEltZyA9IHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmwgPz8gXCJcIlxuICAgIH1cbiAgICB0aGlzLmJ1dHRvbiA9IHRoaXMuZGF0YT8uYWN0aW9uPy5idXR0b25zWzBdO1xuICAgIHRoaXMuYnV0dG9uSWQgPSAodGhpcy5kYXRhID8gdGhpcy5kYXRhLmlkIDogJycpICsgKHRoaXMuYnV0dG9uID8gdGhpcy5idXR0b24uaWQgOiAnJyk7XG5cbiAgICB0aGlzLnBpbmNvZGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGluY29kZScpO1xuICAgIGlmICh0aGlzLnBpbmNvZGUpIHtcbiAgICAgIHRoaXMuZ2V0U3RvcmVEZXRhaWxzKClcbiAgICB9XG5cbiAgICB0aGlzLml0ZW1zID0gW1xuICAgICAgLy8ge1xuICAgICAgLy8gICBpY29uOiBcInBpIHBpLWhlYXJ0XCIsXG4gICAgICAvLyAgIGNvbW1hbmQ6ICgpID0+IHtcbiAgICAgIC8vICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy93aXNobGlzdCddKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfSxcbiAgICAgIHtcbiAgICAgICAgaWNvbjogXCJwaSBwaS1zaGFyZS1hbHRcIixcbiAgICAgICAgY29tbWFuZDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hhcmVQcm9kdWN0KCk7XG4gICAgICAgICAgLy8gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAgIC8vIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0NvcGllZCcsIGRldGFpbDogJ1lvdSBjYW4gc2hhcmUgdGhlIHVybCcsIGtleTogJ3dpc2hsaXN0JyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF07XG4gICAgdGhpcy5nZXRQcm9kdWN0QnlDYXRlZ29yeSgpO1xuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHJlc3BvbnNlO1xuICAgIH0pXG4gICAgdGhpcy5Jc0Vjb21tZXJjZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwid2Vic2l0ZVR5cGVcIikgIT0gJ1NUQVRJQycgPyB0cnVlIDogZmFsc2U7XG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS51cmwuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRVcmwgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgfHwgJyc7XG4gICAgICBjb25zdCBjbGVhblVybCA9IGN1cnJlbnRVcmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdO1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBjbGVhblVybC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5tYXAoKHNlZ21lbnQpID0+IGRlY29kZVVSSUNvbXBvbmVudChzZWdtZW50KSk7XG5cbiAgICAgIGNvbnN0IGRldGFpbHNJbmRleCA9IHNlZ21lbnRzLmZpbmRJbmRleCgoc2VnbWVudCkgPT4gc2VnbWVudCA9PT0gJ2RldGFpbHMnKTtcbiAgICAgIGNvbnN0IHNsdWdOYW1lID0gZGV0YWlsc0luZGV4ID49IDAgPyBzZWdtZW50c1tkZXRhaWxzSW5kZXggKyAxXSA6IFwiYW50LWVzcG9ydHMtZ20xMDAtMzYwMC1kcGktd2lyZWQtcmdiLWdhbWluZy1tb3VzZS1ibGFja3doaXRlXCI7XG4gICAgICBjb25zdCByb3V0ZVZhcmllbnRJZCA9IGRldGFpbHNJbmRleCA+PSAwID8gc2VnbWVudHNbZGV0YWlsc0luZGV4ICsgMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChzbHVnTmFtZSkge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgLy8gVHJhY2tpbmcgQW5hbHl0aWNzXG4gICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zdGFydE5ld0NvbnRleHQoe1xuICAgICAgICAgICdQUk9EVUNUX0lEJzogc2x1Z05hbWUsXG4gICAgICAgIH0sICdQUk9EVUNUX1ZJRVcnKVxuXG5cbiAgICAgICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UHJvZHVjdERldGFpbHNWMihzbHVnTmFtZSkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSByZXNwb25zZVswXTtcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQuZm9yRWFjaCgodmFyaWVudDogSXRlbVZhcmlhbnQsIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICB2YXJpZW50LnF1YW50aXR5ID0gMDtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhcmllbnQucHJvcGVydGllcykuZm9yRWFjaCgodmFyaWVudEtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChpZHggPT0gMClcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVmFyaWVudC5zZXQodmFyaWVudEtleSwgdmFyaWVudC5wcm9wZXJ0aWVzW3ZhcmllbnRLZXldKTtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhcmllbnRzLmdldCh2YXJpZW50S2V5KT8uaW5jbHVkZXModmFyaWVudC5wcm9wZXJ0aWVzW3ZhcmllbnRLZXldKSlcbiAgICAgICAgICAgICAgICB0aGlzLnZhcmllbnRzLnNldCh2YXJpZW50S2V5LCBbLi4uKHRoaXMudmFyaWVudHMuZ2V0KHZhcmllbnRLZXkpID8/IFtdKSwgdmFyaWVudC5wcm9wZXJ0aWVzW3ZhcmllbnRLZXldXSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5nZXRSZWxhdGVkUHJvZHVjdHMoKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IGl0ZW1WYXJpYW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KCk7XG4gICAgICAgICAgaWYgKGl0ZW1WYXJpYW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW1hZ2VzID0gaXRlbVZhcmlhbnQudmFyaWFudEltYWdlcztcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCA9IGl0ZW1WYXJpYW50LnZhcmlhbnRJZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50aXRsZVNlcnZpY2Uuc2V0VGl0bGUodGhpcy5yZXNwb25zZURhdGE/Lm5hbWUpO1xuXG4gICAgICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1JbWFnZXMgPSB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW1hZ2VzO1xuICAgICAgICAgICAgdGhpcy5nZXRSZXZpZXdzKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSWQpO1xuICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSAwO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyQ2FydCgpLnRoZW4oKGNhcnRSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICBjYXJ0UmVzcG9uc2Uub25zdWNjZXNzID0gKGNhcnREYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLlVTRVJfQ0FSVCA9IGNhcnREYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXTtcbiAgICAgICAgICAgICAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtSWQgPT0gdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1WYXJpYW50ICYmIGl0ZW0udmFyaWVudElkID09IGl0ZW1WYXJpYW50LnZhcmlhbnRJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVZhcmlhbnQucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyV2hpc2hsaXN0KCkudGhlbigod2lzaGxpc3RSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICB3aXNobGlzdFJlc3BvbnNlLm9uc3VjY2VzcyA9ICh3aGlzbGlzdERhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuVVNFUl9XSVNITElTVCA9IHdoaXNsaXN0RGF0YS50YXJnZXQucmVzdWx0IGFzIHVua25vd24gYXMgT3JkZXJlZEl0ZW1zW107XG4gICAgICAgICAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1JZCA9PSB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtVmFyaWFudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtVmFyaWFudCAmJiBpdGVtVmFyaWFudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1WYXJpYW50Lndpc2hsaXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLmNoZWNrSXRlbUFscmVhZHlBZGRlZEluVHJpYWwoKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEltZyA9IHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzPy5bMF0/LmltZ1VybDtcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJvZHVjdEJ5Q2F0ZWdvcnkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIHRoaXMuZ2V0UHJvZHVjdERlc2NyaXB0aW9uUmVjb21tZW5kYXRpb25zKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gT25seSBhdHRhY2ggY3VzdG9tIHNjcm9sbCBsaXN0ZW5lcnMgb24gZGVza3RvcCDigJQgb24gbW9iaWxlIHRoZXNlIGNhblxuICAgIC8vIGNhbGwgZS5wcmV2ZW50RGVmYXVsdCgpIGFuZCBibG9jayB0b3VjaC9jbGljayBldmVudHMgb24gdGhlIHRhYnMuXG4gICAgaWYgKHRoaXMuaXNNb2JpbGUpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGFib3ZlID0gdGhpcy5hYm92ZUhlaWdodD8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBpbWdEaXYgPSB0aGlzLmltYWdlU2VjdGlvbj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBkZXRhaWxEaXYgPSB0aGlzLmRldGFpbFNlY3Rpb24/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAvLyBTdGVwIDE6IHNjcm9sbCBiZXR3ZWVuIGltYWdlIGFuZCBkZXRhaWwsIHRoZW4gY29udGFpbmVyIG9uY2UgZGV0YWlsIGlzIGV4aGF1c3RlZFxuICAgIGltZ0Rpdj8uYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZTogV2hlZWxFdmVudCkgPT4ge1xuICAgICAgY29uc3QgYXRCb3R0b20gPSBpbWdEaXYuc2Nyb2xsVG9wICsgaW1nRGl2LmNsaWVudEhlaWdodCA+PSBpbWdEaXYuc2Nyb2xsSGVpZ2h0O1xuICAgICAgY29uc3QgYXRUb3AgPSBpbWdEaXYuc2Nyb2xsVG9wID09PSAwO1xuXG4gICAgICBpZiAoZS5kZWx0YVkgPiAwICYmIGF0Qm90dG9tKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZGV0YWlsQXRCb3R0b20gPSBkZXRhaWxEaXYuc2Nyb2xsVG9wICsgZGV0YWlsRGl2LmNsaWVudEhlaWdodCA+PSBkZXRhaWxEaXYuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICBpZiAoIWRldGFpbEF0Qm90dG9tKSB7XG4gICAgICAgICAgZGV0YWlsRGl2LnNjcm9sbFRvcCArPSBlLmRlbHRhWTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250YWluZXIuc2Nyb2xsVG9wICs9IGUuZGVsdGFZO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGUuZGVsdGFZIDwgMCAmJiBhdFRvcCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGRldGFpbEF0VG9wID0gZGV0YWlsRGl2LnNjcm9sbFRvcCA9PT0gMDtcbiAgICAgICAgaWYgKCFkZXRhaWxBdFRvcCkge1xuICAgICAgICAgIGRldGFpbERpdi5zY3JvbGxUb3AgKz0gZS5kZWx0YVk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCArPSBlLmRlbHRhWTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3RlcCAyOiBhZnRlciBkZXRhaWwgc2VjdGlvbiwgY29udGludWUgdG8gUmV2aWV3c1xuICAgIGRldGFpbERpdj8uYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZTogV2hlZWxFdmVudCkgPT4ge1xuICAgICAgY29uc3QgYXRCb3R0b20gPSBkZXRhaWxEaXYuc2Nyb2xsVG9wICsgZGV0YWlsRGl2LmNsaWVudEhlaWdodCA+PSBkZXRhaWxEaXYuc2Nyb2xsSGVpZ2h0O1xuICAgICAgY29uc3QgYXRUb3AgPSBkZXRhaWxEaXYuc2Nyb2xsVG9wID09PSAwO1xuXG4gICAgICBpZiAoZS5kZWx0YVkgPiAwICYmIGF0Qm90dG9tKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCArPSBlLmRlbHRhWTtcbiAgICAgIH0gZWxzZSBpZiAoZS5kZWx0YVkgPCAwICYmIGF0VG9wKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaW1nRGl2LnNjcm9sbFRvcCArPSBlLmRlbHRhWTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICB2YXJpZW50TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICByZWNlbnRWaWV3SXRlbUxpc3Q6IFByb2R1Y3RbXSA9IFtdO1xuICBnZXRSZWxhdGVkUHJvZHVjdHMoKSB7XG4gICAgY29uc3QgdXNlckRldGFpbHM6IFVzZXIgfCBudWxsID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCk7XG4gICAgaWYgKCEhdXNlckRldGFpbHMpIHtcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UmVjZW50Vmlld1Byb2R1Y3QodXNlckRldGFpbHMudXNlcklkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMucmVjZW50Vmlld0l0ZW1MaXN0ID0gcmVzcG9uc2U7XG4gICAgICB9KVxuICAgIH1cbiAgfVxuICBzZWxlY3RWYXJpZW50KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy52YXJpZW50TG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZFZhcmllbnQuc2V0KGtleSwgdmFsdWUpO1xuICAgIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8uZm9yRWFjaCgodmFyaWVudDogSXRlbVZhcmlhbnQpID0+IHtcbiAgICAgIGxldCBmb3VuZFZhcmllbnQgPSB0cnVlO1xuICAgICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGZvdW5kVmFyaWVudCA9ICh0aGlzLnNlbGVjdGVkVmFyaWVudC5nZXQocHJvcGVydHkpID09IHZhcmllbnQucHJvcGVydGllc1twcm9wZXJ0eV0pICYmIGZvdW5kVmFyaWVudDtcbiAgICAgIH0pXG4gICAgICBpZiAoZm91bmRWYXJpZW50KSB7XG4gICAgICAgIHRoaXMuaXRlbUltYWdlcyA9IHZhcmllbnQudmFyaWFudEltYWdlcztcbiAgICAgICAgdGhpcy5jdXJyZW50SW1nID0gdGhpcy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmw7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnByaWNlID0gdmFyaWVudC5pdGVtVmFyaWFudFByaWNlO1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW52ZW50b3J5ID0gdmFyaWVudC5pdGVtSW52ZW50b3J5O1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQgPSB2YXJpZW50LnZhcmlhbnRJZDtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSB0aGlzLmdldFZhcmllbnRRdWFudGl0eSh2YXJpZW50KTtcbiAgICAgICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gdGhpcy5pc1ZhcmllbnRQcmVzZW50SW5XaXNodGxpc3QodmFyaWVudCk7XG4gICAgICAgIHRoaXMuY2hlY2tJdGVtQWxyZWFkeUFkZGVkSW5UcmlhbCgpO1xuICAgICAgfVxuICAgIH0pXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnZhcmllbnRMb2FkaW5nID0gZmFsc2U7XG4gICAgfSwgMzAwKTtcbiAgfVxuICByYWlzZUxlYWQoKSB7XG4gICAgY29uc3QgdXNlckRldGFpbHMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKTtcbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgIGJ1c2luZXNzSWQ6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidXNpbmVzc0lkJyksXG4gICAgICBlbWFpbDogdXNlckRldGFpbHM/LmNvbnRhY3Q/LmVtYWlsLFxuICAgICAgbWVzc2FnZTogXCJcIixcbiAgICAgIG1vYmlsZU5vOiBcIlwiLFxuICAgICAgbW9yZUluZm86IHtcbiAgICAgICAgTmFtZTogdXNlckRldGFpbHM/LmNvbnRhY3Q/Lm5hbWUsXG4gICAgICAgIFwiTW9iaWxlIE51bWJlclwiOiB1c2VyRGV0YWlscz8uY29udGFjdD8ubW9iaWxlLFxuICAgICAgICBFbWFpbDogdXNlckRldGFpbHM/LmNvbnRhY3Q/LmVtYWlsLFxuICAgICAgICBcIkxlYWQgU291cmNlXCI6IFwiV2Vic2l0ZVwiLFxuICAgICAgICBcIkxlYWQgU3RhdHVzXCI6IFwiTkVXXCJcbiAgICAgIH0sXG4gICAgICBuYW1lOiB1c2VyRGV0YWlscz8uY29udGFjdD8ubmFtZVxuICAgIH1cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmNyZWF0ZUxlYWQocGF5bG9hZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzPy5kYXRhKSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnVGhhbmsgeW91JywgZGV0YWlsOiAnT3VyIHRlYW0gd2lsbCBjb250YWN0IHlvdSBzb29uJyB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogJ0Vycm9yIG9jY3VyZWQgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcicgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGdldEl0ZW1WYXJpZW50KCk6IEl0ZW1WYXJpYW50IHwgbnVsbCB7XG4gICAgbGV0IHNlbGVjdGVkVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gbnVsbDtcbiAgICB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50KSA9PiB7XG4gICAgICBsZXQgZm91bmRWYXJpZW50ID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5rZXlzKHZhcmllbnQucHJvcGVydGllcykuZm9yRWFjaCgocHJvcGVydHk6IHN0cmluZykgPT4ge1xuICAgICAgICBmb3VuZFZhcmllbnQgPSAodGhpcy5zZWxlY3RlZFZhcmllbnQuZ2V0KHByb3BlcnR5KSA9PSB2YXJpZW50LnByb3BlcnRpZXNbcHJvcGVydHldKSAmJiBmb3VuZFZhcmllbnQ7XG4gICAgICB9KVxuICAgICAgaWYgKGZvdW5kVmFyaWVudClcbiAgICAgICAgc2VsZWN0ZWRWYXJpZW50ID0gdmFyaWVudDtcbiAgICB9KVxuXG4gICAgcmV0dXJuIHNlbGVjdGVkVmFyaWVudDtcbiAgfVxuXG4gIGNoZWNrSXRlbUFscmVhZHlBZGRlZEluVHJpYWwoKSB7XG4gICAgbGV0IHVzZXI6IFVzZXIgfCBudWxsID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKClcbiAgICBpZiAodXNlcikge1xuICAgICAgbGV0IHJlcXVlc3Q6IGNoZWNrSXRlbUFscmVhZHlBZGRlZCA9IG5ldyBjaGVja0l0ZW1BbHJlYWR5QWRkZWQodGhpcy5yZXNwb25zZURhdGEuaXRlbUlkLCB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQsIHVzZXIudXNlcklkLCAnVFJJQUxfQ0FSVCcpXG4gICAgICB0aGlzLnJlc3RTZXJ2aWNlLmNoZWNrSXRlbUFscmVhZHlBZGRlZChyZXF1ZXN0KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNJdGVtQWRkZWRBc1RyaWFsID0gcmVzLmRhdGFcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2V0VHJpYWxDYXJ0SW5kZXhEQkRhdGEoKTtcbiAgICB9XG4gIH1cblxuICBnZXRUcmlhbENhcnRJbmRleERCRGF0YSgpIHtcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFRyaWFsQ2FydCgpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXNwb25zZS5vbnN1Y2Nlc3MgPSAodXNlclRyaWFsQ2FydFJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IHRyaWFsQ2FydEl0ZW06IE9yZGVyZWRJdGVtc1tdID0gdXNlclRyaWFsQ2FydFJlc3BvbnNlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdHJpYWxDYXJ0SXRlbSkge1xuICAgICAgICAgIGlmIChpdGVtLml0ZW1JZCA9PT0gdGhpcy5yZXNwb25zZURhdGEuaXRlbUlkICYmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA9PSAwIHx8IHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCA9PT0gaXRlbS52YXJpZW50SWQpKSB7XG4gICAgICAgICAgICB0aGlzLmlzSXRlbUFkZGVkQXNUcmlhbCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHNoYXJlUHJvZHVjdCgpIHtcbiAgICBuYXZpZ2F0b3Iuc2hhcmUoe1xuICAgICAgdGl0bGU6ICdCdXkgJyArIHRoaXMucmVzcG9uc2VEYXRhPy5uYW1lLFxuICAgICAgdGV4dDogdGhpcy5yZXNwb25zZURhdGEuYnJpZWY/LnJlcGxhY2UoLzxcXC9bXj5dKyg+fCQpL2csIFwiXCIpLFxuICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnU2hhcmVkJywgZGV0YWlsOiAnUHJvZHVjdCBzaGFyZWQnLCBrZXk6ICd3aXNobGlzdCcgfSkpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnU2hhcmVkJywgZGV0YWlsOiAnRmFpbGVkIHRvIHNoYXJlIHByb2R1Y3QuIFRyeSBBZ2Fpbi4nLCBrZXk6ICd3aXNobGlzdCcgfSkpO1xuXG4gIH1cbiAgcm91dGVUb0hvbWUoKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pO1xuICB9XG5cbiAgc2NyZWVuV2lkdGg6IGFueTtcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzogcmVzaXplXCIsIFtcIiRldmVudFwiXSlcbiAgZ2V0U2NyZWVuU2l6ZSgpIHtcbiAgICB0aGlzLnNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gIH1cblxuICBjdXJyZW50SW1nOiBhbnk7XG4gIGNoYW5nZUltZyh1cmw6IGFueSkge1xuICAgIHRoaXMuY3VycmVudEltZyA9IHVybDtcbiAgfVxuXG4gIGdldEtleXModmFyaWVudDogT2JqZWN0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh2YXJpZW50KTtcbiAgfVxuXG4gIGdvVG9DYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NhcnQnXSk7XG4gIH1cblxuICBidXlOb3coKTogdm9pZCB7XG4gICAgdGhpcy5hZGRUb0NhcnQoKTtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9jYXJ0J10sIHsgcXVlcnlQYXJhbXM6IHsgY2hlY2tvdXQ6IHRydWUgfSB9KTtcbiAgfVxuXG4gIGFkZFRvQ2FydCh0eXBlOiAnQUREJyB8ICdTVUJTVFJBQ1QnID0gJ0FERCcpIHtcbiAgICBpZiAodGhpcy5pc0l0ZW1PdXRPZlN0b2NrKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnd2FybicsIHN1bW1hcnk6ICdDYXJ0JywgZGV0YWlsOiAnSXRlbSBpcyBub3QgYXZhaWxhYmxlIGFzIG9mIG5vdy4gV2Ugd2lsbCBub3RpZnkgeW91IG9uY2UgYXZhaWxhYmxlJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XG4gICAgICAgIGl0ZW1WYXJpZW50LnF1YW50aXR5ICs9ICh0eXBlID09ICdBREQnID8gMSA6IC0xKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSBpdGVtVmFyaWVudC5xdWFudGl0eTtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUludmVudG9yeSA9IGl0ZW1WYXJpZW50Lml0ZW1JbnZlbnRvcnk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbWFnZXMgPSBpdGVtVmFyaWVudC52YXJpYW50SW1hZ2VzO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkpIHtcbiAgICAgICAgbGV0IGlzUHJlc2VudDogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0udmFyaWVudElkID09IHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCkge1xuICAgICAgICAgICAgaXRlbS5xdWFudGl0eSA9IHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5O1xuICAgICAgICAgICAgaXNQcmVzZW50ID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGlmICghaXNQcmVzZW50KVxuICAgICAgICAgIHRoaXMuVVNFUl9DQVJUPy5wdXNoKG5ldyBPcmRlcmVkSXRlbXModGhpcy5yZXNwb25zZURhdGEsIHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5VU0VSX0NBUlQgPSB0aGlzLlVTRVJfQ0FSVD8uZmlsdGVyKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IGl0ZW0udmFyaWVudElkICE9IHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCkgPz8gW107XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvQ2FydCh0aGlzLnJlc3BvbnNlRGF0YSBhcyBQcm9kdWN0LCBpdGVtVmFyaWVudD8udmFyaWFudElkKTtcbiAgICB9IGVsc2Uge1xuXG4gICAgICBpZiAoIXRoaXMucmVzcG9uc2VEYXRhPy5xdWFudGl0eSlcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSAwO1xuICAgICAgaWYgKHR5cGUgPT0gJ0FERCcpIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgKz0gMTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSAtPSAxO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0NhcnQodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCk7XG4gICAgfVxuICB9XG5cbiAgZ29Ub0ZpbHRlcihjYXRlZ29yeTogc3RyaW5nKSB7XG4gICAgY2F0ZWdvcnkgPSBjYXRlZ29yeS5yZXBsYWNlQWxsKFwiIFwiLCBcIl9cIilcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2xpc3QnXSwgeyBxdWVyeVBhcmFtczogeyBjYXRlZ29yeTogY2F0ZWdvcnkgfSB9KTtcbiAgfVxuXG4gIGFkZFRvRmF2b3VyaXRlKCkge1xuICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IHRydWU7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnU3VjY2VzcycsIGRldGFpbDogJ0l0ZW0gYWRkZWQgdG8geW91ciB3aXNobGlzdCcsIGtleTogJ3dpc2hsaXN0JyB9KTtcbiAgICBpZiAodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbnZlbnRvcnkgPSBpdGVtVmFyaWVudC5pdGVtSW52ZW50b3J5O1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW1hZ2VzID0gaXRlbVZhcmllbnQudmFyaWFudEltYWdlcztcbiAgICAgICAgaXRlbVZhcmllbnQud2lzaGxpc3QgPSB0cnVlO1xuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0Zhdm91cml0ZSh0aGlzLnJlc3BvbnNlRGF0YSBhcyBQcm9kdWN0LCBpdGVtVmFyaWVudC52YXJpYW50SWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0Zhdm91cml0ZSh0aGlzLnJlc3BvbnNlRGF0YSBhcyBQcm9kdWN0KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNJdGVtQXNGYXZvcml0ZSkge1xuICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5wdXNoKG5ldyBPcmRlcmVkSXRlbXModGhpcy5yZXNwb25zZURhdGEsIHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLlVTRVJfV0lTSExJU1QgPSB0aGlzLlVTRVJfV0lTSExJU1Q/LmZpbHRlcigoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiBpdGVtLnZhcmllbnRJZCAhPSB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpID8/IFtdO1xuICAgIH1cbiAgfVxuICByZW1vdmVUb0Zhdm91cml0ZSgpIHtcbiAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSBmYWxzZTtcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdTdWNjZXNzJywgZGV0YWlsOiAnSXRlbSByZW1vdmVkIGZyb20geW91ciB3aXNobGlzdCcsIGtleTogJ3dpc2hsaXN0JyB9KTtcbiAgICBpZiAodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XG4gICAgICAgIGl0ZW1WYXJpZW50Lndpc2hsaXN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UucmVtb3ZlSXRlbUZyb21GYXZvdXJpdGUodGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXJ0U2VydmljZS5yZW1vdmVJdGVtRnJvbUZhdm91cml0ZSh0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpO1xuICAgIH1cbiAgfVxuXG4gIGdldFByb2R1Y3RCeUNhdGVnb3J5KCkge1xuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UHJvZHVjdEJ5Q2F0ZWdvcnlJZCh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5pdGVtQ2F0ZWdvcmllcz8uWzBdPy5yZWZJZCA/PyBcIlwiKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVsYXRlZFByb2R1Y3REYXRhID0gcmVzcG9uc2UuZGF0YT8uZmlsdGVyKChwcm9kdWN0OiBQcm9kdWN0KSA9PiB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSWQgIT0gcHJvZHVjdC5pdGVtSWQpO1xuICAgICAgaWYgKHRoaXMucmVsYXRlZFByb2R1Y3REYXRhPy5sZW5ndGggPT0gMClcbiAgICAgICAgdGhpcy5nZXRQcm9kdWN0QnlDb2xsZWN0aW9uKCk7XG4gICAgfSlcbiAgfVxuICBnZXRQcm9kdWN0QnlDb2xsZWN0aW9uKCkge1xuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UHJvZHVjdEJ5Q29sbGVjdGlvbklkKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtQ2F0ZWdvcmlzYXRpb24/Lml0ZW1Db2xsZWN0aW9uPy5bMF0ucmVmSWQgPz8gXCJcIikuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlbGF0ZWRQcm9kdWN0RGF0YSA9IHJlc3BvbnNlLmRhdGE/LmZpbHRlcigocHJvZHVjdDogUHJvZHVjdCkgPT4gdGhpcy5yZXNwb25zZURhdGEuaXRlbUlkICE9IHByb2R1Y3QuaXRlbUlkKTtcbiAgICB9KVxuICB9XG4gIGNoYW5nZVByb2R1Y3QocHJvZHVjdDogUHJvZHVjdCkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2RldGFpbHMnLCBwcm9kdWN0LnNsdWdpZmllZE5hbWUsIHByb2R1Y3QudmFyaWVudElkXSk7XG4gICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSAwO1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICB9XG4gIGdldEtleUJ5SWR4KHByb3BlcnR5OiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocHJvcGVydHkpW2luZGV4XTtcbiAgfVxuICBpc1ZhcmllbnRBdmFpbGFibGUodmFyaWVudDogYW55KTogYm9vbGVhbiB7XG5cbiAgICAvLyB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50KT0+IHtcbiAgICAvLyAgIGxldCBmb3VuZFZhcmllbnQgPSB0cnVlO1xuICAgIC8vICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKT0+IHtcbiAgICAvLyAgICAgLy8gZm91bmRWYXJpZW50ID0gKHZhcmllbnRLZXkgPT0gdmFyaWVudC5wcm9wZXJ0aWVzW3Byb3BlcnR5XSkgJiYgZm91bmRWYXJpZW50O1xuICAgIC8vICAgfSlcbiAgICAvLyB9KVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldmlld1RpdGxlOiBzdHJpbmcgPSBcIlwiO1xuICByZXZpZXdEZXNjcmlwdGlvbjogc3RyaW5nID0gXCJcIjtcbiAgYWRkUHJvZHVjdFJldmlldygpIHtcbiAgICBjb25zdCB1c2VyRGV0YWlsczogVXNlciB8IG51bGwgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKTtcblxuICAgIGlmICh0aGlzLnJldmlld1RpdGxlLmxlbmd0aCA9PSAwICYmIHRoaXMucmV2aWV3RGVzY3JpcHRpb24ubGVuZ3RoID09IDAgJiYgdGhpcy5wcm9kdWN0UmV2aWV3ID09IDApXG4gICAgICByZXR1cm47XG5cbiAgICBpZiAoIXVzZXJEZXRhaWxzKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdMb2dpbicsIGRldGFpbDogJ1BsZWFzZSBsb2dpbiB0byBwb3N0IHJldmlldycsIGtleTogJ3dpc2hsaXN0JyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGF5bG9hZDogUmV2aWV3ID0ge1xuICAgICAgcHJvZHVjdElkOiB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSWQsXG4gICAgICB1c2VySWQ6IHVzZXJEZXRhaWxzLnVzZXJJZCxcbiAgICAgIHJhdGluZzogdGhpcy5wcm9kdWN0UmV2aWV3LFxuICAgICAgcmV2aWV3OiB0aGlzLnJldmlld0Rlc2NyaXB0aW9uLFxuICAgICAgdXNlck5hbWU6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5uYW1lLFxuICAgICAgdGl0bGU6IHRoaXMucmV2aWV3VGl0bGUsXG4gICAgICBwcm9kdWN0SW1hZ2VzOiBbXVxuICAgIH1cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmFkZFJldmlldyhwYXlsb2FkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLnNob3dSZXZpZXcgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnJhdGluZyArPSAxO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnUmV2aWV3JywgZGV0YWlsOiAnVGhhbmtzIGZvciBnaXZpbmcgeW91ciBmZWVkYmFjaycsIGtleTogJ3dpc2hsaXN0JyB9KTtcbiAgICAgIGlmICh0aGlzLnJldmlld0NvbXBvbmVudCkge1xuICAgICAgICB0aGlzLnJldmlld0NvbXBvbmVudC5nZXRBbGxSZXZpZXdzKCk7XG4gICAgICB9XG4gICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnUmV2aWV3JywgZGV0YWlsOiBlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UsIGtleTogJ3dpc2hsaXN0JyB9KTtcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRWYXJpZW50UXVhbnRpdHkocHJvZHVjdFZhcmllbnQ6IEl0ZW1WYXJpYW50KTogbnVtYmVyIHtcbiAgICBsZXQgaXRlbVF1YW50aXR5OiBudW1iZXIgPSAwO1xuICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcbiAgICAgIGlmIChwcm9kdWN0VmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpXG4gICAgICAgIGl0ZW1RdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XG4gICAgfSlcbiAgICByZXR1cm4gaXRlbVF1YW50aXR5O1xuICB9XG4gIHByaXZhdGUgaXNWYXJpZW50UHJlc2VudEluV2lzaHRsaXN0KHByb2R1Y3RWYXJpZW50OiBJdGVtVmFyaWFudCk6IGJvb2xlYW4ge1xuICAgIGxldCBwcmVzZW50OiBib29sZWFuID0gZmFsc2U7XG4gICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcbiAgICAgIGlmIChwcm9kdWN0VmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpXG4gICAgICAgIHByZXNlbnQgPSB0cnVlO1xuICAgIH0pXG4gICAgcmV0dXJuIHByZXNlbnQ7XG4gIH1cblxuICBlZGl0U2VjdGlvbigpIHtcblxuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8PSA0NzUpXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLl9ldmVudFNlcnZpY2UudG9nZ2xlRWRpdG9yRXZlbnQuZW1pdChmYWxzZSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9ldmVudFNlcnZpY2UuZWRpdFNlY3Rpb24uZW1pdCh7IGRhdGE6IHRoaXMuZGF0YSB9KTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgZ2V0IGlzSXRlbU91dE9mU3RvY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2sgPT0gMDtcbiAgfVxuICBnZXQgY3VycmVuY3koKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQlVTSU5FU1NfQ09OU1RBTlRTLkNVUlJFTkNZO1xuICB9XG4gIGdldCBpc0l0ZW1Mb3dTdG9jaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JbnZlbnRvcnk/Lm9wZW5pbmdTdG9jayA8IDU7XG4gIH1cbiAgZ2V0IGlzTW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCA8PSA0NzU7XG4gIH1cblxuICBnZXRDYXJhdChjYXJhdDogYW55KSB7XG4gICAgc3dpdGNoIChjYXJhdCkge1xuICAgICAgY2FzZSAnSzI0JzpcbiAgICAgICAgcmV0dXJuIFwiMjQgQ2FyYXRzXCJcbiAgICAgIGNhc2UgJ0syMic6XG4gICAgICAgIHJldHVybiBcIjIyIENhcmF0c1wiXG4gICAgICBjYXNlICdLMTgnOlxuICAgICAgICByZXR1cm4gXCIxOCBDYXJhdHNcIlxuICAgICAgY2FzZSAnSzE0JzpcbiAgICAgICAgcmV0dXJuIFwiMTQgQ2FyYXRzXCJcbiAgICAgIGNhc2UgJ0sxMCc6XG4gICAgICAgIHJldHVybiBcIjEwIENhcmF0c1wiXG4gICAgICBjYXNlICdLOTk5JzpcbiAgICAgICAgcmV0dXJuIFwiOTkuOSUgUHVyZVwiXG4gICAgICBjYXNlICdLOTI1JzpcbiAgICAgICAgcmV0dXJuIFwiOTIuNSUgUHVyZVwiXG4gICAgICBjYXNlICdLOTAwJzpcbiAgICAgICAgcmV0dXJuIFwiOTAlIFB1cmVcIlxuICAgICAgY2FzZSAnVlMnOlxuICAgICAgICByZXR1cm4gXCJWZXJ5IFNsaWdodGx5IEluY2x1ZGVkXCJcbiAgICAgIGNhc2UgJ1NJJzpcbiAgICAgICAgcmV0dXJuIFwiU2xpZ2h0bHkgSW5jbHVkZWRcIlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiMjQgQ2FyYXRzXCJcbiAgICB9XG4gIH1cbiAgZ2V0UHJpY2VQZXJHcmFtKHByaWNlOiBhbnksIG1hdGVyaWFsVHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKG1hdGVyaWFsVHlwZSA9PT0gJ0RJQU1PTkQnIHx8IG1hdGVyaWFsVHlwZSA9PT0gJ0dPTEQnKSB7XG4gICAgICByZXR1cm4gcHJpY2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG4gIGlzRGVzY3JpcHRpb25Db2xsYXBzZWQgPSBmYWxzZTtcblxuICB0b2dnbGVEZXNjcmlwdGlvbigpIHtcbiAgICB0aGlzLmlzRGVzY3JpcHRpb25Db2xsYXBzZWQgPSAhdGhpcy5pc0Rlc2NyaXB0aW9uQ29sbGFwc2VkO1xuICB9XG4gIGlzUHJpY2VCcmVha3VwID0gZmFsc2VcbiAgdG9nZ2xlUHJpY2VCcmVha0Rvd24oKSB7XG4gICAgdGhpcy5pc1ByaWNlQnJlYWt1cCA9ICF0aGlzLmlzUHJpY2VCcmVha3VwO1xuICB9XG4gIGdldERpZmZlcmVuY2Uoc2VsbGluZ1ByaWNlOiBhbnksIG1ycDogYW55KTogbnVtYmVyIHtcbiAgICBpZiAoIXNlbGxpbmdQcmljZSB8fCAhbXJwKVxuICAgICAgcmV0dXJuIDA7XG4gICAgcmV0dXJuIG1ycCAtIHNlbGxpbmdQcmljZTtcbiAgfVxuICBnZXRCYWNrZ3JvdW5kQ29sb3IodHlwZTogc3RyaW5nKSB7XG4gICAgLy8gc3dpdGNoICh0eXBlKSB7XG4gICAgLy8gICBjYXNlIFwiR09MRFwiOlxuICAgIC8vICAgICByZXR1cm4gXCIjRkZGNEQxXCJcbiAgICAvLyAgIGNhc2UgXCJESUFNT05EXCI6XG4gICAgLy8gICAgIHJldHVybiBcIiNFRkUxRjRcIlxuICAgIC8vICAgY2FzZSBcIlNJTFZFUlwiOlxuICAgIC8vICAgICByZXR1cm4gXCJsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCAjRkFGQUZBIDAlLCAjRkZGRkZGIDEwMCUpXCJcbiAgICAvLyAgIGRlZmF1bHQ6XG4gICAgLy8gICAgIHJldHVybiBcIiNlMmY2ZmZcIlxuICAgIC8vIH1cbiAgICByZXR1cm4gXCIjRkZGOUY1XCJcbiAgfVxuICBnZXRIZWFkZXJDb2xvcih0eXBlOiBzdHJpbmcpIHtcbiAgICAvLyBzd2l0Y2ggKHR5cGUpIHtcbiAgICAvLyAgIGNhc2UgXCJHT0xEXCI6XG4gICAgLy8gICAgIHJldHVybiBcIiNGRkYzRTlcIlxuICAgIC8vICAgY2FzZSBcIkRJQU1PTkRcIjpcbiAgICAvLyAgICAgcmV0dXJuIFwiIzlENDNCOFwiXG4gICAgLy8gICBjYXNlIFwiU0lMVkVSXCI6XG4gICAgLy8gICAgIHJldHVybiBcImxpbmVhci1ncmFkaWVudCgxODBkZWcsICNCREJEQkQgMCUsICNFMkUyRTIgMTAwJSlcIlxuICAgIC8vICAgZGVmYXVsdDpcbiAgICAvLyAgICAgcmV0dXJuIFwibGluZWFyLWdyYWRpZW50KDE1OWRlZywgcmdiYSg2NSwxMDUsMjI1LDEpIDAlLCByZ2JhKDEzNywyMDcsMjQwLDEpIDEwMCUpXCJcbiAgICAvLyB9XG4gICAgcmV0dXJuIFwiI0ZGRjNFOVwiXG4gIH1cbiAgZm9ybWF0SXRlbUNvZGUoY29kZTogYW55KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIGNvZGU/LnJlcGxhY2VBbGwoJ18nLCAnICcpLnJlcGxhY2VBbGwoJy0nLCAnICcpID8/ICcnO1xuICB9XG5cbiAgZ2V0VGV4dENvbG9yKGNvbG9yOiBhbnkpIHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAxMzA7XG4gICAgY29uc3QgciA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDEsIDMpLCAxNik7XG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDMsIDUpLCAxNik7XG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDUsIDcpLCAxNik7XG4gICAgY29uc3QgYnJpZ2h0bmVzcyA9IChyICogMjk5ICsgZyAqIDU4NyArIGIgKiAxMTQpIC8gMTAwMDtcblxuICAgIHJldHVybiBicmlnaHRuZXNzID4gdGhyZXNob2xkID8gJyMwMDAwMDAnIDogJyNmZmZmZmYnO1xuICB9XG4gIGxhbmd1YWdlczogc3RyaW5nW10gPSBbXCJFbmdsaXNoXCIsIFwiVGVsdWd1XCIsIFwiSGluZGlcIiwgXCJUYW1pbFwiLCBcIkthbm5hZGFcIiwgXCJNYWxheWFsYW1cIiwgXCJPdGhlcnNcIl1cbiAgc2VsZWN0ZWRMYW5nOiBzdHJpbmcgPSB0aGlzLmxhbmd1YWdlc1swXVxuXG4gIGdldENsYXNzKG1hcDogYW55KSB7XG4gICAgaWYgKG1hcC5zaXplID09IDEpXG4gICAgICByZXR1cm4gJ2NvbC02J1xuICAgIGVsc2UgaWYgKG1hcC5zaXplID09IDIpXG4gICAgICByZXR1cm4gJ2NvbC00J1xuICAgIGVsc2UgaWYgKG1hcC5zaXplID09IDMpXG4gICAgICByZXR1cm4gJ2NvbC0zJ1xuICAgIGVsc2VcbiAgICAgIHJldHVybiAnd2lkdGgtbWF4JztcbiAgfVxuICBvbkZpbmRJblN0b3JlKGlkOiBzdHJpbmcpIHtcbiAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9zdG9yZSddLCB7IHF1ZXJ5UGFyYW1zOiB7IHN0b3JlSWQ6IGlkIH0gfSk7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvc3RvcmUtbGlzdCddKTtcbiAgfVxuXG4gIG9uQm9va0FwcG9pbnRtZW50KCkge1xuXG4gIH1cbiAgaXNEZXRhaWxzOiBib29sZWFuID0gZmFsc2U7XG4gIHBpbmNvZGU6IGFueTtcbiAgc3RvcmVEZXRhaWxzOiBhbnk7XG4gIGdldFN0b3JlRGV0YWlscygpIHtcbiAgICBpZiAodGhpcy5waW5jb2RlID09IG51bGwgfHwgdGhpcy5waW5jb2RlLnRvU3RyaW5nKCkubGVuZ3RoICE9IDYpIHtcbiAgICAgIHRoaXMuaXNQaW5Db2RlID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0U3RvcmVMb2NhdG9yRGV0YWlscyh0aGlzLnBpbmNvZGUudG9TdHJpbmcoKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5pc0RldGFpbHMgPSB0cnVlO1xuICAgICAgdGhpcy5zdG9yZURldGFpbHMgPSByZXM/LmRhdGE7XG4gICAgICB0aGlzLmlzUGluQ29kZSA9IHRydWU7XG4gICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiBlcnI/LmVycm9yPy5tZXNzYWdlLCBrZXk6ICdTdG9yZSBMb2NhdG9yJyB9KTtcbiAgICAgIH0pXG4gIH1cbiAgYnJhbmRQcm9taXNlczogYW55W10gPSBbXTtcbiAgZWNvbUNvbmZpZ3M6IGFueTtcbiAgZ2V0RWNvbW1lcmNlQ29uZmlncygpIHtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEVjb21tZXJjZUNvbmZpZ3MoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLmJyYW5kUHJvbWlzZXMgPSByZXM/LmRhdGE/LmJyYW5kUHJvbWlzZXNcbiAgICAgIHRoaXMuZWNvbUNvbmZpZ3MgPSByZXM/LmRhdGFcbiAgICB9KVxuICB9XG4gIGxvY2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBvdGhlckxhbmd1YWdlOiBzdHJpbmcgPSAnJztcblxuICB2aWRlb0NhbGxQYXlsb2FkOiBhbnkgPSB7XG4gICAgYnVzaW5lc3NJZDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSA/PyBcIlwiLFxuICAgIG1vYmlsZU51bWJlcjogXCJcIixcbiAgICBwaW5jb2RlOiBcIlwiLFxuICAgIHVzZXJuYW1lOiBcIlwiLFxuICAgIGVtYWlsOiBcIlwiLFxuICAgIG1lc3NhZ2U6IGBgLFxuICB9XG5cbiAgdmFsaWRhdGlvbkVycm9yczogYW55ID0ge1xuICAgIHVzZXJuYW1lOiBmYWxzZSxcbiAgICBtb2JpbGVOdW1iZXI6IGZhbHNlLFxuICAgIC8vIHBpbmNvZGU6IGZhbHNlLFxuICAgIC8vIGVtYWlsOiBmYWxzZVxuICB9O1xuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2NoZWR1bGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHNjaGVkdWxlVmlkZW9DYWxsKCkge1xuICAgIGlmICh0aGlzLmlzU3VibWl0dGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc2V0VmFsaWRhdGlvbkVycm9ycygpO1xuICAgIGxldCBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMudmlkZW9DYWxsUGF5bG9hZC51c2VybmFtZT8udHJpbSgpKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMudXNlcm5hbWUgPSB0cnVlO1xuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMubW9iaWxlTnVtYmVyID0gdHJ1ZTtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyLnRvU3RyaW5nKCkubGVuZ3RoICE9PSAxMCkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLm1vYmlsZU51bWJlciA9IHRydWU7XG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBpZiAoIXRoaXMudmlkZW9DYWxsUGF5bG9hZC5waW5jb2RlKSB7XG4gICAgLy8gICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucGluY29kZSA9IHRydWU7XG4gICAgLy8gICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgIC8vIH0gZWxzZSBpZiAodGhpcy52aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGUudG9TdHJpbmcoKS5sZW5ndGggIT09IDYpIHtcbiAgICAvLyAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5waW5jb2RlID0gdHJ1ZTtcbiAgICAvLyAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgLy8gfVxuXG4gICAgLy8gaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQuZW1haWw/LnRyaW0oKSkge1xuICAgIC8vICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLmVtYWlsID0gdHJ1ZTtcbiAgICAvLyAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgLy8gfSBlbHNlIGlmICghL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvLnRlc3QodGhpcy52aWRlb0NhbGxQYXlsb2FkLmVtYWlsKSkge1xuICAgIC8vICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLmVtYWlsID0gdHJ1ZTtcbiAgICAvLyAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgLy8gfVxuICAgIC8vIHx8ICF0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZVxuICAgIGlmIChoYXNFcnJvcnMpIHtcbiAgICAgIGlmICghdGhpcy52aWRlb0NhbGxQYXlsb2FkLnVzZXJuYW1lPy50cmltKCkgfHwgIXRoaXMudmlkZW9DYWxsUGF5bG9hZC5tb2JpbGVOdW1iZXIpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxuICAgICAgICAgIGRldGFpbDogJ1BsZWFzZSBmaWxsIGFsbCB0aGUgcmVxdWlyZWQgZGV0YWlscycsXG4gICAgICAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudmlkZW9DYWxsUGF5bG9hZC5tb2JpbGVOdW1iZXIudG9TdHJpbmcoKS5sZW5ndGggIT09IDEwKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICBzZXZlcml0eTogJ3dhcm4nLFxuICAgICAgICAgIHN1bW1hcnk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJyxcbiAgICAgICAgICBkZXRhaWw6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCAxMC1kaWdpdCBtb2JpbGUgbnVtYmVyJyxcbiAgICAgICAgICBrZXk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIH0gZWxzZSBpZiAodGhpcy52aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGUudG9TdHJpbmcoKS5sZW5ndGggIT09IDYpIHtcbiAgICAgIC8vICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgLy8gICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAvLyAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxuICAgICAgLy8gICAgIGRldGFpbDogJ1BsZWFzZSBlbnRlciBhIHZhbGlkIDYtZGlnaXQgcGluY29kZScsXG4gICAgICAvLyAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcbiAgICAgIC8vICAgfSk7XG4gICAgICAvLyB9XG4gICAgICAvLyBlbHNlIGlmICghdGhpcy52aWRlb0NhbGxQYXlsb2FkLmVtYWlsPy50cmltKCkgfHwgIS9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLy50ZXN0KHRoaXMudmlkZW9DYWxsUGF5bG9hZC5lbWFpbCkpIHtcbiAgICAgIC8vICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgLy8gICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAvLyAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxuICAgICAgLy8gICAgIGRldGFpbDogJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnLFxuICAgICAgLy8gICAgIGtleTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnZpZGVvQ2FsbFBheWxvYWQubWVzc2FnZSA9IHRoaXMudmlkZW9DYWxsUGF5bG9hZC5tZXNzYWdlICsgYEhpLCBJJ3ZlIGp1c3Qgc2NoZWR1bGVkIGEgdmlkZW8gY2FsbCB3aXRoIHlvdSBmb3IgdGhpcyBwcm9kdWN0ICR7dGhpcy5yZXNwb25zZURhdGE/Lm5hbWV9LiBJdCdzIGltcG9ydGFudCBhbmQgSSdkIGFwcHJlY2lhdGUgeW91ciB0aW1lIOKAlCBsb29raW5nIGZvcndhcmQgdG8gY29ubmVjdGluZyBhcyBzb29uIGFzIHBvc3NpYmxlICBpbiAke3RoaXMuc2VsZWN0ZWRMYW5nID09ICdPdGhlcnMnID8gdGhpcy5vdGhlckxhbmd1YWdlIDogdGhpcy5zZWxlY3RlZExhbmd9IGxhbmd1YWdlYDtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLnBvc3RWaWRlb0NhbGxEZXRhaWxzKHRoaXMudmlkZW9DYWxsUGF5bG9hZCkuc3Vic2NyaWJlKFxuICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICBzZXZlcml0eTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgIHN1bW1hcnk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJyxcbiAgICAgICAgICBkZXRhaWw6ICdZb3VyIFZpZGVvIENhbGwgaXMgU2NoZWR1bGVkIFN1Y2Nlc3NmdWxseScsXG4gICAgICAgICAga2V5OiAnVmlkZW8gU2NoZWR1bGluZydcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jbG9zZURpYWxvZygpXG4gICAgICB9LFxuICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICBzdW1tYXJ5OiAnRXJyb3InLFxuICAgICAgICAgIGRldGFpbDogZXJyPy5lcnJvcj8ubWVzc2FnZSxcbiAgICAgICAgICBrZXk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHJlc2V0VmFsaWRhdGlvbkVycm9ycygpIHtcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMgPSB7XG4gICAgICB1c2VybmFtZTogZmFsc2UsXG4gICAgICBtb2JpbGVOdW1iZXI6IGZhbHNlLFxuICAgICAgcGluY29kZTogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgcmVzZXRGb3JtKCkge1xuICAgIHRoaXMudmlkZW9DYWxsUGF5bG9hZCA9IHtcbiAgICAgIHVzZXJuYW1lOiAnJyxcbiAgICAgIG1vYmlsZU51bWJlcjogJycsXG4gICAgICBwaW5jb2RlOiAnJyxcbiAgICAgIG1lc3NhZ2U6ICcnXG4gICAgfTtcbiAgICB0aGlzLnJlc2V0VmFsaWRhdGlvbkVycm9ycygpO1xuICB9XG4gIG9uSW5wdXRDaGFuZ2UoZmllbGQ6IGFueSkge1xuICAgIGlmICh0aGlzLnZhbGlkYXRpb25FcnJvcnNbZmllbGRdKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnNbZmllbGRdID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGNsb3NlTW9kYWwoKSB7XG4gICAgY29uc3QgbW9kYWxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVNb2RhbENlbnRlcicpO1xuICAgIGlmIChtb2RhbEVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKG1vZGFsRWxlbWVudCwgJ2RhdGEtYnMtZGlzbWlzcycsICdtb2RhbCcpO1xuICAgICAgbW9kYWxFbGVtZW50LmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QnV0dG9uSWQoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1tpbmRleF0/LmlkID8/IFwiXCI7XG4gIH1cbiAgZ2V0QnV0dG9uU3R5bGUoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1tpbmRleF0/LnN0eWxlcztcbiAgfVxuICBvcGVuRGlhbG9nQm94KHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxIVE1MRGl2RWxlbWVudD4pOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWc6IE1hdERpYWxvZ0NvbmZpZyA9IHtcbiAgICAgIHBhbmVsQ2xhc3M6ICcnLFxuICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuc2NyZWVuV2lkdGggPiA0NzUpIHtcbiAgICAgIGNvbmZpZy5wYW5lbENsYXNzID0gJ3ZpZGVvLWNhbGwtZGlhbG9nJztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnLndpZHRoID0gJzEwMHZ3JztcbiAgICAgIGNvbmZpZy5oZWlnaHQgPSAnMTAwdmgnO1xuICAgICAgY29uZmlnLm1heFdpZHRoID0gJzEwMHZ3JztcbiAgICAgIGNvbmZpZy5wYW5lbENsYXNzID0gJ2FwcG9pbnRtZW50LWZvcm0nO1xuICAgIH1cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLm1hdERpYWxvZy5vcGVuKHRlbXBsYXRlLCBjb25maWcpO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAgIH0pO1xuICB9XG5cbiAgbWF0Q2xvc2VEaWFsb2coKSB7XG4gICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcbiAgfVxuXG4gIGNsb3NlRGlhbG9nKCkge1xuICAgIHRoaXMubWF0RGlhbG9nLmNsb3NlQWxsKCk7XG4gIH1cblxuICBnZXRSYXRpbmdzKG5vb2ZyYXRpbmdzOiBhbnkpIHtcbiAgICBpZiAobm9vZnJhdGluZ3MgPj0gMTAwMCkge1xuICAgICAgcmV0dXJuIChub29mcmF0aW5ncyAvIDEwMDApLnRvRml4ZWQoMSkgKyBcIksrXCI7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vb2ZyYXRpbmdzID4gMTAwMDAwMCkge1xuICAgICAgcmV0dXJuIChub29mcmF0aW5ncyAvIDEwMDAwMDApLnRvRml4ZWQoMSkgKyBcIk1cIjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gbm9vZnJhdGluZ3M7XG4gICAgfVxuICB9XG5cbiAgYWRkVG9UcmlhbENhcnQoKSB7XG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW52ZW50b3J5ID0gaXRlbVZhcmllbnQuaXRlbUludmVudG9yeTtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50LnZhcmlhbnRJbWFnZXM7XG4gICAgICAgIGl0ZW1WYXJpZW50Lndpc2hsaXN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9UcmlhbCh0aGlzLnJlc3BvbnNlRGF0YSBhcyBQcm9kdWN0LCBpdGVtVmFyaWVudC52YXJpYW50SWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub1RyaWFsKHRoaXMucmVzcG9uc2VEYXRhIGFzIFByb2R1Y3QpO1xuICAgIH1cbiAgICB0aGlzLmlzSXRlbUFkZGVkQXNUcmlhbCA9IHRydWU7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnU3VjY2VzcycsIGRldGFpbDogJ0l0ZW0gYWRkZWQgdG8geW91ciB0cmFpbCBjYXJ0Jywga2V5OiAnd2lzaGxpc3QnIH0pO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NhcnQnXSwgeyBxdWVyeVBhcmFtczogeyBjYXJ0VHlwZTogJ1RSSUFMJyB9IH0pXG4gIH1cbiAgcmV2aWV3c0RhdGE6IGFueVtdID0gW11cbiAgcmF0aW5nQ291bnRzOiBhbnlcbiAgcGFnZU51bWJlcjogbnVtYmVyID0gMFxuICBsb2FkTW9yZVJldmlld3MoKSB7XG4gICAgdGhpcy5wYWdlTnVtYmVyKys7XG4gICAgdGhpcy5nZXRSZXZpZXdzKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSWQpO1xuICB9XG4gIGdldFJldmlld3MocHJvZHVjdElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFJldmlld3NCeVByb2R1Y3RJZChwcm9kdWN0SWQsIHRoaXMucGFnZU51bWJlcikuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJldmlld3NEYXRhID0gWy4uLnRoaXMucmV2aWV3c0RhdGEsIC4uLnJlc3BvbnNlPy5kYXRhPy51c2VyUmV2aWV3c107XG4gICAgICB0aGlzLnJhdGluZ0NvdW50cyA9IHJlc3BvbnNlPy5kYXRhPy5vdmVyYWxsUmF0aW5nQ291bnRcbiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogZXJyb3I/LmVycm9yPy5tZXNzYWdlLCBrZXk6ICdSZXZpZXdzJyB9KTtcbiAgICB9KVxuICB9XG5cbiAgZ2V0UGVyY2VudGFnZShyYXRpbmc6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnJhdGluZ0NvdW50cyAmJiB0aGlzLnJhdGluZ0NvdW50c1tyYXRpbmddKSB7XG4gICAgICBsZXQgcGVyY2VudCA9ICh0aGlzLnJhdGluZ0NvdW50c1tyYXRpbmddIC8gdGhpcy5yZXNwb25zZURhdGE/LnRvdGFsUmV2aWV3Q291bnQpICogMTAwXG4gICAgICByZXR1cm4gcGVyY2VudC50b0ZpeGVkKDApO1xuICAgIH1cbiAgICByZXR1cm4gJzAnO1xuICB9XG5cbiAgZ2V0UkdCQShiZ0NvbG9yOiBhbnksIG9wYWNpdHk6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgciA9IHBhcnNlSW50KGJnQ29sb3Iuc2xpY2UoMSwgMyksIDE2KTtcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoYmdDb2xvci5zbGljZSgzLCA1KSwgMTYpO1xuICAgIGNvbnN0IGIgPSBwYXJzZUludChiZ0NvbG9yLnNsaWNlKDUsIDcpLCAxNik7XG4gICAgcmV0dXJuIGByZ2JhKCR7cn0sICR7Z30sICR7Yn0sICR7b3BhY2l0eSAvIDEwMH0pYDtcbiAgfVxuXG4gIHNob3dEZXRhaWxSZXZpZXcocmV2aWV3OiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkUmV2aWV3ID0gcmV2aWV3XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wZW5SZXZpZXdEZXRhaWwnKT8uY2xpY2soKVxuICB9XG4gIGdldCBzdHlsZXNMYXlvdXQoKSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5zdHlsZXM/LmxheW91dCB9IGFzIExheU91dE1vZGVsO1xuICB9XG5cbiAgZ2V0RGF0ZUFmdGVyeERheXMoKTogRGF0ZSB7XG4gICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGN1cnJlbnREYXRlLnNldERhdGUoY3VycmVudERhdGUuZ2V0RGF0ZSgpICsgKHRoaXMuZWNvbUNvbmZpZ3M/LmV4cGVjdGVkRGVsaXZlcnlEYXRlID8/IDcpKTtcbiAgICByZXR1cm4gY3VycmVudERhdGU7XG4gIH1cblxuICBnZXRQcm9kdWN0RGVzY3JpcHRpb25SZWNvbW1lbmRhdGlvbnMoKSB7XG4gICAgLy8gdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBidXNpbmVzc0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKTtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLnVzZXJJZDtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFByb2R1Y3REZXNjcmlwdGlvblJlY29tbWVuZGF0aW9ucyhidXNpbmVzc0lkLCB1c2VySWQpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZWNvbW1lZGVkRGF0YSA9IEFycmF5LmlzQXJyYXkocmVzcG9uc2U/LmRhdGEpID8gcmVzcG9uc2UuZGF0YSA6IFtdO1xuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyQ2FydCgpLnRoZW4oKGNhcnRSZXNwb25zZSkgPT4ge1xuICAgICAgICBjYXJ0UmVzcG9uc2Uub25zdWNjZXNzID0gKGNhcnREYXRhOiBhbnkpID0+IHtcblxuICAgICAgICAgIC8vIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuVVNFUl9DQVJUID0gY2FydERhdGEudGFyZ2V0LnJlc3VsdCBhcyB1bmtub3duIGFzIE9yZGVyZWRJdGVtc1tdO1xuICAgICAgICAgIHRoaXMucmVjb21tZWRlZERhdGE/LmZvckVhY2goKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09IHByb2R1Y3QucHJvZHVjdElkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgPSBwcm9kdWN0Py5pdGVtVmFyaWFudD8uWzBdO1xuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1WYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Lml0ZW1JbWFnZXMgPSBpdGVtVmFyaWVudC52YXJpYW50SW1hZ2VzID8/IFtdO1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LnByaWNlID0gaXRlbVZhcmllbnQuaXRlbVZhcmlhbnRQcmljZTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHByb2R1Y3QucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgIC8vIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSlcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcldoaXNobGlzdCgpLnRoZW4oKHdpc2hsaXN0UmVzcG9uc2UpID0+IHtcbiAgICAgICAgd2lzaGxpc3RSZXNwb25zZS5vbnN1Y2Nlc3MgPSAod2hpc2xpc3REYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLlVTRVJfV0lTSExJU1QgPSB3aGlzbGlzdERhdGEudGFyZ2V0LnJlc3VsdCBhcyB1bmtub3duIGFzIE9yZGVyZWRJdGVtc1tdO1xuXG4gICAgICAgICAgdGhpcy5yZWNvbW1lZGVkRGF0YT8uZm9yRWFjaCgocHJvZHVjdDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtSWQgPT0gcHJvZHVjdC5wcm9kdWN0SWQpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCA9IHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5bMF07XG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbVZhcmllbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3QuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50Py52YXJpYW50SW1hZ2VzID8/IFtdO1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LnByaWNlID0gaXRlbVZhcmllbnQuaXRlbVZhcmlhbnRQcmljZTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC53aGlzbGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJvZHVjdC53aGlzbGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxuICA8cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiIGtleT1cIndpc2hsaXN0XCJcbiAgICBbc2hvd1RyYW5zZm9ybU9wdGlvbnNdPVwiaXNNb2JpbGUgPyAndHJhbnNsYXRlWSgtMTAwJSknIDogJydcIj48L3AtdG9hc3Q+XG4gIDxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCJcbiAgICBbc2hvd1RyYW5zZm9ybU9wdGlvbnNdPVwiaXNNb2JpbGUgPyAndHJhbnNsYXRlWSgtMTAwJSknIDogJydcIj48L3AtdG9hc3Q+XG4gIDxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCIga2V5PVwiVmlkZW8gQ2FsbCBTY2hlZHVsZVwiXG4gICAgW3Nob3dUcmFuc2Zvcm1PcHRpb25zXT1cImlzTW9iaWxlID8gJ3RyYW5zbGF0ZVkoLTEwMCUpJyA6ICcnXCI+PC9wLXRvYXN0PlxuICA8cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiIGtleT1cIlZpZGVvIFNjaGVkdWxpbmdcIlxuICAgIFtzaG93VHJhbnNmb3JtT3B0aW9uc109XCJpc01vYmlsZSA/ICd0cmFuc2xhdGVZKC0xMDAlKScgOiAnJ1wiPjwvcC10b2FzdD5cbiAgPHNlY3Rpb24gY2xhc3M9XCJ0b3RhbC1jb250YWluZXJcIiBbaWRdPVwiZGF0YT8uaWRcIiBbc2ltcG9CYWNrZ3JvdW5kXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIHNpbXBvSG92ZXJcbiAgICAoaG92ZXJpbmcpPVwic2hvd0VkaXRUYWJzKCRldmVudClcIiBbYXR0ci5zdHlsZV09XCJjdXN0b21DbGFzc1wiPlxuXG4gICAgPCEtLSA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiIGNsYXNzPVwic3BlZWRkaWFsLWxpbmVhclwiICpuZ0lmPVwiaXNNb2JpbGVcIj5cbiAgICAgIDxwLXNwZWVkRGlhbCBbbW9kZWxdPVwiaXRlbXNcIiBkaXJlY3Rpb249XCJ1cFwiIFtidXR0b25TdHlsZV09XCJ7J2JvcmRlci1yYWRpdXMnOiAnNTAlJywgJ2hlaWdodCc6ICczMHB4J31cIiAvPlxuICAgIDwvZGl2PiAtLT5cbiAgICA8c2VjdGlvbiBjbGFzcz1cImNvbnRhaW5lclwiIFtpZF09XCJkYXRhPy5pZFwiIFtzaW1wb0FuaW1hdGlvbl09XCJzdHlsZXM/LmFuaW1hdGlvblwiIFtzcGFjaW5nSG9yaXpvbnRhbF09XCJzdHlsZXNMYXlvdXRcIlxuICAgICAgW3NpbXBvTGF5b3V0XT1cInN0eWxlcz8ubGF5b3V0XCIgI2NvbnRhaW5lcj5cbiAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImRpc3BsYXktbm9uZVwiPjxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6ICMwMjY3QzFcIlxuICAgICAgICAgIChjbGljayk9XCJyb3V0ZVRvSG9tZSgpXCI+SG9tZTwvYT4gL1xuICAgICAgICA8c3Bhbj57eyByZXNwb25zZURhdGE/Lm5hbWUgfCB0aXRsZWNhc2UgfX08L3NwYW4+XG4gICAgICA8L2Rpdj4gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG0tMCB3LTEwMCBtdC1sZy00IGgtYXV0byBvdmVyZmxvdy12aXNpYmxlXCIgI2Fib3ZlSGVpZ2h0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTYgY29sLXNtLTEyIGltYWdlLXNlY3Rpb24tbW9kZXJuXCIgI2ltYWdlU2VjdGlvbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGp1c3RpZnktY29udGVudC1zdGFydCBnYXAtMVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkltYWdlU2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy02IGNvbC1zbS0xMiBkZXRhaWwtc2VjdGlvbi1tb2Rlcm4gXCIgI2RldGFpbFNlY3Rpb24+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtaGVyby1jYXJkLW1vZGVyblwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTW9iaWxlXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ2YXJpYW50c1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJQcm9kdWN0RGVzY1wiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTW9iaWxlXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ2YXJpYW50c1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNNb2JpbGVcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkFjdGlvbkJ0blwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlY29tQ29uZmlncz8uZGVsaXZlcnlFbmFibGVkXCI+XG4gICAgICAgICAgICA8IS0tICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LmRlbGl2ZXJ5RW5hYmxlZFwiIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkRlbGl2ZXJ5U2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVjb21Db25maWdzPy5zdG9yZXNFbmFibGVkXCI+XG4gICAgICAgICAgICA8IS0tICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LnN0b3Jlc0VuYWJsZWRcIiAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJTdG9yZVNlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlY29tQ29uZmlncz8uYXBwb2ludG1lbnRCb29raW5nRW5hYmxlZFwiPlxuICAgICAgICAgICAgPCEtLSAqbmdJZj1cImVjb21Db25maWdzPy5hcHBvaW50bWVudEJvb2tpbmdFbmFibGVkXCIgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiVHJ5QXRIb21lXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIj5cbiAgICAgICAgICAgIDwhLS0gKm5nSWY9XCJlY29tQ29uZmlncz8udmlkZW9DYWxsRW5hYmxlZFwiIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZpZGVvQ2FsbFNjaGVkdWxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LmJyYW5kUHJvbWlzZUVuYWJsZWRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJicmFuZGluZ1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cblxuICAgICAgICAgIDwhLS0gTW92ZWQgZGVzY3JpcHRvcnMgdG8gRGV0YWlscyB0YWIgYmVsb3cgLS0+XG5cbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWRlc2MgYm9keS1sYXJnZSBkLWJsb2NrXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmJyaWVmXCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwicmVzcG9uc2VEYXRhLmJyaWVmXCI+PC9kaXY+IC0tPlxuICAgICAgICAgIDwhLS0gTW92ZWQgdGFncyB0byBEZXRhaWxzIHRhYiBiZWxvdyAtLT5cbiAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJTb2NpYWxJY29uc1wiPjwvbmctY29udGFpbmVyPiAtLT5cbiAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiUmV2aWV3U2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gVGFicyBOYXZpZ2F0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtdGFicy1jb250YWluZXJcIj5cbiAgICAgICAgPHVsIGNsYXNzPVwidGFicy1saXN0XCI+XG4gICAgICAgICAgPGxpIGNsYXNzPVwidGFiLWl0ZW1cIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYiA9PSAnRGV0YWlscydcIlxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImFjdGl2ZVRhYiA9PSAnRGV0YWlscycgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxuICAgICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImFjdGl2ZVRhYiA9PSAnRGV0YWlscycgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGFiKCdEZXRhaWxzJylcIj5EZXRhaWxzPC9saT5cbiAgICAgICAgICA8bGkgY2xhc3M9XCJ0YWItaXRlbVwiICpuZ0lmPVwicmV2aWV3c0RhdGFcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYiA9PSAnUmV2aWV3cydcIlxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImFjdGl2ZVRhYiA9PSAnUmV2aWV3cycgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxuICAgICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImFjdGl2ZVRhYiA9PSAnUmV2aWV3cycgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGFiKCdSZXZpZXdzJylcIj5SZXZpZXdzPC9saT5cbiAgICAgICAgICA8bGkgY2xhc3M9XCJ0YWItaXRlbVwiICpuZ0lmPVwibWF0ZXJpYWxCYXNlZFByaWNpbmdcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYiA9PSAnUHJpY2VCcmVha3VwJ1wiXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiYWN0aXZlVGFiID09ICdQcmljZUJyZWFrdXAnID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICcnXCJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJhY3RpdmVUYWIgPT0gJ1ByaWNlQnJlYWt1cCcgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGFiKCdQcmljZUJyZWFrdXAnKVwiPlByaWNlIEJyZWFrdXA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiIENvbnRlbnQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnQtcGFuZVwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlVGFiID09ICdEZXRhaWxzJ1wiPlxuICAgICAgICAgIDwhLS0gSW50ZWdyYXRlZCBkZXNjcmlwdG9ycyBhbmQgdGFncyBoZXJlIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVzY3JpcHRvcnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVRhYiA9PSAnUmV2aWV3cydcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiUmV2aWV3c1NlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVRhYiA9PSAnUHJpY2VCcmVha3VwJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi1nbGFzcy1jb250YWluZXIgbXQtMlwiPlxuXG4gICAgICAgICAgICA8IS0tIE9uZSBjYXJkIHBlciBtYXRlcmlhbCDigJQgZ2VuZXJpYywgd29ya3MgZm9yIGFueSBtYXRlcmlhbCB0eXBlIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWxlIG9mIHJlc3BvbnNlRGF0YT8ubWF0ZXJpYWxzXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi1nbGFzcy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBiLWdsYXNzLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCInI2ZmZidcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGVsZT8ubWF0ZXJpYWxOYW1lIHwgdGl0bGVjYXNlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBiLWdsYXNzLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYi1sYWJlbFwiPlB1cml0eTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGItdmFsdWVcIj57eyBlbGU/LnB1cml0eSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItZ2xhc3Mtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBiLWxhYmVsXCI+TmV0IFdlaWdodDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGItdmFsdWVcIj57eyBlbGU/LnF1YW50aXR5IH19IHt7IGVsZT8udW5pdCB8IHRpdGxlY2FzZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItZ2xhc3Mtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBiLWxhYmVsXCI+UmF0ZSAvIHt7IGVsZT8udW5pdCB8IHRpdGxlY2FzZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGItdmFsdWVcIj7igrl7eyBlbGU/LnByaWNlUGVyVW5pdCB8IG51bWJlcjonMS4yLTInIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi1nbGFzcy1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGItbGFiZWxcIj5WYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGItdmFsdWVcIj7igrl7eyAoZWxlPy5xdWFudGl0eSAqIGVsZT8ucHJpY2VQZXJVbml0KSB8IG51bWJlcjonMS4yLTInIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIE1ha2luZyBDaGFyZ2VzIGNhcmQgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItZ2xhc3MtY2FyZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItZ2xhc3MtaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiJyNmZmYnXCI+XG4gICAgICAgICAgICAgICAgTWFraW5nIENoYXJnZXNcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi1nbGFzcy1yb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBiLWxhYmVsXCI+TmV0IFdlaWdodDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBiLXZhbHVlXCI+e3sgcmVzcG9uc2VEYXRhPy5iYXNlV2VpZ2h0IH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBiLWdsYXNzLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGItbGFiZWxcIj5NYWtpbmcgQ2hhcmdlICU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYi12YWx1ZVwiPnt7IHJlc3BvbnNlRGF0YT8ubWFraW5nQ2hhcmdlUGVyY2VudGFnZSB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItZ2xhc3Mtcm93XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYi1sYWJlbFwiPlZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGItdmFsdWVcIj7igrl7eyByZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/Lm1ha2luZ0NoYXJnZUFtb3VudCB8IG51bWJlcjonMS4yLTInIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFN1bW1hcnkgY2FyZCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi1zdW1tYXJ5LWNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBiLXN1bW1hcnktcm93XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+VG90YWwgVmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+4oK5e3sgcmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy5wcmljZVdpdGhvdXRUYXggfCBudW1iZXI6JzEuMi0yJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi1zdW1tYXJ5LXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlRheCAoe3sgcmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy50YXhSZWY/LnRheFBlcmNlbnQgfX0lIEdTVCk8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+4oK5e3sgcmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy50YXhBbW91bnQgfCBudW1iZXI6JzEuMi0yJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi1ncmFuZC10b3RhbFwiXG4gICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIicjZmZmJ1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlRPVEFMPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPuKCuXt7IChyZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/LnByaWNlV2l0aG91dFRheCArIHJlc3BvbnNlRGF0YT8uamV3ZWxyeVByaWNlQnJlYWt1cD8udGF4QW1vdW50KSB8IG51bWJlcjonMS4yLTInIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9zZWN0aW9uPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNlbnRWaWV3SXRlbUxpc3Q/Lmxlbmd0aFwiPlxuICAgICAgPHNpbXBvLWZlYXR1cmVkLXByb2R1Y3RzIFtlZGl0XT1cImZhbHNlXCIgW2RhdGFdPVwiZmVhdHVyZVByb2R1Y3REYXRhXCIgW3Jlc3BvbnNlRGF0YV09XCJyZWNlbnRWaWV3SXRlbUxpc3RcIlxuICAgICAgICBbaXNSZWxhdGVkUHJvZHVjdF09XCJ0cnVlXCIgKGNoYW5nZURldGFpbFByb2R1Y3QpPVwiY2hhbmdlUHJvZHVjdCgkZXZlbnQpXCI+PC9zaW1wby1mZWF0dXJlZC1wcm9kdWN0cz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNlbnRWaWV3SXRlbUxpc3Q/Lmxlbmd0aFwiPlxuICAgICAgPHNpbXBvLWZlYXR1cmVkLXByb2R1Y3RzIFtlZGl0XT1cImZhbHNlXCIgW2RhdGFdPVwicmVjZW50Vmlld2VkRGF0YVwiIFtyZXNwb25zZURhdGFdPVwicmVjZW50Vmlld0l0ZW1MaXN0XCJcbiAgICAgICAgW2lzUmVsYXRlZFByb2R1Y3RdPVwidHJ1ZVwiPjwvc2ltcG8tZmVhdHVyZWQtcHJvZHVjdHM+XG4gICAgPC9uZy1jb250YWluZXI+IC0tPlxuICAgIDwhLS0gPG5nLWNvbnRhaW5lcj5cbiAgICAgIDxzaW1wby1jdXN0b21lci1yZXZpZXcgW2RhdGFdPVwiZGF0YVwiPjwvc2ltcG8tY3VzdG9tZXItcmV2aWV3PlxuICAgIDwvbmctY29udGFpbmVyPiAtLT5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdHlsZXM/LmRldmlkZXI/LmRpc3BsYXlcIj5cbiAgICAgIDxzaW1wby1zdmctZGl2aWRlciBbZGl2aWRlclR5cGVdPVwic3R5bGVzPy5kZXZpZGVyPy5kZXZpZGVyVHlwZVwiXG4gICAgICAgIFtjb2xvcl09XCJuZXh0Q29tcG9uZW50Q29sb3I/LmNvbG9yXCI+PC9zaW1wby1zdmctZGl2aWRlcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZWRpdH1cIiAqbmdJZj1cInNob3dFZGl0b3JzXCI+XG4gICAgICA8c2ltcG8taG92ZXItZWxlbWVudHMgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiIFtlZGl0T3B0aW9uc109XCJlZGl0XCI+PC9zaW1wby1ob3Zlci1lbGVtZW50cz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0RlbGV0ZVwiIFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZGVsZXRlfVwiPlxuICAgICAgPHNpbXBvLWRlbGV0ZS1ob3Zlci1lbGVtZW50IFtkYXRhXT1cImRhdGFcIiBbaW5kZXhdPVwiaW5kZXhcIj48L3NpbXBvLWRlbGV0ZS1ob3Zlci1lbGVtZW50PlxuICAgIDwvZGl2PlxuICA8L3NlY3Rpb24+XG48L25nLWNvbnRhaW5lcj5cblxuXG48bmd4LXNrZWxldG9uLWxvYWRlciAqbmdJZj1cImlzTG9hZGluZ1wiIGNvdW50PVwiMVwiIGFwcGVhcmFuY2U9XCJjaXJjbGVcIiBbdGhlbWVdPVwie1xuICB3aWR0aDogJzEwMCUnLFxuICBoZWlnaHQ6ICc0MHZoJyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnMTBweCcsXG4gICdwb3NpdGlvbic6ICdyZWxhdGl2ZScsXG4gICdyaWdodCc6ICc1cHgnXG59XCI+XG48L25neC1za2VsZXRvbi1sb2FkZXI+XG5cblxuPGRpdiBjbGFzcz1cIm1vYmlsZS1mb290ZXJcIj5cbiAgPGRpdiBjbGFzcz1cImljb25zXCI+XG4gICAgPGRpdiAoY2xpY2spPVwiZ29Ub0NhcnQoKVwiPlxuICAgICAgPG1hdC1pY29uPnNob3BwaW5nX2NhcnQ8L21hdC1pY29uPlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwiYWRkVG9GYXZvdXJpdGUoKVwiXG4gICAgICAgICpuZ0lmPVwiIWlzSXRlbUFzRmF2b3JpdGVcIj5mYXZvcml0ZV9ib3JkZXI8L21hdC1pY29uPlxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cInJlbW92ZVRvRmF2b3VyaXRlKClcIlxuICAgICAgICAqbmdJZj1cImlzSXRlbUFzRmF2b3JpdGVcIj5mYXZvcml0ZTwvbWF0LWljb24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8YnV0dG9uIGNsYXNzPVwib3V0LW9mLXN0b2NrIHRleHQtY2VudGVyXCIgKm5nSWY9XCJpc0l0ZW1PdXRPZlN0b2NrXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCJcbiAgICBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcbiAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIj5PdXQgb2ZcbiAgICBTdG9jazwvYnV0dG9uPlxuICA8ZGl2IGNsYXNzPVwicXVhbnRpdHlcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgIWVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCJcbiAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxuICAgIDxkaXYgY2xhc3M9XCJwbHVzXCIgKGNsaWNrKT1cImFkZFRvQ2FydCgnU1VCU1RSQUNUJylcIiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPi08L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDUwcHg7XCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBmY1wiXG4gICAgICBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPnt7cmVzcG9uc2VEYXRhPy5xdWFudGl0eX19PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1pbnVzXCIgKGNsaWNrKT1cImFkZFRvQ2FydCgnQUREJylcIiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPis8L2Rpdj5cbiAgPC9kaXY+XG4gIDxidXR0b24gKm5nSWY9XCJyZXNwb25zZURhdGE/LnF1YW50aXR5ICYmIGVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCIgY2xhc3M9XCJzZW5kLWJ0biB3LTEwMFwiXG4gICAgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDApXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDApXCJcbiAgICBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCIgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDApXCIgKGNsaWNrKT1cIiFlZGl0ID8gb3BlbkRpYWxvZ0JveChkaWFsb2dCb3gpIDogJydcIj5cbiAgICA8bWF0LWljb24+dmlkZW9jYW08L21hdC1pY29uPkxJVkUgVklERU8gQ0FMTDwvYnV0dG9uPlxuICA8ZGl2ICpuZ0lmPVwiIXJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2tcIiBjbGFzcz1cInctNzVcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2VuZC1idG4gdy0xMDBcIiBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZVxuICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDApXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDApXCIgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXG4gICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIlxuICAgICAgKGNsaWNrKT1cIiFlZGl0ID8gYWRkVG9DYXJ0KCkgOiAnJ1wiPjxtYXQtaWNvbj5zaG9wcGluZ19jYXJ0PC9tYXQtaWNvbj57e2RhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzBdPy5jb250ZW50Py5sYWJlbH19PC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjUmV2aWV3U2VjdGlvbj5cbiAgPGRpdiBjbGFzcz1cInJldmlldy1zZWNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5DdXN0b21lciBSZXZpZXc8L2Rpdj5cbiAgICA8cC1yYXRpbmcgW2NhbmNlbF09XCJmYWxzZVwiIFtyZWFkb25seV09XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJ0b3RhbFJldmlld1wiIC8+XG4gICAgPHNwYW4+QmUgdGhlIGZpcnN0IHRvIHdyaXRlIGEgcmV2aWV3PC9zcGFuPlxuICAgIDxidXR0b24gY2xhc3M9XCJtdC0zXCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgW2lkXT1cImJ1dHRvbklkXCIgW2J1dHRvblN0eWxlXT1cImJ1dHRvbj8uc3R5bGVzXCJcbiAgICAgIFtiYWNrZ3JvdW5kSW5mb109XCJzdHlsZXM/LmJhY2tncm91bmRcIiBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIChjbGljayk9XCJzaG93UmV2aWV3ID0gIXNob3dSZXZpZXdcIj57eyAhc2hvd1JldmlldyA/ICdBZGRcbiAgICAgIFJldmlldycgOiAnQ2FuY2VsIFJldmlldyd9fTwvYnV0dG9uPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UmV2aWV3XCI+XG4gICAgICA8aHIgLz5cbiAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLXJldmlld1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5Xcml0ZSBhIHJldmlldzwvZGl2PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlY29uZGFyeS10ZXh0XCI+UkFUSU5HPC9zcGFuPlxuICAgICAgICA8cC1yYXRpbmcgWyhuZ01vZGVsKV09XCJwcm9kdWN0UmV2aWV3XCIgW2NhbmNlbF09XCJmYWxzZVwiIFtyZWFkb25seV09XCJmYWxzZVwiIC8+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiPlJldmlldyBUaXRsZTwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkdpdmUgeW91ciByZXZpZXcgYSB0aXRsZVwiIFsobmdNb2RlbCldPVwicmV2aWV3VGl0bGVcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiPlJldmlldzwvc3Bhbj5cbiAgICAgICAgICA8dGV4dGFyZWEgcGxhY2Vob2xkZXI9XCJXcml0ZSB5b3VyIGNvbW1lbnRzIGhlcmVcIiBbKG5nTW9kZWwpXT1cInJldmlld0Rlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctYWN0aW9uLWJ0blwiPlxuICAgICAgICAgIDxidXR0b24gW3N0eWxlLmJvcmRlckNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwic2hvd1JldmlldyA9IGZhbHNlXCI+Q2FuY2VsIHJldmlldzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gc2ltcG9CdXR0b25EaXJlY3RpdmUgW2lkXT1cImJ1dHRvbklkXCIgW2J1dHRvblN0eWxlXT1cImJ1dHRvbj8uc3R5bGVzXCJcbiAgICAgICAgICAgIFtiYWNrZ3JvdW5kSW5mb109XCJzdHlsZXM/LmJhY2tncm91bmRcIiBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkUHJvZHVjdFJldmlldygpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwcm9kdWN0UmV2aWV3ID09IDAgJiYgIXJldmlld1RpdGxlPy5sZW5ndGggJiYgIXJldmlld0Rlc2NyaXB0aW9uPy5sZW5ndGhcIj5TdWJtaXRcbiAgICAgICAgICAgIHJldmlldzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjU29jaWFsSWNvbnM+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGFsaWduLWl0ZW1zLWxnLWNlbnRlciBmbGV4LWNvbHVtbiBmbGV4LWxnLXJvdyBnYXAtbGctMCBnYXAtM1wiXG4gICAgICBbbmdDbGFzc109XCJkYXRhPy5jb250ZW50Py5zb2NpYWxMaW5rcz8uZGlzcGxheSA/ICdqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbicgOiAnanVzdGlmeS1jb250ZW50LWVuZCdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbXQtMFwiICpuZ0lmPVwiZGF0YT8uY29udGVudD8uc29jaWFsTGlua3M/LmRpc3BsYXlcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRhPy5jb250ZW50Py5zb2NpYWxMaW5rcz8uY2hhbm5lbHNcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO21hcmdpbi1yaWdodDogMTBweDtcIj5cbiAgICAgICAgICAgIDxzaW1wby1zb2NpYS1pY29ucyBbc29jaWFsSWNvbkRhdGFdPVwiaXRlbVwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAgICAgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiPjwvc2ltcG8tc29jaWEtaWNvbnM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNBY3Rpb25CdG4+XG4gIDxkaXYgY2xhc3M9XCJidXR0b24tcGFyZW50XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cIm91dC1vZi1zdG9jayB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiaXNJdGVtT3V0T2ZTdG9ja1wiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXG4gICAgICBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcbiAgICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgwKVwiPk91dCBvZlxuICAgICAgU3RvY2s8L2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwicXVhbnRpdHlcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgIWVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCJcbiAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGx1c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ1NVQlNUUkFDVCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4tPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDUwcHg7XCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBmY1wiXG4gICAgICAgIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+e3tyZXNwb25zZURhdGE/LnF1YW50aXR5fX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtaW51c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ0FERCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4rPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIiBjbGFzcz1cInNlbmQtYnRuIHctMTAwXCJcbiAgICAgIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgwKVwiXG4gICAgICBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCIgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDApXCJcbiAgICAgIChjbGljayk9XCIhZWRpdCA/IG9wZW5EaWFsb2dCb3goZGlhbG9nQm94KSA6ICcnXCI+XG4gICAgICA8bWF0LWljb24+dmlkZW9jYW08L21hdC1pY29uPkxJVkUgVklERU8gQ0FMTDwvYnV0dG9uPlxuICAgIDxkaXYgKm5nSWY9XCIoIXJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2spICYmIElzRWNvbW1lcmNlXCIgY2xhc3M9XCJ3LTc1XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwic2VuZC1idG4gdy0xMDBcIiBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZVxuICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcbiAgICAgICAgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDApXCJcbiAgICAgICAgKGNsaWNrKT1cIiFlZGl0ID8gYWRkVG9DYXJ0KCkgOiAnJ1wiPjxtYXQtaWNvbj5zaG9wcGluZ19jYXJ0PC9tYXQtaWNvbj57e2RhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzBdPy5jb250ZW50Py5sYWJlbH19PC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIighcmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9jaykgJiYgSXNFY29tbWVyY2VcIiBjbGFzcz1cInctNzUgbXQtMlwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIHctMTAwXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgc2ltcG9CdXR0b25EaXJlY3RpdmVcbiAgICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDApXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDApXCIgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXG4gICAgICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgwKVwiXG4gICAgICAgIChjbGljayk9XCIhZWRpdCA/IGJ1eU5vdygpIDogJydcIj5CdXkgTm93PC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIighcmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9jaykgJiYgIUlzRWNvbW1lcmNlXCIgY2xhc3M9XCJ3LTc1XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwic2VuZC1idG4gdy0xMDBcIiBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZVxuICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcbiAgICAgICAgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDApXCIgKGNsaWNrKT1cInJhaXNlTGVhZCgpXCI+PG1hdC1pY29uIHN0eWxlPVwiaGVpZ2h0OjE0cHggIWltcG9ydGFudFwiPlxuICAgICAgICAgIG1lc3NhZ2U8L21hdC1pY29uPk5vdGlmeSBNZTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmYXZvdXJpdGVcIiAqbmdJZj1cIklzRWNvbW1lcmNlXCIgKGNsaWNrKT1cImlzSXRlbUFzRmF2b3JpdGUgPyByZW1vdmVUb0Zhdm91cml0ZSgpIDogYWRkVG9GYXZvdXJpdGUoKVwiPlxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgKm5nSWY9XCIhaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlX2JvcmRlcjwvbWF0LWljb24+XG4gICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAqbmdJZj1cImlzSXRlbUFzRmF2b3JpdGVcIj5mYXZvcml0ZTwvbWF0LWljb24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNoYXJlLWljb25cIiAoY2xpY2spPVwic2hhcmVQcm9kdWN0KClcIj5cbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPnNoYXJlPC9tYXQtaWNvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3ZhcmlhbnRzPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8uc3R5bGVzPy5jdXN0b21pemF0aW9uID09ICdTdHlsZTEnXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWVudCBvZiB2YXJpZW50cyB8IGtleXZhbHVlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidmFyaWVudC1rZXlcIj57e3ZhcmllbnQua2V5fX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiIHN0eWxlPVwiZ2FwOiA1cHg7XCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdmFyaWVudFZhbHVlIG9mIHZhcmllbnQudmFsdWVcIiBjbGFzcz1cInZhcmllbnQtdGFnXCJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzZWxlY3RlZFZhcmllbnQuZ2V0KHZhcmllbnQua2V5KSA9PSB2YXJpZW50VmFsdWUgPyAnd2hpdGUnIDogZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cInNlbGVjdGVkVmFyaWVudC5nZXQodmFyaWVudC5rZXkpID09IHZhcmllbnRWYWx1ZSA/IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAnJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VmFyaWVudCh2YXJpZW50LmtleSwgdmFyaWVudFZhbHVlKVwiPnt7dmFyaWVudFZhbHVlIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5zdHlsZXM/LmN1c3RvbWl6YXRpb24gPT0gJ1N0eWxlMicgJiYgc2VsZWN0ZWRWYXJpZW50LnNpemUgPiAwXCI+XG4gICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMiBzdHlsZTItY29udGFpbmVyIHctMTAwXCIgW3N0eWxlLmJvcmRlckNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWxlY3RlZFZhcmllbnQgfCBrZXl2YWx1ZVwiIGNsYXNzPVwicHgtMyBweS0yIHZhcmllbnQtaXRlbVwiXG4gICAgICAgICAgW2NsYXNzXT1cImdldENsYXNzKHNlbGVjdGVkVmFyaWVudClcIiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YXJpYW50LWhlYWRcIj57e2l0ZW0ua2V5IHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFyaWFudC12YWx1ZSB0ZXh0LXN0YXJ0IGZ3LXNlbWlib2xkXCI+XG4gICAgICAgICAgICB7e2l0ZW0udmFsdWUgfFxuICAgICAgICAgICAgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBwLTBcIiBbY2xhc3NdPVwiZ2V0Q2xhc3Moc2VsZWN0ZWRWYXJpZW50KVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGV4dCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDAgcC0yXCIgZGF0YS1icy10b2dnbGU9XCJvZmZjYW52YXNcIlxuICAgICAgICAgICAgZGF0YS1icy10YXJnZXQ9XCIjb2ZmY2FudmFzUmlnaHRWYXJpYW50XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0VGV4dENvbG9yKGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IpXCI+Q1VTVE9NSVNFXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNQcm9kdWN0RGVzYz5cbiAgPGRpdiBjbGFzcz1cInByb2R1Y3QtaW5mby1taW5pbWFsXCI+XG4gICAgPCEtLSBJdGVtIENvZGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cIml0ZW0tY29kZS1yb3dcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8uaXRlbUNvZGVcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaXRlbS1jb2RlLXZhbHVlXCI+e3sgZm9ybWF0SXRlbUNvZGUocmVzcG9uc2VEYXRhPy5pdGVtQ29kZSkgfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFRpdGxlIGFuZCBQcmljZSBSb3cgLS0+XG4gICAgPGRpdiBjbGFzcz1cInRpdGxlLXByaWNlLXJvdy1tb2Rlcm5cIj5cbiAgICAgIDxoMSBjbGFzcz1cInByb2R1Y3QtdGl0bGUtbW9kZXJuXCI+e3tyZXNwb25zZURhdGE/Lm5hbWV9fTwvaDE+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1wcmljZS1tb2Rlcm5cIj5cbiAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJjdXJyZW5jeVwiPjwvc3Bhbj4ge3tyZXNwb25zZURhdGE/LnByaWNlPy5zZWxsaW5nUHJpY2V9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFJhdGluZyBSb3cgLS0+XG4gICAgPGRpdiBjbGFzcz1cInJhdGluZy1yb3ctbW9kZXJuXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmF2ZXJhZ2VSYXRpbmdcIj5cbiAgICAgIDxwLXJhdGluZyBbKG5nTW9kZWwpXT1cInJlc3BvbnNlRGF0YS5hdmVyYWdlUmF0aW5nXCIgW2NhbmNlbF09XCJmYWxzZVwiIFtyZWFkb25seV09XCJ0cnVlXCI+PC9wLXJhdGluZz5cbiAgICAgIDxzcGFuIGNsYXNzPVwicmF0aW5nLXNjb3JlXCI+e3tyZXNwb25zZURhdGE/LmF2ZXJhZ2VSYXRpbmcgfCBudW1iZXI6JzEuMS0xJ319PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzZXBhcmF0b3JcIj58PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJyZXZpZXdzLWxpbmtcIiBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxuICAgICAgICB7e3Jlc3BvbnNlRGF0YT8udG90YWxSZXZpZXdDb3VudH19IHJldmlld3M8L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEJyaWVmIERlc2NyaXB0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWJyaWVmLW1vZGVyblwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5icmllZlwiIFtpbm5lckhUTUxdPVwicmVzcG9uc2VEYXRhPy5icmllZiB8IHNhbml0aXplSHRtbFwiPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVzY3JpcHRvcnM+XG4gIDxkaXYgY2xhc3M9XCJyb3cgcHJvZC1kZXNjIG10LTJcIj5cbiAgICA8ZGl2PlxuICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicHJvZHVjdC1oZWFkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10ZXh0XCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmRlc2NyaXB0b3IgfHwgcmVzcG9uc2VEYXRhPy5tYXRlcmlhbHNcIj5Qcm9kdWN0IERldGFpbHM8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZWJyZWFrdXAtYnRuIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKm5nSWY9XCJtYXRlcmlhbEJhc2VkUHJpY2luZ1wiIGRhdGEtYnMtdG9nZ2xlPVwib2ZmY2FudmFzXCIgZGF0YS1icy10YXJnZXQ9XCIjb2ZmY2FudmFzUmlnaHRQcmljZUJyZWFrdXBcIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRUZXh0Q29sb3IoZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvcilcIj5cbiAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gUFJJQ0UgQlJFQUtVUFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDtcIiBjbGFzcz1cImJvZHktbGFyZ2UgYnJpZWYtZGVzY1wiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5kZXNjcmlwdG9yXCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInJlc3BvbnNlRGF0YT8uZGVzY3JpcHRvcj8ubmFtZSB8IHNhbml0aXplSHRtbFwiXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5jb2xvclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJtYXRlcmlhbEJhc2VkUHJpY2luZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiamV3ZWxsZXJ5LXRhYmxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZSBvZiByZXNwb25zZURhdGE/Lm1hdGVyaWFsc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImpld2VsLWNvbnRhaW5lciBtdC0yXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJqZXdlbC1oZWFkZXJcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRIZWFkZXJDb2xvcihlbGUubWF0ZXJpYWxUeXBlKVwiPlxuICAgICAgICAgICAgICAgIHt7ZWxlPy5tYXRlcmlhbE5hbWUgfCB0aXRsZWNhc2V9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgdy0xMDAgYnItcFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJhY2tncm91bmRDb2xvcihlbGUubWF0ZXJpYWxUeXBlKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtZXRhbC1wdXJpdHlcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIE5ldCBXZWlnaHQve3tlbGU/LnVuaXQgfCB0aXRsZWNhc2V9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAge3tlbGUucXVhbnRpdHkgKyBcIiBcIiArIChlbGU/LnVuaXQgfCB0aXRsZWNhc2UpfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtZXRhbC1wdXJpdHlcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIFB1cml0eVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAge3tlbGUucHVyaXR5IHxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVjYXNlfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjSW1hZ2VTZWN0aW9uPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXZhcmllbnRMb2FkaW5nICYmIChpc01vYmlsZSB8fCBkYXRhPy5zdHlsZXM/LmdyaWRTdHlsZSA9PSAnU3R5bGUxJylcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3R5bGUtMS12ZXJ0aWNhbCBkLWZsZXggZmxleC1jb2x1bW4gdy0xMDBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYWluLWltYWdlLWNvbnRhaW5lciBwLTBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0taW1nIHJvdW5kZWQtM1wiPlxuICAgICAgICAgIDxsaWItbmd4LWltYWdlLXpvb20gKm5nSWY9XCJjdXJyZW50SW1nXCIgW3RodW1iSW1hZ2VdPVwiY3VycmVudEltZ1wiIFtmdWxsSW1hZ2VdPVwiY3VycmVudEltZ1wiIFt6b29tTW9kZV09XCInaG92ZXInXCJcbiAgICAgICAgICAgIFttYWduaWZpY2F0aW9uXT1cIjAuNFwiIFtlbmFibGVTY3JvbGxab29tXT1cImZhbHNlXCI+XG4gICAgICAgICAgPC9saWItbmd4LWltYWdlLXpvb20+XG4gICAgICAgICAgPGltZyAqbmdJZj1cIiFjdXJyZW50SW1nXCIgc3JjPVwiaHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZ1wiXG4gICAgICAgICAgICBjbGFzcz1cInctMTAwIGgtMTAwIG9iamVjdC1maXQtY292ZXJcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aHVtYm5haWwtcm93IHB5LTMgZC1mbGV4IGdhcC0yIG92ZXJmbG93LWF1dG8gaGlkZS1zY3JvbGxcIj5cbiAgICAgICAgPGltZyBjbGFzcz1cImltZyB0aHVtYm5haWwtaW1nXCIgKm5nRm9yPVwibGV0IGltZyBvZiBpdGVtSW1hZ2VzXCIgW3NyY109XCJpbWcuaW1nVXJsXCIgKGNsaWNrKT1cImNoYW5nZUltZyhpbWcuaW1nVXJsKVwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZS10aHVtYl09XCJjdXJyZW50SW1nID09IGltZy5pbWdVcmxcIlxuICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBtaW4td2lkdGg6IDgwcHg7IHdpZHRoOiA4MHB4OyBoZWlnaHQ6IDgwcHg7IG9iamVjdC1maXQ6IGNvdmVyOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1wiXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImltZy5pbWdVcmwgPT0gY3VycmVudEltZyA/IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAndHJhbnNwYXJlbnQnXCI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF2YXJpZW50TG9hZGluZyAmJiAoIWlzTW9iaWxlICYmIGRhdGE/LnN0eWxlcz8uZ3JpZFN0eWxlID09ICdTdHlsZTInKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJiZW50by1tYXNvbnJ5LWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaW1nIG9mIGl0ZW1JbWFnZXM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImJlbnRvLWl0ZW0tbW9kZXJuXCI+XG4gICAgICAgIDxpbWcgW3NyY109XCJpbWcuaW1nVXJsXCIgY2xhc3M9XCJiZW50by1pbWctbW9kZXJuXCIgKGNsaWNrKT1cImNoYW5nZUltZyhpbWcuaW1nVXJsKVwiPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxkaXYgY2xhc3M9XCJpdGVtLWltZ1wiICpuZ0lmPVwidmFyaWVudExvYWRpbmdcIj5cbiAgICA8bmd4LXNrZWxldG9uLWxvYWRlciBjb3VudD1cIjFcIiBhcHBlYXJhbmNlPVwiY2lyY2xlXCIgW3RoZW1lXT1cIntcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICdib3JkZXItcmFkaXVzJzogJzEwcHgnXG4gICAgfVwiPlxuICAgIDwvbmd4LXNrZWxldG9uLWxvYWRlcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2JyYW5kaW5nPlxuICA8ZGl2IGNsYXNzPVwicm93IHctMTAwXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnJhbmQgb2YgYnJhbmRQcm9taXNlc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC00IGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZy0yXCI+XG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBvbmVycm9yPVwidGhpcy5zcmM9J2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCJcbiAgICAgICAgICBbc3JjXT1cImJyYW5kPy5sb2dvVXJsXCIgYWx0PVwiXCIgY2xhc3M9XCJ3LWgtNDAgcC0wIHJvdW5kZWQtY2lyY2xlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJicmFuZC10ZXh0IHctMTAwIHRleHQtY2VudGVyIHB5LTJcIj5cbiAgICAgICAgICB7e2JyYW5kPy50aXRsZSB8IHRpdGxlY2FzZX19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN2aWRlb0NhbGxTY2hlZHVsZT5cbiAgPCEtLSAqbmdJZj1cImVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCIgLS0+XG4gIDxuZy1jb250YWluZXI+XG4gICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMCB2aWRlby1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCB2aWRlby1jYWxsLWltZ1wiPlxuICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvMzU1MDA3YzE3NTM2MjA3NzI2NjYxMTI4OS0yMjkyMjEwMjNfc21hbGwuZ2lmXCJcbiAgICAgICAgICBhbHQ9XCJcIiBjbGFzcz1cInctMTAwIGgtMTAwIFwiPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTggYWxpZ24tY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWhlYWQtdGV4dFwiPlxuICAgICAgICAgIExpdmUgVmlkZW8gQ2FsbFxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10ZXh0XCI+XG4gICAgICAgICAgSm9pbiBhIGxpdmUgdmlkZW8gY2FsbCB3aXRoIG91ciBjb25zdWx0YW50cyB0byBzZWUgeW91ciBmYXZvdXJpdGUgZGVzaWducyB1cCBjbG9zZSFcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzY2gtYnRuIHRleHQtY2VudGVyIGN1cnNvci1wb2ludGVyXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgc2ltcG9CdXR0b25EaXJlY3RpdmVcbiAgICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMilcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMilcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcbiAgICAgICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMilcIiAoY2xpY2spPVwiIWVkaXQgPyBvcGVuRGlhbG9nQm94KGRpYWxvZ0JveCkgOiAnJ1wiPlxuICAgICAgICAgIFNjaGVkdWxlIGEgVmlkZW8gQ2FsbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjRGVsaXZlcnlTZWN0aW9uPlxuICA8ZGl2IGNsYXNzPVwiZGVsaXZlcnktY29udGFpbmVyXCI+XG4gICAgPGgyIGNsYXNzPVwiZGVsaXZlcnktdGl0bGVcIj5EZWxpdmVyeSwgU3RvcmVzICYgVHJpYWw8L2gyPlxuXG4gICAgPCEtLSBMb2NhdGlvbiBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1zZWN0aW9uIG1iLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXG4gICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtZ3Jvdy0xIG1lLTJcIiBzdHlsZT1cIndpZHRoOiBjYWxjKDEwMCUgLSAxMDBweCk7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBteC0xXCI+PG1hdC1pY29uXG4gICAgICAgICAgICAgIGNsYXNzPVwiZ3BzIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPmdwc19maXhlZDwvbWF0LWljb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInBvc3RhbC1jb2RlLWlucHV0IGZsZXgtZ3Jvdy0xXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBQaW5Db2RlXCIgWyhuZ01vZGVsKV09XCJwaW5jb2RlXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGxvY2F0ZS1idG5cIiAoY2xpY2spPVwiZ2V0U3RvcmVEZXRhaWxzKClcIj5TdWJtaXQ8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIiFpc1BpbkNvZGVcIiBzdHlsZT1cImNvbG9yOiByZWQ7XCI+UGluIGNvZGUgbXVzdCBiZSA2IGRpZ2l0cy48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIocGluY29kZT8udG9TdHJpbmcoKS5sZW5ndGggPz8gMCkgPT0gNlwiPlxuICAgICAgPCEtLSBGcmVlIERlbGl2ZXJ5IFNlY3Rpb24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGVsaXZlcnktc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGVsaXZlcnktaWNvbiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8c3ZnIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIlxuICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBjbGFzcz1cImZlYXRoZXIgZmVhdGhlci1naWZ0XCI+XG4gICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIyMCAxMiAyMCAyMiA0IDIyIDQgMTJcIj48L3BvbHlsaW5lPlxuICAgICAgICAgICAgICA8cmVjdCB4PVwiMlwiIHk9XCI3XCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjVcIj48L3JlY3Q+XG4gICAgICAgICAgICAgIDxsaW5lIHgxPVwiMTJcIiB5MT1cIjIyXCIgeDI9XCIxMlwiIHkyPVwiN1wiPjwvbGluZT5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMiA3SDcuNWEyLjUgMi41IDAgMCAxIDAtNUMxMSAyIDEyIDcgMTIgN3pcIj48L3BhdGg+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgN2g0LjVhMi41IDIuNSAwIDAgMCAwLTVDMTMgMiAxMiA3IDEyIDd6XCI+PC9wYXRoPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZWxpdmVyeS10ZXh0XCIgKm5nSWY9XCJlY29tQ29uZmlncz8uZGVsaXZlcnlDaGFyZ2VzID09IDBcIj5FeHBlY3RlZFxuICAgICAgICAgICAgRGVsaXZlcnkgYnkge3sgZ2V0RGF0ZUFmdGVyeERheXMoKSB8IGRhdGU6J2QgTU1NJyB9fTwvc3Bhbj5cblxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGVsaXZlcnktdGV4dFwiICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LmRlbGl2ZXJ5Q2hhcmdlcyA+IDBcIj5Zb3VyXG4gICAgICAgICAgICBleHBlY3RlZCBPcmRlciB3aWxsXG4gICAgICAgICAgICBEZWxpdmVyIGJ5IHt7IGdldERhdGVBZnRlcnhEYXlzKCkgfCBkYXRlOidkIE1NTScgfX0gd2l0aCBhIERlbGl2ZXJ5IENoYXJnZSBvZlxuICAgICAgICAgICAg4oK5IHt7ZWNvbUNvbmZpZ3M/LmRlbGl2ZXJ5Q2hhcmdlcyB8IG51bWJlcjonMS4yLTInfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI1RyeUF0SG9tZT5cbiAgPCEtLSBUcnkgQXQgSG9tZSBTZWN0aW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwidHJ5LWhvbWUtc2VjdGlvblwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQgdHJ5LWhvbWUtaXRlbVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJob21lLWljb24gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8c3ZnIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgY2xhc3M9XCJmZWF0aGVyIGZlYXRoZXItaG9tZVwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMyA5bDktNyA5IDd2MTFhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ6XCI+PC9wYXRoPlxuICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCI5IDIyIDkgMTIgMTUgMTIgMTUgMjJcIj48L3BvbHlsaW5lPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0cnktaG9tZS1kZXRhaWxzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0cnktaG9tZS1oZWFkZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRyeS1ob21lLXRleHRcIj5UcnkgQXQgSG9tZTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZyZWUtdGV4dFwiPiAoSXQncyBGcmVlKTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJob21lLWFwcG9pbnRtZW50LXRleHRcIj5Ib21lIEFwcG9pbnRtZW50IDxzcGFuPkF2YWlsYWJsZSB0byB0cnkgZnJvbSAyOSBKdWw8L3NwYW4+PC9kaXY+XG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImFwcG9pbnRtZW50LXRleHRcIj5cbiAgICAgICAgICAgICAgSG9tZSBBcHBvaW50bWVudCA8c3BhbiBjbGFzcz1cImFwcG9pbnRtZW50LWF2YWlsYWJsZVwiPkF2YWlsYWJsZSB0byB0cnkgZnJvbSAyOCBKdW48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4LWFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHctMTAwXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYm9vay1hcHBvaW50bWVudC1idG5cIiAoY2xpY2spPVwiYWRkVG9UcmlhbENhcnQoKVwiICpuZ0lmPVwiIWlzSXRlbUFkZGVkQXNUcmlhbFwiPlRyeSBhdFxuICAgICAgICBIT01FPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYm9vay1hcHBvaW50bWVudC1idG5cIiAqbmdJZj1cImlzSXRlbUFkZGVkQXNUcmlhbFwiPkhPTUUgQVBQT0lOVE1FTlQgQk9PS0VEPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI1N0b3JlU2VjdGlvbj5cbiAgPCEtLSBOZWFyZXN0IFN0b3JlIFNlY3Rpb24gLS0+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cInN0b3JlRGV0YWlscz8ubmVhcmJ5U3RvcmU/LnN0b3JlTmFtZSAmJiBzdG9yZURldGFpbHM/Lm5lYXJieVN0b3JlPy5zdG9yZU5hbWU/Lmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3RvcmUtc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgc3RvcmUtaXRlbVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInN0b3JlLWljb24gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxzdmcgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgY2xhc3M9XCJmZWF0aGVyIGZlYXRoZXItc2hvcHBpbmctYmFnXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTYgMkwzIDZ2MTRhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0yVjZsLTMtNHpcIj48L3BhdGg+XG4gICAgICAgICAgICA8bGluZSB4MT1cIjNcIiB5MT1cIjZcIiB4Mj1cIjIxXCIgeTI9XCI2XCI+PC9saW5lPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xNiAxMGE0IDQgMCAwIDEtOCAwXCI+PC9wYXRoPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1kZXRhaWxzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlLXRleHRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RvcmUtbGFiZWxcIj5OZWFyZXN0IFN0b3JlIC0gPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdG9yZS1uYW1lXCI+e3sgc3RvcmVEZXRhaWxzPy5uZWFyYnlTdG9yZT8uc3RvcmVOYW1lIHwgdGl0bGVjYXNlfX08L3NwYW4+XG4gICAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwic3RvcmUtZGlzdGFuY2VcIj4gKDRrbSk8L3NwYW4+IC0tPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImF2YWlsYWJpbGl0eS1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXZhaWxhYmlsaXR5LWJhZGdlXCI+4o+wIEFWQUlMQUJMRSBCWSAyOCBKVU48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwib3RoZXItc3RvcmVzLXRleHRcIj5cbiAgICAgICAgICAgICAgQWxzbyBBdmFpbGFibGUgaW4gPHNwYW4gY2xhc3M9XCJvdGhlci1zdG9yZXMtbGlua1wiPjE4IG90aGVyIHN0b3Jlczwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciB3LTEwMFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZmluZC1zdG9yZS1idG4gdy0xMDBcIiBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZVxuICAgICAgICAgIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgxKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgxKVwiIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxuICAgICAgICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgxKVwiIChjbGljayk9XCJvbkZpbmRJblN0b3JlKHN0b3JlRGV0YWlscz8ubmVhcmJ5U3RvcmU/LmlkKVwiPkZJTkQgSU5cbiAgICAgICAgICBTVE9SRTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctdGVtcGxhdGUgI2VtcHR5U3RvcmU+XG4gICAgPGRpdiBjbGFzcz1cImRlbGl2ZXJ5LXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGVsaXZlcnktaWNvbiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPHN2ZyBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBjbGFzcz1cImZlYXRoZXIgZmVhdGhlci1zaG9wcGluZy1iYWdcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNiAyTDMgNnYxNGEyIDIgMCAwIDAgMiAyaDE0YTIgMiAwIDAgMCAyLTJWNmwtMy00elwiPjwvcGF0aD5cbiAgICAgICAgICAgIDxsaW5lIHgxPVwiM1wiIHkxPVwiNlwiIHgyPVwiMjFcIiB5Mj1cIjZcIj48L2xpbmU+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTE2IDEwYTQgNCAwIDAgMS04IDBcIj48L3BhdGg+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkZWxpdmVyeS10ZXh0XCI+Tm8gU3RvcmVzIGFyZSBhdmFpbGFibGU8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgY2xhc3M9XCJvZmZjYW52YXMgb2ZmY2FudmFzLWVuZCBvZmZjYW52YXMtdmFyaWFudFwiIHRhYmluZGV4PVwiLTFcIiBpZD1cIm9mZmNhbnZhc1JpZ2h0VmFyaWFudFwiXG4gIGFyaWEtbGFiZWxsZWRieT1cIm9mZmNhbnZhc1JpZ2h0TGFiZWxcIj5cbiAgPGRpdiBjbGFzcz1cInZhcmllbnQtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBwLTJcIj5cbiAgICA8bWF0LWljb24gZGF0YS1icy1kaXNtaXNzPVwib2ZmY2FudmFzXCJcbiAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGZzLTVcIj5jbG9zZTwvbWF0LWljb24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidmFyaWVudC1wcmljZSBweC0zIHBiLTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHJpY2UtdGV4dFwiPlByaWNlPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCAgZy0zIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInByaWNlXCIgW25nQ2xhc3NdPVwieydkaXNjb3VudC1wcmljZSc6IHJlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZX1cIlxuICAgICAgICAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZSAmJiByZXNwb25zZURhdGEucHJpY2UuZGlzY291bnRlZFByaWNlID4gMFwiPjxzcGFuXG4gICAgICAgICAgW2lubmVySFRNTF09J2N1cnJlbmN5Jz48L3NwYW4+XG4gICAgICAgIHt7cmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlfX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmljZVwiXG4gICAgICAgICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5wcmljZT8uc2VsbGluZ1ByaWNlICYmIGdldERpZmZlcmVuY2UocmVzcG9uc2VEYXRhPy5wcmljZT8uc2VsbGluZ1ByaWNlLCByZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UpID4gMlwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsndGV4dC1kZWNvcmF0aW9uLWxpbmUtdGhyb3VnaCc6IHJlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZX1cIj48c3BhblxuICAgICAgICAgIFtpbm5lckhUTUxdPSdjdXJyZW5jeSc+PC9zcGFuPlxuICAgICAgICB7e3Jlc3BvbnNlRGF0YT8ucHJpY2U/LnNlbGxpbmdQcmljZSB8IG51bWJlcjonMS4wLTAnfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWNvbnRhaW5lciBoLTEwMCBwLTNcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YXJpZW50IG9mIHZhcmllbnRzIHwga2V5dmFsdWVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWRhdGFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZhcmllbnQta2V5XCI+e3t2YXJpZW50LmtleX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiBzdHlsZT1cImdhcDogNXB4O1wiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHZhcmllbnRWYWx1ZSBvZiB2YXJpZW50LnZhbHVlXCIgY2xhc3M9XCJ2YXJpZW50LXRhZ1wiXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRWYXJpZW50LmdldCh2YXJpZW50LmtleSkgPT0gdmFyaWVudFZhbHVlID8gJ3doaXRlJyA6IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJzZWxlY3RlZFZhcmllbnQuZ2V0KHZhcmllbnQua2V5KSA9PSB2YXJpZW50VmFsdWUgPyBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFZhcmllbnQodmFyaWVudC5rZXksIHZhcmllbnRWYWx1ZSlcIj57e3ZhcmllbnRWYWx1ZSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29uZmlybS1idG4gdy0xMDAgcC0zIHRleHQtY2VudGVyIGN1cnNvci1wb2ludGVyXCIgZGF0YS1icy1kaXNtaXNzPVwib2ZmY2FudmFzXCJcbiAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgc3R5bGU9XCJjb2xvcjogd2hpdGU7XCI+Q29uZmlybVxuICAgIEN1c3RvbWl6YXRpb248L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2RpYWxvZ0JveD5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtLWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmctdmlkZW8gdy0xMDAgcHktMiB0ZXh0LWNlbnRlclwiPkxpdmUgVmlkZW8gY2FsbCBhdCB5b3VyIGNvbnZlbmllbmNlITwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNjaGVkdWxlLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1lbmQgcC0yXCI+XG4gICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwibWF0Q2xvc2VEaWFsb2coKVwiXG4gICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZnMtNVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IGgtMTAwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IGgtMTAwIHctMTAwIHZpZGVvLWNhbGwtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBoLTEwMFwiICpuZ0lmPVwiIWlzTW9iaWxlXCI+XG4gICAgICAgICAgPGltZ1xuICAgICAgICAgICAgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy81NTc2OTljMTc1Mzc3OTUwMzkxM2ZyZWVwaWstb3ZlcmhlYWQtc2hvdC1hLXBlcnNvbi1ob2xkaW5nLWEtc21hcnRwaG9uZS13aXRoLWEtMTAyOV92bWc4R3FIaiAob25saW5lLXZpZGVvLWN1dHRlci5jb20pLmdpZlwiXG4gICAgICAgICAgICBhbHQ9XCJcIiBjbGFzcz1cInctMTAwIGgtMTAwXCIgc3R5bGU9XCJvYmplY3QtZml0OiBjb3ZlcjtcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBwb3NpdGlvbi1yZWxhdGl2ZSBoLTEwMCBjYWxsLWRldGFpbHNcIj5cbiAgICAgICAgICA8IS0tIE5hbWUgSW5wdXQgd2l0aCBWYWxpZGF0aW9uIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCIgW2NsYXNzLmVycm9yLWJvcmRlcl09XCJ2YWxpZGF0aW9uRXJyb3JzLnVzZXJuYW1lXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIE5hbWUqXCIgWyhuZ01vZGVsKV09XCJ2aWRlb0NhbGxQYXlsb2FkLnVzZXJuYW1lXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJ3VzZXJuYW1lJylcIj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkIG15LTNcIiBbY2xhc3MuZXJyb3ItYm9yZGVyXT1cInZhbGlkYXRpb25FcnJvcnMuZW1haWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBwbGFjZWhvbGRlcj1cIkVudGVyIEVtYWlsKlwiIFsobmdNb2RlbCldPVwidmlkZW9DYWxsUGF5bG9hZC5lbWFpbFwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCdlbWFpbCcpXCI+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgPCEtLSBNb2JpbGUgTnVtYmVyIElucHV0IHdpdGggVmFsaWRhdGlvbiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZmllbGQgbXktM1wiIFtjbGFzcy5lcnJvci1ib3JkZXJdPVwidmFsaWRhdGlvbkVycm9ycy5tb2JpbGVOdW1iZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGV4dC1jYWxsXCI+SU4gKzkxPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgTW9iaWxlKlwiIFsobmdNb2RlbCldPVwidmlkZW9DYWxsUGF5bG9hZC5tb2JpbGVOdW1iZXJcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgnbW9iaWxlTnVtYmVyJylcIiAod2hlZWwpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgPCEtLSBQaW5jb2RlIElucHV0IHdpdGggVmFsaWRhdGlvbiAtLT5cbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCIgW2NsYXNzLmVycm9yLWJvcmRlcl09XCJ2YWxpZGF0aW9uRXJyb3JzLnBpbmNvZGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGV4dC1jYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHctMTIgYm9yZGVyLTBcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZi0xOCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5ncHNfZml4ZWQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgUGluIENvZGUqXCIgY2xhc3M9XCJ3LTg4XCIgWyhuZ01vZGVsKV09XCJ2aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGVcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgncGluY29kZScpXCI+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZSBteS0zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluaS10ZXh0IG1iLTJcIj5MYW5ndWFnZSBQcmVmZXJlbmNlPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFuZ3VhZ2UtY29udGFpbmVyIGQtZmxleCBnYXAtMiBmbGV4LXdyYXAgbXQtMVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsYW5nIG9mIGxhbmd1YWdlc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5nIHB4LTIgcHktMSByb3VuZGVkIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImxhbmcgPT0gc2VsZWN0ZWRMYW5nID8gZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICcnXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZExhbmcgPSBsYW5nXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJsYW5nID09IHNlbGVjdGVkTGFuZyA/IGdldFRleHRDb2xvcihkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yKSA6ICcjMDAwMDAwJ1wiPlxuICAgICAgICAgICAgICAgICAge3tsYW5nfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMYW5nID09ICdPdGhlcnMnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZmllbGQgbXktM1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIE90aGVyIExhbmd1YWdlXCIgWyhuZ01vZGVsKV09XCJvdGhlckxhbmd1YWdlXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidmlkZW8tYnRuIG10LTIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgW2Rpc2FibGVkXT1cImlzU3VibWl0dGluZ1wiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiBbc3R5bGUuY29sb3JdPVwiZ2V0VGV4dENvbG9yKGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTdWJtaXR0aW5nXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSBtZS0yXCIgcm9sZT1cInN0YXR1c1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIFNDSEVEVUxJTkcuLi5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1N1Ym1pdHRpbmcgJiYgIXNjaGVkdWxlZFwiPlxuICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJzY2hlZHVsZVZpZGVvQ2FsbCgpXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPnZpZGVvX2NhbGw8L21hdC1pY29uPiZuYnNwO1xuICAgICAgICAgICAgICAgIFNDSEVEVUxFIEEgVklERU8gQ0FMTFxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNjaGVkdWxlZFwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj4mbmJzcDtcbiAgICAgICAgICAgICAgU0NIRURVTEVEIFNVQ0NFU1NGVUxMWVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiBjbGFzcz1cIm9mZmNhbnZhcyBvZmZjYW52YXMtZW5kIG9mZmNhbnZhcy1zbWFsbCBvdmVyZmxvdy1zY3JvbGxcIiB0YWJpbmRleD1cIi0xXCIgaWQ9XCJvZmZjYW52YXNSaWdodFByaWNlQnJlYWt1cFwiPlxuICA8ZGl2IGNsYXNzPVwidmFyaWVudC1oZWFkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtZW5kIHAtMlwiPlxuICAgIDxtYXQtaWNvbiBkYXRhLWJzLWRpc21pc3M9XCJvZmZjYW52YXNcIlxuICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZnMtNVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LXByaWNlIHAtMTAtMjBcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHJpY2UtYnJlYWstaGVhZGVyXCI+e3tyZXNwb25zZURhdGE/Lm5hbWV9fTwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInByaWNlLWJyZWFrdXAgaC0xMDAgdy0xMDBcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGUgb2YgcmVzcG9uc2VEYXRhPy5tYXRlcmlhbHNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmljZS1jb250YWluZXIgbWItMyBwLTEwLTIwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZS1jb250YWluZXItaGVhZGVyXCI+XG4gICAgICAgICAge3sgZWxlLm1hdGVyaWFsVHlwZSArIFwiIEJSRUFLVVBcIiB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMCBoZWFkZXItcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyXCI+Q09NUE9ORU5UPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyXCI+UkFURTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPldFSUdIVDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPkZJTkFMIFZBTFVFPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHZhbHVlLXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPnt7IGVsZS5wdXJpdHkgfCB0aXRsZWNhc2UgfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXJcIj7igrl7eyBnZXRQcmljZVBlckdyYW0oZWxlLnByaWNlUGVyVW5pdCxlbGUubWF0ZXJpYWxUeXBlKSB8XG4gICAgICAgICAgICBudW1iZXI6JzEuMi0yJyB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPnt7ZWxlLnF1YW50aXR5ICsgJyAnICsgKGVsZS51bml0IHwgdGl0bGVjYXNlKX19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyIHRvdGFsXCI+4oK5e3sgZWxlLnByaWNlUGVyVW5pdCAqIGVsZS5xdWFudGl0eSB8IG51bWJlciB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cInByaWNlLWNvbnRhaW5lciBtYi0zIHAtMTAtMzAgcHktMCBib3JkZXItdW5zZXRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDAgc3VtbWFyeS1yb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHRleHQtc3RhcnRcIj5NYWtpbmcgQ2hhcmdlczwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgdGV4dC1lbmQgdG90YWxcIj7igrl7eyByZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/Lm1ha2luZ0NoYXJnZUFtb3VudCB8IG51bWJlcjonMS4yLTInIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHN1bW1hcnktcm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiB0ZXh0LXN0YXJ0XCI+VGF4IEFtb3VudDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgdGV4dC1lbmQgdG90YWxcIj7igrl7eyByZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/LnRheEFtb3VudCB8IG51bWJlcjonMS4yLTInIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHN1bW1hcnktcm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiB0ZXh0LXN0YXJ0XCI+VG90YWwgQW1vdW50PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiB0ZXh0LWVuZCB0b3RhbFwiPlxuICAgICAgICAgIOKCuXt7KHJlc3BvbnNlRGF0YT8uamV3ZWxyeVByaWNlQnJlYWt1cD8ucHJpY2VXaXRob3V0VGF4ICsgcmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy50YXhBbW91bnQpIHxcbiAgICAgICAgICBudW1iZXI6JzEuMi0yJ319XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjUmV2aWV3c1NlY3Rpb24+XG4gIDxkaXYgY2xhc3M9XCJydi1zZWN0aW9uXCIgKm5nSWY9XCJyZXZpZXdzRGF0YVwiPlxuXG4gICAgPCEtLSBIZWFkZXI6IFRpdGxlICsgQXZlcmFnZSB8IEJhciBDaGFydCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwicnYtaGVhZGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicnYtaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwicnYtdGl0bGVcIj5SZXZpZXdzICZhbXA7IFJhdGluZ3M8L2gyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnYtYXZlcmFnZS1yb3dcIj5cbiAgICAgICAgICA8IS0tIGZpbGxlZCBzdGFycyAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnYtc3RhcnNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHMgb2YgWzEsMiwzLDQsNV1cIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMTMuOTcxOCA1LjM2NDUzQzEzLjkzOTggNS4yNjI5OCAxMy44Nzk4IDUuMTcyNTIgMTMuNzk4NiA1LjEwMzU2QzEzLjcxNzUgNS4wMzQ2IDEzLjYxODYgNC45ODk5NCAxMy41MTMyIDQuOTc0NzJMOS4zNzA0MyA0LjM3MDg4TDcuNTEzMDcgMC42MTc5NTVDNy40NjAyMSAwLjUyOTI3MSA3LjM4NTIyIDAuNDU1ODM0IDcuMjk1NDUgMC40MDQ4MzZDNy4yMDU2OCAwLjM1MzgzOCA3LjEwNDIgMC4zMjcwMjYgNy4wMDA5NiAwLjMyNzAyNkM2Ljg5NzcxIDAuMzI3MDI2IDYuNzk2MjQgMC4zNTM4MzggNi43MDY0NyAwLjQwNDgzNkM2LjYxNjcgMC40NTU4MzQgNi41NDE3MSAwLjUyOTI3MSA2LjQ4ODg1IDAuNjE3OTU1TDQuNjMxNDkgNC4zNzA4OEwwLjQ4ODc0NiA0Ljk3NDcyQzAuMzgzMzYzIDQuOTg5OTQgMC4yODQ0MTYgNS4wMzQ2IDAuMjAzMjg2IDUuMTAzNTZDMC4xMjIxNTcgNS4xNzI1MiAwLjA2MjE0MDcgNS4yNjI5OCAwLjAzMDE0IDUuMzY0NTNDLTAuMDA0MDIyODYgNS40NjU3MSAtMC4wMDkyNDQyOCA1LjU3NDQyIDAuMDE1MDY0NSA1LjY3ODQxQzAuMDM5MzczMyA1Ljc4MjQgMC4wOTIyNDU3IDUuODc3NTMgMC4xNjc3MjIgNS45NTMwOEwzLjE3OTI0IDguODcyODdMMi40Njg0IDEzLjAwMDNDMi40NTAzOCAxMy4xMDY2IDIuNDYyMjkgMTMuMjE1OCAyLjUwMjc4IDEzLjMxNTdDMi41NDMyOCAxMy40MTU2IDIuNjEwNzcgMTMuNTAyMiAyLjY5NzcgMTMuNTY1OUMyLjc4NDc3IDEzLjYyOCAyLjg4NzQ2IDEzLjY2NDQgMi45OTQxNiAxMy42NzEyQzMuMTAwODcgMTMuNjc4IDMuMjA3MzMgMTMuNjU0NyAzLjMwMTUzIDEzLjYwNDJMNy4wMDA5NiAxMS42NTUxTDEwLjcwOCAxMy42MDQyQzEwLjc5IDEzLjY0OTEgMTAuODgyIDEzLjY3MjggMTAuOTc1NSAxMy42NzNDMTEuMDk1OCAxMy42NzE2IDExLjIxMjkgMTMuNjM0MyAxMS4zMTE5IDEzLjU2NTlDMTEuMzk4OCAxMy41MDIyIDExLjQ2NjMgMTMuNDE1NiAxMS41MDY4IDEzLjMxNTdDMTEuNTQ3MyAxMy4yMTU4IDExLjU1OTIgMTMuMTA2NiAxMS41NDEyIDEzLjAwMDNMMTAuODIyNyA4Ljg3Mjg3TDEzLjgyNjYgNS45NTMwOEMxMy45MDMzIDUuODc4MzUgMTMuOTU3NyA1Ljc4MzYgMTMuOTgzMyA1LjY3OTU3QzE0LjAwOSA1LjU3NTU0IDE0LjAwNSA1LjQ2NjQgMTMuOTcxOCA1LjM2NDUzWlwiXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiI2VhYjMwOFwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJydi1hdmctbnVtXCI+e3tyZXNwb25zZURhdGE/LmF2ZXJhZ2VSYXRpbmcgfCBudW1iZXI6JzEuMS0xJ319PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnYtYXZnLWxhYmVsXCI+YXZlcmFnZTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJydi1jb3VudFwiIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIHx8ICcjMTBiOTgxJ1wiPlxuICAgICAgICAgIHt7cmVzcG9uc2VEYXRhPy50b3RhbFJldmlld0NvdW50IHwgbnVtYmVyfX0gUmV2aWV3c1xuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicnYtYmFyc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByYXRpbmcgb2YgWzUsNCwzLDIsMV1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnYtYmFyLXJvd1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJydi1iYXItbGFiZWxcIj57e3JhdGluZ319PC9zcGFuPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0xMy45NzE4IDUuMzY0NTNDMTMuOTM5OCA1LjI2Mjk4IDEzLjg3OTggNS4xNzI1MiAxMy43OTg2IDUuMTAzNTZDMTMuNzE3NSA1LjAzNDYgMTMuNjE4NiA0Ljk4OTk0IDEzLjUxMzIgNC45NzQ3Mkw5LjM3MDQzIDQuMzcwODhMNy41MTMwNyAwLjYxNzk1NUM3LjQ2MDIxIDAuNTI5MjcxIDcuMzg1MjIgMC40NTU4MzQgNy4yOTU0NSAwLjQwNDgzNkM3LjIwNTY4IDAuMzUzODM4IDcuMTA0MiAwLjMyNzAyNiA3LjAwMDk2IDAuMzI3MDI2QzYuODk3NzEgMC4zMjcwMjYgNi43OTYyNCAwLjM1MzgzOCA2LjcwNjQ3IDAuNDA0ODM2QzYuNjE2NyAwLjQ1NTgzNCA2LjU0MTcxIDAuNTI5MjcxIDYuNDg4ODUgMC42MTc5NTVMNC42MzE0OSA0LjM3MDg4TDAuNDg4NzQ2IDQuOTc0NzJDMC4zODMzNjMgNC45ODk5NCAwLjI4NDQxNiA1LjAzNDYgMC4yMDMyODYgNS4xMDM1NkMwLjEyMjE1NyA1LjE3MjUyIDAuMDYyMTQwNyA1LjI2Mjk4IDAuMDMwMTQgNS4zNjQ1M0MtMC4wMDQwMjI4NiA1LjQ2NTcxIC0wLjAwOTI0NDI4IDUuNTc0NDIgMC4wMTUwNjQ1IDUuNjc4NDFDMC4wMzkzNzMzIDUuNzgyNCAwLjA5MjI0NTcgNS44Nzc1MyAwLjE2NzcyMiA1Ljk1MzA4TDMuMTc5MjQgOC44NzI4N0wyLjQ2ODQgMTMuMDAwM0MyLjQ1MDM4IDEzLjEwNjYgMi40NjIyOSAxMy4yMTU4IDIuNTAyNzggMTMuMzE1N0MyLjU0MzI4IDEzLjQxNTYgMi42MTA3NyAxMy41MDIyIDIuNjk3NyAxMy41NjU5QzIuNzg0NzcgMTMuNjI4IDIuODg3NDYgMTMuNjY0NCAyLjk5NDE2IDEzLjY3MTJDMy4xMDA4NyAxMy42NzggMy4yMDczMyAxMy42NTQ3IDMuMzAxNTMgMTMuNjA0Mkw3LjAwMDk2IDExLjY1NTFMMTAuNzA4IDEzLjYwNDJDMTAuNzkgMTMuNjQ5MSAxMC44ODIgMTMuNjcyOCAxMC45NzU1IDEzLjY3M0MxMS4wOTU4IDEzLjY3MTYgMTEuMjEyOSAxMy42MzQzIDExLjMxMTkgMTMuNTY1OUMxMS4zOTg4IDEzLjUwMjIgMTEuNDY2MyAxMy40MTU2IDExLjUwNjggMTMuMzE1N0MxMS41NDczIDEzLjIxNTggMTEuNTU5MiAxMy4xMDY2IDExLjU0MTIgMTMuMDAwM0wxMC44MjI3IDguODcyODdMMTMuODI2NiA1Ljk1MzA4QzEzLjkwMzMgNS44NzgzNSAxMy45NTc3IDUuNzgzNiAxMy45ODMzIDUuNjc5NTdDMTQuMDA5IDUuNTc1NTQgMTQuMDA1IDUuNDY2NCAxMy45NzE4IDUuMzY0NTNaXCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiI2VhYjMwOFwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1iYXItdHJhY2tcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJ2LWJhci1maWxsXCIgW3N0eWxlLndpZHRoLiVdPVwiZ2V0UGVyY2VudGFnZShyYXRpbmcpXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUmV2aWV3IENhcmRzIEdyaWQgLS0+XG4gICAgPGRpdiBjbGFzcz1cInJ2LWdyaWRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJldmlldyBvZiByZXZpZXdzRGF0YVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmV2aWV3LnJldmlld1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnYtY2FyZC10b3BcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJ2LXJldmlld2VyXCI+XG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIidodHRwczovL3VpLWF2YXRhcnMuY29tL2FwaS8/bmFtZT0nICsgKHJldmlldz8udXNlck5hbWUgPz8gJ1UnKSArICcmYmFja2dyb3VuZD1yYW5kb20nXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnYtYXZhdGFyXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJ2LW5hbWUtZGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJydi1uYW1lXCI+e3tyZXZpZXc/LnVzZXJOYW1lID8/ICdBbm9ueW1vdXMnfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJ2LWRhdGVcIj57e3Jldmlldz8uY3JlYXRlZEF0IHwgZGF0ZTonZCBNTU0geSd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwhLS0gU3RhciByYXRpbmcgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1jYXJkLXN0YXJzXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcyBvZiBbMSwyLDMsNCw1XVwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInMgPD0gcmV2aWV3LnJhdGluZ1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEzLjk3MTggNS4zNjQ1M0MxMy45Mzk4IDUuMjYyOTggMTMuODc5OCA1LjE3MjUyIDEzLjc5ODYgNS4xMDM1NkMxMy43MTc1IDUuMDM0NiAxMy42MTg2IDQuOTg5OTQgMTMuNTEzMiA0Ljk3NDcyTDkuMzcwNDMgNC4zNzA4OEw3LjUxMzA3IDAuNjE3OTU1QzcuNDYwMjEgMC41MjkyNzEgNy4zODUyMiAwLjQ1NTgzNCA3LjI5NTQ1IDAuNDA0ODM2QzcuMjA1NjggMC4zNTM4MzggNy4xMDQyIDAuMzI3MDI2IDcuMDAwOTYgMC4zMjcwMjZDNi44OTc3MSAwLjMyNzAyNiA2Ljc5NjI0IDAuMzUzODM4IDYuNzA2NDcgMC40MDQ4MzZDNi42MTY3IDAuNDU1ODM0IDYuNTQxNzEgMC41MjkyNzEgNi40ODg4NSAwLjYxNzk1NUw0LjYzMTQ5IDQuMzcwODhMMC40ODg3NDYgNC45NzQ3MkMwLjM4MzM2MyA0Ljk4OTk0IDAuMjg0NDE2IDUuMDM0NiAwLjIwMzI4NiA1LjEwMzU2QzAuMTIyMTU3IDUuMTcyNTIgMC4wNjIxNDA3IDUuMjYyOTggMC4wMzAxNCA1LjM2NDUzQy0wLjAwNDAyMjg2IDUuNDY1NzEgLTAuMDA5MjQ0MjggNS41NzQ0MiAwLjAxNTA2NDUgNS42Nzg0MUMwLjAzOTM3MzMgNS43ODI0IDAuMDkyMjQ1NyA1Ljg3NzUzIDAuMTY3NzIyIDUuOTUzMDhMMy4xNzkyNCA4Ljg3Mjg3TDIuNDY4NCAxMy4wMDAzQzIuNDUwMzggMTMuMTA2NiAyLjQ2MjI5IDEzLjIxNTggMi41MDI3OCAxMy4zMTU3QzIuNTQzMjggMTMuNDE1NiAyLjYxMDc3IDEzLjUwMjIgMi42OTc3IDEzLjU2NTlDMi43ODQ3NyAxMy42MjggMi44ODc0NiAxMy42NjQ0IDIuOTk0MTYgMTMuNjcxMkMzLjEwMDg3IDEzLjY3OCAzLjIwNzMzIDEzLjY1NDcgMy4zMDE1MyAxMy42MDQyTDcuMDAwOTYgMTEuNjU1MUwxMC43MDggMTMuNjA0MkMxMC43OSAxMy42NDkxIDEwLjg4MiAxMy42NzI4IDEwLjk3NTUgMTMuNjczQzExLjA5NTggMTMuNjcxNiAxMS4yMTI5IDEzLjYzNDMgMTEuMzExOSAxMy41NjU5QzExLjM5ODggMTMuNTAyMiAxMS40NjYzIDEzLjQxNTYgMTEuNTA2OCAxMy4zMTU3QzExLjU0NzMgMTMuMjE1OCAxMS41NTkyIDEzLjEwNjYgMTEuNTQxMiAxMy4wMDAzTDEwLjgyMjcgOC44NzI4N0wxMy44MjY2IDUuOTUzMDhDMTMuOTAzMyA1Ljg3ODM1IDEzLjk1NzcgNS43ODM2IDEzLjk4MzMgNS42Nzk1N0MxNC4wMDkgNS41NzU1NCAxNC4wMDUgNS40NjY0IDEzLjk3MTggNS4zNjQ1M1pcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjZWFiMzA4XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInMgPiByZXZpZXcucmF0aW5nXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHN0eWxlPVwib3BhY2l0eTowLjI1XCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMy45NzE4IDUuMzY0NTNDMTMuOTM5OCA1LjI2Mjk4IDEzLjg3OTggNS4xNzI1MiAxMy43OTg2IDUuMTAzNTZDMTMuNzE3NSA1LjAzNDYgMTMuNjE4NiA0Ljk4OTk0IDEzLjUxMzIgNC45NzQ3Mkw5LjM3MDQzIDQuMzcwODhMNy41MTMwNyAwLjYxNzk1NUM3LjQ2MDIxIDAuNTI5MjcxIDcuMzg1MjIgMC40NTU4MzQgNy4yOTU0NSAwLjQwNDgzNkM3LjIwNTY4IDAuMzUzODM4IDcuMTA0MiAwLjMyNzAyNiA3LjAwMDk2IDAuMzI3MDI2QzYuODk3NzEgMC4zMjcwMjYgNi43OTYyNCAwLjM1MzgzOCA2LjcwNjQ3IDAuNDA0ODM2QzYuNjE2NyAwLjQ1NTgzNCA2LjU0MTcxIDAuNTI5MjcxIDYuNDg4ODUgMC42MTc5NTVMNC42MzE0OSA0LjM3MDg4TDAuNDg4NzQ2IDQuOTc0NzJDMC4zODMzNjMgNC45ODk5NCAwLjI4NDQxNiA1LjAzNDYgMC4yMDMyODYgNS4xMDM1NkMwLjEyMjE1NyA1LjE3MjUyIDAuMDYyMTQwNyA1LjI2Mjk4IDAuMDMwMTQgNS4zNjQ1M0MtMC4wMDQwMjI4NiA1LjQ2NTcxIC0wLjAwOTI0NDI4IDUuNTc0NDIgMC4wMTUwNjQ1IDUuNjc4NDFDMC4wMzkzNzMzIDUuNzgyNCAwLjA5MjI0NTcgNS44Nzc1MyAwLjE2NzcyMiA1Ljk1MzA4TDMuMTc5MjQgOC44NzI4N0wyLjQ2ODQgMTMuMDAwM0MyLjQ1MDM4IDEzLjEwNjYgMi40NjIyOSAxMy4yMTU4IDIuNTAyNzggMTMuMzE1N0MyLjU0MzI4IDEzLjQxNTYgMi42MTA3NyAxMy41MDIyIDIuNjk3NyAxMy41NjU5QzIuNzg0NzcgMTMuNjI4IDIuODg3NDYgMTMuNjY0NCAyLjk5NDE2IDEzLjY3MTJDMy4xMDA4NyAxMy42NzggMy4yMDczMyAxMy42NTQ3IDMuMzAxNTMgMTMuNjA0Mkw3LjAwMDk2IDExLjY1NTFMMTAuNzA4IDEzLjYwNDJDMTAuNzkgMTMuNjQ5MSAxMC44ODIgMTMuNjcyOCAxMC45NzU1IDEzLjY3M0MxMS4wOTU4IDEzLjY3MTYgMTEuMjEyOSAxMy42MzQzIDExLjMxMTkgMTMuNTY1OUMxMS4zOTg4IDEzLjUwMjIgMTEuNDY2MyAxMy40MTU2IDExLjUwNjggMTMuMzE1N0MxMS41NDczIDEzLjIxNTggMTEuNTU5MiAxMy4xMDY2IDExLjU0MTIgMTMuMDAwM0wxMC44MjI3IDguODcyODdMMTMuODI2NiA1Ljk1MzA4QzEzLjkwMzMgNS44NzgzNSAxMy45NTc3IDUuNzgzNiAxMy45ODMzIDUuNjc5NTdDMTQuMDA5IDUuNTc1NTQgMTQuMDA1IDUuNDY2NCAxMy45NzE4IDUuMzY0NTNaXCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI2VhYjMwOFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwicnYtdGV4dFwiPnt7cmV2aWV3Py5yZXZpZXcgPz8gJ05vIGNvbW1lbnQgcHJvdmlkZWQuJ319PC9wPlxuXG4gICAgICAgICAgICA8IS0tIFJldmlldyBJbWFnZXMgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnYtaW1hZ2VzXCIgKm5nSWY9XCJyZXZpZXc/LnJldmlld0ltYWdlcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgIDxhICpuZ0Zvcj1cImxldCBpbWcgb2YgcmV2aWV3LnJldmlld0ltYWdlc1wiIFtocmVmXT1cImltZy5pbWdVcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cInJ2LWltZy1saW5rXCI+XG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltZy5pbWdVcmxcIiBhbHQ9XCJSZXZpZXcgaW1hZ2VcIiBjbGFzcz1cInJ2LWltZy10aHVtYlwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG10LTRcIiAqbmdJZj1cIihyZXZpZXdzRGF0YT8ubGVuZ3RoID8/IDApID4gM1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIndyaXRlLXJldmlldy1idG5cIiAoY2xpY2spPVwibG9hZE1vcmVSZXZpZXdzKClcIj5Mb2FkIE1vcmUgUmV2aWV3czwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgY2xhc3M9XCJtb2RhbCBmYWRlXCIgaWQ9XCJleGFtcGxlTW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgYXJpYS1sYWJlbGxlZGJ5PVwiZXhhbXBsZU1vZGFsTGFiZWxcIiByb2xlPVwiZGlhbG9nXCJcbiAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkIHZpZGVvLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7XCI+XG4gICAgICAgIDx2aWRlbyBjb250cm9scyBtdXRlZCBwbGF5c2lubGluZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XCI+XG4gICAgICAgICAgPHNvdXJjZVxuICAgICAgICAgICAgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy8zNzE2NDdjMTc1Mzk2MjA4NDI2NWNsaWRlb19lZGl0b3JfNDhiYzkzYzI0ZTE4NDcwODg4YzY2MWJiMDllNDM3ZGEgKG9ubGluZS12aWRlby1jdXR0ZXIuY29tKS5tcDRcIlxuICAgICAgICAgICAgdHlwZT1cInZpZGVvL21wNFwiPlxuICAgICAgICAgIFlvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSB2aWRlbyB0YWcuXG4gICAgICAgIDwvdmlkZW8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cInJldmlld01vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cInJldmlld01vZGFsTGFiZWxcIiByb2xlPVwiZGlhbG9nXCJcbiAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgcmV2aWV3LW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgPGgxIGNsYXNzPVwibW9kYWwtdGl0bGUgZnMtNVwiPjwvaDE+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yZXZpZXctY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlLXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWltYWdlXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWNrd2FyZC1hcnJvdyBhcnJvd1wiIChjbGljayk9XCJjdXJyZW50SW1hZ2VJbmRleCA9IGN1cnJlbnRJbWFnZUluZGV4LTFcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudEltYWdlSW5kZXggPiAwXCI+4pa8PC9kaXY+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJzZWxlY3RlZFJldmlldz8ucmV2aWV3SW1hZ2VzPy5bY3VycmVudEltYWdlSW5kZXhdPy5pbWdVcmxcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcndhcmQtYXJyb3cgYXJyb3dcIiAoY2xpY2spPVwiY3VycmVudEltYWdlSW5kZXggPSBjdXJyZW50SW1hZ2VJbmRleCsxXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRJbWFnZUluZGV4IDwgc2VsZWN0ZWRSZXZpZXc/LmltYWdlcz8ubGVuZ3RoIC0gMVwiPuKWsjwvZGl2PlxuICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJlYXJidWRzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFyZ2luZy1jYXNlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVhcmJ1ZCBsZWZ0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVhcmJ1ZCByaWdodFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm5hdmlnYXRpb24tYXJyb3dzXCI+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmV2aWV3LXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXdlci1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlld2VyLWF2YXRhclwiPvCfkaQ8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlld2VyLW5hbWVcIj57e3NlbGVjdGVkUmV2aWV3Py51c2VyTmFtZSA/PyBcIi1cIn19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yYXRpbmdcIiAqbmdJZj1cInNlbGVjdGVkUmV2aWV3Py5yYXRpbmdcIj5cbiAgICAgICAgICAgICAgPHAtcmF0aW5nIFsobmdNb2RlbCldPVwic2VsZWN0ZWRSZXZpZXcucmF0aW5nXCIgW2NhbmNlbF09XCJmYWxzZVwiIFtyZWFkb25seV09XCJ0cnVlXCI+PC9wLXJhdGluZz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmV2aWV3LWRhdGVcIj5cbiAgICAgICAgICAgICAgUmV2aWV3ZWQgaW4gSW5kaWEgb24gMjQgSnVseSAyMDI1XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlldy10ZXh0XCI+XG4gICAgICAgICAgICAgIHt7c2VsZWN0ZWRSZXZpZXc/LnJldmlldyA/PyBcIi1cIn19XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlcy1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgIDxoMz5JbWFnZXMgaW4gdGhpcyByZXZpZXc8L2gzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmV2aWV3LWltYWdlc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctaW1hZ2VcIiBbbmdDbGFzc109XCJ7J3NlbGVjdGVkJzogY3VycmVudEltYWdlSW5kZXggPT0gaX1cIlxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGltZyBvZiBzZWxlY3RlZFJldmlldz8ucmV2aWV3SW1hZ2VzID8/IFtdO2xldCBpID0gaW5kZXhcIiAoY2xpY2spPVwiY3VycmVudEltYWdlSW5kZXggPSBpXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1nLmltZ1VybFwiIGFsdD1cIlwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
|