UNPKG

@vendasta/store

Version:

Components and data for Store

179 lines 46 kB
import { Component, Input } from '@angular/core'; import { trigger, transition, animate, style, state } from '@angular/animations'; import { BehaviorSubject, ReplaySubject, combineLatest, zip } from 'rxjs'; import { filter, map, startWith, tap } from 'rxjs/operators'; import { buildSalesPackages, buildSalesProductFromProduct, addStatusesToSalesPackages, addStatusesToSalesProduct, } from './sales-package'; import { ListIndent } from './package-dropdown-item/package-dropdown-item.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/card"; import * as i2 from "@angular/material/list"; import * as i3 from "./package-dropdown-item/package-dropdown-item.component"; import * as i4 from "@vendasta/uikit"; import * as i5 from "@angular/common"; import * as i6 from "@ngx-translate/core"; export class VaPackageDropdownComponent { constructor() { // controls whether only one dropdown can be expanded at a time this.singularDropdown = false; // hides pricing this.hidePricing = false; this.packageProductIndent = ListIndent.INDENT_ONE; this.packageAddonWithoutProductIndent = ListIndent.INDENT_ONE; this.packageAddonWithProductIndent = ListIndent.INDENT_TWO; this.productAddonIndent = ListIndent.INDENT_ONE; this.packages$$ = new ReplaySubject(1); this.products$$ = new ReplaySubject(1); this.standAloneProducts$$ = new ReplaySubject(1); this.statuses$$ = new BehaviorSubject([]); this.addons$$ = new ReplaySubject(1); this.orderItemLengths$$ = new BehaviorSubject({ packages: 0, products: 0, }); this.packageToggles = []; this.productToggles = []; } // packages in dropdown set packages(packages) { this.packages$$.next(packages); } // products within given packages set products(products) { this.products$$.next(products); } // products not associated with a package set standAloneProducts(standAloneProducts) { this.standAloneProducts$$.next(standAloneProducts); } // statuses for all products and addons set statuses(statuses) { this.statuses$$.next(statuses); } // addons within given packages set addons(addons) { this.addons$$.next(addons); } ngOnInit() { const packages$ = this.packages$$.pipe(filter((packages) => packages !== null)); const products$ = this.products$$.pipe(filter((products) => products !== null)); const addons$ = this.addons$$.pipe(filter((addons) => addons !== null)); const salesPackage$ = zip(packages$, products$, addons$).pipe(tap(([packages, products, _]) => { this.orderItemLengths$$.next({ packages: packages.length, products: products.length, }); }), map(([packages, products, addons]) => buildSalesPackages(packages, products, addons))); this.salesPackages$ = combineLatest([salesPackage$, this.statuses$$]).pipe(map(([salesPackages, statuses]) => addStatusesToSalesPackages(salesPackages, statuses)), startWith([])); this.salesProducts$ = combineLatest([this.standAloneProducts$$, this.statuses$$]).pipe(filter(([products, _]) => products !== null), map(([products, statuses]) => { return products.map((p) => { const addons = p.addons || null; const salesProducts = buildSalesProductFromProduct(p, addons); return addStatusesToSalesProduct(salesProducts, statuses); }); }), startWith([])); this.templateData$ = combineLatest([this.salesPackages$, this.salesProducts$]).pipe(map(([packages, products]) => ({ packages: packages, products: products }))); } openAllDropdowns() { for (let x = 0; x < this.orderItemLengths$$.getValue().packages; x++) { this.packageToggles[x] = true; } for (let x = 0; x < this.orderItemLengths$$.getValue().products; x++) { this.productToggles[x] = true; } } togglePackage(indexToToggle) { if (this.singularDropdown) { const openedIndex = this.packageToggles.findIndex((value) => value === true); if (openedIndex !== indexToToggle) { this.packageToggles[openedIndex] = false; } const productOpenedIndex = this.productToggles.findIndex((value) => value === true); if (productOpenedIndex > -1) { this.productToggles[productOpenedIndex] = false; } } this.packageToggles[indexToToggle] = !this.packageToggles[indexToToggle]; } toggleProduct(indexToToggle) { if (this.singularDropdown) { const openedIndex = this.productToggles.findIndex((value) => value === true); if (openedIndex !== indexToToggle) { this.productToggles[openedIndex] = false; } const packageOpenedIndex = this.packageToggles.findIndex((value) => value === true); if (packageOpenedIndex > -1) { this.packageToggles[packageOpenedIndex] = false; } } this.productToggles[indexToToggle] = !this.productToggles[indexToToggle]; } standAloneProductDescription(product) { if (product.addons && product.addons.length > 0) { let description = `Contains ${product.addons.length}`; description = product.addons.length === 1 ? `${description} Addon` : `${description} Addons`; return description; } return ''; } standAloneProductWithParentDescription(product) { if (!product.parentInfo) { return ''; } return `(Requires ${product.parentInfo.parentName})`; } packageDescription(pkg) { const hasProducts = pkg.products && pkg.products.length > 0; if (!hasProducts && pkg.totalAddons === 0) { return 'No Items in Package'; } let description = ''; const hasOneProduct = pkg.products && pkg.products.length === 1; if (hasProducts || pkg.totalAddons > 0) { description = 'Contains '; } if (hasProducts) { description = `${description} ${pkg.products.length}`; description = hasOneProduct ? `${description} Product` : `${description} Products`; } if (hasProducts && pkg.totalAddons > 0) { description = `${description} & ${pkg.totalAddons}`; description = pkg.totalAddons === 1 ? `${description} Addon` : `${description} Addons`; } return description; } } VaPackageDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaPackageDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); VaPackageDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: VaPackageDropdownComponent, selector: "app-package-dropdown", inputs: { packages: "packages", products: "products", standAloneProducts: "standAloneProducts", statuses: "statuses", addons: "addons", singularDropdown: "singularDropdown", hidePricing: "hidePricing" }, ngImport: i0, template: "<ng-container *ngIf=\"templateData$ | async as data\">\n <mat-card\n class=\"package-list-container\"\n *ngIf=\"data.products?.length > 0 || data.packages?.length > 0; else loading\"\n >\n <mat-list>\n <div\n class=\"package-list\"\n *ngFor=\"let package of data.packages; let packageIndex = index\"\n >\n <app-package-dropdown-item\n [title]=\"package.name\"\n [iconUrl]=\"package.icon\"\n [subtitle]=\"hidePricing ? '' : package.formattedPrices\"\n [statusItem]=\"package.activationStatus\"\n [description]=\"packageDescription(package)\"\n [enableDropdown]=\"\n package.products?.length > 0 ||\n package.addonsWithNoParent?.length > 0\n \"\n [toggleValue]=\"packageToggles[packageIndex]\"\n (itemToggled)=\"togglePackage(packageIndex)\"\n ></app-package-dropdown-item>\n\n <mat-list\n class=\"product-or-addon-list package-dropdown-font\"\n *ngIf=\"packageToggles[packageIndex]\"\n [@listAnimationStart]\n >\n <div *ngFor=\"let product of package.products\">\n <app-package-dropdown-item\n [title]=\"product.name\"\n [subtitle]=\"product.tagline\"\n [titleBadge]=\"product.editionName\"\n [iconUrl]=\"product.icon\"\n [statusItem]=\"product.activationStatus\"\n [indent]=\"packageProductIndent\"\n ></app-package-dropdown-item>\n\n <app-package-dropdown-item\n *ngFor=\"let addon of product.addons\"\n [title]=\"addon.name\"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"packageAddonWithProductIndent\"\n ></app-package-dropdown-item>\n </div>\n\n <app-package-dropdown-item\n *ngFor=\"let addon of package.addonsWithNoParent\"\n [title]=\"addon.name\"\n [titleDescriptor]=\"\n 'FRONTEND.STORE.REQUIRES_DESCRIPTOR'\n | translate: { requirementName: addon.parentName }\n \"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [secondaryIconUrl]=\"addon.parentIcon\"\n [secondaryIconName]=\"addon.parentName\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"packageAddonWithoutProductIndent\"\n ></app-package-dropdown-item>\n </mat-list>\n </div>\n\n <div\n class=\"product-list\"\n *ngFor=\"let product of data.products; let productIndex = index\"\n >\n <app-package-dropdown-item\n [title]=\"product.name\"\n [titleBadge]=\"product.editionName\"\n [titleDescriptor]=\"standAloneProductWithParentDescription(product)\"\n [iconUrl]=\"product.icon\"\n [subtitle]=\"hidePricing ? '' : product.formattedPrices\"\n [secondaryIconUrl]=\"product.parentInfo?.parentIconUrl\"\n [secondaryIconName]=\"product.parentInfo?.parentName\"\n [statusItem]=\"product.activationStatus\"\n [description]=\"standAloneProductDescription(product)\"\n [enableDropdown]=\"product.addons?.length > 0\"\n [toggleValue]=\"productToggles[productIndex]\"\n (itemToggled)=\"toggleProduct(productIndex)\"\n ></app-package-dropdown-item>\n\n <mat-list\n class=\"product-or-addon-list product-dropdown-font\"\n *ngIf=\"productToggles[productIndex]\"\n [@listAnimationStart]\n >\n <app-package-dropdown-item\n *ngFor=\"let addon of product.addons\"\n [title]=\"addon.name\"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"productAddonIndent\"\n ></app-package-dropdown-item>\n </mat-list>\n </div>\n </mat-list>\n </mat-card>\n</ng-container>\n\n<ng-template #loading>\n <mat-card>\n <div class=\"package-dropdown-stencil-display\">\n <va-icon [iconUrl]=\"\"></va-icon>\n <div class=\"stencil-text\">\n <h1 class=\"stencil-title stencil-shimmer\"></h1>\n <span class=\"stencil-tagline stencil-shimmer\"></span>\n </div>\n </div>\n </mat-card>\n</ng-template>\n", styles: [".package-dropdown-font,.product-dropdown-font{color:rgba(0,0,0,.54);font-size:14px;font-weight:400}.package-list-container{border-top:1px solid rgba(0,0,0,.12);padding:0}.package-list-container mat-list{padding:0}.package-dropdown-stencil-display{display:flex;width:100%;flex-grow:1}.package-dropdown-stencil-display va-icon{margin-right:20px}.package-dropdown-stencil-display .stencil-text{width:inherit;display:flex;flex-direction:column;justify-content:center}.package-dropdown-stencil-display .stencil-text .stencil-title{height:32px;width:40%;margin-bottom:5px!important;margin-top:0!important}.package-dropdown-stencil-display .stencil-text .stencil-tagline{height:32px;width:inherit}.product-or-addon-list{background-color:rgba(0,0,0,.04);overflow:hidden}\n"], components: [{ type: i1.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i2.MatList, selector: "mat-list, mat-action-list", inputs: ["disableRipple", "disabled"], exportAs: ["matList"] }, { type: i3.VaPackageDropdownItemComponent, selector: "app-package-dropdown-item", inputs: ["title", "titleBadge", "titleDescriptor", "iconUrl", "secondaryIconUrl", "secondaryIconName", "subtitle", "statusItem", "enableDropdown", "indent", "toggleValue", "description"], outputs: ["itemToggled"] }, { type: i4.IconComponent, selector: "va-icon", inputs: ["iconUrl", "name", "diameter", "backgroundColor", "borderColor", "fontColor"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i5.AsyncPipe, "translate": i6.TranslatePipe }, animations: [ trigger('listAnimationStart', [ state('void', style({ height: '0px' })), state('*', style({ height: '*' })), transition('void => *', [animate('0.25s ease')]), transition('* => void', [animate('0.25s ease')]), ]), ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaPackageDropdownComponent, decorators: [{ type: Component, args: [{ selector: 'app-package-dropdown', animations: [ trigger('listAnimationStart', [ state('void', style({ height: '0px' })), state('*', style({ height: '*' })), transition('void => *', [animate('0.25s ease')]), transition('* => void', [animate('0.25s ease')]), ]), ], template: "<ng-container *ngIf=\"templateData$ | async as data\">\n <mat-card\n class=\"package-list-container\"\n *ngIf=\"data.products?.length > 0 || data.packages?.length > 0; else loading\"\n >\n <mat-list>\n <div\n class=\"package-list\"\n *ngFor=\"let package of data.packages; let packageIndex = index\"\n >\n <app-package-dropdown-item\n [title]=\"package.name\"\n [iconUrl]=\"package.icon\"\n [subtitle]=\"hidePricing ? '' : package.formattedPrices\"\n [statusItem]=\"package.activationStatus\"\n [description]=\"packageDescription(package)\"\n [enableDropdown]=\"\n package.products?.length > 0 ||\n package.addonsWithNoParent?.length > 0\n \"\n [toggleValue]=\"packageToggles[packageIndex]\"\n (itemToggled)=\"togglePackage(packageIndex)\"\n ></app-package-dropdown-item>\n\n <mat-list\n class=\"product-or-addon-list package-dropdown-font\"\n *ngIf=\"packageToggles[packageIndex]\"\n [@listAnimationStart]\n >\n <div *ngFor=\"let product of package.products\">\n <app-package-dropdown-item\n [title]=\"product.name\"\n [subtitle]=\"product.tagline\"\n [titleBadge]=\"product.editionName\"\n [iconUrl]=\"product.icon\"\n [statusItem]=\"product.activationStatus\"\n [indent]=\"packageProductIndent\"\n ></app-package-dropdown-item>\n\n <app-package-dropdown-item\n *ngFor=\"let addon of product.addons\"\n [title]=\"addon.name\"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"packageAddonWithProductIndent\"\n ></app-package-dropdown-item>\n </div>\n\n <app-package-dropdown-item\n *ngFor=\"let addon of package.addonsWithNoParent\"\n [title]=\"addon.name\"\n [titleDescriptor]=\"\n 'FRONTEND.STORE.REQUIRES_DESCRIPTOR'\n | translate: { requirementName: addon.parentName }\n \"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [secondaryIconUrl]=\"addon.parentIcon\"\n [secondaryIconName]=\"addon.parentName\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"packageAddonWithoutProductIndent\"\n ></app-package-dropdown-item>\n </mat-list>\n </div>\n\n <div\n class=\"product-list\"\n *ngFor=\"let product of data.products; let productIndex = index\"\n >\n <app-package-dropdown-item\n [title]=\"product.name\"\n [titleBadge]=\"product.editionName\"\n [titleDescriptor]=\"standAloneProductWithParentDescription(product)\"\n [iconUrl]=\"product.icon\"\n [subtitle]=\"hidePricing ? '' : product.formattedPrices\"\n [secondaryIconUrl]=\"product.parentInfo?.parentIconUrl\"\n [secondaryIconName]=\"product.parentInfo?.parentName\"\n [statusItem]=\"product.activationStatus\"\n [description]=\"standAloneProductDescription(product)\"\n [enableDropdown]=\"product.addons?.length > 0\"\n [toggleValue]=\"productToggles[productIndex]\"\n (itemToggled)=\"toggleProduct(productIndex)\"\n ></app-package-dropdown-item>\n\n <mat-list\n class=\"product-or-addon-list product-dropdown-font\"\n *ngIf=\"productToggles[productIndex]\"\n [@listAnimationStart]\n >\n <app-package-dropdown-item\n *ngFor=\"let addon of product.addons\"\n [title]=\"addon.name\"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"productAddonIndent\"\n ></app-package-dropdown-item>\n </mat-list>\n </div>\n </mat-list>\n </mat-card>\n</ng-container>\n\n<ng-template #loading>\n <mat-card>\n <div class=\"package-dropdown-stencil-display\">\n <va-icon [iconUrl]=\"\"></va-icon>\n <div class=\"stencil-text\">\n <h1 class=\"stencil-title stencil-shimmer\"></h1>\n <span class=\"stencil-tagline stencil-shimmer\"></span>\n </div>\n </div>\n </mat-card>\n</ng-template>\n", styles: [".package-dropdown-font,.product-dropdown-font{color:rgba(0,0,0,.54);font-size:14px;font-weight:400}.package-list-container{border-top:1px solid rgba(0,0,0,.12);padding:0}.package-list-container mat-list{padding:0}.package-dropdown-stencil-display{display:flex;width:100%;flex-grow:1}.package-dropdown-stencil-display va-icon{margin-right:20px}.package-dropdown-stencil-display .stencil-text{width:inherit;display:flex;flex-direction:column;justify-content:center}.package-dropdown-stencil-display .stencil-text .stencil-title{height:32px;width:40%;margin-bottom:5px!important;margin-top:0!important}.package-dropdown-stencil-display .stencil-text .stencil-tagline{height:32px;width:inherit}.product-or-addon-list{background-color:rgba(0,0,0,.04);overflow:hidden}\n"] }] }], propDecorators: { packages: [{ type: Input }], products: [{ type: Input }], standAloneProducts: [{ type: Input }], statuses: [{ type: Input }], addons: [{ type: Input }], singularDropdown: [{ type: Input }], hidePricing: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS1kcm9wZG93bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3N0b3JlL3NyYy9saWIvcGFja2FnZS1kcm9wZG93bi9wYWNrYWdlLWRyb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9wYWNrYWdlLWRyb3Bkb3duL3BhY2thZ2UtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRixPQUFPLEVBQWMsZUFBZSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc3RCxPQUFPLEVBR0wsa0JBQWtCLEVBQ2xCLDRCQUE0QixFQUM1QiwwQkFBMEIsRUFDMUIseUJBQXlCLEdBRTFCLE1BQU0saUJBQWlCLENBQUM7QUFHekIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlEQUF5RCxDQUFDOzs7Ozs7OztBQW9CckYsTUFBTSxPQUFPLDBCQUEwQjtJQWJ2QztRQTRDRSwrREFBK0Q7UUFDdEQscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRWxDLGdCQUFnQjtRQUNQLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRTdCLHlCQUFvQixHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDN0MscUNBQWdDLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUN6RCxrQ0FBNkIsR0FBRyxVQUFVLENB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b3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0cmlnZ2VyLCB0cmFuc2l0aW9uLCBhbmltYXRlLCBzdHlsZSwgc3RhdGUgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgUmVwbGF5U3ViamVjdCwgY29tYmluZUxhdGVzdCwgemlwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc3RhcnRXaXRoLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEFkZG9uIH0gZnJvbSAnQHZlbmRhc3RhL21hcmtldHBsYWNlLXBhY2thZ2VzJztcbmltcG9ydCB7XG4gIFNhbGVzUGFja2FnZSxcbiAgU2FsZXNQcm9kdWN0LFxuICBidWlsZFNhbGVzUGFja2FnZXMsXG4gIGJ1aWxkU2FsZXNQcm9kdWN0RnJvbVByb2R1Y3QsXG4gIGFkZFN0YXR1c2VzVG9TYWxlc1BhY2thZ2VzLFxuICBhZGRTdGF0dXNlc1RvU2FsZXNQcm9kdWN0LFxuICBQYWNrYWdlSXRlbUFjdGl2YXRpb25TdGF0dXMsXG59IGZyb20gJy4vc2FsZXMtcGFja2FnZSc7XG5pbXBvcnQgeyBQcm9kdWN0LCBQcm9kdWN0V2l0aFBhcmVudCB9IGZyb20gJy4uL3NoYXJlZC9wcm9kdWN0JztcbmltcG9ydCB7IFBhY2thZ2UgfSBmcm9tICcuLi9wYWNrYWdlLWRldGFpbHMvcGFja2FnZSc7XG5pbXBvcnQgeyBMaXN0SW5kZW50IH0gZnJvbSAnLi9wYWNrYWdlLWRyb3Bkb3duLWl0ZW0vcGFja2FnZS1kcm9wZG93bi1pdGVtLmNvbXBvbmVudCc7XG5cbmludGVyZmFjZSBPcmRlckxlbmd0aHNGb3JUb2dnbGluZyB7XG4gIHBhY2thZ2VzOiBudW1iZXI7XG4gIHByb2R1Y3RzOiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wYWNrYWdlLWRyb3Bkb3duJyxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2xpc3RBbmltYXRpb25TdGFydCcsIFtcbiAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoeyBoZWlnaHQ6ICcwcHgnIH0pKSxcbiAgICAgIHN0YXRlKCcqJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IConLCBbYW5pbWF0ZSgnMC4yNXMgZWFzZScpXSksXG4gICAgICB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBbYW5pbWF0ZSgnMC4yNXMgZWFzZScpXSksXG4gICAgXSksXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAncGFja2FnZS1kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BhY2thZ2UtZHJvcGRvd24uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVmFQYWNrYWdlRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyBwYWNrYWdlcyBpbiBkcm9wZG93blxuICBASW5wdXQoKVxuICBzZXQgcGFja2FnZXMocGFja2FnZXM6IFBhY2thZ2VbXSkge1xuICAgIHRoaXMucGFja2FnZXMkJC5uZXh0KHBhY2thZ2VzKTtcbiAgfVxuXG4gIC8vIHByb2R1Y3RzIHdpdGhpbiBnaXZlbiBwYWNrYWdlc1xuICBASW5wdXQoKVxuICBzZXQgcHJvZHVjdHMocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xuICAgIHRoaXMucHJvZHVjdHMkJC5uZXh0KHByb2R1Y3RzKTtcbiAgfVxuXG4gIC8vIHByb2R1Y3RzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwYWNrYWdlXG4gIEBJbnB1dCgpXG4gIHNldCBzdGFuZEFsb25lUHJvZHVjdHMoc3RhbmRBbG9uZVByb2R1Y3RzOiBQcm9kdWN0W10pIHtcbiAgICB0aGlzLnN0YW5kQWxvbmVQcm9kdWN0cyQkLm5leHQoc3RhbmRBbG9uZVByb2R1Y3RzKTtcbiAgfVxuXG4gIC8vIHN0YXR1c2VzIGZvciBhbGwgcHJvZHVjdHMgYW5kIGFkZG9uc1xuICBASW5wdXQoKVxuICBzZXQgc3RhdHVzZXMoc3RhdHVzZXM6IFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdKSB7XG4gICAgdGhpcy5zdGF0dXNlcyQkLm5leHQoc3RhdHVzZXMpO1xuICB9XG5cbiAgLy8gYWRkb25zIHdpdGhpbiBnaXZlbiBwYWNrYWdlc1xuICBASW5wdXQoKVxuICBzZXQgYWRkb25zKGFkZG9uczogQWRkb25bXSkge1xuICAgIHRoaXMuYWRkb25zJCQubmV4dChhZGRvbnMpO1xuICB9XG5cbiAgLy8gY29udHJvbHMgd2hldGhlciBvbmx5IG9uZSBkcm9wZG93biBjYW4gYmUgZXhwYW5kZWQgYXQgYSB0aW1lXG4gIEBJbnB1dCgpIHNpbmd1bGFyRHJvcGRvd24gPSBmYWxzZTtcblxuICAvLyBoaWRlcyBwcmljaW5nXG4gIEBJbnB1dCgpIGhpZGVQcmljaW5nID0gZmFsc2U7XG5cbiAgcGFja2FnZVByb2R1Y3RJbmRlbnQgPSBMaXN0SW5kZW50LklOREVOVF9PTkU7XG4gIHBhY2thZ2VBZGRvbldpdGhvdXRQcm9kdWN0SW5kZW50ID0gTGlzdEluZGVudC5JTkRFTlRfT05FO1xuICBwYWNrYWdlQWRkb25XaXRoUHJvZHVjdEluZGVudCA9IExpc3RJbmRlbnQuSU5ERU5UX1RXTztcbiAgcHJvZHVjdEFkZG9uSW5kZW50ID0gTGlzdEluZGVudC5JTkRFTlRfT05FO1xuXG4gIHBhY2thZ2VzJCQ6IFJlcGxheVN1YmplY3Q8UGFja2FnZVtdPiA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICBwcm9kdWN0cyQkOiBSZXBsYXlTdWJqZWN0PFByb2R1Y3RbXT4gPSBuZXcgUmVwbGF5U3ViamVjdCgxKTtcbiAgc3RhbmRBbG9uZVByb2R1Y3RzJCQ6IFJlcGxheVN1YmplY3Q8KFByb2R1Y3QgfCBQcm9kdWN0V2l0aFBhcmVudClbXT4gPSBuZXcgUmVwbGF5U3ViamVjdCgxKTtcbiAgc3RhdHVzZXMkJDogQmVoYXZpb3JTdWJqZWN0PFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xuICBhZGRvbnMkJDogUmVwbGF5U3ViamVjdDxBZGRvbltdPiA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuXG4gIG9yZGVySXRlbUxlbmd0aHMkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8T3JkZXJMZW5ndGhzRm9yVG9nZ2xpbmc+KDxPcmRlckxlbmd0aHNGb3JUb2dnbGluZz57XG4gICAgcGFja2FnZXM6IDAsXG4gICAgcHJvZHVjdHM6IDAsXG4gIH0pO1xuXG4gIHRlbXBsYXRlRGF0YSQ6IE9ic2VydmFibGU8eyBwYWNrYWdlczogU2FsZXNQYWNrYWdlW107IHByb2R1Y3RzOiBTYWxlc1Byb2R1Y3RbXSB9PjtcbiAgc2FsZXNQYWNrYWdlcyQ6IE9ic2VydmFibGU8U2FsZXNQYWNrYWdlW10+O1xuICBzYWxlc1Byb2R1Y3RzJDogT2JzZXJ2YWJsZTxTYWxlc1Byb2R1Y3RbXT47XG4gIHBhY2thZ2VUb2dnbGVzOiBib29sZWFuW10gPSBbXTtcbiAgcHJvZHVjdFRvZ2dsZXM6IGJvb2xlYW5bXSA9IFtdO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHBhY2thZ2VzJDogT2JzZXJ2YWJsZTxQYWNrYWdlW10+ID0gdGhpcy5wYWNrYWdlcyQkLnBpcGUoZmlsdGVyKChwYWNrYWdlcykgPT4gcGFja2FnZXMgIT09IG51bGwpKTtcbiAgICBjb25zdCBwcm9kdWN0cyQ6IE9ic2VydmFibGU8UHJvZHVjdFtdPiA9IHRoaXMucHJvZHVjdHMkJC5waXBlKGZpbHRlcigocHJvZHVjdHMpID0+IHByb2R1Y3RzICE9PSBudWxsKSk7XG4gICAgY29uc3QgYWRkb25zJDogT2JzZXJ2YWJsZTxBZGRvbltdPiA9IHRoaXMuYWRkb25zJCQucGlwZShmaWx0ZXIoKGFkZG9ucykgPT4gYWRkb25zICE9PSBudWxsKSk7XG5cbiAgICBjb25zdCBzYWxlc1BhY2thZ2UkID0gemlwKHBhY2thZ2VzJCwgcHJvZHVjdHMkLCBhZGRvbnMkKS5waXBlKFxuICAgICAgdGFwKChbcGFja2FnZXMsIHByb2R1Y3RzLCBfXSkgPT4ge1xuICAgICAgICB0aGlzLm9yZGVySXRlbUxlbmd0aHMkJC5uZXh0KDxPcmRlckxlbmd0aHNGb3JUb2dnbGluZz57XG4gICAgICAgICAgcGFja2FnZXM6IHBhY2thZ2VzLmxlbmd0aCxcbiAgICAgICAgICBwcm9kdWN0czogcHJvZHVjdHMubGVuZ3RoLFxuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgbWFwKChbcGFja2FnZXMsIHByb2R1Y3RzLCBhZGRvbnNdKSA9PiBidWlsZFNhbGVzUGFja2FnZXMocGFja2FnZXMsIHByb2R1Y3RzLCBhZGRvbnMpKSxcbiAgICApO1xuXG4gICAgdGhpcy5zYWxlc1BhY2thZ2VzJCA9IGNvbWJpbmVMYXRlc3QoW3NhbGVzUGFja2FnZSQsIHRoaXMuc3RhdHVzZXMkJF0pLnBpcGUoXG4gICAgICBtYXAoKFtzYWxlc1BhY2thZ2VzLCBzdGF0dXNlc10pID0+IGFkZFN0YXR1c2VzVG9TYWxlc1BhY2thZ2VzKHNhbGVzUGFja2FnZXMsIHN0YXR1c2VzKSksXG4gICAgICBzdGFydFdpdGgoW10pLFxuICAgICk7XG5cbiAgICB0aGlzLnNhbGVzUHJvZHVjdHMkID0gY29tYmluZUxhdGVzdChbdGhpcy5zdGFuZEFsb25lUHJvZHVjdHMkJCwgdGhpcy5zdGF0dXNlcyQkXSkucGlwZShcbiAgICAgIGZpbHRlcigoW3Byb2R1Y3RzLCBfXSkgPT4gcHJvZHVjdHMgIT09IG51bGwpLFxuICAgICAgbWFwKChbcHJvZHVjdHMsIHN0YXR1c2VzXTogWyhQcm9kdWN0IHwgUHJvZHVjdFdpdGhQYXJlbnQpW10sIFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdXSk6IFNhbGVzUHJvZHVjdFtdID0+IHtcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RzLm1hcCgocCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFkZG9ucyA9IHAuYWRkb25zIHx8IG51bGw7XG4gICAgICAgICAgY29uc3Qgc2FsZXNQcm9kdWN0cyA9IGJ1aWxkU2FsZXNQcm9kdWN0RnJvbVByb2R1Y3QocCwgYWRkb25zKTtcbiAgICAgICAgICByZXR1cm4gYWRkU3RhdHVzZXNUb1NhbGVzUHJvZHVjdChzYWxlc1Byb2R1Y3RzLCBzdGF0dXNlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBzdGFydFdpdGgoW10pLFxuICAgICk7XG4gICAgdGhpcy50ZW1wbGF0ZURhdGEkID0gY29tYmluZUxhdGVzdChbdGhpcy5zYWxlc1BhY2thZ2VzJCwgdGhpcy5zYWxlc1Byb2R1Y3RzJF0pLnBpcGUoXG4gICAgICBtYXAoKFtwYWNrYWdlcywgcHJvZHVjdHNdKSA9PiAoeyBwYWNrYWdlczogcGFja2FnZXMsIHByb2R1Y3RzOiBwcm9kdWN0cyB9KSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuQWxsRHJvcGRvd25zKCk6IHZvaWQge1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5vcmRlckl0ZW1MZW5ndGhzJCQuZ2V0VmFsdWUoKS5wYWNrYWdlczsgeCsrKSB7XG4gICAgICB0aGlzLnBhY2thZ2VUb2dnbGVzW3hdID0gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLm9yZGVySXRlbUxlbmd0aHMkJC5nZXRWYWx1ZSgpLnByb2R1Y3RzOyB4KyspIHtcbiAgICAgIHRoaXMucHJvZHVjdFRvZ2dsZXNbeF0gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVQYWNrYWdlKGluZGV4VG9Ub2dnbGU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnNpbmd1bGFyRHJvcGRvd24pIHtcbiAgICAgIGNvbnN0IG9wZW5lZEluZGV4ID0gdGhpcy5wYWNrYWdlVG9nZ2xlcy5maW5kSW5kZXgoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gdHJ1ZSk7XG4gICAgICBpZiAob3BlbmVkSW5kZXggIT09IGluZGV4VG9Ub2dnbGUpIHtcbiAgICAgICAgdGhpcy5wYWNrYWdlVG9nZ2xlc1tvcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb2R1Y3RPcGVuZWRJbmRleCA9IHRoaXMucHJvZHVjdFRvZ2dsZXMuZmluZEluZGV4KCh2YWx1ZSkgPT4gdmFsdWUgPT09IHRydWUpO1xuICAgICAgaWYgKHByb2R1Y3RPcGVuZWRJbmRleCA+IC0xKSB7XG4gICAgICAgIHRoaXMucHJvZHVjdFRvZ2dsZXNbcHJvZHVjdE9wZW5lZEluZGV4XSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnBhY2thZ2VUb2dnbGVzW2luZGV4VG9Ub2dnbGVdID0gIXRoaXMucGFja2FnZVRvZ2dsZXNbaW5kZXhUb1RvZ2dsZV07XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlUHJvZHVjdChpbmRleFRvVG9nZ2xlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaW5ndWxhckRyb3Bkb3duKSB7XG4gICAgICBjb25zdCBvcGVuZWRJbmRleCA9IHRoaXMucHJvZHVjdFRvZ2dsZXMuZmluZEluZGV4KCh2YWx1ZSkgPT4gdmFsdWUgPT09IHRydWUpO1xuICAgICAgaWYgKG9wZW5lZEluZGV4ICE9PSBpbmRleFRvVG9nZ2xlKSB7XG4gICAgICAgIHRoaXMucHJvZHVjdFRvZ2dsZXNbb3BlbmVkSW5kZXhdID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBwYWNrYWdlT3BlbmVkSW5kZXggPSB0aGlzLnBhY2thZ2VUb2dnbGVzLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlID09PSB0cnVlKTtcbiAgICAgIGlmIChwYWNrYWdlT3BlbmVkSW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLnBhY2thZ2VUb2dnbGVzW3BhY2thZ2VPcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wcm9kdWN0VG9nZ2xlc1tpbmRleFRvVG9nZ2xlXSA9ICF0aGlzLnByb2R1Y3RUb2dnbGVzW2luZGV4VG9Ub2dnbGVdO1xuICB9XG5cbiAgcHVibGljIHN0YW5kQWxvbmVQcm9kdWN0RGVzY3JpcHRpb24ocHJvZHVjdDogU2FsZXNQcm9kdWN0KTogc3RyaW5nIHtcbiAgICBpZiAocHJvZHVjdC5hZGRvbnMgJiYgcHJvZHVjdC5hZGRvbnMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGRlc2NyaXB0aW9uID0gYENvbnRhaW5zICR7cHJvZHVjdC5hZGRvbnMubGVuZ3RofWA7XG4gICAgICBkZXNjcmlwdGlvbiA9IHByb2R1Y3QuYWRkb25zLmxlbmd0aCA9PT0gMSA/IGAke2Rlc2NyaXB0aW9ufSBBZGRvbmAgOiBgJHtkZXNjcmlwdGlvbn0gQWRkb25zYDtcbiAgICAgIHJldHVybiBkZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHVibGljIHN0YW5kQWxvbmVQcm9kdWN0V2l0aFBhcmVudERlc2NyaXB0aW9uKHByb2R1Y3Q6IFNhbGVzUHJvZHVjdCk6IHN0cmluZyB7XG4gICAgaWYgKCFwcm9kdWN0LnBhcmVudEluZm8pIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gYChSZXF1aXJlcyAke3Byb2R1Y3QucGFyZW50SW5mby5wYXJlbnROYW1lfSlgO1xuICB9XG5cbiAgcHVibGljIHBhY2thZ2VEZXNjcmlwdGlvbihwa2c6IFNhbGVzUGFja2FnZSk6IHN0cmluZyB7XG4gICAgY29uc3QgaGFzUHJvZHVjdHMgPSBwa2cucHJvZHVjdHMgJiYgcGtnLnByb2R1Y3RzLmxlbmd0aCA+IDA7XG4gICAgaWYgKCFoYXNQcm9kdWN0cyAmJiBwa2cudG90YWxBZGRvbnMgPT09IDApIHtcbiAgICAgIHJldHVybiAnTm8gSXRlbXMgaW4gUGFja2FnZSc7XG4gICAgfVxuXG4gICAgbGV0IGRlc2NyaXB0aW9uID0gJyc7XG4gICAgY29uc3QgaGFzT25lUHJvZHVjdCA9IHBrZy5wcm9kdWN0cyAmJiBwa2cucHJvZHVjdHMubGVuZ3RoID09PSAxO1xuICAgIGlmIChoYXNQcm9kdWN0cyB8fCBwa2cudG90YWxBZGRvbnMgPiAwKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9ICdDb250YWlucyAnO1xuICAgIH1cbiAgICBpZiAoaGFzUHJvZHVjdHMpIHtcbiAgICAgIGRlc2NyaXB0aW9uID0gYCR7ZGVzY3JpcHRpb259ICR7cGtnLnByb2R1Y3RzLmxlbmd0aH1gO1xuICAgICAgZGVzY3JpcHRpb24gPSBoYXNPbmVQcm9kdWN0ID8gYCR7ZGVzY3JpcHRpb259IFByb2R1Y3RgIDogYCR7ZGVzY3JpcHRpb259IFByb2R1Y3RzYDtcbiAgICB9XG4gICAgaWYgKGhhc1Byb2R1Y3RzICYmIHBrZy50b3RhbEFkZG9ucyA+IDApIHtcbiAgICAgIGRlc2NyaXB0aW9uID0gYCR7ZGVzY3JpcHRpb259ICYgJHtwa2cudG90YWxBZGRvbnN9YDtcbiAgICAgIGRlc2NyaXB0aW9uID0gcGtnLnRvdGFsQWRkb25zID09PSAxID8gYCR7ZGVzY3JpcHRpb259IEFkZG9uYCA6IGAke2Rlc2NyaXB0aW9ufSBBZGRvbnNgO1xuICAgIH1cbiAgICByZXR1cm4gZGVzY3JpcHRpb247XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJ0ZW1wbGF0ZURhdGEkIHwgYXN5bmMgYXMgZGF0YVwiPlxuICA8bWF0LWNhcmRcbiAgICBjbGFzcz1cInBhY2thZ2UtbGlzdC1jb250YWluZXJcIlxuICAgICpuZ0lmPVwiZGF0YS5wcm9kdWN0cz8ubGVuZ3RoID4gMCB8fCBkYXRhLnBhY2thZ2VzPy5sZW5ndGggPiAwOyBlbHNlIGxvYWRpbmdcIlxuICA+XG4gICAgPG1hdC1saXN0PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInBhY2thZ2UtbGlzdFwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBwYWNrYWdlIG9mIGRhdGEucGFja2FnZXM7IGxldCBwYWNrYWdlSW5kZXggPSBpbmRleFwiXG4gICAgICA+XG4gICAgICAgIDxhcHAtcGFja2FnZS1kcm9wZG93bi1pdGVtXG4gICAgICAgICAgW3RpdGxlXT1cInBhY2thZ2UubmFtZVwiXG4gICAgICAgICAgW2ljb25VcmxdPVwicGFja2FnZS5pY29uXCJcbiAgICAgICAgICBbc3VidGl0bGVdPVwiaGlkZVByaWNpbmcgPyAnJyA6IHBhY2thZ2UuZm9ybWF0dGVkUHJpY2VzXCJcbiAgICAgICAgICBbc3RhdHVzSXRlbV09XCJwYWNrYWdlLmFjdGl2YXRpb25TdGF0dXNcIlxuICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJwYWNrYWdlRGVzY3JpcHRpb24ocGFja2FnZSlcIlxuICAgICAgICAgIFtlbmFibGVEcm9wZG93bl09XCJcbiAgICAgICAgICAgIHBhY2thZ2UucHJvZHVjdHM/Lmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgIHBhY2thZ2UuYWRkb25zV2l0aE5vUGFyZW50Py5sZW5ndGggPiAwXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbdG9nZ2xlVmFsdWVdPVwicGFja2FnZVRvZ2dsZXNbcGFja2FnZUluZGV4XVwiXG4gICAgICAgICAgKGl0ZW1Ub2dnbGVkKT1cInRvZ2dsZVBhY2thZ2UocGFja2FnZUluZGV4KVwiXG4gICAgICAgID48L2FwcC1wYWNrYWdlLWRyb3Bkb3duLWl0ZW0+XG5cbiAgICAgICAgPG1hdC1saXN0XG4gICAgICAgICAgY2xhc3M9XCJwcm9kdWN0LW9yLWFkZG9uLWxpc3QgcGFja2FnZS1kcm9wZG93bi1mb250XCJcbiAgICAgICAgICAqbmdJZj1cInBhY2thZ2VUb2dnbGVzW3BhY2thZ2VJbmRleF1cIlxuICAgICAgICAgIFtAbGlzdEFuaW1hdGlvblN0YXJ0XVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBwYWNrYWdlLnByb2R1Y3RzXCI+XG4gICAgICAgICAgICA8YXBwLXBhY2thZ2UtZHJvcGRvd24taXRlbVxuICAgICAgICAgICAgICBbdGl0bGVdPVwicHJvZHVjdC5uYW1lXCJcbiAgICAgICAgICAgICAgW3N1YnRpdGxlXT1cInByb2R1Y3QudGFnbGluZVwiXG4gICAgICAgICAgICAgIFt0aXRsZUJhZGdlXT1cInByb2R1Y3QuZWRpdGlvbk5hbWVcIlxuICAgICAgICAgICAgICBbaWNvblVybF09XCJwcm9kdWN0Lmljb25cIlxuICAgICAgICAgICAgICBbc3RhdHVzSXRlbV09XCJwcm9kdWN0LmFjdGl2YXRpb25TdGF0dXNcIlxuICAgICAgICAgICAgICBbaW5kZW50XT1cInBhY2thZ2VQcm9kdWN0SW5kZW50XCJcbiAgICAgICAgICAgID48L2FwcC1wYWNrYWdlLWRyb3Bkb3duLWl0ZW0+XG5cbiAgICAgICAgICAgIDxhcHAtcGFja2FnZS1kcm9wZG93bi1pdGVtXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhZGRvbiBvZiBwcm9kdWN0LmFkZG9uc1wiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJhZGRvbi5uYW1lXCJcbiAgICAgICAgICAgICAgW3N1YnRpdGxlXT1cImFkZG9uLnRhZ2xpbmVcIlxuICAgICAgICAgICAgICBbaWNvblVybF09XCJhZGRvbi5pY29uXCJcbiAgICAgICAgICAgICAgW3N0YXR1c0l0ZW1dPVwiYWRkb24uYWN0aXZhdGlvblN0YXR1c1wiXG4gICAgICAgICAgICAgIFtpbmRlbnRdPVwicGFja2FnZUFkZG9uV2l0aFByb2R1Y3RJbmRlbnRcIlxuICAgICAgICAgICAgPjwvYXBwLXBhY2thZ2UtZHJvcGRvd24taXRlbT5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxhcHAtcGFja2FnZS1kcm9wZG93bi1pdGVtXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWRkb24gb2YgcGFja2FnZS5hZGRvbnNXaXRoTm9QYXJlbnRcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImFkZG9uLm5hbWVcIlxuICAgICAgICAgICAgW3RpdGxlRGVzY3JpcHRvcl09XCJcbiAgICAgICAgICAgICAgJ0ZST05URU5ELlNUT1JFLlJFUVVJUkVTX0RFU0NSSVBUT1InXG4gICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgcmVxdWlyZW1lbnROYW1lOiBhZGRvbi5wYXJlbnROYW1lIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbc3VidGl0bGVdPVwiYWRkb24udGFnbGluZVwiXG4gICAgICAgICAgICBbaWNvblVybF09XCJhZGRvbi5pY29uXCJcbiAgICAgICAgICAgIFtzZWNvbmRhcnlJY29uVXJsXT1cImFkZG9uLnBhcmVudEljb25cIlxuICAgICAgICAgICAgW3NlY29uZGFyeUljb25OYW1lXT1cImFkZG9uLnBhcmVudE5hbWVcIlxuICAgICAgICAgICAgW3N0YXR1c0l0ZW1dPVwiYWRkb24uYWN0aXZhdGlvblN0YXR1c1wiXG4gICAgICAgICAgICBbaW5kZW50XT1cInBhY2thZ2VBZGRvbldpdGhvdXRQcm9kdWN0SW5kZW50XCJcbiAgICAgICAgICA+PC9hcHAtcGFja2FnZS1kcm9wZG93bi1pdGVtPlxuICAgICAgICA8L21hdC1saXN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwcm9kdWN0LWxpc3RcIlxuICAgICAgICAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBkYXRhLnByb2R1Y3RzOyBsZXQgcHJvZHVjdEluZGV4ID0gaW5kZXhcIlxuICAgICAgPlxuICAgICAgICA8YXBwLXBhY2thZ2UtZHJvcGRvd24taXRlbVxuICAgICAgICAgIFt0aXRsZV09XCJwcm9kdWN0Lm5hbWVcIlxuICAgICAgICAgIFt0aXRsZUJhZGdlXT1cInByb2R1Y3QuZWRpdGlvbk5hbWVcIlxuICAgICAgICAgIFt0aXRsZURlc2NyaXB0b3JdPVwic3RhbmRBbG9uZVByb2R1Y3RXaXRoUGFyZW50RGVzY3JpcHRpb24ocHJvZHVjdClcIlxuICAgICAgICAgIFtpY29uVXJsXT1cInByb2R1Y3QuaWNvblwiXG4gICAgICAgICAgW3N1YnRpdGxlXT1cImhpZGVQcmljaW5nID8gJycgOiBwcm9kdWN0LmZvcm1hdHRlZFByaWNlc1wiXG4gICAgICAgICAgW3NlY29uZGFyeUljb25VcmxdPVwicHJvZHVjdC5wYXJlbnRJbmZvPy5wYXJlbnRJY29uVXJsXCJcbiAgICAgICAgICBbc2Vjb25kYXJ5SWNvbk5hbWVdPVwicHJvZHVjdC5wYXJlbnRJbmZvPy5wYXJlbnROYW1lXCJcbiAgICAgICAgICBbc3RhdHVzSXRlbV09XCJwcm9kdWN0LmFjdGl2YXRpb25TdGF0dXNcIlxuICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJzdGFuZEFsb25lUHJvZHVjdERlc2NyaXB0aW9uKHByb2R1Y3QpXCJcbiAgICAgICAgICBbZW5hYmxlRHJvcGRvd25dPVwicHJvZHVjdC5hZGRvbnM/Lmxlbmd0aCA+IDBcIlxuICAgICAgICAgIFt0b2dnbGVWYWx1ZV09XCJwcm9kdWN0VG9nZ2xlc1twcm9kdWN0SW5kZXhdXCJcbiAgICAgICAgICAoaXRlbVRvZ2dsZWQpPVwidG9nZ2xlUHJvZHVjdChwcm9kdWN0SW5kZXgpXCJcbiAgICAgICAgPjwvYXBwLXBhY2thZ2UtZHJvcGRvd24taXRlbT5cblxuICAgICAgICA8bWF0LWxpc3RcbiAgICAgICAgICBjbGFzcz1cInByb2R1Y3Qtb3ItYWRkb24tbGlzdCBwcm9kdWN0LWRyb3Bkb3duLWZvbnRcIlxuICAgICAgICAgICpuZ0lmPVwicHJvZHVjdFRvZ2dsZXNbcHJvZHVjdEluZGV4XVwiXG4gICAgICAgICAgW0BsaXN0QW5pbWF0aW9uU3RhcnRdXG4gICAgICAgID5cbiAgICAgICAgICA8YXBwLXBhY2thZ2UtZHJvcGRvd24taXRlbVxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGFkZG9uIG9mIHByb2R1Y3QuYWRkb25zXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJhZGRvbi5uYW1lXCJcbiAgICAgICAgICAgIFtzdWJ0aXRsZV09XCJhZGRvbi50YWdsaW5lXCJcbiAgICAgICAgICAgIFtpY29uVXJsXT1cImFkZG9uLmljb25cIlxuICAgICAgICAgICAgW3N0YXR1c0l0ZW1dPVwiYWRkb24uYWN0aXZhdGlvblN0YXR1c1wiXG4gICAgICAgICAgICBbaW5kZW50XT1cInByb2R1Y3RBZGRvbkluZGVudFwiXG4gICAgICAgICAgPjwvYXBwLXBhY2thZ2UtZHJvcGRvd24taXRlbT5cbiAgICAgICAgPC9tYXQtbGlzdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWxpc3Q+XG4gIDwvbWF0LWNhcmQ+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICA8bWF0LWNhcmQ+XG4gICAgPGRpdiBjbGFzcz1cInBhY2thZ2UtZHJvcGRvd24tc3RlbmNpbC1kaXNwbGF5XCI+XG4gICAgICA8dmEtaWNvbiBbaWNvblVybF09XCJcIj48L3ZhLWljb24+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RlbmNpbC10ZXh0XCI+XG4gICAgICAgIDxoMSBjbGFzcz1cInN0ZW5jaWwtdGl0bGUgc3RlbmNpbC1zaGltbWVyXCI+PC9oMT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGVuY2lsLXRhZ2xpbmUgc3RlbmNpbC1zaGltbWVyXCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbWF0LWNhcmQ+XG48L25nLXRlbXBsYXRlPlxuIl19