lucy-calendar
Version:
LucyCalendar is a powerful and flexible date picker library for Angular applications, specifically designed for Ethiopian dates. It provides a user-friendly interface for selecting dates and supports various customization options to fit your needs.
80 lines • 16 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class DropdownComponent {
options = []; // List of dropdown options
selected; // Selected value
selectedChange = new EventEmitter(); // Event when selection changes
/**
* Optional function to convert an option to a displayable string.
*/
displayFn;
dropdownOpen = false;
dropdownContainer;
constructor() { }
ngOnInit() {
if (!this.selected && this.options.length > 0) {
this.selected = this.options[0]; // Default to first option if no selection
}
// Scroll to the selected option if it exists
setTimeout(() => {
const selectedIndex = this.options.indexOf(this.selected);
if (selectedIndex >= 0) {
const dropdownElement = this.dropdownContainer.nativeElement.querySelector('ul');
const selectedElement = dropdownElement?.children[selectedIndex];
if (selectedElement) {
selectedElement.scrollIntoView({ block: 'nearest' });
}
}
});
}
toggleDropdown(event) {
console.log('Dropdown clicked. Selected item:', this.selected);
this.dropdownOpen = !this.dropdownOpen;
if (this.dropdownOpen && this.selected) {
setTimeout(() => {
const selectedIndex = this.options.indexOf(this.selected);
if (selectedIndex >= 0) {
const dropdownElement = this.dropdownContainer.nativeElement.querySelector('ul');
const selectedElement = dropdownElement.children[selectedIndex];
if (selectedElement) {
selectedElement.scrollIntoView({ block: 'nearest' });
}
}
});
}
}
onOptionClick(option, index) {
this.selected = option;
this.selectedChange.emit(option);
this.dropdownOpen = false;
}
// Close dropdown when clicking outside
onClickOutside(event) {
if (this.dropdownContainer && !this.dropdownContainer.nativeElement.contains(event.target)) {
this.dropdownOpen = false;
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DropdownComponent, isStandalone: true, selector: "lucy-dropdown", inputs: { options: "options", selected: "selected", displayFn: "displayFn" }, outputs: { selectedChange: "selectedChange" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, viewQueries: [{ propertyName: "dropdownContainer", first: true, predicate: ["dropdownContainer"], descendants: true }], ngImport: i0, template: "<div class=\"relative inline-block w-full\" #dropdownContainer>\r\n <!-- Dropdown Button -->\r\n <button (click)=\"toggleDropdown($event)\"\r\n class=\"w-full px-3 py-2 text-center text-gray-700 bg-white border border-gray-300 rounded-lg shadow-sm focus:outline-none\">\r\n {{ displayFn ? displayFn(selected) : selected }}\r\n <svg class=\"w-4 h-4 inline-block ml-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- Dropdown List -->\r\n <div *ngIf=\"dropdownOpen\"\r\n class=\"absolute z-10 mt-1 w-full bg-white border border-gray-300 rounded-lg shadow-lg max-h-60 overflow-y-auto custom-scrollbar\">\r\n <ul>\r\n <li *ngFor=\"let option of options; let i = index\" (click)=\"onOptionClick(option, i)\"\r\n class=\"px-4 py-2 cursor-pointer hover:bg-gray-100\" [ngClass]=\"{'bg-blue-100': option === selected}\">\r\n {{ displayFn ? displayFn(option) : option }}\r\n </li>\r\n </ul>\r\n </div>\r\n</div>", styles: [".custom-scrollbar::-webkit-scrollbar{width:0px}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:#0003;border-radius:4px;border:2px solid transparent;background-clip:content-box}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:#0006}.custom-scrollbar::-webkit-scrollbar-track{background:transparent}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropdownComponent, decorators: [{
type: Component,
args: [{ selector: 'lucy-dropdown', standalone: true, imports: [CommonModule], template: "<div class=\"relative inline-block w-full\" #dropdownContainer>\r\n <!-- Dropdown Button -->\r\n <button (click)=\"toggleDropdown($event)\"\r\n class=\"w-full px-3 py-2 text-center text-gray-700 bg-white border border-gray-300 rounded-lg shadow-sm focus:outline-none\">\r\n {{ displayFn ? displayFn(selected) : selected }}\r\n <svg class=\"w-4 h-4 inline-block ml-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- Dropdown List -->\r\n <div *ngIf=\"dropdownOpen\"\r\n class=\"absolute z-10 mt-1 w-full bg-white border border-gray-300 rounded-lg shadow-lg max-h-60 overflow-y-auto custom-scrollbar\">\r\n <ul>\r\n <li *ngFor=\"let option of options; let i = index\" (click)=\"onOptionClick(option, i)\"\r\n class=\"px-4 py-2 cursor-pointer hover:bg-gray-100\" [ngClass]=\"{'bg-blue-100': option === selected}\">\r\n {{ displayFn ? displayFn(option) : option }}\r\n </li>\r\n </ul>\r\n </div>\r\n</div>", styles: [".custom-scrollbar::-webkit-scrollbar{width:0px}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:#0003;border-radius:4px;border:2px solid transparent;background-clip:content-box}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:#0006}.custom-scrollbar::-webkit-scrollbar-track{background:transparent}\n"] }]
}], ctorParameters: () => [], propDecorators: { options: [{
type: Input
}], selected: [{
type: Input
}], selectedChange: [{
type: Output
}], displayFn: [{
type: Input
}], dropdownContainer: [{
type: ViewChild,
args: ['dropdownContainer']
}], onClickOutside: [{
type: HostListener,
args: ['document:click', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2x1Y3ktY2FsZW5kYXIvc3JjL2xpYi9jdXN0b20tZHJvcGRvd24vY3VzdG9tLWRyb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2x1Y3ktY2FsZW5kYXIvc3JjL2xpYi9jdXN0b20tZHJvcGRvd24vY3VzdG9tLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFrQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFTNUgsTUFBTSxPQUFPLGlCQUFpQjtJQUNuQixPQUFPLEdBQVEsRUFBRSxDQUFDLENBQUMsMkJBQTJCO0lBQzlDLFFBQVEsQ0FBSyxDQUFDLGlCQUFpQjtJQUM5QixjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQUssQ0FBQyxDQUFDLCtCQUErQjtJQUVqRjs7T0FFRztJQUNNLFNBQVMsQ0FBeUI7SUFFM0MsWUFBWSxHQUFZLEtBQUssQ0FBQztJQUVFLGlCQUFpQixDQUFjO0lBRS9ELGdCQUFnQixDQUFDO0lBRWpCLFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQ0FBMEM7UUFDN0UsQ0FBQztRQUNELDZDQUE2QztRQUM3QyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFELElBQUksYUFBYSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN2QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakYsTUFBTSxlQUFlLEdBQUcsZUFBZSxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDakUsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDcEIsZUFBZSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFZO1FBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRXZDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzFELElBQUksYUFBYSxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUN2QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDakYsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDaEUsSUFBSSxlQUFlLEVBQUUsQ0FBQzt3QkFDcEIsZUFBZSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO29CQUN2RCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQVMsRUFBRSxLQUFhO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFFRCx1Q0FBdUM7SUFFdkMsY0FBYyxDQUFDLEtBQVk7UUFDekIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMzRixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQzt3R0EvRFUsaUJBQWlCOzRGQUFqQixpQkFBaUIsbVlDVjlCLHFxQ0FvQk0saVlEYk0sWUFBWTs7NEZBR1gsaUJBQWlCO2tCQVA3QixTQUFTOytCQUNFLGVBQWUsY0FDYixJQUFJLFdBRVAsQ0FBQyxZQUFZLENBQUM7d0RBSWQsT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTTtnQkFLRSxTQUFTO3NCQUFqQixLQUFLO2dCQUkwQixpQkFBaUI7c0JBQWhELFNBQVM7dUJBQUMsbUJBQW1CO2dCQStDOUIsY0FBYztzQkFEYixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgb3V0cHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsdWN5LWRyb3Bkb3duJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jdXN0b20tZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxyXG4gIHN0eWxlVXJsczogWycuL2N1c3RvbS1kcm9wZG93bi5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBvcHRpb25zOiBUW10gPSBbXTsgLy8gTGlzdCBvZiBkcm9wZG93biBvcHRpb25zXHJcbiAgQElucHV0KCkgc2VsZWN0ZWQhOiBUOyAvLyBTZWxlY3RlZCB2YWx1ZVxyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTsgLy8gRXZlbnQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlc1xyXG5cclxuICAvKipcclxuICAgKiBPcHRpb25hbCBmdW5jdGlvbiB0byBjb252ZXJ0IGFuIG9wdGlvbiB0byBhIGRpc3BsYXlhYmxlIHN0cmluZy5cclxuICAgKi9cclxuICBASW5wdXQoKSBkaXNwbGF5Rm4/OiAob3B0aW9uOiBUKSA9PiBzdHJpbmc7XHJcblxyXG4gIGRyb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAVmlld0NoaWxkKCdkcm9wZG93bkNvbnRhaW5lcicpIGRyb3Bkb3duQ29udGFpbmVyITogRWxlbWVudFJlZjtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQgJiYgdGhpcy5vcHRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMub3B0aW9uc1swXTsgLy8gRGVmYXVsdCB0byBmaXJzdCBvcHRpb24gaWYgbm8gc2VsZWN0aW9uXHJcbiAgICB9XHJcbiAgICAvLyBTY3JvbGwgdG8gdGhlIHNlbGVjdGVkIG9wdGlvbiBpZiBpdCBleGlzdHNcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gdGhpcy5vcHRpb25zLmluZGV4T2YodGhpcy5zZWxlY3RlZCk7XHJcbiAgICAgIGlmIChzZWxlY3RlZEluZGV4ID49IDApIHtcclxuICAgICAgICBjb25zdCBkcm9wZG93bkVsZW1lbnQgPSB0aGlzLmRyb3Bkb3duQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndWwnKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSBkcm9wZG93bkVsZW1lbnQ/LmNoaWxkcmVuW3NlbGVjdGVkSW5kZXhdO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnQpIHtcclxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZURyb3Bkb3duKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ0Ryb3Bkb3duIGNsaWNrZWQuIFNlbGVjdGVkIGl0ZW06JywgdGhpcy5zZWxlY3RlZCk7XHJcbiAgICB0aGlzLmRyb3Bkb3duT3BlbiA9ICF0aGlzLmRyb3Bkb3duT3BlbjtcclxuXHJcbiAgICBpZiAodGhpcy5kcm9wZG93bk9wZW4gJiYgdGhpcy5zZWxlY3RlZCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gdGhpcy5vcHRpb25zLmluZGV4T2YodGhpcy5zZWxlY3RlZCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgY29uc3QgZHJvcGRvd25FbGVtZW50ID0gdGhpcy5kcm9wZG93bkNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3VsJyk7XHJcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSBkcm9wZG93bkVsZW1lbnQuY2hpbGRyZW5bc2VsZWN0ZWRJbmRleF07XHJcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uT3B0aW9uQ2xpY2sob3B0aW9uOiBULCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkID0gb3B0aW9uO1xyXG4gICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KG9wdGlvbik7XHJcbiAgICB0aGlzLmRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2xvc2UgZHJvcGRvd24gd2hlbiBjbGlja2luZyBvdXRzaWRlXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uQ2xpY2tPdXRzaWRlKGV2ZW50OiBFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuZHJvcGRvd25Db250YWluZXIgJiYgIXRoaXMuZHJvcGRvd25Db250YWluZXIubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuZHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBpbmxpbmUtYmxvY2sgdy1mdWxsXCIgI2Ryb3Bkb3duQ29udGFpbmVyPlxyXG4gICAgPCEtLSBEcm9wZG93biBCdXR0b24gLS0+XHJcbiAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bigkZXZlbnQpXCJcclxuICAgICAgICBjbGFzcz1cInctZnVsbCBweC0zIHB5LTIgdGV4dC1jZW50ZXIgdGV4dC1ncmF5LTcwMCBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbGcgc2hhZG93LXNtIGZvY3VzOm91dGxpbmUtbm9uZVwiPlxyXG4gICAgICAgIHt7IGRpc3BsYXlGbiA/IGRpc3BsYXlGbihzZWxlY3RlZCkgOiBzZWxlY3RlZCB9fVxyXG4gICAgICAgIDxzdmcgY2xhc3M9XCJ3LTQgaC00IGlubGluZS1ibG9jayBtbC0yXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS13aWR0aD1cIjJcIiBkPVwiTTE5IDlsLTcgNy03LTdcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPCEtLSBEcm9wZG93biBMaXN0IC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cImRyb3Bkb3duT3BlblwiXHJcbiAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB6LTEwIG10LTEgdy1mdWxsIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1sZyBzaGFkb3ctbGcgbWF4LWgtNjAgb3ZlcmZsb3cteS1hdXRvIGN1c3RvbS1zY3JvbGxiYXJcIj5cclxuICAgICAgICA8dWw+XHJcbiAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnM7IGxldCBpID0gaW5kZXhcIiAoY2xpY2spPVwib25PcHRpb25DbGljayhvcHRpb24sIGkpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicHgtNCBweS0yIGN1cnNvci1wb2ludGVyIGhvdmVyOmJnLWdyYXktMTAwXCIgW25nQ2xhc3NdPVwieydiZy1ibHVlLTEwMCc6IG9wdGlvbiA9PT0gc2VsZWN0ZWR9XCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkaXNwbGF5Rm4gPyBkaXNwbGF5Rm4ob3B0aW9uKSA6IG9wdGlvbiB9fVxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19