tnx-shared 5.2.28 → 5.2.29
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/assets/docker/docker-entrypoint.sh +1 -1
- package/classes/base/list-component-base.d.ts +19 -5
- package/classes/base/list-component-base.d.ts.map +1 -1
- package/classes/environment-schema.d.ts +23 -20
- package/classes/environment-schema.d.ts.map +1 -1
- package/classes/public-function.d.ts +1 -0
- package/classes/public-function.d.ts.map +1 -1
- package/components/chat/chat-box/chat-box.component.d.ts.map +1 -1
- package/components/common-app-component/common-app-component.d.ts +1 -3
- package/components/common-app-component/common-app-component.d.ts.map +1 -1
- package/components/crud/advance-search/advance-search.component.d.ts +6 -6
- package/components/crud/advance-search/advance-search.component.d.ts.map +1 -1
- package/components/crud/crud-form/crud-form.component.d.ts +6 -0
- package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
- package/components/dropdown/dropdown.component.d.ts +5 -3
- package/components/dropdown/dropdown.component.d.ts.map +1 -1
- package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
- package/components/query-builders/query-builder-rule/query-builder-rule.component.d.ts +3 -0
- package/components/query-builders/query-builder-rule/query-builder-rule.component.d.ts.map +1 -1
- package/components/tn-custom-scrollbar/tn-custom-scrollbar.component.d.ts.map +1 -1
- package/components/tn-tinymce/tn-tinymce.component.d.ts +2 -0
- package/components/tn-tinymce/tn-tinymce.component.d.ts.map +1 -1
- package/congviec/congviec/congviec-form/congviec-form.component.d.ts +1 -0
- package/congviec/congviec/congviec-form/congviec-form.component.d.ts.map +1 -1
- package/directives/primeng/tn-table.directive.d.ts +7 -6
- package/directives/primeng/tn-table.directive.d.ts.map +1 -1
- package/esm2020/classes/base/list-component-base.mjs +56 -32
- package/esm2020/classes/environment-schema.mjs +10 -1
- package/esm2020/classes/public-function.mjs +3 -1
- package/esm2020/components/add-news/add-news.component.mjs +3 -3
- package/esm2020/components/autocomplete-picker/autocomplete-picker.component.mjs +2 -2
- package/esm2020/components/chat/chat-box/chat-box.component.mjs +3 -4
- package/esm2020/components/chat/chat-send-message-box/chat-send-message-box.component.mjs +2 -2
- package/esm2020/components/common-app-component/common-app-component.mjs +57 -57
- package/esm2020/components/common-dashboard/common-dashboard.component.mjs +3 -3
- package/esm2020/components/crud/advance-search/advance-search.component.mjs +28 -19
- package/esm2020/components/crud/crud-form/crud-form.component.mjs +12 -4
- package/esm2020/components/crud/crud-list/crud-list.component.mjs +3 -3
- package/esm2020/components/crud/tree-table/tree-table.component.mjs +3 -3
- package/esm2020/components/dropdown/dropdown.component.mjs +29 -24
- package/esm2020/components/entity-permission/entity-permission.component.mjs +3 -3
- package/esm2020/components/entity-picker/entity-picker-box/entity-picker-box.component.mjs +3 -3
- package/esm2020/components/entity-picker/entity-picker-dialog/entity-picker-dialog.component.mjs +3 -3
- package/esm2020/components/file-explorer/file-manager/file-manager.component.mjs +3 -3
- package/esm2020/components/main-list/main-list.component.mjs +3 -3
- package/esm2020/components/query-builders/query-builder-rule/query-builder-rule.component.mjs +8 -3
- package/esm2020/components/radio-button-list/radio-button-list.component.mjs +3 -3
- package/esm2020/components/report-queue/report-queue.component.mjs +2 -2
- package/esm2020/components/settings/settings.component.mjs +3 -3
- package/esm2020/components/tn-app-help/tn-app-help.component.mjs +3 -3
- package/esm2020/components/tn-app-notification/tn-app-notification.component.mjs +3 -3
- package/esm2020/components/tn-custom-scrollbar/tn-custom-scrollbar.component.mjs +5 -4
- package/esm2020/components/tn-tinymce/tn-tinymce.component.mjs +7 -3
- package/esm2020/components/user-picker/user-picker-box/user-picker-box.component.mjs +3 -3
- package/esm2020/components/user-picker/user-picker.component.mjs +2 -2
- package/esm2020/components/workflow/workflow-picker/workflow-picker.component.mjs +3 -3
- package/esm2020/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.mjs +3 -3
- package/esm2020/congviec/congviec/congviec-form/congviec-form.component.mjs +6 -3
- package/esm2020/congviec/congviec/congviec.component.mjs +3 -3
- package/esm2020/directives/primeng/tn-table.directive.mjs +28 -13
- package/esm2020/services/common.service.mjs +11 -3
- package/esm2020/services/environment.service.mjs +48 -7
- package/esm2020/services/permission.service.mjs +12 -15
- package/esm2020/services/position.service.mjs +2 -2
- package/esm2020/services/signalr.service.mjs +3 -3
- package/esm2020/services/tn-client.service.mjs +30 -25
- package/esm2020/tnx-shared.module.mjs +14 -8
- package/fesm2015/tnx-shared.mjs +587 -445
- package/fesm2015/tnx-shared.mjs.map +1 -1
- package/fesm2020/tnx-shared.mjs +587 -445
- package/fesm2020/tnx-shared.mjs.map +1 -1
- package/package.json +2 -2
- package/services/common.service.d.ts +6 -0
- package/services/common.service.d.ts.map +1 -1
- package/services/environment.service.d.ts +32 -23
- package/services/environment.service.d.ts.map +1 -1
- package/services/permission.service.d.ts +5 -0
- package/services/permission.service.d.ts.map +1 -1
- package/services/position.service.d.ts.map +1 -1
- package/services/signalr.service.d.ts +1 -1
- package/services/signalr.service.d.ts.map +1 -1
- package/services/tn-client.service.d.ts +3 -1
- package/services/tn-client.service.d.ts.map +1 -1
- package/tnx-shared.module.d.ts +12 -11
- package/tnx-shared.module.d.ts.map +1 -1
|
@@ -12,8 +12,8 @@ import { Filter } from '../../models/grid-info';
|
|
|
12
12
|
import { MasterDataService } from '../../services/master-data.service';
|
|
13
13
|
import { appendDefaultFilter } from '../../utils/common';
|
|
14
14
|
import * as i0 from "@angular/core";
|
|
15
|
-
import * as i1 from "
|
|
16
|
-
import * as i2 from "
|
|
15
|
+
import * as i1 from "../../services/crud.service";
|
|
16
|
+
import * as i2 from "ngx-device-detector";
|
|
17
17
|
import * as i3 from "../../services/component.service";
|
|
18
18
|
import * as i4 from "tn-custom-primeng/api";
|
|
19
19
|
import * as i5 from "@angular/common";
|
|
@@ -26,7 +26,7 @@ import * as i11 from "../after-view-checked/after-view-checked.component";
|
|
|
26
26
|
import * as i12 from "../tn-dialog/tn-dialog.component";
|
|
27
27
|
import * as i13 from "@ngx-translate/core";
|
|
28
28
|
export class DropdownComponent extends ComponentBase {
|
|
29
|
-
constructor(
|
|
29
|
+
constructor(injector, _crudService, _deviceDetectorService, _componentService) {
|
|
30
30
|
super(injector);
|
|
31
31
|
this._deviceDetectorService = _deviceDetectorService;
|
|
32
32
|
this._componentService = _componentService;
|
|
@@ -97,6 +97,17 @@ export class DropdownComponent extends ComponentBase {
|
|
|
97
97
|
this.firstScroll = false;
|
|
98
98
|
}
|
|
99
99
|
};
|
|
100
|
+
this.showFormQuickAdd = () => {
|
|
101
|
+
const formModel = new CrudFormData();
|
|
102
|
+
let initData = this.control.initData;
|
|
103
|
+
if (typeof initData != 'object') {
|
|
104
|
+
initData = (this.control.initData)();
|
|
105
|
+
}
|
|
106
|
+
formModel.data = { ...initData };
|
|
107
|
+
formModel.formState = FormState.ADD;
|
|
108
|
+
this.quickAddDialogModel.data.formModel = formModel;
|
|
109
|
+
this.quickAddDialogModel.showEditForm = true;
|
|
110
|
+
};
|
|
100
111
|
// K sửa thành function, phải để arrow function
|
|
101
112
|
this.handleCancel = () => {
|
|
102
113
|
this.quickAddDialogModel.showEditForm = false;
|
|
@@ -106,6 +117,10 @@ export class DropdownComponent extends ComponentBase {
|
|
|
106
117
|
this.quickAddDialogModel.showEditForm = false;
|
|
107
118
|
this._getData();
|
|
108
119
|
};
|
|
120
|
+
this.handleSavedSetting = () => {
|
|
121
|
+
this.settingDialogModel.showEditForm = false;
|
|
122
|
+
this.createSearchSubscription();
|
|
123
|
+
};
|
|
109
124
|
}
|
|
110
125
|
set showClear(value) {
|
|
111
126
|
if (!this.control.showClear) {
|
|
@@ -186,6 +201,10 @@ export class DropdownComponent extends ComponentBase {
|
|
|
186
201
|
}
|
|
187
202
|
this.onInit.emit(this);
|
|
188
203
|
this.customTemplate = this._componentService.dicTemplate;
|
|
204
|
+
if (this.customTemplate) {
|
|
205
|
+
this.dropdownSettingForm = this.customTemplate['dropdownSettingForm'];
|
|
206
|
+
this.dropdownQuickAddForm = this.customTemplate['dropdownQuickAddForm'];
|
|
207
|
+
}
|
|
189
208
|
}
|
|
190
209
|
ngOnDestroy() {
|
|
191
210
|
this._unSubscribeAll.complete();
|
|
@@ -789,7 +808,7 @@ export class DropdownComponent extends ComponentBase {
|
|
|
789
808
|
if (this.control.panelClass) {
|
|
790
809
|
this.dropdown.overlay.style.width = this.dropdown.overlay.style.minWidth;
|
|
791
810
|
}
|
|
792
|
-
if (
|
|
811
|
+
if (this.control.isServerLoad == null || this.control.isServerLoad === false) {
|
|
793
812
|
return;
|
|
794
813
|
}
|
|
795
814
|
if (this.control.virtualScroll) {
|
|
@@ -873,17 +892,6 @@ export class DropdownComponent extends ComponentBase {
|
|
|
873
892
|
handleBlur(evt) {
|
|
874
893
|
this.onBlur.emit(evt);
|
|
875
894
|
}
|
|
876
|
-
showFormQuickAdd() {
|
|
877
|
-
const formModel = new CrudFormData();
|
|
878
|
-
let initData = this.control.initData;
|
|
879
|
-
if (typeof initData != 'object') {
|
|
880
|
-
initData = (this.control.initData)();
|
|
881
|
-
}
|
|
882
|
-
formModel.data = { ...initData };
|
|
883
|
-
formModel.formState = FormState.ADD;
|
|
884
|
-
this.quickAddDialogModel.data.formModel = formModel;
|
|
885
|
-
this.quickAddDialogModel.showEditForm = true;
|
|
886
|
-
}
|
|
887
895
|
showFormSetting() {
|
|
888
896
|
const formModel = new CrudFormData();
|
|
889
897
|
formModel.data = {};
|
|
@@ -891,10 +899,7 @@ export class DropdownComponent extends ComponentBase {
|
|
|
891
899
|
this.settingDialogModel.data.formModel = formModel;
|
|
892
900
|
this.settingDialogModel.showEditForm = true;
|
|
893
901
|
}
|
|
894
|
-
|
|
895
|
-
this.settingDialogModel.showEditForm = false;
|
|
896
|
-
this.createSearchSubscription();
|
|
897
|
-
}
|
|
902
|
+
;
|
|
898
903
|
createSearchSubscription() {
|
|
899
904
|
const delaySearchTime = this.getDelaySearchTime();
|
|
900
905
|
if (this.subscription) {
|
|
@@ -905,12 +910,12 @@ export class DropdownComponent extends ComponentBase {
|
|
|
905
910
|
});
|
|
906
911
|
}
|
|
907
912
|
}
|
|
908
|
-
DropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: DropdownComponent, deps: [{ token:
|
|
909
|
-
DropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: DropdownComponent, selector: "dropdown", inputs: { showClear: "showClear", disableDisplayFieldServerSearch: "disableDisplayFieldServerSearch", filter: "filter", control: "control", defaultLabel: "defaultLabel", appendTo: "appendTo", dataSource: "dataSource", value: "value", itemSelectedStyleClass: "itemSelectedStyleClass" }, outputs: { onInit: "onInit", onChanged: "onChanged", onCollapse: "onCollapse", onExpand: "onExpand", onDropdownClick: "onDropdownClick", onShow: "onShow", onShowSmartEvent: "onShowSmartEvent", onHide: "onHide", onHideSmartEvent: "onHideSmartEvent", onFocus: "onFocus", onBlur: "onBlur", onReady: "onReady", onDataSourceLoaded: "onDataSourceLoaded", valueChange: "valueChange", adjustValue: "adjustValue" }, providers: [ComponentContextService], viewQueries: [{ propertyName: "el", first: true, predicate: ["el"], descendants: true }, { propertyName: "input", first: true, predicate: ["inputMask"], descendants: true }, { propertyName: "buttonSetting", first: true, predicate: ["buttonSetting"], descendants: true }, { propertyName: "dropdown", first: true, predicate: Dropdown, descendants: true }, { propertyName: "multiSelect", first: true, predicate: MultiSelect, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div #el class=\"tn-dropdown\" [pTooltip]=\"tooltip\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\"\r\n [class.server-load]=\"control.isServerLoad\">\r\n <span class=\"server-load-info\" pTooltip=\"D\u1EEF li\u1EC7u s\u1EBD \u0111\u01B0\u1EE3c l\u00E0m m\u1EDBi ghi t\u00ECm ki\u1EBFm\" tooltipPosition=\"top\"></span>\r\n <p-dropdown *ngIf=\"!control.multiple\" [options]=\"dataSourceInternal\" [placeholder]=\"control.placeholder\"\r\n [filter]=\"control.filter\" [panelStyleClass]=\"getPanelClass()\" [appendTo]=\"control.appendTo\"\r\n [styleClass]=\"'tn-dropdown'\" [emptyFilterMessage]=\"'Kh\u00F4ng t\u00ECm th\u1EA5y k\u1EBFt qu\u1EA3' | translate\"\r\n [disabled]=\"control.disabled ? true : null\" [autoZIndex]=\"true\" [showClear]=\"control.showClear\"\r\n [showTransitionOptions]=\"showTransitionOptions\" [autoDisplayFirst]=\"control.autoDisplayFirst\"\r\n [virtualScroll]=\"control.virtualScroll\" itemSize=\"30\" [maxItemDisplay]=\"control.maxItemDisplay\"\r\n [autofocusSelectedItem]=\"autofocusSelectedItem\" [hideTransitionOptions]=\"hideTransitionOptions\"\r\n [modifyOptionsWhenFilter]=\"modifyOptionWhenFilter\" [delayFilter]=\"delayFilter\" [(ngModel)]=\"_value\"\r\n (onFocus)=\"handleFocus($event)\" (onBlur)=\"handleBlur($event)\" (onChange)=\"onChangeSelected($event)\"\r\n (onClick)=\"onDropdownClickHandler($event)\" (onShow)=\"onShowHandler($event)\" (onHide)=\"onHideHandler($event)\">\r\n <ng-template *ngIf=\"control.templateSelectedItem\" let-item pTemplate=\"selectedItem\">\r\n <ng-container\r\n *ngTemplateOutlet=\"control.templateSelectedItem; context: {$implicit: item, selectedValue: _value}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"control.templateItem\" let-item pTemplate=\"item\">\r\n <ng-container *ngTemplateOutlet=\"control.templateItem; context: {$implicit: item}\"></ng-container>\r\n </ng-template>\r\n </p-dropdown>\r\n <p-multiSelect *ngIf=\"control.multiple\" [options]=\"dataSourceInternal\" [filter]=\"control.filter\"\r\n [defaultLabel]=\"control.placeholder\" [placeholder]=\"control.placeholder\" [panelStyleClass]=\"getPanelClass()\"\r\n [appendTo]=\"control.appendTo\" [styleClass]=\"'tn-dropdown'\"\r\n [emptyFilterMessage]=\"'Kh\u00F4ng t\u00ECm th\u1EA5y k\u1EBFt qu\u1EA3' | translate\" [disabled]=\"control.disabled ? true : null\"\r\n [autoZIndex]=\"true\" [showTransitionOptions]=\"showTransitionOptions\"\r\n [hideTransitionOptions]=\"hideTransitionOptions\" [virtualScroll]=\"control.virtualScroll\"\r\n [maxItemDisplay]=\"control.maxItemDisplay\" [selectedItemsLabel]=\"control.selectedItemsLabel\"\r\n [maxSelectedLabels]=\"control.maxSelectedLabels\" [modifyOptionsWhenFilter]=\"modifyOptionWhenFilterMultiple\"\r\n [delayFilter]=\"delayFilter\" [(ngModel)]=\"_value\" (onChange)=\"onChangeSelected($event)\"\r\n (onClick)=\"onDropdownClickHandler($event)\" (onPanelShow)=\"onPanelShowHandler($event)\"\r\n (onPanelHide)=\"onHideHandler($event)\">\r\n <ng-template pTemplate=\"selectedItems\" let-value>\r\n <ng-container *ngIf=\"!value || value.length == 0\">{{control.placeholder}}</ng-container>\r\n <ng-container *ngIf=\"value && value.length > 0\">\r\n <span *ngFor=\"let selectedItem of value\" [class]=\"_itemSelectedStyleClass\">\r\n {{selectedItem[control.displayField]}}<span class=\"remove-item\"\r\n (click)=\"removeItem($event, selectedItem)\"><i class=\"fas fa-times\"></i></span>\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </p-multiSelect>\r\n <input #inputMask class=\"input-mask hide p-inputtext\" type=\"text\" [disabled]=\"loading\"\r\n [(ngModel)]=\"valueSearchServer\" (keyup)=\"keyUp.next($event)\" />\r\n <span #buttonSetting class=\"button-setting hide pi pi-cog\" (click)=\"showFormSetting()\"></span>\r\n <after-view-checked *ngIf=\"!loading\" (loaded)=\"handleLoaded()\"></after-view-checked>\r\n <button *ngIf=\"control.quickAdd && (control.cols || control.quickAddTemplate)\" type=\"button\" pButton\r\n icon=\"pi pi-plus\" class=\"p-button-text p-button-rounded button-quick-add\" pTooltip=\"Th\u00EAm nhanh\"\r\n tooltipPosition=\"top\" (click)=\"showFormQuickAdd()\"></button>\r\n</div>\r\n<tn-dialog *ngIf=\"quickAddDialogModel.showEditForm\" #dialog [header]=\"quickAddDialogModel.header | translate\"\r\n [popupSize]=\"control.popupSize\" (onHide)=\"quickAddDialogModel.showEditForm = false\">\r\n <ng-container *ngIf=\"control.cols\" [ngTemplateOutlet]=\"customTemplate['dropdownQuickAddForm']\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: quickAddDialogModel, parentModel: model, parentContext: context, control: control, \r\n onSaved: handleSaved, onCancel: handleCancel\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"quickAddDialogModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <quick-add-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\" [control]=\"control\"\r\n [baseService]=\"control.baseService\" (onSaved)=\"handleSaved()\" (onCancel)=\"handleCancel()\">\r\n </quick-add-form> -->\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"settingDialogModel.showEditForm\" #dialog [header]=\"settingDialogModel.header | translate\"\r\n [popupSize]=\"control.popupSize\" (onHide)=\"settingDialogModel.showEditForm = false\">\r\n <ng-container [ngTemplateOutlet]=\"customTemplate['dropdownQuickAddForm']\" [ngTemplateOutletContext]=\"{\r\n $implicit: settingDialogModel, onSaved: handleSavedSetting\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"settingDialogModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <dropdown-setting-form #formBase [model]=\"settingDialogModel.data.formModel\" (onSaved)=\"handleSavedSetting()\"\r\n (onCancel)=\"settingDialogModel.showEditForm = false\">\r\n </dropdown-setting-form> -->\r\n</tn-dialog>\r\n<ng-container *ngTemplateOutlet=\"control.quickAddTemplate; context: {\r\n handleSaved: handleSaved,\r\n handleCancel: handleCancel,\r\n dialogModel: quickAddDialogModel\r\n}\"></ng-container>", styles: [".tn-dropdown{display:flex}.tn-dropdown p-dropdown,.tn-dropdown p-multiSelect{flex:1 1;width:100%}.tn-dropdown>.button-quick-add{flex:0 0 auto}.input-mask{position:absolute;z-index:1;width:100%;padding-left:12px;box-sizing:border-box;border:1px solid transparent;outline:none;background:transparent;border-radius:3px}.input-mask.hide{display:none}.input-mask:focus{box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.custom-select-item{display:inline-flex;align-items:center;background:#d2eefb;border-radius:3px;padding:3px 5px;margin:0 0 0 3px;border:1px solid #a9d8ff}.custom-select-item>span{font-size:12px;color:#555;margin-left:3px}.custom-select-item>span i{font-size:10px}.custom-select-item.min{padding:1px 5px;margin-left:2px}.custom-select-item:first-child{margin-left:0}::ng-deep .tn-dropdown.ui-state-disabled .custom-select-item{background:#e1e1e1;border-color:#d4d4d4}::ng-deep .tn-dropdown.ui-state-disabled .custom-select-item>span{display:none}::ng-deep .ui-multiselect-filter-container .input-mask{padding:.2em;height:22px;width:calc(100% - 2px);box-sizing:border-box;text-indent:1.5em;left:1px;top:1px}::ng-deep .ui-multiselect-filter-container .input-mask:focus{left:1px;width:calc(100% - 2px)}\n"], dependencies: [{ kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i8.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "maxItemDisplay", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "autofocusSelectedItem", "modifyOptionsWhenFilter", "delayFilter", "disabled", "itemSize", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i9.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "maxItemDisplay", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "autoZIndex", "baseZIndex", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "modifyOptionsWhenFilter", "delayFilter", "autocomplete", "showClear", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad"] }, { kind: "directive", type: i10.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: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.AfterViewCheckedComponent, selector: "after-view-checked", inputs: ["renderKey"], outputs: ["loaded", "loading", "unloading", "reRender"] }, { kind: "component", type: i12.TnDialogComponent, selector: "tn-dialog", inputs: ["maskClass", "styleClass", "scrollBarStyleClass", "useDefaultScrollBar", "visible", "disabledButton", "modal", "header", "popupSize", "closeOnEscape", "showFooter", "positionTop", "minY", "hiddenSave", "maximizable"], outputs: ["onSave", "onCancel", "onShow", "onHide"] }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }] });
|
|
913
|
+
DropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: DropdownComponent, deps: [{ token: i0.Injector }, { token: i1.CrudService }, { token: i2.DeviceDetectorService }, { token: i3.ComponentService }], target: i0.ɵɵFactoryTarget.Component });
|
|
914
|
+
DropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: DropdownComponent, selector: "dropdown", inputs: { showClear: "showClear", disableDisplayFieldServerSearch: "disableDisplayFieldServerSearch", filter: "filter", control: "control", defaultLabel: "defaultLabel", appendTo: "appendTo", dataSource: "dataSource", value: "value", itemSelectedStyleClass: "itemSelectedStyleClass" }, outputs: { onInit: "onInit", onChanged: "onChanged", onCollapse: "onCollapse", onExpand: "onExpand", onDropdownClick: "onDropdownClick", onShow: "onShow", onShowSmartEvent: "onShowSmartEvent", onHide: "onHide", onHideSmartEvent: "onHideSmartEvent", onFocus: "onFocus", onBlur: "onBlur", onReady: "onReady", onDataSourceLoaded: "onDataSourceLoaded", valueChange: "valueChange", adjustValue: "adjustValue" }, providers: [ComponentContextService], viewQueries: [{ propertyName: "el", first: true, predicate: ["el"], descendants: true }, { propertyName: "input", first: true, predicate: ["inputMask"], descendants: true }, { propertyName: "buttonSetting", first: true, predicate: ["buttonSetting"], descendants: true }, { propertyName: "dropdown", first: true, predicate: Dropdown, descendants: true }, { propertyName: "multiSelect", first: true, predicate: MultiSelect, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div #el class=\"tn-dropdown\" [pTooltip]=\"tooltip\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\"\r\n [class.server-load]=\"control.isServerLoad\">\r\n <span class=\"server-load-info\" pTooltip=\"D\u1EEF li\u1EC7u s\u1EBD \u0111\u01B0\u1EE3c l\u00E0m m\u1EDBi ghi t\u00ECm ki\u1EBFm\" tooltipPosition=\"top\"></span>\r\n <p-dropdown *ngIf=\"!control.multiple\" [options]=\"dataSourceInternal\" [placeholder]=\"control.placeholder\"\r\n [filter]=\"control.filter\" [panelStyleClass]=\"getPanelClass()\" [appendTo]=\"control.appendTo\"\r\n [styleClass]=\"'tn-dropdown'\" [emptyFilterMessage]=\"'Kh\u00F4ng t\u00ECm th\u1EA5y k\u1EBFt qu\u1EA3' | translate\"\r\n [disabled]=\"control.disabled ? true : null\" [autoZIndex]=\"true\" [showClear]=\"control.showClear\"\r\n [showTransitionOptions]=\"showTransitionOptions\" [autoDisplayFirst]=\"control.autoDisplayFirst\"\r\n [virtualScroll]=\"control.virtualScroll\" itemSize=\"30\" [maxItemDisplay]=\"control.maxItemDisplay\"\r\n [autofocusSelectedItem]=\"autofocusSelectedItem\" [hideTransitionOptions]=\"hideTransitionOptions\"\r\n [modifyOptionsWhenFilter]=\"modifyOptionWhenFilter\" [delayFilter]=\"delayFilter\" [(ngModel)]=\"_value\"\r\n (onFocus)=\"handleFocus($event)\" (onBlur)=\"handleBlur($event)\" (onChange)=\"onChangeSelected($event)\"\r\n (onClick)=\"onDropdownClickHandler($event)\" (onShow)=\"onShowHandler($event)\" (onHide)=\"onHideHandler($event)\">\r\n <ng-template *ngIf=\"control.templateSelectedItem\" let-item pTemplate=\"selectedItem\">\r\n <ng-container\r\n *ngTemplateOutlet=\"control.templateSelectedItem; context: {$implicit: item, selectedValue: _value}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"control.templateItem\" let-item pTemplate=\"item\">\r\n <ng-container *ngTemplateOutlet=\"control.templateItem; context: {$implicit: item}\"></ng-container>\r\n </ng-template>\r\n </p-dropdown>\r\n <p-multiSelect *ngIf=\"control.multiple\" [options]=\"dataSourceInternal\" [filter]=\"control.filter\"\r\n [defaultLabel]=\"control.placeholder\" [placeholder]=\"control.placeholder\" [panelStyleClass]=\"getPanelClass()\"\r\n [appendTo]=\"control.appendTo\" [styleClass]=\"'tn-dropdown'\"\r\n [emptyFilterMessage]=\"'Kh\u00F4ng t\u00ECm th\u1EA5y k\u1EBFt qu\u1EA3' | translate\" [disabled]=\"control.disabled ? true : null\"\r\n [autoZIndex]=\"true\" [showTransitionOptions]=\"showTransitionOptions\"\r\n [hideTransitionOptions]=\"hideTransitionOptions\" [virtualScroll]=\"control.virtualScroll\"\r\n [maxItemDisplay]=\"control.maxItemDisplay\" [selectedItemsLabel]=\"control.selectedItemsLabel\"\r\n [maxSelectedLabels]=\"control.maxSelectedLabels\" [modifyOptionsWhenFilter]=\"modifyOptionWhenFilterMultiple\"\r\n [delayFilter]=\"delayFilter\" [(ngModel)]=\"_value\" (onChange)=\"onChangeSelected($event)\"\r\n (onClick)=\"onDropdownClickHandler($event)\" (onPanelShow)=\"onPanelShowHandler($event)\"\r\n (onPanelHide)=\"onHideHandler($event)\">\r\n <ng-template pTemplate=\"selectedItems\" let-value>\r\n <ng-container *ngIf=\"!value || value.length == 0\">{{control.placeholder}}</ng-container>\r\n <ng-container *ngIf=\"value && value.length > 0\">\r\n <span *ngFor=\"let selectedItem of value\" [class]=\"_itemSelectedStyleClass\">\r\n {{selectedItem[control.displayField]}}<span class=\"remove-item\"\r\n (click)=\"removeItem($event, selectedItem)\"><i class=\"fas fa-times\"></i></span>\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </p-multiSelect>\r\n <input #inputMask class=\"input-mask hide p-inputtext\" type=\"text\" [disabled]=\"loading\"\r\n [(ngModel)]=\"valueSearchServer\" (keyup)=\"keyUp.next($event)\" />\r\n <span #buttonSetting class=\"button-setting hide pi pi-cog\" (click)=\"showFormSetting()\"></span>\r\n <after-view-checked *ngIf=\"!loading\" (loaded)=\"handleLoaded()\"></after-view-checked>\r\n <button *ngIf=\"control.quickAdd && (control.cols || control.quickAddTemplate)\" type=\"button\" pButton\r\n icon=\"pi pi-plus\" class=\"p-button-text p-button-rounded button-quick-add\" pTooltip=\"Th\u00EAm nhanh\"\r\n tooltipPosition=\"top\" (click)=\"showFormQuickAdd()\"></button>\r\n</div>\r\n<tn-dialog *ngIf=\"quickAddDialogModel.showEditForm\" #dialog [header]=\"quickAddDialogModel.header | translate\"\r\n [popupSize]=\"control.popupSize\" (onHide)=\"quickAddDialogModel.showEditForm = false\">\r\n <ng-container *ngIf=\"control.cols\" [ngTemplateOutlet]=\"dropdownQuickAddForm\" [ngTemplateOutletContext]=\"{\r\n $implicit: quickAddDialogModel, parentModel: model, parentContext: context, control: control,\r\n onSaved: handleSaved, onCancel: handleCancel\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"quickAddDialogModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <quick-add-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\" [control]=\"control\"\r\n [baseService]=\"control.baseService\" (onSaved)=\"handleSaved()\" (onCancel)=\"handleCancel()\">\r\n </quick-add-form> -->\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"settingDialogModel.showEditForm\" #dialog [header]=\"settingDialogModel.header | translate\"\r\n [popupSize]=\"control.popupSize\" (onHide)=\"settingDialogModel.showEditForm = false\">\r\n <ng-container [ngTemplateOutlet]=\"dropdownSettingForm\" [ngTemplateOutletContext]=\"{\r\n $implicit: settingDialogModel, onSaved: handleSavedSetting\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"settingDialogModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <dropdown-setting-form #formBase [model]=\"settingDialogModel.data.formModel\" (onSaved)=\"handleSavedSetting()\"\r\n (onCancel)=\"settingDialogModel.showEditForm = false\">\r\n </dropdown-setting-form> -->\r\n</tn-dialog>\r\n<ng-container *ngTemplateOutlet=\"control.quickAddTemplate; context: {\r\n handleSaved: handleSaved,\r\n handleCancel: handleCancel,\r\n dialogModel: quickAddDialogModel\r\n}\"></ng-container>", styles: [".tn-dropdown{display:flex}.tn-dropdown p-dropdown,.tn-dropdown p-multiSelect{flex:1 1;width:100%}.tn-dropdown>.button-quick-add{flex:0 0 auto}.button-setting.hide{display:none}.input-mask{position:absolute;z-index:1;width:100%;padding-left:12px;box-sizing:border-box;border:1px solid transparent;outline:none;background:transparent;border-radius:3px}.input-mask.hide{display:none}.input-mask:focus{box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.custom-select-item{display:inline-flex;align-items:center;background:#d2eefb;border-radius:3px;padding:3px 5px;margin:0 0 0 3px;border:1px solid #a9d8ff}.custom-select-item>span{font-size:12px;color:#555;margin-left:3px}.custom-select-item>span i{font-size:10px}.custom-select-item.min{padding:1px 5px;margin-left:2px}.custom-select-item:first-child{margin-left:0}::ng-deep .tn-dropdown.ui-state-disabled .custom-select-item{background:#e1e1e1;border-color:#d4d4d4}::ng-deep .tn-dropdown.ui-state-disabled .custom-select-item>span{display:none}::ng-deep .ui-multiselect-filter-container .input-mask{padding:.2em;height:22px;width:calc(100% - 2px);box-sizing:border-box;text-indent:1.5em;left:1px;top:1px}::ng-deep .ui-multiselect-filter-container .input-mask:focus{left:1px;width:calc(100% - 2px)}\n"], dependencies: [{ kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i8.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "maxItemDisplay", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "autofocusSelectedItem", "modifyOptionsWhenFilter", "delayFilter", "disabled", "itemSize", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i9.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "maxItemDisplay", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "autoZIndex", "baseZIndex", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "modifyOptionsWhenFilter", "delayFilter", "autocomplete", "showClear", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad"] }, { kind: "directive", type: i10.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: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.AfterViewCheckedComponent, selector: "after-view-checked", inputs: ["renderKey"], outputs: ["loaded", "loading", "unloading", "reRender"] }, { kind: "component", type: i12.TnDialogComponent, selector: "tn-dialog", inputs: ["maskClass", "styleClass", "scrollBarStyleClass", "useDefaultScrollBar", "visible", "disabledButton", "modal", "header", "popupSize", "closeOnEscape", "showFooter", "positionTop", "minY", "hiddenSave", "maximizable"], outputs: ["onSave", "onCancel", "onShow", "onHide"] }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }] });
|
|
910
915
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: DropdownComponent, decorators: [{
|
|
911
916
|
type: Component,
|
|
912
|
-
args: [{ selector: 'dropdown', providers: [ComponentContextService], template: "<div #el class=\"tn-dropdown\" [pTooltip]=\"tooltip\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\"\r\n [class.server-load]=\"control.isServerLoad\">\r\n <span class=\"server-load-info\" pTooltip=\"D\u1EEF li\u1EC7u s\u1EBD \u0111\u01B0\u1EE3c l\u00E0m m\u1EDBi ghi t\u00ECm ki\u1EBFm\" tooltipPosition=\"top\"></span>\r\n <p-dropdown *ngIf=\"!control.multiple\" [options]=\"dataSourceInternal\" [placeholder]=\"control.placeholder\"\r\n [filter]=\"control.filter\" [panelStyleClass]=\"getPanelClass()\" [appendTo]=\"control.appendTo\"\r\n [styleClass]=\"'tn-dropdown'\" [emptyFilterMessage]=\"'Kh\u00F4ng t\u00ECm th\u1EA5y k\u1EBFt qu\u1EA3' | translate\"\r\n [disabled]=\"control.disabled ? true : null\" [autoZIndex]=\"true\" [showClear]=\"control.showClear\"\r\n [showTransitionOptions]=\"showTransitionOptions\" [autoDisplayFirst]=\"control.autoDisplayFirst\"\r\n [virtualScroll]=\"control.virtualScroll\" itemSize=\"30\" [maxItemDisplay]=\"control.maxItemDisplay\"\r\n [autofocusSelectedItem]=\"autofocusSelectedItem\" [hideTransitionOptions]=\"hideTransitionOptions\"\r\n [modifyOptionsWhenFilter]=\"modifyOptionWhenFilter\" [delayFilter]=\"delayFilter\" [(ngModel)]=\"_value\"\r\n (onFocus)=\"handleFocus($event)\" (onBlur)=\"handleBlur($event)\" (onChange)=\"onChangeSelected($event)\"\r\n (onClick)=\"onDropdownClickHandler($event)\" (onShow)=\"onShowHandler($event)\" (onHide)=\"onHideHandler($event)\">\r\n <ng-template *ngIf=\"control.templateSelectedItem\" let-item pTemplate=\"selectedItem\">\r\n <ng-container\r\n *ngTemplateOutlet=\"control.templateSelectedItem; context: {$implicit: item, selectedValue: _value}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"control.templateItem\" let-item pTemplate=\"item\">\r\n <ng-container *ngTemplateOutlet=\"control.templateItem; context: {$implicit: item}\"></ng-container>\r\n </ng-template>\r\n </p-dropdown>\r\n <p-multiSelect *ngIf=\"control.multiple\" [options]=\"dataSourceInternal\" [filter]=\"control.filter\"\r\n [defaultLabel]=\"control.placeholder\" [placeholder]=\"control.placeholder\" [panelStyleClass]=\"getPanelClass()\"\r\n [appendTo]=\"control.appendTo\" [styleClass]=\"'tn-dropdown'\"\r\n [emptyFilterMessage]=\"'Kh\u00F4ng t\u00ECm th\u1EA5y k\u1EBFt qu\u1EA3' | translate\" [disabled]=\"control.disabled ? true : null\"\r\n [autoZIndex]=\"true\" [showTransitionOptions]=\"showTransitionOptions\"\r\n [hideTransitionOptions]=\"hideTransitionOptions\" [virtualScroll]=\"control.virtualScroll\"\r\n [maxItemDisplay]=\"control.maxItemDisplay\" [selectedItemsLabel]=\"control.selectedItemsLabel\"\r\n [maxSelectedLabels]=\"control.maxSelectedLabels\" [modifyOptionsWhenFilter]=\"modifyOptionWhenFilterMultiple\"\r\n [delayFilter]=\"delayFilter\" [(ngModel)]=\"_value\" (onChange)=\"onChangeSelected($event)\"\r\n (onClick)=\"onDropdownClickHandler($event)\" (onPanelShow)=\"onPanelShowHandler($event)\"\r\n (onPanelHide)=\"onHideHandler($event)\">\r\n <ng-template pTemplate=\"selectedItems\" let-value>\r\n <ng-container *ngIf=\"!value || value.length == 0\">{{control.placeholder}}</ng-container>\r\n <ng-container *ngIf=\"value && value.length > 0\">\r\n <span *ngFor=\"let selectedItem of value\" [class]=\"_itemSelectedStyleClass\">\r\n {{selectedItem[control.displayField]}}<span class=\"remove-item\"\r\n (click)=\"removeItem($event, selectedItem)\"><i class=\"fas fa-times\"></i></span>\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </p-multiSelect>\r\n <input #inputMask class=\"input-mask hide p-inputtext\" type=\"text\" [disabled]=\"loading\"\r\n [(ngModel)]=\"valueSearchServer\" (keyup)=\"keyUp.next($event)\" />\r\n <span #buttonSetting class=\"button-setting hide pi pi-cog\" (click)=\"showFormSetting()\"></span>\r\n <after-view-checked *ngIf=\"!loading\" (loaded)=\"handleLoaded()\"></after-view-checked>\r\n <button *ngIf=\"control.quickAdd && (control.cols || control.quickAddTemplate)\" type=\"button\" pButton\r\n icon=\"pi pi-plus\" class=\"p-button-text p-button-rounded button-quick-add\" pTooltip=\"Th\u00EAm nhanh\"\r\n tooltipPosition=\"top\" (click)=\"showFormQuickAdd()\"></button>\r\n</div>\r\n<tn-dialog *ngIf=\"quickAddDialogModel.showEditForm\" #dialog [header]=\"quickAddDialogModel.header | translate\"\r\n [popupSize]=\"control.popupSize\" (onHide)=\"quickAddDialogModel.showEditForm = false\">\r\n <ng-container *ngIf=\"control.cols\" [ngTemplateOutlet]=\"
|
|
913
|
-
}], ctorParameters: function () { return [{ type:
|
|
917
|
+
args: [{ selector: 'dropdown', providers: [ComponentContextService], template: "<div #el class=\"tn-dropdown\" [pTooltip]=\"tooltip\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\"\r\n [class.server-load]=\"control.isServerLoad\">\r\n <span class=\"server-load-info\" pTooltip=\"D\u1EEF li\u1EC7u s\u1EBD \u0111\u01B0\u1EE3c l\u00E0m m\u1EDBi ghi t\u00ECm ki\u1EBFm\" tooltipPosition=\"top\"></span>\r\n <p-dropdown *ngIf=\"!control.multiple\" [options]=\"dataSourceInternal\" [placeholder]=\"control.placeholder\"\r\n [filter]=\"control.filter\" [panelStyleClass]=\"getPanelClass()\" [appendTo]=\"control.appendTo\"\r\n [styleClass]=\"'tn-dropdown'\" [emptyFilterMessage]=\"'Kh\u00F4ng t\u00ECm th\u1EA5y k\u1EBFt qu\u1EA3' | translate\"\r\n [disabled]=\"control.disabled ? true : null\" [autoZIndex]=\"true\" [showClear]=\"control.showClear\"\r\n [showTransitionOptions]=\"showTransitionOptions\" [autoDisplayFirst]=\"control.autoDisplayFirst\"\r\n [virtualScroll]=\"control.virtualScroll\" itemSize=\"30\" [maxItemDisplay]=\"control.maxItemDisplay\"\r\n [autofocusSelectedItem]=\"autofocusSelectedItem\" [hideTransitionOptions]=\"hideTransitionOptions\"\r\n [modifyOptionsWhenFilter]=\"modifyOptionWhenFilter\" [delayFilter]=\"delayFilter\" [(ngModel)]=\"_value\"\r\n (onFocus)=\"handleFocus($event)\" (onBlur)=\"handleBlur($event)\" (onChange)=\"onChangeSelected($event)\"\r\n (onClick)=\"onDropdownClickHandler($event)\" (onShow)=\"onShowHandler($event)\" (onHide)=\"onHideHandler($event)\">\r\n <ng-template *ngIf=\"control.templateSelectedItem\" let-item pTemplate=\"selectedItem\">\r\n <ng-container\r\n *ngTemplateOutlet=\"control.templateSelectedItem; context: {$implicit: item, selectedValue: _value}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"control.templateItem\" let-item pTemplate=\"item\">\r\n <ng-container *ngTemplateOutlet=\"control.templateItem; context: {$implicit: item}\"></ng-container>\r\n </ng-template>\r\n </p-dropdown>\r\n <p-multiSelect *ngIf=\"control.multiple\" [options]=\"dataSourceInternal\" [filter]=\"control.filter\"\r\n [defaultLabel]=\"control.placeholder\" [placeholder]=\"control.placeholder\" [panelStyleClass]=\"getPanelClass()\"\r\n [appendTo]=\"control.appendTo\" [styleClass]=\"'tn-dropdown'\"\r\n [emptyFilterMessage]=\"'Kh\u00F4ng t\u00ECm th\u1EA5y k\u1EBFt qu\u1EA3' | translate\" [disabled]=\"control.disabled ? true : null\"\r\n [autoZIndex]=\"true\" [showTransitionOptions]=\"showTransitionOptions\"\r\n [hideTransitionOptions]=\"hideTransitionOptions\" [virtualScroll]=\"control.virtualScroll\"\r\n [maxItemDisplay]=\"control.maxItemDisplay\" [selectedItemsLabel]=\"control.selectedItemsLabel\"\r\n [maxSelectedLabels]=\"control.maxSelectedLabels\" [modifyOptionsWhenFilter]=\"modifyOptionWhenFilterMultiple\"\r\n [delayFilter]=\"delayFilter\" [(ngModel)]=\"_value\" (onChange)=\"onChangeSelected($event)\"\r\n (onClick)=\"onDropdownClickHandler($event)\" (onPanelShow)=\"onPanelShowHandler($event)\"\r\n (onPanelHide)=\"onHideHandler($event)\">\r\n <ng-template pTemplate=\"selectedItems\" let-value>\r\n <ng-container *ngIf=\"!value || value.length == 0\">{{control.placeholder}}</ng-container>\r\n <ng-container *ngIf=\"value && value.length > 0\">\r\n <span *ngFor=\"let selectedItem of value\" [class]=\"_itemSelectedStyleClass\">\r\n {{selectedItem[control.displayField]}}<span class=\"remove-item\"\r\n (click)=\"removeItem($event, selectedItem)\"><i class=\"fas fa-times\"></i></span>\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </p-multiSelect>\r\n <input #inputMask class=\"input-mask hide p-inputtext\" type=\"text\" [disabled]=\"loading\"\r\n [(ngModel)]=\"valueSearchServer\" (keyup)=\"keyUp.next($event)\" />\r\n <span #buttonSetting class=\"button-setting hide pi pi-cog\" (click)=\"showFormSetting()\"></span>\r\n <after-view-checked *ngIf=\"!loading\" (loaded)=\"handleLoaded()\"></after-view-checked>\r\n <button *ngIf=\"control.quickAdd && (control.cols || control.quickAddTemplate)\" type=\"button\" pButton\r\n icon=\"pi pi-plus\" class=\"p-button-text p-button-rounded button-quick-add\" pTooltip=\"Th\u00EAm nhanh\"\r\n tooltipPosition=\"top\" (click)=\"showFormQuickAdd()\"></button>\r\n</div>\r\n<tn-dialog *ngIf=\"quickAddDialogModel.showEditForm\" #dialog [header]=\"quickAddDialogModel.header | translate\"\r\n [popupSize]=\"control.popupSize\" (onHide)=\"quickAddDialogModel.showEditForm = false\">\r\n <ng-container *ngIf=\"control.cols\" [ngTemplateOutlet]=\"dropdownQuickAddForm\" [ngTemplateOutletContext]=\"{\r\n $implicit: quickAddDialogModel, parentModel: model, parentContext: context, control: control,\r\n onSaved: handleSaved, onCancel: handleCancel\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"quickAddDialogModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <quick-add-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\" [control]=\"control\"\r\n [baseService]=\"control.baseService\" (onSaved)=\"handleSaved()\" (onCancel)=\"handleCancel()\">\r\n </quick-add-form> -->\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"settingDialogModel.showEditForm\" #dialog [header]=\"settingDialogModel.header | translate\"\r\n [popupSize]=\"control.popupSize\" (onHide)=\"settingDialogModel.showEditForm = false\">\r\n <ng-container [ngTemplateOutlet]=\"dropdownSettingForm\" [ngTemplateOutletContext]=\"{\r\n $implicit: settingDialogModel, onSaved: handleSavedSetting\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"settingDialogModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <dropdown-setting-form #formBase [model]=\"settingDialogModel.data.formModel\" (onSaved)=\"handleSavedSetting()\"\r\n (onCancel)=\"settingDialogModel.showEditForm = false\">\r\n </dropdown-setting-form> -->\r\n</tn-dialog>\r\n<ng-container *ngTemplateOutlet=\"control.quickAddTemplate; context: {\r\n handleSaved: handleSaved,\r\n handleCancel: handleCancel,\r\n dialogModel: quickAddDialogModel\r\n}\"></ng-container>", styles: [".tn-dropdown{display:flex}.tn-dropdown p-dropdown,.tn-dropdown p-multiSelect{flex:1 1;width:100%}.tn-dropdown>.button-quick-add{flex:0 0 auto}.button-setting.hide{display:none}.input-mask{position:absolute;z-index:1;width:100%;padding-left:12px;box-sizing:border-box;border:1px solid transparent;outline:none;background:transparent;border-radius:3px}.input-mask.hide{display:none}.input-mask:focus{box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.custom-select-item{display:inline-flex;align-items:center;background:#d2eefb;border-radius:3px;padding:3px 5px;margin:0 0 0 3px;border:1px solid #a9d8ff}.custom-select-item>span{font-size:12px;color:#555;margin-left:3px}.custom-select-item>span i{font-size:10px}.custom-select-item.min{padding:1px 5px;margin-left:2px}.custom-select-item:first-child{margin-left:0}::ng-deep .tn-dropdown.ui-state-disabled .custom-select-item{background:#e1e1e1;border-color:#d4d4d4}::ng-deep .tn-dropdown.ui-state-disabled .custom-select-item>span{display:none}::ng-deep .ui-multiselect-filter-container .input-mask{padding:.2em;height:22px;width:calc(100% - 2px);box-sizing:border-box;text-indent:1.5em;left:1px;top:1px}::ng-deep .ui-multiselect-filter-container .input-mask:focus{left:1px;width:calc(100% - 2px)}\n"] }]
|
|
918
|
+
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.CrudService }, { type: i2.DeviceDetectorService }, { type: i3.ComponentService }]; }, propDecorators: { el: [{
|
|
914
919
|
type: ViewChild,
|
|
915
920
|
args: ['el']
|
|
916
921
|
}], input: [{
|
|
@@ -974,4 +979,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
|
|
|
974
979
|
}], adjustValue: [{
|
|
975
980
|
type: Output
|
|
976
981
|
}] } });
|
|
977
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFZLEtBQUssRUFBcUIsTUFBTSxFQUFlLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4SSxPQUFPLEVBQUUsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFB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T0FBTztzQkFBaEIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZXZpY2VEZXRlY3RvclNlcnZpY2UgfSBmcm9tICduZ3gtZGV2aWNlLWRldGVjdG9yJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBTZWxlY3RJdGVtIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgRHJvcGRvd24gfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9kcm9wZG93bic7XHJcbmltcG9ydCB7IE11bHRpU2VsZWN0IH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvbXVsdGlzZWxlY3QnO1xyXG5cclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHAtY29udGV4dC9jb21wb25lbnQtY29udGV4dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvYmFzZS9jb21wb25lbnQtYmFzZSc7XHJcbmltcG9ydCB7IEZvcm1TdGF0ZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQ3J1ZEZvcm1EYXRhLCBEaWFsb2dNb2RlbCwgRHJvcGRvd25Db250cm9sU2NoZW1hIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XHJcbmltcG9ydCB7IEtleVN0b3JhZ2VEcm9wZG93blNldHRpbmcsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vZW51bXMvY29tbW9uJztcclxuaW1wb3J0IHsgRmlsdGVyIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dyaWQtaW5mbyc7XHJcbmltcG9ydCB7IENvbXBvbmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb21wb25lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IENydWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY3J1ZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWFzdGVyRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYXN0ZXItZGF0YS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgYXBwZW5kRGVmYXVsdEZpbHRlciB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbW1vbic7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2Ryb3Bkb3duJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9kcm9wZG93bi5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbQ29tcG9uZW50Q29udGV4dFNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bkNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBAVmlld0NoaWxkKCdlbCcpIGVsOiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRNYXNrJykgaW5wdXQ6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKCdidXR0b25TZXR0aW5nJykgYnV0dG9uU2V0dGluZzogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoRHJvcGRvd24pIGRyb3Bkb3duOiBEcm9wZG93bjtcclxuICAgIEBWaWV3Q2hpbGQoTXVsdGlTZWxlY3QpIG11bHRpU2VsZWN0OiBNdWx0aVNlbGVjdDtcclxuXHJcbiAgICBASW5wdXQoKSBzZXQgc2hvd0NsZWFyKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2wuc2hvd0NsZWFyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5zaG93Q2xlYXIgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCkgZGlzYWJsZURpc3BsYXlGaWVsZFNlcnZlclNlYXJjaCA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpIHNldCBmaWx0ZXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29udHJvbC5maWx0ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sLmZpbHRlciA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKSBjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgPSBuZXcgRHJvcGRvd25Db250cm9sU2NoZW1hKCk7XHJcbiAgICBASW5wdXQoKSBkZWZhdWx0TGFiZWwgPSAnJztcclxuICAgIEBJbnB1dCgpIGFwcGVuZFRvOiBhbnkgPSAnYm9keSc7XHJcblxyXG4gICAgQElucHV0KCkgc2V0IGRhdGFTb3VyY2UodmFsdWU6IGFueVtdKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IFtdO1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UucHVzaCh0aGlzLnJlU3RydWN0dXJlSXRlbU9iamVjdChpdGVtKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb21iaW5lRGF0YVNvdXJjZShkYXRhU291cmNlLCAxKTtcclxuICAgICAgICB0aGlzLmNoZWNrQW5kRmlyZUV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCkgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5fcmV0dXJuVmFsdWUgIT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5tdWx0aXBsZSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAvLyBmaXJlIGV2ZW50IMSRaeG7gXUgY2jhu4luaCB2YWx1ZSB04burIFt2YWx1ZTogZ3VpZF0gPT4ge1tmaWVsZFZhbHVlXTogW3ZhbHVlOiBndWlkXSwgLi4uWzEgc+G7kSB0csaw4budbmcga2jDoWMgbuG7r2EgdHJvbmcgZGF0YXNvdXJjZV19XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZWZhdWx0U2VsZWN0ZWRTdHlsZUNsYXNzID0gJ2N1c3RvbS1zZWxlY3QtaXRlbSc7XHJcbiAgICBfaXRlbVNlbGVjdGVkU3R5bGVDbGFzcyA9IHRoaXMuZGVmYXVsdFNlbGVjdGVkU3R5bGVDbGFzcztcclxuICAgIEBJbnB1dCgpIHNldCBpdGVtU2VsZWN0ZWRTdHlsZUNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5faXRlbVNlbGVjdGVkU3R5bGVDbGFzcyA9IGAke3RoaXMuZGVmYXVsdFNlbGVjdGVkU3R5bGVDbGFzc30gJHt2YWx1ZX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5faXRlbVNlbGVjdGVkU3R5bGVDbGFzcyA9IGAke3RoaXMuZGVmYXVsdFNlbGVjdGVkU3R5bGVDbGFzc30gJHt2YWx1ZX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBAT3V0cHV0KCkgb25Jbml0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ29sbGFwc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25FeHBhbmQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25Ecm9wZG93bkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25TaG93ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25TaG93U21hcnRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uSGlkZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uSGlkZVNtYXJ0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25CbHVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uRGF0YVNvdXJjZUxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgYWRqdXN0VmFsdWUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBfdW5TdWJzY3JpYmVBbGwgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgICBkYXRhU291cmNlSW50ZXJuYWwgPSBbXTtcclxuICAgIGRhdGFTb3VyY2VTZWxlY3RlZCA9IFtdO1xyXG4gICAgc2VsZWN0ZWRWYWx1ZUJlZm9yZTogYW55O1xyXG4gICAgX3ZhbHVlOiBhbnk7XHJcbiAgICBfcmV0dXJuVmFsdWU6IGFueTtcclxuICAgIGZ1bmNSZXR1cm5WYWx1ZTogKHZhbHVlKSA9PiB7fSA9IHZhbHVlID0+IHZhbHVlO1xyXG4gICAgdG9vbHRpcDogc3RyaW5nO1xyXG4gICAgaGlkZVRyYW5zaXRpb25PcHRpb25zID0gJzE5NW1zIGVhc2UtaW4nO1xyXG4gICAgc2hvd1RyYW5zaXRpb25PcHRpb25zID0gJzIyNW1zIGVhc2Utb3V0JztcclxuXHJcbiAgICBpbnB1dEVsbTogYW55O1xyXG4gICAgYXV0b2ZvY3VzU2VsZWN0ZWRJdGVtOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGdldEZpbHRlck9uU2VydmVyU2VhcmNoOiBGdW5jdGlvbjtcclxuICAgIHZhbHVlU2VhcmNoU2VydmVyID0gJyc7XHJcbiAgICBrZXlVcCA9IG5ldyBTdWJqZWN0PEtleWJvYXJkRXZlbnQ+KCk7XHJcbiAgICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICAgIF9oYXNMb2FkZWREYXRhc291cmNlID0gZmFsc2U7XHJcblxyXG4gICAgcXVpY2tBZGREaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCh7fSk7XHJcbiAgICBzZXR0aW5nRGlhbG9nTW9kZWwgPSBuZXcgRGlhbG9nTW9kZWwoe1xyXG4gICAgICAgIGhlYWRlcjogJ0PhuqV1IGjDrG5oIGRyb3Bkb3duJ1xyXG4gICAgfSk7XHJcblxyXG4gICAgZmxhc2hDYWNoZVBhcmVudDogYW55W10gPSBbXTtcclxuICAgIGZpbHRlckZyb21QYXJlbnRzOiBGaWx0ZXJbXSA9IFtdO1xyXG4gICAgZHJvcGRvd25PcHRpb25zID0gW107XHJcbiAgICBkZWxheUZpbHRlcjogbnVtYmVyID0gMTAwO1xyXG4gICAgc2Nyb2xsQ29udGFpbmVyOiBhbnk7XHJcbiAgICB0aW1lb3V0U2Nyb2xsOiBhbnk7XHJcbiAgICBmaXJzdFNjcm9sbDogYW55ID0gdHJ1ZTtcclxuICAgIGxvYWRpbmcgPSBmYWxzZTtcclxuICAgIHBhZ2U6IG51bWJlciA9IDE7XHJcbiAgICB0b3RhbFBhZ2U6IG51bWJlciA9IDI7XHJcbiAgICBjdXN0b21UZW1wbGF0ZToge1xyXG4gICAgICAgIFtrZXk6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICB9ID0ge307XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBfZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlOiBEZXZpY2VEZXRlY3RvclNlcnZpY2UsXHJcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgIF9jcnVkU2VydmljZTogQ3J1ZFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50U2VydmljZTogQ29tcG9uZW50U2VydmljZVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wucXVpY2tBZGQpIHtcclxuICAgICAgICAgICAgdGhpcy5xdWlja0FkZERpYWxvZ01vZGVsLmhlYWRlciA9IGBUaMOqbSBt4bubaSAke3RoaXMuY29udHJvbC5sYWJlbH1gO1xyXG4gICAgICAgICAgICB0aGlzLnF1aWNrQWRkRGlhbG9nTW9kZWwucG9wdXBTaXplID0gdGhpcy5jb250cm9sLnBvcHVwU2l6ZTtcclxuICAgICAgICAgICAgdGhpcy5xdWlja0FkZERpYWxvZ01vZGVsLmRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtTW9kZWw6IG5ldyBDcnVkRm9ybURhdGEoKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLmZpdFBhbmVsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzV3JhcENvbnRlbnQgPSAnLS13cmFwLWNvbnRlbnQnO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udHJvbC5wYW5lbENsYXNzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wucGFuZWxDbGFzcyA9IGNsYXNzV3JhcENvbnRlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wucGFuZWxDbGFzcyArPSBgICR7Y2xhc3NXcmFwQ29udGVudH1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29udHJvbC5fY29tcG9uZW50ID0gdGhpcztcclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLnBsYWNlaG9sZGVyID09IG51bGwgJiYgdGhpcy5jb250cm9sLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5wbGFjZWhvbGRlciA9ICdDaMawYSBjaOG7jW4gYuG6o24gZ2hpJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0U2V0dGluZygpO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wuYmFzZVNlcnZpY2UpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5pc1NlcnZlckxvYWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5tYXhJdGVtRGlzcGxheSA9IDk5OTk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZpbHRlckZ1bmN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVNlYXJjaFN1YnNjcmlwdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wubG9hZE9uSW5pdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0RGF0YSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc0Rlc2t0b3AoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGVUcmFuc2l0aW9uT3B0aW9ucyA9IHRoaXMuc2hvd1RyYW5zaXRpb25PcHRpb25zID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wub25Jbml0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5vbkluaXQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25Jbml0LmVtaXQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZSA9IHRoaXMuX2NvbXBvbmVudFNlcnZpY2UuZGljVGVtcGxhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5fdW5TdWJzY3JpYmVBbGwuY29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXREZWZhdWx0U2V0dGluZygpIHtcclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLmlzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLmRlbGF5RmlsdGVyID0gMjAwO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udHJvbC5mdW5jR2V0TGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5mdW5jR2V0TGFiZWwgPSBpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5fcHJlZml4ICsgaXRlbVt0aGlzLmNvbnRyb2wuZGlzcGxheUZpZWxkXTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jb250cm9sLmZ1bmNHZXRMYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLmZ1bmNHZXRMYWJlbCA9IGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtW3RoaXMuY29udHJvbC5kaXNwbGF5RmllbGRdO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2wuZ2VuZXJhdGVUb29sdGlwICYmICF0aGlzLmNvbnRyb2wubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sLmdlbmVyYXRlVG9vbHRpcCA9IHRoaXMuY29udHJvbC5mdW5jR2V0TGFiZWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLnJldHVyblR5cGUgPT0gJ3ZhbHVlJykge1xyXG4gICAgICAgICAgICB0aGlzLmZ1bmNSZXR1cm5WYWx1ZSA9ICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoaXRlbSA9PiBpdGVtW3RoaXMuY29udHJvbC52YWx1ZUZpZWxkXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbdGhpcy5jb250cm9sLnZhbHVlRmllbGRdO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mdW5jUmV0dXJuVmFsdWUgPSB2YWx1ZSA9PiB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGVsYXlTZWFyY2hUaW1lKCkge1xyXG4gICAgICAgIGNvbnN0IGpzRHJvcGRvd25TZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oS2V5U3RvcmFnZURyb3Bkb3duU2V0dGluZyk7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IDUwMDtcclxuICAgICAgICBpZiAoanNEcm9wZG93blNldHRpbmcpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duU2V0dGluZyA9IEpTT04ucGFyc2UoanNEcm9wZG93blNldHRpbmcpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZHJvcGRvd25TZXR0aW5nLmRlbGF5U2VhcmNoVGltZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcmVzdWx0IHx8IHJlc3VsdCA9PSBOYU4gfHwgcmVzdWx0IDwgMjAwKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IDIwMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGxQYXJlbnQocmVzdWx0LCBwYXJlbnRJZCkge1xyXG4gICAgICAgIGlmICh0aGlzLmZsYXNoQ2FjaGVQYXJlbnQuc29tZShxID0+IHEudmFsdWUuaWQgPT0gcGFyZW50SWQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaXRlbVBhcmVudCA9IHRoaXMuZHJvcGRvd25PcHRpb25zLmZpbmQocSA9PiBxLnZhbHVlLmlkID09IHBhcmVudElkKTtcclxuICAgICAgICBpZiAoaXRlbVBhcmVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1BZGQgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi5pdGVtUGFyZW50LFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuY29udHJvbC5kaXNhYmxlZFBhcmVudEl0ZW1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goaXRlbUFkZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4RXhpc3QgPSB0aGlzLmZsYXNoQ2FjaGVQYXJlbnQuZmluZEluZGV4KHEgPT4gcS52YWx1ZS5fbGV2ZWwgPT0gaXRlbUFkZC52YWx1ZS5fbGV2ZWwpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXhFeGlzdCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZsYXNoQ2FjaGVQYXJlbnRbaW5kZXhFeGlzdF0gPSBpdGVtQWRkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mbGFzaENhY2hlUGFyZW50LnB1c2goaXRlbUFkZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEzhuqV5IHRow6ptIGLhuqNuIGdoaSBjaGEgY+G7p2EgYuG6o24gZ2hpIGNoYVxyXG4gICAgICAgICAgICBwYXJlbnRJZCA9IHRoaXMuZ2V0UGFyZW50SWRGcm9tSXRlbShpdGVtUGFyZW50KTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudElkICE9IHRoaXMuZ3VpZEVtcHR5ICYmIHBhcmVudElkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWxsUGFyZW50KHJlc3VsdCwgcGFyZW50SWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFscmVhZHlIYXNQYXJlbnQob3B0aW9uczogYW55W10sIGluZGV4U3RhcnQ6IG51bWJlciwgcGFyZW50SWQ6IHN0cmluZywgbGV2ZWw6IG51bWJlcikge1xyXG4gICAgICAgIHdoaWxlIChpbmRleFN0YXJ0ID4gLTEpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnNbaW5kZXhTdGFydF0udmFsdWUuaWQgPT0gcGFyZW50SWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnNbaW5kZXhTdGFydF0udmFsdWUubGV2ZWwgPT0gbGV2ZWwgJiYgdGhpcy5nZXRQYXJlbnRJZEZyb21JdGVtKG9wdGlvbnNbaW5kZXhTdGFydF0pICE9IHBhcmVudElkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mbGFzaENhY2hlUGFyZW50LnNvbWUocSA9PiBxLnZhbHVlLmlkID09IHBhcmVudElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleFN0YXJ0LS07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFBhcmVudElkRnJvbUl0ZW0oaXRlbSkge1xyXG4gICAgICAgIHJldHVybiBpdGVtLnZhbHVlW3RoaXMuY29udHJvbC5maWVsZFRyZWVdO1xyXG4gICAgfVxyXG5cclxuICAgIG1vZGlmeU9wdGlvbldoZW5GaWx0ZXIgPSAob3B0aW9ucykgPT4ge1xyXG4gICAgICAgIHRoaXMuZHJvcGRvd25PcHRpb25zID0gdGhpcy5kcm9wZG93bi5fb3B0aW9ucztcclxuICAgICAgICB0aGlzLl9tb2RpZnlPcHRpb25XaGVuRmlsdGVyKG9wdGlvbnMpO1xyXG4gICAgfTtcclxuXHJcbiAgICBtb2RpZnlPcHRpb25XaGVuRmlsdGVyTXVsdGlwbGUgPSAob3B0aW9ucykgPT4ge1xyXG4gICAgICAgIHRoaXMuZHJvcGRvd25PcHRpb25zID0gdGhpcy5tdWx0aVNlbGVjdC5fb3B0aW9ucztcclxuICAgICAgICB0aGlzLl9tb2RpZnlPcHRpb25XaGVuRmlsdGVyKG9wdGlvbnMpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfbW9kaWZ5T3B0aW9uV2hlbkZpbHRlcihvcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5mbGFzaENhY2hlUGFyZW50ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gdGhpcy5nZXRQYXJlbnRJZEZyb21JdGVtKG9wdGlvbnNbaV0pO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50SWQgIT0gdGhpcy5ndWlkRW1wdHkgJiYgcGFyZW50SWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgLy8gS2nhu4NtIHRyYSBjw6FjIGLhuqNuIGdoaSBwaMOtYSB0csaw4bubYyB4ZW0gxJHDoyBjw7MgYuG6o24gZ2hpIGNoYSBjaMawYSAoQ2hvIMSR4bq/biBnaGkgZ+G6t3AgYuG6o24gZ2hpIGPDuW5nIGxldmVsIG5oxrBuZyBraMOhYyBwYXJlbnRJZClcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhhc1BhcmVudCA9IHRoaXMuYWxyZWFkeUhhc1BhcmVudChvcHRpb25zLCBpIC0gMSwgcGFyZW50SWQsIG9wdGlvbnNbaV0ubGV2ZWwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNQYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFsbFBhcmVudChwYXJlbnRzLCBwYXJlbnRJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNwbGljZShpLCAwLCAuLi5wYXJlbnRzLnJldmVyc2UoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gcGFyZW50cy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUZpbHRlckZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wuc2VhcmNoRmllbGQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wuc2VhcmNoRmllbGQgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2wuZGlzYWJsZURpc3BsYXlGaWVsZFNlcnZlclNlYXJjaCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udHJvbC5zZWFyY2hGaWVsZC5zb21lKGl0ZW0gPT4gaXRlbSA9PSB0aGlzLmNvbnRyb2wuZGlzcGxheUZpZWxkKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnNlYXJjaEZpZWxkLnB1c2godGhpcy5jb250cm9sLmRpc3BsYXlGaWVsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5zZWFyY2hGaWVsZC5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldEZpbHRlck9uU2VydmVyU2VhcmNoID0gdmFsdWUgPT4gKHtcclxuICAgICAgICAgICAgICAgIGZpZWxkOiB0aGlzLmNvbnRyb2wuc2VhcmNoRmllbGRbMF0sIG9wZXJhdG9yOiBPcGVyYXRvci5jb250YWluLCB2YWx1ZTogSlNPTi5zdHJpbmdpZnkodmFsdWUpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRGaWx0ZXJPblNlcnZlclNlYXJjaCA9IHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2ljOiAnb3InLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IFtdXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcFZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZFNlYXJjaCBvZiB0aGlzLmNvbnRyb2wuc2VhcmNoRmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZmlsdGVycy5wdXNoKHsgZmllbGQ6IGZpZWxkU2VhcmNoLCBvcGVyYXRvcjogT3BlcmF0b3IuY29udGFpbiwgdmFsdWU6IHRtcFZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGF0YShmaWx0ZXJQYXJlbnRzPzogRmlsdGVyW10pIHtcclxuICAgICAgICBpZiAoIWZpbHRlclBhcmVudHMpIGZpbHRlclBhcmVudHMgPSBbXTtcclxuICAgICAgICB0aGlzLmZpbHRlckZyb21QYXJlbnRzID0gZmlsdGVyUGFyZW50cztcclxuICAgICAgICB0aGlzLl9nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb21iaW5lRGF0YVNvdXJjZShkYXRhU291cmNlOiBhbnlbXSwgcGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5hdXRvZm9jdXNTZWxlY3RlZEl0ZW0gPSB0cnVlO1xyXG4gICAgICAgIGlmICghZGF0YVNvdXJjZSkgZGF0YVNvdXJjZSA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wuaXNTZXJ2ZXJMb2FkKSB7XHJcbiAgICAgICAgICAgIGlmIChwYWdlID4gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvZm9jdXNTZWxlY3RlZEl0ZW0gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bkb3duKSB0aGlzLmRyb3Bkb3duLnNlbGVjdGVkT3B0aW9uVXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gQXBwZW5kIHRow6ptIGRhdGFzb3VyY2VcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcERhdGFTb3VyY2UgPSBbLi4udGhpcy5kYXRhU291cmNlSW50ZXJuYWxdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmREYXRhU291cmNlKHRtcERhdGFTb3VyY2UsIGRhdGFTb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRtcERhdGFTb3VyY2UubGVuZ3RoID09IHRoaXMuZGF0YVNvdXJjZUludGVybmFsLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGFOZXh0UGFnZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlSW50ZXJuYWwgPSB0bXBEYXRhU291cmNlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRtcERhdGFTb3VyY2UgPSBbLi4uZGF0YVNvdXJjZV07XHJcbiAgICAgICAgICAgIGlmICgodGhpcy5jb250cm9sLm11bHRpcGxlICYmIHRoaXMuX3ZhbHVlICYmIHRoaXMuX3ZhbHVlLmxlbmd0aClcclxuICAgICAgICAgICAgICAgIHx8ICghdGhpcy5jb250cm9sLm11bHRpcGxlICYmIHRoaXMuX3ZhbHVlKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2VTZWxlY3RlZCAmJiB0aGlzLmRhdGFTb3VyY2VTZWxlY3RlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNMb2FkZWREYXRhc291cmNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMudmFsdWVTZWFyY2hTZXJ2ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmREYXRhU291cmNlKHRtcERhdGFTb3VyY2UsIHRoaXMuZGF0YVNvdXJjZVNlbGVjdGVkLCAtMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzTG9hZGVkRGF0YXNvdXJjZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlSW50ZXJuYWwgPSB0bXBEYXRhU291cmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlSW50ZXJuYWwgPSBkYXRhU291cmNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhU291cmNlSW50ZXJuYWwubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzTG9hZGVkRGF0YXNvdXJjZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcHBlbmREYXRhU291cmNlKGRlc3RTb3VyY2U6IGFueVtdLCBkYXRhU291cmNlOiBhbnlbXSwgZGlyZWN0aW9uOiBudW1iZXIgPSAxKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5pc1RyZWUpIHtcclxuICAgICAgICAgICAgZGF0YVNvdXJjZS5mb3JFYWNoKHNvdXJjZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGRlc3RTb3VyY2UuZmluZEluZGV4KHEgPT4gcS52YWx1ZVt0aGlzLmNvbnRyb2wuZmllbGRNYVBoYW5DYXBdID4gc291cmNlLnZhbHVlW3RoaXMuY29udHJvbC5maWVsZE1hUGhhbkNhcF0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gS2nhu4NtIHRyYSBi4bqjbiBnaGkgY3Xhu5FpIGPDuW5nIGzDoCBuw7MgdGjDrCBrIGluc2VydFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXN0U291cmNlLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVzdFNvdXJjZVtkZXN0U291cmNlLmxlbmd0aCAtIDFdLnZhbHVlW3RoaXMuY29udHJvbC52YWx1ZUZpZWxkXSA9PSBzb3VyY2UudmFsdWVbdGhpcy5jb250cm9sLnZhbHVlRmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZGVzdFNvdXJjZS5wdXNoKHNvdXJjZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmRleCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVzdFNvdXJjZS51bnNoaWZ0KHNvdXJjZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBO4bq/dSBi4bqjbiBnaGkgbmdheSB0csaw4bubYyB24buLIHRyw60gY+G6p24gaW5zZXJ0IGzDoCBi4bqjbiBnaGkgaGnhu4duIHThuqFpIHRow6wgayBpbnNlcnRcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdFNvdXJjZVtpbmRleCAtIDFdLnZhbHVlW3RoaXMuY29udHJvbC52YWx1ZUZpZWxkXSA9PSBzb3VyY2UudmFsdWVbdGhpcy5jb250cm9sLnZhbHVlRmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc291cmNlLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0U291cmNlW2luZGV4IC0gMV0uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGRlc3RTb3VyY2Uuc3BsaWNlKGluZGV4LCAwLCBzb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGFTb3VyY2UuZm9yRWFjaChzb3VyY2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBkZXN0U291cmNlLmZpbmRJbmRleChxID0+IHEudmFsdWVbdGhpcy5jb250cm9sLnZhbHVlRmllbGRdID09IHNvdXJjZS52YWx1ZVt0aGlzLmNvbnRyb2wudmFsdWVGaWVsZF0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0U291cmNlLnVuc2hpZnQoc291cmNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RTb3VyY2UucHVzaChzb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrQW5kRmlyZUV2ZW50KGZvcmNlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2hhc0xvYWRlZERhdGFzb3VyY2UpIHtcclxuICAgICAgICAgICAgaWYgKGZvcmNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uUmVhZHkuZW1pdCh0aGlzLmNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG9sZFZhbHVlID0gdGhpcy5fdmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICBsZXQgbmV3VmFsdWUgPSBbXTtcclxuICAgICAgICAgICAgaWYgKCFvbGRWYWx1ZSkgb2xkVmFsdWUgPSBbXTtcclxuICAgICAgICAgICAgaWYgKG9sZFZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZVNlbGVjdGVkTXVsdGlwbGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA9PSAwXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmNvbnRyb2wubm90SW5DcnVkRm9ybVxyXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5jb250cm9sLmF1dG9EaXNwbGF5Rmlyc3RcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IFt0aGlzLmRhdGFTb3VyY2VJbnRlcm5hbFswXS52YWx1ZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZS5sZW5ndGggIT0gdGhpcy5fdmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl92YWx1ZSAhPSBvbGRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RWYWx1ZTJXYXlCaW5kaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0VmFsdWVTZWxlY3RlZFNpbmdsZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsdWUgPT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5jb250cm9sLm5vdEluQ3J1ZEZvcm1cclxuICAgICAgICAgICAgICAgICYmIHRoaXMuY29udHJvbC5hdXRvRGlzcGxheUZpcnN0XHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLmRhdGFTb3VyY2VJbnRlcm5hbFswXS52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gTMawdSDDvSBpZiDhu58gZMaw4bubaSBraMO0bmcgxJHGsOG7o2MgxJHhu5VpIHRow6BuaCBvbGRWYWx1ZSAhPSB0aGlzLl92YWx1ZVxyXG4gICAgICAgICAgICAvLyBWw6wgZ2nDoSB0cuG7iyBj4bunYSB0aGlzLl92YWx1ZSBz4bq9IMSRxrDhu6NjIGNvcnJlY3Rpbmcg4bufIHRyw6puIChpZCA9PiBvYmplY3QpIG7Dqm4gc28gc8Ohbmggc+G6vSBraMOhYyBuaGF1XHJcbiAgICAgICAgICAgIGlmICgob2xkVmFsdWUgIT0gbnVsbCAmJiB0aGlzLl92YWx1ZSA9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgfHwgKG9sZFZhbHVlID09IG51bGwgJiYgdGhpcy5fdmFsdWUgIT0gbnVsbClcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl92YWx1ZSAhPSBvbGRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RWYWx1ZTJXYXlCaW5kaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tSZWFkeSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNldFNlbGVjdGVkVmFsdWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5pc1NlcnZlckxvYWQpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IFtdO1xyXG4gICAgICAgICAgICBsZXQgbGVuZ3RoID0gMTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gdGhpcy5fdmFsdWUubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV3RmlsdGVyKHRoaXMuY29udHJvbC52YWx1ZUZpZWxkLCBPcGVyYXRvci5pbiwgdGhpcy5fdmFsdWUpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV3RmlsdGVyKHRoaXMuY29udHJvbC52YWx1ZUZpZWxkLCBPcGVyYXRvci5lcXVhbCwgdGhpcy5fdmFsdWUpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YVNvdXJjZSB9ID0gYXdhaXQgdGhpcy5fZ2V0RGF0YVNvdXJjZUJ5U2VydmljZShmaWx0ZXJzLCAxLCBsZW5ndGgpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2VTZWxlY3RlZCA9IGRhdGFTb3VyY2U7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2VJbnRlcm5hbCAmJiB0aGlzLmRhdGFTb3VyY2VJbnRlcm5hbC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2hhc0xvYWRlZERhdGFzb3VyY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY29tYmluZURhdGFTb3VyY2UodGhpcy5kYXRhU291cmNlSW50ZXJuYWwsIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNoZWNrQW5kRmlyZUV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRWYWx1ZVNlbGVjdGVkTXVsdGlwbGUoKSB7XHJcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBbXTtcclxuICAgICAgICBjb25zdCB0bXBWYWx1ZSA9IFsuLi50aGlzLl92YWx1ZV07XHJcbiAgICAgICAgdGhpcy5hcHBlbmRWYWx1ZUZyb21EYXRhU291cmNlKG5ld1ZhbHVlLCB0bXBWYWx1ZSwgdGhpcy5kYXRhU291cmNlSW50ZXJuYWwpO1xyXG4gICAgICAgIHRoaXMuYXBwZW5kVmFsdWVGcm9tRGF0YVNvdXJjZShuZXdWYWx1ZSwgdG1wVmFsdWUsIHRoaXMuZGF0YVNvdXJjZVNlbGVjdGVkKTtcclxuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcHBlbmRWYWx1ZUZyb21EYXRhU291cmNlKG5ld1ZhbHVlOiBhbnlbXSwgY3VycmVudFZhbHVlOiBhbnlbXSwgZGF0YVNvdXJjZTogYW55W10pIHtcclxuICAgICAgICBpZiAoIWRhdGFTb3VyY2UgfHwgIWRhdGFTb3VyY2UubGVuZ3RoKSByZXR1cm47XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50VmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gY3VycmVudFZhbHVlW2ldO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YVNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5mdW5jQ29tcGFyZShpdGVtLnZhbHVlLCBzZWxlY3RlZEl0ZW0pXHJcbiAgICAgICAgICAgICAgICAgICAgfHwgdGhpcy5jb250cm9sLmZ1bmNDb21wYXJlKGl0ZW0udmFsdWUsIHNlbGVjdGVkSXRlbVt0aGlzLmNvbnRyb2wudmFsdWVGaWVsZF0pXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZS5wdXNoKGl0ZW0udmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZS5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaS0tO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRqdXN0VmFsdWVTZWxlY3RlZFNpbmdsZSgpIHtcclxuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlO1xyXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcclxuICAgICAgICBpZiAob2xkVmFsdWUgPT09IG51bGwgfHwgb2xkVmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuZmluZEl0ZW1Gcm9tRGF0YVNvdXJjZShvbGRWYWx1ZSwgdGhpcy5kYXRhU291cmNlSW50ZXJuYWwpO1xyXG4gICAgICAgIHRoaXMuZmluZEl0ZW1Gcm9tRGF0YVNvdXJjZShvbGRWYWx1ZSwgdGhpcy5kYXRhU291cmNlU2VsZWN0ZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmluZEl0ZW1Gcm9tRGF0YVNvdXJjZShvbGRWYWx1ZTogYW55LCBkYXRhU291cmNlOiBhbnlbXSkge1xyXG4gICAgICAgIGlmICghZGF0YVNvdXJjZSB8fCAhZGF0YVNvdXJjZS5sZW5ndGgpIHJldHVybjtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YVNvdXJjZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb250cm9sLmZ1bmNDb21wYXJlKGl0ZW0udmFsdWUsIG9sZFZhbHVlKVxyXG4gICAgICAgICAgICAgICAgfHwgdGhpcy5jb250cm9sLmZ1bmNDb21wYXJlKGl0ZW0udmFsdWUsIG9sZFZhbHVlW3RoaXMuY29udHJvbC52YWx1ZUZpZWxkXSlcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IGl0ZW0udmFsdWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjaGVja1JlYWR5KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wub25BZGp1c3RlZFZhbHVlXHJcbiAgICAgICAgICAgICYmIHRoaXMuX2hhc0xvYWRlZERhdGFzb3VyY2VcclxuICAgICAgICAgICAgJiYgKCghdGhpcy5jb250cm9sLm11bHRpcGxlICYmIHRoaXMuX3ZhbHVlICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5jb250cm9sLm11bHRpcGxlICYmIHRoaXMuX3ZhbHVlICE9IG51bGwgJiYgdGhpcy5fdmFsdWUubGVuZ3RoID4gMCkpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZUFkanVzdFZhbHVlRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVTdHJ1Y3R1cmVJdGVtT2JqZWN0KGl0ZW0pOiBTZWxlY3RJdGVtIHtcclxuICAgICAgICBjb25zdCB0ZW1wOiBTZWxlY3RJdGVtID0ge1xyXG4gICAgICAgICAgICB2YWx1ZTogaXRlbSxcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZWQgfHwgaXRlbS5fR2VuZXJhdGVkQnlCYXNlID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLmZ1bmNHZXRMYWJlbCkge1xyXG4gICAgICAgICAgICB0ZW1wLmxhYmVsID0gdGhpcy5jb250cm9sLmZ1bmNHZXRMYWJlbChpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRlbXAubGFiZWwgPSBpdGVtW3RoaXMuY29udHJvbC5kaXNwbGF5RmllbGRdIHx8IGl0ZW1bJ2xhYmVsJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0ZW1wLmxhYmVsID09PSBudWxsIHx8IHRlbXAubGFiZWwgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0ZW1wLmxhYmVsID0gJ0tow7RuZyB4w6FjIMSR4buLbmgnO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0ZW1wLnZhbHVlLl9kcm9wZG93bnZhbHVlID0gdGhpcy5jb250cm9sLnZhbHVlRmllbGQ7XHJcbiAgICAgICAgcmV0dXJuIHRlbXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRDb250cm9sKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl92YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlSW50ZXJuYWwgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5maXJlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyRGF0YXNvdXJjZSgpIHtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2VJbnRlcm5hbCA9IFtdO1xyXG4gICAgICAgIHRoaXMuX2hhc0xvYWRlZERhdGFzb3VyY2UgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9nZXREYXRhKHBhZ2U6IG51bWJlciA9IDEpIHtcclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLmJhc2VTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2dldERhdGFTb3VyY2UocGFnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgX2dldERhdGFTb3VyY2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSBhd2FpdCB0aGlzLmZpbHRlclByb2Nlc3ModGhpcy5maWx0ZXJGcm9tUGFyZW50cyk7XHJcbiAgICAgICAgaWYgKGZpbHRlcnMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jb21iaW5lRGF0YVNvdXJjZShbXSwgcGFnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRGaXJlRXZlbnQoZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHsgZGF0YVNvdXJjZSwgcmF3RGF0YVNvdXJjZSwgdG90YWxQYWdlIH0gPSBhd2FpdCB0aGlzLl9nZXREYXRhU291cmNlQnlTZXJ2aWNlKGZpbHRlcnMsIHBhZ2UpO1xyXG4gICAgICAgIHRoaXMudG90YWxQYWdlID0gdG90YWxQYWdlO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY29tYmluZURhdGFTb3VyY2UoZGF0YVNvdXJjZSwgcGFnZSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2wuaXNTZXJ2ZXJMb2FkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRGaXJlRXZlbnQodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE7hur91IGRyb3Bkb3duIGsgbuG6sW0gdHJvbmcgY3J1ZCBmb3JtIHRow6wgY+G6pXUgaMOsbmggZmlyZUNhbGxCYWNrSW5zaWRlID0gdHJ1ZSAobeG6t2MgxJHhu4tuaCkgxJHhu4MgZmlyZSB0cuG7sWMgdGnhur9wIHThu6sgdHJvbmcgY29tcG9uZW50XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5maXJlQ2FsbEJhY2tJbnNpZGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5jYWxsYmFja0RhdGFGaW5pc2gpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5jYWxsYmFja0RhdGFGaW5pc2goPGFueT57XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3RGF0YVNvdXJjZSxcclxuICAgICAgICAgICAgICAgICAgICBlbG06IHRoaXNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm9uRGF0YVNvdXJjZUxvYWRlZC5lbWl0KHtcclxuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UsXHJcbiAgICAgICAgICAgICAgICByYXdEYXRhU291cmNlLFxyXG4gICAgICAgICAgICAgICAgZWxtOiB0aGlzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9nZXREYXRhU291cmNlQnlTZXJ2aWNlKGZpbHRlcnM6IEZpbHRlcltdLCBwYWdlOiBudW1iZXIgPSAxLCBwYWdlU2l6ZTogbnVtYmVyID0gbnVsbCkge1xyXG4gICAgICAgIGxldCBkYXRhU291cmNlID0gbnVsbDtcclxuICAgICAgICBsZXQgdG90YWxQYWdlID0gMTtcclxuICAgICAgICBjb25zdCBkcm9wZG93bk9wdGlvbnMgPSB0aGlzLl9jcnVkU2VydmljZS5jcmVhdGVEcm9wZG93bk9wdGlvbnModGhpcy5jb250cm9sKTtcclxuICAgICAgICBkcm9wZG93bk9wdGlvbnMucGFnZSA9IHBhZ2U7XHJcbiAgICAgICAgaWYgKHBhZ2VTaXplKSB7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duT3B0aW9ucy5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLmJhc2VTZXJ2aWNlIGluc3RhbmNlb2YgTWFzdGVyRGF0YVNlcnZpY2UpIHtcclxuICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGF3YWl0IHRoaXMuY29udHJvbC5iYXNlU2VydmljZS5nZXREYXRhRHJvcGRvd25CeUZpbHRlcihcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5ncm91cENvZGUsIG51bGwsIGZpbHRlcnMsIGRyb3Bkb3duT3B0aW9uc1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5pc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb250cm9sLmJhc2VTZXJ2aWNlLmdldFRyZWVEYXRhRHJvcGRvd25CeUZpbHRlclJhdyhcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzLCB0aGlzLmNvbnRyb2wuZmllbGRUcmVlLCB0aGlzLmNvbnRyb2wudmFsdWVQYXJlbnRSb290XHJcbiAgICAgICAgICAgICAgICAgICAgLCBkcm9wZG93bk9wdGlvbnNcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29udHJvbC5iYXNlU2VydmljZS5nZXREYXRhRHJvcGRvd25CeUZpbHRlclJhdyhcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzLCBkcm9wZG93bk9wdGlvbnNcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGF0YVNvdXJjZSA9IHJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgIHRvdGFsUGFnZSA9IE1hdGguY2VpbChyZXNwb25zZS50b3RhbFJlY29yZCAvIGRyb3Bkb3duT3B0aW9ucy5wYWdlU2l6ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuX2NydWRTZXJ2aWNlLmdldFJlZkRhdGFJbkRhdGFzb3VyY2UoZGF0YVNvdXJjZSwgZHJvcGRvd25PcHRpb25zLnJlZkZpZWxkcyk7XHJcbiAgICAgICAgaWYgKCFkYXRhU291cmNlKSBkYXRhU291cmNlID0gW107XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGFTb3VyY2UpIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5yZVN0cnVjdHVyZUl0ZW1PYmplY3QoaXRlbSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBkYXRhU291cmNlOiByZXN1bHQsIHJhd0RhdGFTb3VyY2U6IGRhdGFTb3VyY2UsIHRvdGFsUGFnZSB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgZmlsdGVyUHJvY2VzcyhmaWx0ZXJGcm9tUGFyZW50czogRmlsdGVyW10pIHtcclxuICAgICAgICBsZXQgZmlsdGVycyA9IFsuLi5maWx0ZXJGcm9tUGFyZW50c107XHJcbiAgICAgICAgYXdhaXQgYXBwZW5kRGVmYXVsdEZpbHRlcihmaWx0ZXJzLCB0aGlzLmNvbnRyb2wuZGVmYXVsdEZpbHRlcnMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLmlzU2VydmVyTG9hZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZVNlYXJjaFNlcnZlcikge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuZ2V0RmlsdGVyT25TZXJ2ZXJTZWFyY2godGhpcy52YWx1ZVNlYXJjaFNlcnZlcikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLm1vZGlmeUZpbHRlcikge1xyXG4gICAgICAgICAgICBjb25zdCBhbGxvdyA9IGF3YWl0IHRoaXMuY29udHJvbC5tb2RpZnlGaWx0ZXIoZmlsdGVycywgdGhpcyk7XHJcbiAgICAgICAgICAgIGlmIChhbGxvdyA9PT0gZmFsc2UpIGZpbHRlcnMgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZpbHRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UGFuZWxDbGFzcygpIHtcclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLmFwcGVuZFRvID09ICdib2R5Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5jb250cm9sLnBhbmVsQ2xhc3N9IHAtZml4ZWRgO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sLnBhbmVsQ2xhc3M7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VmFsdWVSZXR1cm4oKSB7XHJcbiAgICAgICAgdGhpcy5fcmV0dXJuVmFsdWUgPSB0aGlzLmZ1bmNSZXR1cm5WYWx1ZSh0aGlzLl92YWx1ZSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2wubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5nZW5lcmF0ZVRvb2x0aXApIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl92YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcCA9IHRoaXMuY29udHJvbC5nZW5lcmF0ZVRvb2x0aXAodGhpcy5fdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLnRvb2x0aXAgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50b29sdGlwID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSW5pdGVkQ29udHJvbCgpIHtcclxuICAgICAgICAvLyBO4bq/dSBjaMawYSBjaOG6oXkgcXVhIGluaXQgdGjDrCBrIGZpcmUgZXZlbnQgZ8OsIGPhuqNcclxuICAgICAgICByZXR1cm4gISF0aGlzLmNvbnRyb2wuX2NvbXBvbmVudDtcclxuICAgIH1cclxuXHJcbiAgICBhZGp1c3RWYWx1ZTJXYXlCaW5kaW5nKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0luaXRlZENvbnRyb2woKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHZhbHVlUmV0dXJuID0gdGhpcy5nZXRWYWx1ZVJldHVybigpO1xyXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZVJldHVybik7XHJcbiAgICB9XHJcblxyXG4gICAgZmlyZUNoYW5nZWRFdmVudCgpIHtcclxuICAgICAgICAvLyBO4bq/dSBjaMawYSBjaOG6oXkgcXVhIGluaXQgdGjDrCBrIGZpcmUgZXZlbnQgZ8OsIGPhuqNcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tJbml0ZWRDb250cm9sKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB2YWx1ZVJldHVybiA9IHRoaXMuZ2V0VmFsdWVSZXR1cm4oKTtcclxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWVSZXR1cm4pO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2VkLm5leHQodmFsdWVSZXR1cm4pO1xyXG4gICAgfVxyXG5cclxuICAgIGZpcmVBZGp1c3RWYWx1ZUV2ZW50KCkge1xyXG4gICAgICAgIC8vIE7hur91IGNoxrBhIGNo4bqheSBxdWEgaW5pdCB0aMOsIGsgZmlyZSBldmVudCBnw6wgY+G6o1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0luaXRlZENvbnRyb2woKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHZhbHVlUmV0dXJuID0gdGhpcy5nZXRWYWx1ZVJldHVybigpO1xyXG4gICAgICAgIHRoaXMuYWRqdXN0VmFsdWUubmV4dCh2YWx1ZVJldHVybik7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2VTZWxlY3RlZChldmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC5pdGVtVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRyxrDhu51uZyBo4bujcCBzZWxlY3QgYWxsXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLmRhdGFTb3VyY2VJbnRlcm5hbC5tYXAocSA9PiBxLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIFRyxrDhu51uZyBo4bujcCB1bnNlbGVjdCBhbGxcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jb250cm9sLnNlbGVjdERlc2NlbmRhbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudElkcyA9IFtldmVudC5pdGVtVmFsdWVbdGhpcy5jb250cm9sLnZhbHVlRmllbGRdXTtcclxuICAgICAgICAgICAgICAgIC8vIE7hur91IGl0ZW0gxJHGsOG7o2MgY2jhu41uID0+IENo4buNbiBj4bqjIG5o4buvbmcgYuG6o24gZ2hpIGNvbiwgY2jDoXVcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl92YWx1ZS5pbmRleE9mKGV2ZW50Lml0ZW1WYWx1ZSkgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZUludGVybmFsLmZvckVhY2goc291cmNlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SWQgPSBzb3VyY2UudmFsdWVbdGhpcy5jb250cm9sLmZpZWxkVHJlZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJZHMuaW5kZXhPZihwYXJlbnRJZCkgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlLmluZGV4T2Yoc291cmNlLnZhbHVlKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlLnB1c2goc291cmNlLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudElkcy5wdXNoKHBhcmVudElkLCBzb3VyY2UudmFsdWVbdGhpcy5jb250cm9sLnZhbHVlRmllbGRdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIGl0ZW0gxJFhbmcgYuG7iyBi4buPIGNo4buNbiA9PiBo4buneSBjaOG7jW4gY+G6oyBuaOG7r25nIGLhuqNuIGdoaSBjb25cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2VJbnRlcm5hbC5mb3JFYWNoKHNvdXJjZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gc291cmNlLnZhbHVlW3RoaXMuY29udHJvbC5maWVsZFRyZWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SWRzLmluZGV4T2YocGFyZW50SWQpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fdmFsdWUuaW5kZXhPZihzb3VyY2UudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SWRzLnB1c2gocGFyZW50SWQsIHNvdXJjZS52YWx1ZVt0aGlzLmNvbnRyb2wudmFsdWVGaWVsZF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jb250cm9sLnNlbGVjdENoaWxkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgLy8gTuG6v3UgaXRlbSDEkcaw4bujYyBjaOG7jW4gPT4gQ2jhu41uIGPhuqMgbmjhu69uZyBi4bqjbiBnaGkgY29uXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdmFsdWUuaW5kZXhPZihldmVudC5pdGVtVmFsdWUpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2VJbnRlcm5hbC5mb3JFYWNoKHNvdXJjZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gc291cmNlLnZhbHVlW3RoaXMuY29udHJvbC5maWVsZFRyZWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gZXZlbnQuaXRlbVZhbHVlW3RoaXMuY29udHJvbC52YWx1ZUZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlLmluZGV4T2Yoc291cmNlLnZhbHVlKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlLnB1c2goc291cmNlLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIGl0ZW0gxJFhbmcgYuG7iyBi4buPIGNo4buNbiA9PiBo4buneSBjaOG7jW4gY+G6oyBuaOG7r25nIGLhuqNuIGdoaSBjb25cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2VJbnRlcm5hbC5mb3JFYWNoKHNvdXJjZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gc291cmNlLnZhbHVlW3RoaXMuY29udHJvbC5maWVsZFRyZWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gZXZlbnQuaXRlbVZhbHVlW3RoaXMuY29udHJvbC52YWx1ZUZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl92YWx1ZS5pbmRleE9mKHNvdXJjZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZpcmVDaGFuZ2VkRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVJdGVtKGV2dCwgc2VsZWN0ZWRJdGVtKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fdmFsdWUuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPSBzZWxlY3RlZEl0ZW0pO1xyXG4gICAgICAgIHRoaXMuZmlyZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlQmVmb3JlID0gdGhpcy5fdmFsdWU7XHJcbiAgICAgICAgdGhpcy5vbkhpZGVTbWFydEV2ZW50LmVtaXQoZXZ0KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRyb3Bkb3duQ2xpY2tIYW5kbGVyKGV2dCkge1xyXG4gICAgICAgIHRoaXMub25Ecm9wZG93bkNsaWNrLm5leHQoZXZ0KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCRldmVudCkge1xyXG4gICAgICAgIGlmICgkZXZlbnQudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2knICYmICRldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCd1aS1kcm9wZG93bi1jbGVhci1pY29uJykpIHtcclxuICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAkZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25TaG93SGFuZGxlcihldnQpIHtcclxuICAgICAgICB0aGlzLm9uU2hvdy5lbWl0KHtcclxuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxyXG4gICAgICAgICAgICBldmVudDogZXZ0XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5wYW5lbENsYXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24ub3ZlcmxheS5zdHlsZS53aWR0aCA9IHRoaXMuZHJvcGRvd24ub3ZlcmxheS5zdHlsZS5taW5XaWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2wuaXNTZXJ2ZXJMb2FkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC52aXJ0dWFsU2Nyb2xsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyID0gdGhpcy5kcm9wZG93bi5vdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyID0gdGhpcy5kcm9wZG93bi5vdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5wLWRyb3Bkb3duLWl0ZW1zLXdyYXBwZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVTY3JvbGwpO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRJbnB1dCA9IHRoaXMuZHJvcGRvd24uZmlsdGVyVmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5faW5zZXJ0VGV4dGJveEFuZEZvY3VzKGRlZmF1bHRJbnB1dCk7XHJcbiAgICAgICAgdGhpcy5vblNob3dTbWFydEV2ZW50LmVtaXQoZXZ0KTtcclxuICAgIH1cclxuXHJcbiAgICBvblBhbmVsU2hvd0hhbmRsZXIoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5vblNob3cuZW1pdCh7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcclxuICAgICAgICAgICAgZXZlbnQ6IGV2dFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wucGFuZWxDbGFzcykge1xyXG4gICAgICAgICAgICB0aGlzLm11bHRpU2VsZWN0Lm92ZXJsYXkuc3R5bGUud2lkdGggPSB0aGlzLm11bHRpU2VsZWN0Lm92ZXJsYXkuc3R5bGUubWluV2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZUJlZm9yZSA9IHRoaXMuX3ZhbHVlO1xyXG4gICAgICAgIGlmICghdGhpcy5jb250cm9sLmlzU2VydmVyTG9hZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wudmlydHVhbFNjcm9sbCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IHRoaXMubXVsdGlTZWxlY3Qub3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcuY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IHRoaXMubXVsdGlTZWxlY3Qub3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcucC1tdWx0aXNlbGVjdC1pdGVtcy13cmFwcGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlU2Nyb2xsKTtcclxuICAgICAgICBjb25zdCBkZWZhdWx0SW5wdXQgPSB0aGlzLm11bHRpU2VsZWN0LmZpbHRlcklucHV0Q2hpbGQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICB0aGlzLl9pbnNlcnRUZXh0Ym94QW5kRm9jdXMoZGVmYXVsdElucHV0KTtcclxuICAgICAgICB0aGlzLm9uU2hvd1NtYXJ0RXZlbnQuZW1pdChldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNjcm9sbCA9IChldnQpID0+IHtcclxuICAgICAgICBpZiAoZXZ0LnNyY0VsZW1lbnQuc2Nyb2xsVG9wID4gMFxyXG4gICAgICAgICAgICAmJiAhdGhpcy5maXJzdFNjcm9sbFxyXG4gICAgICAgICAgICAmJiBldnQuc3JjRWxlbWVudC5vZmZzZXRIZWlnaHQgKyBldnQuc3JjRWxlbWVudC5zY3JvbGxUb3AgPT0gZXZ0LnNyY0VsZW1lbnQuc2Nyb2xsSGVpZ2h0XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyc3RTY3JvbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy50aW1lb3V0U2Nyb2xsKSBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0U2Nyb2xsKTtcclxuICAgICAgICAgICAgdGhpcy50aW1lb3V0U2Nyb2xsID0gc2V0VGltZW91dChmID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YU5leHRQYWdlKCk7XHJcbiAgICAgICAgICAgIH0sIDE1MCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZpcnN0U2Nyb2xsID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIGdldERhdGFOZXh0UGFnZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5sb2FkaW5nIHx8IHRoaXMucGFnZSA+PSB0aGlzLnRvdGFsUGFnZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucGFnZSsrO1xyXG4gICAgICAgIHRoaXMuX2dldERhdGEodGhpcy5wYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pbnNlcnRUZXh0Ym94QW5kRm9jdXMoZGVmYXVsdElucHV0KSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKTtcclxuICAgICAgICB0aGlzLmJ1dHRvblNldHRpbmcubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XHJcbiAgICAgICAgLy8gZGVmYXVsdElucHV0LmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICBkZWZhdWx0SW5wdXQucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LCBkZWZhdWx0SW5wdXQpO1xyXG4gICAgICAgIGRlZmF1bHRJbnB1dC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLmJ1dHRvblNldHRpbmcubmF0aXZlRWxlbWVudCwgZGVmYXVsdElucHV0KTtcclxuICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVMb2FkZWQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5wdXQpIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uSGlkZUhhbmRsZXIoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5vbkhpZGUuZW1pdCh7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcclxuICAgICAgICAgICAgZXZlbnQ6IGV2dFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWVCZWZvcmUgIT0gdGhpcy5fdmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZUJlZm9yZSA9PSBudWxsICYmIHRoaXMuX3ZhbHVlICYmIHRoaXMuX3ZhbHVlLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlQmVmb3JlID0gdGhpcy5fdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YUVtaXQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBldnRcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uSGlkZVNtYXJ0RXZlbnQuZW1pdChkYXRhRW1pdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlQmVmb3JlID0gdGhpcy5fdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVTY3JvbGwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVGb2N1cyhldnQpIHtcclxuICAgICAgICB0aGlzLm9uRm9jdXMuZW1pdChldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUJsdXIoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5vbkJsdXIuZW1pdChldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dGb3JtUXVpY2tBZGQoKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybU1vZGVsID0gbmV3IENydWRGb3JtRGF0YSgpO1xyXG4gICAgICAgIGxldCBpbml0RGF0YSA9IHRoaXMuY29udHJvbC5pbml0RGF0YTtcclxuICAgICAgICBpZiAodHlwZW9mIGluaXREYXRhICE9ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIGluaXREYXRhID0gKDxGdW5jdGlvbj4odGhpcy5jb250cm9sLmluaXREYXRhKSkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9ybU1vZGVsLmRhdGEgPSB7IC4uLmluaXREYXRhIH07XHJcbiAgICAgICAgZm9ybU1vZGVsLmZvcm1TdGF0ZSA9IEZvcm1TdGF0ZS5BREQ7XHJcbiAgICAgICAgdGhpcy5xdWlja0FkZERpYWxvZ01vZGVsLmRhdGEuZm9ybU1vZGVsID0gZm9ybU1vZGVsO1xyXG4gICAgICAgIHRoaXMucXVpY2tBZGREaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEsgc+G7rWEgdGjDoG5oIGZ1bmN0aW9uLCBwaOG6o2kgxJHhu4MgYXJyb3cgZnVuY3Rpb25cclxuICAgIGhhbmRsZUNhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnF1aWNrQWRkRGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2U7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEsgc+G7rWEgdGjDoG5oIGZ1bmN0aW9uLCBwaOG6o2kgxJHhu4MgYXJyb3cgZnVuY3Rpb25cclxuICAgIGhhbmRsZVNhdmVkID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucXVpY2tBZGREaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9nZXREYXRhKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHNob3dGb3JtU2V0dGluZygpIHtcclxuICAgICAgICBjb25zdCBmb3JtTW9kZWwgPSBuZXcgQ3J1ZEZvcm1EYXRhKCk7XHJcbiAgICAgICAgZm9ybU1vZGVsLmRhdGEgPSB7fTtcclxuICAgICAgICBmb3JtTW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLkFERDtcclxuICAgICAgICB0aGlzLnNldHRpbmdEaWFsb2dNb2RlbC5kYXRhLmZvcm1Nb2RlbCA9IGZvcm1Nb2RlbDtcclxuICAgICAgICB0aGlzLnNldHRpbmdEaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNhdmVkU2V0dGluZygpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmdEaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNyZWF0ZVNlYXJjaFN1YnNjcmlwdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVNlYXJjaFN1YnNjcmlwdGlvbigpIHtcclxuICAgICAgICBjb25zdCBkZWxheVNlYXJjaFRpbWUgPSB0aGlzLmdldERlbGF5U2VhcmNoVGltZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMua2V5VXAucGlwZShcclxuICAgICAgICAgICAgbWFwKGV2ZW50ID0+IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpLFxyXG4gICAgICAgICAgICBkZWJvdW5jZVRpbWUoZGVsYXlTZWFyY2hUaW1lKSxcclxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX3VuU3Vic2NyaWJlQWxsKVxyXG4gICAgICAgICkuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZ2V0RGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgI2VsIGNsYXNzPVwidG4tZHJvcGRvd25cIiBbcFRvb2x0aXBdPVwidG9vbHRpcFwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIHRvb2x0aXBTdHlsZUNsYXNzPVwid3JhcFwiXHJcbiAgICBbY2xhc3Muc2VydmVyLWxvYWRdPVwiY29udHJvbC5pc1NlcnZlckxvYWRcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwic2VydmVyLWxvYWQtaW5mb1wiIHBUb29sdGlwPVwiROG7ryBsaeG7h3Ugc+G6vSDEkcaw4bujYyBsw6BtIG3hu5tpIGdoaSB0w6xtIGtp4bq/bVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPjwvc3Bhbj5cclxuICAgIDxwLWRyb3Bkb3duICpuZ0lmPVwiIWNvbnRyb2wubXVsdGlwbGVcIiBbb3B0aW9uc109XCJkYXRhU291cmNlSW50ZXJuYWxcIiBbcGxhY2Vob2xkZXJdPVwiY29udHJvbC5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgW2ZpbHRlcl09XCJjb250cm9sLmZpbHRlclwiIFtwYW5lbFN0eWxlQ2xhc3NdPVwiZ2V0UGFuZWxDbGFzcygpXCIgW2FwcGVuZFRvXT1cImNvbnRyb2wuYXBwZW5kVG9cIlxyXG4gICAgICAgIFtzdHlsZUNsYXNzXT1cIid0bi1kcm9wZG93bidcIiBbZW1wdHlGaWx0ZXJNZXNzYWdlXT1cIidLaMO0bmcgdMOsbSB0aOG6pXkga+G6v3QgcXXhuqMnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbC5kaXNhYmxlZCA/IHRydWUgOiBudWxsXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiIFtzaG93Q2xlYXJdPVwiY29udHJvbC5zaG93Q2xlYXJcIlxyXG4gICAgICAgIFtzaG93VHJhbnNpdGlvbk9wdGlvbnNdPVwic2hvd1RyYW5zaXRpb25PcHRpb25zXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiY29udHJvbC5hdXRvRGlzcGxheUZpcnN0XCJcclxuICAgICAgICBbdmlydHVhbFNjcm9sbF09XCJjb250cm9sLnZpcnR1YWxTY3JvbGxcIiBpdGVtU2l6ZT1cIjMwXCIgW21heEl0ZW1EaXNwbGF5XT1cImNvbnRyb2wubWF4SXRlbURpc3BsYXlcIlxyXG4gICAgICAgIFthdXRvZm9jdXNTZWxlY3RlZEl0ZW1dPVwiYXV0b2ZvY3VzU2VsZWN0ZWRJdGVtXCIgW2hpZGVUcmFuc2l0aW9uT3B0aW9uc109XCJoaWRlVHJhbnNpdGlvbk9wdGlvbnNcIlxyXG4gICAgICAgIFttb2RpZnlPcHRpb25zV2hlbkZpbHRlcl09XCJtb2RpZnlPcHRpb25XaGVuRmlsdGVyXCIgW2RlbGF5RmlsdGVyXT1cImRlbGF5RmlsdGVyXCIgWyhuZ01vZGVsKV09XCJfdmFsdWVcIlxyXG4gICAgICAgIChvbkZvY3VzKT1cImhhbmRsZUZvY3VzKCRldmVudClcIiAob25CbHVyKT1cImhhbmRsZUJsdXIoJGV2ZW50KVwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICAgIChvbkNsaWNrKT1cIm9uRHJvcGRvd25DbGlja0hhbmRsZXIoJGV2ZW50KVwiIChvblNob3cpPVwib25TaG93SGFuZGxlcigkZXZlbnQpXCIgKG9uSGlkZSk9XCJvbkhpZGVIYW5kbGVyKCRldmVudClcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJjb250cm9sLnRlbXBsYXRlU2VsZWN0ZWRJdGVtXCIgbGV0LWl0ZW0gcFRlbXBsYXRlPVwic2VsZWN0ZWRJdGVtXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udHJvbC50ZW1wbGF0ZVNlbGVjdGVkSXRlbTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbSwgc2VsZWN0ZWRWYWx1ZTogX3ZhbHVlfVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNvbnRyb2wudGVtcGxhdGVJdGVtXCIgbGV0LWl0ZW0gcFRlbXBsYXRlPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udHJvbC50ZW1wbGF0ZUl0ZW07IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvcC1kcm9wZG93bj5cclxuICAgIDxwLW11bHRpU2VsZWN0ICpuZ0lmPVwiY29udHJvbC5tdWx0aXBsZVwiIFtvcHRpb25zXT1cImRhdGFTb3VyY2VJbnRlcm5hbFwiIFtmaWx0ZXJdPVwiY29udHJvbC5maWx0ZXJcIlxyXG4gICAgICAgIFtkZWZhdWx0TGFiZWxdPVwiY29udHJvbC5wbGFjZWhvbGRlclwiIFtwbGFjZWhvbGRlcl09XCJjb250cm9sLnBsYWNlaG9sZGVyXCIgW3BhbmVsU3R5bGVDbGFzc109XCJnZXRQYW5lbENsYXNzKClcIlxyXG4gICAgICAgIFthcHBlbmRUb109XCJjb250cm9sLmFwcGVuZFRvXCIgW3N0eWxlQ2xhc3NdPVwiJ3RuLWRyb3Bkb3duJ1wiXHJcbiAgICAgICAgW2VtcHR5RmlsdGVyTWVzc2FnZV09XCInS2jDtG5nIHTDrG0gdGjhuqV5IGvhur90IHF14bqjJyB8IHRyYW5zbGF0ZVwiIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkID8gdHJ1ZSA6IG51bGxcIlxyXG4gICAgICAgIFthdXRvWkluZGV4XT1cInRydWVcIiBbc2hvd1RyYW5zaXRpb25PcHRpb25zXT1cInNob3dUcmFuc2l0aW9uT3B0aW9uc1wiXHJcbiAgICAgICAgW2hpZGVUcmFuc2l0aW9uT3B0aW9uc109XCJoaWRlVHJhbnNpdGlvbk9wdGlvbnNcIiBbdmlydHVhbFNjcm9sbF09XCJjb250cm9sLnZpcnR1YWxTY3JvbGxcIlxyXG4gICAgICAgIFttYXhJdGVtRGlzcGxheV09XCJjb250cm9sLm1heEl0ZW1EaXNwbGF5XCIgW3NlbGVjdGVkSXRlbXNMYWJlbF09XCJjb250cm9sLnNlbGVjdGVkSXRlbXNMYWJlbFwiXHJcbiAgICAgICAgW21heFNlbGVjdGVkTGFiZWxzXT1cImNvbnRyb2wubWF4U2VsZWN0ZWRMYWJlbHNcIiBbbW9kaWZ5T3B0aW9uc1doZW5GaWx0ZXJdPVwibW9kaWZ5T3B0aW9uV2hlbkZpbHRlck11bHRpcGxlXCJcclxuICAgICAgICBbZGVsYXlGaWx0ZXJdPVwiZGVsYXlGaWx0ZXJcIiBbKG5nTW9kZWwpXT1cIl92YWx1ZVwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICAgIChvbkNsaWNrKT1cIm9uRHJvcGRvd25DbGlja0hhbmRsZXIoJGV2ZW50KVwiIChvblBhbmVsU2hvdyk9XCJvblBhbmVsU2hvd0hhbmRsZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgKG9uUGFuZWxIaWRlKT1cIm9uSGlkZUhhbmRsZXIoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJzZWxlY3RlZEl0ZW1zXCIgbGV0LXZhbHVlPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA9PSAwXCI+e3tjb250cm9sLnBsYWNlaG9sZGVyfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBzZWxlY3RlZEl0ZW0gb2YgdmFsdWVcIiBbY2xhc3NdPVwiX2l0ZW1TZWxlY3RlZFN0eWxlQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e3NlbGVjdGVkSXRlbVtjb250cm9sLmRpc3BsYXlGaWVsZF19fTxzcGFuIGNsYXNzPVwicmVtb3ZlLWl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlSXRlbSgkZXZlbnQsIHNlbGVjdGVkSXRlbSlcIj48aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICA8aW5wdXQgI2lucHV0TWFzayBjbGFzcz1cImlucHV0LW1hc2sgaGlkZSBwLWlucHV0dGV4dFwiIHR5cGU9XCJ0ZXh0XCIgW2Rpc2FibGVkXT1cImxvYWRpbmdcIlxyXG4gICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVTZWFyY2hTZXJ2ZXJcIiAoa2V5dXApPVwia2V5VXAubmV4dCgkZXZlbnQpXCIgLz5cclxuICAgIDxzcGFuICNidXR0b25TZXR0aW5nIGNsYXNzPVwiYnV0dG9uLXNldHRpbmcgaGlkZSBwaSBwaS1jb2dcIiAoY2xpY2spPVwic2hvd0Zvcm1TZXR0aW5nKClcIj48L3NwYW4+XHJcbiAgICA8YWZ0ZXItdmlldy1jaGVja2VkICpuZ0lmPVwiIWxvYWRpbmdcIiAobG9hZGVkKT1cImhhbmRsZUxvYWRlZCgpXCI+PC9hZnRlci12aWV3LWNoZWNrZWQ+XHJcbiAgICA8YnV0dG9uICpuZ0lmPVwiY29udHJvbC5xdWlja0FkZCAmJiAoY29udHJvbC5jb2xzIHx8IGNvbnRyb2wucXVpY2tBZGRUZW1wbGF0ZSlcIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvblxyXG4gICAgICAgIGljb249XCJwaSBwaS1wbHVzXCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXJvdW5kZWQgYnV0dG9uLXF1aWNrLWFkZFwiIHBUb29sdGlwPVwiVGjDqm0gbmhhbmhcIlxyXG4gICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIChjbGljayk9XCJzaG93Rm9ybVF1aWNrQWRkKClcIj48L2J1dHRvbj5cclxuPC9kaXY+XHJcbjx0bi1kaWFsb2cgKm5nSWY9XCJxdWlja0FkZERpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybVwiICNkaWFsb2cgW2hlYWRlcl09XCJxdWlja0FkZERpYWxvZ01vZGVsLmhlYWRlciB8IHRyYW5zbGF0ZVwiXHJcbiAgICBbcG9wdXBTaXplXT1cImNvbnRyb2wucG9wdXBTaXplXCIgKG9uSGlkZSk9XCJxdWlja0FkZERpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbC5jb2xzXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tVGVtcGxhdGVbJ2Ryb3Bkb3duUXVpY2tBZGRGb3JtJ11cIlxyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XHJcbiAgICAgICAgJGltcGxpY2l0OiBxdWlja0FkZERpYWxvZ01vZGVsLCBwYXJlbnRNb2RlbDogbW9kZWwsIHBhcmVudENvbnRleHQ6IGNvbnRleHQsIGNvbnRyb2w6IGNvbnRyb2wsIFxyXG4gICAgICAgIG9uU2F2ZWQ6IGhhbmRsZVNhdmVkLCBvbkNhbmNlbDogaGFuZGxlQ2FuY2VsXHJcbiAgICB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctdGVtcGxhdGUgI2Zvb3Rlcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicXVpY2tBZGREaWFsb2dNb2RlbC5idXR0b25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwhLS0gPHF1aWNrLWFkZC1mb3JtICNmb3JtQmFzZSBbcGFyZW50TW9kZWxdPVwibW9kZWxcIiBbcGFyZW50Q29udGV4dF09XCJjb250ZXh0XCIgW21vZGVsXT1cImZvcm1Nb2RlbFwiIFtjb250cm9sXT1cImNvbnRyb2xcIlxyXG4gICAgICAgIFtiYXNlU2VydmljZV09XCJjb250cm9sLmJhc2VTZXJ2aWNlXCIgKG9uU2F2ZWQpPVwiaGFuZGxlU2F2ZWQoKVwiIChvbkNhbmNlbCk9XCJoYW5kbGVDYW5jZWwoKVwiPlxyXG4gICAgPC9xdWljay1hZGQtZm9ybT4gLS0+XHJcbjwvdG4tZGlhbG9nPlxyXG48dG4tZGlhbG9nICpuZ0lmPVwic2V0dGluZ0RpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybVwiICNkaWFsb2cgW2hlYWRlcl09XCJzZXR0aW5nRGlhbG9nTW9kZWwuaGVhZGVyIHwgdHJhbnNsYXRlXCJcclxuICAgIFtwb3B1cFNpemVdPVwiY29udHJvbC5wb3B1cFNpemVcIiAob25IaWRlKT1cInNldHRpbmdEaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21UZW1wbGF0ZVsnZHJvcGRvd25RdWlja0FkZEZvcm0nXVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XHJcbiAgICAgICAgJGltcGxpY2l0OiBzZXR0aW5nRGlhbG9nTW9kZWwsIG9uU2F2ZWQ6IGhhbmRsZVNhdmVkU2V0dGluZ1xyXG4gICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLXRlbXBsYXRlICNmb290ZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNldHRpbmdEaWFsb2dNb2RlbC5idXR0b25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwhLS0gPGRyb3Bkb3duLXNldHRpbmctZm9ybSAjZm9ybUJhc2UgW21vZGVsXT1cInNldHRpbmdEaWFsb2dNb2RlbC5kYXRhLmZvcm1Nb2RlbFwiIChvblNhdmVkKT1cImhhbmRsZVNhdmVkU2V0dGluZygpXCJcclxuICAgICAgICAob25DYW5jZWwpPVwic2V0dGluZ0RpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8L2Ryb3Bkb3duLXNldHRpbmctZm9ybT4gLS0+XHJcbjwvdG4tZGlhbG9nPlxyXG48bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udHJvbC5xdWlja0FkZFRlbXBsYXRlOyBjb250ZXh0OiB7XHJcbiAgICBoYW5kbGVTYXZlZDogaGFuZGxlU2F2ZWQsXHJcbiAgICBoYW5kbGVDYW5jZWw6IGhhbmRsZUNhbmNlbCxcclxuICAgIGRpYWxvZ01vZGVsOiBxdWlja0FkZERpYWxvZ01vZGVsXHJcbn1cIj48L25nLWNvbnRhaW5lcj4iXX0=
|
|
982
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFZLEtBQUssRUFBcUIsTUFBTSxFQUFlLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4SSxPQUFPLEVBQUUsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFB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LEtBQUs7Z0JBU0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlIH0gZnJvbSAnbmd4LWRldmljZS1kZXRlY3Rvcic7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU2VsZWN0SXRlbSB9IGZyb20gJ3RuLWN1c3RvbS1wcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IERyb3Bkb3duIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvZHJvcGRvd24nO1xyXG5pbXBvcnQgeyBNdWx0aVNlbGVjdCB9IGZyb20gJ3RuLWN1c3RvbS1wcmltZW5nL211bHRpc2VsZWN0JztcclxuXHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwLWNvbnRleHQvY29tcG9uZW50LWNvbnRleHQuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2Jhc2UvY29tcG9uZW50LWJhc2UnO1xyXG5pbXBvcnQgeyBGb3JtU3RhdGUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IENydWRGb3JtRGF0YSwgRGlhbG9nTW9kZWwsIERyb3Bkb3duQ29udHJvbFNjaGVtYSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybS1zY2hlbWEnO1xyXG5pbXBvcnQgeyBLZXlTdG9yYWdlRHJvcGRvd25TZXR0aW5nLCBPcGVyYXRvciB9IGZyb20gJy4uLy4uL2VudW1zL2NvbW1vbic7XHJcbmltcG9ydCB7IEZpbHRlciB9IGZyb20gJy4uLy4uL21vZGVscy9ncmlkLWluZm8nO1xyXG5pbXBvcnQgeyBDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29tcG9uZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDcnVkU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NydWQuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hc3RlckRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWFzdGVyLWRhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IGFwcGVuZERlZmF1bHRGaWx0ZXIgfSBmcm9tICcuLi8uLi91dGlscy9jb21tb24nO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdkcm9wZG93bicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZHJvcGRvd24uY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW0NvbXBvbmVudENvbnRleHRTZXJ2aWNlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25Db21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQFZpZXdDaGlsZCgnZWwnKSBlbDogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ2lucHV0TWFzaycpIGlucHV0OiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgnYnV0dG9uU2V0dGluZycpIGJ1dHRvblNldHRpbmc6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKERyb3Bkb3duKSBkcm9wZG93bjogRHJvcGRvd247XHJcbiAgICBAVmlld0NoaWxkKE11bHRpU2VsZWN0KSBtdWx0aVNlbGVjdDogTXVsdGlTZWxlY3Q7XHJcblxyXG4gICAgQElucHV0KCkgc2V0IHNob3dDbGVhcih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICghdGhpcy5jb250cm9sLnNob3dDbGVhcikge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wuc2hvd0NsZWFyID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpIGRpc2FibGVEaXNwbGF5RmllbGRTZXJ2ZXJTZWFyY2ggPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKSBzZXQgZmlsdGVyKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2wuZmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5maWx0ZXIgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCkgY29udHJvbDogRHJvcGRvd25Db250cm9sU2NoZW1hID0gbmV3IERyb3Bkb3duQ29udHJvbFNjaGVtYSgpO1xyXG4gICAgQElucHV0KCkgZGVmYXVsdExhYmVsID0gJyc7XHJcbiAgICBASW5wdXQoKSBhcHBlbmRUbzogYW55ID0gJ2JvZHknO1xyXG5cclxuICAgIEBJbnB1dCgpIHNldCBkYXRhU291cmNlKHZhbHVlOiBhbnlbXSkge1xyXG4gICAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBbXTtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhU291cmNlLnB1c2godGhpcy5yZVN0cnVjdHVyZUl0ZW1PYmplY3QoaXRlbSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29tYmluZURhdGFTb3VyY2UoZGF0YVNvdXJjZSwgMSk7XHJcbiAgICAgICAgdGhpcy5jaGVja0FuZEZpcmVFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JldHVyblZhbHVlICE9IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wubXVsdGlwbGUgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgLy8gZmlyZSBldmVudCDEkWnhu4F1IGNo4buJbmggdmFsdWUgdOG7qyBbdmFsdWU6IGd1aWRdID0+IHtbZmllbGRWYWx1ZV06IFt2YWx1ZTogZ3VpZF0sIC4uLlsxIHPhu5EgdHLGsOG7nW5nIGtow6FjIG7hu69hIHRyb25nIGRhdGFzb3VyY2VdfVxyXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkVmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGVmYXVsdFNlbGVjdGVkU3R5bGVDbGFzcyA9ICdjdXN0b20tc2VsZWN0LWl0ZW0nO1xyXG4gICAgX2l0ZW1TZWxlY3RlZFN0eWxlQ2xhc3MgPSB0aGlzLmRlZmF1bHRTZWxlY3RlZFN0eWxlQ2xhc3M7XHJcbiAgICBASW5wdXQoKSBzZXQgaXRlbVNlbGVjdGVkU3R5bGVDbGFzcyh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1TZWxlY3RlZFN0eWxlQ2xhc3MgPSBgJHt0aGlzLmRlZmF1bHRTZWxlY3RlZFN0eWxlQ2xhc3N9ICR7dmFsdWV9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1TZWxlY3RlZFN0eWxlQ2xhc3MgPSBgJHt0aGlzLmRlZmF1bHRTZWxlY3RlZFN0eWxlQ2xhc3N9ICR7dmFsdWV9YDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpIG9uSW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNvbGxhcHNlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uRXhwYW5kOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uRHJvcGRvd25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uU2hvdyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uU2hvd1NtYXJ0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkhpZGUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkhpZGVTbWFydEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25Gb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkRhdGFTb3VyY2VMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGFkanVzdFZhbHVlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgX3VuU3Vic2NyaWJlQWxsID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gICAgZGF0YVNvdXJjZUludGVybmFsID0gW107XHJcbiAgICBkYXRhU291cmNlU2VsZWN0ZWQgPSBbXTtcclxuICAgIHNlbGVjdGVkVmFsdWVCZWZvcmU6IGFueTtcclxuICAgIF92YWx1ZTogYW55O1xyXG4gICAgX3JldHVyblZhbHVlOiBhbnk7XHJcbiAgICBmdW5jUmV0dXJuVmFsdWU6ICh2YWx1ZSkgPT4ge30gPSB2YWx1ZSA9PiB2YWx1ZTtcclxuICAgIHRvb2x0aXA6IHN0cmluZztcclxuICAgIGhpZGVUcmFuc2l0aW9uT3B0aW9ucyA9ICcxOTVtcyBlYXNlLWluJztcclxuICAgIHNob3dUcmFuc2l0aW9uT3B0aW9ucyA9ICcyMjVtcyBlYXNlLW91dCc7XHJcblxyXG4gICAgaW5wdXRFbG06IGFueTtcclxuICAgIGF1dG9mb2N1c1NlbGVjdGVkSXRlbTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBnZXRGaWx0ZXJPblNlcnZlclNlYXJjaDogRnVuY3Rpb247XHJcbiAgICB2YWx1ZVNlYXJjaFNlcnZlciA9ICcnO1xyXG4gICAga2V5VXAgPSBuZXcgU3ViamVjdDxLZXlib2FyZEV2ZW50PigpO1xyXG4gICAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgICBfaGFzTG9hZGVkRGF0YXNvdXJjZSA9IGZhbHNlO1xyXG5cclxuICAgIHF1aWNrQWRkRGlhbG9nTW9kZWwgPSBuZXcgRGlhbG9nTW9kZWwoe30pO1xyXG4gICAgc2V0dGluZ0RpYWxvZ01vZGVsID0gbmV3IERpYWxvZ01vZGVsKHtcclxuICAgICAgICBoZWFkZXI6ICdD4bqldSBow6xuaCBkcm9wZG93bidcclxuICAgIH0pO1xyXG5cclxuICAgIGZsYXNoQ2FjaGVQYXJlbnQ6IGFueVtdID0gW107XHJcbiAgICBmaWx0ZXJGcm9tUGFyZW50czogRmlsdGVyW10gPSBbXTtcclxuICAgIGRyb3Bkb3duT3B0aW9ucyA9IFtdO1xyXG4gICAgZGVsYXlGaWx0ZXI6IG51bWJlciA9IDEwMDtcclxuICAgIHNjcm9sbENvbnRhaW5lcjogYW55O1xyXG4gICAgdGltZW91dFNjcm9sbDogYW55O1xyXG4gICAgZmlyc3RTY3JvbGw6IGFueSA9IHRydWU7XHJcbiAgICBsb2FkaW5nID0gZmFsc2U7XHJcbiAgICBwYWdlOiBudW1iZXIgPSAxO1xyXG4gICAgdG90YWxQYWdlOiBudW1iZXIgPSAyO1xyXG4gICAgY3VzdG9tVGVtcGxhdGU6IHtcclxuICAgICAgICBba2V5OiBzdHJpbmddOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgfSA9IHt9O1xyXG4gICAgZHJvcGRvd25TZXR0aW5nRm9ybTogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIGRyb3Bkb3duUXVpY2tBZGRGb3JtOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICBfY3J1ZFNlcnZpY2U6IENydWRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2RldmljZURldGVjdG9yU2VydmljZTogRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudFNlcnZpY2U6IENvbXBvbmVudFNlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLnF1aWNrQWRkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucXVpY2tBZGREaWFsb2dNb2RlbC5oZWFkZXIgPSBgVGjDqm0gbeG7m2kgJHt0aGlzLmNvbnRyb2wubGFiZWx9YDtcclxuICAgICAgICAgICAgdGhpcy5xdWlja0FkZERpYWxvZ01vZGVsLnBvcHVwU2l6ZSA9IHRoaXMuY29udHJvbC5wb3B1cFNpemU7XHJcbiAgICAgICAgICAgIHRoaXMucXVpY2tBZGREaWFsb2dNb2RlbC5kYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgZm9ybU1vZGVsOiBuZXcgQ3J1ZEZvcm1EYXRhKClcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5maXRQYW5lbCkge1xyXG4gICAgICAgICAgICBjb25zdCBjbGFzc1dyYXBDb250ZW50ID0gJy0td3JhcC1jb250ZW50JztcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2wucGFuZWxDbGFzcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnBhbmVsQ2xhc3MgPSBjbGFzc1dyYXBDb250ZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnBhbmVsQ2xhc3MgKz0gYCAke2NsYXNzV3JhcENvbnRlbnR9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbnRyb2wuX2NvbXBvbmVudCA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5wbGFjZWhvbGRlciA9PSBudWxsICYmIHRoaXMuY29udHJvbC5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wucGxhY2Vob2xkZXIgPSAnQ2jGsGEgY2jhu41uIGLhuqNuIGdoaSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdFNldHRpbmcoKTtcclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLmJhc2VTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wuaXNTZXJ2ZXJMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wubWF4SXRlbURpc3BsYXkgPSA5OTk5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVGaWx0ZXJGdW5jdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTZWFyY2hTdWJzY3JpcHRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb250cm9sLmxvYWRPbkluaXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dldERhdGEoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNEZXNrdG9wKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlVHJhbnNpdGlvbk9wdGlvbnMgPSB0aGlzLnNob3dUcmFuc2l0aW9uT3B0aW9ucyA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLm9uSW5pdCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wub25Jbml0KHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uSW5pdC5lbWl0KHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGUgPSB0aGlzLl9jb21wb25lbnRTZXJ2aWNlLmRpY1RlbXBsYXRlO1xyXG4gICAgICAgIGlmICh0aGlzLmN1c3RvbVRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25TZXR0aW5nRm9ybSA9IHRoaXMuY3VzdG9tVGVtcGxhdGVbJ2Ryb3Bkb3duU2V0dGluZ0Zvcm0nXTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93blF1aWNrQWRkRm9ybSA9IHRoaXMuY3VzdG9tVGVtcGxhdGVbJ2Ryb3Bkb3duUXVpY2tBZGRGb3JtJ107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuX3VuU3Vic2NyaWJlQWxsLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGVmYXVsdFNldHRpbmcoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5pc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5kZWxheUZpbHRlciA9IDIwMDtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2wuZnVuY0dldExhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuZnVuY0dldExhYmVsID0gaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uX3ByZWZpeCArIGl0ZW1bdGhpcy5jb250cm9sLmRpc3BsYXlGaWVsZF07XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udHJvbC5mdW5jR2V0TGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5mdW5jR2V0TGFiZWwgPSBpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVt0aGlzLmNvbnRyb2wuZGlzcGxheUZpZWxkXTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5jb250cm9sLmdlbmVyYXRlVG9vbHRpcCAmJiAhdGhpcy5jb250cm9sLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5nZW5lcmF0ZVRvb2x0aXAgPSB0aGlzLmNvbnRyb2wuZnVuY0dldExhYmVsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5yZXR1cm5UeXBlID09ICd2YWx1ZScpIHtcclxuICAgICAgICAgICAgdGhpcy5mdW5jUmV0dXJuVmFsdWUgPSAodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKGl0ZW0gPT4gaXRlbVt0aGlzLmNvbnRyb2wudmFsdWVGaWVsZF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlW3RoaXMuY29udHJvbC52YWx1ZUZpZWxkXTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZnVuY1JldHVyblZhbHVlID0gdmFsdWUgPT4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldERlbGF5U2VhcmNoVGltZSgpIHtcclxuICAgICAgICBjb25zdCBqc0Ryb3Bkb3duU2V0dGluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEtleVN0b3JhZ2VEcm9wZG93blNldHRpbmcpO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSA1MDA7XHJcbiAgICAgICAgaWYgKGpzRHJvcGRvd25TZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcm9wZG93blNldHRpbmcgPSBKU09OLnBhcnNlKGpzRHJvcGRvd25TZXR0aW5nKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRyb3Bkb3duU2V0dGluZy5kZWxheVNlYXJjaFRpbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQgPT0gTmFOIHx8IHJlc3VsdCA8IDIwMCkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSAyMDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWxsUGFyZW50KHJlc3VsdCwgcGFyZW50SWQpIHtcclxuICAgICAgICBpZiAodGhpcy5mbGFzaENhY2hlUGFyZW50LnNvbWUocSA9PiBxLnZhbHVlLmlkID09IHBhcmVudElkKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGl0ZW1QYXJlbnQgPSB0aGlzLmRyb3Bkb3duT3B0aW9ucy5maW5kKHEgPT4gcS52YWx1ZS5pZCA9PSBwYXJlbnRJZCk7XHJcbiAgICAgICAgaWYgKGl0ZW1QYXJlbnQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQWRkID0ge1xyXG4gICAgICAgICAgICAgICAgLi4uaXRlbVBhcmVudCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmNvbnRyb2wuZGlzYWJsZWRQYXJlbnRJdGVtXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW1BZGQpO1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleEV4aXN0ID0gdGhpcy5mbGFzaENhY2hlUGFyZW50LmZpbmRJbmRleChxID0+IHEudmFsdWUuX2xldmVsID09IGl0ZW1BZGQudmFsdWUuX2xldmVsKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4RXhpc3QgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mbGFzaENhY2hlUGFyZW50W2luZGV4RXhpc3RdID0gaXRlbUFkZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmxhc2hDYWNoZVBhcmVudC5wdXNoKGl0ZW1BZGQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBM4bqleSB0aMOqbSBi4bqjbiBnaGkgY2hhIGPhu6dhIGLhuqNuIGdoaSBjaGFcclxuICAgICAgICAgICAgcGFyZW50SWQgPSB0aGlzLmdldFBhcmVudElkRnJvbUl0ZW0oaXRlbVBhcmVudCk7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRJZCAhPSB0aGlzLmd1aWRFbXB0eSAmJiBwYXJlbnRJZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFsbFBhcmVudChyZXN1bHQsIHBhcmVudElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhbHJlYWR5SGFzUGFyZW50KG9wdGlvbnM6IGFueVtdLCBpbmRleFN0YXJ0OiBudW1iZXIsIHBhcmVudElkOiBzdHJpbmcsIGxldmVsOiBudW1iZXIpIHtcclxuICAgICAgICB3aGlsZSAoaW5kZXhTdGFydCA+IC0xKSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zW2luZGV4U3RhcnRdLnZhbHVlLmlkID09IHBhcmVudElkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zW2luZGV4U3RhcnRdLnZhbHVlLmxldmVsID09IGxldmVsICYmIHRoaXMuZ2V0UGFyZW50SWRGcm9tSXRlbShvcHRpb25zW2luZGV4U3RhcnRdKSAhPSBwYXJlbnRJZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmxhc2hDYWNoZVBhcmVudC5zb21lKHEgPT4gcS52YWx1ZS5pZCA9PSBwYXJlbnRJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXhTdGFydC0tO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRQYXJlbnRJZEZyb21JdGVtKGl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZVt0aGlzLmNvbnRyb2wuZmllbGRUcmVlXTtcclxuICAgIH1cclxuXHJcbiAgICBtb2RpZnlPcHRpb25XaGVuRmlsdGVyID0gKG9wdGlvbnMpID0+IHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duT3B0aW9ucyA9IHRoaXMuZHJvcGRvd24uX29wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5fbW9kaWZ5T3B0aW9uV2hlbkZpbHRlcihvcHRpb25zKTtcclxuICAgIH07XHJcblxyXG4gICAgbW9kaWZ5T3B0aW9uV2hlbkZpbHRlck11bHRpcGxlID0gKG9wdGlvbnMpID0+IHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duT3B0aW9ucyA9IHRoaXMubXVsdGlTZWxlY3QuX29wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5fbW9kaWZ5T3B0aW9uV2hlbkZpbHRlcihvcHRpb25zKTtcclxuICAgIH07XHJcblxyXG4gICAgX21vZGlmeU9wdGlvbldoZW5GaWx0ZXIob3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuZmxhc2hDYWNoZVBhcmVudCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMuZ2V0UGFyZW50SWRGcm9tSXRlbShvcHRpb25zW2ldKTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudElkICE9IHRoaXMuZ3VpZEVtcHR5ICYmIHBhcmVudElkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIC8vIEtp4buDbSB0cmEgY8OhYyBi4bqjbiBnaGkgcGjDrWEgdHLGsOG7m2MgeGVtIMSRw6MgY8OzIGLhuqNuIGdoaSBjaGEgY2jGsGEgKENobyDEkeG6v24gZ2hpIGfhurdwIGLhuqNuIGdoaSBjw7luZyBsZXZlbCBuaMawbmcga2jDoWMgcGFyZW50SWQpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNQYXJlbnQgPSB0aGlzLmFscmVhZHlIYXNQYXJlbnQob3B0aW9ucywgaSAtIDEsIHBhcmVudElkLCBvcHRpb25zW2ldLmxldmVsKTtcclxuICAgICAgICAgICAgICAgIGlmICghaGFzUGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBbGxQYXJlbnQocGFyZW50cywgcGFyZW50SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zcGxpY2UoaSwgMCwgLi4ucGFyZW50cy5yZXZlcnNlKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpICs9IHBhcmVudHMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVGaWx0ZXJGdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLnNlYXJjaEZpZWxkID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sLnNlYXJjaEZpZWxkID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5jb250cm9sLmRpc2FibGVEaXNwbGF5RmllbGRTZXJ2ZXJTZWFyY2gpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2wuc2VhcmNoRmllbGQuc29tZShpdGVtID0+IGl0ZW0gPT0gdGhpcy5jb250cm9sLmRpc3BsYXlGaWVsZCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5zZWFyY2hGaWVsZC5wdXNoKHRoaXMuY29udHJvbC5kaXNwbGF5RmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wuc2VhcmNoRmllbGQubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRGaWx0ZXJPblNlcnZlclNlYXJjaCA9IHZhbHVlID0+ICh7XHJcbiAgICAgICAgICAgICAgICBmaWVsZDogdGhpcy5jb250cm9sLnNlYXJjaEZpZWxkWzBdLCBvcGVyYXRvcjogT3BlcmF0b3IuY29udGFpbiwgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0RmlsdGVyT25TZXJ2ZXJTZWFyY2ggPSB2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dpYzogJ29yJyxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbXVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGRTZWFyY2ggb2YgdGhpcy5jb250cm9sLnNlYXJjaEZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZpbHRlcnMucHVzaCh7IGZpZWxkOiBmaWVsZFNlYXJjaCwgb3BlcmF0b3I6IE9wZXJhdG9yLmNvbnRhaW4sIHZhbHVlOiB0bXBWYWx1ZSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldERhdGEoZmlsdGVyUGFyZW50cz86IEZpbHRlcltdKSB7XHJcbiAgICAgICAgaWYgKCFmaWx0ZXJQYXJlbnRzKSBmaWx0ZXJQYXJlbnRzID0gW107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJGcm9tUGFyZW50cyA9IGZpbHRlclBhcmVudHM7XHJcbiAgICAgICAgdGhpcy5fZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29tYmluZURhdGFTb3VyY2UoZGF0YVNvdXJjZTogYW55W10sIHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuYXV0b2ZvY3VzU2VsZWN0ZWRJdGVtID0gdHJ1ZTtcclxuICAgICAgICBpZiAoIWRhdGFTb3VyY2UpIGRhdGFTb3VyY2UgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLmlzU2VydmVyTG9hZCkge1xyXG4gICAgICAgICAgICBpZiAocGFnZSA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXV0b2ZvY3VzU2VsZWN0ZWRJdGVtID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcm9wZG93bikgdGhpcy5kcm9wZG93bi5zZWxlY3RlZE9wdGlvblVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vIEFwcGVuZCB0aMOqbSBkYXRhc291cmNlXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBEYXRhU291cmNlID0gWy4uLnRoaXMuZGF0YVNvdXJjZUludGVybmFsXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kRGF0YVNvdXJjZSh0bXBEYXRhU291cmNlLCBkYXRhU291cmNlKTtcclxuICAgICAgICAgICAgICAgIGlmICh0bXBEYXRhU291cmNlLmxlbmd0aCA9PSB0aGlzLmRhdGFTb3VyY2VJbnRlcm5hbC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRhTmV4dFBhZ2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZUludGVybmFsID0gdG1wRGF0YVNvdXJjZTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB0bXBEYXRhU291cmNlID0gWy4uLmRhdGFTb3VyY2VdO1xyXG4gICAgICAgICAgICBpZiAoKHRoaXMuY29udHJvbC5tdWx0aXBsZSAmJiB0aGlzLl92YWx1ZSAmJiB0aGlzLl92YWx1ZS5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgICB8fCAoIXRoaXMuY29udHJvbC5tdWx0aXBsZSAmJiB0aGlzLl92YWx1ZSlcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhU291cmNlU2VsZWN0ZWQgJiYgdGhpcy5kYXRhU291cmNlU2VsZWN0ZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzTG9hZGVkRGF0YXNvdXJjZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbHVlU2VhcmNoU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kRGF0YVNvdXJjZSh0bXBEYXRhU291cmNlLCB0aGlzLmRhdGFTb3VyY2VTZWxlY3RlZCwgLTEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2hhc0xvYWRlZERhdGFzb3VyY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZUludGVybmFsID0gdG1wRGF0YVNvdXJjZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZUludGVybmFsID0gZGF0YVNvdXJjZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZUludGVybmFsLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2hhc0xvYWRlZERhdGFzb3VyY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXBwZW5kRGF0YVNvdXJjZShkZXN0U291cmNlOiBhbnlbXSwgZGF0YVNvdXJjZTogYW55W10sIGRpcmVjdGlvbjogbnVtYmVyID0gMSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wuaXNUcmVlKSB7XHJcbiAgICAgICAgICAgIGRhdGFTb3VyY2UuZm9yRWFjaChzb3VyY2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBkZXN0U291cmNlLmZpbmRJbmRleChxID0+IHEudmFsdWVbdGhpcy5jb250cm9sLmZpZWxkTWFQaGFuQ2FwXSA+IHNvdXJjZS52YWx1ZVt0aGlzLmNvbnRyb2wuZmllbGRNYVBoYW5DYXBdKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEtp4buDbSB0cmEgYuG6o24gZ2hpIGN14buRaSBjw7luZyBsw6AgbsOzIHRow6wgayBpbnNlcnRcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdFNvdXJjZS5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGRlc3RTb3VyY2VbZGVzdFNvdXJjZS5sZW5ndGggLSAxXS52YWx1ZVt0aGlzLmNvbnRyb2wudmFsdWVGaWVsZF0gPT0gc291cmNlLnZhbHVlW3RoaXMuY29udHJvbC52YWx1ZUZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGRlc3RTb3VyY2UucHVzaChzb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5kZXggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlc3RTb3VyY2UudW5zaGlmdChzb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTuG6v3UgYuG6o24gZ2hpIG5nYXkgdHLGsOG7m2MgduG7iyB0csOtIGPhuqduIGluc2VydCBsw6AgYuG6o24gZ2hpIGhp4buHbiB04bqhaSB0aMOsIGsgaW5zZXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RTb3VyY2VbaW5kZXggLSAxXS52YWx1ZVt0aGlzLmNvbnRyb2wudmFsdWVGaWVsZF0gPT0gc291cmNlLnZhbHVlW3RoaXMuY29udHJvbC52YWx1ZUZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZS5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFNvdXJjZVtpbmRleCAtIDFdLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBkZXN0U291cmNlLnNwbGljZShpbmRleCwgMCwgc291cmNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRhU291cmNlLmZvckVhY2goc291cmNlID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGVzdFNvdXJjZS5maW5kSW5kZXgocSA9PiBxLnZhbHVlW3RoaXMuY29udHJvbC52YWx1ZUZpZWxkXSA9PSBzb3VyY2UudmFsdWVbdGhpcy5jb250cm9sLnZhbHVlRmllbGRdKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFNvdXJjZS51bnNoaWZ0KHNvdXJjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0U291cmNlLnB1c2goc291cmNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjaGVja0FuZEZpcmVFdmVudChmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9oYXNMb2FkZWREYXRhc291cmNlKSB7XHJcbiAgICAgICAgICAgIGlmIChmb3JjZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblJlYWR5LmVtaXQodGhpcy5jb250cm9sLmZpZWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBvbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgbGV0IG5ld1ZhbHVlID0gW107XHJcbiAgICAgICAgICAgIGlmICghb2xkVmFsdWUpIG9sZFZhbHVlID0gW107XHJcbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWVTZWxlY3RlZE11bHRpcGxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPT0gMFxyXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5jb250cm9sLm5vdEluQ3J1ZEZvcm1cclxuICAgICAgICAgICAgICAgICYmIHRoaXMuY29udHJvbC5hdXRvRGlzcGxheUZpcnN0XHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBbdGhpcy5kYXRhU291cmNlSW50ZXJuYWxbMF0udmFsdWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gbmV3VmFsdWU7XHJcblxyXG4gICAgICAgICAgICBpZiAob2xkVmFsdWUubGVuZ3RoICE9IHRoaXMuX3ZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fdmFsdWUgIT0gb2xkVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRqdXN0VmFsdWUyV2F5QmluZGluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFkanVzdFZhbHVlU2VsZWN0ZWRTaW5nbGUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlID09IG51bGxcclxuICAgICAgICAgICAgICAgICYmIHRoaXMuY29udHJvbC5ub3RJbkNydWRGb3JtXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmNvbnRyb2wuYXV0b0Rpc3BsYXlGaXJzdFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5kYXRhU291cmNlSW50ZXJuYWxbMF0udmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEzGsHUgw70gaWYg4bufIGTGsOG7m2kga2jDtG5nIMSRxrDhu6NjIMSR4buVaSB0aMOgbmggb2xkVmFsdWUgIT0gdGhpcy5fdmFsdWVcclxuICAgICAgICAgICAgLy8gVsOsIGdpw6EgdHLhu4sgY+G7p2EgdGhpcy5fdmFsdWUgc+G6vSDEkcaw4bujYyBjb3JyZWN0aW5nIOG7nyB0csOqbiAoaWQgPT4gb2JqZWN0KSBuw6puIHNvIHPDoW5oIHPhur0ga2jDoWMgbmhhdVxyXG4gICAgICAgICAgICBpZiAoKG9sZFZhbHVlICE9IG51bGwgJiYgdGhpcy5fdmFsdWUgPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHx8IChvbGRWYWx1ZSA9PSBudWxsICYmIHRoaXMuX3ZhbHVlICE9IG51bGwpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fdmFsdWUgIT0gb2xkVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRqdXN0VmFsdWUyV2F5QmluZGluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNoZWNrUmVhZHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXRTZWxlY3RlZFZhbHVlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wuaXNTZXJ2ZXJMb2FkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSBbXTtcclxuICAgICAgICAgICAgbGV0IGxlbmd0aCA9IDE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMuX3ZhbHVlLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0ZpbHRlcih0aGlzLmNvbnRyb2wudmFsdWVGaWVsZCwgT3BlcmF0b3IuaW4sIHRoaXMuX3ZhbHVlKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0ZpbHRlcih0aGlzLmNvbnRyb2wudmFsdWVGaWVsZCwgT3BlcmF0b3IuZXF1YWwsIHRoaXMuX3ZhbHVlKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB7IGRhdGFTb3VyY2UgfSA9IGF3YWl0IHRoaXMuX2dldERhdGFTb3VyY2VCeVNlcnZpY2UoZmlsdGVycywgMSwgbGVuZ3RoKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlU2VsZWN0ZWQgPSBkYXRhU291cmNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhU291cmNlSW50ZXJuYWwgJiYgdGhpcy5kYXRhU291cmNlSW50ZXJuYWwubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oYXNMb2FkZWREYXRhc291cmNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNvbWJpbmVEYXRhU291cmNlKHRoaXMuZGF0YVNvdXJjZUludGVybmFsLCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGVja0FuZEZpcmVFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VmFsdWVTZWxlY3RlZE11bHRpcGxlKCkge1xyXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gW107XHJcbiAgICAgICAgY29uc3QgdG1wVmFsdWUgPSBbLi4udGhpcy5fdmFsdWVdO1xyXG4gICAgICAgIHRoaXMuYXBwZW5kVmFsdWVGcm9tRGF0YVNvdXJjZShuZXdWYWx1ZSwgdG1wVmFsdWUsIHRoaXMuZGF0YVNvdXJjZUludGVybmFsKTtcclxuICAgICAgICB0aGlzLmFwcGVuZFZhbHVlRnJvbURhdGFTb3VyY2UobmV3VmFsdWUsIHRtcFZhbHVlLCB0aGlzLmRhdGFTb3VyY2VTZWxlY3RlZCk7XHJcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXBwZW5kVmFsdWVGcm9tRGF0YVNvdXJjZShuZXdWYWx1ZTogYW55W10sIGN1cnJlbnRWYWx1ZTogYW55W10sIGRhdGFTb3VyY2U6IGFueVtdKSB7XHJcbiAgICAgICAgaWYgKCFkYXRhU291cmNlIHx8ICFkYXRhU291cmNlLmxlbmd0aCkgcmV0dXJuO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudFZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGN1cnJlbnRWYWx1ZVtpXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGFTb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wuZnVuY0NvbXBhcmUoaXRlbS52YWx1ZSwgc2VsZWN0ZWRJdGVtKVxyXG4gICAgICAgICAgICAgICAgICAgIHx8IHRoaXMuY29udHJvbC5mdW5jQ29tcGFyZShpdGVtLnZhbHVlLCBzZWxlY3RlZEl0ZW1bdGhpcy5jb250cm9sLnZhbHVlRmllbGRdKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUucHVzaChpdGVtLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGktLTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkanVzdFZhbHVlU2VsZWN0ZWRTaW5nbGUoKSB7XHJcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl92YWx1ZTtcclxuICAgICAgICB0aGlzLl92YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgaWYgKG9sZFZhbHVlID09PSBudWxsIHx8IG9sZFZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLmZpbmRJdGVtRnJvbURhdGFTb3VyY2Uob2xkVmFsdWUsIHRoaXMuZGF0YVNvdXJjZUludGVybmFsKTtcclxuICAgICAgICB0aGlzLmZpbmRJdGVtRnJvbURhdGFTb3VyY2Uob2xkVmFsdWUsIHRoaXMuZGF0YVNvdXJjZVNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZpbmRJdGVtRnJvbURhdGFTb3VyY2Uob2xkVmFsdWU6IGFueSwgZGF0YVNvdXJjZTogYW55W10pIHtcclxuICAgICAgICBpZiAoIWRhdGFTb3VyY2UgfHwgIWRhdGFTb3VyY2UubGVuZ3RoKSByZXR1cm47XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGFTb3VyY2UpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5mdW5jQ29tcGFyZShpdGVtLnZhbHVlLCBvbGRWYWx1ZSlcclxuICAgICAgICAgICAgICAgIHx8IHRoaXMuY29udHJvbC5mdW5jQ29tcGFyZShpdGVtLnZhbHVlLCBvbGRWYWx1ZVt0aGlzLmNvbnRyb2wudmFsdWVGaWVsZF0pXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBpdGVtLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tSZWFkeSgpIHtcclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLm9uQWRqdXN0ZWRWYWx1ZVxyXG4gICAgICAgICAgICAmJiB0aGlzLl9oYXNMb2FkZWREYXRhc291cmNlXHJcbiAgICAgICAgICAgICYmICgoIXRoaXMuY29udHJvbC5tdWx0aXBsZSAmJiB0aGlzLl92YWx1ZSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMuY29udHJvbC5tdWx0aXBsZSAmJiB0aGlzLl92YWx1ZSAhPSBudWxsICYmIHRoaXMuX3ZhbHVlLmxlbmd0aCA+IDApKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVBZGp1c3RWYWx1ZUV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlU3RydWN0dXJlSXRlbU9iamVjdChpdGVtKTogU2VsZWN0SXRlbSB7XHJcbiAgICAgICAgY29uc3QgdGVtcDogU2VsZWN0SXRlbSA9IHtcclxuICAgICAgICAgICAgdmFsdWU6IGl0ZW0sXHJcbiAgICAgICAgICAgIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIHx8IGl0ZW0uX0dlbmVyYXRlZEJ5QmFzZSA/IHRydWUgOiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5mdW5jR2V0TGFiZWwpIHtcclxuICAgICAgICAgICAgdGVtcC5sYWJlbCA9IHRoaXMuY29udHJvbC5mdW5jR2V0TGFiZWwoaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0ZW1wLmxhYmVsID0gaXRlbVt0aGlzLmNvbnRyb2wuZGlzcGxheUZpZWxkXSB8fCBpdGVtWydsYWJlbCddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGVtcC5sYWJlbCA9PT0gbnVsbCB8fCB0ZW1wLmxhYmVsID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGVtcC5sYWJlbCA9ICdLaMO0bmcgeMOhYyDEkeG7i25oJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGVtcC52YWx1ZS5fZHJvcGRvd252YWx1ZSA9IHRoaXMuY29udHJvbC52YWx1ZUZpZWxkO1xyXG4gICAgICAgIHJldHVybiB0ZW1wO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0Q29udHJvbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fdmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZUludGVybmFsID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbGVhckRhdGFzb3VyY2UoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlSW50ZXJuYWwgPSBbXTtcclxuICAgICAgICB0aGlzLl9oYXNMb2FkZWREYXRhc291cmNlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0RGF0YShwYWdlOiBudW1iZXIgPSAxKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5iYXNlU2VydmljZSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9nZXREYXRhU291cmNlKHBhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9nZXREYXRhU291cmNlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBmaWx0ZXJzID0gYXdhaXQgdGhpcy5maWx0ZXJQcm9jZXNzKHRoaXMuZmlsdGVyRnJvbVBhcmVudHMpO1xyXG4gICAgICAgIGlmIChmaWx0ZXJzID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuY29tYmluZURhdGFTb3VyY2UoW10sIHBhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQW5kRmlyZUV2ZW50KGZhbHNlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IGRhdGFTb3VyY2UsIHJhd0RhdGFTb3VyY2UsIHRvdGFsUGFnZSB9ID0gYXdhaXQgdGhpcy5fZ2V0RGF0YVNvdXJjZUJ5U2VydmljZShmaWx0ZXJzLCBwYWdlKTtcclxuICAgICAgICB0aGlzLnRvdGFsUGFnZSA9IHRvdGFsUGFnZTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNvbWJpbmVEYXRhU291cmNlKGRhdGFTb3VyY2UsIHBhZ2UpO1xyXG4gICAgICAgIGlmICghdGhpcy5jb250cm9sLmlzU2VydmVyTG9hZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQW5kRmlyZUV2ZW50KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBO4bq/dSBkcm9wZG93biBrIG7hurFtIHRyb25nIGNydWQgZm9ybSB0aMOsIGPhuqV1IGjDrG5oIGZpcmVDYWxsQmFja0luc2lkZSA9IHRydWUgKG3hurdjIMSR4buLbmgpIMSR4buDIGZpcmUgdHLhu7FjIHRp4bq/cCB04burIHRyb25nIGNvbXBvbmVudFxyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wuZmlyZUNhbGxCYWNrSW5zaWRlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wuY2FsbGJhY2tEYXRhRmluaXNoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuY2FsbGJhY2tEYXRhRmluaXNoKDxhbnk+e1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd0RhdGFTb3VyY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgZWxtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5vbkRhdGFTb3VyY2VMb2FkZWQuZW1pdCh7XHJcbiAgICAgICAgICAgICAgICBkYXRhU291cmNlLFxyXG4gICAgICAgICAgICAgICAgcmF3RGF0YVNvdXJjZSxcclxuICAgICAgICAgICAgICAgIGVsbTogdGhpc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0RGF0YVNvdXJjZUJ5U2VydmljZShmaWx0ZXJzOiBGaWx0ZXJbXSwgcGFnZTogbnVtYmVyID0gMSwgcGFnZVNpemU6IG51bWJlciA9IG51bGwpIHtcclxuICAgICAgICBsZXQgZGF0YVNvdXJjZSA9IG51bGw7XHJcbiAgICAgICAgbGV0IHRvdGFsUGFnZSA9IDE7XHJcbiAgICAgICAgY29uc3QgZHJvcGRvd25PcHRpb25zID0gdGhpcy5fY3J1ZFNlcnZpY2UuY3JlYXRlRHJvcGRvd25PcHRpb25zKHRoaXMuY29udHJvbCk7XHJcbiAgICAgICAgZHJvcGRvd25PcHRpb25zLnBhZ2UgPSBwYWdlO1xyXG4gICAgICAgIGlmIChwYWdlU2l6ZSkge1xyXG4gICAgICAgICAgICBkcm9wZG93bk9wdGlvbnMucGFnZVNpemUgPSBwYWdlU2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5iYXNlU2VydmljZSBpbnN0YW5jZW9mIE1hc3RlckRhdGFTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIGRhdGFTb3VyY2UgPSBhd2FpdCB0aGlzLmNvbnRyb2wuYmFzZVNlcnZpY2UuZ2V0RGF0YURyb3Bkb3duQnlGaWx0ZXIoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuZ3JvdXBDb2RlLCBudWxsLCBmaWx0ZXJzLCBkcm9wZG93bk9wdGlvbnNcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wuaXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29udHJvbC5iYXNlU2VydmljZS5nZXRUcmVlRGF0YURyb3Bkb3duQnlGaWx0ZXJSYXcoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVycywgdGhpcy5jb250cm9sLmZpZWxkVHJlZSwgdGhpcy5jb250cm9sLnZhbHVlUGFyZW50Um9vdFxyXG4gICAgICAgICAgICAgICAgICAgICwgZHJvcGRvd25PcHRpb25zXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbnRyb2wuYmFzZVNlcnZpY2UuZ2V0RGF0YURyb3Bkb3duQnlGaWx0ZXJSYXcoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVycywgZHJvcGRvd25PcHRpb25zXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRhdGFTb3VyY2UgPSByZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgICB0b3RhbFBhZ2UgPSBNYXRoLmNlaWwocmVzcG9uc2UudG90YWxSZWNvcmQgLyBkcm9wZG93bk9wdGlvbnMucGFnZVNpemUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLl9jcnVkU2VydmljZS5nZXRSZWZEYXRhSW5EYXRhc291cmNlKGRhdGFTb3VyY2UsIGRyb3Bkb3duT3B0aW9ucy5yZWZGaWVsZHMpO1xyXG4gICAgICAgIGlmICghZGF0YVNvdXJjZSkgZGF0YVNvdXJjZSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhU291cmNlKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMucmVTdHJ1Y3R1cmVJdGVtT2JqZWN0KGl0ZW0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgZGF0YVNvdXJjZTogcmVzdWx0LCByYXdEYXRhU291cmNlOiBkYXRhU291cmNlLCB0b3RhbFBhZ2UgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGZpbHRlclByb2Nlc3MoZmlsdGVyRnJvbVBhcmVudHM6IEZpbHRlcltdKSB7XHJcbiAgICAgICAgbGV0IGZpbHRlcnMgPSBbLi4uZmlsdGVyRnJvbVBhcmVudHNdO1xyXG4gICAgICAgIGF3YWl0IGFwcGVuZERlZmF1bHRGaWx0ZXIoZmlsdGVycywgdGhpcy5jb250cm9sLmRlZmF1bHRGaWx0ZXJzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5pc1NlcnZlckxvYWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVTZWFyY2hTZXJ2ZXIpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmdldEZpbHRlck9uU2VydmVyU2VhcmNoKHRoaXMudmFsdWVTZWFyY2hTZXJ2ZXIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5tb2RpZnlGaWx0ZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgYWxsb3cgPSBhd2FpdCB0aGlzLmNvbnRyb2wubW9kaWZ5RmlsdGVyKGZpbHRlcnMsIHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAoYWxsb3cgPT09IGZhbHNlKSBmaWx0ZXJzID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmaWx0ZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBhbmVsQ2xhc3MoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5hcHBlbmRUbyA9PSAnYm9keScpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuY29udHJvbC5wYW5lbENsYXNzfSBwLWZpeGVkYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbC5wYW5lbENsYXNzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFZhbHVlUmV0dXJuKCkge1xyXG4gICAgICAgIHRoaXMuX3JldHVyblZhbHVlID0gdGhpcy5mdW5jUmV0dXJuVmFsdWUodGhpcy5fdmFsdWUpO1xyXG4gICAgICAgIGlmICghdGhpcy5jb250cm9sLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wuZ2VuZXJhdGVUb29sdGlwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAgPSB0aGlzLmNvbnRyb2wuZ2VuZXJhdGVUb29sdGlwKHRoaXMuX3ZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy50b29sdGlwID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5WYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0luaXRlZENvbnRyb2woKSB7XHJcbiAgICAgICAgLy8gTuG6v3UgY2jGsGEgY2jhuqF5IHF1YSBpbml0IHRow6wgayBmaXJlIGV2ZW50IGfDrCBj4bqjXHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5jb250cm9sLl9jb21wb25lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYWRqdXN0VmFsdWUyV2F5QmluZGluZygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tJbml0ZWRDb250cm9sKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB2YWx1ZVJldHVybiA9IHRoaXMuZ2V0VmFsdWVSZXR1cm4oKTtcclxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWVSZXR1cm4pO1xyXG4gICAgfVxyXG5cclxuICAgIGZpcmVDaGFuZ2VkRXZlbnQoKSB7XHJcbiAgICAgICAgLy8gTuG6v3UgY2jGsGEgY2jhuqF5IHF1YSBpbml0IHRow6wgayBmaXJlIGV2ZW50IGfDrCBj4bqjXHJcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrSW5pdGVkQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmFsdWVSZXR1cm4gPSB0aGlzLmdldFZhbHVlUmV0dXJuKCk7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlUmV0dXJuKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlZC5uZXh0KHZhbHVlUmV0dXJuKTtcclxuICAgIH1cclxuXHJcbiAgICBmaXJlQWRqdXN0VmFsdWVFdmVudCgpIHtcclxuICAgICAgICAvLyBO4bq/dSBjaMawYSBjaOG6oXkgcXVhIGluaXQgdGjDrCBrIGZpcmUgZXZlbnQgZ8OsIGPhuqNcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tJbml0ZWRDb250cm9sKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB2YWx1ZVJldHVybiA9IHRoaXMuZ2V0VmFsdWVSZXR1cm4oKTtcclxuICAgICAgICB0aGlzLmFkanVzdFZhbHVlLm5leHQodmFsdWVSZXR1cm4pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlU2VsZWN0ZWQoZXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQuaXRlbVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUcsaw4budbmcgaOG7o3Agc2VsZWN0IGFsbFxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5kYXRhU291cmNlSW50ZXJuYWwubWFwKHEgPT4gcS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBUcsaw4budbmcgaOG7o3AgdW5zZWxlY3QgYWxsXHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY29udHJvbC5zZWxlY3REZXNjZW5kYW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJZHMgPSBbZXZlbnQuaXRlbVZhbHVlW3RoaXMuY29udHJvbC52YWx1ZUZpZWxkXV07XHJcbiAgICAgICAgICAgICAgICAvLyBO4bq/dSBpdGVtIMSRxrDhu6NjIGNo4buNbiA9PiBDaOG7jW4gY+G6oyBuaOG7r25nIGLhuqNuIGdoaSBjb24sIGNow6F1XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdmFsdWUuaW5kZXhPZihldmVudC5pdGVtVmFsdWUpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2VJbnRlcm5hbC5mb3JFYWNoKHNvdXJjZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gc291cmNlLnZhbHVlW3RoaXMuY29udHJvbC5maWVsZFRyZWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SWRzLmluZGV4T2YocGFyZW50SWQpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl92YWx1ZS5pbmRleE9mKHNvdXJjZS52YWx1ZSkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZS5wdXNoKHNvdXJjZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJZHMucHVzaChwYXJlbnRJZCwgc291cmNlLnZhbHVlW3RoaXMuY29udHJvbC52YWx1ZUZpZWxkXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBpdGVtIMSRYW5nIGLhu4sgYuG7jyBjaOG7jW4gPT4gaOG7p3kgY2jhu41uIGPhuqMgbmjhu69uZyBi4bqjbiBnaGkgY29uXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlSW50ZXJuYWwuZm9yRWFjaChzb3VyY2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHNvdXJjZS52YWx1ZVt0aGlzLmNvbnRyb2wuZmllbGRUcmVlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudElkcy5pbmRleE9mKHBhcmVudElkKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3ZhbHVlLmluZGV4T2Yoc291cmNlLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudElkcy5wdXNoKHBhcmVudElkLCBzb3VyY2UudmFsdWVbdGhpcy5jb250cm9sLnZhbHVlRmllbGRdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY29udHJvbC5zZWxlY3RDaGlsZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIC8vIE7hur91IGl0ZW0gxJHGsOG7o2MgY2jhu41uID0+IENo4buNbiBj4bqjIG5o4buvbmcgYuG6o24gZ2hpIGNvblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlLmluZGV4T2YoZXZlbnQuaXRlbVZhbHVlKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlSW50ZXJuYWwuZm9yRWFjaChzb3VyY2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHNvdXJjZS52YWx1ZVt0aGlzLmNvbnRyb2wuZmllbGRUcmVlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudElkID09IGV2ZW50Lml0ZW1WYWx1ZVt0aGlzLmNvbnRyb2wudmFsdWVGaWVsZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl92YWx1ZS5pbmRleE9mKHNvdXJjZS52YWx1ZSkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZS5wdXNoKHNvdXJjZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBpdGVtIMSRYW5nIGLhu4sgYuG7jyBjaOG7jW4gPT4gaOG7p3kgY2jhu41uIGPhuqMgbmjhu69uZyBi4bqjbiBnaGkgY29uXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlSW50ZXJuYWwuZm9yRWFjaChzb3VyY2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHNvdXJjZS52YWx1ZVt0aGlzLmNvbnRyb2wuZmllbGRUcmVlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudElkID09IGV2ZW50Lml0ZW1WYWx1ZVt0aGlzLmNvbnRyb2wudmFsdWVGaWVsZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fdmFsdWUuaW5kZXhPZihzb3VyY2UudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maXJlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlSXRlbShldnQsIHNlbGVjdGVkSXRlbSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX3ZhbHVlLmZpbHRlcihpdGVtID0+IGl0ZW0gIT0gc2VsZWN0ZWRJdGVtKTtcclxuICAgICAgICB0aGlzLmZpcmVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZUJlZm9yZSA9IHRoaXMuX3ZhbHVlO1xyXG4gICAgICAgIHRoaXMub25IaWRlU21hcnRFdmVudC5lbWl0KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Ecm9wZG93bkNsaWNrSGFuZGxlcihldnQpIHtcclxuICAgICAgICB0aGlzLm9uRHJvcGRvd25DbGljay5uZXh0KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljaygkZXZlbnQpIHtcclxuICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpJyAmJiAkZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygndWktZHJvcGRvd24tY2xlYXItaWNvbicpKSB7XHJcbiAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgJGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uU2hvd0hhbmRsZXIoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5vblNob3cuZW1pdCh7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcclxuICAgICAgICAgICAgZXZlbnQ6IGV2dFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wucGFuZWxDbGFzcykge1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLm92ZXJsYXkuc3R5bGUud2lkdGggPSB0aGlzLmRyb3Bkb3duLm92ZXJsYXkuc3R5bGUubWluV2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wuaXNTZXJ2ZXJMb2FkID09IG51bGwgfHwgdGhpcy5jb250cm9sLmlzU2VydmVyTG9hZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLnZpcnR1YWxTY3JvbGwpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIgPSB0aGlzLmRyb3Bkb3duLm92ZXJsYXkucXVlcnlTZWxlY3RvcignLmNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIgPSB0aGlzLmRyb3Bkb3duLm92ZXJsYXkucXVlcnlTZWxlY3RvcignLnAtZHJvcGRvd24taXRlbXMtd3JhcHBlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmhhbmRsZVNjcm9sbCk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdElucHV0ID0gdGhpcy5kcm9wZG93bi5maWx0ZXJWaWV3Q2hpbGQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICB0aGlzLl9pbnNlcnRUZXh0Ym94QW5kRm9jdXMoZGVmYXVsdElucHV0KTtcclxuICAgICAgICB0aGlzLm9uU2hvd1NtYXJ0RXZlbnQuZW1pdChldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUGFuZWxTaG93SGFuZGxlcihldnQpIHtcclxuICAgICAgICB0aGlzLm9uU2hvdy5lbWl0KHtcclxuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxyXG4gICAgICAgICAgICBldmVudDogZXZ0XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5wYW5lbENsYXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3Qub3ZlcmxheS5zdHlsZS53aWR0aCA9IHRoaXMubXVsdGlTZWxlY3Qub3ZlcmxheS5zdHlsZS5taW5XaWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlQmVmb3JlID0gdGhpcy5fdmFsdWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2wuaXNTZXJ2ZXJMb2FkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC52aXJ0dWFsU2Nyb2xsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyID0gdGhpcy5tdWx0aVNlbGVjdC5vdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyID0gdGhpcy5tdWx0aVNlbGVjdC5vdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5wLW11bHRpc2VsZWN0LWl0ZW1zLXdyYXBwZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVTY3JvbGwpO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRJbnB1dCA9IHRoaXMubXVsdGlTZWxlY3QuZmlsdGVySW5wdXRDaGlsZC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuX2luc2VydFRleHRib3hBbmRGb2N1cyhkZWZhdWx0SW5wdXQpO1xyXG4gICAgICAgIHRoaXMub25TaG93U21hcnRFdmVudC5lbWl0KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlU2Nyb2xsID0gKGV2dCkgPT4ge1xyXG4gICAgICAgIGlmIChldnQuc3JjRWxlbWVudC5zY3JvbGxUb3AgPiAwXHJcbiAgICAgICAgICAgICYmICF0aGlzLmZpcnN0U2Nyb2xsXHJcbiAgICAgICAgICAgICYmIGV2dC5zcmNFbGVtZW50Lm9mZnNldEhlaWdodCArIGV2dC5zcmNFbGVtZW50LnNjcm9sbFRvcCA9PSBldnQuc3JjRWxlbWVudC5zY3JvbGxIZWlnaHRcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5maXJzdFNjcm9sbCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVvdXRTY3JvbGwpIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRTY3JvbGwpO1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVvdXRTY3JvbGwgPSBzZXRUaW1lb3V0KGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXREYXRhTmV4dFBhZ2UoKTtcclxuICAgICAgICAgICAgfSwgMTUwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyc3RTY3JvbGwgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgZ2V0RGF0YU5leHRQYWdlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmcgfHwgdGhpcy5wYWdlID49IHRoaXMudG90YWxQYWdlKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wYWdlKys7XHJcbiAgICAgICAgdGhpcy5fZ2V0RGF0YSh0aGlzLnBhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2luc2VydFRleHRib3hBbmRGb2N1cyhkZWZhdWx0SW5wdXQpIHtcclxuICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xyXG4gICAgICAgIHRoaXMuYnV0dG9uU2V0dGluZy5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKTtcclxuICAgICAgICAvLyBkZWZhdWx0SW5wdXQuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIGRlZmF1bHRJbnB1dC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsIGRlZmF1bHRJbnB1dCk7XHJcbiAgICAgICAgZGVmYXVsdElucHV0LnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuYnV0dG9uU2V0dGluZy5uYXRpdmVFbGVtZW50LCBkZWZhdWx0SW5wdXQpO1xyXG4gICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUxvYWRlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5pbnB1dCkgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25IaWRlSGFuZGxlcihldnQpIHtcclxuICAgICAgICB0aGlzLm9uSGlkZS5lbWl0KHtcclxuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxyXG4gICAgICAgICAgICBldmVudDogZXZ0XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZUJlZm9yZSAhPSB0aGlzLl92YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb250cm9sLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlQmVmb3JlID09IG51bGwgJiYgdGhpcy5fdmFsdWUgJiYgdGhpcy5fdmFsdWUubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVCZWZvcmUgPSB0aGlzLl92YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhRW1pdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IGV2dFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25IaWRlU21hcnRFdmVudC5lbWl0KGRhdGFFbWl0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVCZWZvcmUgPSB0aGlzLl92YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmhhbmRsZVNjcm9sbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUZvY3VzKGV2dCkge1xyXG4gICAgICAgIHRoaXMub25Gb2N1cy5lbWl0KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQmx1cihldnQpIHtcclxuICAgICAgICB0aGlzLm9uQmx1ci5lbWl0KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Zvcm1RdWlja0FkZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBmb3JtTW9kZWwgPSBuZXcgQ3J1ZEZvcm1EYXRhKCk7XHJcbiAgICAgICAgbGV0IGluaXREYXRhID0gdGhpcy5jb250cm9sLmluaXREYXRhO1xyXG4gICAgICAgIGlmICh0eXBlb2YgaW5pdERhdGEgIT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgaW5pdERhdGEgPSAoPEZ1bmN0aW9uPih0aGlzLmNvbnRyb2wuaW5pdERhdGEpKSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3JtTW9kZWwuZGF0YSA9IHsgLi4uaW5pdERhdGEgfTtcclxuICAgICAgICBmb3JtTW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLkFERDtcclxuICAgICAgICB0aGlzLnF1aWNrQWRkRGlhbG9nTW9kZWwuZGF0YS5mb3JtTW9kZWwgPSBmb3JtTW9kZWw7XHJcbiAgICAgICAgdGhpcy5xdWlja0FkZERpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybSA9IHRydWU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEsgc+G7rWEgdGjDoG5oIGZ1bmN0aW9uLCBwaOG6o2kgxJHhu4MgYXJyb3cgZnVuY3Rpb25cclxuICAgIGhhbmRsZUNhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnF1aWNrQWRkRGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2U7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEsgc+G7rWEgdGjDoG5oIGZ1bmN0aW9uLCBwaOG6o2kgxJHhu4MgYXJyb3cgZnVuY3Rpb25cclxuICAgIGhhbmRsZVNhdmVkID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucXVpY2tBZGREaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9nZXREYXRhKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHNob3dGb3JtU2V0dGluZygpIHtcclxuICAgICAgICBjb25zdCBmb3JtTW9kZWwgPSBuZXcgQ3J1ZEZvcm1EYXRhKCk7XHJcbiAgICAgICAgZm9ybU1vZGVsLmRhdGEgPSB7fTtcclxuICAgICAgICBmb3JtTW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLkFERDtcclxuICAgICAgICB0aGlzLnNldHRpbmdEaWFsb2dNb2RlbC5kYXRhLmZvcm1Nb2RlbCA9IGZvcm1Nb2RlbDtcclxuICAgICAgICB0aGlzLnNldHRpbmdEaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICBoYW5kbGVTYXZlZFNldHRpbmcgPSAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nRGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVTZWFyY2hTdWJzY3JpcHRpb24oKTtcclxuICAgIH07XHJcblxyXG4gICAgY3JlYXRlU2VhcmNoU3Vic2NyaXB0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IGRlbGF5U2VhcmNoVGltZSA9IHRoaXMuZ2V0RGVsYXlTZWFyY2hUaW1lKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5rZXlVcC5waXBlKFxyXG4gICAgICAgICAgICBtYXAoZXZlbnQgPT4gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSksXHJcbiAgICAgICAgICAgIGRlYm91bmNlVGltZShkZWxheVNlYXJjaFRpbWUpLFxyXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fdW5TdWJzY3JpYmVBbGwpXHJcbiAgICAgICAgKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9nZXREYXRhKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAjZWwgY2xhc3M9XCJ0bi1kcm9wZG93blwiIFtwVG9vbHRpcF09XCJ0b29sdGlwXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgdG9vbHRpcFN0eWxlQ2xhc3M9XCJ3cmFwXCJcclxuICAgIFtjbGFzcy5zZXJ2ZXItbG9hZF09XCJjb250cm9sLmlzU2VydmVyTG9hZFwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJzZXJ2ZXItbG9hZC1pbmZvXCIgcFRvb2x0aXA9XCJE4buvIGxp4buHdSBz4bq9IMSRxrDhu6NjIGzDoG0gbeG7m2kgZ2hpIHTDrG0ga2nhur9tXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+PC9zcGFuPlxyXG4gICAgPHAtZHJvcGRvd24gKm5nSWY9XCIhY29udHJvbC5tdWx0aXBsZVwiIFtvcHRpb25zXT1cImRhdGFTb3VyY2VJbnRlcm5hbFwiIFtwbGFjZWhvbGRlcl09XCJjb250cm9sLnBsYWNlaG9sZGVyXCJcclxuICAgICAgICBbZmlsdGVyXT1cImNvbnRyb2wuZmlsdGVyXCIgW3BhbmVsU3R5bGVDbGFzc109XCJnZXRQYW5lbENsYXNzKClcIiBbYXBwZW5kVG9dPVwiY29udHJvbC5hcHBlbmRUb1wiXHJcbiAgICAgICAgW3N0eWxlQ2xhc3NdPVwiJ3RuLWRyb3Bkb3duJ1wiIFtlbXB0eUZpbHRlck1lc3NhZ2VdPVwiJ0tow7RuZyB0w6xtIHRo4bqleSBr4bq/dCBxdeG6oycgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkID8gdHJ1ZSA6IG51bGxcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCIgW3Nob3dDbGVhcl09XCJjb250cm9sLnNob3dDbGVhclwiXHJcbiAgICAgICAgW3Nob3dUcmFuc2l0aW9uT3B0aW9uc109XCJzaG93VHJhbnNpdGlvbk9wdGlvbnNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJjb250cm9sLmF1dG9EaXNwbGF5Rmlyc3RcIlxyXG4gICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cImNvbnRyb2wudmlydHVhbFNjcm9sbFwiIGl0ZW1TaXplPVwiMzBcIiBbbWF4SXRlbURpc3BsYXldPVwiY29udHJvbC5tYXhJdGVtRGlzcGxheVwiXHJcbiAgICAgICAgW2F1dG9mb2N1c1NlbGVjdGVkSXRlbV09XCJhdXRvZm9jdXNTZWxlY3RlZEl0ZW1cIiBbaGlkZVRyYW5zaXRpb25PcHRpb25zXT1cImhpZGVUcmFuc2l0aW9uT3B0aW9uc1wiXHJcbiAgICAgICAgW21vZGlmeU9wdGlvbnNXaGVuRmlsdGVyXT1cIm1vZGlmeU9wdGlvbldoZW5GaWx0ZXJcIiBbZGVsYXlGaWx0ZXJdPVwiZGVsYXlGaWx0ZXJcIiBbKG5nTW9kZWwpXT1cIl92YWx1ZVwiXHJcbiAgICAgICAgKG9uRm9jdXMpPVwiaGFuZGxlRm9jdXMoJGV2ZW50KVwiIChvbkJsdXIpPVwiaGFuZGxlQmx1cigkZXZlbnQpXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlU2VsZWN0ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgKG9uQ2xpY2spPVwib25Ecm9wZG93bkNsaWNrSGFuZGxlcigkZXZlbnQpXCIgKG9uU2hvdyk9XCJvblNob3dIYW5kbGVyKCRldmVudClcIiAob25IaWRlKT1cIm9uSGlkZUhhbmRsZXIoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNvbnRyb2wudGVtcGxhdGVTZWxlY3RlZEl0ZW1cIiBsZXQtaXRlbSBwVGVtcGxhdGU9XCJzZWxlY3RlZEl0ZW1cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250cm9sLnRlbXBsYXRlU2VsZWN0ZWRJdGVtOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtLCBzZWxlY3RlZFZhbHVlOiBfdmFsdWV9XCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiY29udHJvbC50ZW1wbGF0ZUl0ZW1cIiBsZXQtaXRlbSBwVGVtcGxhdGU9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250cm9sLnRlbXBsYXRlSXRlbTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9wLWRyb3Bkb3duPlxyXG4gICAgPHAtbXVsdGlTZWxlY3QgKm5nSWY9XCJjb250cm9sLm11bHRpcGxlXCIgW29wdGlvbnNdPVwiZGF0YVNvdXJjZUludGVybmFsXCIgW2ZpbHRlcl09XCJjb250cm9sLmZpbHRlclwiXHJcbiAgICAgICAgW2RlZmF1bHRMYWJlbF09XCJjb250cm9sLnBsYWNlaG9sZGVyXCIgW3BsYWNlaG9sZGVyXT1cImNvbnRyb2wucGxhY2Vob2xkZXJcIiBbcGFuZWxTdHlsZUNsYXNzXT1cImdldFBhbmVsQ2xhc3MoKVwiXHJcbiAgICAgICAgW2FwcGVuZFRvXT1cImNvbnRyb2wuYXBwZW5kVG9cIiBbc3R5bGVDbGFzc109XCIndG4tZHJvcGRvd24nXCJcclxuICAgICAgICBbZW1wdHlGaWx0ZXJNZXNzYWdlXT1cIidLaMO0bmcgdMOsbSB0aOG6pXkga+G6v3QgcXXhuqMnIHwgdHJhbnNsYXRlXCIgW2Rpc2FibGVkXT1cImNvbnRyb2wuZGlzYWJsZWQgPyB0cnVlIDogbnVsbFwiXHJcbiAgICAgICAgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiIFtzaG93VHJhbnNpdGlvbk9wdGlvbnNdPVwic2hvd1RyYW5zaXRpb25PcHRpb25zXCJcclxuICAgICAgICBbaGlkZVRyYW5zaXRpb25PcHRpb25zXT1cImhpZGVUcmFuc2l0aW9uT3B0aW9uc1wiIFt2aXJ0dWFsU2Nyb2xsXT1cImNvbnRyb2wudmlydHVhbFNjcm9sbFwiXHJcbiAgICAgICAgW21heEl0ZW1EaXNwbGF5XT1cImNvbnRyb2wubWF4SXRlbURpc3BsYXlcIiBbc2VsZWN0ZWRJdGVtc0xhYmVsXT1cImNvbnRyb2wuc2VsZWN0ZWRJdGVtc0xhYmVsXCJcclxuICAgICAgICBbbWF4U2VsZWN0ZWRMYWJlbHNdPVwiY29udHJvbC5tYXhTZWxlY3RlZExhYmVsc1wiIFttb2RpZnlPcHRpb25zV2hlbkZpbHRlcl09XCJtb2RpZnlPcHRpb25XaGVuRmlsdGVyTXVsdGlwbGVcIlxyXG4gICAgICAgIFtkZWxheUZpbHRlcl09XCJkZWxheUZpbHRlclwiIFsobmdNb2RlbCldPVwiX3ZhbHVlXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlU2VsZWN0ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgKG9uQ2xpY2spPVwib25Ecm9wZG93bkNsaWNrSGFuZGxlcigkZXZlbnQpXCIgKG9uUGFuZWxTaG93KT1cIm9uUGFuZWxTaG93SGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAob25QYW5lbEhpZGUpPVwib25IaWRlSGFuZGxlcigkZXZlbnQpXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInNlbGVjdGVkSXRlbXNcIiBsZXQtdmFsdWU+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdmFsdWUgfHwgdmFsdWUubGVuZ3RoID09IDBcIj57e2NvbnRyb2wucGxhY2Vob2xkZXJ9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHNlbGVjdGVkSXRlbSBvZiB2YWx1ZVwiIFtjbGFzc109XCJfaXRlbVNlbGVjdGVkU3R5bGVDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWRJdGVtW2NvbnRyb2wuZGlzcGxheUZpZWxkXX19PHNwYW4gY2xhc3M9XCJyZW1vdmUtaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVJdGVtKCRldmVudCwgc2VsZWN0ZWRJdGVtKVwiPjxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvcC1tdWx0aVNlbGVjdD5cclxuICAgIDxpbnB1dCAjaW5wdXRNYXNrIGNsYXNzPVwiaW5wdXQtbWFzayBoaWRlIHAtaW5wdXR0ZXh0XCIgdHlwZT1cInRleHRcIiBbZGlzYWJsZWRdPVwibG9hZGluZ1wiXHJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVNlYXJjaFNlcnZlclwiIChrZXl1cCk9XCJrZXlVcC5uZXh0KCRldmVudClcIiAvPlxyXG4gICAgPHNwYW4gI2J1dHRvblNldHRpbmcgY2xhc3M9XCJidXR0b24tc2V0dGluZyBoaWRlIHBpIHBpLWNvZ1wiIChjbGljayk9XCJzaG93Rm9ybVNldHRpbmcoKVwiPjwvc3Bhbj5cclxuICAgIDxhZnRlci12aWV3LWNoZWNrZWQgKm5nSWY9XCIhbG9hZGluZ1wiIChsb2FkZWQpPVwiaGFuZGxlTG9hZGVkKClcIj48L2FmdGVyLXZpZXctY2hlY2tlZD5cclxuICAgIDxidXR0b24gKm5nSWY9XCJjb250cm9sLnF1aWNrQWRkICYmIChjb250cm9sLmNvbHMgfHwgY29udHJvbC5xdWlja0FkZFRlbXBsYXRlKVwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uXHJcbiAgICAgICAgaWNvbj1cInBpIHBpLXBsdXNcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tcm91bmRlZCBidXR0b24tcXVpY2stYWRkXCIgcFRvb2x0aXA9XCJUaMOqbSBuaGFuaFwiXHJcbiAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgKGNsaWNrKT1cInNob3dGb3JtUXVpY2tBZGQoKVwiPjwvYnV0dG9uPlxyXG48L2Rpdj5cclxuPHRuLWRpYWxvZyAqbmdJZj1cInF1aWNrQWRkRGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtXCIgI2RpYWxvZyBbaGVhZGVyXT1cInF1aWNrQWRkRGlhbG9nTW9kZWwuaGVhZGVyIHwgdHJhbnNsYXRlXCJcclxuICAgIFtwb3B1cFNpemVdPVwiY29udHJvbC5wb3B1cFNpemVcIiAob25IaWRlKT1cInF1aWNrQWRkRGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLmNvbHNcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJkcm9wZG93blF1aWNrQWRkRm9ybVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XHJcbiAgICAgICAgJGltcGxpY2l0OiBxdWlja0FkZERpYWxvZ01vZGVsLCBwYXJlbnRNb2RlbDogbW9kZWwsIHBhcmVudENvbnRleHQ6IGNvbnRleHQsIGNvbnRyb2w6IGNvbnRyb2wsXHJcbiAgICAgICAgb25TYXZlZDogaGFuZGxlU2F2ZWQsIG9uQ2FuY2VsOiBoYW5kbGVDYW5jZWxcclxuICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZm9vdGVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJxdWlja0FkZERpYWxvZ01vZGVsLmJ1dHRvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPCEtLSA8cXVpY2stYWRkLWZvcm0gI2Zvcm1CYXNlIFtwYXJlbnRNb2RlbF09XCJtb2RlbFwiIFtwYXJlbnRDb250ZXh0XT1cImNvbnRleHRcIiBbbW9kZWxdPVwiZm9ybU1vZGVsXCIgW2NvbnRyb2xdPVwiY29udHJvbFwiXHJcbiAgICAgICAgW2Jhc2VTZXJ2aWNlXT1cImNvbnRyb2wuYmFzZVNlcnZpY2VcIiAob25TYXZlZCk9XCJoYW5kbGVTYXZlZCgpXCIgKG9uQ2FuY2VsKT1cImhhbmRsZUNhbmNlbCgpXCI+XHJcbiAgICA8L3F1aWNrLWFkZC1mb3JtPiAtLT5cclxuPC90bi1kaWFsb2c+XHJcbjx0bi1kaWFsb2cgKm5nSWY9XCJzZXR0aW5nRGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtXCIgI2RpYWxvZyBbaGVhZGVyXT1cInNldHRpbmdEaWFsb2dNb2RlbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxyXG4gICAgW3BvcHVwU2l6ZV09XCJjb250cm9sLnBvcHVwU2l6ZVwiIChvbkhpZGUpPVwic2V0dGluZ0RpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRyb3Bkb3duU2V0dGluZ0Zvcm1cIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICRpbXBsaWNpdDogc2V0dGluZ0RpYWxvZ01vZGVsLCBvblNhdmVkOiBoYW5kbGVTYXZlZFNldHRpbmdcclxuICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZm9vdGVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZXR0aW5nRGlhbG9nTW9kZWwuYnV0dG9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8IS0tIDxkcm9wZG93bi1zZXR0aW5nLWZvcm0gI2Zvcm1CYXNlIFttb2RlbF09XCJzZXR0aW5nRGlhbG9nTW9kZWwuZGF0YS5mb3JtTW9kZWxcIiAob25TYXZlZCk9XCJoYW5kbGVTYXZlZFNldHRpbmcoKVwiXHJcbiAgICAgICAgKG9uQ2FuY2VsKT1cInNldHRpbmdEaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgPC9kcm9wZG93bi1zZXR0aW5nLWZvcm0+IC0tPlxyXG48L3RuLWRpYWxvZz5cclxuPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRyb2wucXVpY2tBZGRUZW1wbGF0ZTsgY29udGV4dDoge1xyXG4gICAgaGFuZGxlU2F2ZWQ6IGhhbmRsZVNhdmVkLFxyXG4gICAgaGFuZGxlQ2FuY2VsOiBoYW5kbGVDYW5jZWwsXHJcbiAgICBkaWFsb2dNb2RlbDogcXVpY2tBZGREaWFsb2dNb2RlbFxyXG59XCI+PC9uZy1jb250YWluZXI+Il19
|