@taiga-ui/layout
Version:
A package with Taiga UI layout components
81 lines • 20 kB
JavaScript
import { NgForOf, NgIf, NgTemplateOutlet } from '@angular/common';
import { ChangeDetectionStrategy, Component, computed, ContentChildren, ElementRef, inject, Input, signal, TemplateRef, ViewChild, } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { NgControl } from '@angular/forms';
import { ResizeObserverService } from '@ng-web-apis/resize-observer';
import { EMPTY_QUERY } from '@taiga-ui/cdk/constants';
import { TuiItem } from '@taiga-ui/cdk/directives/item';
import { tuiControlValue, tuiQueryListChanges, tuiZonefull, } from '@taiga-ui/cdk/observables';
import { tuiIsControlEmpty } from '@taiga-ui/cdk/utils/miscellaneous';
import { TuiButton, tuiButtonOptionsProvider } from '@taiga-ui/core/components/button';
import { TuiTextfieldOptionsDirective } from '@taiga-ui/core/components/textfield';
import { distinctUntilChanged, map, merge, switchMap } from 'rxjs';
import { TuiSearchFilterComponent } from './search-filter.component';
import * as i0 from "@angular/core";
import * as i1 from "@taiga-ui/core/components/textfield";
const WIDTH = 12;
class TuiSearchFiltersComponent {
constructor() {
this.children = EMPTY_QUERY;
this.controls = signal([]);
this.templates = EMPTY_QUERY;
this.overflown = toSignal(inject(ResizeObserverService, { self: true }).pipe(map((entry) => {
const width = entry[0]?.contentRect.width ?? 0;
return Math.floor((width - this.more) / WIDTH / this.unit);
}), distinctUntilChanged(), tuiZonefull()), { initialValue: 0 });
this.enabled = computed(() => this.controls().some(({ control }, index) => control && index >= this.overflown() && !tuiIsControlEmpty(control)));
this.size = 'm';
}
// TODO: Refactor to signal queries when Angular is updated
ngAfterContentInit() {
tuiQueryListChanges(this.children)
.pipe(switchMap((all) => merge(...all.map((c) => tuiControlValue(c)))), map(() => this.children.toArray()))
.subscribe((controls) => this.controls.set(controls));
}
onReset() {
this.children.forEach(({ control }, index) => {
if (control && index >= this.overflown()) {
control.setValue(null);
}
});
}
get unit() {
return this.rem?.nativeElement.offsetWidth || 16;
}
get more() {
return this.button?.nativeElement.clientWidth || 0;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiSearchFiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiSearchFiltersComponent, isStandalone: true, selector: "tui-search-filters", inputs: { size: "size" }, providers: [
ResizeObserverService,
tuiButtonOptionsProvider({ size: 'xs', appearance: 'flat' }),
], queries: [{ propertyName: "children", predicate: NgControl, descendants: true }, { propertyName: "templates", predicate: TuiItem, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "rem", first: true, predicate: ["rem"], descendants: true }, { propertyName: "button", first: true, predicate: TuiButton, descendants: true, read: ElementRef }], hostDirectives: [{ directive: i1.TuiTextfieldOptionsDirective, inputs: ["tuiTextfieldSize", "size"] }], ngImport: i0, template: "<ng-container *ngFor=\"let template of templates; let i = index\">\n <ng-container\n *ngIf=\"i < overflown()\"\n [ngTemplateOutlet]=\"template\"\n />\n</ng-container>\n<div\n #rem\n class=\"t-rem\"\n></div>\n<button\n *ngIf=\"overflown() < templates.length\"\n appearance=\"secondary\"\n tuiIconButton\n tuiSearchFilter\n type=\"button\"\n class=\"t-button\"\n [class._active]=\"enabled()\"\n [size]=\"size\"\n>\n <form\n class=\"t-form\"\n (reset)=\"onReset()\"\n >\n <fieldset\n class=\"t-header\"\n [disabled]=\"!enabled()\"\n >\n <ng-content />\n </fieldset>\n <ng-container *ngFor=\"let template of templates; let i = index\">\n <ng-container\n *ngIf=\"i >= overflown()\"\n [ngTemplateOutlet]=\"template\"\n />\n </ng-container>\n </form>\n</button>\n", styles: [":host{display:flex;flex:1;gap:inherit;justify-content:flex-end;min-inline-size:0}.t-rem{position:absolute;inline-size:1rem}.t-button{overflow:visible}.t-button._active:after{content:\"\";position:absolute;top:.25rem;right:.25rem;display:block;inline-size:.625rem;block-size:.625rem;background:var(--tui-status-warning);transform:translate(50%,-50%);border-radius:100%;margin:0}.t-form{display:flex;min-inline-size:25.5rem;max-inline-size:33rem;flex-direction:column;gap:.75rem;padding:0 1.5rem 1.5rem;box-sizing:border-box}.t-header{display:flex;justify-content:space-between;padding:1.25rem 0;margin:0 0 .5rem;border:none;box-shadow:inset 0 -1px var(--tui-border-normal);font:var(--tui-font-text-ui-l);font-weight:700}\n"], dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: TuiSearchFilterComponent, selector: "button[tuiSearchFilter]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
export { TuiSearchFiltersComponent };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiSearchFiltersComponent, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'tui-search-filters', imports: [NgForOf, NgIf, NgTemplateOutlet, TuiButton, TuiSearchFilterComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
ResizeObserverService,
tuiButtonOptionsProvider({ size: 'xs', appearance: 'flat' }),
], hostDirectives: [
{
directive: TuiTextfieldOptionsDirective,
inputs: ['tuiTextfieldSize: size'],
},
], template: "<ng-container *ngFor=\"let template of templates; let i = index\">\n <ng-container\n *ngIf=\"i < overflown()\"\n [ngTemplateOutlet]=\"template\"\n />\n</ng-container>\n<div\n #rem\n class=\"t-rem\"\n></div>\n<button\n *ngIf=\"overflown() < templates.length\"\n appearance=\"secondary\"\n tuiIconButton\n tuiSearchFilter\n type=\"button\"\n class=\"t-button\"\n [class._active]=\"enabled()\"\n [size]=\"size\"\n>\n <form\n class=\"t-form\"\n (reset)=\"onReset()\"\n >\n <fieldset\n class=\"t-header\"\n [disabled]=\"!enabled()\"\n >\n <ng-content />\n </fieldset>\n <ng-container *ngFor=\"let template of templates; let i = index\">\n <ng-container\n *ngIf=\"i >= overflown()\"\n [ngTemplateOutlet]=\"template\"\n />\n </ng-container>\n </form>\n</button>\n", styles: [":host{display:flex;flex:1;gap:inherit;justify-content:flex-end;min-inline-size:0}.t-rem{position:absolute;inline-size:1rem}.t-button{overflow:visible}.t-button._active:after{content:\"\";position:absolute;top:.25rem;right:.25rem;display:block;inline-size:.625rem;block-size:.625rem;background:var(--tui-status-warning);transform:translate(50%,-50%);border-radius:100%;margin:0}.t-form{display:flex;min-inline-size:25.5rem;max-inline-size:33rem;flex-direction:column;gap:.75rem;padding:0 1.5rem 1.5rem;box-sizing:border-box}.t-header{display:flex;justify-content:space-between;padding:1.25rem 0;margin:0 0 .5rem;border:none;box-shadow:inset 0 -1px var(--tui-border-normal);font:var(--tui-font-text-ui-l);font-weight:700}\n"] }]
}], propDecorators: { rem: [{
type: ViewChild,
args: ['rem']
}], button: [{
type: ViewChild,
args: [TuiButton, { read: ElementRef }]
}], children: [{
type: ContentChildren,
args: [NgControl, { descendants: true }]
}], templates: [{
type: ContentChildren,
args: [TuiItem, { descendants: true, read: TemplateRef }]
}], size: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWZpbHRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGF5b3V0L2NvbXBvbmVudHMvc2VhcmNoL3NlYXJjaC1maWx0ZXJzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xheW91dC9jb21wb25lbnRzL3NlYXJjaC9zZWFyY2gtZmlsdGVycy50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFaEUsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLGVBQWUsRUFDZixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDdEQsT0FBTyxFQUNILGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsV0FBVyxHQUNkLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFDLFNBQVMsRUFBRSx3QkFBd0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JGLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBRWpGLE9BQU8sRUFB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LG1EQWVnQixTQUFTLCtEQUtULE9BQU8sMkJBQTRCLFdBQVcsa0pBUnBELFNBQVMsMkJBQVMsVUFBVSxxSUN4RDNDLHU3QkFzQ0EsMndCRERjLE9BQU8sbUhBQUUsSUFBSSw2RkFBRSxnQkFBZ0Isb0pBQUUsU0FBUyxvSUFBRSx3QkFBd0I7O1NBZXJFLHlCQUF5Qjs0RkFBekIseUJBQXlCO2tCQWxCckMsU0FBUztpQ0FDTSxJQUFJLFlBQ04sb0JBQW9CLFdBQ3JCLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsd0JBQXdCLENBQUMsbUJBRzlELHVCQUF1QixDQUFDLE1BQU0sYUFDcEM7d0JBQ1AscUJBQXFCO3dCQUNyQix3QkFBd0IsQ0FBQyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBQyxDQUFDO3FCQUM3RCxrQkFDZTt3QkFDWjs0QkFDSSxTQUFTLEVBQUUsNEJBQTRCOzRCQUN2QyxNQUFNLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQzt5QkFDckM7cUJBQ0o7OEJBSWdCLEdBQUc7c0JBRG5CLFNBQVM7dUJBQUMsS0FBSztnQkFJQyxNQUFNO3NCQUR0QixTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUM7Z0JBSXZCLFFBQVE7c0JBRHhCLGVBQWU7dUJBQUMsU0FBUyxFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQztnQkFNNUIsU0FBUztzQkFEM0IsZUFBZTt1QkFBQyxPQUFPLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUM7Z0JBd0J6RCxJQUFJO3NCQURWLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05nRm9yT2YsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7QWZ0ZXJDb250ZW50SW5pdCwgUXVlcnlMaXN0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBzaWduYWwsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dG9TaWduYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7TmdDb250cm9sfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1Jlc2l6ZU9ic2VydmVyU2VydmljZX0gZnJvbSAnQG5nLXdlYi1hcGlzL3Jlc2l6ZS1vYnNlcnZlcic7XG5pbXBvcnQge0VNUFRZX1FVRVJZfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NvbnN0YW50cyc7XG5pbXBvcnQge1R1aUl0ZW19IGZyb20gJ0B0YWlnYS11aS9jZGsvZGlyZWN0aXZlcy9pdGVtJztcbmltcG9ydCB7XG4gICAgdHVpQ29udHJvbFZhbHVlLFxuICAgIHR1aVF1ZXJ5TGlzdENoYW5nZXMsXG4gICAgdHVpWm9uZWZ1bGwsXG59IGZyb20gJ0B0YWlnYS11aS9jZGsvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHt0dWlJc0NvbnRyb2xFbXB0eX0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9taXNjZWxsYW5lb3VzJztcbmltcG9ydCB7VHVpQnV0dG9uLCB0dWlCdXR0b25PcHRpb25zUHJvdmlkZXJ9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvYnV0dG9uJztcbmltcG9ydCB7VHVpVGV4dGZpZWxkT3B0aW9uc0RpcmVjdGl2ZX0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy90ZXh0ZmllbGQnO1xuaW1wb3J0IHR5cGUge1R1aVNpemVTfSBmcm9tICdAdGFpZ2EtdWkvY29yZS90eXBlcyc7XG5pbXBvcnQge2Rpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIG1lcmdlLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1R1aVNlYXJjaEZpbHRlckNvbXBvbmVudH0gZnJvbSAnLi9zZWFyY2gtZmlsdGVyLmNvbXBvbmVudCc7XG5cbmNvbnN0IFdJRFRIID0gMTI7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICd0dWktc2VhcmNoLWZpbHRlcnMnLFxuICAgIGltcG9ydHM6IFtOZ0Zvck9mLCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0LCBUdWlCdXR0b24sIFR1aVNlYXJjaEZpbHRlckNvbXBvbmVudF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC1maWx0ZXJzLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NlYXJjaC1maWx0ZXJzLnN0eWxlcy5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIFJlc2l6ZU9ic2VydmVyU2VydmljZSxcbiAgICAgICAgdHVpQnV0dG9uT3B0aW9uc1Byb3ZpZGVyKHtzaXplOiAneHMnLCBhcHBlYXJhbmNlOiAnZmxhdCd9KSxcbiAgICBdLFxuICAgIGhvc3REaXJlY3RpdmVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZTogVHVpVGV4dGZpZWxkT3B0aW9uc0RpcmVjdGl2ZSxcbiAgICAgICAgICAgIGlucHV0czogWyd0dWlUZXh0ZmllbGRTaXplOiBzaXplJ10sXG4gICAgICAgIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpU2VhcmNoRmlsdGVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICAgIEBWaWV3Q2hpbGQoJ3JlbScpXG4gICAgcHJpdmF0ZSByZWFkb25seSByZW0/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoVHVpQnV0dG9uLCB7cmVhZDogRWxlbWVudFJlZn0pXG4gICAgcHJpdmF0ZSByZWFkb25seSBidXR0b24/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oTmdDb250cm9sLCB7ZGVzY2VuZGFudHM6IHRydWV9KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW46IFF1ZXJ5TGlzdDxOZ0NvbnRyb2w+ID0gRU1QVFlfUVVFUlk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyb2xzID0gc2lnbmFsPHJlYWRvbmx5IE5nQ29udHJvbFtdPihbXSk7XG5cbiAgICBAQ29udGVudENoaWxkcmVuKFR1aUl0ZW0sIHtkZXNjZW5kYW50czogdHJ1ZSwgcmVhZDogVGVtcGxhdGVSZWZ9KVxuICAgIHByb3RlY3RlZCByZWFkb25seSB0ZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PiA9IEVNUFRZX1FVRVJZO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG92ZXJmbG93biA9IHRvU2lnbmFsKFxuICAgICAgICBpbmplY3QoUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlLCB7c2VsZjogdHJ1ZX0pLnBpcGUoXG4gICAgICAgICAgICBtYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBlbnRyeVswXT8uY29udGVudFJlY3Qud2lkdGggPz8gMDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKCh3aWR0aCAtIHRoaXMubW9yZSkgLyBXSURUSCAvIHRoaXMudW5pdCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICB0dWlab25lZnVsbCgpLFxuICAgICAgICApLFxuICAgICAgICB7aW5pdGlhbFZhbHVlOiAwfSxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGVuYWJsZWQgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICB0aGlzLmNvbnRyb2xzKCkuc29tZShcbiAgICAgICAgICAgICh7Y29udHJvbH0sIGluZGV4KSA9PlxuICAgICAgICAgICAgICAgIGNvbnRyb2wgJiYgaW5kZXggPj0gdGhpcy5vdmVyZmxvd24oKSAmJiAhdHVpSXNDb250cm9sRW1wdHkoY29udHJvbCksXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNpemU6IFR1aVNpemVTID0gJ20nO1xuXG4gICAgLy8gVE9ETzogUmVmYWN0b3IgdG8gc2lnbmFsIHF1ZXJpZXMgd2hlbiBBbmd1bGFyIGlzIHVwZGF0ZWRcbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgICAgICB0dWlRdWVyeUxpc3RDaGFuZ2VzKHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKGFsbCkgPT4gbWVyZ2UoLi4uYWxsLm1hcCgoYykgPT4gdHVpQ29udHJvbFZhbHVlKGMpKSkpLFxuICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB0aGlzLmNoaWxkcmVuLnRvQXJyYXkoKSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChjb250cm9scykgPT4gdGhpcy5jb250cm9scy5zZXQoY29udHJvbHMpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25SZXNldCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKCh7Y29udHJvbH0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29udHJvbCAmJiBpbmRleCA+PSB0aGlzLm92ZXJmbG93bigpKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgdW5pdCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW0/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMTY7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgbW9yZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5idXR0b24/Lm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggfHwgMDtcbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0ZW1wbGF0ZSBvZiB0ZW1wbGF0ZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiaSA8IG92ZXJmbG93bigpXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIlxuICAgIC8+XG48L25nLWNvbnRhaW5lcj5cbjxkaXZcbiAgICAjcmVtXG4gICAgY2xhc3M9XCJ0LXJlbVwiXG4+PC9kaXY+XG48YnV0dG9uXG4gICAgKm5nSWY9XCJvdmVyZmxvd24oKSA8IHRlbXBsYXRlcy5sZW5ndGhcIlxuICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgIHR1aUljb25CdXR0b25cbiAgICB0dWlTZWFyY2hGaWx0ZXJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cInQtYnV0dG9uXCJcbiAgICBbY2xhc3MuX2FjdGl2ZV09XCJlbmFibGVkKClcIlxuICAgIFtzaXplXT1cInNpemVcIlxuPlxuICAgIDxmb3JtXG4gICAgICAgIGNsYXNzPVwidC1mb3JtXCJcbiAgICAgICAgKHJlc2V0KT1cIm9uUmVzZXQoKVwiXG4gICAgPlxuICAgICAgICA8ZmllbGRzZXRcbiAgICAgICAgICAgIGNsYXNzPVwidC1oZWFkZXJcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlbmFibGVkKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGVudCAvPlxuICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0ZW1wbGF0ZSBvZiB0ZW1wbGF0ZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImkgPj0gb3ZlcmZsb3duKClcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZm9ybT5cbjwvYnV0dG9uPlxuIl19