@spartacus/storefront
Version:
Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.
167 lines • 26.5 kB
JavaScript
import { ChangeDetectionStrategy, Component, Input, } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';
import { PromotionLocation, } from '@spartacus/core';
import { Subscription } from 'rxjs';
import { map, startWith, tap } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@spartacus/core";
import * as i2 from "../cart-item/cart-item.component";
import * as i3 from "@angular/common";
export class CartItemListComponent {
constructor(activeCartService, selectiveCartService, userIdService, multiCartService) {
this.activeCartService = activeCartService;
this.selectiveCartService = selectiveCartService;
this.userIdService = userIdService;
this.multiCartService = multiCartService;
this.subscription = new Subscription();
this.readonly = false;
this.hasHeader = true;
this.options = {
isSaveForLater: false,
optionalBtn: null,
};
this._items = [];
this.form = new FormGroup({});
this.promotionLocation = PromotionLocation.ActiveCart;
}
set items(items) {
this.resolveItems(items);
this.createForm();
}
get items() {
return this._items;
}
set setLoading(value) {
if (!this.readonly) {
// Whenever the cart is loading, we disable the complete form
// to avoid any user interaction with the cart.
value
? this.form.disable({ emitEvent: false })
: this.form.enable({ emitEvent: false });
}
}
ngOnInit() {
var _a;
this.subscription.add((_a = this.userIdService) === null || _a === void 0 ? void 0 : _a.getUserId().subscribe((userId) => (this.userId = userId)));
}
/**
* Resolves items passed to component input and updates 'items' field
*/
resolveItems(items) {
var _a;
if (!items) {
this._items = [];
return;
}
// The items we're getting from the input do not have a consistent model.
// In case of a `consignmentEntry`, we need to normalize the data from the orderEntry.
if (items.every((item) => item.hasOwnProperty('orderEntry'))) {
this._items = items.map((consignmentEntry) => {
const entry = Object.assign({}, consignmentEntry.orderEntry);
entry.quantity = consignmentEntry.quantity;
return entry;
});
}
else {
// We'd like to avoid the unnecessary re-renders of unchanged cart items after the data reload.
// OCC cart entries don't have any unique identifier that we could use in Angular `trackBy`.
// So we update each array element to the new object only when it's any different to the previous one.
for (let i = 0; i < Math.max(items.length, this._items.length); i++) {
if (JSON.stringify((_a = this._items) === null || _a === void 0 ? void 0 : _a[i]) !== JSON.stringify(items[i])) {
if (this._items[i] && this.form) {
this.form.removeControl(this.getControlName(this._items[i]));
}
if (!items[i]) {
this._items.splice(i, 1);
}
else {
this._items[i] = items[i];
}
}
}
}
}
/**
* Creates form models for list items
*/
createForm() {
this._items.forEach((item) => {
const controlName = this.getControlName(item);
const group = new FormGroup({
entryNumber: new FormControl(item.entryNumber),
quantity: new FormControl(item.quantity, { updateOn: 'blur' }),
});
this.form.addControl(controlName, group);
// If we disable form group before adding, disabled status will reset
// Which forces us to disable control after including to form object
if (!item.updateable || this.readonly) {
this.form.controls[controlName].disable();
}
});
}
getControlName(item) {
return item.entryNumber.toString();
}
removeEntry(item) {
var _a;
if (this.selectiveCartService && this.options.isSaveForLater) {
this.selectiveCartService.removeEntry(item);
}
else if (this.cartId && this.userId) {
(_a = this.multiCartService) === null || _a === void 0 ? void 0 : _a.removeEntry(this.userId, this.cartId, item.entryNumber);
}
else {
this.activeCartService.removeEntry(item);
}
delete this.form.controls[this.getControlName(item)];
}
getControl(item) {
return this.form.get(this.getControlName(item)).valueChanges.pipe(
// eslint-disable-next-line import/no-deprecated
startWith(null), tap((value) => {
var _a;
if (item.updateable && value && !this.readonly) {
if (this.selectiveCartService && this.options.isSaveForLater) {
this.selectiveCartService.updateEntry(value.entryNumber, value.quantity);
}
else if (this.cartId && this.userId) {
(_a = this.multiCartService) === null || _a === void 0 ? void 0 : _a.updateEntry(this.userId, this.cartId, value.entryNumber, value.quantity);
}
else {
this.activeCartService.updateEntry(value.entryNumber, value.quantity);
}
}
}), map(() => this.form.get(this.getControlName(item))));
}
ngOnDestroy() {
var _a;
(_a = this.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
}
}
CartItemListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CartItemListComponent, deps: [{ token: i1.ActiveCartService }, { token: i1.SelectiveCartService }, { token: i1.UserIdService }, { token: i1.MultiCartService }], target: i0.ɵɵFactoryTarget.Component });
CartItemListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: CartItemListComponent, selector: "cx-cart-item-list", inputs: { readonly: "readonly", hasHeader: "hasHeader", options: "options", cartId: "cartId", items: "items", promotionLocation: "promotionLocation", setLoading: ["cartIsLoading", "setLoading"] }, ngImport: i0, template: "<div *ngIf=\"hasHeader\" class=\"d-none d-md-block d-lg-block d-xl-block\">\n <div class=\"cx-item-list-header row\">\n <div class=\"cx-item-list-desc col-md-5 col-lg-5 col-xl-6\">\n {{ 'cartItems.description' | cxTranslate }}\n </div>\n <div class=\"cx-item-list-price col-md-3 col-lg-2 col-xl-2\">\n {{ 'cartItems.itemPrice' | cxTranslate }}\n </div>\n <div class=\"cx-item-list-qty col-md-2 col-lg-3 col-xl-2\">\n {{ 'cartItems.quantity' | cxTranslate }}\n </div>\n\n <ng-container *ngIf=\"options.isSaveForLater; else totalHeader\">\n <div class=\"cx-item-list-total col-md-2 col-lg-2 col-xl-2\">\n {{ 'saveForLaterItems.stock' | cxTranslate }}\n </div>\n </ng-container>\n </div>\n</div>\n\n<div class=\"cx-item-list-row\" *ngFor=\"let item of items; let i = index\">\n <div\n *ngIf=\"getControl(item) | async as control\"\n class=\"cx-item-list-items\"\n [class.is-changed]=\"control.get('quantity').disabled\"\n >\n <cx-cart-item\n [item]=\"item\"\n [quantityControl]=\"control.get('quantity')\"\n [readonly]=\"readonly\"\n [promotionLocation]=\"promotionLocation\"\n [options]=\"options\"\n >\n </cx-cart-item>\n </div>\n</div>\n\n<ng-template #totalHeader>\n <div class=\"cx-item-list-total col-md-2 col-lg-2 col-xl-2\">\n {{ 'cartItems.total' | cxTranslate }}\n </div>\n</ng-template>\n", components: [{ type: i2.CartItemComponent, selector: "cx-cart-item", inputs: ["compact", "item", "readonly", "quantityControl", "promotionLocation", "options"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "cxTranslate": i1.TranslatePipe, "async": i3.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CartItemListComponent, decorators: [{
type: Component,
args: [{
selector: 'cx-cart-item-list',
templateUrl: './cart-item-list.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
}]
}], ctorParameters: function () { return [{ type: i1.ActiveCartService }, { type: i1.SelectiveCartService }, { type: i1.UserIdService }, { type: i1.MultiCartService }]; }, propDecorators: { readonly: [{
type: Input
}], hasHeader: [{
type: Input
}], options: [{
type: Input
}], cartId: [{
type: Input
}], items: [{
type: Input,
args: ['items']
}], promotionLocation: [{
type: Input
}], setLoading: [{
type: Input,
args: ['cartIsLoading']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC1pdGVtLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RvcmVmcm9udGxpYi9jbXMtY29tcG9uZW50cy9jYXJ0L2NhcnQtc2hhcmVkL2NhcnQtaXRlbS1saXN0L2NhcnQtaXRlbS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0b3JlZnJvbnRsaWIvY21zLWNvbXBvbmVudHMvY2FydC9jYXJ0LXNoYXJlZC9jYXJ0LWl0ZW0tbGlzdC9jYXJ0LWl0ZW0tbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxLQUFLLEdBR04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBS0wsaUJBQWlCLEdBR2xCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFjLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFRckQsTUFBTSxPQUFPLHFCQUFxQjtJQXVDaEMsWUFDWSxpQkFBb0MsRUFDcEMsb0JBQTBDLEVBQzFDLGFBQTRCLEVBQzVCLGdCQUFrQztRQUhsQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQTFDcEMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBR25DLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsY0FBUyxHQUFZLElB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QVcsQ0FDaEMsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsTUFBTSxFQUNYLEtBQUssQ0FBQyxXQUFXLEVBQ2pCLEtBQUssQ0FBQyxRQUFRLENBQ2YsQ0FBQztpQkFDSDtxQkFBTTtvQkFDTCxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUNoQyxLQUFLLENBQUMsV0FBVyxFQUNqQixLQUFLLENBQUMsUUFBUSxDQUNmLENBQUM7aUJBQ0g7YUFDRjtRQUNILENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBWSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDL0QsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXOztRQUNULE1BQUEsSUFBSSxDQUFDLFlBQVksMENBQUUsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQzs7a0hBcktVLHFCQUFxQjtzR0FBckIscUJBQXFCLDhQQzFCbEMsKzNDQTBDQTsyRkRoQmEscUJBQXFCO2tCQUxqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFdBQVcsRUFBRSxpQ0FBaUM7b0JBQzlDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDtzTUFLVSxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUtHLE1BQU07c0JBQWQsS0FBSztnQkFNRixLQUFLO3NCQURSLEtBQUs7dUJBQUMsT0FBTztnQkFTTCxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRXNCLFVBQVU7c0JBQXJDLEtBQUs7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQWN0aXZlQ2FydFNlcnZpY2UsXG4gIENvbnNpZ25tZW50RW50cnksXG4gIE11bHRpQ2FydFNlcnZpY2UsXG4gIE9yZGVyRW50cnksXG4gIFByb21vdGlvbkxvY2F0aW9uLFxuICBTZWxlY3RpdmVDYXJ0U2VydmljZSxcbiAgVXNlcklkU2VydmljZSxcbn0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGgsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENhcnRJdGVtQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gJy4uL2NhcnQtaXRlbS9jYXJ0LWl0ZW0uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3gtY2FydC1pdGVtLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FydC1pdGVtLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ2FydEl0ZW1MaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcm90ZWN0ZWQgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcm90ZWN0ZWQgdXNlcklkOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBoYXNIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpIG9wdGlvbnM6IENhcnRJdGVtQ29tcG9uZW50T3B0aW9ucyA9IHtcbiAgICBpc1NhdmVGb3JMYXRlcjogZmFsc2UsXG4gICAgb3B0aW9uYWxCdG46IG51bGwsXG4gIH07XG5cbiAgQElucHV0KCkgY2FydElkOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIF9pdGVtczogT3JkZXJFbnRyeVtdID0gW107XG4gIGZvcm06IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuXG4gIEBJbnB1dCgnaXRlbXMnKVxuICBzZXQgaXRlbXMoaXRlbXM6IE9yZGVyRW50cnlbXSkge1xuICAgIHRoaXMucmVzb2x2ZUl0ZW1zKGl0ZW1zKTtcbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgfVxuICBnZXQgaXRlbXMoKTogT3JkZXJFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gIH1cblxuICBASW5wdXQoKSBwcm9tb3Rpb25Mb2NhdGlvbjogUHJvbW90aW9uTG9jYXRpb24gPSBQcm9tb3Rpb25Mb2NhdGlvbi5BY3RpdmVDYXJ0O1xuXG4gIEBJbnB1dCgnY2FydElzTG9hZGluZycpIHNldCBzZXRMb2FkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAvLyBXaGVuZXZlciB0aGUgY2FydCBpcyBsb2FkaW5nLCB3ZSBkaXNhYmxlIHRoZSBjb21wbGV0ZSBmb3JtXG4gICAgICAvLyB0byBhdm9pZCBhbnkgdXNlciBpbnRlcmFjdGlvbiB3aXRoIHRoZSBjYXJ0LlxuICAgICAgdmFsdWVcbiAgICAgICAgPyB0aGlzLmZvcm0uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSlcbiAgICAgICAgOiB0aGlzLmZvcm0uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgYWN0aXZlQ2FydFNlcnZpY2U6IEFjdGl2ZUNhcnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBzZWxlY3RpdmVDYXJ0U2VydmljZTogU2VsZWN0aXZlQ2FydFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHVzZXJJZFNlcnZpY2U6IFVzZXJJZFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG11bHRpQ2FydFNlcnZpY2U6IE11bHRpQ2FydFNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMudXNlcklkU2VydmljZVxuICAgICAgICA/LmdldFVzZXJJZCgpXG4gICAgICAgIC5zdWJzY3JpYmUoKHVzZXJJZCkgPT4gKHRoaXMudXNlcklkID0gdXNlcklkKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGl0ZW1zIHBhc3NlZCB0byBjb21wb25lbnQgaW5wdXQgYW5kIHVwZGF0ZXMgJ2l0ZW1zJyBmaWVsZFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVJdGVtcyhpdGVtczogT3JkZXJFbnRyeVtdKTogdm9pZCB7XG4gICAgaWYgKCFpdGVtcykge1xuICAgICAgdGhpcy5faXRlbXMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgaXRlbXMgd2UncmUgZ2V0dGluZyBmcm9tIHRoZSBpbnB1dCBkbyBub3QgaGF2ZSBhIGNvbnNpc3RlbnQgbW9kZWwuXG4gICAgLy8gSW4gY2FzZSBvZiBhIGBjb25zaWdubWVudEVudHJ5YCwgd2UgbmVlZCB0byBub3JtYWxpemUgdGhlIGRhdGEgZnJvbSB0aGUgb3JkZXJFbnRyeS5cbiAgICBpZiAoaXRlbXMuZXZlcnkoKGl0ZW0pID0+IGl0ZW0uaGFzT3duUHJvcGVydHkoJ29yZGVyRW50cnknKSkpIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gaXRlbXMubWFwKChjb25zaWdubWVudEVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICB7fSxcbiAgICAgICAgICAoY29uc2lnbm1lbnRFbnRyeSBhcyBDb25zaWdubWVudEVudHJ5KS5vcmRlckVudHJ5XG4gICAgICAgICk7XG4gICAgICAgIGVudHJ5LnF1YW50aXR5ID0gY29uc2lnbm1lbnRFbnRyeS5xdWFudGl0eTtcbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlJ2QgbGlrZSB0byBhdm9pZCB0aGUgdW5uZWNlc3NhcnkgcmUtcmVuZGVycyBvZiB1bmNoYW5nZWQgY2FydCBpdGVtcyBhZnRlciB0aGUgZGF0YSByZWxvYWQuXG4gICAgICAvLyBPQ0MgY2FydCBlbnRyaWVzIGRvbid0IGhhdmUgYW55IHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgd2UgY291bGQgdXNlIGluIEFuZ3VsYXIgYHRyYWNrQnlgLlxuICAgICAgLy8gU28gd2UgdXBkYXRlIGVhY2ggYXJyYXkgZWxlbWVudCB0byB0aGUgbmV3IG9iamVjdCBvbmx5IHdoZW4gaXQncyBhbnkgZGlmZmVyZW50IHRvIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWF4KGl0ZW1zLmxlbmd0aCwgdGhpcy5faXRlbXMubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLl9pdGVtcz8uW2ldKSAhPT0gSlNPTi5zdHJpbmdpZnkoaXRlbXNbaV0pKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2l0ZW1zW2ldICYmIHRoaXMuZm9ybSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtLnJlbW92ZUNvbnRyb2wodGhpcy5nZXRDb250cm9sTmFtZSh0aGlzLl9pdGVtc1tpXSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWl0ZW1zW2ldKSB7XG4gICAgICAgICAgICB0aGlzLl9pdGVtcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1zW2ldID0gaXRlbXNbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZm9ybSBtb2RlbHMgZm9yIGxpc3QgaXRlbXNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuX2l0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xOYW1lID0gdGhpcy5nZXRDb250cm9sTmFtZShpdGVtKTtcbiAgICAgIGNvbnN0IGdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIGVudHJ5TnVtYmVyOiBuZXcgRm9ybUNvbnRyb2woaXRlbS5lbnRyeU51bWJlciksXG4gICAgICAgIHF1YW50aXR5OiBuZXcgRm9ybUNvbnRyb2woaXRlbS5xdWFudGl0eSwgeyB1cGRhdGVPbjogJ2JsdXInIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGNvbnRyb2xOYW1lLCBncm91cCk7XG5cbiAgICAgIC8vIElmIHdlIGRpc2FibGUgZm9ybSBncm91cCBiZWZvcmUgYWRkaW5nLCBkaXNhYmxlZCBzdGF0dXMgd2lsbCByZXNldFxuICAgICAgLy8gV2hpY2ggZm9yY2VzIHVzIHRvIGRpc2FibGUgY29udHJvbCBhZnRlciBpbmNsdWRpbmcgdG8gZm9ybSBvYmplY3RcbiAgICAgIGlmICghaXRlbS51cGRhdGVhYmxlIHx8IHRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2NvbnRyb2xOYW1lXS5kaXNhYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q29udHJvbE5hbWUoaXRlbTogT3JkZXJFbnRyeSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0uZW50cnlOdW1iZXIudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJlbW92ZUVudHJ5KGl0ZW06IE9yZGVyRW50cnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RpdmVDYXJ0U2VydmljZSAmJiB0aGlzLm9wdGlvbnMuaXNTYXZlRm9yTGF0ZXIpIHtcbiAgICAgIHRoaXMuc2VsZWN0aXZlQ2FydFNlcnZpY2UucmVtb3ZlRW50cnkoaXRlbSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNhcnRJZCAmJiB0aGlzLnVzZXJJZCkge1xuICAgICAgdGhpcy5tdWx0aUNhcnRTZXJ2aWNlPy5yZW1vdmVFbnRyeShcbiAgICAgICAgdGhpcy51c2VySWQsXG4gICAgICAgIHRoaXMuY2FydElkLFxuICAgICAgICBpdGVtLmVudHJ5TnVtYmVyXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZUNhcnRTZXJ2aWNlLnJlbW92ZUVudHJ5KGl0ZW0pO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMuZ2V0Q29udHJvbE5hbWUoaXRlbSldO1xuICB9XG5cbiAgZ2V0Q29udHJvbChpdGVtOiBPcmRlckVudHJ5KTogT2JzZXJ2YWJsZTxGb3JtR3JvdXA+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCh0aGlzLmdldENvbnRyb2xOYW1lKGl0ZW0pKS52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZGVwcmVjYXRlZFxuICAgICAgc3RhcnRXaXRoKG51bGwpLFxuICAgICAgdGFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS51cGRhdGVhYmxlICYmIHZhbHVlICYmICF0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aXZlQ2FydFNlcnZpY2UgJiYgdGhpcy5vcHRpb25zLmlzU2F2ZUZvckxhdGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGl2ZUNhcnRTZXJ2aWNlLnVwZGF0ZUVudHJ5KFxuICAgICAgICAgICAgICB2YWx1ZS5lbnRyeU51bWJlcixcbiAgICAgICAgICAgICAgdmFsdWUucXVhbnRpdHlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcnRJZCAmJiB0aGlzLnVzZXJJZCkge1xuICAgICAgICAgICAgdGhpcy5tdWx0aUNhcnRTZXJ2aWNlPy51cGRhdGVFbnRyeShcbiAgICAgICAgICAgICAgdGhpcy51c2VySWQsXG4gICAgICAgICAgICAgIHRoaXMuY2FydElkLFxuICAgICAgICAgICAgICB2YWx1ZS5lbnRyeU51bWJlcixcbiAgICAgICAgICAgICAgdmFsdWUucXVhbnRpdHlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2FydFNlcnZpY2UudXBkYXRlRW50cnkoXG4gICAgICAgICAgICAgIHZhbHVlLmVudHJ5TnVtYmVyLFxuICAgICAgICAgICAgICB2YWx1ZS5xdWFudGl0eVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgbWFwKCgpID0+IDxGb3JtR3JvdXA+dGhpcy5mb3JtLmdldCh0aGlzLmdldENvbnRyb2xOYW1lKGl0ZW0pKSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJoYXNIZWFkZXJcIiBjbGFzcz1cImQtbm9uZSBkLW1kLWJsb2NrIGQtbGctYmxvY2sgZC14bC1ibG9ja1wiPlxuICA8ZGl2IGNsYXNzPVwiY3gtaXRlbS1saXN0LWhlYWRlciByb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3gtaXRlbS1saXN0LWRlc2MgY29sLW1kLTUgY29sLWxnLTUgY29sLXhsLTZcIj5cbiAgICAgIHt7ICdjYXJ0SXRlbXMuZGVzY3JpcHRpb24nIHwgY3hUcmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3gtaXRlbS1saXN0LXByaWNlIGNvbC1tZC0zIGNvbC1sZy0yIGNvbC14bC0yXCI+XG4gICAgICB7eyAnY2FydEl0ZW1zLml0ZW1QcmljZScgfCBjeFRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjeC1pdGVtLWxpc3QtcXR5IGNvbC1tZC0yIGNvbC1sZy0zIGNvbC14bC0yXCI+XG4gICAgICB7eyAnY2FydEl0ZW1zLnF1YW50aXR5JyB8IGN4VHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9ucy5pc1NhdmVGb3JMYXRlcjsgZWxzZSB0b3RhbEhlYWRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImN4LWl0ZW0tbGlzdC10b3RhbCBjb2wtbWQtMiBjb2wtbGctMiBjb2wteGwtMlwiPlxuICAgICAgICB7eyAnc2F2ZUZvckxhdGVySXRlbXMuc3RvY2snIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiY3gtaXRlbS1saXN0LXJvd1wiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgaSA9IGluZGV4XCI+XG4gIDxkaXZcbiAgICAqbmdJZj1cImdldENvbnRyb2woaXRlbSkgfCBhc3luYyBhcyBjb250cm9sXCJcbiAgICBjbGFzcz1cImN4LWl0ZW0tbGlzdC1pdGVtc1wiXG4gICAgW2NsYXNzLmlzLWNoYW5nZWRdPVwiY29udHJvbC5nZXQoJ3F1YW50aXR5JykuZGlzYWJsZWRcIlxuICA+XG4gICAgPGN4LWNhcnQtaXRlbVxuICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICBbcXVhbnRpdHlDb250cm9sXT1cImNvbnRyb2wuZ2V0KCdxdWFudGl0eScpXCJcbiAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICBbcHJvbW90aW9uTG9jYXRpb25dPVwicHJvbW90aW9uTG9jYXRpb25cIlxuICAgICAgW29wdGlvbnNdPVwib3B0aW9uc1wiXG4gICAgPlxuICAgIDwvY3gtY2FydC1pdGVtPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3RvdGFsSGVhZGVyPlxuICA8ZGl2IGNsYXNzPVwiY3gtaXRlbS1saXN0LXRvdGFsIGNvbC1tZC0yIGNvbC1sZy0yIGNvbC14bC0yXCI+XG4gICAge3sgJ2NhcnRJdGVtcy50b3RhbCcgfCBjeFRyYW5zbGF0ZSB9fVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=