angular-bootstrap-italia
Version:
<p align="center"> <h1 align="center">Bootstrap Italia + Angular 9</h1>
227 lines • 35.6 kB
JavaScript
import { __decorate, __read, __spread } from "tslib";
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
// Components
import { Validators } from '@angular/forms';
// Services
import { DynamicFormControlService } from '../dynamic-form/dynamic-form-control.service';
var StepperComponent = /** @class */ (function () {
function StepperComponent(qcs) {
this.qcs = qcs;
this.fromValueChange = new EventEmitter();
this.submitedEvent = new EventEmitter();
this.latitude = 42.50;
this.longitude = 12.50;
}
StepperComponent.prototype.ngOnInit = function () {
var _this = this;
var _a, _b, _c, _d;
this.widthExp = 100 / this.stepElements.length;
// step a 1
this.currentStepIndex = 1;
this.validSteps = [];
this.touchedSteps = [];
this.formRows = [].concat.apply([], __spread(this.stepElements.map(function (e) { return e.fromRows; })));
var elements = [].concat.apply([], __spread(this.formRows.map(function (e) { return e.items; })));
this.stepForm = this.qcs.toFormGroup(elements);
this.mapId = this.getMapId();
var mapFormRows = this.stepElements.find(function (elem) { return elem.mapId; }).fromRows;
this.mapFormFields = [].concat.apply([], __spread(mapFormRows.map(function (e) { return e.items; })));
// Form Latiture
(_a = this.stepForm.controls.latitude) === null || _a === void 0 ? void 0 : _a.setValue(42.50);
this.latSub = (_b = this.stepForm.controls.latitude) === null || _b === void 0 ? void 0 : _b.valueChanges.pipe(debounceTime(500), distinctUntilChanged()).subscribe(function (newVal) {
_this.latitude = newVal;
});
// Form Longitude
(_c = this.stepForm.controls.longitude) === null || _c === void 0 ? void 0 : _c.setValue(12.50);
this.lngSub = (_d = this.stepForm.controls.longitude) === null || _d === void 0 ? void 0 : _d.valueChanges.pipe(debounceTime(500), distinctUntilChanged()).subscribe(function (newVal) {
_this.longitude = newVal;
});
this.formStateSubscription = this.stepForm.valueChanges
.subscribe(function (newValue) {
var _a;
var mapFieldsKeys = _this.mapFormFields.map(function (e) { return e.key; });
var mapBoxingValues = [];
mapFieldsKeys.forEach(function (key) {
var fieldValue = _this.stepForm.value[key];
if (typeof fieldValue === 'object') {
mapBoxingValues.push(_this.stepForm.value[key]);
}
if (fieldValue === null || fieldValue === void 0 ? void 0 : fieldValue.shapelight) { // TODO: Fix name
_this.mapShapePolygon = fieldValue.shapelight;
}
});
if ((mapBoxingValues === null || mapBoxingValues === void 0 ? void 0 : mapBoxingValues.length) > 0) {
_this.mapBboxPolygon = (_a = mapBoxingValues[mapBoxingValues.length - 1]) === null || _a === void 0 ? void 0 : _a.boundingbox; // TODO: Fix Name
}
_this.fromValueChange.emit(newValue);
});
};
StepperComponent.prototype.ngOnDestroy = function () {
if (this.formStateSubscription) {
this.formStateSubscription.unsubscribe();
}
if (this.latSub) {
this.latSub.unsubscribe();
}
if (this.lngSub) {
this.lngSub.unsubscribe();
}
};
Object.defineProperty(StepperComponent.prototype, "stepRows", {
get: function () {
var _this = this;
var rows = this.stepElements.find(function (e) { return e.index === _this.currentStepIndex; }).fromRows;
return rows;
},
enumerable: true,
configurable: true
});
StepperComponent.prototype.getItems = function (formRow) {
var _this = this;
var items = formRow.items.filter(function (item) {
var _a, _b, _c, _d, _e, _f, _g;
var showCondition = false;
// Se tipo semplice
if (((_a = item.parentShowCondition) === null || _a === void 0 ? void 0 : _a.parentKey) &&
((_b = item.parentShowCondition) === null || _b === void 0 ? void 0 : _b.parentValue) === _this.stepForm.get(item.parentShowCondition.parentKey).value) {
showCondition = true;
}
// Se oggetto
if (((_c = item.parentShowCondition) === null || _c === void 0 ? void 0 : _c.parentKey) && typeof ((_d = item.parentShowCondition) === null || _d === void 0 ? void 0 : _d.parentValue) === 'object'
// tslint:disable-next-line: max-line-length
&& JSON.stringify((_e = item.parentShowCondition) === null || _e === void 0 ? void 0 : _e.parentValue) === JSON.stringify(_this.stepForm.get(item.parentShowCondition.parentKey).value)) {
showCondition = true;
}
if (!item.parentShowCondition || showCondition) {
(_f = _this.stepForm.get(item.key)) === null || _f === void 0 ? void 0 : _f.setValidators(Validators.required);
return item;
}
else {
(_g = _this.stepForm.get(item.key)) === null || _g === void 0 ? void 0 : _g.setValidators(null);
}
});
return items;
};
StepperComponent.prototype.getPratentField = function (itemKey) {
var elements = [].concat.apply([], __spread(this.formRows.map(function (e) { return e.items; })));
return elements.find(function (e) { return e.parentFieldKey === itemKey; });
};
StepperComponent.prototype.isValidStep = function (stepIndex) {
var step = this.validSteps.find(function (e) { return e === stepIndex; });
if (step) {
return true;
}
return false;
};
StepperComponent.prototype.setValidStep = function (stepIndex) {
// ritorna true se tutti campi di quello step sono validi altrimenti false
// prendi le chiavi dei campi di quel particolare step
var rowsItems = this.stepElements
.find(function (e) { return e.index === stepIndex; }).fromRows
.map(function (e) { return e.items; });
var rowsElements = [].concat.apply([], __spread(rowsItems));
var fieldsKeys = rowsElements.map(function (e) { return e.key; });
var controls = this.stepForm.controls;
var filtered = Object.keys(controls)
.filter(function (key) { return fieldsKeys.includes(key) && controls[key].valid; })
.reduce(function (obj, key) {
obj[key] = controls[key];
return obj;
}, {});
if (arraysEqual(fieldsKeys, Object.keys(filtered))) {
var index = this.validSteps.indexOf(stepIndex, 0);
if (index === -1) {
this.validSteps.push(stepIndex);
}
}
else {
var index = this.validSteps.indexOf(stepIndex, 0);
if (index > -1) {
this.validSteps.splice(index, 1);
}
}
};
StepperComponent.prototype.isTouchedStep = function (stepIndex) {
var step = this.touchedSteps.find(function (e) { return e === stepIndex; });
if (step) {
return true;
}
return false;
};
StepperComponent.prototype.prevStep = function () {
this.stepForm.updateValueAndValidity();
this.setValidStep(this.currentStepIndex);
this.touchedSteps.push(this.currentStepIndex);
this.currentStepIndex--;
};
StepperComponent.prototype.nextStep = function () {
this.stepForm.updateValueAndValidity();
this.setValidStep(this.currentStepIndex);
this.touchedSteps.push(this.currentStepIndex);
this.currentStepIndex++;
};
StepperComponent.prototype.onSubmit = function () {
this.submitedEvent.emit(this.stepForm.getRawValue());
};
StepperComponent.prototype.stepHaveMap = function (stepIndex) {
var step = this.stepElements.find(function (e) { return e.index === stepIndex; });
if (step && step.mapId) {
// const fromElements = [].concat(...step.fromRows.map(e => e.items));
// const latitudeControl = fromElements.find(e => e.key === this.latitude);
// const longitudeControl = fromElements.find(e => e.key === this.longitude);
return true;
}
return false;
};
StepperComponent.prototype.getMapGeojson = function (geoJson) {
this.mapGeoJson = geoJson;
console.log(geoJson);
};
StepperComponent.prototype.getMapId = function () {
var step = this.stepElements.find(function (e) { return e.mapId; });
if (step && step.mapId) {
return step.mapId;
}
return null;
};
StepperComponent.ctorParameters = function () { return [
{ type: DynamicFormControlService }
]; };
__decorate([
Input()
], StepperComponent.prototype, "stepElements", void 0);
__decorate([
Output()
], StepperComponent.prototype, "fromValueChange", void 0);
__decorate([
Output()
], StepperComponent.prototype, "submitedEvent", void 0);
StepperComponent = __decorate([
Component({
selector: 'lib-stepper',
template: "<div class=\"steppers\">\r\n <ul class=\"steppers-header custom-stepper-header\">\r\n\r\n <li *ngFor=\"let step of stepElements\"\r\n [ngClass]=\"{'active': step.index === currentStepIndex, 'confirmed': step.index !== currentStepIndex && isValidStep(step.index)}\"\r\n [ngStyle]=\"{'width': widthExp + '%'}\">\r\n {{ step.label }}\r\n <svg class=\"icon icon-success steppers-success\" *ngIf=\"step.index !== currentStepIndex && isValidStep(step.index)\">\r\n <use xlink:href=\"./assets/bootstrap-italia/svg/sprite.svg#it-check\"></use>\r\n </svg>\r\n <svg class=\"icon icon-warning steppers-success\" *ngIf=\"step.index !== currentStepIndex && !isValidStep(step.index) && isTouchedStep(step.index)\">\r\n <use xlink:href=\"./assets/bootstrap-italia/svg/sprite.svg#it-info-circle\"></use>\r\n </svg>\r\n <span class=\"sr-only\" *ngIf=\"step.index === currentStepIndex\">Attivo</span>\r\n <span class=\"sr-only\" *ngIf=\"step.index !== currentStepIndex && isValidStep(step.index)\">Confermato</span>\r\n </li>\r\n\r\n <li class=\"steppers-index\" aria-hidden=\"true\">{{ currentStepIndex }}/{{ stepElements.length }}</li>\r\n\r\n </ul>\r\n <div class=\"align-middle custom-stepper\" aria-live=\"polite\">\r\n <form [formGroup]=\"stepForm\">\r\n <div class=\"form-row\" *ngFor=\"let row of stepRows\">\r\n <div class=\"custom-form-group\" *ngFor=\"let item of getItems(row)\" [ngClass]=\"item.class\">\r\n <lib-dynamic-form-element [field]=\"item\" [parentField]=\"getPratentField(item.parentFieldKey)\" [form]=\"stepForm\"></lib-dynamic-form-element>\r\n </div>\r\n </div>\r\n <div class=\"form-map\" *ngIf=\"stepHaveMap(currentStepIndex)\">\r\n <lib-leaflet-map [latitude]=\"latitude\" [longitude]=\"longitude\" [bboxPolygon]=\"mapBboxPolygon\" [shapePolygon]=\"mapShapePolygon\" (geoJson)=\"getMapGeojson($event)\" [enableEdit]=\"true\"></lib-leaflet-map>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <nav class=\"steppers-nav custom-stepper-nav\">\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm steppers-btn-prev\" (click)=\"prevStep()\" [disabled]=\"currentStepIndex === 1\">\r\n <svg class=\"icon icon-primary\">\r\n <use xlink:href=\"./assets/bootstrap-italia/svg/sprite.svg#it-chevron-left\"></use>\r\n </svg>\r\n Indietro\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary btn-sm steppers-btn-save\" (click)=\"onSubmit()\" [disabled]=\"!stepForm.valid\">Salva</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm steppers-btn-next\" (click)=\"nextStep()\" [disabled]=\"currentStepIndex === stepElements.length\">Avanti\r\n <svg class=\"icon icon-primary\">\r\n <use xlink:href=\"./assets/bootstrap-italia/svg/sprite.svg#it-chevron-right\"></use>\r\n </svg>\r\n </button>\r\n </nav>\r\n</div>\r\n",
styles: [".custom-stepper{min-height:20em;padding-top:3em;padding-left:1em;padding-right:1em;justify-content:center;align-items:center;color:#333}@media (min-width:992px){.custom-stepper{min-height:22em}.custom-stepper .form-map{margin-bottom:3em}.custom-stepper-header{box-shadow:0 10px 40px -30px grey}.custom-stepper-nav{box-shadow:0 -15px 30px -25px grey}.custom-form-group{min-height:5em}}"]
})
], StepperComponent);
return StepperComponent;
}());
export { StepperComponent };
function arraysEqual(a, b) {
if (a === b) {
return true;
}
if (a == null || b == null) {
return false;
}
if (a.length !== b.length) {
return false;
}
for (var i = 0; i < a.length; ++i) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWJvb3RzdHJhcC1pdGFsaWEvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9zdGVwcGVyL3N0ZXBwZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYSxNQUFNLEVBQUUsWUFBWSxFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUNuSCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsYUFBYTtBQUNiLE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsV0FBVztBQUNYLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBZXpGO0lBNEJFLDBCQUFvQixHQUE4QjtRQUE5QixRQUFHLEdBQUgsR0FBRyxDQUEyQjtRQXhCeEMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBQ2hELGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVc3QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGNBQVMsR0FBRyxLQUFLLENBQUM7SUFXb0MsQ0FBQztJQUV2RCxtQ0FBUSxHQUFSO1FBQUEsaUJBd0RDOztRQXZEQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUUvQyxXQUFXO1FBQ1gsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxNQUFNLE9BQVQsRUFBRSxXQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVB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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuLy8gQ29tcG9uZW50c1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuLy8gU2VydmljZXNcclxuaW1wb3J0IHsgRHluYW1pY0Zvcm1Db250cm9sU2VydmljZSB9IGZyb20gJy4uL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0tY29udHJvbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vLyBNb2RlbHNcclxuaW1wb3J0IHsgRm9ybVJvdyB9IGZyb20gJy4uL2Zvcm0vZm9ybS1yb3cnO1xyXG5pbXBvcnQgeyBGb3JtQmFzZSB9IGZyb20gJy4uL2Zvcm0vZm9ybS1iYXNlJztcclxuaW1wb3J0IHsgU3RlcHBlckVsZW1lbnQgfSBmcm9tICcuL3N0ZXBwZXItZWxlbWVudC5tb2RlbCc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItc3RlcHBlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXBwZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3N0ZXBwZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICAvLyBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RlcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgQElucHV0KCkgc3RlcEVsZW1lbnRzOiBTdGVwcGVyRWxlbWVudDxzdHJpbmc+W107XHJcblxyXG4gIEBPdXRwdXQoKSBmcm9tVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4oKTtcclxuICBAT3V0cHV0KCkgc3VibWl0ZWRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgd2lkdGhFeHA6IG51bWJlcjtcclxuICBjdXJyZW50U3RlcEluZGV4OiBudW1iZXI7IC8vIERpdmVudGEgSW5wdXQgLyBPdXRwdXRcclxuICB0b3VjaGVkU3RlcHM6IG51bWJlcltdO1xyXG4gIHZhbGlkU3RlcHM6IG51bWJlcltdO1xyXG4gIHN0ZXBGb3JtOiBGb3JtR3JvdXA7XHJcbiAgZm9ybVN0YXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIC8vIE1hcCBEZXRhbGlzXHJcbiAgbWFwSWQ6IHN0cmluZztcclxuICBsYXRpdHVkZSA9IDQyLjUwO1xyXG4gIGxvbmdpdHVkZSA9IDEyLjUwO1xyXG4gIGxhdFN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIGxuZ1N1YjogU3Vic2NyaXB0aW9uO1xyXG4gIG1hcEdlb0pzb246IGFueTtcclxuICBtYXBCYm94UG9seWdvbjogYW55O1xyXG4gIG1hcFNoYXBlUG9seWdvbjogYW55O1xyXG4gIG1hcEZvcm1GaWVsZHM6IEZvcm1CYXNlPGFueT5bXTtcclxuXHJcbiAgLy8gRm9ybSBlbGVtZW50c1xyXG4gIGZvcm1Sb3dzOiBGb3JtUm93PHN0cmluZz5bXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBxY3M6IER5bmFtaWNGb3JtQ29udHJvbFNlcnZpY2UpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMud2lkdGhFeHAgPSAxMDAgLyB0aGlzLnN0ZXBFbGVtZW50cy5sZW5ndGg7XHJcblxyXG4gICAgLy8gc3RlcCBhIDFcclxuICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCA9IDE7XHJcbiAgICB0aGlzLnZhbGlkU3RlcHMgPSBbXTtcclxuICAgIHRoaXMudG91Y2hlZFN0ZXBzID0gW107XHJcblxyXG4gICAgdGhpcy5mb3JtUm93cyA9IFtdLmNvbmNhdCguLi50aGlzLnN0ZXBFbGVtZW50cy5tYXAoZSA9PiBlLmZyb21Sb3dzKSk7XHJcblxyXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXS5jb25jYXQoLi4udGhpcy5mb3JtUm93cy5tYXAoZSA9PiBlLml0ZW1zKSk7XHJcblxyXG4gICAgdGhpcy5zdGVwRm9ybSA9IHRoaXMucWNzLnRvRm9ybUdyb3VwKGVsZW1lbnRzKTtcclxuXHJcbiAgICB0aGlzLm1hcElkID0gdGhpcy5nZXRNYXBJZCgpO1xyXG4gICAgY29uc3QgbWFwRm9ybVJvd3MgPSB0aGlzLnN0ZXBFbGVtZW50cy5maW5kKGVsZW0gPT4gZWxlbS5tYXBJZCkuZnJvbVJvd3M7XHJcbiAgICB0aGlzLm1hcEZvcm1GaWVsZHMgPSBbXS5jb25jYXQoLi4ubWFwRm9ybVJvd3MubWFwKGUgPT4gZS5pdGVtcykpO1xyXG5cclxuICAgIC8vIEZvcm0gTGF0aXR1cmVcclxuICAgIHRoaXMuc3RlcEZvcm0uY29udHJvbHMubGF0aXR1ZGU/LnNldFZhbHVlKDQyLjUwKTtcclxuICAgIHRoaXMubGF0U3ViID0gdGhpcy5zdGVwRm9ybS5jb250cm9scy5sYXRpdHVkZT8udmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxyXG4gICAgICAuc3Vic2NyaWJlKG5ld1ZhbCA9PiB7XHJcbiAgICAgICAgdGhpcy5sYXRpdHVkZSA9IG5ld1ZhbDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8gRm9ybSBMb25naXR1ZGVcclxuICAgIHRoaXMuc3RlcEZvcm0uY29udHJvbHMubG9uZ2l0dWRlPy5zZXRWYWx1ZSgxMi41MCk7XHJcbiAgICB0aGlzLmxuZ1N1YiA9IHRoaXMuc3RlcEZvcm0uY29udHJvbHMubG9uZ2l0dWRlPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDUwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXHJcbiAgICAgIC5zdWJzY3JpYmUobmV3VmFsID0+IHtcclxuICAgICAgICB0aGlzLmxvbmdpdHVkZSA9IG5ld1ZhbDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5mb3JtU3RhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnN0ZXBGb3JtLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAuc3Vic2NyaWJlKG5ld1ZhbHVlID0+IHtcclxuICAgICAgICBjb25zdCBtYXBGaWVsZHNLZXlzID0gdGhpcy5tYXBGb3JtRmllbGRzLm1hcChlID0+IGUua2V5KTtcclxuICAgICAgICBjb25zdCBtYXBCb3hpbmdWYWx1ZXMgPSBbXTtcclxuXHJcbiAgICAgICAgbWFwRmllbGRzS2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5zdGVwRm9ybS52YWx1ZVtrZXldO1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICBtYXBCb3hpbmdWYWx1ZXMucHVzaCh0aGlzLnN0ZXBGb3JtLnZhbHVlW2tleV0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChmaWVsZFZhbHVlPy5zaGFwZWxpZ2h0KSB7ICAvLyBUT0RPOiBGaXggbmFtZVxyXG4gICAgICAgICAgICB0aGlzLm1hcFNoYXBlUG9seWdvbiA9IGZpZWxkVmFsdWUuc2hhcGVsaWdodDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKG1hcEJveGluZ1ZhbHVlcz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5tYXBCYm94UG9seWdvbiA9IG1hcEJveGluZ1ZhbHVlc1ttYXBCb3hpbmdWYWx1ZXMubGVuZ3RoIC0gMV0/LmJvdW5kaW5nYm94OyAvLyBUT0RPOiBGaXggTmFtZVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mcm9tVmFsdWVDaGFuZ2UuZW1pdChuZXdWYWx1ZSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtU3RhdGVTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5mb3JtU3RhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxhdFN1Yikge1xyXG4gICAgICB0aGlzLmxhdFN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubG5nU3ViKSB7XHJcbiAgICAgIHRoaXMubG5nU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc3RlcFJvd3MoKTogRm9ybVJvdzxzdHJpbmc+W10ge1xyXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuc3RlcEVsZW1lbnRzLmZpbmQoZSA9PiBlLmluZGV4ID09PSB0aGlzLmN1cnJlbnRTdGVwSW5kZXgpLmZyb21Sb3dzO1xyXG4gICAgcmV0dXJuIHJvd3M7XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtcyhmb3JtUm93OiBGb3JtUm93PHN0cmluZz4pIHtcclxuICAgIGNvbnN0IGl0ZW1zID0gZm9ybVJvdy5pdGVtcy5maWx0ZXIoaXRlbSA9PiB7XHJcbiAgICAgIGxldCBzaG93Q29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgIC8vIFNlIHRpcG8gc2VtcGxpY2VcclxuICAgICAgaWYgKGl0ZW0ucGFyZW50U2hvd0NvbmRpdGlvbj8ucGFyZW50S2V5ICYmXHJcbiAgICAgICAgaXRlbS5wYXJlbnRTaG93Q29uZGl0aW9uPy5wYXJlbnRWYWx1ZSA9PT0gdGhpcy5zdGVwRm9ybS5nZXQoaXRlbS5wYXJlbnRTaG93Q29uZGl0aW9uLnBhcmVudEtleSkudmFsdWUpIHtcclxuICAgICAgICBzaG93Q29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU2Ugb2dnZXR0b1xyXG4gICAgICBpZiAoaXRlbS5wYXJlbnRTaG93Q29uZGl0aW9uPy5wYXJlbnRLZXlcclxuICAgICAgICAmJiB0eXBlb2YgaXRlbS5wYXJlbnRTaG93Q29uZGl0aW9uPy5wYXJlbnRWYWx1ZSA9PT0gJ29iamVjdCdcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICAgICYmIEpTT04uc3RyaW5naWZ5KGl0ZW0ucGFyZW50U2hvd0NvbmRpdGlvbj8ucGFyZW50VmFsdWUpID09PSBKU09OLnN0cmluZ2lmeSh0aGlzLnN0ZXBGb3JtLmdldChpdGVtLnBhcmVudFNob3dDb25kaXRpb24ucGFyZW50S2V5KS52YWx1ZSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgc2hvd0NvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghaXRlbS5wYXJlbnRTaG93Q29uZGl0aW9uIHx8IHNob3dDb25kaXRpb24pIHtcclxuICAgICAgICB0aGlzLnN0ZXBGb3JtLmdldChpdGVtLmtleSk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdGVwRm9ybS5nZXQoaXRlbS5rZXkpPy5zZXRWYWxpZGF0b3JzKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBpdGVtcztcclxuICB9XHJcblxyXG4gIGdldFByYXRlbnRGaWVsZChpdGVtS2V5OiBzdHJpbmcpOiBGb3JtQmFzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IGVsZW1lbnRzID0gW10uY29uY2F0KC4uLnRoaXMuZm9ybVJvd3MubWFwKGUgPT4gZS5pdGVtcykpO1xyXG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQoZSA9PiBlLnBhcmVudEZpZWxkS2V5ID09PSBpdGVtS2V5KTtcclxuICB9XHJcblxyXG4gIGlzVmFsaWRTdGVwKHN0ZXBJbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy52YWxpZFN0ZXBzLmZpbmQoZSA9PiBlID09PSBzdGVwSW5kZXgpO1xyXG4gICAgaWYgKHN0ZXApIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNldFZhbGlkU3RlcChzdGVwSW5kZXg6IG51bWJlcikge1xyXG4gICAgLy8gcml0b3JuYSB0cnVlIHNlIHR1dHRpIGNhbXBpIGRpIHF1ZWxsbyBzdGVwIHNvbm8gdmFsaWRpIGFsdHJpbWVudGkgZmFsc2VcclxuICAgIC8vIHByZW5kaSBsZSBjaGlhdmkgZGVpIGNhbXBpIGRpIHF1ZWwgcGFydGljb2xhcmUgc3RlcFxyXG4gICAgY29uc3Qgcm93c0l0ZW1zID0gdGhpcy5zdGVwRWxlbWVudHNcclxuICAgICAgLmZpbmQoZSA9PiBlLmluZGV4ID09PSBzdGVwSW5kZXgpLmZyb21Sb3dzXHJcbiAgICAgIC5tYXAoZSA9PiBlLml0ZW1zKTtcclxuICAgIGNvbnN0IHJvd3NFbGVtZW50cyA9IFtdLmNvbmNhdCguLi5yb3dzSXRlbXMpO1xyXG4gICAgY29uc3QgZmllbGRzS2V5cyA9IHJvd3NFbGVtZW50cy5tYXAoZSA9PiBlLmtleSk7XHJcbiAgICBjb25zdCBjb250cm9scyA9IHRoaXMuc3RlcEZvcm0uY29udHJvbHM7XHJcblxyXG4gICAgY29uc3QgZmlsdGVyZWQgPSBPYmplY3Qua2V5cyhjb250cm9scylcclxuICAgICAgLmZpbHRlcihrZXkgPT4gZmllbGRzS2V5cy5pbmNsdWRlcyhrZXkpICYmIGNvbnRyb2xzW2tleV0udmFsaWQpXHJcbiAgICAgIC5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgb2JqW2tleV0gPSBjb250cm9sc1trZXldO1xyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgIH0sIHt9KTtcclxuXHJcbiAgICBpZiAoYXJyYXlzRXF1YWwoZmllbGRzS2V5cywgT2JqZWN0LmtleXMoZmlsdGVyZWQpKSkge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMudmFsaWRTdGVwcy5pbmRleE9mKHN0ZXBJbmRleCwgMCk7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICB0aGlzLnZhbGlkU3RlcHMucHVzaChzdGVwSW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMudmFsaWRTdGVwcy5pbmRleE9mKHN0ZXBJbmRleCwgMCk7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy52YWxpZFN0ZXBzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzVG91Y2hlZFN0ZXAoc3RlcEluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnRvdWNoZWRTdGVwcy5maW5kKGUgPT4gZSA9PT0gc3RlcEluZGV4KTtcclxuICAgIGlmIChzdGVwKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcmV2U3RlcCgpIHtcclxuICAgIHRoaXMuc3RlcEZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5zZXRWYWxpZFN0ZXAodGhpcy5jdXJyZW50U3RlcEluZGV4KTtcclxuICAgIHRoaXMudG91Y2hlZFN0ZXBzLnB1c2godGhpcy5jdXJyZW50U3RlcEluZGV4KTtcclxuICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleC0tO1xyXG4gIH1cclxuXHJcbiAgbmV4dFN0ZXAoKSB7XHJcbiAgICB0aGlzLnN0ZXBGb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuc2V0VmFsaWRTdGVwKHRoaXMuY3VycmVudFN0ZXBJbmRleCk7XHJcbiAgICB0aGlzLnRvdWNoZWRTdGVwcy5wdXNoKHRoaXMuY3VycmVudFN0ZXBJbmRleCk7XHJcbiAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXgrKztcclxuICB9XHJcblxyXG4gIG9uU3VibWl0KCkge1xyXG4gICAgdGhpcy5zdWJtaXRlZEV2ZW50LmVtaXQodGhpcy5zdGVwRm9ybS5nZXRSYXdWYWx1ZSgpKTtcclxuICB9XHJcblxyXG4gIHN0ZXBIYXZlTWFwKHN0ZXBJbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwRWxlbWVudHMuZmluZChlID0+IGUuaW5kZXggPT09IHN0ZXBJbmRleCk7XHJcbiAgICBpZiAoc3RlcCAmJiBzdGVwLm1hcElkKSB7XHJcbiAgICAgIC8vIGNvbnN0IGZyb21FbGVtZW50cyA9IFtdLmNvbmNhdCguLi5zdGVwLmZyb21Sb3dzLm1hcChlID0+IGUuaXRlbXMpKTtcclxuICAgICAgLy8gY29uc3QgbGF0aXR1ZGVDb250cm9sID0gZnJvbUVsZW1lbnRzLmZpbmQoZSA9PiBlLmtleSA9PT0gdGhpcy5sYXRpdHVkZSk7XHJcbiAgICAgIC8vIGNvbnN0IGxvbmdpdHVkZUNvbnRyb2wgPSBmcm9tRWxlbWVudHMuZmluZChlID0+IGUua2V5ID09PSB0aGlzLmxvbmdpdHVkZSk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWFwR2VvanNvbihnZW9Kc29uOiBhbnkpIHtcclxuICAgIHRoaXMubWFwR2VvSnNvbiA9IGdlb0pzb247XHJcbiAgICBjb25zb2xlLmxvZyhnZW9Kc29uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TWFwSWQoKSB7XHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwRWxlbWVudHMuZmluZChlID0+IGUubWFwSWQpO1xyXG4gICAgaWYgKHN0ZXAgJiYgc3RlcC5tYXBJZCkge1xyXG4gICAgICByZXR1cm4gc3RlcC5tYXBJZDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFycmF5c0VxdWFsKGEsIGIpIHtcclxuICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZTsgfVxyXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkge1xyXG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgfVxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcbiJdfQ==