@recursyve/ngx-material-components 18.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/index.mjs +14 -0
- package/esm2022/recursyve-ngx-material-components.mjs +5 -0
- package/esm2022/typeahead/async-typeahead.mjs +112 -0
- package/esm2022/typeahead/constants.mjs +3 -0
- package/esm2022/typeahead/index.mjs +5 -0
- package/esm2022/typeahead/provider.mjs +9 -0
- package/esm2022/typeahead/providers/async-typeahead.provider.mjs +3 -0
- package/esm2022/typeahead/providers/async-typeahead.service.mjs +129 -0
- package/esm2022/typeahead/providers/index.mjs +3 -0
- package/esm2022/typeahead/recursyve-ngx-material-components-typeahead.mjs +5 -0
- package/esm2022/typeahead/typeahead-base.mjs +456 -0
- package/esm2022/typeahead/typeahead.mjs +79 -0
- package/fesm2022/recursyve-ngx-material-components-typeahead.mjs +772 -0
- package/fesm2022/recursyve-ngx-material-components-typeahead.mjs.map +1 -0
- package/fesm2022/recursyve-ngx-material-components.mjs +20 -0
- package/fesm2022/recursyve-ngx-material-components.mjs.map +1 -0
- package/index.d.ts +8 -0
- package/package.json +31 -0
- package/typeahead/async-typeahead.d.ts +23 -0
- package/typeahead/constants.d.ts +2 -0
- package/typeahead/index.d.ts +4 -0
- package/typeahead/provider.d.ts +3 -0
- package/typeahead/providers/async-typeahead.provider.d.ts +11 -0
- package/typeahead/providers/async-typeahead.service.d.ts +39 -0
- package/typeahead/providers/index.d.ts +2 -0
- package/typeahead/typeahead-base.d.ts +99 -0
- package/typeahead/typeahead.d.ts +12 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { CdkConnectedOverlay, CdkOverlayOrigin } from "@angular/cdk/overlay";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, computed, input, ViewEncapsulation } from "@angular/core";
|
|
3
|
+
import { ReactiveFormsModule } from "@angular/forms";
|
|
4
|
+
import { MatIconButton } from "@angular/material/button";
|
|
5
|
+
import { MatOption } from "@angular/material/core";
|
|
6
|
+
import { MatFormField, MatFormFieldControl } from "@angular/material/form-field";
|
|
7
|
+
import { MatInput } from "@angular/material/input";
|
|
8
|
+
import { matSelectAnimations } from "@angular/material/select";
|
|
9
|
+
import { NiceTypeaheadBase } from "./typeahead-base";
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@angular/forms";
|
|
12
|
+
export class NiceTypeahead extends NiceTypeaheadBase {
|
|
13
|
+
values = input.required();
|
|
14
|
+
searchFn = input();
|
|
15
|
+
filteredValues = computed(() => this.filterValuesFromSearch(this._searchValue(), this.values()));
|
|
16
|
+
onFocusChanged(isFocused) {
|
|
17
|
+
super.onFocusChanged(isFocused);
|
|
18
|
+
if (isFocused) {
|
|
19
|
+
this._searchControl.patchValue("");
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
filterValuesFromSearch(searchValue, values) {
|
|
23
|
+
if (!searchValue) {
|
|
24
|
+
return values;
|
|
25
|
+
}
|
|
26
|
+
const _searchValue = searchValue.toLowerCase();
|
|
27
|
+
const fn = this.searchFn();
|
|
28
|
+
if (fn) {
|
|
29
|
+
return values.filter((v) => fn(_searchValue, v));
|
|
30
|
+
}
|
|
31
|
+
return values.filter((v) => {
|
|
32
|
+
if (typeof v === "string") {
|
|
33
|
+
return v.toLowerCase().includes(_searchValue);
|
|
34
|
+
}
|
|
35
|
+
const property = this.labelProperty();
|
|
36
|
+
if (!property) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (typeof v === "object" && v && property in v) {
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
41
|
+
// @ts-ignore
|
|
42
|
+
return v[property].toString().toLowerCase().includes(_searchValue);
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NiceTypeahead, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
48
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: NiceTypeahead, isStandalone: true, selector: "nice-typeahead", inputs: { values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: true, transformFunction: null }, searchFn: { classPropertyName: "searchFn", publicName: "searchFn", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "combobox", "aria-haspopup": "listbox" }, listeners: { "keydown": "_handleKeydown($event)", "focus": "onFocusChanged(true)", "blur": "onFocusChanged(false)" }, properties: { "attr.id": "id", "attr.aria-controls": "panelOpen ? id + \"-panel\" : null", "attr.aria-expanded": "panelOpen", "attr.aria-required": "required.toString()", "attr.aria-disabled": "disabled.toString()", "attr.aria-invalid": "errorState", "class.nice-typeahead-disabled": "disabled", "class.nice-typeahead-invalid": "errorState", "class.nice-typeahead-required": "required", "class.nice-typeahead-empty": "empty" }, classAttribute: "nice-typeahead" }, providers: [{ provide: MatFormFieldControl, useExisting: NiceTypeahead }], usesInheritance: true, ngImport: i0, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n class=\"nice-typeahead\"\n cdk-overlay-origin\n>\n <div class=\"nice-typeahead-value\">\n @if (_empty()) {\n <span class=\"nice-typeahead-placeholder mat-mdc-select-min-line\">{{ _placeholder() }}</span>\n } @else {\n <span class=\"nice-typeahead-value-text\">\n <span class=\"mat-mdc-select-min-line\">\n @if (_value(); as activeValue) {\n {{ formatLabel(activeValue) }}\n }\n </span>\n </span>\n }\n </div>\n\n <div class=\"nice-typeahead-suffix\">\n @if (_empty()) {\n <div class=\"mat-mdc-select-arrow\">\n <svg viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M7 10l5 5 5-5z\"></path>\n </svg>\n </div>\n } @else {\n <button class=\"nice-typeahead-remove\" mat-icon-button (click)=\"$event.stopPropagation(); removeActiveValue()\">\n <svg viewBox=\"0 -960 960 960\">\n <path d=\"m291-240-51-51 189-189-189-189 51-51 189 189 189-189 51 51-189 189 189 189-51 51-189-189-189 189Z\"/>\n </svg>\n </button>\n }\n </div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayWidth]=\"_overlayWidth\"\n [cdkConnectedOverlayOrigin]=\"_preferredOverlayOrigin || fallbackOverlayOrigin\"\n (attach)=\"_onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n role=\"listbox\"\n tabindex=\"-1\"\n class=\"nice-typeahead-panel nice-typeahead--open\"\n [attr.id]=\"id + '-panel'\"\n [@transformPanel]=\"'showing'\"\n (@transformPanel.done)=\"_panelDoneAnimatingStream.next($event.toState)\"\n (keydown)=\"_handleKeydown($event)\"\n (scrollend)=\"_handleScrollEnd()\"\n >\n <div class=\"nice-typeahead-search-input\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input\n #input\n class=\"nice-typeahead__input\"\n matInput\n [formControl]=\"_searchControl\"\n >\n </mat-form-field>\n </div>\n\n <div #optionsContainer class=\"nice-typeahead-options\" role=\"presentation\">\n @for (item of filteredValues(); track item) {\n <mat-option [value]=\"item\">\n {{ formatLabel(item) }}\n </mat-option>\n } @empty {\n <mat-option disabled>\n <span class=\"nice-typeahead__no-items\">No items found</span>\n </mat-option>\n }\n </div>\n </div>\n</ng-template>\n", styles: ["nice-typeahead,nice-async-typeahead{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-app-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-app-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-app-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-app-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-app-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-app-body-large-tracking))}nice-typeahead .nice-typeahead,nice-async-typeahead .nice-typeahead{width:100%;display:inline-flex;align-items:center;justify-content:space-between;cursor:pointer;position:relative;box-sizing:border-box}nice-typeahead .nice-typeahead-suffix,nice-async-typeahead .nice-typeahead-suffix{height:24px;flex-shrink:0;display:inline-flex;align-items:center;--mdc-icon-button-state-layer-size: 24px}nice-typeahead .nice-typeahead-suffix .nice-typeahead-remove,nice-async-typeahead .nice-typeahead-suffix .nice-typeahead-remove{margin-right:-6px}nice-typeahead .nice-typeahead-value,nice-async-typeahead .nice-typeahead-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}nice-typeahead .nice-typeahead-value-text,nice-async-typeahead .nice-typeahead-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nice-typeahead .mat-mdc-select-min-line:empty:before,nice-async-typeahead .mat-mdc-select-min-line:empty:before{content:\" \";white-space:pre;width:1px;display:inline-block;visibility:hidden}nice-typeahead .nice-typeahead__input,nice-async-typeahead .nice-typeahead__input{border:none;outline:none;box-shadow:none;background:none;padding:0;margin:0;color:inherit}.mat-mdc-form-field-type-nice-typeahead:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-nice-typeahead.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}div.nice-typeahead-panel{width:100%;outline:0;padding:8px 0;border-radius:4px;box-sizing:border-box;position:static;background-color:var(--mat-select-panel-background-color, var(--mat-app-surface-container))}div.nice-typeahead-panel .nice-typeahead-search-input{padding-left:8px;padding-right:8px;padding-bottom:8px}div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field-infix{width:100%}div.nice-typeahead-panel .nice-typeahead-options{overflow:auto;max-height:384px}div.nice-typeahead-panel{box-shadow:var(--mat-select-container-elevation-shadow)}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", 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]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }], animations: [matSelectAnimations.transformPanel], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
49
|
+
}
|
|
50
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NiceTypeahead, decorators: [{
|
|
51
|
+
type: Component,
|
|
52
|
+
args: [{ selector: "nice-typeahead", standalone: true, imports: [
|
|
53
|
+
CdkOverlayOrigin,
|
|
54
|
+
CdkConnectedOverlay,
|
|
55
|
+
ReactiveFormsModule,
|
|
56
|
+
MatOption,
|
|
57
|
+
MatFormField,
|
|
58
|
+
MatInput,
|
|
59
|
+
MatIconButton
|
|
60
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, animations: [matSelectAnimations.transformPanel], providers: [{ provide: MatFormFieldControl, useExisting: NiceTypeahead }], host: {
|
|
61
|
+
"role": "combobox",
|
|
62
|
+
"aria-haspopup": "listbox",
|
|
63
|
+
"class": "nice-typeahead",
|
|
64
|
+
"[attr.id]": "id",
|
|
65
|
+
"[attr.aria-controls]": "panelOpen ? id + \"-panel\" : null",
|
|
66
|
+
"[attr.aria-expanded]": "panelOpen",
|
|
67
|
+
"[attr.aria-required]": "required.toString()",
|
|
68
|
+
"[attr.aria-disabled]": "disabled.toString()",
|
|
69
|
+
"[attr.aria-invalid]": "errorState",
|
|
70
|
+
"[class.nice-typeahead-disabled]": "disabled",
|
|
71
|
+
"[class.nice-typeahead-invalid]": "errorState",
|
|
72
|
+
"[class.nice-typeahead-required]": "required",
|
|
73
|
+
"[class.nice-typeahead-empty]": "empty",
|
|
74
|
+
"(keydown)": "_handleKeydown($event)",
|
|
75
|
+
"(focus)": "onFocusChanged(true)",
|
|
76
|
+
"(blur)": "onFocusChanged(false)"
|
|
77
|
+
}, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n class=\"nice-typeahead\"\n cdk-overlay-origin\n>\n <div class=\"nice-typeahead-value\">\n @if (_empty()) {\n <span class=\"nice-typeahead-placeholder mat-mdc-select-min-line\">{{ _placeholder() }}</span>\n } @else {\n <span class=\"nice-typeahead-value-text\">\n <span class=\"mat-mdc-select-min-line\">\n @if (_value(); as activeValue) {\n {{ formatLabel(activeValue) }}\n }\n </span>\n </span>\n }\n </div>\n\n <div class=\"nice-typeahead-suffix\">\n @if (_empty()) {\n <div class=\"mat-mdc-select-arrow\">\n <svg viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M7 10l5 5 5-5z\"></path>\n </svg>\n </div>\n } @else {\n <button class=\"nice-typeahead-remove\" mat-icon-button (click)=\"$event.stopPropagation(); removeActiveValue()\">\n <svg viewBox=\"0 -960 960 960\">\n <path d=\"m291-240-51-51 189-189-189-189 51-51 189 189 189-189 51 51-189 189 189 189-51 51-189-189-189 189Z\"/>\n </svg>\n </button>\n }\n </div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayWidth]=\"_overlayWidth\"\n [cdkConnectedOverlayOrigin]=\"_preferredOverlayOrigin || fallbackOverlayOrigin\"\n (attach)=\"_onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n role=\"listbox\"\n tabindex=\"-1\"\n class=\"nice-typeahead-panel nice-typeahead--open\"\n [attr.id]=\"id + '-panel'\"\n [@transformPanel]=\"'showing'\"\n (@transformPanel.done)=\"_panelDoneAnimatingStream.next($event.toState)\"\n (keydown)=\"_handleKeydown($event)\"\n (scrollend)=\"_handleScrollEnd()\"\n >\n <div class=\"nice-typeahead-search-input\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input\n #input\n class=\"nice-typeahead__input\"\n matInput\n [formControl]=\"_searchControl\"\n >\n </mat-form-field>\n </div>\n\n <div #optionsContainer class=\"nice-typeahead-options\" role=\"presentation\">\n @for (item of filteredValues(); track item) {\n <mat-option [value]=\"item\">\n {{ formatLabel(item) }}\n </mat-option>\n } @empty {\n <mat-option disabled>\n <span class=\"nice-typeahead__no-items\">No items found</span>\n </mat-option>\n }\n </div>\n </div>\n</ng-template>\n", styles: ["nice-typeahead,nice-async-typeahead{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-app-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-app-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-app-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-app-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-app-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-app-body-large-tracking))}nice-typeahead .nice-typeahead,nice-async-typeahead .nice-typeahead{width:100%;display:inline-flex;align-items:center;justify-content:space-between;cursor:pointer;position:relative;box-sizing:border-box}nice-typeahead .nice-typeahead-suffix,nice-async-typeahead .nice-typeahead-suffix{height:24px;flex-shrink:0;display:inline-flex;align-items:center;--mdc-icon-button-state-layer-size: 24px}nice-typeahead .nice-typeahead-suffix .nice-typeahead-remove,nice-async-typeahead .nice-typeahead-suffix .nice-typeahead-remove{margin-right:-6px}nice-typeahead .nice-typeahead-value,nice-async-typeahead .nice-typeahead-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}nice-typeahead .nice-typeahead-value-text,nice-async-typeahead .nice-typeahead-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nice-typeahead .mat-mdc-select-min-line:empty:before,nice-async-typeahead .mat-mdc-select-min-line:empty:before{content:\" \";white-space:pre;width:1px;display:inline-block;visibility:hidden}nice-typeahead .nice-typeahead__input,nice-async-typeahead .nice-typeahead__input{border:none;outline:none;box-shadow:none;background:none;padding:0;margin:0;color:inherit}.mat-mdc-form-field-type-nice-typeahead:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-nice-typeahead.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}div.nice-typeahead-panel{width:100%;outline:0;padding:8px 0;border-radius:4px;box-sizing:border-box;position:static;background-color:var(--mat-select-panel-background-color, var(--mat-app-surface-container))}div.nice-typeahead-panel .nice-typeahead-search-input{padding-left:8px;padding-right:8px;padding-bottom:8px}div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field-infix{width:100%}div.nice-typeahead-panel .nice-typeahead-options{overflow:auto;max-height:384px}div.nice-typeahead-panel{box-shadow:var(--mat-select-container-elevation-shadow)}\n"] }]
|
|
78
|
+
}] });
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWFoZWFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21hdGVyaWFsLWNvbXBvbmVudHMvdHlwZWFoZWFkL3R5cGVhaGVhZC50cyIsIi4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC1jb21wb25lbnRzL3R5cGVhaGVhZC90eXBlYWhlYWQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7QUF5Q3JELE1BQU0sT0FBTyxhQUFpQixTQUFRLGlCQUFvQjtJQUN0QyxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBTyxDQUFDO0lBQy9CLFFBQVEsR0FBRyxLQUFLLEVBQXFCLENBQUM7SUFFdEMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENB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QUFFLFVBQVU7d0JBQzdDLDhCQUE4QixFQUFFLE9BQU87d0JBQ3ZDLFdBQVcsRUFBRSx3QkFBd0I7d0JBQ3JDLFNBQVMsRUFBRSxzQkFBc0I7d0JBQ2pDLFFBQVEsRUFBRSx1QkFBdUI7cUJBQ3BDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrQ29ubmVjdGVkT3ZlcmxheSwgQ2RrT3ZlcmxheU9yaWdpbiB9IGZyb20gXCJAYW5ndWxhci9jZGsvb3ZlcmxheVwiO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBNYXRJY29uQnV0dG9uIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2J1dHRvblwiO1xuaW1wb3J0IHsgTWF0T3B0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NvcmVcIjtcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCwgTWF0Rm9ybUZpZWxkQ29udHJvbCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkXCI7XG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pbnB1dFwiO1xuaW1wb3J0IHsgbWF0U2VsZWN0QW5pbWF0aW9ucyB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3RcIjtcbmltcG9ydCB7IE5pY2VUeXBlYWhlYWRCYXNlIH0gZnJvbSBcIi4vdHlwZWFoZWFkLWJhc2VcIjtcblxuZXhwb3J0IHR5cGUgU2VhcmNoRnVuY3Rpb248VD4gPSAoc2VhcmNoOiBzdHJpbmcsIGl0ZW06IFQpID0+IGJvb2xlYW47XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm5pY2UtdHlwZWFoZWFkXCIsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENka092ZXJsYXlPcmlnaW4sXG4gICAgICAgIENka0Nvbm5lY3RlZE92ZXJsYXksXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdE9wdGlvbixcbiAgICAgICAgTWF0Rm9ybUZpZWxkLFxuICAgICAgICBNYXRJbnB1dCxcbiAgICAgICAgTWF0SWNvbkJ1dHRvblxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6IFwiLi90eXBlYWhlYWQuaHRtbFwiLFxuICAgIHN0eWxlVXJsOiBcIi4vdHlwZWFoZWFkLnNjc3NcIixcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGFuaW1hdGlvbnM6IFttYXRTZWxlY3RBbmltYXRpb25zLnRyYW5zZm9ybVBhbmVsXSxcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1hdEZvcm1GaWVsZENvbnRyb2wsIHVzZUV4aXN0aW5nOiBOaWNlVHlwZWFoZWFkIH1dLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgXCJyb2xlXCI6IFwiY29tYm9ib3hcIixcbiAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibGlzdGJveFwiLFxuICAgICAgICBcImNsYXNzXCI6IFwibmljZS10eXBlYWhlYWRcIixcbiAgICAgICAgXCJbYXR0ci5pZF1cIjogXCJpZFwiLFxuICAgICAgICBcIlthdHRyLmFyaWEtY29udHJvbHNdXCI6IFwicGFuZWxPcGVuID8gaWQgKyBcXFwiLXBhbmVsXFxcIiA6IG51bGxcIixcbiAgICAgICAgXCJbYXR0ci5hcmlhLWV4cGFuZGVkXVwiOiBcInBhbmVsT3BlblwiLFxuICAgICAgICBcIlthdHRyLmFyaWEtcmVxdWlyZWRdXCI6IFwicmVxdWlyZWQudG9TdHJpbmcoKVwiLFxuICAgICAgICBcIlthdHRyLmFyaWEtZGlzYWJsZWRdXCI6IFwiZGlzYWJsZWQudG9TdHJpbmcoKVwiLFxuICAgICAgICBcIlthdHRyLmFyaWEtaW52YWxpZF1cIjogXCJlcnJvclN0YXRlXCIsXG4gICAgICAgIFwiW2NsYXNzLm5pY2UtdHlwZWFoZWFkLWRpc2FibGVkXVwiOiBcImRpc2FibGVkXCIsXG4gICAgICAgIFwiW2NsYXNzLm5pY2UtdHlwZWFoZWFkLWludmFsaWRdXCI6IFwiZXJyb3JTdGF0ZVwiLFxuICAgICAgICBcIltjbGFzcy5uaWNlLXR5cGVhaGVhZC1yZXF1aXJlZF1cIjogXCJyZXF1aXJlZFwiLFxuICAgICAgICBcIltjbGFzcy5uaWNlLXR5cGVhaGVhZC1lbXB0eV1cIjogXCJlbXB0eVwiLFxuICAgICAgICBcIihrZXlkb3duKVwiOiBcIl9oYW5kbGVLZXlkb3duKCRldmVudClcIixcbiAgICAgICAgXCIoZm9jdXMpXCI6IFwib25Gb2N1c0NoYW5nZWQodHJ1ZSlcIixcbiAgICAgICAgXCIoYmx1cilcIjogXCJvbkZvY3VzQ2hhbmdlZChmYWxzZSlcIlxuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgTmljZVR5cGVhaGVhZDxUPiBleHRlbmRzIE5pY2VUeXBlYWhlYWRCYXNlPFQ+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVzID0gaW5wdXQucmVxdWlyZWQ8VFtdPigpO1xuICAgIHB1YmxpYyByZWFkb25seSBzZWFyY2hGbiA9IGlucHV0PFNlYXJjaEZ1bmN0aW9uPFQ+PigpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGZpbHRlcmVkVmFsdWVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5maWx0ZXJWYWx1ZXNGcm9tU2VhcmNoKHRoaXMuX3NlYXJjaFZhbHVlKCksIHRoaXMudmFsdWVzKCkpKTtcblxuICAgIHB1YmxpYyBvdmVycmlkZSBvbkZvY3VzQ2hhbmdlZChpc0ZvY3VzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgc3VwZXIub25Gb2N1c0NoYW5nZWQoaXNGb2N1c2VkKTtcblxuICAgICAgICBpZiAoaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hDb250cm9sLnBhdGNoVmFsdWUoXCJcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZmlsdGVyVmFsdWVzRnJvbVNlYXJjaChzZWFyY2hWYWx1ZTogc3RyaW5nLCB2YWx1ZXM6IFRbXSk6IFRbXSB7XG4gICAgICAgIGlmICghc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBfc2VhcmNoVmFsdWUgPSBzZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBmbiA9IHRoaXMuc2VhcmNoRm4oKTtcbiAgICAgICAgaWYgKGZuKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzLmZpbHRlcigodikgPT4gZm4oX3NlYXJjaFZhbHVlLCB2KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWVzLmZpbHRlcigodikgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHYudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhfc2VhcmNoVmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMubGFiZWxQcm9wZXJ0eSgpO1xuICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgJiYgcHJvcGVydHkgaW4gdikge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZbcHJvcGVydHldLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhfc2VhcmNoVmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICAjZmFsbGJhY2tPdmVybGF5T3JpZ2luPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgY2xhc3M9XCJuaWNlLXR5cGVhaGVhZFwiXG4gICAgY2RrLW92ZXJsYXktb3JpZ2luXG4+XG4gICAgPGRpdiBjbGFzcz1cIm5pY2UtdHlwZWFoZWFkLXZhbHVlXCI+XG4gICAgICAgIEBpZiAoX2VtcHR5KCkpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmljZS10eXBlYWhlYWQtcGxhY2Vob2xkZXIgbWF0LW1kYy1zZWxlY3QtbWluLWxpbmVcIj57eyBfcGxhY2Vob2xkZXIoKSB9fTwvc3Bhbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5pY2UtdHlwZWFoZWFkLXZhbHVlLXRleHRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1tZGMtc2VsZWN0LW1pbi1saW5lXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoX3ZhbHVlKCk7IGFzIGFjdGl2ZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtYXRMYWJlbChhY3RpdmVWYWx1ZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm5pY2UtdHlwZWFoZWFkLXN1ZmZpeFwiPlxuICAgICAgICBAaWYgKF9lbXB0eSgpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1zZWxlY3QtYXJyb3dcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0cHhcIiBoZWlnaHQ9XCIyNHB4XCIgZm9jdXNhYmxlPVwiZmFsc2VcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDEwbDUgNSA1LTV6XCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5pY2UtdHlwZWFoZWFkLXJlbW92ZVwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyByZW1vdmVBY3RpdmVWYWx1ZSgpXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIm0yOTEtMjQwLTUxLTUxIDE4OS0xODktMTg5LTE4OSA1MS01MSAxODkgMTg5IDE4OS0xODkgNTEgNTEtMTg5IDE4OSAxODkgMTg5LTUxIDUxLTE4OS0xODktMTg5IDE4OVpcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAgIGNkay1jb25uZWN0ZWQtb3ZlcmxheVxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlMb2NrUG9zaXRpb25cbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwicGFuZWxPcGVuXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVdpZHRoXT1cIl9vdmVybGF5V2lkdGhcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cIl9wcmVmZXJyZWRPdmVybGF5T3JpZ2luIHx8IGZhbGxiYWNrT3ZlcmxheU9yaWdpblwiXG4gICAgKGF0dGFjaCk9XCJfb25BdHRhY2hlZCgpXCJcbiAgICAoYmFja2Ryb3BDbGljayk9XCJjbG9zZSgpXCJcbiAgICAoZGV0YWNoKT1cImNsb3NlKClcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgI3BhbmVsXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgIGNsYXNzPVwibmljZS10eXBlYWhlYWQtcGFuZWwgbmljZS10eXBlYWhlYWQtLW9wZW5cIlxuICAgICAgICBbYXR0ci5pZF09XCJpZCArICctcGFuZWwnXCJcbiAgICAgICAgW0B0cmFuc2Zvcm1QYW5lbF09XCInc2hvd2luZydcIlxuICAgICAgICAoQHRyYW5zZm9ybVBhbmVsLmRvbmUpPVwiX3BhbmVsRG9uZUFuaW1hdGluZ1N0cmVhbS5uZXh0KCRldmVudC50b1N0YXRlKVwiXG4gICAgICAgIChrZXlkb3duKT1cIl9oYW5kbGVLZXlkb3duKCRldmVudClcIlxuICAgICAgICAoc2Nyb2xsZW5kKT1cIl9oYW5kbGVTY3JvbGxFbmQoKVwiXG4gICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibmljZS10eXBlYWhlYWQtc2VhcmNoLWlucHV0XCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICNpbnB1dFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5pY2UtdHlwZWFoZWFkX19pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJfc2VhcmNoQ29udHJvbFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAjb3B0aW9uc0NvbnRhaW5lciBjbGFzcz1cIm5pY2UtdHlwZWFoZWFkLW9wdGlvbnNcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIGZpbHRlcmVkVmFsdWVzKCk7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBmb3JtYXRMYWJlbChpdGVtKSB9fVxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuaWNlLXR5cGVhaGVhZF9fbm8taXRlbXNcIj5ObyBpdGVtcyBmb3VuZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|