UNPKG

@hxui/angular

Version:

An Angular library based on the [HXUI design system](https://hxui.io).

170 lines 28.7 kB
import { Component, EventEmitter, Input, Output, } from '@angular/core'; import { FormBuilder, Validators } from '@angular/forms'; import moment from 'moment'; import { Subscription } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@angular/common"; export class DatepickerIntervalComponent { constructor(_fb) { this._fb = _fb; this.durationOptions = ['day', 'week', 'month', 'year']; this.duration = 'days'; this.increment = 0; this.value$ = new Subscription(); this.update = new EventEmitter(); this.cancel = new EventEmitter(); } ngOnInit() { // date selected from interval if (this.selectedInterval && this.selectedInterval.isSelectedFromInterval && this.selectedInterval.interval) { const intervalArr = this.selectedInterval.interval.split(' '); if (intervalArr && intervalArr.length > 1) { this.increment = parseInt(intervalArr[0], 10); this.duration = this.normaliseDurationString(intervalArr[1]); } // date is typed or calendar picker } else if (this.selectedDate) { const selected = moment(this.selectedDate); const today = moment().startOf('day'); const duration = 'days'; const daysBetween = selected.diff(today, duration); if (daysBetween && daysBetween > 0) { this.increment = daysBetween; this.duration = duration; } } this.onSelectoptions(this.increment, this.duration); this.form = this._fb.group({ number: [this.increment, Validators.min(0)], duration: [this.duration], }); this.onValueChanges(); } ngOnDestroy() { this.value$.unsubscribe(); } onValueChanges() { this.value$ = this.form.valueChanges.subscribe(val => { this.onSelectoptions(val.number, val.duration); }); } /** on cancel of interval form */ onCancel() { this.cancel.emit(); } onSelectoptions(numberValue, durationValue) { this.text = moment().add(numberValue, durationValue); this.dateLabel = this.text.format('ddd DD/MM/YYYY'); this._dueDatestring = this.text.format('YYYY-MM-DD'); } /** on submission of interval form */ onChoose($event) { $event.preventDefault(); // check form is valid if (this.form.valid) { const intervalSubmitted = this.form.value.number.toString() + ' ' + this.normaliseDurationString(this.form.value.duration, 'optional'); const dateSubmitted = new Date(this._dueDatestring); const result = { interval: intervalSubmitted, isSelectedFromInterval: true, date: dateSubmitted, }; // emit result this.update.emit(result); } } /** normalise duration string */ normaliseDurationString(duration, output = 'plural') { const singular = this.durationOptions; const plural = singular.map(val => val + 's'); const optional = singular.map(val => val + '(s)'); const current = currentFormat(duration); let result = [`${output}`][0] || 'days'; if (output === 'singular') { result = toSingular(duration); } else if (output === 'plural') { result = toPlural(duration); } else if (output === 'optional') { result = toOptional(duration); } return result; function currentFormat(str) { if (singular.includes(str)) { return 'singular'; } else if (plural.includes(str)) { return 'plural'; } else if (optional.includes(str)) { return 'optional'; } else { return undefined; } } function toSingular(str) { let result = singular[0]; if (current === 'singular') { result = str; } else if (current === 'plural') { result = str.replace('s', ''); } else if (current === 'optional') { result = str.replace('(s)', ''); } return result; } function toPlural(str) { let result = plural[0]; if (current === 'singular') { result = str + 's'; } else if (current === 'plural') { result = str; } else if (current === 'optional') { result = str.replace('(s)', 's'); } return result; } function toOptional(str) { let result = optional[0]; if (current === 'singular') { result = str + '(s)'; } else if (current === 'plural') { result = str.replace('s', '(s)'); } else if (current === 'optional') { result = str; } return result; } } } DatepickerIntervalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DatepickerIntervalComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); DatepickerIntervalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: DatepickerIntervalComponent, selector: "hxa-datepicker-interval", inputs: { selectedDate: "selectedDate", selectedInterval: "selectedInterval" }, outputs: { update: "update", cancel: "cancel" }, host: { classAttribute: "hx-card hxa-datepicker-interval" }, ngImport: i0, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onChoose($event)\">\r\n <section class=\"hxa-datepicker-interval__content\">\r\n <fieldset class=\"hxa-datepicker-interval__inputs\">\r\n <input\r\n type=\"number\"\r\n id=\"numberText\"\r\n class=\"hx-input\"\r\n formControlName=\"number\"\r\n min=\"0\"\r\n />\r\n\r\n <select id=\"durationText\" class=\"hx-input\" formControlName=\"duration\">\r\n <option *ngFor=\"let opt of durationOptions\" [value]=\"opt + 's'\">\r\n {{ opt + '(s)' }}\r\n </option>\r\n </select>\r\n\r\n <span>from today</span>\r\n </fieldset>\r\n\r\n <div class=\"hxa-datepicker-interval__output\">\r\n <span>will be </span>\r\n <span class=\"is-text-weight-bolder\">{{ dateLabel }}</span>\r\n </div>\r\n </section>\r\n\r\n <section class=\"hxa-datepicker-interval__footer\">\r\n <button class=\"hx-button\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"submit\" class=\"hx-button is-primary\">Select</button>\r\n </section>\r\n</form>\r\n", styles: [":host.hx-card{border:unset}:host.hx-card:hover,:host.hx-card.is-hovered{box-shadow:none}.hxa-datepicker-interval:host{display:flex;flex-direction:column;width:19rem;height:21rem}.hxa-datepicker-interval:host>form{display:flex;flex-direction:column;font-size:1rem;flex:1 1 auto}.hxa-datepicker-interval__content{display:flex;flex-direction:column;flex:1 1 auto;justify-content:center;padding:.75rem}.hxa-datepicker-interval__inputs{border:none;display:block;padding:0;margin:0 auto 1.25rem}.hxa-datepicker-interval__inputs .hx-input{display:inline-block;width:unset}.hxa-datepicker-interval__inputs .hx-input:first-child{width:2.5rem}.hxa-datepicker-interval__inputs .hx-input:not(:last-child){margin-right:1rem}.hxa-datepicker-interval__output{margin:0 auto}.hxa-datepicker-interval__footer{background-color:#f5f5f5;padding:.75rem;display:flex;justify-content:space-between}\n"], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DatepickerIntervalComponent, decorators: [{ type: Component, args: [{ selector: 'hxa-datepicker-interval', host: { class: 'hx-card hxa-datepicker-interval', }, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onChoose($event)\">\r\n <section class=\"hxa-datepicker-interval__content\">\r\n <fieldset class=\"hxa-datepicker-interval__inputs\">\r\n <input\r\n type=\"number\"\r\n id=\"numberText\"\r\n class=\"hx-input\"\r\n formControlName=\"number\"\r\n min=\"0\"\r\n />\r\n\r\n <select id=\"durationText\" class=\"hx-input\" formControlName=\"duration\">\r\n <option *ngFor=\"let opt of durationOptions\" [value]=\"opt + 's'\">\r\n {{ opt + '(s)' }}\r\n </option>\r\n </select>\r\n\r\n <span>from today</span>\r\n </fieldset>\r\n\r\n <div class=\"hxa-datepicker-interval__output\">\r\n <span>will be </span>\r\n <span class=\"is-text-weight-bolder\">{{ dateLabel }}</span>\r\n </div>\r\n </section>\r\n\r\n <section class=\"hxa-datepicker-interval__footer\">\r\n <button class=\"hx-button\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"submit\" class=\"hx-button is-primary\">Select</button>\r\n </section>\r\n</form>\r\n", styles: [":host.hx-card{border:unset}:host.hx-card:hover,:host.hx-card.is-hovered{box-shadow:none}.hxa-datepicker-interval:host{display:flex;flex-direction:column;width:19rem;height:21rem}.hxa-datepicker-interval:host>form{display:flex;flex-direction:column;font-size:1rem;flex:1 1 auto}.hxa-datepicker-interval__content{display:flex;flex-direction:column;flex:1 1 auto;justify-content:center;padding:.75rem}.hxa-datepicker-interval__inputs{border:none;display:block;padding:0;margin:0 auto 1.25rem}.hxa-datepicker-interval__inputs .hx-input{display:inline-block;width:unset}.hxa-datepicker-interval__inputs .hx-input:first-child{width:2.5rem}.hxa-datepicker-interval__inputs .hx-input:not(:last-child){margin-right:1rem}.hxa-datepicker-interval__output{margin:0 auto}.hxa-datepicker-interval__footer{background-color:#f5f5f5;padding:.75rem;display:flex;justify-content:space-between}\n"] }] }], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { selectedDate: [{ type: Input }], selectedInterval: [{ type: Input }], update: [{ type: Output }], cancel: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnRlcnZhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9oeC11aS9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1pbnRlcnZhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9oeC11aS9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1pbnRlcnZhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFXcEMsTUFBTSxPQUFPLDJCQUEyQjtJQXVCdEMsWUFBb0IsR0FBZ0I7UUFBaEIsUUFBRyxHQUFILEdBQUcsQ0FBYTtRQXRCcEMsb0JBQWUsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELGFBQVEsR0FBRyxNQUFNLENBQUM7UUFDbEIsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUtOLFdBQU0sR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVVsRCxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQXVDLENBQUM7UUFHakUsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFFSyxDQUFDO0lBRXhDLFFBQVE7UUFDTiw4QkFBOEI7UUFDOUIsSUFDRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0I7WUFDNUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEs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O2FBQ2Q7aUJBQU0sSUFBSSxPQUFPLEtBQUssVUFBVSxFQUFFO2dCQUNqQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDbEM7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsU0FBUyxVQUFVLENBQUMsR0FBVztZQUM3QixJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxPQUFPLEtBQUssVUFBVSxFQUFFO2dCQUMxQixNQUFNLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQzthQUN0QjtpQkFBTSxJQUFJLE9BQU8sS0FBSyxRQUFRLEVBQUU7Z0JBQy9CLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNsQztpQkFBTSxJQUFJLE9BQU8sS0FBSyxVQUFVLEVBQUU7Z0JBQ2pDLE1BQU0sR0FBRyxHQUFHLENBQUM7YUFDZDtZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDOzt5SEFwTFUsMkJBQTJCOzZHQUEzQiwyQkFBMkIsNlBDckJ4QywyakNBK0JBOzRGRFZhLDJCQUEyQjtrQkFSdkMsU0FBUzsrQkFDRSx5QkFBeUIsUUFHN0I7d0JBQ0osS0FBSyxFQUFFLGlDQUFpQztxQkFDekM7a0dBY0QsWUFBWTtzQkFEWCxLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLE1BQU07c0JBREwsTUFBTTtnQkFJUCxNQUFNO3NCQURMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IERhdGVQaWNrZXJJbnRlcnZhbCB9IGZyb20gJy4vZGF0ZXBpY2tlci5tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2h4YS1kYXRlcGlja2VyLWludGVydmFsJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci1pbnRlcnZhbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZXBpY2tlci1pbnRlcnZhbC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGhvc3Q6IHtcclxuICAgIGNsYXNzOiAnaHgtY2FyZCBoeGEtZGF0ZXBpY2tlci1pbnRlcnZhbCcsXHJcbiAgfSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGVwaWNrZXJJbnRlcnZhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBkdXJhdGlvbk9wdGlvbnMgPSBbJ2RheScsICd3ZWVrJywgJ21vbnRoJywgJ3llYXInXTtcclxuICBkdXJhdGlvbiA9ICdkYXlzJztcclxuICBpbmNyZW1lbnQgPSAwO1xyXG4gIHRleHQ6IG1vbWVudC5Nb21lbnQ7XHJcbiAgZGF0ZUxhYmVsOiBzdHJpbmc7XHJcbiAgcHVibGljIF9kdWVEYXRlc3RyaW5nOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgdmFsdWUkOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgZm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNlbGVjdGVkRGF0ZTogRGF0ZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZWxlY3RlZEludGVydmFsOiBEYXRlUGlja2VySW50ZXJ2YWw7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVBpY2tlckludGVydmFsICYgeyBkYXRlOiBEYXRlIH0+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZmI6IEZvcm1CdWlsZGVyKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIGRhdGUgc2VsZWN0ZWQgZnJvbSBpbnRlcnZhbFxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNlbGVjdGVkSW50ZXJ2YWwgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZEludGVydmFsLmlzU2VsZWN0ZWRGcm9tSW50ZXJ2YWwgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZEludGVydmFsLmludGVydmFsXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgaW50ZXJ2YWxBcnIgPSB0aGlzLnNlbGVjdGVkSW50ZXJ2YWwuaW50ZXJ2YWwuc3BsaXQoJyAnKTtcclxuXHJcbiAgICAgIGlmIChpbnRlcnZhbEFyciAmJiBpbnRlcnZhbEFyci5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgdGhpcy5pbmNyZW1lbnQgPSBwYXJzZUludChpbnRlcnZhbEFyclswXSwgMTApO1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSB0aGlzLm5vcm1hbGlzZUR1cmF0aW9uU3RyaW5nKGludGVydmFsQXJyWzFdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZGF0ZSBpcyB0eXBlZCBvciBjYWxlbmRhciBwaWNrZXJcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZERhdGUpIHtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBtb21lbnQodGhpcy5zZWxlY3RlZERhdGUpO1xyXG4gICAgICBjb25zdCB0b2RheSA9IG1vbWVudCgpLnN0YXJ0T2YoJ2RheScpO1xyXG4gICAgICBjb25zdCBkdXJhdGlvbiA9ICdkYXlzJztcclxuXHJcbiAgICAgIGNvbnN0IGRheXNCZXR3ZWVuOiBudW1iZXIgPSBzZWxlY3RlZC5kaWZmKHRvZGF5LCBkdXJhdGlvbik7XHJcblxyXG4gICAgICBpZiAoZGF5c0JldHdlZW4gJiYgZGF5c0JldHdlZW4gPiAwKSB7XHJcbiAgICAgICAgdGhpcy5pbmNyZW1lbnQgPSBkYXlzQmV0d2VlbjtcclxuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uU2VsZWN0b3B0aW9ucyh0aGlzLmluY3JlbWVudCwgdGhpcy5kdXJhdGlvbik7XHJcblxyXG4gICAgdGhpcy5mb3JtID0gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgICBudW1iZXI6IFt0aGlzLmluY3JlbWVudCwgVmFsaWRhdG9ycy5taW4oMCldLFxyXG4gICAgICBkdXJhdGlvbjogW3RoaXMuZHVyYXRpb25dLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlJC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgb25WYWx1ZUNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlJCA9IHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbCA9PiB7XHJcbiAgICAgIHRoaXMub25TZWxlY3RvcHRpb25zKHZhbC5udW1iZXIsIHZhbC5kdXJhdGlvbik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBvbiBjYW5jZWwgb2YgaW50ZXJ2YWwgZm9ybSAqL1xyXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RvcHRpb25zKG51bWJlclZhbHVlOiBudW1iZXIsIGR1cmF0aW9uVmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy50ZXh0ID0gbW9tZW50KCkuYWRkKFxyXG4gICAgICBudW1iZXJWYWx1ZSBhcyBtb21lbnQuRHVyYXRpb25JbnB1dEFyZzEsXHJcbiAgICAgIGR1cmF0aW9uVmFsdWUgYXMgbW9tZW50LkR1cmF0aW9uSW5wdXRBcmcyXHJcbiAgICApO1xyXG4gICAgdGhpcy5kYXRlTGFiZWwgPSB0aGlzLnRleHQuZm9ybWF0KCdkZGQgREQvTU0vWVlZWScpO1xyXG4gICAgdGhpcy5fZHVlRGF0ZXN0cmluZyA9IHRoaXMudGV4dC5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICB9XHJcblxyXG4gIC8qKiBvbiBzdWJtaXNzaW9uIG9mIGludGVydmFsIGZvcm0gKi9cclxuICBvbkNob29zZSgkZXZlbnQ6IFN1Ym1pdEV2ZW50KSB7XHJcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIC8vIGNoZWNrIGZvcm0gaXMgdmFsaWRcclxuICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcclxuICAgICAgY29uc3QgaW50ZXJ2YWxTdWJtaXR0ZWQgPVxyXG4gICAgICAgIHRoaXMuZm9ybS52YWx1ZS5udW1iZXIudG9TdHJpbmcoKSArXHJcbiAgICAgICAgJyAnICtcclxuICAgICAgICB0aGlzLm5vcm1hbGlzZUR1cmF0aW9uU3RyaW5nKHRoaXMuZm9ybS52YWx1ZS5kdXJhdGlvbiwgJ29wdGlvbmFsJyk7XHJcblxyXG4gICAgICBjb25zdCBkYXRlU3VibWl0dGVkID0gbmV3IERhdGUodGhpcy5fZHVlRGF0ZXN0cmluZyk7XHJcblxyXG4gICAgICBjb25zdCByZXN1bHQgPSB7XHJcbiAgICAgICAgaW50ZXJ2YWw6IGludGVydmFsU3VibWl0dGVkLFxyXG4gICAgICAgIGlzU2VsZWN0ZWRGcm9tSW50ZXJ2YWw6IHRydWUsXHJcbiAgICAgICAgZGF0ZTogZGF0ZVN1Ym1pdHRlZCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIGVtaXQgcmVzdWx0XHJcbiAgICAgIHRoaXMudXBkYXRlLmVtaXQocmVzdWx0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBub3JtYWxpc2UgZHVyYXRpb24gc3RyaW5nICovXHJcbiAgbm9ybWFsaXNlRHVyYXRpb25TdHJpbmcoXHJcbiAgICBkdXJhdGlvbjogc3RyaW5nLFxyXG4gICAgb3V0cHV0OiAnc2luZ3VsYXInIHwgJ3BsdXJhbCcgfCAnb3B0aW9uYWwnID0gJ3BsdXJhbCdcclxuICApOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2luZ3VsYXIgPSB0aGlzLmR1cmF0aW9uT3B0aW9ucztcclxuICAgIGNvbnN0IHBsdXJhbCA9IHNpbmd1bGFyLm1hcCh2YWwgPT4gdmFsICsgJ3MnKTtcclxuICAgIGNvbnN0IG9wdGlvbmFsID0gc2luZ3VsYXIubWFwKHZhbCA9PiB2YWwgKyAnKHMpJyk7XHJcblxyXG4gICAgY29uc3QgY3VycmVudCA9IGN1cnJlbnRGb3JtYXQoZHVyYXRpb24pO1xyXG5cclxuICAgIGxldCByZXN1bHQgPSBbYCR7b3V0cHV0fWBdWzBdIHx8ICdkYXlzJztcclxuXHJcbiAgICBpZiAob3V0cHV0ID09PSAnc2luZ3VsYXInKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRvU2luZ3VsYXIoZHVyYXRpb24pO1xyXG4gICAgfSBlbHNlIGlmIChvdXRwdXQgPT09ICdwbHVyYWwnKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRvUGx1cmFsKGR1cmF0aW9uKTtcclxuICAgIH0gZWxzZSBpZiAob3V0cHV0ID09PSAnb3B0aW9uYWwnKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRvT3B0aW9uYWwoZHVyYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG4gICAgZnVuY3Rpb24gY3VycmVudEZvcm1hdChzdHI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgIGlmIChzaW5ndWxhci5pbmNsdWRlcyhzdHIpKSB7XHJcbiAgICAgICAgcmV0dXJuICdzaW5ndWxhcic7XHJcbiAgICAgIH0gZWxzZSBpZiAocGx1cmFsLmluY2x1ZGVzKHN0cikpIHtcclxuICAgICAgICByZXR1cm4gJ3BsdXJhbCc7XHJcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwuaW5jbHVkZXMoc3RyKSkge1xyXG4gICAgICAgIHJldHVybiAnb3B0aW9uYWwnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB0b1Npbmd1bGFyKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IHNpbmd1bGFyWzBdO1xyXG4gICAgICBpZiAoY3VycmVudCA9PT0gJ3Npbmd1bGFyJykge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0cjtcclxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50ID09PSAncGx1cmFsJykge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0ci5yZXBsYWNlKCdzJywgJycpO1xyXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnQgPT09ICdvcHRpb25hbCcpIHtcclxuICAgICAgICByZXN1bHQgPSBzdHIucmVwbGFjZSgnKHMpJywgJycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdG9QbHVyYWwoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcmVzdWx0ID0gcGx1cmFsWzBdO1xyXG4gICAgICBpZiAoY3VycmVudCA9PT0gJ3Npbmd1bGFyJykge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0ciArICdzJztcclxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50ID09PSAncGx1cmFsJykge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0cjtcclxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50ID09PSAnb3B0aW9uYWwnKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gc3RyLnJlcGxhY2UoJyhzKScsICdzJyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB0b09wdGlvbmFsKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IG9wdGlvbmFsWzBdO1xyXG4gICAgICBpZiAoY3VycmVudCA9PT0gJ3Npbmd1bGFyJykge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0ciArICcocyknO1xyXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnQgPT09ICdwbHVyYWwnKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gc3RyLnJlcGxhY2UoJ3MnLCAnKHMpJyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudCA9PT0gJ29wdGlvbmFsJykge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0cjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwib25DaG9vc2UoJGV2ZW50KVwiPlxyXG4gIDxzZWN0aW9uIGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItaW50ZXJ2YWxfX2NvbnRlbnRcIj5cclxuICAgIDxmaWVsZHNldCBjbGFzcz1cImh4YS1kYXRlcGlja2VyLWludGVydmFsX19pbnB1dHNcIj5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgaWQ9XCJudW1iZXJUZXh0XCJcclxuICAgICAgICBjbGFzcz1cImh4LWlucHV0XCJcclxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJudW1iZXJcIlxyXG4gICAgICAgIG1pbj1cIjBcIlxyXG4gICAgICAvPlxyXG5cclxuICAgICAgPHNlbGVjdCBpZD1cImR1cmF0aW9uVGV4dFwiIGNsYXNzPVwiaHgtaW5wdXRcIiBmb3JtQ29udHJvbE5hbWU9XCJkdXJhdGlvblwiPlxyXG4gICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBkdXJhdGlvbk9wdGlvbnNcIiBbdmFsdWVdPVwib3B0ICsgJ3MnXCI+XHJcbiAgICAgICAgICB7eyBvcHQgKyAnKHMpJyB9fVxyXG4gICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICA8L3NlbGVjdD5cclxuXHJcbiAgICAgIDxzcGFuPmZyb20gdG9kYXk8L3NwYW4+XHJcbiAgICA8L2ZpZWxkc2V0PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1pbnRlcnZhbF9fb3V0cHV0XCI+XHJcbiAgICAgIDxzcGFuPndpbGwgYmUgPC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImlzLXRleHQtd2VpZ2h0LWJvbGRlclwiPnt7IGRhdGVMYWJlbCB9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvc2VjdGlvbj5cclxuXHJcbiAgPHNlY3Rpb24gY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1pbnRlcnZhbF9fZm9vdGVyXCI+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiaHgtYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiaHgtYnV0dG9uIGlzLXByaW1hcnlcIj5TZWxlY3Q8L2J1dHRvbj5cclxuICA8L3NlY3Rpb24+XHJcbjwvZm9ybT5cclxuIl19