@vendasta/store
Version:
Components and data for Store
176 lines • 29.4 kB
JavaScript
import { Component, Input } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { DurationPeriod, RevenuePeriod } from '@vendasta/sales-orders';
import { of } from 'rxjs';
import { getPeriodTranslationKey } from '../../shared/conversion-utils';
import { OrderSummaryService } from '../order-summary.service';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
import * as i2 from "@angular/common";
import * as i3 from "@vendasta/galaxy/pipes";
export class ContractEstimatedTotalComponent {
constructor(translateService) {
this.translateService = translateService;
}
set orderItems(orderItems) {
const summaryItems = OrderSummaryService.getPriceSummary(orderItems);
this.summaryItems = summaryItems.items;
this.includesUndefinedPricing = summaryItems.includesUndefinedPricing;
}
getDailyTotal(revenueComponent) {
const periodTotal = this.calculateTotalPrice(revenueComponent);
switch (revenueComponent.period) {
case RevenuePeriod.YEARLY:
return periodTotal / 365;
case RevenuePeriod.MONTHLY:
// Average number of days in a month
return periodTotal / 30.42;
case RevenuePeriod.BIWEEKLY:
return periodTotal / 14;
case RevenuePeriod.WEEKLY:
return periodTotal / 7;
case RevenuePeriod.DAILY:
return periodTotal;
default:
return periodTotal;
}
}
getWeeklyTotal(revenueComponent) {
const periodTotal = this.calculateTotalPrice(revenueComponent);
switch (revenueComponent.period) {
case RevenuePeriod.YEARLY:
return periodTotal / 52;
case RevenuePeriod.MONTHLY:
// Average number of weeks in a month
return periodTotal / 4.333;
case RevenuePeriod.BIWEEKLY:
return periodTotal / 2;
case RevenuePeriod.WEEKLY:
return periodTotal;
case RevenuePeriod.DAILY:
return periodTotal * 7;
default:
return periodTotal;
}
}
getMonthlyTotal(revenueComponent) {
const periodTotal = this.calculateTotalPrice(revenueComponent);
switch (revenueComponent.period) {
case RevenuePeriod.YEARLY:
return periodTotal / 12;
case RevenuePeriod.MONTHLY:
return periodTotal;
case RevenuePeriod.BIWEEKLY:
return periodTotal * 2;
case RevenuePeriod.WEEKLY:
return periodTotal * 4;
case RevenuePeriod.DAILY:
return periodTotal * 30;
default:
return periodTotal;
}
}
getYearlyTotal(revenueComponent) {
const periodTotal = this.calculateTotalPrice(revenueComponent);
switch (revenueComponent.period) {
case RevenuePeriod.YEARLY:
return periodTotal;
case RevenuePeriod.MONTHLY:
return periodTotal * 12;
case RevenuePeriod.BIWEEKLY:
return periodTotal * 26;
case RevenuePeriod.WEEKLY:
return periodTotal * 52;
case RevenuePeriod.DAILY:
return periodTotal * 365;
default:
return periodTotal;
}
}
getRevenuePeriod(period) {
return getPeriodTranslationKey(period);
}
getDurationDescription() {
if (!this.duration) {
return of('');
}
switch (this.duration.duration) {
case DurationPeriod.DAY:
return this.translateService.stream('FRONTEND.STORE.DURATION.DAY_CONTRACT', { value: this.duration.value });
case DurationPeriod.WEEK:
return this.translateService.stream('FRONTEND.STORE.DURATION.WEEK_CONTRACT', { value: this.duration.value });
case DurationPeriod.MONTH:
return this.translateService.stream('FRONTEND.STORE.DURATION.MONTH_CONTRACT', { value: this.duration.value });
case DurationPeriod.YEAR:
return this.translateService.stream('FRONTEND.STORE.DURATION.YEAR_CONTRACT', { value: this.duration.value });
default:
return of('');
}
}
calculatePriceForDuration() {
const results = [];
if (!this.duration) {
return results;
}
this.summaryItems.forEach((item) => {
let startingPrice = false;
const total = item.revenueComponents.reduce((all, revenueComponent) => {
if (revenueComponent.isStartingRevenue) {
startingPrice = true;
}
if (revenueComponent.period === RevenuePeriod.ONETIME) {
return all + this.calculateTotalPrice(revenueComponent);
}
if (this.duration.duration === DurationPeriod.DAY) {
return all + this.getDailyTotal(revenueComponent) * this.duration.value;
}
if (this.duration.duration === DurationPeriod.WEEK) {
return all + this.getWeeklyTotal(revenueComponent) * this.duration.value;
}
if (this.duration.duration === DurationPeriod.MONTH) {
return all + this.getMonthlyTotal(revenueComponent) * this.duration.value;
}
if (this.duration.duration === DurationPeriod.YEAR) {
return all + this.getYearlyTotal(revenueComponent) * this.duration.value;
}
return all + this.calculateTotalPrice(revenueComponent);
}, 0);
results.push({
total: total / 100,
currencyCode: item.currencyCode,
startingPrice: startingPrice,
});
});
return results;
}
calculateTotalPrice(revenueComponent) {
if (revenueComponent.value === null) {
return null;
}
if (!this.taxOptions) {
return revenueComponent.value;
}
const taxTotal = this.taxOptions.reduce((all, tax) => all + tax.percentageMultiplier * revenueComponent.value, 0);
return revenueComponent.value + taxTotal;
}
isFree() {
const summaryTotal = this.summaryItems.reduce((all, item) => {
const totalPrices = item.revenueComponents.reduce((acc, revenueComponent) => acc + revenueComponent.value, 0);
return all + totalPrices;
}, 0);
return summaryTotal === 0;
}
}
ContractEstimatedTotalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ContractEstimatedTotalComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
ContractEstimatedTotalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: ContractEstimatedTotalComponent, selector: "app-contract-estimated-total", inputs: { orderItems: "orderItems", taxOptions: "taxOptions", duration: "duration" }, ngImport: i0, template: "<div class=\"contract-duration\">\n <div class=\"duration-description\">\n {{ getDurationDescription() | async }}\n </div>\n <ng-container *ngIf=\"!includesUndefinedPricing && !isFree()\">\n <div class=\"duration-total\">\n <span class=\"total-label\">\n {{ 'FRONTEND.STORE.ESTIMATED_TOTAL' | translate }}\n </span>\n <div class=\"duration-col\">\n <ng-container *ngFor=\"let durationPrice of calculatePriceForDuration()\">\n <ng-container *ngIf=\"durationPrice.total > 0\">\n <div class=\"duration-row\">\n <ng-container *ngIf=\"durationPrice.startingPrice\">\n <strong>{{ 'FRONTEND.STORE.STARTING_AT' | translate }}</strong>\n </ng-container>\n <strong>\n {{\n durationPrice.total | glxyCurrency: durationPrice.currencyCode\n }}\n </strong>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </ng-container>\n</div>\n", styles: [".contract-duration{display:flex;flex-direction:column;justify-content:flex-end}.contract-duration .duration-description{display:flex;flex-direction:row;justify-content:flex-end;font-size:14px;color:#616161}.contract-duration .duration-total{display:flex;flex-direction:row;justify-content:flex-end;margin-top:12px}.contract-duration .duration-total .duration-col{display:flex;flex-direction:column}.contract-duration .duration-total .duration-row{display:flex;flex-direction:row;justify-content:flex-end}.contract-duration .duration-total .total-label{margin-right:40px;color:#9e9e9e}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i2.AsyncPipe, "translate": i1.TranslatePipe, "glxyCurrency": i3.GalaxyCurrencyPipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ContractEstimatedTotalComponent, decorators: [{
type: Component,
args: [{ selector: 'app-contract-estimated-total', template: "<div class=\"contract-duration\">\n <div class=\"duration-description\">\n {{ getDurationDescription() | async }}\n </div>\n <ng-container *ngIf=\"!includesUndefinedPricing && !isFree()\">\n <div class=\"duration-total\">\n <span class=\"total-label\">\n {{ 'FRONTEND.STORE.ESTIMATED_TOTAL' | translate }}\n </span>\n <div class=\"duration-col\">\n <ng-container *ngFor=\"let durationPrice of calculatePriceForDuration()\">\n <ng-container *ngIf=\"durationPrice.total > 0\">\n <div class=\"duration-row\">\n <ng-container *ngIf=\"durationPrice.startingPrice\">\n <strong>{{ 'FRONTEND.STORE.STARTING_AT' | translate }}</strong>\n </ng-container>\n <strong>\n {{\n durationPrice.total | glxyCurrency: durationPrice.currencyCode\n }}\n </strong>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </ng-container>\n</div>\n", styles: [".contract-duration{display:flex;flex-direction:column;justify-content:flex-end}.contract-duration .duration-description{display:flex;flex-direction:row;justify-content:flex-end;font-size:14px;color:#616161}.contract-duration .duration-total{display:flex;flex-direction:row;justify-content:flex-end;margin-top:12px}.contract-duration .duration-total .duration-col{display:flex;flex-direction:column}.contract-duration .duration-total .duration-row{display:flex;flex-direction:row;justify-content:flex-end}.contract-duration .duration-total .total-label{margin-right:40px;color:#9e9e9e}\n"] }]
}], ctorParameters: function () { return [{ type: i1.TranslateService }]; }, propDecorators: { orderItems: [{
type: Input
}], taxOptions: [{
type: Input
}], duration: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3QtZXN0aW1hdGVkLXRvdGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9vcmRlci1zdW1tYXJ5L2NvbnRyYWN0LWVzdGltYXRlZC10b3RhbC9jb250cmFjdC1lc3RpbWF0ZWQtdG90YWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zdG9yZS9zcmMvbGliL29yZGVyLXN1bW1hcnkvY29udHJhY3QtZXN0aW1hdGVkLXRvdGFsL2NvbnRyYWN0LWVzdGltYXRlZC10b3RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQXFCLGNBQWMsRUFBb0IsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUcsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7QUFPL0QsTUFBTSxPQUFPLCtCQUErQjtJQWMxQyxZQUFvQixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtJQUFHLENBQUM7SUFiMUQsSUFDSSxVQUFVLENBQUMsVUFBd0I7UUFDckMsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsWUFBWSxDQUFDLHdCQUF3QixDQUFD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QWdCLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUcsT0FBTyxHQUFHLEdBQUcsV0FBVyxDQUFDO1FBQzNCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNOLE9BQU8sWUFBWSxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDOzs0SEE1S1UsK0JBQStCO2dIQUEvQiwrQkFBK0IsMEpDYjVDLG1oQ0E0QkE7MkZEZmEsK0JBQStCO2tCQUwzQyxTQUFTOytCQUNFLDhCQUE4Qjt1R0FNcEMsVUFBVTtzQkFEYixLQUFLO2dCQU9HLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IER1cmF0aW9uSW50ZXJmYWNlLCBEdXJhdGlvblBlcmlvZCwgUmV2ZW51ZUNvbXBvbmVudCwgUmV2ZW51ZVBlcmlvZCB9IGZyb20gJ0B2ZW5kYXN0YS9zYWxlcy1vcmRlcnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IER1cmF0aW9uVG90YWwsIFN1bW1hcnlJdGVtLCBUYXhPcHRpb24sIFVJTGluZUl0ZW0gfSBmcm9tICcuLi8uLi9vcmRlci1mb3JtL29yZGVyLWl0ZW0tbGlzdC9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2V0UGVyaW9kVHJhbnNsYXRpb25LZXkgfSBmcm9tICcuLi8uLi9zaGFyZWQvY29udmVyc2lvbi11dGlscyc7XG5pbXBvcnQgeyBPcmRlclN1bW1hcnlTZXJ2aWNlIH0gZnJvbSAnLi4vb3JkZXItc3VtbWFyeS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNvbnRyYWN0LWVzdGltYXRlZC10b3RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb250cmFjdC1lc3RpbWF0ZWQtdG90YWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb250cmFjdC1lc3RpbWF0ZWQtdG90YWwuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29udHJhY3RFc3RpbWF0ZWRUb3RhbENvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIHNldCBvcmRlckl0ZW1zKG9yZGVySXRlbXM6IFVJTGluZUl0ZW1bXSkge1xuICAgIGNvbnN0IHN1bW1hcnlJdGVtcyA9IE9yZGVyU3VtbWFyeVNlcnZpY2UuZ2V0UHJpY2VTdW1tYXJ5KG9yZGVySXRlbXMpO1xuICAgIHRoaXMuc3VtbWFyeUl0ZW1zID0gc3VtbWFyeUl0ZW1zLml0ZW1zO1xuICAgIHRoaXMuaW5jbHVkZXNVbmRlZmluZWRQcmljaW5nID0gc3VtbWFyeUl0ZW1zLmluY2x1ZGVzVW5kZWZpbmVkUHJpY2luZztcbiAgfVxuXG4gIEBJbnB1dCgpIHRheE9wdGlvbnM6IFRheE9wdGlvbltdO1xuICBASW5wdXQoKSBkdXJhdGlvbjogRHVyYXRpb25JbnRlcmZhY2U7XG5cbiAgcHJpdmF0ZSBzdW1tYXJ5SXRlbXM6IFN1bW1hcnlJdGVtW107XG4gIGluY2x1ZGVzVW5kZWZpbmVkUHJpY2luZzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UpIHt9XG5cbiAgZ2V0RGFpbHlUb3RhbChyZXZlbnVlQ29tcG9uZW50OiBSZXZlbnVlQ29tcG9uZW50KTogbnVtYmVyIHtcbiAgICBjb25zdCBwZXJpb2RUb3RhbCA9IHRoaXMuY2FsY3VsYXRlVG90YWxQcmljZShyZXZlbnVlQ29tcG9uZW50KTtcbiAgICBzd2l0Y2ggKHJldmVudWVDb21wb25lbnQucGVyaW9kKSB7XG4gICAgICBjYXNlIFJldmVudWVQZXJpb2QuWUVBUkxZOlxuICAgICAgICByZXR1cm4gcGVyaW9kVG90YWwgLyAzNjU7XG4gICAgICBjYXNlIFJldmVudWVQZXJpb2QuTU9OVEhMWTpcbiAgICAgICAgLy8gQXZlcmFnZSBudW1iZXIgb2YgZGF5cyBpbiBhIG1vbnRoXG4gICAgICAgIHJldHVybiBwZXJpb2RUb3RhbCAvIDMwLjQyO1xuICAgICAgY2FzZSBSZXZlbnVlUGVyaW9kLkJJV0VFS0xZOlxuICAgICAgICByZXR1cm4gcGVyaW9kVG90YWwgLyAxNDtcbiAgICAgIGNhc2UgUmV2ZW51ZVBlcmlvZC5XRUVLTFk6XG4gICAgICAgIHJldHVybiBwZXJpb2RUb3RhbCAvIDc7XG4gICAgICBjYXNlIFJldmVudWVQZXJpb2QuREFJTFk6XG4gICAgICAgIHJldHVybiBwZXJpb2RUb3RhbDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBwZXJpb2RUb3RhbDtcbiAgICB9XG4gIH1cblxuICBnZXRXZWVrbHlUb3RhbChyZXZlbnVlQ29tcG9uZW50OiBSZXZlbnVlQ29tcG9uZW50KTogbnVtYmVyIHtcbiAgICBjb25zdCBwZXJpb2RUb3RhbCA9IHRoaXMuY2FsY3VsYXRlVG90YWxQcmljZShyZXZlbnVlQ29tcG9uZW50KTtcbiAgICBzd2l0Y2ggKHJldmVudWVDb21wb25lbnQucGVyaW9kKSB7XG4gICAgICBjYXNlIFJldmVudWVQZXJpb2QuWUVBUkxZOlxuICAgICAgICByZXR1cm4gcGVyaW9kVG90YWwgLyA1MjtcbiAgICAgIGNhc2UgUmV2ZW51ZVBlcmlvZC5NT05USExZOlxuICAgICAgICAvLyBBdmVyYWdlIG51bWJlciBvZiB3ZWVrcyBpbiBhIG1vbnRoXG4gICAgICAgIHJldHVybiBwZXJpb2RUb3RhbCAvIDQuMzMzO1xuICAgICAgY2FzZSBSZXZlbnVlUGVyaW9kLkJJV0VFS0xZOlxuICAgICAgICByZXR1cm4gcGVyaW9kVG90YWwgLyAyO1xuICAgICAgY2FzZSBSZXZlbnVlUGVyaW9kLldFRUtMWTpcbiAgICAgICAgcmV0dXJuIHBlcmlvZFRvdGFsO1xuICAgICAgY2FzZSBSZXZlbnVlUGVyaW9kLkRBSUxZOlxuICAgICAgICByZXR1cm4gcGVyaW9kVG90YWwgKiA3O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHBlcmlvZFRvdGFsO1xuICAgIH1cbiAgfVxuXG4gIGdldE1vbnRobHlUb3RhbChyZXZlbnVlQ29tcG9uZW50OiBSZXZlbnVlQ29tcG9uZW50KTogbnVtYmVyIHtcbiAgICBjb25zdCBwZXJpb2RUb3RhbCA9IHRoaXMuY2FsY3VsYXRlVG90YWxQcmljZShyZXZlbnVlQ29tcG9uZW50KTtcbiAgICBzd2l0Y2ggKHJldmVudWVDb21wb25lbnQucGVyaW9kKSB7XG4gICAgICBjYXNlIFJldmVudWVQZXJpb2QuWUVBUkxZOlxuICAgICAgICByZXR1cm4gcGVyaW9kVG90YWwgLyAxMjtcbiAgICAgIGNhc2UgUmV2ZW51ZVBlcmlvZC5NT05USExZOlxuICAgICAgICByZXR1cm4gcGVyaW9kVG90YWw7XG4gICAgICBjYXNlIFJldmVudWVQZXJpb2QuQklXRUVLTFk6XG4gICAgICAgIHJldHVybiBwZXJpb2RUb3RhbCAqIDI7XG4gICAgICBjYXNlIFJldmVudWVQZXJpb2QuV0VFS0xZOlxuICAgICAgICByZXR1cm4gcGVyaW9kVG90YWwgKiA0O1xuICAgICAgY2FzZSBSZXZlbnVlUGVyaW9kLkRBSUxZOlxuICAgICAgICByZXR1cm4gcGVyaW9kVG90YWwgKiAzMDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBwZXJpb2RUb3RhbDtcbiAgICB9XG4gIH1cblxuICBnZXRZZWFybHlUb3RhbChyZXZlbnVlQ29tcG9uZW50OiBSZXZlbnVlQ29tcG9uZW50KTogbnVtYmVyIHtcbiAgICBjb25zdCBwZXJpb2RUb3RhbCA9IHRoaXMuY2FsY3VsYXRlVG90YWxQcmljZShyZXZlbnVlQ29tcG9uZW50KTtcbiAgICBzd2l0Y2ggKHJldmVudWVDb21wb25lbnQucGVyaW9kKSB7XG4gICAgICBjYXNlIFJldmVudWVQZXJpb2QuWUVBUkxZOlxuICAgICAgICByZXR1cm4gcGVyaW9kVG90YWw7XG4gICAgICBjYXNlIFJldmVudWVQZXJpb2QuTU9OVEhMWTpcbiAgICAgICAgcmV0dXJuIHBlcmlvZFRvdGFsICogMTI7XG4gICAgICBjYXNlIFJldmVudWVQZXJpb2QuQklXRUVLTFk6XG4gICAgICAgIHJldHVybiBwZXJpb2RUb3RhbCAqIDI2O1xuICAgICAgY2FzZSBSZXZlbnVlUGVyaW9kLldFRUtMWTpcbiAgICAgICAgcmV0dXJuIHBlcmlvZFRvdGFsICogNTI7XG4gICAgICBjYXNlIFJldmVudWVQZXJpb2QuREFJTFk6XG4gICAgICAgIHJldHVybiBwZXJpb2RUb3RhbCAqIDM2NTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBwZXJpb2RUb3RhbDtcbiAgICB9XG4gIH1cblxuICBnZXRSZXZlbnVlUGVyaW9kKHBlcmlvZDogUmV2ZW51ZVBlcmlvZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldFBlcmlvZFRyYW5zbGF0aW9uS2V5KHBlcmlvZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RHVyYXRpb25EZXNjcmlwdGlvbigpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGlmICghdGhpcy5kdXJhdGlvbikge1xuICAgICAgcmV0dXJuIG9mKCcnKTtcbiAgICB9XG4gICAgc3dpdGNoICh0aGlzLmR1cmF0aW9uLmR1cmF0aW9uKSB7XG4gICAgICBjYXNlIER1cmF0aW9uUGVyaW9kLkRBWTpcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ0ZST05URU5ELlNUT1JFLkRVUkFUSU9OLkRBWV9DT05UUkFDVCcsIHsgdmFsdWU6IHRoaXMuZHVyYXRpb24udmFsdWUgfSk7XG4gICAgICBjYXNlIER1cmF0aW9uUGVyaW9kLldFRUs6XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdGUk9OVEVORC5TVE9SRS5EVVJBVElPTi5XRUVLX0NPTlRSQUNUJywgeyB2YWx1ZTogdGhpcy5kdXJhdGlvbi52YWx1ZSB9KTtcbiAgICAgIGNhc2UgRHVyYXRpb25QZXJpb2QuTU9OVEg6XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdGUk9OVEVORC5TVE9SRS5EVVJBVElPTi5NT05USF9DT05UUkFDVCcsIHsgdmFsdWU6IHRoaXMuZHVyYXRpb24udmFsdWUgfSk7XG4gICAgICBjYXNlIER1cmF0aW9uUGVyaW9kLllFQVI6XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdGUk9OVEVORC5TVE9SRS5EVVJBVElPTi5ZRUFSX0NPTlRSQUNUJywgeyB2YWx1ZTogdGhpcy5kdXJhdGlvbi52YWx1ZSB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBvZignJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZVByaWNlRm9yRHVyYXRpb24oKTogRHVyYXRpb25Ub3RhbFtdIHtcbiAgICBjb25zdCByZXN1bHRzOiBEdXJhdGlvblRvdGFsW10gPSBbXTtcbiAgICBpZiAoIXRoaXMuZHVyYXRpb24pIHtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgICB0aGlzLnN1bW1hcnlJdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBsZXQgc3RhcnRpbmdQcmljZSA9IGZhbHNlO1xuICAgICAgY29uc3QgdG90YWwgPSBpdGVtLnJldmVudWVDb21wb25lbnRzLnJlZHVjZSgoYWxsLCByZXZlbnVlQ29tcG9uZW50KSA9PiB7XG4gICAgICAgIGlmIChyZXZlbnVlQ29tcG9uZW50LmlzU3RhcnRpbmdSZXZlbnVlKSB7XG4gICAgICAgICAgc3RhcnRpbmdQcmljZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV2ZW51ZUNvbXBvbmVudC5wZXJpb2QgPT09IFJldmVudWVQZXJpb2QuT05FVElNRSkge1xuICAgICAgICAgIHJldHVybiBhbGwgKyB0aGlzLmNhbGN1bGF0ZVRvdGFsUHJpY2UocmV2ZW51ZUNvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbi5kdXJhdGlvbiA9PT0gRHVyYXRpb25QZXJpb2QuREFZKSB7XG4gICAgICAgICAgcmV0dXJuIGFsbCArIHRoaXMuZ2V0RGFpbHlUb3RhbChyZXZlbnVlQ29tcG9uZW50KSAqIHRoaXMuZHVyYXRpb24udmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbi5kdXJhdGlvbiA9PT0gRHVyYXRpb25QZXJpb2QuV0VFSykge1xuICAgICAgICAgIHJldHVybiBhbGwgKyB0aGlzLmdldFdlZWtseVRvdGFsKHJldmVudWVDb21wb25lbnQpICogdGhpcy5kdXJhdGlvbi52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uLmR1cmF0aW9uID09PSBEdXJhdGlvblBlcmlvZC5NT05USCkge1xuICAgICAgICAgIHJldHVybiBhbGwgKyB0aGlzLmdldE1vbnRobHlUb3RhbChyZXZlbnVlQ29tcG9uZW50KSAqIHRoaXMuZHVyYXRpb24udmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbi5kdXJhdGlvbiA9PT0gRHVyYXRpb25QZXJpb2QuWUVBUikge1xuICAgICAgICAgIHJldHVybiBhbGwgKyB0aGlzLmdldFllYXJseVRvdGFsKHJldmVudWVDb21wb25lbnQpICogdGhpcy5kdXJhdGlvbi52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbGwgKyB0aGlzLmNhbGN1bGF0ZVRvdGFsUHJpY2UocmV2ZW51ZUNvbXBvbmVudCk7XG4gICAgICB9LCAwKTtcbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIHRvdGFsOiB0b3RhbCAvIDEwMCxcbiAgICAgICAgY3VycmVuY3lDb2RlOiBpdGVtLmN1cnJlbmN5Q29kZSxcbiAgICAgICAgc3RhcnRpbmdQcmljZTogc3RhcnRpbmdQcmljZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZVRvdGFsUHJpY2UocmV2ZW51ZUNvbXBvbmVudDogUmV2ZW51ZUNvbXBvbmVudCk6IG51bWJlciB7XG4gICAgaWYgKHJldmVudWVDb21wb25lbnQudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudGF4T3B0aW9ucykge1xuICAgICAgcmV0dXJuIHJldmVudWVDb21wb25lbnQudmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHRheFRvdGFsID0gdGhpcy50YXhPcHRpb25zLnJlZHVjZSgoYWxsLCB0YXgpID0+IGFsbCArIHRheC5wZXJjZW50YWdlTXVsdGlwbGllciAqIHJldmVudWVDb21wb25lbnQudmFsdWUsIDApO1xuICAgIHJldHVybiByZXZlbnVlQ29tcG9uZW50LnZhbHVlICsgdGF4VG90YWw7XG4gIH1cblxuICBwdWJsaWMgaXNGcmVlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN1bW1hcnlUb3RhbCA9IHRoaXMuc3VtbWFyeUl0ZW1zLnJlZHVjZSgoYWxsLCBpdGVtKSA9PiB7XG4gICAgICBjb25zdCB0b3RhbFByaWNlcyA9IGl0ZW0ucmV2ZW51ZUNvbXBvbmVudHMucmVkdWNlKChhY2MsIHJldmVudWVDb21wb25lbnQpID0+IGFjYyArIHJldmVudWVDb21wb25lbnQudmFsdWUsIDApO1xuICAgICAgcmV0dXJuIGFsbCArIHRvdGFsUHJpY2VzO1xuICAgIH0sIDApO1xuICAgIHJldHVybiBzdW1tYXJ5VG90YWwgPT09IDA7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb250cmFjdC1kdXJhdGlvblwiPlxuICA8ZGl2IGNsYXNzPVwiZHVyYXRpb24tZGVzY3JpcHRpb25cIj5cbiAgICB7eyBnZXREdXJhdGlvbkRlc2NyaXB0aW9uKCkgfCBhc3luYyB9fVxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpbmNsdWRlc1VuZGVmaW5lZFByaWNpbmcgJiYgIWlzRnJlZSgpXCI+XG4gICAgPGRpdiBjbGFzcz1cImR1cmF0aW9uLXRvdGFsXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInRvdGFsLWxhYmVsXCI+XG4gICAgICAgIHt7ICdGUk9OVEVORC5TVE9SRS5FU1RJTUFURURfVE9UQUwnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHVyYXRpb24tY29sXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGR1cmF0aW9uUHJpY2Ugb2YgY2FsY3VsYXRlUHJpY2VGb3JEdXJhdGlvbigpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImR1cmF0aW9uUHJpY2UudG90YWwgPiAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHVyYXRpb24tcm93XCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkdXJhdGlvblByaWNlLnN0YXJ0aW5nUHJpY2VcIj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPnt7ICdGUk9OVEVORC5TVE9SRS5TVEFSVElOR19BVCcgfCB0cmFuc2xhdGUgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUHJpY2UudG90YWwgfCBnbHh5Q3VycmVuY3k6IGR1cmF0aW9uUHJpY2UuY3VycmVuY3lDb2RlXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==