@spartacus/storefront
Version:
Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.
112 lines • 22.1 kB
JavaScript
import { Component } from '@angular/core';
import { Validators } from '@angular/forms';
import { combineLatest, Subscription } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@spartacus/core";
import * as i2 from "@angular/forms";
import * as i3 from "../../../shared/components/form/form-errors/form-errors.component";
import * as i4 from "./applied-coupons/applied-coupons.component";
import * as i5 from "@angular/common";
export class CartCouponComponent {
constructor(cartVoucherService, formBuilder, customerCouponService, activeCartService) {
this.cartVoucherService = cartVoucherService;
this.formBuilder = formBuilder;
this.customerCouponService = customerCouponService;
this.activeCartService = activeCartService;
this.MAX_CUSTOMER_COUPON_PAGE = 100;
this.ignoreCloseEvent = false;
this.subscription = new Subscription();
this.couponBoxIsActive = false;
}
ngOnInit() {
if (this.customerCouponService) {
this.customerCouponService.loadCustomerCoupons(this.MAX_CUSTOMER_COUPON_PAGE);
}
this.cart$ = combineLatest([
this.activeCartService.getActive(),
this.activeCartService.getActiveCartId(),
this.customerCouponService.getCustomerCoupons(this.MAX_CUSTOMER_COUPON_PAGE),
]).pipe(tap(([cart, activeCardId, customerCoupons]) => {
this.cartId = activeCardId;
this.getApplicableCustomerCoupons(cart, customerCoupons.coupons);
}), map(([cart]) => cart));
this.cartIsLoading$ = this.activeCartService
.isStable()
.pipe(map((loaded) => !loaded));
this.cartVoucherService.resetAddVoucherProcessingState();
this.couponForm = this.formBuilder.group({
couponCode: ['', [Validators.required]],
});
// TODO(#7241): Replace process subscriptions with event listeners and drop process for ADD_VOUCHER
this.subscription.add(this.cartVoucherService
.getAddVoucherResultSuccess()
.subscribe((success) => {
this.onSuccess(success);
}));
// TODO(#7241): Replace process subscriptions with event listeners and drop process for ADD_VOUCHER
this.subscription.add(this.cartVoucherService.getAddVoucherResultError().subscribe((error) => {
this.onError(error);
}));
}
onError(error) {
if (error) {
this.customerCouponService.loadCustomerCoupons(this.MAX_CUSTOMER_COUPON_PAGE);
this.cartVoucherService.resetAddVoucherProcessingState();
}
}
onSuccess(success) {
if (success) {
this.couponForm.reset();
this.cartVoucherService.resetAddVoucherProcessingState();
}
}
getApplicableCustomerCoupons(cart, coupons) {
this.applicableCoupons = coupons || [];
if (cart.appliedVouchers) {
cart.appliedVouchers.forEach((appliedVoucher) => {
this.applicableCoupons = this.applicableCoupons.filter((coupon) => coupon.couponId !== appliedVoucher.code);
});
}
}
applyVoucher() {
if (this.couponForm.valid) {
this.cartVoucherService.addVoucher(this.couponForm.value.couponCode, this.cartId);
}
else {
this.couponForm.markAllAsTouched();
}
}
applyCustomerCoupon(couponId) {
this.cartVoucherService.addVoucher(couponId, this.cartId);
this.couponBoxIsActive = false;
}
close(event) {
if (!this.ignoreCloseEvent) {
this.couponBoxIsActive = false;
if (event && event.target) {
event.target.blur();
}
}
this.ignoreCloseEvent = false;
}
disableClose() {
this.ignoreCloseEvent = true;
}
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
}
this.cartVoucherService.resetAddVoucherProcessingState();
}
}
CartCouponComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CartCouponComponent, deps: [{ token: i1.CartVoucherService }, { token: i2.FormBuilder }, { token: i1.CustomerCouponService }, { token: i1.ActiveCartService }], target: i0.ɵɵFactoryTarget.Component });
CartCouponComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: CartCouponComponent, selector: "cx-cart-coupon", ngImport: i0, template: "<ng-container *ngIf=\"cart$ | async as cart\">\n <div class=\"cx-cart-coupon-title\">\n {{ 'voucher.coupon' | cxTranslate }}\n </div>\n <div class=\"form-group\">\n <form (ngSubmit)=\"applyVoucher()\" [formGroup]=\"couponForm\">\n <div class=\"cx-cart-coupon-container\">\n <input\n aria-required=\"true\"\n type=\"text\"\n class=\"form-control input-coupon-code\"\n formControlName=\"couponCode\"\n placeholder=\"{{ 'voucher.placeholder' | cxTranslate }} \"\n />\n <button\n class=\"btn btn-block btn-action apply-coupon-button\"\n type=\"submit\"\n [disabled]=\"cartIsLoading$ | async\"\n [class.disabled]=\"cartIsLoading$ | async\"\n >\n {{ 'voucher.apply' | cxTranslate }}\n </button>\n <cx-form-errors\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n [control]=\"couponForm.get('couponCode')\"\n ></cx-form-errors>\n </div>\n </form>\n </div>\n\n <cx-applied-coupons\n [vouchers]=\"cart.appliedVouchers\"\n [cartIsLoading]=\"cartIsLoading$ | async\"\n [isReadOnly]=\"false\"\n >\n </cx-applied-coupons>\n\n <ng-container *ngIf=\"applicableCoupons && applicableCoupons.length > 0\">\n <div class=\"cx-available-coupon\">\n <div class=\"title cx-cart-coupon-title\">\n {{ 'voucher.availableCoupons' | cxTranslate }}\n </div>\n <div class=\"message\">\n {{ 'voucher.availableCouponsLabel' | cxTranslate }}\n </div>\n <div class=\"scroll\">\n <div class=\"coupons card\" *ngFor=\"let coupon of applicableCoupons\">\n <button\n (click)=\"applyCustomerCoupon(coupon.couponId)\"\n class=\"coupon-id link\"\n [disabled]=\"cartIsLoading$ | async\"\n [class.disabled]=\"cartIsLoading$ | async\"\n >\n {{ coupon.couponId }}\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", components: [{ type: i3.FormErrorsComponent, selector: "cx-form-errors", inputs: ["prefix", "translationParams", "control"] }, { type: i4.AppliedCouponsComponent, selector: "cx-applied-coupons", inputs: ["vouchers", "cartIsLoading", "isReadOnly"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i5.AsyncPipe, "cxTranslate": i1.TranslatePipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CartCouponComponent, decorators: [{
type: Component,
args: [{
selector: 'cx-cart-coupon',
templateUrl: './cart-coupon.component.html',
}]
}], ctorParameters: function () { return [{ type: i1.CartVoucherService }, { type: i2.FormBuilder }, { type: i1.CustomerCouponService }, { type: i1.ActiveCartService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC1jb3Vwb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RvcmVmcm9udGxpYi9jbXMtY29tcG9uZW50cy9jYXJ0L2NhcnQtY291cG9uL2NhcnQtY291cG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0b3JlZnJvbnRsaWIvY21zLWNvbXBvbmVudHMvY2FydC9jYXJ0LWNvdXBvbi9jYXJ0LWNvdXBvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQTBCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBU3BFLE9BQU8sRUFBRSxhQUFhLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFNMUMsTUFBTSxPQUFPLG1CQUFtQjtJQWM5QixZQUNZLGtCQUFzQyxFQUN0QyxXQUF3QixFQUN4QixxQkFBNEMsRUFDNUMsaUJBQW9DO1FBSHBDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBakJoRCw2QkFBd0IsR0FBRyxHQUFHLENBQUM7UUFPckIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRXpCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUU1QyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFPdkIsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM5QixJQUFJLENBQUMscUJBQXFCLENBQUMs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QkFKL0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixXQUFXLEVBQUUsOEJBQThCO2lCQUM1QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBBY3RpdmVDYXJ0U2VydmljZSxcbiAgQ2FydCxcbiAgQ2FydFZvdWNoZXJTZXJ2aWNlLFxuICBDdXN0b21lckNvdXBvbixcbiAgQ3VzdG9tZXJDb3Vwb25TZWFyY2hSZXN1bHQsXG4gIEN1c3RvbWVyQ291cG9uU2VydmljZSxcbn0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2N4LWNhcnQtY291cG9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhcnQtY291cG9uLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgQ2FydENvdXBvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgTUFYX0NVU1RPTUVSX0NPVVBPTl9QQUdFID0gMTAwO1xuICBjb3Vwb25Gb3JtOiBGb3JtR3JvdXA7XG4gIGNhcnRJc0xvYWRpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBjYXJ0JDogT2JzZXJ2YWJsZTxDYXJ0PjtcbiAgY2FydElkOiBzdHJpbmc7XG4gIGFwcGxpY2FibGVDb3Vwb25zOiBDdXN0b21lckNvdXBvbltdO1xuXG4gIHByb3RlY3RlZCBpZ25vcmVDbG9zZUV2ZW50ID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb3Vwb25Cb3hJc0FjdGl2ZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjYXJ0Vm91Y2hlclNlcnZpY2U6IENhcnRWb3VjaGVyU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByb3RlY3RlZCBjdXN0b21lckNvdXBvblNlcnZpY2U6IEN1c3RvbWVyQ291cG9uU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgYWN0aXZlQ2FydFNlcnZpY2U6IEFjdGl2ZUNhcnRTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5jdXN0b21lckNvdXBvblNlcnZpY2UpIHtcbiAgICAgIHRoaXMuY3VzdG9tZXJDb3Vwb25TZXJ2aWNlLmxvYWRDdXN0b21lckNvdXBvbnMoXG4gICAgICAgIHRoaXMuTUFYX0NVU1RPTUVSX0NPVVBPTl9QQUdFXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY2FydCQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuYWN0aXZlQ2FydFNlcnZpY2UuZ2V0QWN0aXZlKCksXG4gICAgICB0aGlzLmFjdGl2ZUNhcnRTZXJ2aWNlLmdldEFjdGl2ZUNhcnRJZCgpLFxuICAgICAgdGhpcy5jdXN0b21lckNvdXBvblNlcnZpY2UuZ2V0Q3VzdG9tZXJDb3Vwb25zKFxuICAgICAgICB0aGlzLk1BWF9DVVNUT01FUl9DT1VQT05fUEFHRVxuICAgICAgKSxcbiAgICBdKS5waXBlKFxuICAgICAgdGFwKFxuICAgICAgICAoW2NhcnQsIGFjdGl2ZUNhcmRJZCwgY3VzdG9tZXJDb3Vwb25zXTogW1xuICAgICAgICAgIENhcnQsXG4gICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgIEN1c3RvbWVyQ291cG9uU2VhcmNoUmVzdWx0XG4gICAgICAgIF0pID0+IHtcbiAgICAgICAgICB0aGlzLmNhcnRJZCA9IGFjdGl2ZUNhcmRJZDtcbiAgICAgICAgICB0aGlzLmdldEFwcGxpY2FibGVDdXN0b21lckNvdXBvbnMoY2FydCwgY3VzdG9tZXJDb3Vwb25zLmNvdXBvbnMpO1xuICAgICAgICB9XG4gICAgICApLFxuICAgICAgbWFwKChbY2FydF06IFtDYXJ0LCBzdHJpbmcsIEN1c3RvbWVyQ291cG9uU2VhcmNoUmVzdWx0XSkgPT4gY2FydClcbiAgICApO1xuXG4gICAgdGhpcy5jYXJ0SXNMb2FkaW5nJCA9IHRoaXMuYWN0aXZlQ2FydFNlcnZpY2VcbiAgICAgIC5pc1N0YWJsZSgpXG4gICAgICAucGlwZShtYXAoKGxvYWRlZCkgPT4gIWxvYWRlZCkpO1xuXG4gICAgdGhpcy5jYXJ0Vm91Y2hlclNlcnZpY2UucmVzZXRBZGRWb3VjaGVyUHJvY2Vzc2luZ1N0YXRlKCk7XG5cbiAgICB0aGlzLmNvdXBvbkZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGNvdXBvbkNvZGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICB9KTtcblxuICAgIC8vIFRPRE8oIzcyNDEpOiBSZXBsYWNlIHByb2Nlc3Mgc3Vic2NyaXB0aW9ucyB3aXRoIGV2ZW50IGxpc3RlbmVycyBhbmQgZHJvcCBwcm9jZXNzIGZvciBBRERfVk9VQ0hFUlxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuY2FydFZvdWNoZXJTZXJ2aWNlXG4gICAgICAgIC5nZXRBZGRWb3VjaGVyUmVzdWx0U3VjY2VzcygpXG4gICAgICAgIC5zdWJzY3JpYmUoKHN1Y2Nlc3MpID0+IHtcbiAgICAgICAgICB0aGlzLm9uU3VjY2VzcyhzdWNjZXNzKTtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gVE9ETygjNzI0MSk6IFJlcGxhY2UgcHJvY2VzcyBzdWJzY3JpcHRpb25zIHdpdGggZXZlbnQgbGlzdGVuZXJzIGFuZCBkcm9wIHByb2Nlc3MgZm9yIEFERF9WT1VDSEVSXG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5jYXJ0Vm91Y2hlclNlcnZpY2UuZ2V0QWRkVm91Y2hlclJlc3VsdEVycm9yKCkuc3Vic2NyaWJlKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRXJyb3IoZXJyb3I6IGJvb2xlYW4pIHtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRoaXMuY3VzdG9tZXJDb3Vwb25TZXJ2aWNlLmxvYWRDdXN0b21lckNvdXBvbnMoXG4gICAgICAgIHRoaXMuTUFYX0NVU1RPTUVSX0NPVVBPTl9QQUdFXG4gICAgICApO1xuICAgICAgdGhpcy5jYXJ0Vm91Y2hlclNlcnZpY2UucmVzZXRBZGRWb3VjaGVyUHJvY2Vzc2luZ1N0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgb25TdWNjZXNzKHN1Y2Nlc3M6IGJvb2xlYW4pIHtcbiAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgdGhpcy5jb3Vwb25Gb3JtLnJlc2V0KCk7XG4gICAgICB0aGlzLmNhcnRWb3VjaGVyU2VydmljZS5yZXNldEFkZFZvdWNoZXJQcm9jZXNzaW5nU3RhdGUoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXBwbGljYWJsZUN1c3RvbWVyQ291cG9ucyhcbiAgICBjYXJ0OiBDYXJ0LFxuICAgIGNvdXBvbnM6IEN1c3RvbWVyQ291cG9uW11cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5hcHBsaWNhYmxlQ291cG9ucyA9IGNvdXBvbnMgfHwgW107XG4gICAgaWYgKGNhcnQuYXBwbGllZFZvdWNoZXJzKSB7XG4gICAgICBjYXJ0LmFwcGxpZWRWb3VjaGVycy5mb3JFYWNoKChhcHBsaWVkVm91Y2hlcikgPT4ge1xuICAgICAgICB0aGlzLmFwcGxpY2FibGVDb3Vwb25zID0gdGhpcy5hcHBsaWNhYmxlQ291cG9ucy5maWx0ZXIoXG4gICAgICAgICAgKGNvdXBvbikgPT4gY291cG9uLmNvdXBvbklkICE9PSBhcHBsaWVkVm91Y2hlci5jb2RlXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhcHBseVZvdWNoZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY291cG9uRm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5jYXJ0Vm91Y2hlclNlcnZpY2UuYWRkVm91Y2hlcihcbiAgICAgICAgdGhpcy5jb3Vwb25Gb3JtLnZhbHVlLmNvdXBvbkNvZGUsXG4gICAgICAgIHRoaXMuY2FydElkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvdXBvbkZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGFwcGx5Q3VzdG9tZXJDb3Vwb24oY291cG9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY2FydFZvdWNoZXJTZXJ2aWNlLmFkZFZvdWNoZXIoY291cG9uSWQsIHRoaXMuY2FydElkKTtcbiAgICB0aGlzLmNvdXBvbkJveElzQWN0aXZlID0gZmFsc2U7XG4gIH1cblxuICBjbG9zZShldmVudDogVUlFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pZ25vcmVDbG9zZUV2ZW50KSB7XG4gICAgICB0aGlzLmNvdXBvbkJveElzQWN0aXZlID0gZmFsc2U7XG4gICAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0KSB7XG4gICAgICAgICg8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5ibHVyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaWdub3JlQ2xvc2VFdmVudCA9IGZhbHNlO1xuICB9XG5cbiAgZGlzYWJsZUNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuaWdub3JlQ2xvc2VFdmVudCA9IHRydWU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuY2FydFZvdWNoZXJTZXJ2aWNlLnJlc2V0QWRkVm91Y2hlclByb2Nlc3NpbmdTdGF0ZSgpO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiY2FydCQgfCBhc3luYyBhcyBjYXJ0XCI+XG4gIDxkaXYgY2xhc3M9XCJjeC1jYXJ0LWNvdXBvbi10aXRsZVwiPlxuICAgIHt7ICd2b3VjaGVyLmNvdXBvbicgfCBjeFRyYW5zbGF0ZSB9fVxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICA8Zm9ybSAobmdTdWJtaXQpPVwiYXBwbHlWb3VjaGVyKClcIiBbZm9ybUdyb3VwXT1cImNvdXBvbkZvcm1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjeC1jYXJ0LWNvdXBvbi1jb250YWluZXJcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1jb3Vwb24tY29kZVwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY291cG9uQ29kZVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAndm91Y2hlci5wbGFjZWhvbGRlcicgfCBjeFRyYW5zbGF0ZSB9fSBcIlxuICAgICAgICAvPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWJsb2NrIGJ0bi1hY3Rpb24gYXBwbHktY291cG9uLWJ1dHRvblwiXG4gICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImNhcnRJc0xvYWRpbmckIHwgYXN5bmNcIlxuICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJjYXJ0SXNMb2FkaW5nJCB8IGFzeW5jXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7ICd2b3VjaGVyLmFwcGx5JyB8IGN4VHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8Y3gtZm9ybS1lcnJvcnNcbiAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIlxuICAgICAgICAgIGFyaWEtYXRvbWljPVwidHJ1ZVwiXG4gICAgICAgICAgW2NvbnRyb2xdPVwiY291cG9uRm9ybS5nZXQoJ2NvdXBvbkNvZGUnKVwiXG4gICAgICAgID48L2N4LWZvcm0tZXJyb3JzPlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuICA8L2Rpdj5cblxuICA8Y3gtYXBwbGllZC1jb3Vwb25zXG4gICAgW3ZvdWNoZXJzXT1cImNhcnQuYXBwbGllZFZvdWNoZXJzXCJcbiAgICBbY2FydElzTG9hZGluZ109XCJjYXJ0SXNMb2FkaW5nJCB8IGFzeW5jXCJcbiAgICBbaXNSZWFkT25seV09XCJmYWxzZVwiXG4gID5cbiAgPC9jeC1hcHBsaWVkLWNvdXBvbnM+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFwcGxpY2FibGVDb3Vwb25zICYmIGFwcGxpY2FibGVDb3Vwb25zLmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3gtYXZhaWxhYmxlLWNvdXBvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cInRpdGxlIGN4LWNhcnQtY291cG9uLXRpdGxlXCI+XG4gICAgICAgIHt7ICd2b3VjaGVyLmF2YWlsYWJsZUNvdXBvbnMnIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2VcIj5cbiAgICAgICAge3sgJ3ZvdWNoZXIuYXZhaWxhYmxlQ291cG9uc0xhYmVsJyB8IGN4VHJhbnNsYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbnMgY2FyZFwiICpuZ0Zvcj1cImxldCBjb3Vwb24gb2YgYXBwbGljYWJsZUNvdXBvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlDdXN0b21lckNvdXBvbihjb3Vwb24uY291cG9uSWQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY291cG9uLWlkIGxpbmtcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNhcnRJc0xvYWRpbmckIHwgYXN5bmNcIlxuICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImNhcnRJc0xvYWRpbmckIHwgYXN5bmNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGNvdXBvbi5jb3Vwb25JZCB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuIl19