@ng-flexy/form-bootstrap
Version:
Flexy components and tools to build Angular 8+ applications
200 lines • 20.8 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
import { FormControl } from '@angular/forms';
import { findRawValue, prepareControlValue } from '@ng-flexy/form';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@ng-select/ng-select";
import * as i3 from "@angular/forms";
import * as i4 from "./readonly.component";
function FlexyControlSelect2Component_ng_select_0_ng_template_2_span_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "span", 9);
} if (rf & 2) {
const item_r5 = i0.ɵɵnextContext().item;
i0.ɵɵproperty("innerHTML", item_r5["prefixHtml"], i0.ɵɵsanitizeHtml);
} }
function FlexyControlSelect2Component_ng_select_0_ng_template_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, FlexyControlSelect2Component_ng_select_0_ng_template_2_span_0_Template, 1, 1, "span", 6);
i0.ɵɵelementStart(1, "span", 7);
i0.ɵɵtext(2);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(3, "span", 8);
i0.ɵɵlistener("click", function FlexyControlSelect2Component_ng_select_0_ng_template_2_Template_span_click_3_listener() { const item_r5 = ctx.item; const clear_r6 = ctx.clear; return clear_r6(item_r5); });
i0.ɵɵtext(4, "\u00D7");
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r5 = ctx.item;
i0.ɵɵproperty("ngIf", item_r5["prefixHtml"]);
i0.ɵɵadvance(1);
i0.ɵɵpropertyInterpolate("title", item_r5.text);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r5.text);
} }
function FlexyControlSelect2Component_ng_select_0_ng_template_3_span_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "span", 9);
} if (rf & 2) {
const item_r10 = i0.ɵɵnextContext().item;
i0.ɵɵproperty("innerHTML", item_r10["prefixHtml"], i0.ɵɵsanitizeHtml);
} }
function FlexyControlSelect2Component_ng_select_0_ng_template_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, FlexyControlSelect2Component_ng_select_0_ng_template_3_span_0_Template, 1, 1, "span", 6);
i0.ɵɵelementStart(1, "span", 7);
i0.ɵɵtext(2);
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r10 = ctx.item;
i0.ɵɵproperty("ngIf", item_r10["prefixHtml"]);
i0.ɵɵadvance(1);
i0.ɵɵpropertyInterpolate("title", item_r10.text);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r10.text);
} }
const _c0 = function (a0) { return { "ng-select-multiple": a0 }; };
function FlexyControlSelect2Component_ng_select_0_Template(rf, ctx) { if (rf & 1) {
const _r15 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "ng-select", 2, 3);
i0.ɵɵlistener("change", function FlexyControlSelect2Component_ng_select_0_Template_ng_select_change_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r14 = i0.ɵɵnextContext(); return ctx_r14.onChange($event); });
i0.ɵɵtemplate(2, FlexyControlSelect2Component_ng_select_0_ng_template_2_Template, 5, 3, "ng-template", 4);
i0.ɵɵtemplate(3, FlexyControlSelect2Component_ng_select_0_ng_template_3_Template, 3, 3, "ng-template", 5);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(11, _c0, ctx_r0.multiple))("formControl", ctx_r0.selectControl)("items", ctx_r0.optionsData)("placeholder", ctx_r0.placeholder)("multiple", ctx_r0.multiple)("addTag", ctx_r0.addItem)("hideSelected", ctx_r0.hideSelected)("searchFn", ctx_r0.enableSearchByValue ? ctx_r0.customSearchFn : null)("virtualScroll", ctx_r0.virtualScroll)("loading", ctx_r0.loading)("loadingText", ctx_r0.loadingText);
} }
function FlexyControlSelect2Component_flexy_control_readonly_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "flexy-control-readonly", 10);
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵproperty("value", ctx_r1.getReadonlyInfo(ctx_r1.control == null ? null : ctx_r1.control.value))("default", ctx_r1.default);
} }
export class FlexyControlSelect2Component {
constructor() {
this.loading = false; // no You can set the loading state from the outside (e.g. async items loading)
this.loadingText = 'Loading...'; // Loading... no Set custom text when for loading items
this.focused = new EventEmitter();
this.clicked = new EventEmitter();
this.changed = new EventEmitter();
this.virtualScroll = false; // Enable virtual scroll for better performance when rendering a lot of data
}
ngOnInit() {
this.selectControl = new FormControl(findRawValue(this.optionsRawId, this.control.value, this.options));
}
ngOnChanges(changes) {
if (changes.options) {
const optionsData = [];
if (this.options) {
optionsData.push(...this.options.map(item => {
let itemData;
if (typeof item === 'object' && item.hasOwnProperty('value')) {
itemData = item;
}
else {
itemData = {
value: item,
text: '' + item
};
}
return itemData;
}));
}
this.virtualScroll = optionsData.length > 100;
this.optionsData = optionsData;
}
}
onChange(data) {
const value = prepareControlValue(this.optionsRawId, data);
this.control.setValue(value);
this.changed.emit(value);
}
getReadonlyInfo(value) {
if (value && this.addItem) {
return value;
}
if ((value || value === 0) && this.optionsData) {
const opt = this.optionsData.find((item) => '' + item.value === '' + value);
return opt ? opt.text : '';
}
else if (value === null || value === '' || value === void 0) {
return null;
}
}
customSearchFn(term, item) {
return ((item.text && item.text.toLowerCase().includes(term.toLowerCase())) ||
(item.value && item.value.toLowerCase().includes(term.toLowerCase())));
}
}
FlexyControlSelect2Component.ɵfac = function FlexyControlSelect2Component_Factory(t) { return new (t || FlexyControlSelect2Component)(); };
FlexyControlSelect2Component.ɵcmp = i0.ɵɵdefineComponent({ type: FlexyControlSelect2Component, selectors: [["flexy-control-select2"]], inputs: { control: "control", options: "options", optionsRawId: "optionsRawId", default: "default", readonly: "readonly", multiple: "multiple", addItem: "addItem", placeholder: "placeholder", hideSelected: "hideSelected", enableSearchByValue: "enableSearchByValue", loading: "loading", loadingText: "loadingText" }, outputs: { focused: "focused", clicked: "clicked", changed: "changed" }, features: [i0.ɵɵNgOnChangesFeature], decls: 2, vars: 2, consts: [["bindLabel", "text", "bindValue", "value", 3, "ngClass", "formControl", "items", "placeholder", "multiple", "addTag", "hideSelected", "searchFn", "virtualScroll", "loading", "loadingText", "change", 4, "ngIf"], [3, "value", "default", 4, "ngIf"], ["bindLabel", "text", "bindValue", "value", 3, "ngClass", "formControl", "items", "placeholder", "multiple", "addTag", "hideSelected", "searchFn", "virtualScroll", "loading", "loadingText", "change"], ["select", ""], ["ng-label-tmp", ""], ["ng-option-tmp", ""], [3, "innerHTML", 4, "ngIf"], [3, "title"], [1, "ng-value-icon", "right", "t2e-unselect-value", 3, "click"], [3, "innerHTML"], [3, "value", "default"]], template: function FlexyControlSelect2Component_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, FlexyControlSelect2Component_ng_select_0_Template, 4, 13, "ng-select", 0);
i0.ɵɵtemplate(1, FlexyControlSelect2Component_flexy_control_readonly_1_Template, 1, 2, "flexy-control-readonly", 1);
} if (rf & 2) {
i0.ɵɵproperty("ngIf", !ctx.readonly && ctx.optionsData);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.readonly);
} }, directives: [i1.NgIf, i2.NgSelectComponent, i1.NgClass, i3.NgControlStatus, i3.FormControlDirective, i2.ɵh, i2.ɵf, i4.FlexyControlReadonlyComponent], encapsulation: 2, changeDetection: 0 });
/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(FlexyControlSelect2Component, [{
type: Component,
args: [{
template: `
<ng-select
*ngIf="!readonly && optionsData"
[ ]="{ 'ng-select-multiple': multiple }"
[ ]="selectControl"
[ ]="optionsData"
[ ]="placeholder"
bindLabel="text"
bindValue="value"
[ ]="multiple"
[ ]="addItem"
[ ]="hideSelected"
[ ]="enableSearchByValue ? customSearchFn : null"
[ ]="virtualScroll"
[ ]="loading"
[ ]="loadingText"
(change)="onChange($event)"
>
<ng-template ng-label-tmp let-item="item" let-clear="clear">
<span *ngIf="item['prefixHtml']" [innerHTML]="item['prefixHtml']"></span> <span title="{{ item.text }}">{{ item.text }}</span>
<span class="ng-value-icon right t2e-unselect-value" (click)="clear(item)">×</span>
</ng-template>
<ng-template ng-option-tmp let-item="item" let-index="index">
<span *ngIf="item['prefixHtml']" [innerHTML]="item['prefixHtml']"></span> <span title="{{ item.text }}">{{ item.text }}</span>
</ng-template>
</ng-select>
<flexy-control-readonly *ngIf="readonly" [value]="getReadonlyInfo(control?.value)" [default]="default"> </flexy-control-readonly>
`,
selector: 'flexy-control-select2',
changeDetection: ChangeDetectionStrategy.OnPush
}]
}], null, { control: [{
type: Input
}], options: [{
type: Input
}], optionsRawId: [{
type: Input
}], default: [{
type: Input
}], readonly: [{
type: Input
}], multiple: [{
type: Input
}], addItem: [{
type: Input
}], placeholder: [{
type: Input
}], hideSelected: [{
type: Input
}], enableSearchByValue: [{
type: Input
}], loading: [{
type: Input
}], loadingText: [{
type: Input
}], focused: [{
type: Output
}], clicked: [{
type: Output
}], changed: [{
type: Output
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Mi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtLWJvb3RzdHJhcC9zcmMvbGliL2NvbnRyb2xzL3NlbGVjdDIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFrQyxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0lBdUIzRiwwQkFBeUU7OztJQUF4QyxvRUFBZ0M7OztJQUFqRSx5R0FBa0U7SUFBUSwrQkFBOEI7SUFBQSxZQUFlO0lBQUEsaUJBQU87SUFDOUgsK0JBQTJFO0lBQXRCLDRNQUFxQjtJQUFDLHNCQUFDO0lBQUEsaUJBQU87OztJQUQ3RSw0Q0FBMEI7SUFBZ0QsZUFBdUI7SUFBdkIsK0NBQXVCO0lBQUMsZUFBZTtJQUFmLGtDQUFlOzs7SUFJdkgsMEJBQXlFOzs7SUFBeEMscUVBQWdDOzs7SUFBakUseUdBQWtFO0lBQVEsK0JBQThCO0lBQUEsWUFBZTtJQUFBLGlCQUFPOzs7SUFBeEgsNkNBQTBCO0lBQWdELGVBQXVCO0lBQXZCLGdEQUF1QjtJQUFDLGVBQWU7SUFBZixtQ0FBZTs7Ozs7SUF2QjNILHVDQWtCRTtJQUZBLHdOQUEyQjtJQUUzQix5R0FDRTtJQUdGLHlHQUNFO0lBRUosaUJBQVk7OztJQXRCVixzRUFBOEMscUNBQUEsNkJBQUEsbUNBQUEsNkJBQUEsMEJBQUEscUNBQUEsdUVBQUEsdUNBQUEsMkJBQUEsbUNBQUE7OztJQXVCaEQsNkNBQWlJOzs7SUFBeEYsb0dBQXlDLDJCQUFBOztBQUt0RixNQUFNLE9BQU8sNEJBQTRCO0lBakN6QztRQTZDVyxZ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SUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUN0RSxDQUFDO0lBQ0osQ0FBQzs7d0dBM0VVLDRCQUE0QjtpRUFBNUIsNEJBQTRCO1FBL0JyQywwRkFrQkU7UUFRRixtSEFBd0c7O1FBekJ0Ryx1REFBZ0M7UUF5QlYsZUFBZ0I7UUFBaEIsbUNBQWdCOztrREFLL0IsNEJBQTRCO2NBakN4QyxTQUFTO2VBQUM7Z0JBQ1QsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJUO2dCQUNELFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEO2dCQUVVLE9BQU87a0JBQWYsS0FBSztZQUNHLE9BQU87a0JBQWYsS0FBSztZQUNHLFlBQVk7a0JBQXBCLEtBQUs7WUFDRyxPQUFPO2tCQUFmLEtBQUs7WUFDRyxRQUFRO2tCQUFoQixLQUFLO1lBQ0csUUFBUTtrQkFBaEIsS0FBSztZQUNHLE9BQU87a0JBQWYsS0FBSztZQUNHLFdBQVc7a0JBQW5CLEtBQUs7WUFDRyxZQUFZO2tCQUFwQixLQUFLO1lBQ0csbUJBQW1CO2tCQUEzQixLQUFLO1lBRUcsT0FBTztrQkFBZixLQUFLO1lBQ0csV0FBVztrQkFBbkIsS0FBSztZQUVJLE9BQU87a0JBQWhCLE1BQU07WUFDRyxPQUFPO2tCQUFoQixNQUFNO1lBQ0csT0FBTztrQkFBaEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZmluZFJhd1ZhbHVlLCBwcmVwYXJlQ29udHJvbFZhbHVlLCBTZWxlY3RPcHRpb24sIFNlbGVjdE9wdGlvbkRhdGEgfSBmcm9tICdAbmctZmxleHkvZm9ybSc7XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1zZWxlY3RcbiAgICAgICpuZ0lmPVwiIXJlYWRvbmx5ICYmIG9wdGlvbnNEYXRhXCJcbiAgICAgICNzZWxlY3RcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ25nLXNlbGVjdC1tdWx0aXBsZSc6IG11bHRpcGxlIH1cIlxuICAgICAgW2Zvcm1Db250cm9sXT1cInNlbGVjdENvbnRyb2xcIlxuICAgICAgW2l0ZW1zXT1cIm9wdGlvbnNEYXRhXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICBiaW5kTGFiZWw9XCJ0ZXh0XCJcbiAgICAgIGJpbmRWYWx1ZT1cInZhbHVlXCJcbiAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICBbYWRkVGFnXT1cImFkZEl0ZW1cIlxuICAgICAgW2hpZGVTZWxlY3RlZF09XCJoaWRlU2VsZWN0ZWRcIlxuICAgICAgW3NlYXJjaEZuXT1cImVuYWJsZVNlYXJjaEJ5VmFsdWUgPyBjdXN0b21TZWFyY2hGbiA6IG51bGxcIlxuICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwidmlydHVhbFNjcm9sbFwiXG4gICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICAgIFtsb2FkaW5nVGV4dF09XCJsb2FkaW5nVGV4dFwiXG4gICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuICAgID5cbiAgICAgIDxuZy10ZW1wbGF0ZSBuZy1sYWJlbC10bXAgbGV0LWl0ZW09XCJpdGVtXCIgbGV0LWNsZWFyPVwiY2xlYXJcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtWydwcmVmaXhIdG1sJ11cIiBbaW5uZXJIVE1MXT1cIml0ZW1bJ3ByZWZpeEh0bWwnXVwiPjwvc3Bhbj4gPHNwYW4gdGl0bGU9XCJ7eyBpdGVtLnRleHQgfX1cIj57eyBpdGVtLnRleHQgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmctdmFsdWUtaWNvbiByaWdodCB0MmUtdW5zZWxlY3QtdmFsdWVcIiAoY2xpY2spPVwiY2xlYXIoaXRlbSlcIj7Dlzwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgbmctb3B0aW9uLXRtcCBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtaW5kZXg9XCJpbmRleFwiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW1bJ3ByZWZpeEh0bWwnXVwiIFtpbm5lckhUTUxdPVwiaXRlbVsncHJlZml4SHRtbCddXCI+PC9zcGFuPiA8c3BhbiB0aXRsZT1cInt7IGl0ZW0udGV4dCB9fVwiPnt7IGl0ZW0udGV4dCB9fTwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1zZWxlY3Q+XG4gICAgPGZsZXh5LWNvbnRyb2wtcmVhZG9ubHkgKm5nSWY9XCJyZWFkb25seVwiIFt2YWx1ZV09XCJnZXRSZWFkb25seUluZm8oY29udHJvbD8udmFsdWUpXCIgW2RlZmF1bHRdPVwiZGVmYXVsdFwiPiA8L2ZsZXh5LWNvbnRyb2wtcmVhZG9ubHk+XG4gIGAsXG4gIHNlbGVjdG9yOiAnZmxleHktY29udHJvbC1zZWxlY3QyJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRmxleHlDb250cm9sU2VsZWN0MkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29udHJvbDogRm9ybUNvbnRyb2w7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdO1xuICBASW5wdXQoKSBvcHRpb25zUmF3SWQ6IHN0cmluZztcbiAgQElucHV0KCkgZGVmYXVsdDogc3RyaW5nO1xuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbjtcbiAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFkZEl0ZW06IGJvb2xlYW47XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGhpZGVTZWxlY3RlZDogYm9vbGVhbjtcbiAgQElucHV0KCkgZW5hYmxlU2VhcmNoQnlWYWx1ZTogYm9vbGVhbjtcblxuICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7IC8vIG5vXHRZb3UgY2FuIHNldCB0aGUgbG9hZGluZyBzdGF0ZSBmcm9tIHRoZSBvdXRzaWRlIChlLmcuIGFzeW5jIGl0ZW1zIGxvYWRpbmcpXG4gIEBJbnB1dCgpIGxvYWRpbmdUZXh0ID0gJ0xvYWRpbmcuLi4nOyAvLyBMb2FkaW5nLi4uXHRub1x0U2V0IGN1c3RvbSB0ZXh0IHdoZW4gZm9yIGxvYWRpbmcgaXRlbXNcblxuICBAT3V0cHV0KCkgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBzZWxlY3RDb250cm9sOiBGb3JtQ29udHJvbDtcblxuICB2aXJ0dWFsU2Nyb2xsID0gZmFsc2U7IC8vIEVuYWJsZSB2aXJ0dWFsIHNjcm9sbCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIHdoZW4gcmVuZGVyaW5nIGEgbG90IG9mIGRhdGFcbiAgb3B0aW9uc0RhdGE6IFNlbGVjdE9wdGlvbkRhdGFbXTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNlbGVjdENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woZmluZFJhd1ZhbHVlKHRoaXMub3B0aW9uc1Jhd0lkLCB0aGlzLmNvbnRyb2wudmFsdWUsIHRoaXMub3B0aW9ucykpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLm9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnNEYXRhID0gW107XG4gICAgICBpZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnNEYXRhLnB1c2goXG4gICAgICAgICAgLi4udGhpcy5vcHRpb25zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGxldCBpdGVtRGF0YTogU2VsZWN0T3B0aW9uRGF0YTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xuICAgICAgICAgICAgICBpdGVtRGF0YSA9IGl0ZW07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpdGVtRGF0YSA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgICAgICAgICB0ZXh0OiAnJyArIGl0ZW1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtRGF0YTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsID0gb3B0aW9uc0RhdGEubGVuZ3RoID4gMTAwO1xuICAgICAgdGhpcy5vcHRpb25zRGF0YSA9IG9wdGlvbnNEYXRhO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbmdlKGRhdGE6IFNlbGVjdE9wdGlvbkRhdGEgfCBTZWxlY3RPcHRpb25EYXRhW10pIHtcbiAgICBjb25zdCB2YWx1ZSA9IHByZXBhcmVDb250cm9sVmFsdWUodGhpcy5vcHRpb25zUmF3SWQsIGRhdGEpO1xuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2VkLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgZ2V0UmVhZG9ubHlJbmZvKHZhbHVlKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgJiYgdGhpcy5hZGRJdGVtKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICgodmFsdWUgfHwgdmFsdWUgPT09IDApICYmIHRoaXMub3B0aW9uc0RhdGEpIHtcbiAgICAgIGNvbnN0IG9wdDogU2VsZWN0T3B0aW9uID0gdGhpcy5vcHRpb25zRGF0YS5maW5kKChpdGVtOiBTZWxlY3RPcHRpb24pID0+ICcnICsgaXRlbS52YWx1ZSA9PT0gJycgKyB2YWx1ZSk7XG4gICAgICByZXR1cm4gb3B0ID8gb3B0LnRleHQgOiAnJztcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBjdXN0b21TZWFyY2hGbih0ZXJtOiBzdHJpbmcsIGl0ZW06IFNlbGVjdE9wdGlvbikge1xuICAgIHJldHVybiAoXG4gICAgICAoaXRlbS50ZXh0ICYmIGl0ZW0udGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0udG9Mb3dlckNhc2UoKSkpIHx8XG4gICAgICAoaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS50b0xvd2VyQ2FzZSgpKSlcbiAgICApO1xuICB9XG59XG4iXX0=