UNPKG

@vendasta/store

Version:

Components and data for Store

18 lines 27.7 kB
import { Component } from '@angular/core'; import { VaBasePricingComponent } from '../base-pricing.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/icon"; import * as i2 from "@vendasta/galaxy/popover"; import * as i3 from "@angular/common"; import * as i4 from "@ngx-translate/core"; import * as i5 from "@vendasta/core/shared"; import * as i6 from "../../shared/format-discount.pipe"; export class TablePricingComponent extends VaBasePricingComponent { } TablePricingComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: TablePricingComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); TablePricingComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: TablePricingComponent, selector: "app-table-pricing", usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"loaded; else loading\">\n <span *ngIf=\"showIsStartingAt\" class=\"starting-at\">\n {{ 'FRONTEND.STORE.STARTING_AT' | translate }}\n </span>\n <div *ngIf=\"hasVerifiedContract && billedProduct; else usePricing\">\n <div\n class=\"price-container\"\n *ngIf=\"isFlatPrice$ | async; else notFlatPrice\"\n >\n <div class=\"price\">\n {{ (pricingTierData$ | async)[0]?.priceStringForTier }}\n </div>\n </div>\n <ng-template #notFlatPrice>\n <ng-container *ngIf=\"isFirstTierFree$ | async; else firstTierNotFree\">\n <div class=\"starting-at-caption\">Starting at</div>\n {{ 'FRONTEND.STORE.FREE' | translate }}\n <mat-icon\n class=\"tooltip-icon\"\n (mouseenter)=\"itemInfoIconEnter()\"\n (mouseleave)=\"itemInfoIconLeave()\"\n [glxyPopover]=\"pricingPopover\"\n >\n info_outline\n </mat-icon>\n\n <glxy-popover\n #pricingPopover\n [isOpen]=\"showPricingPopover\"\n [hasArrow]=\"true\"\n [positions]=\"[]\"\n [padding]=\"'large'\"\n [maxWidth]=\"'auto'\"\n >\n <div class=\"pricing-popover-content\">\n <div class=\"discounts-title\">\n {{\n 'FRONTEND.TABLE_PRICING.WHOLESALE_PRICING_INFORMATION'\n | translate\n }}\n </div>\n\n <div class=\"popover-price-container\">\n <div\n class=\"pricing-tier\"\n *ngFor=\"let tier of pricingTierData$ | async\"\n >\n <div class=\"pricing-tier__range\">\n {{ tier.pricingTierString }}\n </div>\n <div class=\"pricing-tier__price\">\n {{ tier.priceStringForTier }}\n </div>\n </div>\n <div class=\"pricing-tier\" *ngIf=\"billedProduct?.setupFee > 0\">\n <div class=\"pricing-tier__range\"></div>\n <div class=\"pricing-tier__price\">\n +\n {{\n billedProduct.setupFee\n | price$: billedProduct.currency\n | async\n }}\n {{ setupFeeString$ | async }}\n </div>\n </div>\n </div>\n\n <div *ngIf=\"discounts$ | async as discounts\" class=\"discounts\">\n <div *ngIf=\"discounts.length\">\n <span class=\"discounts-title\">\n {{ 'FRONTEND.TABLE_PRICING.ACTIVE_DISCOUNTS' | translate }}\n </span>\n </div>\n <ul class=\"discount-list\">\n <li *ngFor=\"let disc of discounts\">\n {{ disc | formatDiscount: billedProduct?.currency }}\n </li>\n </ul>\n </div>\n </div>\n </glxy-popover>\n </ng-container>\n\n <ng-template #firstTierNotFree>\n <div class=\"price-container--tiered\">\n <div\n class=\"pricing-tier\"\n *ngFor=\"let tier of pricingTierData$ | async\"\n >\n <div class=\"pricing-tier__range\">{{ tier.pricingTierString }}</div>\n <div class=\"pricing-tier__price\">\n {{ tier.priceStringForTier }}\n </div>\n </div>\n <div class=\"pricing-tier\" *ngIf=\"billedProduct?.setupFee > 0\">\n <div class=\"pricing-tier__range\"></div>\n <div class=\"pricing-tier__price\">\n +\n {{\n billedProduct.setupFee | price$: billedProduct.currency | async\n }}\n {{ setupFeeString$ | async }}\n </div>\n </div>\n </div>\n </ng-template>\n </ng-template>\n <div\n class=\"setupFee\"\n *ngIf=\"billedProduct?.setupFee > 0 && isFlatPrice$ | async\"\n >\n + {{ billedProduct.setupFee | price$: billedProduct.currency | async }}\n {{ setupFeeString$ | async }}\n </div>\n <div\n class=\"commitment\"\n *ngIf=\"\n billedProduct &&\n billedProduct.commitment &&\n billedProduct.commitment.initial > 1\n \"\n >\n {{ commitmentMessage$ | async }}\n </div>\n </div>\n <ng-template #usePricing>\n <div class=\"gray-font\">\n <ng-container *ngIf=\"shouldContactSales$ | async; else dontContactSales\">\n {{ 'FRONTEND.STORE.CONTACT_SALES' | translate }}\n </ng-container>\n <ng-template #dontContactSales>\n <ng-container *ngIf=\"isFree$ | async; else notFree\">\n {{ 'FRONTEND.STORE.FREE' | translate }}\n </ng-container>\n <ng-template #notFree>\n <ng-container *ngIf=\"priceData$ | async as priceDatas\">\n <ng-container *ngIf=\"showAllPrices\">\n <ng-container\n *ngFor=\"let priceData of priceDatas; let first = first\"\n >\n <span\n *ngIf=\"first\"\n [ngClass]=\"{ first: priceDatas.length > 1 }\"\n >\n {{ priceData.priceStringForPricingWithFrequency }}\n </span>\n <span *ngIf=\"!first\">\n + {{ priceData.priceStringForPricingWithFrequency }}\n </span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!showAllPrices\">\n {{ priceDatas[0].priceStringForPricingWithFrequency }}\n </ng-container>\n </ng-container>\n <div class=\"setupFee\" *ngIf=\"billedProduct?.setupFee > 0\">\n +\n {{\n billedProduct.setupFee | price$: billedProduct.currency | async\n }}\n {{ setupFeeString$ | async }}\n </div>\n <div\n class=\"commitment\"\n *ngIf=\"\n billedProduct &&\n billedProduct.commitment &&\n billedProduct.commitment.initial > 1\n \"\n >\n {{ commitmentMessage$ | async }}\n </div>\n </ng-template>\n </ng-template>\n </div>\n </ng-template>\n</ng-container>\n<ng-template #loading>\n <div class=\"stencil-pricing stencil-shimmer\"></div>\n</ng-template>\n", styles: [":host{color:#616161}.starting-at{margin-right:5px}.price-container--tiered{font-size:12px;flex-direction:column;display:flex;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.price-container--tiered .pricing-tier{border-bottom:1px solid #e0e0e0;padding:5px 0;display:flex}.price-container--tiered .pricing-tier:first-child{padding-top:0}.price-container--tiered .pricing-tier:last-child{padding-bottom:0;border-bottom:none}.price-container--tiered .pricing-tier .pricing-tier__range{padding-right:20px;flex:1}.stencil-pricing{height:1em}.commitment{color:#9e9e9e;font-size:12px;font-style:italic}.first{padding-left:10px}.tooltip-icon{flex:0 0;margin-left:6px;line-height:20px;vertical-align:middle;color:#e0e0e0;cursor:default}.pricing-popover-content .tooltip-messages,.pricing-popover-content .discounts{margin-top:16px}.pricing-popover-content .discounts-title{font-weight:700}.pricing-popover-content .discount-list{margin-top:8px}.popover-price-container{flex-direction:column;display:flex;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;margin-top:16px}.popover-price-container .pricing-tier{border-bottom:1px solid #e0e0e0;padding:5px 0;display:flex}.popover-price-container .pricing-tier:first-child{padding-top:0}.popover-price-container .pricing-tier:last-child{padding-bottom:0;border-bottom:none}.popover-price-container .pricing-tier .pricing-tier__range{padding-right:20px;flex:1}.starting-at-caption{font-size:.8em;margin-bottom:6px;display:block}\n"], components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.PopoverComponent, selector: "glxy-popover", inputs: ["origin", "keepOnScreen", "maxWidth", "maxHeight", "isOpen", "hasBackdrop", "showBackdrop", "hasArrow", "padding", "highContrast", "positions"], outputs: ["backdropClick"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.GalaxyPopoverDirective, selector: "[glxyPopover]", inputs: ["glxyPopover"], exportAs: ["glxyPopover"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "translate": i4.TranslatePipe, "async": i3.AsyncPipe, "price$": i5.DisplayPricePipe, "formatDiscount": i6.FormatDiscountPipe } }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: TablePricingComponent, decorators: [{ type: Component, args: [{ selector: 'app-table-pricing', template: "<ng-container *ngIf=\"loaded; else loading\">\n <span *ngIf=\"showIsStartingAt\" class=\"starting-at\">\n {{ 'FRONTEND.STORE.STARTING_AT' | translate }}\n </span>\n <div *ngIf=\"hasVerifiedContract && billedProduct; else usePricing\">\n <div\n class=\"price-container\"\n *ngIf=\"isFlatPrice$ | async; else notFlatPrice\"\n >\n <div class=\"price\">\n {{ (pricingTierData$ | async)[0]?.priceStringForTier }}\n </div>\n </div>\n <ng-template #notFlatPrice>\n <ng-container *ngIf=\"isFirstTierFree$ | async; else firstTierNotFree\">\n <div class=\"starting-at-caption\">Starting at</div>\n {{ 'FRONTEND.STORE.FREE' | translate }}\n <mat-icon\n class=\"tooltip-icon\"\n (mouseenter)=\"itemInfoIconEnter()\"\n (mouseleave)=\"itemInfoIconLeave()\"\n [glxyPopover]=\"pricingPopover\"\n >\n info_outline\n </mat-icon>\n\n <glxy-popover\n #pricingPopover\n [isOpen]=\"showPricingPopover\"\n [hasArrow]=\"true\"\n [positions]=\"[]\"\n [padding]=\"'large'\"\n [maxWidth]=\"'auto'\"\n >\n <div class=\"pricing-popover-content\">\n <div class=\"discounts-title\">\n {{\n 'FRONTEND.TABLE_PRICING.WHOLESALE_PRICING_INFORMATION'\n | translate\n }}\n </div>\n\n <div class=\"popover-price-container\">\n <div\n class=\"pricing-tier\"\n *ngFor=\"let tier of pricingTierData$ | async\"\n >\n <div class=\"pricing-tier__range\">\n {{ tier.pricingTierString }}\n </div>\n <div class=\"pricing-tier__price\">\n {{ tier.priceStringForTier }}\n </div>\n </div>\n <div class=\"pricing-tier\" *ngIf=\"billedProduct?.setupFee > 0\">\n <div class=\"pricing-tier__range\"></div>\n <div class=\"pricing-tier__price\">\n +\n {{\n billedProduct.setupFee\n | price$: billedProduct.currency\n | async\n }}\n {{ setupFeeString$ | async }}\n </div>\n </div>\n </div>\n\n <div *ngIf=\"discounts$ | async as discounts\" class=\"discounts\">\n <div *ngIf=\"discounts.length\">\n <span class=\"discounts-title\">\n {{ 'FRONTEND.TABLE_PRICING.ACTIVE_DISCOUNTS' | translate }}\n </span>\n </div>\n <ul class=\"discount-list\">\n <li *ngFor=\"let disc of discounts\">\n {{ disc | formatDiscount: billedProduct?.currency }}\n </li>\n </ul>\n </div>\n </div>\n </glxy-popover>\n </ng-container>\n\n <ng-template #firstTierNotFree>\n <div class=\"price-container--tiered\">\n <div\n class=\"pricing-tier\"\n *ngFor=\"let tier of pricingTierData$ | async\"\n >\n <div class=\"pricing-tier__range\">{{ tier.pricingTierString }}</div>\n <div class=\"pricing-tier__price\">\n {{ tier.priceStringForTier }}\n </div>\n </div>\n <div class=\"pricing-tier\" *ngIf=\"billedProduct?.setupFee > 0\">\n <div class=\"pricing-tier__range\"></div>\n <div class=\"pricing-tier__price\">\n +\n {{\n billedProduct.setupFee | price$: billedProduct.currency | async\n }}\n {{ setupFeeString$ | async }}\n </div>\n </div>\n </div>\n </ng-template>\n </ng-template>\n <div\n class=\"setupFee\"\n *ngIf=\"billedProduct?.setupFee > 0 && isFlatPrice$ | async\"\n >\n + {{ billedProduct.setupFee | price$: billedProduct.currency | async }}\n {{ setupFeeString$ | async }}\n </div>\n <div\n class=\"commitment\"\n *ngIf=\"\n billedProduct &&\n billedProduct.commitment &&\n billedProduct.commitment.initial > 1\n \"\n >\n {{ commitmentMessage$ | async }}\n </div>\n </div>\n <ng-template #usePricing>\n <div class=\"gray-font\">\n <ng-container *ngIf=\"shouldContactSales$ | async; else dontContactSales\">\n {{ 'FRONTEND.STORE.CONTACT_SALES' | translate }}\n </ng-container>\n <ng-template #dontContactSales>\n <ng-container *ngIf=\"isFree$ | async; else notFree\">\n {{ 'FRONTEND.STORE.FREE' | translate }}\n </ng-container>\n <ng-template #notFree>\n <ng-container *ngIf=\"priceData$ | async as priceDatas\">\n <ng-container *ngIf=\"showAllPrices\">\n <ng-container\n *ngFor=\"let priceData of priceDatas; let first = first\"\n >\n <span\n *ngIf=\"first\"\n [ngClass]=\"{ first: priceDatas.length > 1 }\"\n >\n {{ priceData.priceStringForPricingWithFrequency }}\n </span>\n <span *ngIf=\"!first\">\n + {{ priceData.priceStringForPricingWithFrequency }}\n </span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!showAllPrices\">\n {{ priceDatas[0].priceStringForPricingWithFrequency }}\n </ng-container>\n </ng-container>\n <div class=\"setupFee\" *ngIf=\"billedProduct?.setupFee > 0\">\n +\n {{\n billedProduct.setupFee | price$: billedProduct.currency | async\n }}\n {{ setupFeeString$ | async }}\n </div>\n <div\n class=\"commitment\"\n *ngIf=\"\n billedProduct &&\n billedProduct.commitment &&\n billedProduct.commitment.initial > 1\n \"\n >\n {{ commitmentMessage$ | async }}\n </div>\n </ng-template>\n </ng-template>\n </div>\n </ng-template>\n</ng-container>\n<ng-template #loading>\n <div class=\"stencil-pricing stencil-shimmer\"></div>\n</ng-template>\n", styles: [":host{color:#616161}.starting-at{margin-right:5px}.price-container--tiered{font-size:12px;flex-direction:column;display:flex;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.price-container--tiered .pricing-tier{border-bottom:1px solid #e0e0e0;padding:5px 0;display:flex}.price-container--tiered .pricing-tier:first-child{padding-top:0}.price-container--tiered .pricing-tier:last-child{padding-bottom:0;border-bottom:none}.price-container--tiered .pricing-tier .pricing-tier__range{padding-right:20px;flex:1}.stencil-pricing{height:1em}.commitment{color:#9e9e9e;font-size:12px;font-style:italic}.first{padding-left:10px}.tooltip-icon{flex:0 0;margin-left:6px;line-height:20px;vertical-align:middle;color:#e0e0e0;cursor:default}.pricing-popover-content .tooltip-messages,.pricing-popover-content .discounts{margin-top:16px}.pricing-popover-content .discounts-title{font-weight:700}.pricing-popover-content .discount-list{margin-top:8px}.popover-price-container{flex-direction:column;display:flex;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;margin-top:16px}.popover-price-container .pricing-tier{border-bottom:1px solid #e0e0e0;padding:5px 0;display:flex}.popover-price-container .pricing-tier:first-child{padding-top:0}.popover-price-container .pricing-tier:last-child{padding-bottom:0;border-bottom:none}.popover-price-container .pricing-tier .pricing-tier__range{padding-right:20px;flex:1}.starting-at-caption{font-size:.8em;margin-bottom:6px;display:block}\n"] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcHJpY2luZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3N0b3JlL3NyYy9saWIvcHJpY2luZy90YWJsZS1wcmljaW5nL3RhYmxlLXByaWNpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zdG9yZS9zcmMvbGliL3ByaWNpbmcvdGFibGUtcHJpY2luZy90YWJsZS1wcmljaW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7O0FBT25FLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxzQkFBc0I7O2tIQUFwRCxxQkFBcUI7c0dBQXJCLHFCQUFxQixnRkNSbEMsb3hNQXFMQTsyRkQ3S2EscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVmFCYXNlUHJpY2luZ0NvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UtcHJpY2luZy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdGFibGUtcHJpY2luZycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS1wcmljaW5nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUtcHJpY2luZy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVByaWNpbmdDb21wb25lbnQgZXh0ZW5kcyBWYUJhc2VQcmljaW5nQ29tcG9uZW50IHt9XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGVkOyBlbHNlIGxvYWRpbmdcIj5cbiAgPHNwYW4gKm5nSWY9XCJzaG93SXNTdGFydGluZ0F0XCIgY2xhc3M9XCJzdGFydGluZy1hdFwiPlxuICAgIHt7ICdGUk9OVEVORC5TVE9SRS5TVEFSVElOR19BVCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9zcGFuPlxuICA8ZGl2ICpuZ0lmPVwiaGFzVmVyaWZpZWRDb250cmFjdCAmJiBiaWxsZWRQcm9kdWN0OyBlbHNlIHVzZVByaWNpbmdcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInByaWNlLWNvbnRhaW5lclwiXG4gICAgICAqbmdJZj1cImlzRmxhdFByaWNlJCB8IGFzeW5jOyBlbHNlIG5vdEZsYXRQcmljZVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInByaWNlXCI+XG4gICAgICAgIHt7IChwcmljaW5nVGllckRhdGEkIHwgYXN5bmMpWzBdPy5wcmljZVN0cmluZ0ZvclRpZXIgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjbm90RmxhdFByaWNlPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRmlyc3RUaWVyRnJlZSQgfCBhc3luYzsgZWxzZSBmaXJzdFRpZXJOb3RGcmVlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdGFydGluZy1hdC1jYXB0aW9uXCI+U3RhcnRpbmcgYXQ8L2Rpdj5cbiAgICAgICAge3sgJ0ZST05URU5ELlNUT1JFLkZSRUUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgIGNsYXNzPVwidG9vbHRpcC1pY29uXCJcbiAgICAgICAgICAobW91c2VlbnRlcik9XCJpdGVtSW5mb0ljb25FbnRlcigpXCJcbiAgICAgICAgICAobW91c2VsZWF2ZSk9XCJpdGVtSW5mb0ljb25MZWF2ZSgpXCJcbiAgICAgICAgICBbZ2x4eVBvcG92ZXJdPVwicHJpY2luZ1BvcG92ZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgaW5mb19vdXRsaW5lXG4gICAgICAgIDwvbWF0LWljb24+XG5cbiAgICAgICAgPGdseHktcG9wb3ZlclxuICAgICAgICAgICNwcmljaW5nUG9wb3ZlclxuICAgICAgICAgIFtpc09wZW5dPVwic2hvd1ByaWNpbmdQb3BvdmVyXCJcbiAgICAgICAgICBbaGFzQXJyb3ddPVwidHJ1ZVwiXG4gICAgICAgICAgW3Bvc2l0aW9uc109XCJbXVwiXG4gICAgICAgICAgW3BhZGRpbmddPVwiJ2xhcmdlJ1wiXG4gICAgICAgICAgW21heFdpZHRoXT1cIidhdXRvJ1wiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJpY2luZy1wb3BvdmVyLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNjb3VudHMtdGl0bGVcIj5cbiAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAnRlJPTlRFTkQuVEFCTEVfUFJJQ0lORy5XSE9MRVNBTEVfUFJJQ0lOR19JTkZPUk1BVElPTidcbiAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXItcHJpY2UtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cInByaWNpbmctdGllclwiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHRpZXIgb2YgcHJpY2luZ1RpZXJEYXRhJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmljaW5nLXRpZXJfX3JhbmdlXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0aWVyLnByaWNpbmdUaWVyU3RyaW5nIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByaWNpbmctdGllcl9fcHJpY2VcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRpZXIucHJpY2VTdHJpbmdGb3JUaWVyIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJpY2luZy10aWVyXCIgKm5nSWY9XCJiaWxsZWRQcm9kdWN0Py5zZXR1cEZlZSA+IDBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJpY2luZy10aWVyX19yYW5nZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmljaW5nLXRpZXJfX3ByaWNlXCI+XG4gICAgICAgICAgICAgICAgICArXG4gICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICBiaWxsZWRQcm9kdWN0LnNldHVwRmVlXG4gICAgICAgICAgICAgICAgICAgICAgfCBwcmljZSQ6IGJpbGxlZFByb2R1Y3QuY3VycmVuY3lcbiAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAge3sgc2V0dXBGZWVTdHJpbmckIHwgYXN5bmMgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRpc2NvdW50cyQgfCBhc3luYyBhcyBkaXNjb3VudHNcIiBjbGFzcz1cImRpc2NvdW50c1wiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGlzY291bnRzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGlzY291bnRzLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnRlJPTlRFTkQuVEFCTEVfUFJJQ0lORy5BQ1RJVkVfRElTQ09VTlRTJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRpc2NvdW50LWxpc3RcIj5cbiAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGRpc2Mgb2YgZGlzY291bnRzXCI+XG4gICAgICAgICAgICAgICAgICB7eyBkaXNjIHwgZm9ybWF0RGlzY291bnQ6IGJpbGxlZFByb2R1Y3Q/LmN1cnJlbmN5IH19XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2dseHktcG9wb3Zlcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctdGVtcGxhdGUgI2ZpcnN0VGllck5vdEZyZWU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZS1jb250YWluZXItLXRpZXJlZFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwicHJpY2luZy10aWVyXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCB0aWVyIG9mIHByaWNpbmdUaWVyRGF0YSQgfCBhc3luY1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByaWNpbmctdGllcl9fcmFuZ2VcIj57eyB0aWVyLnByaWNpbmdUaWVyU3RyaW5nIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJpY2luZy10aWVyX19wcmljZVwiPlxuICAgICAgICAgICAgICB7eyB0aWVyLnByaWNlU3RyaW5nRm9yVGllciB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByaWNpbmctdGllclwiICpuZ0lmPVwiYmlsbGVkUHJvZHVjdD8uc2V0dXBGZWUgPiAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJpY2luZy10aWVyX19yYW5nZVwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByaWNpbmctdGllcl9fcHJpY2VcIj5cbiAgICAgICAgICAgICAgK1xuICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgIGJpbGxlZFByb2R1Y3Quc2V0dXBGZWUgfCBwcmljZSQ6IGJpbGxlZFByb2R1Y3QuY3VycmVuY3kgfCBhc3luY1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICB7eyBzZXR1cEZlZVN0cmluZyQgfCBhc3luYyB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwic2V0dXBGZWVcIlxuICAgICAgKm5nSWY9XCJiaWxsZWRQcm9kdWN0Py5zZXR1cEZlZSA+IDAgJiYgaXNGbGF0UHJpY2UkIHwgYXN5bmNcIlxuICAgID5cbiAgICAgICsge3sgYmlsbGVkUHJvZHVjdC5zZXR1cEZlZSB8IHByaWNlJDogYmlsbGVkUHJvZHVjdC5jdXJyZW5jeSB8IGFzeW5jIH19XG4gICAgICB7eyBzZXR1cEZlZVN0cmluZyQgfCBhc3luYyB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY29tbWl0bWVudFwiXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBiaWxsZWRQcm9kdWN0ICYmXG4gICAgICAgIGJpbGxlZFByb2R1Y3QuY29tbWl0bWVudCAmJlxuICAgICAgICBiaWxsZWRQcm9kdWN0LmNvbW1pdG1lbnQuaW5pdGlhbCA+IDFcbiAgICAgIFwiXG4gICAgPlxuICAgICAge3sgY29tbWl0bWVudE1lc3NhZ2UkIHwgYXN5bmMgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxuZy10ZW1wbGF0ZSAjdXNlUHJpY2luZz5cbiAgICA8ZGl2IGNsYXNzPVwiZ3JheS1mb250XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvdWxkQ29udGFjdFNhbGVzJCB8IGFzeW5jOyBlbHNlIGRvbnRDb250YWN0U2FsZXNcIj5cbiAgICAgICAge3sgJ0ZST05URU5ELlNUT1JFLkNPTlRBQ1RfU0FMRVMnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZG9udENvbnRhY3RTYWxlcz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRnJlZSQgfCBhc3luYzsgZWxzZSBub3RGcmVlXCI+XG4gICAgICAgICAge3sgJ0ZST05URU5ELlNUT1JFLkZSRUUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI25vdEZyZWU+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByaWNlRGF0YSQgfCBhc3luYyBhcyBwcmljZURhdGFzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0FsbFByaWNlc1wiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHByaWNlRGF0YSBvZiBwcmljZURhdGFzOyBsZXQgZmlyc3QgPSBmaXJzdFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmaXJzdFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGZpcnN0OiBwcmljZURhdGFzLmxlbmd0aCA+IDEgfVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgcHJpY2VEYXRhLnByaWNlU3RyaW5nRm9yUHJpY2luZ1dpdGhGcmVxdWVuY3kgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmlyc3RcIj5cbiAgICAgICAgICAgICAgICAgICsge3sgcHJpY2VEYXRhLnByaWNlU3RyaW5nRm9yUHJpY2luZ1dpdGhGcmVxdWVuY3kgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNob3dBbGxQcmljZXNcIj5cbiAgICAgICAgICAgICAge3sgcHJpY2VEYXRhc1swXS5wcmljZVN0cmluZ0ZvclByaWNpbmdXaXRoRnJlcXVlbmN5IH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2V0dXBGZWVcIiAqbmdJZj1cImJpbGxlZFByb2R1Y3Q/LnNldHVwRmVlID4gMFwiPlxuICAgICAgICAgICAgK1xuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgYmlsbGVkUHJvZHVjdC5zZXR1cEZlZSB8IHByaWNlJDogYmlsbGVkUHJvZHVjdC5jdXJyZW5jeSB8IGFzeW5jXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAge3sgc2V0dXBGZWVTdHJpbmckIHwgYXN5bmMgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNvbW1pdG1lbnRcIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgYmlsbGVkUHJvZHVjdCAmJlxuICAgICAgICAgICAgICBiaWxsZWRQcm9kdWN0LmNvbW1pdG1lbnQgJiZcbiAgICAgICAgICAgICAgYmlsbGVkUHJvZHVjdC5jb21taXRtZW50LmluaXRpYWwgPiAxXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGNvbW1pdG1lbnRNZXNzYWdlJCB8IGFzeW5jIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy1jb250YWluZXI+XG48bmctdGVtcGxhdGUgI2xvYWRpbmc+XG4gIDxkaXYgY2xhc3M9XCJzdGVuY2lsLXByaWNpbmcgc3RlbmNpbC1zaGltbWVyXCI+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19