govuk-angular
Version:
Angular components port of govuk-frontend nunjucks macros.
148 lines (140 loc) • 15.8 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { emptyFieldSet, emptyLegend } from '../fieldset/fieldset';
import { emptyHint } from '../hint/hint';
import { emptyErrorMessage } from '../error/error-message.model';
import { each } from 'lodash';
import * as i0 from "@angular/core";
import * as i1 from "../fieldset/fieldset.component";
import * as i2 from "../hint/hint.component";
import * as i3 from "@angular/common";
import * as i4 from "@angular/forms";
/**
* Checkbox component based on the nunjucks template version
* https://design-system.service.gov.uk/components/checkboxes/
*
* ```javascript
* <govuk-checkboxes
* [id]="'waste'"
* [fieldset]="{ text: 'Which types of waste do you transport?', classes : 'govuk-fieldset__legend--l'}"
* [hint]="{text: 'Select all that apply'}"
* [model]="model.wasteOptions" >
* </govuk-checkboxes>
*
* checkOptions: CheckOptionItem[] = [
* { text: "Waste from animal carcasses", value: "animal", checked: false},
* { text: "Waste from mines or quarries", value: "quarries", checked: false},
* { text: "Farm or agricultural waste", value: "farm", checked: false },
* ];
*
* ```
*/
export class GovUKCheckBoxesComponent {
constructor(el) {
this.el = el;
this.radioMode = false;
this.hint = emptyHint();
/** { text: string; classes: string; } */
this.errorMessage = emptyErrorMessage();
this.modelChange = new EventEmitter();
this.fieldset = emptyFieldSet();
this.legend = emptyLegend();
}
/**
* Experimental mode :
* Radio mode will change the way that the checkboxes work.
* They will act more like a radio group where only one option
* can be selected from the list, with the extra option to check none
*/
onModelChange(id, index, choice) {
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
choice.onChange ? choice.onChange(choice.checked) : null;
if (!this.radioMode) {
return;
}
const selected = '#' + id + '-' + index;
each(this.model, (x, i) => {
x.checked = false;
const boxId = '#' + id + '-' + i;
if (boxId !== selected) {
this.el.nativeElement.querySelector(boxId).checked = false;
}
else {
this.el.nativeElement.querySelector(boxId).checked = this.el.nativeElement.querySelector(boxId).checked;
x.checked = this.el.nativeElement.querySelector(boxId).checked;
}
});
this.modelChange.emit(this.model);
}
}
GovUKCheckBoxesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: GovUKCheckBoxesComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
GovUKCheckBoxesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: GovUKCheckBoxesComponent, selector: "govuk-checkboxes", inputs: { id: "id", name: "name", classes: "classes", describeBy: "describeBy", radioMode: "radioMode", hint: "hint", errorMessage: "errorMessage", model: "model", fieldset: "fieldset", legend: "legend" }, outputs: { modelChange: "modelChange" }, ngImport: i0, template: `
<govuk-fieldset [id]="id" [fieldset]="fieldset" [legend]="legend" [hint]="hint" [errorMessage]="errorMessage">
<div class="govuk-checkboxes {{classes}}">
<div class="govuk-checkboxes__item" *ngFor="let choice of model; let i = index">
<input class="govuk-checkboxes__input"
[id]="id + '-' + i"
[name]="id + '-' + i"
[value]="choice.value"
[(ngModel)]="choice.checked"
(ngModelChange)="onModelChange(id, i, choice)"
type="checkbox"
[attr.aria-describedby]="describeBy">
<label class="govuk-label govuk-checkboxes__label"
[for]="id + '-' + i"
[attr.data-qa]="id + '-' + choice.value.toLowerCase() + '-' + i"> {{choice.text}}
</label>
<govuk-hint id="{{id}}-{{choice.value}}" [hint]="{text : choice.hint, classes: 'govuk-checkboxes__hint'}"></govuk-hint>
</div>
</div>
</govuk-fieldset>
`, isInline: true, components: [{ type: i1.GovUKFieldsetComponent, selector: "govuk-fieldset", inputs: ["id", "fieldset", "legend", "hint", "errorMessage"] }, { type: i2.GovUKHintComponent, selector: "govuk-hint", inputs: ["id", "hint"] }], directives: [{ type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: GovUKCheckBoxesComponent, decorators: [{
type: Component,
args: [{
selector: 'govuk-checkboxes',
template: `
<govuk-fieldset [id]="id" [fieldset]="fieldset" [legend]="legend" [hint]="hint" [errorMessage]="errorMessage">
<div class="govuk-checkboxes {{classes}}">
<div class="govuk-checkboxes__item" *ngFor="let choice of model; let i = index">
<input class="govuk-checkboxes__input"
[id]="id + '-' + i"
[name]="id + '-' + i"
[value]="choice.value"
[(ngModel)]="choice.checked"
(ngModelChange)="onModelChange(id, i, choice)"
type="checkbox"
[attr.aria-describedby]="describeBy">
<label class="govuk-label govuk-checkboxes__label"
[for]="id + '-' + i"
[attr.data-qa]="id + '-' + choice.value.toLowerCase() + '-' + i"> {{choice.text}}
</label>
<govuk-hint id="{{id}}-{{choice.value}}" [hint]="{text : choice.hint, classes: 'govuk-checkboxes__hint'}"></govuk-hint>
</div>
</div>
</govuk-fieldset>
`
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { id: [{
type: Input
}], name: [{
type: Input
}], classes: [{
type: Input
}], describeBy: [{
type: Input
}], radioMode: [{
type: Input
}], hint: [{
type: Input
}], errorMessage: [{
type: Input
}], model: [{
type: Input
}], modelChange: [{
type: Output
}], fieldset: [{
type: Input
}], legend: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3hlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nb3Z1ay1hbmd1bGFyL3NyYy9saWIvY2hlY2tib3hlcy9jaGVja2JveGVzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWxGLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBRXBGLE9BQU8sRUFBRSxTQUFTLEVBQVEsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLGlCQUFpQixFQUFnQixNQUFNLDhCQUE4QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7Ozs7OztBQUU5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQTZCSCxNQUFNLE9BQU8sd0JBQXdCO0lBcUNuQyxZQUFtQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQWhDeEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixTQUFJLEdBQVMsU0FBUyxFQUFFLENBQUM7UUFFbEMseUNBQXlDO1FBQ2hDLGlCQUFZLEdBQWlCLGlCQUFpQixFQUFFLENBQUM7UUFzQmhELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV2QyxhQUFRLEdBQWEsYUFBYSxFQUFFLENBQUM7UUFDckMsV0FBTSxHQUFXLFdBQVcsRUFBRSxDQUFDO0lBRUgsQ0FBQztJQUV0Qzs7Ozs7T0FLRztJQUNILGFBQWEsQ0FBQyxFQUFPLEVBQUUsS0FBVSxFQUFFLE1BQXVCO1FBQ3hELG9FQUFvRTtRQUNwRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRXpELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLE9BQU87U0FDUjtRQUVELE1BQU0sUUFBUSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztRQUV4QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBRTtZQUN2QixDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNsQixNQUFNLEtBQUssR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDakMsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUM1RDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3hHLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQzthQUNoRTtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7O3FIQW5FVSx3QkFBd0I7eUdBQXhCLHdCQUF3QiwrU0ExQnpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F3Qlg7MkZBRVksd0JBQXdCO2tCQTVCcEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXdCWDtpQkFDQTtpR0FFVSxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBb0JHLEtBQUs7c0JBQWIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hlY2tPcHRpb25JdGVtIH0gZnJvbSAnLi9jaGVjay1vcHRpb24tSXRlbSc7XG5pbXBvcnQgeyBlbXB0eUZpZWxkU2V0LCBlbXB0eUxlZ2VuZCwgRmllbGRzZXQsIExlZ2VuZCB9IGZyb20gJy4uL2ZpZWxkc2V0L2ZpZWxkc2V0JztcbmltcG9ydCB7IEdvdlVLRGF0YUNhcHR1cmUgfSBmcm9tICcuLi9kYXRhLWNhcHR1cmUuY29tcG9uZW50JztcbmltcG9ydCB7IGVtcHR5SGludCwgSGludCB9IGZyb20gJy4uL2hpbnQvaGludCc7XG5pbXBvcnQgeyBlbXB0eUVycm9yTWVzc2FnZSwgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vZXJyb3IvZXJyb3ItbWVzc2FnZS5tb2RlbCc7XG5pbXBvcnQgeyBlYWNoIH0gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBDaGVja2JveCBjb21wb25lbnQgYmFzZWQgb24gdGhlIG51bmp1Y2tzIHRlbXBsYXRlIHZlcnNpb25cbiAqIGh0dHBzOi8vZGVzaWduLXN5c3RlbS5zZXJ2aWNlLmdvdi51ay9jb21wb25lbnRzL2NoZWNrYm94ZXMvXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogPGdvdnVrLWNoZWNrYm94ZXNcbiAqICAgW2lkXT1cIid3YXN0ZSdcIlxuICogICBbZmllbGRzZXRdPVwieyB0ZXh0OiAnV2hpY2ggdHlwZXMgb2Ygd2FzdGUgZG8geW91IHRyYW5zcG9ydD8nLCBjbGFzc2VzIDogJ2dvdnVrLWZpZWxkc2V0X19sZWdlbmQtLWwnfVwiXG4gKiAgIFtoaW50XT1cInt0ZXh0OiAnU2VsZWN0IGFsbCB0aGF0IGFwcGx5J31cIlxuICogICBbbW9kZWxdPVwibW9kZWwud2FzdGVPcHRpb25zXCIgPlxuICogPC9nb3Z1ay1jaGVja2JveGVzPlxuICpcbiAqIGNoZWNrT3B0aW9uczogQ2hlY2tPcHRpb25JdGVtW10gPSBbXG4gKiAgIHsgdGV4dDogXCJXYXN0ZSBmcm9tIGFuaW1hbCBjYXJjYXNzZXNcIiwgdmFsdWU6IFwiYW5pbWFsXCIsIGNoZWNrZWQ6IGZhbHNlfSxcbiAqICAgeyB0ZXh0OiBcIldhc3RlIGZyb20gbWluZXMgb3IgcXVhcnJpZXNcIiwgdmFsdWU6IFwicXVhcnJpZXNcIiwgY2hlY2tlZDogZmFsc2V9LFxuICogICB7IHRleHQ6IFwiRmFybSBvciBhZ3JpY3VsdHVyYWwgd2FzdGVcIiwgdmFsdWU6IFwiZmFybVwiLCBjaGVja2VkOiBmYWxzZSB9LFxuICogXTtcbiAqXG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ292dWstY2hlY2tib3hlcycsXG4gIHRlbXBsYXRlOiBgXG48Z292dWstZmllbGRzZXQgW2lkXT1cImlkXCIgW2ZpZWxkc2V0XT1cImZpZWxkc2V0XCIgW2xlZ2VuZF09XCJsZWdlbmRcIiBbaGludF09XCJoaW50XCIgW2Vycm9yTWVzc2FnZV09XCJlcnJvck1lc3NhZ2VcIj5cblxuICA8ZGl2IGNsYXNzPVwiZ292dWstY2hlY2tib3hlcyB7e2NsYXNzZXN9fVwiPlxuICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1jaGVja2JveGVzX19pdGVtXCIgKm5nRm9yPVwibGV0IGNob2ljZSBvZiBtb2RlbDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgPGlucHV0IGNsYXNzPVwiZ292dWstY2hlY2tib3hlc19faW5wdXRcIlxuICAgICAgICAgICAgICBbaWRdPVwiaWQgKyAnLScgKyBpXCJcbiAgICAgICAgICAgICAgW25hbWVdPVwiaWQgKyAnLScgKyBpXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImNob2ljZS52YWx1ZVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2hvaWNlLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsQ2hhbmdlKGlkLCBpLCBjaG9pY2UpXCJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJkZXNjcmliZUJ5XCI+XG5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImdvdnVrLWxhYmVsIGdvdnVrLWNoZWNrYm94ZXNfX2xhYmVsXCJcbiAgICAgICAgICAgICBbZm9yXT1cImlkICsgJy0nICsgaVwiXG4gICAgICAgICAgICAgW2F0dHIuZGF0YS1xYV09XCJpZCArICctJyArIGNob2ljZS52YWx1ZS50b0xvd2VyQ2FzZSgpICsgJy0nICsgaVwiPiB7e2Nob2ljZS50ZXh0fX1cbiAgICAgIDwvbGFiZWw+XG5cbiAgICAgIDxnb3Z1ay1oaW50IGlkPVwie3tpZH19LXt7Y2hvaWNlLnZhbHVlfX1cIiBbaGludF09XCJ7dGV4dCA6IGNob2ljZS5oaW50LCBjbGFzc2VzOiAnZ292dWstY2hlY2tib3hlc19faGludCd9XCI+PC9nb3Z1ay1oaW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuPC9nb3Z1ay1maWVsZHNldD5cbmBcbn0pXG5leHBvcnQgY2xhc3MgR292VUtDaGVja0JveGVzQ29tcG9uZW50IGltcGxlbWVudHMgR292VUtEYXRhQ2FwdHVyZTxDaGVja09wdGlvbkl0ZW0gW10+IHtcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBjbGFzc2VzOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlc2NyaWJlQnk/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHJhZGlvTW9kZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGhpbnQ6IEhpbnQgPSBlbXB0eUhpbnQoKTtcblxuICAvKiogeyB0ZXh0OiBzdHJpbmc7IGNsYXNzZXM6IHN0cmluZzsgfSAqL1xuICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IEVycm9yTWVzc2FnZSA9IGVtcHR5RXJyb3JNZXNzYWdlKCk7XG5cbiAgLyoqXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICpcbiAgICogaW50ZXJmYWNlIENoZWNrT3B0aW9uSXRlbSB7XG4gICAqICB0ZXh0OiBzdHJpbmc7XG4gICAqICB2YWx1ZTogYW55O1xuICAgKiAgY2hlY2tlZD86IGJvb2xlYW47XG4gICAqICBoaW50Pzogc3RyaW5nIHwgSGludDtcbiAgICogIHRleHREaXZpZGVyPzogc3RyaW5nO1xuICAgKiB9XG4gICAqXG4gICAqIHdhc3RlT3B0aW9uczogQ2hlY2tPcHRpb25JdGVtW10gPSBbXG4gICAqICAgeyB0ZXh0OiBcIldhc3RlIGZyb20gYW5pbWFsIGNhcmNhc3Nlc1wiLCB2YWx1ZTogXCJhbmltYWxcIiwgY2hlY2tlZDogZmFsc2V9LFxuICAgKiAgIHsgdGV4dDogXCJXYXN0ZSBmcm9tIG1pbmVzIG9yIHF1YXJyaWVzXCIsIHZhbHVlOiBcInF1YXJyaWVzXCIsIGNoZWNrZWQ6IGZhbHNlfSxcbiAgICogICB7IHRleHQ6IFwiRmFybSBvciBhZ3JpY3VsdHVyYWwgd2FzdGVcIiwgdmFsdWU6IFwiZmFybVwiLCBjaGVja2VkOiBmYWxzZSB9LFxuICAgKiBdO1xuICAgKiBgYGBcbiAgICovXG4gIEBJbnB1dCgpIG1vZGVsOiBDaGVja09wdGlvbkl0ZW1bXTtcblxuICBAT3V0cHV0KCkgbW9kZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASW5wdXQoKSBmaWVsZHNldDogRmllbGRzZXQgPSBlbXB0eUZpZWxkU2V0KCk7XG4gIEBJbnB1dCgpIGxlZ2VuZDogTGVnZW5kID0gZW1wdHlMZWdlbmQoKTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWw6IEVsZW1lbnRSZWYpIHsgfVxuXG4gIC8qKlxuICAgKiBFeHBlcmltZW50YWwgbW9kZSA6XG4gICAqIFJhZGlvIG1vZGUgd2lsbCBjaGFuZ2UgdGhlIHdheSB0aGF0IHRoZSBjaGVja2JveGVzIHdvcmsuXG4gICAqIFRoZXkgd2lsbCBhY3QgbW9yZSBsaWtlIGEgcmFkaW8gZ3JvdXAgd2hlcmUgb25seSBvbmUgb3B0aW9uXG4gICAqIGNhbiBiZSBzZWxlY3RlZCBmcm9tIHRoZSBsaXN0LCB3aXRoIHRoZSBleHRyYSBvcHRpb24gdG8gY2hlY2sgbm9uZVxuICAgKi9cbiAgb25Nb2RlbENoYW5nZShpZDogYW55LCBpbmRleDogYW55LCBjaG9pY2U6IENoZWNrT3B0aW9uSXRlbSl7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICBjaG9pY2Uub25DaGFuZ2UgPyBjaG9pY2Uub25DaGFuZ2UoY2hvaWNlLmNoZWNrZWQpIDogbnVsbDtcblxuICAgIGlmICghdGhpcy5yYWRpb01vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZCA9ICcjJyArIGlkICsgJy0nICsgaW5kZXg7XG5cbiAgICBlYWNoKHRoaXMubW9kZWwsICh4LGkpID0+IHtcbiAgICAgIHguY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgYm94SWQgPSAnIycgKyBpZCArICctJyArIGk7XG4gICAgICBpZiAoYm94SWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGJveElkKS5jaGVja2VkID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcihib3hJZCkuY2hlY2tlZCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGJveElkKS5jaGVja2VkO1xuICAgICAgICB4LmNoZWNrZWQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcihib3hJZCkuY2hlY2tlZDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh0aGlzLm1vZGVsKTtcbiAgfVxufVxuXG4iXX0=