1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, Output, signal, ViewChild, } from '@angular/core';
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
- import { ButtonComponent } from '../../components/atoms/button/button.component';
- import { IconComponent } from '../../components/atoms/icon/icon.component';
- import { OptionComponent } from '../option/option.component';
- import { Subject, debounceTime } from 'rxjs';
- import { LabelComponent } from '../label/label.component';
- import { AlertComponent } from '../../components/atoms/alert/alert.component';
- import { TypeEnum } from '../../model/components/type.enum';
- import { provideControlContainer, provideValueAccessor } from '../../utils/form.util';
- import { FormGenericComponent } from '../../services/form-generic.abstract';
- import { FormErrorComponent } from '../error/error.component';
- import * as i0 from "@angular/core";
- import * as i1 from "@angular/forms";
- export class SelectComponent extends FormGenericComponent {
- constructor(formGroupDirective, destroyRef) {
- super(formGroupDirective);
- this.destroyRef = destroyRef;
- this.focusOut$ = new Subject();
- this.isOpen = false;
- this.option = '';
- this.option$ = signal('');
- this.placeholder = '';
- this.label = '';
- this.value = '';
- this.type = TypeEnum.PRIMARY;
- this.fullSize = true;
- this.shouldShowError = true;
- this.key = '';
- this.options = [];
- this.selected = new EventEmitter();
- }
- ngOnInit() {
- this.selectOption(this.value, false);
- this.focusOut$.pipe(takeUntilDestroyed(this.destroyRef), debounceTime(200)).subscribe(() => {
- this.triggerChangeDetection();
- this.close();
- });
- }
- toggle() {
- this.isOpen = !this.isOpen;
- if (!this.isOpen) {
- this.triggerTouched();
- }
- }
- close() {
- this.isOpen = false;
- this.triggerTouched();
- }
- selectOption(key, propagate = true) {
- const selectedOption = this.options.find(option => option.key === key);
- this.option = key === null ? this.placeholder : selectedOption?.label;
- if (propagate) {
- this.selected.emit(key);
- this.triggerChange(selectedOption?.key ?? null);
- this.close();
- }
- }
- writeValue(value) {
- this.triggerChangeDetection();
- this.selectOption(value, false);
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: SelectComponent, deps: [{ token: i1.FormGroupDirective }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component }); }
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.2", type: SelectComponent, isStandalone: true, selector: "ct-select", inputs: { formControlName: "formControlName", placeholder: "placeholder", label: "label", value: "value", type: "type", fullSize: "fullSize", shouldShowError: "shouldShowError", key: "key", options: "options" }, outputs: { selected: "selected" }, providers: [provideValueAccessor(forwardRef(() => SelectComponent))], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["triggerElement"], descendants: true }, { propertyName: "panel", first: true, predicate: ["optionsPanel"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ct-form-label [text]=\"label\" [hasError]=\"hasErrors(formControl)\" />\n<div\n class=\"flex flex-row items-center justify-between gap-1.5 rounded-md border bg-surface-variant px-4 py-2 text-sm text-on-surface-variant dark:bg-surface-variant-dark dark:text-on-surface-variant-dark\"\n [class.border-error]=\"hasErrors(formControl)\"\n [class.border-neutral-300]=\"!hasErrors(formControl)\"\n [class.text-neutral-400]=\"option === placeholder\"\n [class.text-on-surface-variant]=\"option !== placeholder\"\n #triggerElement\n tabindex=\"0\"\n (focusout)=\"focusOut$.next($event)\"\n (click)=\"toggle()\">\n {{ option }}\n <ct-icon class=\"flex\" [size]=\"'sm'\" [icon]=\"isOpen ? 'chevron-up' : 'chevron-down'\" />\n</div>\n@if (isOpen) {\n <div class=\"relative\">\n <div\n #optionsPanel\n [class.w-full]=\"fullSize\"\n [class.w-fit]=\"!fullSize\"\n class=\"absolute top-1 z-10 flex flex-col rounded-md border border-neutral-400 bg-surface-variant text-on-surface-variant dark:bg-surface-variant-dark dark:text-on-surface-variant-dark\">\n <ct-option (click)=\"selectOption(null)\" [label]=\"placeholder\" />\n @for (option of options; track option) {\n <ct-option (click)=\"selectOption(option.key)\" [label]=\"option.label\" [icon]=\"option.icon!\" />\n }\n </div>\n </div>\n}\n@if (hasErrors(formControl)) {\n <ct-form-error [errors]=\"formControl.errors ?? {}\" />\n}\n", dependencies: [{ kind: "component", type: OptionComponent, selector: "ct-option", inputs: ["label", "icon"] }, { kind: "component", type: IconComponent, selector: "ct-icon", inputs: ["icon", "fill", "strokeWidth", "strokeColor", "size", "variant"] }, { kind: "component", type: LabelComponent, selector: "ct-form-label", inputs: ["text", "type", "formControlName", "hasError"] }, { kind: "component", type: FormErrorComponent, selector: "ct-form-error", inputs: ["errors"] }], viewProviders: [provideControlContainer()], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: SelectComponent, decorators: [{
- type: Component,
- args: [{ selector: 'ct-select', standalone: true, imports: [OptionComponent, ButtonComponent, IconComponent, LabelComponent, AlertComponent, FormErrorComponent], providers: [provideValueAccessor(forwardRef(() => SelectComponent))], viewProviders: [provideControlContainer()], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ct-form-label [text]=\"label\" [hasError]=\"hasErrors(formControl)\" />\n<div\n class=\"flex flex-row items-center justify-between gap-1.5 rounded-md border bg-surface-variant px-4 py-2 text-sm text-on-surface-variant dark:bg-surface-variant-dark dark:text-on-surface-variant-dark\"\n [class.border-error]=\"hasErrors(formControl)\"\n [class.border-neutral-300]=\"!hasErrors(formControl)\"\n [class.text-neutral-400]=\"option === placeholder\"\n [class.text-on-surface-variant]=\"option !== placeholder\"\n #triggerElement\n tabindex=\"0\"\n (focusout)=\"focusOut$.next($event)\"\n (click)=\"toggle()\">\n {{ option }}\n <ct-icon class=\"flex\" [size]=\"'sm'\" [icon]=\"isOpen ? 'chevron-up' : 'chevron-down'\" />\n</div>\n@if (isOpen) {\n <div class=\"relative\">\n <div\n #optionsPanel\n [class.w-full]=\"fullSize\"\n [class.w-fit]=\"!fullSize\"\n class=\"absolute top-1 z-10 flex flex-col rounded-md border border-neutral-400 bg-surface-variant text-on-surface-variant dark:bg-surface-variant-dark dark:text-on-surface-variant-dark\">\n <ct-option (click)=\"selectOption(null)\" [label]=\"placeholder\" />\n @for (option of options; track option) {\n <ct-option (click)=\"selectOption(option.key)\" [label]=\"option.label\" [icon]=\"option.icon!\" />\n }\n </div>\n </div>\n}\n@if (hasErrors(formControl)) {\n <ct-form-error [errors]=\"formControl.errors ?? {}\" />\n}\n" }]
- }], ctorParameters: () => [{ type: i1.FormGroupDirective }, { type: i0.DestroyRef }], propDecorators: { formControlName: [{
- type: Input
- }], placeholder: [{
- type: Input
- }], label: [{
- type: Input
- }], value: [{
- type: Input
- }], type: [{
- type: Input
- }], fullSize: [{
- type: Input
- }], shouldShowError: [{
- type: Input
- }], key: [{
- type: Input,
- args: [{ required: true }]
- }], options: [{
- type: Input,
- args: [{ required: true }]
- }], selected: [{
- type: Output
- }], trigger: [{
- type: ViewChild,
- args: ['triggerElement']
- }], panel: [{
- type: ViewChild,
- args: ['optionsPanel']
- }] } });
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NpcmNsZXRvbmUvc3JjL2xpYi9mb3Jtcy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NpcmNsZXRvbmUvc3JjL2xpYi9mb3Jtcy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUdULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7QUFXOUQsTUFBTSxPQUFPLGVBQWdCLFNBQVEs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LFdBQ1AsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixDQUFDLGFBRW5HLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsaUJBQ3JELENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxtQkFDekIsdUJBQXVCLENBQUMsTUFBTTtnSEFRdEMsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDcUIsR0FBRztzQkFBN0IsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQ0UsT0FBTztzQkFBakMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQ2YsUUFBUTtzQkFBakIsTUFBTTtnQkFFc0IsT0FBTztzQkFBbkMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ0EsS0FBSztzQkFBL0IsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIHNpZ25hbCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYXRvbXMvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYXRvbXMvaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtT3B0aW9uQmFzZSB9IGZyb20gJy4uLy4uL21vZGVsL2Zvcm1zL2Zvcm0tYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBPcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9vcHRpb24vb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZvcm1Hcm91cERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IExhYmVsQ29tcG9uZW50IH0gZnJvbSAnLi4vbGFiZWwvbGFiZWwuY29tcG9uZW50JztcbmltcG9ydCB7IEFsZXJ0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hdG9tcy9hbGVydC9hbGVydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVHlwZUVudW0gfSBmcm9tICcuLi8uLi9tb2RlbC9jb21wb25lbnRzL3R5cGUuZW51bSc7XG5pbXBvcnQgeyBwcm92aWRlQ29udHJvbENvbnRhaW5lciwgcHJvdmlkZVZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLi8uLi91dGlscy9mb3JtLnV0aWwnO1xuaW1wb3J0IHsgRm9ybUdlbmVyaWNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mb3JtLWdlbmVyaWMuYWJzdHJhY3QnO1xuaW1wb3J0IHsgRm9ybUVycm9yQ29tcG9uZW50IH0gZnJvbSAnLi4vZXJyb3IvZXJyb3IuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3Qtc2VsZWN0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW09wdGlvbkNvbXBvbmVudCwgQnV0dG9uQ29tcG9uZW50LCBJY29uQ29tcG9uZW50LCBMYWJlbENvbXBvbmVudCwgQWxlcnRDb21wb25lbnQsIEZvcm1FcnJvckNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtwcm92aWRlVmFsdWVBY2Nlc3Nvcihmb3J3YXJkUmVmKCgpID0+IFNlbGVjdENvbXBvbmVudCkpXSxcbiAgdmlld1Byb3ZpZGVyczogW3Byb3ZpZGVDb250cm9sQ29udGFpbmVyKCldLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0Q29tcG9uZW50IGV4dGVuZHMgRm9ybUdlbmVyaWNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBmb2N1c091dCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIGlzT3BlbiA9IGZhbHNlO1xuICBvcHRpb24gPSAnJztcbiAgb3B0aW9uJCA9IHNpZ25hbCgnJyk7XG5cbiAgQElucHV0KCkgZm9ybUNvbnRyb2xOYW1lITogc3RyaW5nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xuICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuICBASW5wdXQoKSB2YWx1ZTogYW55ID0gJyc7XG4gIEBJbnB1dCgpIHR5cGU6IFR5cGVFbnVtIHwgc3RyaW5nID0gVHlwZUVudW0uUFJJTUFSWTtcbiAgQElucHV0KCkgZnVsbFNpemU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG91bGRTaG93RXJyb3I6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBrZXkgPSAnJztcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgb3B0aW9uczogRm9ybU9wdGlvbkJhc2VbXSA9IFtdO1xuICBAT3V0cHV0KCkgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAVmlld0NoaWxkKCd0cmlnZ2VyRWxlbWVudCcpIHRyaWdnZXIhOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnb3B0aW9uc1BhbmVsJykgcGFuZWwhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBmb3JtR3JvdXBEaXJlY3RpdmU6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWY6IERlc3Ryb3lSZWZcbiAgKSB7XG4gICAgc3VwZXIoZm9ybUdyb3VwRGlyZWN0aXZlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0T3B0aW9uKHRoaXMudmFsdWUsIGZhbHNlKTtcbiAgICB0aGlzLmZvY3VzT3V0JC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLCBkZWJvdW5jZVRpbWUoMjAwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5nZURldGVjdGlvbigpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuO1xuICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMudHJpZ2dlclRvdWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMudHJpZ2dlclRvdWNoZWQoKTtcbiAgfVxuXG4gIHNlbGVjdE9wdGlvbihrZXk6IGFueSwgcHJvcGFnYXRlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IG9wdGlvbi5rZXkgPT09IGtleSkhO1xuICAgIHRoaXMub3B0aW9uID0ga2V5ID09PSBudWxsID8gdGhpcy5wbGFjZWhvbGRlciA6IHNlbGVjdGVkT3B0aW9uPy5sYWJlbDtcbiAgICBpZiAocHJvcGFnYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoa2V5KTtcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5nZShzZWxlY3RlZE9wdGlvbj8ua2V5ID8/IG51bGwpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMudHJpZ2dlckNoYW5nZURldGVjdGlvbigpO1xuICAgIHRoaXMuc2VsZWN0T3B0aW9uKHZhbHVlLCBmYWxzZSk7XG4gIH1cbn1cbiIsIjxjdC1mb3JtLWxhYmVsIFt0ZXh0XT1cImxhYmVsXCIgW2hhc0Vycm9yXT1cImhhc0Vycm9ycyhmb3JtQ29udHJvbClcIiAvPlxuPGRpdlxuICBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMS41IHJvdW5kZWQtbWQgYm9yZGVyIGJnLXN1cmZhY2UtdmFyaWFudCBweC00IHB5LTIgdGV4dC1zbSB0ZXh0LW9uLXN1cmZhY2UtdmFyaWFudCBkYXJrOmJnLXN1cmZhY2UtdmFyaWFudC1kYXJrIGRhcms6dGV4dC1vbi1zdXJmYWNlLXZhcmlhbnQtZGFya1wiXG4gIFtjbGFzcy5ib3JkZXItZXJyb3JdPVwiaGFzRXJyb3JzKGZvcm1Db250cm9sKVwiXG4gIFtjbGFzcy5ib3JkZXItbmV1dHJhbC0zMDBdPVwiIWhhc0Vycm9ycyhmb3JtQ29udHJvbClcIlxuICBbY2xhc3MudGV4dC1uZXV0cmFsLTQwMF09XCJvcHRpb24gPT09IHBsYWNlaG9sZGVyXCJcbiAgW2NsYXNzLnRleHQtb24tc3VyZmFjZS12YXJpYW50XT1cIm9wdGlvbiAhPT0gcGxhY2Vob2xkZXJcIlxuICAjdHJpZ2dlckVsZW1lbnRcbiAgdGFiaW5kZXg9XCIwXCJcbiAgKGZvY3Vzb3V0KT1cImZvY3VzT3V0JC5uZXh0KCRldmVudClcIlxuICAoY2xpY2spPVwidG9nZ2xlKClcIj5cbiAge3sgb3B0aW9uIH19XG4gIDxjdC1pY29uIGNsYXNzPVwiZmxleFwiIFtzaXplXT1cIidzbSdcIiBbaWNvbl09XCJpc09wZW4gPyAnY2hldnJvbi11cCcgOiAnY2hldnJvbi1kb3duJ1wiIC8+XG48L2Rpdj5cbkBpZiAoaXNPcGVuKSB7XG4gIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiPlxuICAgIDxkaXZcbiAgICAgICNvcHRpb25zUGFuZWxcbiAgICAgIFtjbGFzcy53LWZ1bGxdPVwiZnVsbFNpemVcIlxuICAgICAgW2NsYXNzLnctZml0XT1cIiFmdWxsU2l6ZVwiXG4gICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0xIHotMTAgZmxleCBmbGV4LWNvbCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItbmV1dHJhbC00MDAgYmctc3VyZmFjZS12YXJpYW50IHRleHQtb24tc3VyZmFjZS12YXJpYW50IGRhcms6Ymctc3VyZmFjZS12YXJpYW50LWRhcmsgZGFyazp0ZXh0LW9uLXN1cmZhY2UtdmFyaWFudC1kYXJrXCI+XG4gICAgICA8Y3Qtb3B0aW9uIChjbGljayk9XCJzZWxlY3RPcHRpb24obnVsbClcIiBbbGFiZWxdPVwicGxhY2Vob2xkZXJcIiAvPlxuICAgICAgQGZvciAob3B0aW9uIG9mIG9wdGlvbnM7IHRyYWNrIG9wdGlvbikge1xuICAgICAgICA8Y3Qtb3B0aW9uIChjbGljayk9XCJzZWxlY3RPcHRpb24ob3B0aW9uLmtleSlcIiBbbGFiZWxdPVwib3B0aW9uLmxhYmVsXCIgW2ljb25dPVwib3B0aW9uLmljb24hXCIgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG59XG5AaWYgKGhhc0Vycm9ycyhmb3JtQ29udHJvbCkpIHtcbiAgPGN0LWZvcm0tZXJyb3IgW2Vycm9yc109XCJmb3JtQ29udHJvbC5lcnJvcnMgPz8ge31cIiAvPlxufVxuIl19
|