@spartacus/cart
Version:
`@spartacus/cart` is a package that you can include in your application, which allows you to use various cart features.
127 lines • 23 kB
JavaScript
import { ChangeDetectionStrategy, Component, } from '@angular/core';
import { Validators } from '@angular/forms';
import { CartAddEntryFailEvent, CartAddEntrySuccessEvent, GlobalMessageType, } from '@spartacus/core';
import { Subscription } from 'rxjs';
import { first, map } 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 "@spartacus/storefront";
import * as i4 from "@angular/common";
export class CartQuickOrderFormComponent {
constructor(activeCartService, eventService, formBuilder, globalMessageService) {
this.activeCartService = activeCartService;
this.eventService = eventService;
this.formBuilder = formBuilder;
this.globalMessageService = globalMessageService;
this.cartIsLoading$ = this.activeCartService
.isStable()
.pipe(map((loaded) => !loaded));
this.cart$ = this.activeCartService.getActive();
this.min = 1;
this.subscription = new Subscription();
this.cartEventsSubscription = new Subscription();
this.minQuantityValue = 1;
}
ngOnInit() {
this.buildForm();
this.watchQuantityChange();
}
ngOnDestroy() {
var _a, _b;
(_a = this.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
(_b = this.cartEventsSubscription) === null || _b === void 0 ? void 0 : _b.unsubscribe();
}
applyQuickOrder() {
var _a, _b;
if (this.quickOrderForm.invalid) {
this.quickOrderForm.markAllAsTouched();
return;
}
const productCode = (_a = this.quickOrderForm.get('productCode')) === null || _a === void 0 ? void 0 : _a.value;
const quantity = (_b = this.quickOrderForm.get('quantity')) === null || _b === void 0 ? void 0 : _b.value;
this.watchAddEntrySuccessEvent();
this.watchAddEntryFailEvent();
if (productCode && quantity) {
this.activeCartService.addEntry(productCode, quantity);
}
}
buildForm() {
this.quickOrderForm = this.formBuilder.group({
productCode: ['', [Validators.required]],
quantity: [
this.minQuantityValue,
{ updateOn: 'blur', validators: [Validators.required] },
],
});
}
watchQuantityChange() {
var _a;
this.subscription.add((_a = this.quickOrderForm
.get('quantity')) === null || _a === void 0 ? void 0 : _a.valueChanges.subscribe((value) => {
var _a;
return (_a = this.quickOrderForm
.get('quantity')) === null || _a === void 0 ? void 0 : _a.setValue(this.getValidCount(value), { emitEvent: false });
}));
}
watchAddEntrySuccessEvent() {
this.cartEventsSubscription.add(this.eventService
.get(CartAddEntrySuccessEvent)
.pipe(first())
.subscribe((data) => {
var _a, _b;
let key = 'quickOrderCartForm.stockLevelReached';
let productTranslation;
let messageType = GlobalMessageType.MSG_TYPE_WARNING;
if (data.quantityAdded) {
key =
data.quantityAdded > 1
? 'quickOrderCartForm.entriesWereAdded'
: 'quickOrderCartForm.entryWasAdded';
productTranslation =
data.quantityAdded > 1
? 'quickOrderCartForm.products'
: 'quickOrderCartForm.product';
messageType = GlobalMessageType.MSG_TYPE_CONFIRMATION;
}
this.globalMessageService.add({
key,
params: {
product: ((_b = (_a = data === null || data === void 0 ? void 0 : data.entry) === null || _a === void 0 ? void 0 : _a.product) === null || _b === void 0 ? void 0 : _b.name) || productTranslation,
quantity: data.quantityAdded,
},
}, messageType);
this.resetForm();
}));
}
watchAddEntryFailEvent() {
this.cartEventsSubscription.add(this.eventService
.get(CartAddEntryFailEvent)
.pipe(first())
.subscribe(() => {
this.globalMessageService.add({
key: 'quickOrderCartForm.noResults',
}, GlobalMessageType.MSG_TYPE_ERROR);
}));
}
getValidCount(value) {
if (value < this.min || !value) {
value = this.min;
}
return value;
}
resetForm() {
this.quickOrderForm.reset();
}
}
CartQuickOrderFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CartQuickOrderFormComponent, deps: [{ token: i1.ActiveCartService }, { token: i1.EventService }, { token: i2.FormBuilder }, { token: i1.GlobalMessageService }], target: i0.ɵɵFactoryTarget.Component });
CartQuickOrderFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: CartQuickOrderFormComponent, selector: "cx-cart-quick-order-form", ngImport: i0, template: "<ng-container *ngIf=\"cart$ | async as cart\">\n <div class=\"cx-cart-quick-order-form-title\">\n {{ 'quickOrderCartForm.title' | cxTranslate }}\n </div>\n <div class=\"form-group\">\n <form (ngSubmit)=\"applyQuickOrder()\" [formGroup]=\"quickOrderForm\">\n <div class=\"cx-cart-quick-order-form-container\">\n <span class=\"cx-cart-quick-order-form-productID\">\n <label class=\"cx-cart-quick-order-form-label\">\n {{ 'quickOrderCartForm.productCodeLabel' | cxTranslate }}\n </label>\n <input\n aria-required=\"true\"\n class=\"form-control input-product-code\"\n formControlName=\"productCode\"\n placeholder=\"{{\n 'quickOrderCartForm.productCodePlaceholder' | cxTranslate\n }}\"\n type=\"text\"\n />\n </span>\n\n <span class=\"cx-cart-quick-order-form-qty\">\n <label class=\"cx-cart-quick-order-form-label\">\n {{ 'quickOrderCartForm.quantityLabel' | cxTranslate }}\n </label>\n <input\n aria-required=\"true\"\n class=\"form-control input-quantity\"\n formControlName=\"quantity\"\n type=\"number\"\n />\n </span>\n <button\n [class.disabled]=\"cartIsLoading$ | async\"\n [disabled]=\"cartIsLoading$ | async\"\n class=\"btn btn-block btn-action apply-quick-order-button\"\n type=\"submit\"\n >\n {{ 'quickOrderCartForm.addToCart' | cxTranslate }}\n </button>\n <cx-form-errors\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n [control]=\"quickOrderForm.get('productCode')\"\n ></cx-form-errors>\n <cx-form-errors\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n [control]=\"quickOrderForm.get('quantity')\"\n ></cx-form-errors>\n </div>\n </form></div\n></ng-container>\n", components: [{ type: i3.FormErrorsComponent, selector: "cx-form-errors", inputs: ["prefix", "translationParams", "control"] }], directives: [{ type: i4.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: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }], pipes: { "async": i4.AsyncPipe, "cxTranslate": i1.TranslatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CartQuickOrderFormComponent, decorators: [{
type: Component,
args: [{
selector: 'cx-cart-quick-order-form',
templateUrl: './cart-quick-order-form.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
}]
}], ctorParameters: function () { return [{ type: i1.ActiveCartService }, { type: i1.EventService }, { type: i2.FormBuilder }, { type: i1.GlobalMessageService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC1xdWljay1vcmRlci1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2ZlYXR1cmUtbGlicy9jYXJ0L3F1aWNrLW9yZGVyL2NvbXBvbmVudHMvY2FydC1xdWljay1vcmRlci1mb3JtL2NhcnQtcXVpY2stb3JkZXItZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9mZWF0dXJlLWxpYnMvY2FydC9xdWljay1vcmRlci9jb21wb25lbnRzL2NhcnQtcXVpY2stb3JkZXItZm9ybS9jYXJ0LXF1aWNrLW9yZGVyLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEdBR1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBR0wscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUd4QixpQkFBaUIsR0FDbEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQU81QyxNQUFNLE9BQU8sMkJBQTJCO0lBWXRDLFlBQ1ksaUJBQW9DLEVBQ3BDLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLG9CQUEwQztRQUgxQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFkdEQsbUJBQWMsR0FBd0IsSUFBSSxDQUFDLGlCQUFpQjthQUN6RCxRQUFRLEVBQUU7YUFDVixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFF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O1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRVMsU0FBUztRQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzlCLENBQUM7O3dIQXJJVSwyQkFBMkI7NEdBQTNCLDJCQUEyQixnRUN4QnhDLCs4REFzREE7MkZEOUJhLDJCQUEyQjtrQkFMdkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsMEJBQTBCO29CQUNwQyxXQUFXLEVBQUUsd0NBQXdDO29CQUNyRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQWN0aXZlQ2FydFNlcnZpY2UsXG4gIENhcnQsXG4gIENhcnRBZGRFbnRyeUZhaWxFdmVudCxcbiAgQ2FydEFkZEVudHJ5U3VjY2Vzc0V2ZW50LFxuICBFdmVudFNlcnZpY2UsXG4gIEdsb2JhbE1lc3NhZ2VTZXJ2aWNlLFxuICBHbG9iYWxNZXNzYWdlVHlwZSxcbn0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlyc3QsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3gtY2FydC1xdWljay1vcmRlci1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhcnQtcXVpY2stb3JkZXItZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDYXJ0UXVpY2tPcmRlckZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHF1aWNrT3JkZXJGb3JtOiBGb3JtR3JvdXA7XG4gIGNhcnRJc0xvYWRpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5hY3RpdmVDYXJ0U2VydmljZVxuICAgIC5pc1N0YWJsZSgpXG4gICAgLnBpcGUobWFwKChsb2FkZWQpID0+ICFsb2FkZWQpKTtcbiAgY2FydCQ6IE9ic2VydmFibGU8Q2FydD4gPSB0aGlzLmFjdGl2ZUNhcnRTZXJ2aWNlLmdldEFjdGl2ZSgpO1xuICBtaW4gPSAxO1xuXG4gIHByb3RlY3RlZCBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJvdGVjdGVkIGNhcnRFdmVudHNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJvdGVjdGVkIG1pblF1YW50aXR5VmFsdWU6IG51bWJlciA9IDE7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGFjdGl2ZUNhcnRTZXJ2aWNlOiBBY3RpdmVDYXJ0U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZXZlbnRTZXJ2aWNlOiBFdmVudFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcm90ZWN0ZWQgZ2xvYmFsTWVzc2FnZVNlcnZpY2U6IEdsb2JhbE1lc3NhZ2VTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xuICAgIHRoaXMud2F0Y2hRdWFudGl0eUNoYW5nZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jYXJ0RXZlbnRzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgYXBwbHlRdWlja09yZGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnF1aWNrT3JkZXJGb3JtLmludmFsaWQpIHtcbiAgICAgIHRoaXMucXVpY2tPcmRlckZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2R1Y3RDb2RlID0gdGhpcy5xdWlja09yZGVyRm9ybS5nZXQoJ3Byb2R1Y3RDb2RlJyk/LnZhbHVlO1xuICAgIGNvbnN0IHF1YW50aXR5ID0gdGhpcy5xdWlja09yZGVyRm9ybS5nZXQoJ3F1YW50aXR5Jyk/LnZhbHVlO1xuXG4gICAgdGhpcy53YXRjaEFkZEVudHJ5U3VjY2Vzc0V2ZW50KCk7XG4gICAgdGhpcy53YXRjaEFkZEVudHJ5RmFpbEV2ZW50KCk7XG5cbiAgICBpZiAocHJvZHVjdENvZGUgJiYgcXVhbnRpdHkpIHtcbiAgICAgIHRoaXMuYWN0aXZlQ2FydFNlcnZpY2UuYWRkRW50cnkocHJvZHVjdENvZGUsIHF1YW50aXR5KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMucXVpY2tPcmRlckZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHByb2R1Y3RDb2RlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBxdWFudGl0eTogW1xuICAgICAgICB0aGlzLm1pblF1YW50aXR5VmFsdWUsXG4gICAgICAgIHsgdXBkYXRlT246ICdibHVyJywgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhdGNoUXVhbnRpdHlDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5xdWlja09yZGVyRm9ybVxuICAgICAgICAuZ2V0KCdxdWFudGl0eScpXG4gICAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+XG4gICAgICAgICAgdGhpcy5xdWlja09yZGVyRm9ybVxuICAgICAgICAgICAgLmdldCgncXVhbnRpdHknKVxuICAgICAgICAgICAgPy5zZXRWYWx1ZSh0aGlzLmdldFZhbGlkQ291bnQodmFsdWUpLCB7IGVtaXRFdmVudDogZmFsc2UgfSlcbiAgICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2F0Y2hBZGRFbnRyeVN1Y2Nlc3NFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhcnRFdmVudHNTdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5ldmVudFNlcnZpY2VcbiAgICAgICAgLmdldChDYXJ0QWRkRW50cnlTdWNjZXNzRXZlbnQpXG4gICAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IENhcnRBZGRFbnRyeVN1Y2Nlc3NFdmVudCkgPT4ge1xuICAgICAgICAgIGxldCBrZXkgPSAncXVpY2tPcmRlckNhcnRGb3JtLnN0b2NrTGV2ZWxSZWFjaGVkJztcbiAgICAgICAgICBsZXQgcHJvZHVjdFRyYW5zbGF0aW9uO1xuICAgICAgICAgIGxldCBtZXNzYWdlVHlwZSA9IEdsb2JhbE1lc3NhZ2VUeXBlLk1TR19UWVBFX1dBUk5JTkc7XG5cbiAgICAgICAgICBpZiAoZGF0YS5xdWFudGl0eUFkZGVkKSB7XG4gICAgICAgICAgICBrZXkgPVxuICAgICAgICAgICAgICBkYXRhLnF1YW50aXR5QWRkZWQgPiAxXG4gICAgICAgICAgICAgICAgPyAncXVpY2tPcmRlckNhcnRGb3JtLmVudHJpZXNXZXJlQWRkZWQnXG4gICAgICAgICAgICAgICAgOiAncXVpY2tPcmRlckNhcnRGb3JtLmVudHJ5V2FzQWRkZWQnO1xuXG4gICAgICAgICAgICBwcm9kdWN0VHJhbnNsYXRpb24gPVxuICAgICAgICAgICAgICBkYXRhLnF1YW50aXR5QWRkZWQgPiAxXG4gICAgICAgICAgICAgICAgPyAncXVpY2tPcmRlckNhcnRGb3JtLnByb2R1Y3RzJ1xuICAgICAgICAgICAgICAgIDogJ3F1aWNrT3JkZXJDYXJ0Rm9ybS5wcm9kdWN0JztcblxuICAgICAgICAgICAgbWVzc2FnZVR5cGUgPSBHbG9iYWxNZXNzYWdlVHlwZS5NU0dfVFlQRV9DT05GSVJNQVRJT047XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5nbG9iYWxNZXNzYWdlU2VydmljZS5hZGQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdDogZGF0YT8uZW50cnk/LnByb2R1Y3Q/Lm5hbWUgfHwgcHJvZHVjdFRyYW5zbGF0aW9uLFxuICAgICAgICAgICAgICAgIHF1YW50aXR5OiBkYXRhLnF1YW50aXR5QWRkZWQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWVzc2FnZVR5cGVcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YXRjaEFkZEVudHJ5RmFpbEV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY2FydEV2ZW50c1N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmV2ZW50U2VydmljZVxuICAgICAgICAuZ2V0KENhcnRBZGRFbnRyeUZhaWxFdmVudClcbiAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5nbG9iYWxNZXNzYWdlU2VydmljZS5hZGQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogJ3F1aWNrT3JkZXJDYXJ0Rm9ybS5ub1Jlc3VsdHMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEdsb2JhbE1lc3NhZ2VUeXBlLk1TR19UWVBFX0VSUk9SXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFZhbGlkQ291bnQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSA8IHRoaXMubWluIHx8ICF2YWx1ZSkge1xuICAgICAgdmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMucXVpY2tPcmRlckZvcm0ucmVzZXQoKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcnQkIHwgYXN5bmMgYXMgY2FydFwiPlxuICA8ZGl2IGNsYXNzPVwiY3gtY2FydC1xdWljay1vcmRlci1mb3JtLXRpdGxlXCI+XG4gICAge3sgJ3F1aWNrT3JkZXJDYXJ0Rm9ybS50aXRsZScgfCBjeFRyYW5zbGF0ZSB9fVxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICA8Zm9ybSAobmdTdWJtaXQpPVwiYXBwbHlRdWlja09yZGVyKClcIiBbZm9ybUdyb3VwXT1cInF1aWNrT3JkZXJGb3JtXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3gtY2FydC1xdWljay1vcmRlci1mb3JtLWNvbnRhaW5lclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImN4LWNhcnQtcXVpY2stb3JkZXItZm9ybS1wcm9kdWN0SURcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjeC1jYXJ0LXF1aWNrLW9yZGVyLWZvcm0tbGFiZWxcIj5cbiAgICAgICAgICAgIHt7ICdxdWlja09yZGVyQ2FydEZvcm0ucHJvZHVjdENvZGVMYWJlbCcgfCBjeFRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1wcm9kdWN0LWNvZGVcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdENvZGVcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e1xuICAgICAgICAgICAgICAncXVpY2tPcmRlckNhcnRGb3JtLnByb2R1Y3RDb2RlUGxhY2Vob2xkZXInIHwgY3hUcmFuc2xhdGVcbiAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjeC1jYXJ0LXF1aWNrLW9yZGVyLWZvcm0tcXR5XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3gtY2FydC1xdWljay1vcmRlci1mb3JtLWxhYmVsXCI+XG4gICAgICAgICAgICB7eyAncXVpY2tPcmRlckNhcnRGb3JtLnF1YW50aXR5TGFiZWwnIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgaW5wdXQtcXVhbnRpdHlcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicXVhbnRpdHlcIlxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImNhcnRJc0xvYWRpbmckIHwgYXN5bmNcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJjYXJ0SXNMb2FkaW5nJCB8IGFzeW5jXCJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4tYmxvY2sgYnRuLWFjdGlvbiBhcHBseS1xdWljay1vcmRlci1idXR0b25cIlxuICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ3F1aWNrT3JkZXJDYXJ0Rm9ybS5hZGRUb0NhcnQnIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxjeC1mb3JtLWVycm9yc1xuICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiXG4gICAgICAgICAgYXJpYS1hdG9taWM9XCJ0cnVlXCJcbiAgICAgICAgICBbY29udHJvbF09XCJxdWlja09yZGVyRm9ybS5nZXQoJ3Byb2R1Y3RDb2RlJylcIlxuICAgICAgICA+PC9jeC1mb3JtLWVycm9ycz5cbiAgICAgICAgPGN4LWZvcm0tZXJyb3JzXG4gICAgICAgICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCJcbiAgICAgICAgICBhcmlhLWF0b21pYz1cInRydWVcIlxuICAgICAgICAgIFtjb250cm9sXT1cInF1aWNrT3JkZXJGb3JtLmdldCgncXVhbnRpdHknKVwiXG4gICAgICAgID48L2N4LWZvcm0tZXJyb3JzPlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPjwvZGl2XG4+PC9uZy1jb250YWluZXI+XG4iXX0=