@bnsights/bbsf-admin-portal 1.0.7 → 1.0.11
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/bnsights-bbsf-admin-portal-1.0.11.tgz +0 -0
- package/bundles/bnsights-bbsf-admin-portal.umd.js +9643 -4461
- package/bundles/bnsights-bbsf-admin-portal.umd.js.map +1 -1
- package/esm2015/lib/Pages/ActiveDirectories/active-directory/active-directory.component.js +316 -258
- package/esm2015/lib/Pages/ActiveDirectories/active-directory-add/active-directory-add.component.js +367 -222
- package/esm2015/lib/Pages/ActiveDirectories/active-directory.module.js +16 -4
- package/esm2015/lib/Pages/_layout/components/aside/aside-menu/aside-menu.component.js +2 -2
- package/esm2015/lib/Pages/_layout/components/aside/aside.component.js +12 -8
- package/esm2015/lib/Pages/_layout/components/topbar/topbar.component.js +5 -7
- package/esm2015/lib/Pages/anonymouslayout/activation/activation.component.js +92 -0
- package/esm2015/lib/Pages/anonymouslayout/anonymouslayout-routing.module.js +35 -0
- package/esm2015/lib/Pages/anonymouslayout/anonymouslayout.component.js +50 -0
- package/esm2015/lib/Pages/anonymouslayout/anonymouslayout.module.js +75 -0
- package/esm2015/lib/Pages/anonymouslayout/forgot-password/forgot-password.component.js +55 -0
- package/esm2015/lib/Pages/anonymouslayout/login/login.component.js +26 -0
- package/esm2015/lib/Pages/anonymouslayout/rest-password/rest-password.component.js +90 -0
- package/esm2015/lib/Pages/anonymouslayout/upload-license/upload-license.component.js +71 -0
- package/esm2015/lib/Pages/configurations/configuration/configuration.component.js +32 -15
- package/esm2015/lib/Pages/core/authentication/admin.guard.js +17 -0
- package/esm2015/lib/Pages/core/authentication/auth.guard.js +10 -5
- package/esm2015/lib/Pages/core/authentication/auth.service.js +1 -2
- package/esm2015/lib/Pages/departments/department/department.component.js +9 -8
- package/esm2015/lib/Pages/helpCenter/help-center/help-center.component.js +3 -3
- package/esm2015/lib/Pages/helpCenter/help-center-secondlevel/help-center-secondlevel.component.js +3 -3
- package/esm2015/lib/Pages/home/home.component.js +3 -3
- package/esm2015/lib/Pages/localizations/localizations.component.js +22 -6
- package/esm2015/lib/Pages/lookups/lookup/lookup.component.js +3 -3
- package/esm2015/lib/Pages/notifications/add/add.component.js +1 -3
- package/esm2015/lib/Pages/notifications/edit/edit.component.js +1 -3
- package/esm2015/lib/Pages/notifications/template-info/template-info.component.js +2 -2
- package/esm2015/lib/Pages/notifications/templates/templates.component.js +3 -3
- package/esm2015/lib/Pages/publicHolidays/public-holiday/public-holiday.component.js +76 -82
- package/esm2015/lib/Pages/shared/Enums/ADType.js +6 -0
- package/esm2015/lib/Pages/shared/Enums/ADWindowsType.js +6 -0
- package/esm2015/lib/Pages/shared/Enums/ConditionRHSType.js +6 -0
- package/esm2015/lib/Pages/shared/Enums/WFActivityType.js +12 -0
- package/esm2015/lib/Pages/shared/Enums/WFVariableDataType.js +14 -0
- package/esm2015/lib/Pages/shared/Services/AccountService.service.js +26 -1
- package/esm2015/lib/Pages/shared/Services/ActiveDirectoryService.service.js +18 -18
- package/esm2015/lib/Pages/shared/Services/AnonymousLayoutService.service.js +29 -0
- package/esm2015/lib/Pages/shared/Services/ConfigurationsService.service.js +2 -2
- package/esm2015/lib/Pages/shared/Services/DepartmentService.service.js +3 -3
- package/esm2015/lib/Pages/shared/Services/GlobalErrorHandler.service.js +1 -14
- package/esm2015/lib/Pages/shared/Services/HelpCenterService.service.js +2 -2
- package/esm2015/lib/Pages/shared/Services/HttpErrorInterceptor.service.js +1 -1
- package/esm2015/lib/Pages/shared/Services/LookupService.service.js +2 -2
- package/esm2015/lib/Pages/shared/Services/PermissionSetService.service.js +2 -2
- package/esm2015/lib/Pages/shared/Services/SectorService.service.js +3 -3
- package/esm2015/lib/Pages/shared/Services/WorkFlowVersionService.service.js +24 -0
- package/esm2015/lib/Pages/shared/Services/WorkflowActivityService.service.js +32 -5
- package/esm2015/lib/Pages/shared/Services/WorkflowInstanceService.service.js +24 -0
- package/esm2015/lib/Pages/shared/Services/WorkflowLogVariablesService.service.js +24 -0
- package/esm2015/lib/Pages/shared/Services/WorkflowService.service.js +12 -4
- package/esm2015/lib/Pages/shared/Services/WorkflowVariablesService.service.js +12 -6
- package/esm2015/lib/Pages/shared/Services/localizationsService.service .js +6 -3
- package/esm2015/lib/Pages/shared/Services/provider.service.js +3 -3
- package/esm2015/lib/Pages/shared/Services/userService.service.js +3 -3
- package/esm2015/lib/Pages/shared/models/ADModels/ActiveDirectoryAddEditModel.js +1 -1
- package/esm2015/lib/Pages/shared/models/ConfigurationModels/ConfigurationModel.js +1 -1
- package/esm2015/lib/Pages/shared/models/DepartmentModels/DepartmentModel.js +28 -4
- package/esm2015/lib/Pages/shared/models/UserModels/ActivationModel.js +3 -0
- package/esm2015/lib/Pages/shared/models/WorkflowModels/WFActivityVariablesModel.js +8 -0
- package/esm2015/lib/Pages/shared/models/user.registration.js +1 -1
- package/esm2015/lib/Pages/shared/stylesbundle.service.js +3 -3
- package/esm2015/lib/Pages/users/users.component.js +2 -2
- package/esm2015/lib/Pages/workflows/activity/workflow-activity-add/workflow-activity-add.component.js +535 -0
- package/esm2015/lib/Pages/workflows/activity/workflow-activity-edit/workflow-activity-edit.component.js +852 -0
- package/esm2015/lib/Pages/workflows/instance-info/instance-info.component.js +309 -0
- package/esm2015/lib/Pages/workflows/tabs/tabs.component.js +611 -430
- package/esm2015/lib/Pages/workflows/version-info/version-info.component.js +143 -0
- package/esm2015/lib/Pages/workflows/workflow/workflow.component.js +136 -148
- package/esm2015/lib/Pages/workflows/workflows-routing.module.js +9 -1
- package/esm2015/lib/Pages/workflows/workflows.module.js +7 -3
- package/esm2015/lib/masterlayout-routing.module.js +4 -4
- package/esm2015/lib/masterlayout.component.js +2 -2
- package/esm2015/lib/masterlayout.module.js +26 -7
- package/esm2015/public-api.js +4 -5
- package/fesm2015/bnsights-bbsf-admin-portal.js +15248 -10155
- package/fesm2015/bnsights-bbsf-admin-portal.js.map +1 -1
- package/lib/Pages/ActiveDirectories/active-directory/active-directory.component.d.ts +65 -56
- package/lib/Pages/ActiveDirectories/active-directory-add/active-directory-add.component.d.ts +70 -43
- package/lib/Pages/ActiveDirectories/active-directory.module.d.ts +4 -1
- package/lib/Pages/_layout/components/aside/aside.component.d.ts +4 -1
- package/lib/Pages/_layout/components/topbar/topbar.component.d.ts +2 -1
- package/lib/Pages/anonymouslayout/activation/activation.component.d.ts +32 -0
- package/lib/Pages/anonymouslayout/anonymouslayout-routing.module.d.ts +7 -0
- package/lib/Pages/anonymouslayout/anonymouslayout.component.d.ts +21 -0
- package/lib/Pages/anonymouslayout/anonymouslayout.module.d.ts +19 -0
- package/lib/Pages/{account → anonymouslayout}/forgot-password/forgot-password.component.d.ts +4 -1
- package/lib/Pages/{account → anonymouslayout}/login/login.component.d.ts +3 -2
- package/lib/Pages/anonymouslayout/rest-password/rest-password.component.d.ts +32 -0
- package/lib/Pages/anonymouslayout/upload-license/upload-license.component.d.ts +25 -0
- package/lib/Pages/configurations/configuration/configuration.component.d.ts +2 -0
- package/lib/Pages/core/authentication/admin.guard.d.ts +9 -0
- package/lib/Pages/localizations/localizations.component.d.ts +1 -0
- package/lib/Pages/publicHolidays/public-holiday/public-holiday.component.d.ts +11 -14
- package/lib/Pages/shared/Enums/ADType.d.ts +4 -0
- package/lib/Pages/shared/Enums/ADWindowsType.d.ts +4 -0
- package/lib/Pages/shared/Enums/ConditionRHSType.d.ts +4 -0
- package/lib/Pages/shared/Enums/WFActivityType.d.ts +10 -0
- package/lib/Pages/shared/Enums/WFVariableDataType.d.ts +12 -0
- package/lib/Pages/shared/Services/AccountService.service.d.ts +8 -0
- package/lib/Pages/shared/Services/ActiveDirectoryService.service.d.ts +9 -9
- package/lib/Pages/shared/Services/AnonymousLayoutService.service.d.ts +17 -0
- package/lib/Pages/shared/Services/WorkFlowVersionService.service.d.ts +10 -0
- package/lib/Pages/shared/Services/WorkflowActivityService.service.d.ts +9 -3
- package/lib/Pages/shared/Services/WorkflowInstanceService.service.d.ts +10 -0
- package/lib/Pages/shared/Services/WorkflowLogVariablesService.service.d.ts +10 -0
- package/lib/Pages/shared/Services/WorkflowService.service.d.ts +5 -3
- package/lib/Pages/shared/Services/WorkflowVariablesService.service.d.ts +5 -4
- package/lib/Pages/shared/Services/localizationsService.service .d.ts +1 -0
- package/lib/Pages/shared/models/ADModels/ActiveDirectoryAddEditModel.d.ts +11 -6
- package/lib/Pages/shared/models/ConfigurationModels/ConfigurationModel.d.ts +1 -0
- package/lib/Pages/shared/models/DepartmentModels/DepartmentModel.d.ts +8 -9
- package/lib/Pages/shared/models/UserModels/ActivationModel.d.ts +10 -0
- package/lib/Pages/shared/models/WorkflowModels/WFActivityVariablesModel.d.ts +13 -0
- package/lib/Pages/workflows/activity/workflow-activity-add/workflow-activity-add.component.d.ts +77 -0
- package/lib/Pages/workflows/activity/workflow-activity-edit/workflow-activity-edit.component.d.ts +83 -0
- package/lib/Pages/workflows/instance-info/instance-info.component.d.ts +81 -0
- package/lib/Pages/workflows/tabs/tabs.component.d.ts +73 -80
- package/lib/Pages/workflows/version-info/version-info.component.d.ts +41 -0
- package/lib/Pages/workflows/workflow/workflow.component.d.ts +26 -29
- package/lib/Pages/workflows/workflows.module.d.ts +19 -15
- package/lib/masterlayout.module.d.ts +2 -2
- package/package.json +5 -3
- package/public-api.d.ts +3 -4
- package/src/lib/assets/css/anonymousBundle-Dark-RTL.css +4 -0
- package/src/lib/assets/css/anonymousBundle-Dark.css +4 -0
- package/src/lib/assets/css/anonymousBundle-light-RTL.css +4 -0
- package/src/lib/assets/css/anonymousBundle-light.css +18 -0
- package/src/lib/assets/css/login.css +74671 -0
- package/src/lib/assets/sass/custom-styles-rtl.scss +13 -3
- package/src/lib/assets/sass/custom-styles.scss +38 -11
- package/bnsights-bbsf-admin-portal-1.0.7.tgz +0 -0
- package/esm2015/lib/Pages/account/account-routing.module.js +0 -28
- package/esm2015/lib/Pages/account/account.component.js +0 -27
- package/esm2015/lib/Pages/account/account.module.js +0 -56
- package/esm2015/lib/Pages/account/forgot-password/forgot-password.component.js +0 -48
- package/esm2015/lib/Pages/account/login/login.component.js +0 -25
- package/esm2015/lib/Pages/account/register/register.component.js +0 -48
- package/lib/Pages/account/account-routing.module.d.ts +0 -7
- package/lib/Pages/account/account.component.d.ts +0 -12
- package/lib/Pages/account/account.module.d.ts +0 -16
- package/lib/Pages/account/register/register.component.d.ts +0 -21
|
@@ -1,55 +1,108 @@
|
|
|
1
1
|
import { __awaiter } from "tslib";
|
|
2
2
|
import { Component, ViewChild } from '@angular/core';
|
|
3
3
|
import { FormGroup } from '@angular/forms';
|
|
4
|
-
import { CheckBoxOptions, ControlLayout, DropdownOptions, FilterItem, FilterType, InputType, PagingOptions, TextBoxOptions, ToggleSlideOptions } from '@bnsights/bbsf-controls';
|
|
4
|
+
import { CheckBoxOptions, ConfirmationModalOptions, ControlLayout, DropdownOptions, FilterItem, FilterType, FormOptions, InputType, PagingActionMode, PagingOptions, StyleConfirmationMode, TextBoxOptions, ToggleSlideOptions } from '@bnsights/bbsf-controls';
|
|
5
5
|
import { ActiveDirectoryAddEditModel } from '../../shared/models/ADModels/ActiveDirectoryAddEditModel';
|
|
6
6
|
import { ADMappingModel } from '../../shared/models/ADModels/ADMappingModel';
|
|
7
7
|
import { PageInfoService } from '../../../_metronic/core/services/page-info.service';
|
|
8
|
+
import { ADType } from '../../shared/Enums/ADType';
|
|
8
9
|
import * as i0 from "@angular/core";
|
|
9
10
|
import * as i1 from "@bnsights/bbsf-utilities";
|
|
10
11
|
import * as i2 from "../../../_metronic/core/services/page-info.service";
|
|
11
12
|
import * as i3 from "../../shared/Services/ActiveDirectoryService.service";
|
|
12
|
-
import * as i4 from "ng-
|
|
13
|
-
import * as i5 from "
|
|
14
|
-
import * as i6 from "@
|
|
15
|
-
import * as i7 from "
|
|
16
|
-
import * as i8 from "
|
|
17
|
-
import * as i9 from "@angular/
|
|
18
|
-
import * as i10 from "@angular/
|
|
19
|
-
import * as i11 from "@
|
|
13
|
+
import * as i4 from "@ng-bootstrap/ng-bootstrap";
|
|
14
|
+
import * as i5 from "ng-block-ui";
|
|
15
|
+
import * as i6 from "@bnsights/bbsf-controls";
|
|
16
|
+
import * as i7 from "@angular/material/menu";
|
|
17
|
+
import * as i8 from "../../empty-data/empty-data.component";
|
|
18
|
+
import * as i9 from "@angular/common";
|
|
19
|
+
import * as i10 from "@angular/forms";
|
|
20
|
+
import * as i11 from "@angular/router";
|
|
21
|
+
import * as i12 from "ng-inline-svg";
|
|
20
22
|
export class ActiveDirectoryComponent {
|
|
21
|
-
constructor(authService, pageInfoService, utilityService, bbsfTranslateService,
|
|
23
|
+
constructor(authService, pageInfoService, utilityService, bbsfTranslateService, activeDirectoryService, modalService, requestHandlerService) {
|
|
22
24
|
this.authService = authService;
|
|
23
25
|
this.pageInfoService = pageInfoService;
|
|
24
26
|
this.utilityService = utilityService;
|
|
25
27
|
this.bbsfTranslateService = bbsfTranslateService;
|
|
26
|
-
this.
|
|
27
|
-
this.
|
|
28
|
-
this.
|
|
29
|
-
|
|
30
|
-
this.
|
|
31
|
-
this.
|
|
32
|
-
|
|
28
|
+
this.activeDirectoryService = activeDirectoryService;
|
|
29
|
+
this.modalService = modalService;
|
|
30
|
+
this.requestHandlerService = requestHandlerService;
|
|
31
|
+
//Page requirements
|
|
32
|
+
this.apiUrl = "/api/admin/ADConnection/";
|
|
33
|
+
this.showPageContent = false;
|
|
34
|
+
//Filter and paging components
|
|
35
|
+
this.activeDirectoryForm = new FormGroup({});
|
|
36
|
+
this.activeDirectoryPagingResult = [];
|
|
37
|
+
this.clientSidePagingResult = [];
|
|
38
|
+
this.isFilterLoaded = false;
|
|
39
|
+
//Required lists
|
|
40
|
+
this.permissionSetList = [];
|
|
41
|
+
this.languagesList = [];
|
|
42
|
+
this.welcomeMsgTempList = [];
|
|
33
43
|
this.mappingTypesList = [];
|
|
34
44
|
this.mappingPropertiesList = [];
|
|
35
|
-
this.ActiveDirectoryForm = new FormGroup({});
|
|
36
|
-
this.showFilter = false;
|
|
37
|
-
this.ActiveDirectoryPagingResult = [];
|
|
38
|
-
this.IsFilterLoaded = false;
|
|
39
|
-
this.ProductionMode = false;
|
|
40
45
|
////Edit Model Controls
|
|
41
|
-
|
|
42
|
-
this.
|
|
43
|
-
this.
|
|
44
|
-
|
|
45
|
-
this.
|
|
46
|
-
this.
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
//Shared controls
|
|
47
|
+
this.editActiveDirectoryForm = new FormGroup({});
|
|
48
|
+
this.editMappingsOptions = [];
|
|
49
|
+
this.deleteControlLoaded = false;
|
|
50
|
+
this.syncControlLoaded = false;
|
|
51
|
+
this.getEditADModel = () => {
|
|
52
|
+
let paramArray = [];
|
|
53
|
+
let resultModel = this.editActiveDirectoryForm.value;
|
|
54
|
+
let EditModel = new ActiveDirectoryAddEditModel();
|
|
55
|
+
EditModel.ID = Number(this.activeDirectoryId);
|
|
56
|
+
EditModel.ConnectionName = resultModel.editName;
|
|
57
|
+
EditModel.PermissionSetID = resultModel.editPermissionSetOptions != null ? Number(resultModel.editPermissionSetOptions) : null;
|
|
58
|
+
EditModel.LangKey = resultModel.editLanguageOptions;
|
|
59
|
+
EditModel.WelcomeTemplateID = resultModel.editWelcomeMsgTemplateOptions != null ? Number(resultModel.editWelcomeMsgTemplateOptions) : null;
|
|
60
|
+
EditModel.MarkAsInactive = resultModel.editInactive;
|
|
61
|
+
EditModel.AddToDailyJob = resultModel.editDailyJob;
|
|
62
|
+
if (this.editADTypeID == Number(ADType.Windows)) {
|
|
63
|
+
EditModel.Domain = resultModel.editDomain;
|
|
64
|
+
EditModel.SamAccount = resultModel.editSamAccount;
|
|
65
|
+
EditModel.Password = resultModel.editPassword;
|
|
66
|
+
}
|
|
67
|
+
else if (this.editADTypeID == Number(ADType.Azure)) {
|
|
68
|
+
EditModel.TenantID = resultModel.editTenantID;
|
|
69
|
+
EditModel.ClientID = resultModel.editClientID;
|
|
70
|
+
EditModel.ClientSecret = resultModel.editClientSecret;
|
|
71
|
+
}
|
|
72
|
+
for (let j = 0; j < this.editMappingsCount; j++) {
|
|
73
|
+
let editMAppingType = resultModel["ADMappingType" + j];
|
|
74
|
+
if (editMAppingType == undefined)
|
|
75
|
+
continue;
|
|
76
|
+
let editMAppingProperty = resultModel["ADMappingProperty" + j];
|
|
77
|
+
let editMAppingPropertyName = resultModel["ADMappingPropertyName" + j];
|
|
78
|
+
let editMAppingIncludeInUpdate = resultModel["ADMappingIncludeUpdate" + j];
|
|
79
|
+
let editMAppingHiddenIncludeInUpdate = resultModel["ADMappingHiddenIncludeUpdate" + j];
|
|
80
|
+
let adMAppingObj = new ADMappingModel();
|
|
81
|
+
adMAppingObj.ADMappingTypeItemID = Number(editMAppingType);
|
|
82
|
+
adMAppingObj.BBSFPropertyName = editMAppingProperty;
|
|
83
|
+
adMAppingObj.ADPropertyName = editMAppingPropertyName;
|
|
84
|
+
adMAppingObj.IncludeInUpdate = editMAppingIncludeInUpdate == undefined ? editMAppingHiddenIncludeInUpdate : editMAppingIncludeInUpdate;
|
|
85
|
+
EditModel.ADMappings.push(adMAppingObj);
|
|
86
|
+
}
|
|
87
|
+
paramArray.push(EditModel);
|
|
88
|
+
return paramArray;
|
|
89
|
+
};
|
|
90
|
+
this.getEditADFunction = (EditModel) => {
|
|
91
|
+
return this.activeDirectoryService.editActiveDirectory(EditModel);
|
|
92
|
+
};
|
|
93
|
+
this.deleteActiveDirectory = (id) => {
|
|
94
|
+
return this.activeDirectoryService.deleteActiveDirectory(id);
|
|
95
|
+
};
|
|
96
|
+
this.runSyncronization = (id) => {
|
|
97
|
+
return this.activeDirectoryService.runADSynchronization(id);
|
|
98
|
+
};
|
|
99
|
+
this.runSyncOnSuccess = (result) => {
|
|
100
|
+
window.location.reload();
|
|
101
|
+
};
|
|
49
102
|
}
|
|
50
103
|
ngOnInit() {
|
|
51
104
|
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
-
this.
|
|
105
|
+
this.showPageContent = true;
|
|
53
106
|
PageInfoService.PageTitle = this.utilityService.getResourceValue("ActiveDirectories");
|
|
54
107
|
PageInfoService.PageBreadcrumbs = [
|
|
55
108
|
{ title: this.utilityService.getResourceValue("Home"), path: '/Admin/Home', isSeparator: false, isActive: false },
|
|
@@ -58,186 +111,160 @@ export class ActiveDirectoryComponent {
|
|
|
58
111
|
this.pageInfoService.calculateTitle();
|
|
59
112
|
this.pageInfoService.calculateBreadcrumbs();
|
|
60
113
|
this.bbsfTranslateService.onLangChange.subscribe((event) => {
|
|
61
|
-
this.
|
|
62
|
-
this.language = event.lang;
|
|
114
|
+
this.showPageContent = false;
|
|
63
115
|
this.ngOnInit();
|
|
64
116
|
});
|
|
65
|
-
this.language = yield this.utilityService.getCurrentLanguage();
|
|
66
|
-
this.ProductionMode = this.environmentService.getProductionMode();
|
|
67
117
|
this.initializePage();
|
|
68
118
|
});
|
|
69
119
|
}
|
|
70
|
-
|
|
71
|
-
this.ActiveDirectoryForm.controls["searchTextBox"].setValue(null);
|
|
72
|
-
let element = this.input;
|
|
73
|
-
element.ReinitializePaging();
|
|
74
|
-
}
|
|
75
|
-
//initialize filters and load any drop down list
|
|
120
|
+
//initialize filters and paging
|
|
76
121
|
initializePage() {
|
|
77
|
-
// TextBox
|
|
122
|
+
// TextBox init
|
|
78
123
|
this.searchTextBox = new TextBoxOptions();
|
|
79
124
|
this.searchTextBox.Name = "searchTextBox";
|
|
80
125
|
this.searchTextBox.Type = InputType.Text;
|
|
81
126
|
this.searchTextBox.Placeholder = this.utilityService.getResourceValue("SearchByName");
|
|
82
127
|
this.searchTextBox.HideLabel = true;
|
|
83
|
-
this.
|
|
84
|
-
this.
|
|
85
|
-
this.
|
|
86
|
-
this.
|
|
87
|
-
this.
|
|
88
|
-
|
|
89
|
-
this.
|
|
90
|
-
|
|
91
|
-
this.
|
|
92
|
-
this.
|
|
93
|
-
this.
|
|
94
|
-
this.ActiveDirectoryPaging.ValidationToken = this.authService.authorizationHeaderValue();
|
|
95
|
-
setTimeout(() => {
|
|
96
|
-
this.IsFilterLoaded = true;
|
|
97
|
-
}, 10);
|
|
98
|
-
}
|
|
99
|
-
ReinitializeActiveDirectoryPaging() {
|
|
100
|
-
let element = this.input;
|
|
101
|
-
element.ReinitializePaging();
|
|
102
|
-
}
|
|
103
|
-
UpdateActiveDirectoryPaging() {
|
|
104
|
-
let element = this.input;
|
|
105
|
-
element.UpdatePaging();
|
|
128
|
+
this.textInputFilter = new FilterItem();
|
|
129
|
+
this.textInputFilter.FormControlName = "searchTextBox";
|
|
130
|
+
this.textInputFilter.ActionParameterName = "searchText";
|
|
131
|
+
this.textInputFilter.IsFormControl = true;
|
|
132
|
+
this.textInputFilter.FilterType = FilterType.TextBox;
|
|
133
|
+
this.activeDirectoryPaging = new PagingOptions();
|
|
134
|
+
this.activeDirectoryPaging.ActionPostURL = this.apiUrl + 'GetADConnectionByFilter';
|
|
135
|
+
this.activeDirectoryPaging.OnKeyPressFiltersControlNames = ["searchTextBox"];
|
|
136
|
+
this.activeDirectoryPaging.Filters = [this.textInputFilter];
|
|
137
|
+
this.activeDirectoryPaging.ValidationToken = this.authService.authorizationHeaderValue();
|
|
138
|
+
this.isFilterLoaded = true;
|
|
106
139
|
}
|
|
140
|
+
//Paging functions
|
|
107
141
|
setActiveDirectoryListResult(result) {
|
|
108
|
-
this.
|
|
109
|
-
this.
|
|
142
|
+
this.activeDirectoryPagingResult = result;
|
|
143
|
+
this.clientSidePagingResult = result;
|
|
144
|
+
this.showPageContent = true;
|
|
110
145
|
this.utilityService.stopBlockUI();
|
|
111
146
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
let
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
EditModel.SamAccount = ResultModel.EditSamAccount;
|
|
123
|
-
EditModel.Password = ResultModel.EditPassword;
|
|
124
|
-
EditModel.PermissionSetID = ResultModel.EditPermissionSetOptions != null ? Number(ResultModel.EditPermissionSetOptions) : null;
|
|
125
|
-
EditModel.LangKey = ResultModel.EditLanguageOptions;
|
|
126
|
-
EditModel.WelcomeTemplateID = ResultModel.EditWelcomeMsgTemplateOptions != null ? Number(ResultModel.EditWelcomeMsgTemplateOptions) : null;
|
|
127
|
-
EditModel.MarkAsInactive = ResultModel.EditInactive;
|
|
128
|
-
EditModel.AddToDailyJob = ResultModel.EditDailyJob;
|
|
129
|
-
for (let j = 0; j < this.EditMappingsCount; j++) {
|
|
130
|
-
let editMAppingType = ResultModel["ADMappingType" + j];
|
|
131
|
-
if (editMAppingType == undefined)
|
|
132
|
-
continue;
|
|
133
|
-
let editMAppingProperty = ResultModel["ADMappingProperty" + j];
|
|
134
|
-
let editMAppingPropertyName = ResultModel["ADMappingPropertyName" + j];
|
|
135
|
-
let adMAppingObj = new ADMappingModel();
|
|
136
|
-
adMAppingObj.ADMappingTypeItemID = Number(editMAppingType);
|
|
137
|
-
adMAppingObj.BBSFPropertyName = editMAppingProperty;
|
|
138
|
-
adMAppingObj.ADPropertyName = editMAppingPropertyName;
|
|
139
|
-
EditModel.ADMappings.push(adMAppingObj);
|
|
140
|
-
}
|
|
141
|
-
this.ActiveDirectoryService.EditActiveDirectory(EditModel).subscribe((result) => {
|
|
142
|
-
debugger;
|
|
143
|
-
document.getElementById('CloseEditActiveDirectoryModal').click();
|
|
144
|
-
this.EditActiveDirectoryForm.reset();
|
|
145
|
-
let element = this.input;
|
|
146
|
-
element.UpdatePaging();
|
|
147
|
-
}, (error) => {
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
showEditActiveDirectoryModal(ActiveDirectoryID, ActiveDirectoryIDEnc) {
|
|
152
|
-
this.ActiveDirectoryService.GetEditActiveDirectory(ActiveDirectoryIDEnc).subscribe((result) => {
|
|
153
|
-
let dataResult = result;
|
|
154
|
-
//get active directory data
|
|
155
|
-
let activeDirectory = dataResult.model;
|
|
147
|
+
//Edit ActiveDirectory
|
|
148
|
+
showEditActiveDirectoryModal(activeDirectoryID, activeDirectoryIDEnc, editADModal) {
|
|
149
|
+
this.activeDirectoryId = activeDirectoryID;
|
|
150
|
+
this.showWindowsControl = false;
|
|
151
|
+
this.showAzureControl = false;
|
|
152
|
+
this.activeDirectoryService.getEditActiveDirectory(activeDirectoryIDEnc).subscribe((result) => {
|
|
153
|
+
let resultObj = result;
|
|
154
|
+
let activeDirectory = resultObj.model;
|
|
155
|
+
let lists = resultObj.dropdownsData;
|
|
156
|
+
this.editADTypeID = activeDirectory.adTypeItemID;
|
|
156
157
|
//Load ists
|
|
157
|
-
this.
|
|
158
|
-
this.
|
|
159
|
-
this.
|
|
160
|
-
this.mappingTypesList =
|
|
161
|
-
this.mappingPropertiesList =
|
|
162
|
-
this.
|
|
163
|
-
this.
|
|
164
|
-
this.
|
|
165
|
-
this.
|
|
166
|
-
this.
|
|
167
|
-
this.
|
|
168
|
-
this.
|
|
169
|
-
this.
|
|
170
|
-
this.
|
|
171
|
-
this.
|
|
172
|
-
|
|
173
|
-
this.
|
|
174
|
-
this.
|
|
175
|
-
this.
|
|
176
|
-
this.
|
|
177
|
-
this.
|
|
178
|
-
this.
|
|
179
|
-
this.
|
|
180
|
-
this.
|
|
181
|
-
this.
|
|
182
|
-
|
|
183
|
-
this.
|
|
184
|
-
this.
|
|
185
|
-
this.
|
|
186
|
-
this.
|
|
187
|
-
this.
|
|
188
|
-
this.
|
|
189
|
-
this.
|
|
190
|
-
this.
|
|
191
|
-
this.
|
|
192
|
-
this.
|
|
193
|
-
|
|
194
|
-
this.
|
|
195
|
-
this.
|
|
196
|
-
this.
|
|
197
|
-
this.
|
|
198
|
-
this.
|
|
199
|
-
this.
|
|
200
|
-
this.
|
|
201
|
-
this.
|
|
202
|
-
this.
|
|
203
|
-
this.
|
|
204
|
-
this.
|
|
205
|
-
this.
|
|
206
|
-
this.
|
|
207
|
-
this.
|
|
208
|
-
this.
|
|
209
|
-
this.
|
|
210
|
-
this.
|
|
211
|
-
this.
|
|
212
|
-
this.
|
|
213
|
-
this.
|
|
214
|
-
this.
|
|
215
|
-
this.
|
|
216
|
-
|
|
217
|
-
this.
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
158
|
+
this.permissionSetList = lists.permissionSets;
|
|
159
|
+
this.languagesList = lists.languages;
|
|
160
|
+
this.welcomeMsgTempList = lists.templates;
|
|
161
|
+
this.mappingTypesList = lists.mappingTypes;
|
|
162
|
+
this.mappingPropertiesList = lists.mappingProperties;
|
|
163
|
+
this.editActiveDirectoryForm = new FormGroup({});
|
|
164
|
+
this.editActiveDirectoryFormOptions = new FormOptions();
|
|
165
|
+
this.editActiveDirectoryFormOptions.FormGroup = this.editActiveDirectoryForm;
|
|
166
|
+
this.editActiveDirectoryFormOptions.GetModelFunction = this.getEditADModel;
|
|
167
|
+
this.editActiveDirectoryFormOptions.ServiceSubmitFunction = this.getEditADFunction;
|
|
168
|
+
this.editActiveDirectoryFormOptions.PagingReference = this.pagingElement;
|
|
169
|
+
this.editActiveDirectoryFormOptions.PagingActionMode = PagingActionMode.Update;
|
|
170
|
+
this.editName = new TextBoxOptions();
|
|
171
|
+
this.editName.Name = "editName";
|
|
172
|
+
this.editName.LabelKey = "Name";
|
|
173
|
+
this.editName.Type = InputType.Text;
|
|
174
|
+
this.editName.IsRequired = true;
|
|
175
|
+
this.editName.Value = activeDirectory.connectionName;
|
|
176
|
+
let selectedPermissionSet = this.permissionSetList.filter((item) => { return item.key == activeDirectory.permissionSetID; }).map((item) => item.key)[0];
|
|
177
|
+
this.editPermissionSetOptions = new DropdownOptions();
|
|
178
|
+
this.editPermissionSetOptions.Name = "editPermissionSetOptions";
|
|
179
|
+
this.editPermissionSetOptions.LabelKey = "PermissionSet";
|
|
180
|
+
this.editPermissionSetOptions.DataSource = this.permissionSetList;
|
|
181
|
+
this.editPermissionSetOptions.SingleSelection = true;
|
|
182
|
+
this.editPermissionSetOptions.AllowSearchFilter = true;
|
|
183
|
+
this.editPermissionSetOptions.Placeholder = "";
|
|
184
|
+
this.editPermissionSetOptions.IsRequired = true;
|
|
185
|
+
this.editPermissionSetOptions.SelectedItems = selectedPermissionSet;
|
|
186
|
+
let selectedLanguage = this.languagesList.filter((item) => { return item.key == activeDirectory.langKey; }).map((item) => item.key)[0];
|
|
187
|
+
this.editLanguageOptions = new DropdownOptions();
|
|
188
|
+
this.editLanguageOptions.Name = "editLanguageOptions";
|
|
189
|
+
this.editLanguageOptions.LabelValue = "Language";
|
|
190
|
+
this.editLanguageOptions.LabelKey = "Language";
|
|
191
|
+
this.editLanguageOptions.DataSource = this.languagesList;
|
|
192
|
+
this.editLanguageOptions.SingleSelection = true;
|
|
193
|
+
this.editLanguageOptions.AllowSearchFilter = true;
|
|
194
|
+
this.editLanguageOptions.Placeholder = "";
|
|
195
|
+
this.editLanguageOptions.IsRequired = true;
|
|
196
|
+
this.editLanguageOptions.SelectedItems = selectedLanguage;
|
|
197
|
+
let selectedWelcomeMsgTemp = activeDirectory.welcomeTemplateID != null ? this.welcomeMsgTempList.filter((item) => { return item.key == activeDirectory.welcomeTemplateID; }).map((item) => item.key)[0] : null;
|
|
198
|
+
this.editWelcomeMsgTemplateOptions = new DropdownOptions();
|
|
199
|
+
this.editWelcomeMsgTemplateOptions.Name = "editWelcomeMsgTemplateOptions";
|
|
200
|
+
this.editWelcomeMsgTemplateOptions.LabelKey = "WelcomeMsgTemplate";
|
|
201
|
+
this.editWelcomeMsgTemplateOptions.DataSource = this.welcomeMsgTempList;
|
|
202
|
+
this.editWelcomeMsgTemplateOptions.SingleSelection = true;
|
|
203
|
+
this.editWelcomeMsgTemplateOptions.AllowSearchFilter = true;
|
|
204
|
+
this.editWelcomeMsgTemplateOptions.Placeholder = "";
|
|
205
|
+
this.editWelcomeMsgTemplateOptions.IsRequired = false;
|
|
206
|
+
this.editWelcomeMsgTemplateOptions.SelectedItems = selectedWelcomeMsgTemp;
|
|
207
|
+
this.editInactive = new ToggleSlideOptions();
|
|
208
|
+
this.editInactive.Name = "editInactive";
|
|
209
|
+
this.editInactive.Value = activeDirectory.markAsInactive;
|
|
210
|
+
this.editInactive.LabelKey = "MarkAsInactive";
|
|
211
|
+
this.editInactive.ViewType = ControlLayout.Horizontal;
|
|
212
|
+
this.editDailyJob = new ToggleSlideOptions();
|
|
213
|
+
this.editDailyJob.Name = "editDailyJob";
|
|
214
|
+
this.editDailyJob.LabelKey = "AddToDailyJob";
|
|
215
|
+
this.editDailyJob.Value = activeDirectory.addToDailyJob;
|
|
216
|
+
this.editDailyJob.ViewType = ControlLayout.Horizontal;
|
|
217
|
+
//Windows mode
|
|
218
|
+
if (this.editADTypeID == Number(ADType.Windows)) {
|
|
219
|
+
this.editIdentifier = activeDirectory.identifier;
|
|
220
|
+
this.editWindowsTypeName = activeDirectory.adTypeName;
|
|
221
|
+
this.editDomain = new TextBoxOptions();
|
|
222
|
+
this.editDomain.Name = "editDomain";
|
|
223
|
+
this.editDomain.LabelKey = "Domain";
|
|
224
|
+
this.editDomain.Type = InputType.Text;
|
|
225
|
+
this.editDomain.IsRequired = true;
|
|
226
|
+
this.editDomain.Value = activeDirectory.domain;
|
|
227
|
+
this.editSamAccount = new TextBoxOptions();
|
|
228
|
+
this.editSamAccount.Name = "editSamAccount";
|
|
229
|
+
this.editSamAccount.LabelKey = "SamAccount";
|
|
230
|
+
this.editSamAccount.Type = InputType.Text;
|
|
231
|
+
this.editSamAccount.Value = activeDirectory.samAccount;
|
|
232
|
+
this.editPassword = new TextBoxOptions();
|
|
233
|
+
this.editPassword.Name = "editPassword";
|
|
234
|
+
this.editPassword.LabelKey = "Password";
|
|
235
|
+
this.editPassword.Type = InputType.Password;
|
|
236
|
+
this.editPassword.RemoveDefaultPasswordValidation = true;
|
|
237
|
+
this.editPassword.Value = activeDirectory.password;
|
|
238
|
+
this.showWindowsControl = true;
|
|
239
|
+
}
|
|
240
|
+
else if (this.editADTypeID == Number(ADType.Azure)) {
|
|
241
|
+
this.editTenantID = new TextBoxOptions();
|
|
242
|
+
this.editTenantID.Name = "editTenantID";
|
|
243
|
+
this.editTenantID.LabelKey = "TenantID";
|
|
244
|
+
this.editTenantID.Type = InputType.Text;
|
|
245
|
+
this.editTenantID.IsRequired = true;
|
|
246
|
+
this.editTenantID.Value = activeDirectory.tenantID;
|
|
247
|
+
this.editClientID = new TextBoxOptions();
|
|
248
|
+
this.editClientID.Name = "editClientID";
|
|
249
|
+
this.editClientID.LabelKey = "ClientID";
|
|
250
|
+
this.editClientID.Type = InputType.Text;
|
|
251
|
+
this.editClientID.IsRequired = true;
|
|
252
|
+
this.editClientID.Value = activeDirectory.clientID;
|
|
253
|
+
this.editClientSecret = new TextBoxOptions();
|
|
254
|
+
this.editClientSecret.Name = "editClientSecret";
|
|
255
|
+
this.editClientSecret.LabelKey = "ClientSecret";
|
|
256
|
+
this.editClientSecret.Type = InputType.Text;
|
|
257
|
+
this.editClientSecret.IsRequired = true;
|
|
258
|
+
this.editClientSecret.Value = activeDirectory.clientSecret;
|
|
259
|
+
this.showAzureControl = true;
|
|
260
|
+
}
|
|
232
261
|
let data = this.getADMappingOptions(activeDirectory.adMappings);
|
|
233
|
-
this.
|
|
234
|
-
this.
|
|
235
|
-
|
|
236
|
-
this.IsEditActiveDirectoryModalLoaded = true;
|
|
237
|
-
}, 100);
|
|
238
|
-
}, (error) => {
|
|
262
|
+
this.editMappingsOptions = data[0];
|
|
263
|
+
this.editMappingsCount = data[1];
|
|
264
|
+
this.modalService.open(editADModal);
|
|
239
265
|
});
|
|
240
266
|
}
|
|
267
|
+
//AD Mapping functions
|
|
241
268
|
getADMappingOptions(ADMappings) {
|
|
242
269
|
let ADMappingOptions = [];
|
|
243
270
|
let ADMappingCount = 0;
|
|
@@ -264,99 +291,130 @@ export class ActiveDirectoryComponent {
|
|
|
264
291
|
ADMappingPropertyName.HideLabel = true;
|
|
265
292
|
ADMappingPropertyName.Type = InputType.Text;
|
|
266
293
|
ADMappingPropertyName.Value = ADMappings[i].adPropertyName;
|
|
267
|
-
ADMappingPropertyName.IsRequired = false;
|
|
268
294
|
ADMappingPropertyName.ViewType = ControlLayout.Horizontal;
|
|
269
295
|
let ADMappingIncludeUpdate = new CheckBoxOptions();
|
|
270
296
|
ADMappingIncludeUpdate.Name = "ADMappingIncludeUpdate" + i;
|
|
271
297
|
ADMappingIncludeUpdate.Value = ADMappings[i].includeInUpdate;
|
|
272
298
|
ADMappingIncludeUpdate.IsDisabled = true;
|
|
273
|
-
|
|
299
|
+
let ADMappingHiddenIncludeUpdate = new TextBoxOptions();
|
|
300
|
+
ADMappingHiddenIncludeUpdate.Name = "ADMappingHiddenIncludeUpdate" + i;
|
|
301
|
+
ADMappingHiddenIncludeUpdate.HideLabel = true;
|
|
302
|
+
ADMappingHiddenIncludeUpdate.Type = InputType.Text;
|
|
303
|
+
ADMappingHiddenIncludeUpdate.Value = ADMappings[i].includeInUpdate;
|
|
304
|
+
objectMappingOptions.push(ADMappingType, ADMappingProperty, ADMappingPropertyName, ADMappingIncludeUpdate, ADMappingHiddenIncludeUpdate);
|
|
274
305
|
ADMappingOptions.push(objectMappingOptions);
|
|
275
306
|
ADMappingCount += 1;
|
|
276
307
|
}
|
|
277
308
|
return [ADMappingOptions, ADMappingCount];
|
|
278
309
|
}
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
310
|
+
deleteADMapping(deletedADMApping) {
|
|
311
|
+
debugger;
|
|
312
|
+
let deletedMappingIndex = this.editMappingsOptions.indexOf(deletedADMApping);
|
|
313
|
+
if (deletedMappingIndex !== -1) {
|
|
314
|
+
this.editMappingsOptions.splice(deletedMappingIndex, 1);
|
|
315
|
+
for (var i = 0; i < deletedADMApping.length; i++) {
|
|
316
|
+
this.editActiveDirectoryForm.removeControl(deletedADMApping[i].Name);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
287
319
|
}
|
|
288
|
-
|
|
289
|
-
this.
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
320
|
+
addADMapping() {
|
|
321
|
+
let index = this.editMappingsCount;
|
|
322
|
+
let objectMappingOptions = [];
|
|
323
|
+
let ADMappingType = new DropdownOptions();
|
|
324
|
+
ADMappingType.Name = "ADMappingType" + index;
|
|
325
|
+
ADMappingType.HideLabel = true;
|
|
326
|
+
ADMappingType.SingleSelection = true;
|
|
327
|
+
ADMappingType.ViewType = ControlLayout.Horizontal;
|
|
328
|
+
ADMappingType.DataSource = this.mappingTypesList;
|
|
329
|
+
let ADMappingProperty = new DropdownOptions();
|
|
330
|
+
ADMappingProperty.Name = "ADMappingProperty" + index;
|
|
331
|
+
ADMappingProperty.HideLabel = true;
|
|
332
|
+
ADMappingProperty.SingleSelection = true;
|
|
333
|
+
ADMappingProperty.ViewType = ControlLayout.Horizontal;
|
|
334
|
+
ADMappingProperty.DataSource = this.mappingPropertiesList;
|
|
335
|
+
let ADMappingPropertyName = new TextBoxOptions();
|
|
336
|
+
ADMappingPropertyName.Name = "ADMappingPropertyName" + index;
|
|
337
|
+
ADMappingPropertyName.HideLabel = true;
|
|
338
|
+
ADMappingPropertyName.Type = InputType.Text;
|
|
339
|
+
ADMappingPropertyName.IsRequired = false;
|
|
340
|
+
ADMappingPropertyName.ViewType = ControlLayout.Horizontal;
|
|
341
|
+
let ADMappingIncludeUpdate = new CheckBoxOptions();
|
|
342
|
+
ADMappingIncludeUpdate.Name = "ADMappingIncludeUpdate" + index;
|
|
343
|
+
let ADMappingHiddenIncludeUpdate = new TextBoxOptions();
|
|
344
|
+
ADMappingHiddenIncludeUpdate.Name = "ADMappingHiddenIncludeUpdate" + index;
|
|
345
|
+
ADMappingHiddenIncludeUpdate.HideLabel = true;
|
|
346
|
+
ADMappingHiddenIncludeUpdate.Type = InputType.Text;
|
|
347
|
+
objectMappingOptions.push(ADMappingType, ADMappingProperty, ADMappingPropertyName, ADMappingIncludeUpdate, ADMappingHiddenIncludeUpdate);
|
|
348
|
+
this.editMappingsOptions.push(objectMappingOptions);
|
|
349
|
+
this.editMappingsCount += 1;
|
|
296
350
|
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
this.
|
|
300
|
-
|
|
351
|
+
//Delete ACtiveDirectory
|
|
352
|
+
showDeleteActiveDirectoryModal(activeDirectoryID) {
|
|
353
|
+
this.deleteActiveDirectoryId = activeDirectoryID;
|
|
354
|
+
//array sent to service function
|
|
355
|
+
let paramArray = [];
|
|
356
|
+
paramArray.push(this.deleteActiveDirectoryId);
|
|
357
|
+
this.deleteConfirmationOptions = new ConfirmationModalOptions();
|
|
358
|
+
this.deleteConfirmationOptions.ServiceSubmitFunction = this.deleteActiveDirectory;
|
|
359
|
+
this.deleteConfirmationOptions.ServiceSubmitModel = paramArray;
|
|
360
|
+
this.deleteConfirmationOptions.PagingReference = this.pagingElement;
|
|
361
|
+
this.deleteControlLoaded = true;
|
|
301
362
|
setTimeout(() => {
|
|
302
|
-
this.
|
|
303
|
-
|
|
304
|
-
}, 100);
|
|
363
|
+
this.deleteConfirmationModalControl.showModal();
|
|
364
|
+
}, 200);
|
|
305
365
|
}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
366
|
+
//Sync Active Directory
|
|
367
|
+
showADSynchronizationModal(activeDirectoryID) {
|
|
368
|
+
this.syncActiveDirectoryId = activeDirectoryID;
|
|
369
|
+
//array sent to service function
|
|
370
|
+
let paramArray = [];
|
|
371
|
+
paramArray.push(this.syncActiveDirectoryId);
|
|
372
|
+
this.syncConfirmationOptions = new ConfirmationModalOptions();
|
|
373
|
+
this.syncConfirmationOptions.ServiceSubmitFunction = this.runSyncronization;
|
|
374
|
+
this.syncConfirmationOptions.ServiceSubmitModel = paramArray;
|
|
375
|
+
this.syncConfirmationOptions.PagingReference = this.pagingElement;
|
|
376
|
+
this.syncConfirmationOptions.PagingActionMode = PagingActionMode.Reinitialize;
|
|
377
|
+
this.syncConfirmationOptions.ConfirmationHeader = this.utilityService.getResourceValue("RunSynchronization");
|
|
378
|
+
this.syncConfirmationOptions.ConfirmationBody = this.utilityService.getResourceValue("RunSynchronizationConfirmation");
|
|
379
|
+
this.syncConfirmationOptions.StyleConfirmationMode = StyleConfirmationMode.Warning;
|
|
380
|
+
this.syncConfirmationOptions.SubmitButtonText = this.utilityService.getResourceValue("Yes");
|
|
381
|
+
this.syncConfirmationOptions.DisableSuccessNotification = true;
|
|
382
|
+
this.syncConfirmationOptions.OnSuccessHandler = this.runSyncOnSuccess;
|
|
383
|
+
this.syncControlLoaded = true;
|
|
384
|
+
setTimeout(() => {
|
|
385
|
+
this.syncConfirmationModalControl.showModal();
|
|
386
|
+
}, 200);
|
|
314
387
|
}
|
|
315
|
-
|
|
316
|
-
|
|
388
|
+
//Last run logs
|
|
389
|
+
showADLastRunLogsModal(activeDirectoryID, lastRunLogsModal) {
|
|
390
|
+
this.activeDirectoryService.getLastRunLogs(activeDirectoryID).subscribe((result) => {
|
|
317
391
|
let lastRunLogsModel = result;
|
|
318
|
-
this.
|
|
319
|
-
this.
|
|
320
|
-
this.
|
|
321
|
-
setTimeout(() => {
|
|
322
|
-
this.IslastRunLogsModalLoaded = true;
|
|
323
|
-
}, 100);
|
|
324
|
-
}, (error) => {
|
|
392
|
+
this.adConnectionName = lastRunLogsModel.model.adConnectionName;
|
|
393
|
+
this.lastRunLogs = lastRunLogsModel.model.logs;
|
|
394
|
+
this.modalService.open(lastRunLogsModal);
|
|
325
395
|
});
|
|
326
396
|
}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
if (deletedMappingIndex !== -1) {
|
|
331
|
-
this.EditMappingsOptions.splice(deletedMappingIndex, 1);
|
|
332
|
-
for (var i = 0; i < deletedADMApping.length; i++) {
|
|
333
|
-
this.EditActiveDirectoryForm.removeControl(deletedADMApping[i].Name);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
397
|
+
//On destroy
|
|
398
|
+
ngOnDestroy() {
|
|
399
|
+
this.requestHandlerService.destroyHandler();
|
|
336
400
|
}
|
|
337
401
|
}
|
|
338
|
-
ActiveDirectoryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: ActiveDirectoryComponent, deps: [{ token: i1.AuthService }, { token: i2.PageInfoService }, { token: i1.UtilityService }, { token: i1.BBSFTranslateService }, { token:
|
|
339
|
-
ActiveDirectoryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: ActiveDirectoryComponent, selector: "lib-active-directory", viewQueries: [{ propertyName: "input", first: true, predicate: ["ActiveDirectoryPagingViewElement"], descendants: true }, { propertyName: "CloseEditActiveDirectoryModal", first: true, predicate: ["CloseEditActiveDirectoryModal"], descendants: true }, { propertyName: "CloseDeleteActiveDirectoryModal", first: true, predicate: ["CloseDeleteActiveDirectoryModal"], descendants: true }, { propertyName: "CloseLAstRunLogsActiveDirectoryModal", first: true, predicate: ["CloseLAstRunLogsActiveDirectoryModal"], descendants: true }, { propertyName: "CloseSyncActiveDirectoryModal", first: true, predicate: ["CloseSyncActiveDirectoryModal"], descendants: true }], ngImport: i0, template: "<block-ui></block-ui>\r\n\r\n <!-- Page Content -->\r\n <div *ngIf=\"ShowPageContent\" class=\"container-fluid\">\r\n <!-- begin::Header -->\r\n <div class=\"card card-custom-h\">\r\n <div class=\"card-header border-0 pt-5\">\r\n <div class=\"card-title align-items-start flex-column\" *ngIf=\"IsFilterLoaded\">\r\n <form [formGroup]=\"ActiveDirectoryForm\">\r\n <BBSF-TextBox [options]=\"searchTextBox\" [group]=\"ActiveDirectoryForm\"></BBSF-TextBox>\r\n </form>\r\n </div>\r\n <div class=\"card-toolbar\">\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" title='{{utilityService.getResourceValue(\"Add\")}}' [routerLink]=\"['/Admin/ADConnection/Add']\">\r\n <i class=\"fas fa-plus me-1\"></i>\r\n {{utilityService.getResourceValue(\"Add\")}}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-3\">\r\n <!--begin::ActiveDirectory list-->\r\n <div class=\"table-responsive\">\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Name\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Type\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"PermissionSet\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"AdConnectionRunningNow\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"ActiveDirectoryIdentifier\")}}</th>\r\n <th class=\"min-w-50px\">{{utilityService.getResourceValue(\"Actions\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let activeDirectory of ActiveDirectoryPagingResult\">\r\n\r\n <td class=\"text-dark\">\r\n {{activeDirectory.name}}\r\n </td>\r\n <td>\r\n {{activeDirectory.adConnectionTypeName}}\r\n </td>\r\n <td>\r\n {{activeDirectory.permissionSetName}}\r\n </td>\r\n <td>\r\n <span class=\"badge badge-light-success\" *ngIf=\"activeDirectory.isRunningNow;else not_Running\">\r\n {{utilityService.getResourceValue(\"Yes\")}}\r\n </span>\r\n <ng-template #not_Running>\r\n <span class=\"badge badge-light-danger\">\r\n {{utilityService.getResourceValue(\"No\")}}\r\n </span>\r\n </ng-template>\r\n </td>\r\n <td>\r\n {{activeDirectory.identifier}}\r\n </td>\r\n <td>\r\n {{activeDirectory.name}}\r\n </td>\r\n <td>\r\n <div>\r\n <button mat-button [matMenuTriggerFor]=\"menu\" class=\"btn btn-sm btn-icon btn-light btn-active-light-primary\">\r\n <i class=\"fa fa-ellipsis-h\" aria-hidden=\"true\"></i>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <a class=\"drop-item px-3\" ngbDropdownItem data-toggle=\"modal\" data-target=\"#editActiveDirectoryModal\"\r\n (click)=\"showEditActiveDirectoryModal(activeDirectory.id,activeDirectory.idEncrypted)\">\r\n <span class=\"drop-link px-3\">{{utilityService.getResourceValue(\"Edit\")}}</span>\r\n </a>\r\n <a ngbDropdownItem class=\"drop-item px-3\" data-toggle=\"modal\" data-target=\"#deleteActiveDirectoryModal\"\r\n (click)=\"showDeleteActiveDirectoryModal(activeDirectory)\">\r\n <span class=\"drop-link px-3\">{{utilityService.getResourceValue(\"Delete\")}}</span>\r\n </a>\r\n <a ngbDropdownItem class=\"drop-item px-3\" data-toggle=\"modal\" data-target=\"#synchronizationModal\"\r\n (click)=\"showADSynchronizationModal(activeDirectory.idEncrypted)\">\r\n <span class=\"drop-link px-3\">{{utilityService.getResourceValue(\"ActiveDirectoryRunSyncronization\")}}</span>\r\n </a>\r\n <a ngbDropdownItem class=\"drop-item px-3\" data-toggle=\"modal\" data-target=\"#lastRunLogsModal\"\r\n (click)=\"showADLastRunLogsModal(activeDirectory.idEncrypted)\">\r\n <span class=\"drop-link px-3\">{{utilityService.getResourceValue(\"ActiveDirectoryLastRunLogs\")}}</span>\r\n </a>\r\n </mat-menu>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"ActiveDirectoryPagingResult.length == 0\">\r\n <td colspan=\"6\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <!--end::Active directory list-->\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setActiveDirectoryListResult($event)\" *ngIf=\"IsFilterLoaded\"\r\n [options]=\"ActiveDirectoryPaging\" [group]=\"ActiveDirectoryForm\" #ActiveDirectoryPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- Edit Modal -->\r\n <div class=\"modal fade\" id=\"editActiveDirectoryModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <form [formGroup]=\"EditActiveDirectoryForm\" *ngIf=\"IsEditActiveDirectoryModalLoaded\" (ngSubmit)=\"editActiveDirectory()\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\">{{utilityService.getResourceValue(\"Edit\")}} {{utilityService.getResourceValue(\"ActiveDirectory\")}}</h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-icon\">\r\n <i class=\"fa fa-times\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <BBSF-TextBox [options]=\"EditName\" [group]=\"EditActiveDirectoryForm\">\r\n </BBSF-TextBox>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <BBSF-DropdownList [options]=\"EditPermissionSetOptions\" [group]=\"EditActiveDirectoryForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <BBSF-DropdownList [options]=\"EditLanguageOptions\" [group]=\"EditActiveDirectoryForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <BBSF-DropdownList [options]=\"EditWelcomeMsgTemplateOptions\" [group]=\"EditActiveDirectoryForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <h6>\r\n {{utilityService.getResourceValue(\"Identifier\")}}\r\n </h6>\r\n <label>\r\n {{EditIdentifier}}\r\n </label>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <h6>\r\n {{utilityService.getResourceValue(\"Type\")}}\r\n </h6>\r\n <label>\r\n {{EditTypeName}}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-TextBox [options]=\"EditDomain\" [group]=\"EditActiveDirectoryForm\">\r\n </BBSF-TextBox>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <BBSF-TextBox [options]=\"EditSamAccount\" [group]=\"EditActiveDirectoryForm\">\r\n </BBSF-TextBox>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <BBSF-TextBox [options]=\"EditPassword\" [group]=\"EditActiveDirectoryForm\">\r\n </BBSF-TextBox>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <BBSF-Toggleslide [options]=\"EditInactive\" [group]=\"EditActiveDirectoryForm\">\r\n </BBSF-Toggleslide>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <BBSF-Toggleslide [options]=\"EditDailyJob\" [group]=\"EditActiveDirectoryForm\">\r\n </BBSF-Toggleslide>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <table class=\"table amsx-table-users\">\r\n <thead>\r\n <tr>\r\n <th>{{utilityService.getResourceValue(\"Type\")}}</th>\r\n <th>{{utilityService.getResourceValue(\"Property\")}}</th>\r\n <th>{{utilityService.getResourceValue(\"ActiveDirectory_Property\")}}</th>\r\n <th>{{utilityService.getResourceValue(\"IncludeInUpdate\")}}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let option of EditMappingsOptions;let i=index;\">\r\n\r\n <td>\r\n <BBSF-DropdownList [options]=\"option[0]\" [group]=\"EditActiveDirectoryForm\">\r\n </BBSF-DropdownList>\r\n </td>\r\n <td>\r\n <BBSF-DropdownList [options]=\"option[1]\" [group]=\"EditActiveDirectoryForm\">\r\n </BBSF-DropdownList>\r\n </td>\r\n <td>\r\n <BBSF-TextBox [options]=\"option[2]\" [group]=\"EditActiveDirectoryForm\">\r\n </BBSF-TextBox>\r\n </td>\r\n <td>\r\n <BBSF-CheckBox [options]=\"option[3]\" [group]=\"EditActiveDirectoryForm\">\r\n </BBSF-CheckBox>\r\n </td>\r\n\r\n <td class=\"text-center align-middle\">\r\n <a class=\"kt-nav__link\" (click)=\"deleteADMapping(option)\">\r\n <i class=\"kt-nav__link-icon fa fa-trash hidden\" aria-hidden=\"true\"></i>\r\n </a>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"EditMappingsOptions.length == 0\">\r\n <td colspan=\"5\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n\r\n\r\n <!--<lib-provider-attributes [ProviderAttributes]=\"ProviderAttributes\"></lib-provider-attributes>-->\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button #CloseEditActiveDirectoryModal id=\"CloseEditActiveDirectoryModal\" type=\"button\"\r\n class=\"btn btn-secondary\" data-dismiss=\"modal\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"submit\" class=\"btn btn-primary\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Delete Modal -->\r\n <div class=\"modal fade\" id=\"deleteActiveDirectoryModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <form *ngIf=\"IsOpenDeleteActiveDirectoryModal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\">{{utilityService.getResourceValue(\"Delete\")}} {{utilityService.getResourceValue(\"ActiveDirectory\")}}</h5>\r\n\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-icon\">\r\n <i class=\"fa fa-times\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"note note-warning text-center\">\r\n <h3>\r\n {{utilityService.getResourceValue(\"Delete_Question\")}}\r\n </h3>\r\n </div>\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button #CloseDeleteActiveDirectoryModal id=\"CloseDeleteActiveDirectoryModal\" type=\"button\"\r\n class=\"btn btn-secondary\" data-dismiss=\"modal\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"deleteActiveDirectory()\"\r\n class=\"btn btn-danger\">\r\n {{utilityService.getResourceValue(\"Delete\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- View Last Run Logsl -->\r\n <div id=\"lastRunLogsModal\" class=\"modal fade example-modal-lg\" aria-labelledby=\"exampleOptionalLarge\" data-backdrop=\"static\" role=\"dialog\" tabindex=\"-1\" style=\"display: none;\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-simple modal-lg\">\r\n <div id=\"generateCodeParent\" class=\"modal-content\">\r\n <form [formGroup]=\"lastRunLogsForm\" *ngIf=\"IslastRunLogsModalLoaded\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title\">{{utilityService.getResourceValue(\"ActiveDirectoryLastRunLogs\")}} : {{ADConnectionName}}</h5>\r\n <button type=\"button\" class=\"close btn btn-icon\" data-dismiss=\"modal\" aria-label=\"Close\">\r\n <i class=\"fa fa-times\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <!--<div class=\"col-md-12\">\r\n <input type=\"button\" value=\"CopyToClipboard\" (click)=\"copyToClipboard()\" class=\"btn btn-success float-right\" />\r\n </div>-->\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <p>{{utilityService.getResourceValue(\"Name\")}} : {{ADConnectionName}}</p>\r\n <pre class=\"col-md-12\">{{LastRunLogs}}</pre>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button #CloseLAstRunLogsActiveDirectoryModal id=\"CloseLAstRunLogsActiveDirectoryModal\" type=\"button\"\r\n class=\"btn btn-secondary\" data-dismiss=\"modal\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Synchronization Modal -->\r\n <div class=\"modal fade\" id=\"synchronizationModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <form *ngIf=\"IsOpenSyncActiveDirectoryModal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-icon\">\r\n <i class=\"fa fa-times\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"note note-warning text-center\">\r\n <h3>\r\n {{utilityService.getResourceValue(\"SynchronizeConfirmation\")}}\r\n </h3>\r\n </div>\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button #CloseSyncActiveDirectoryModal id=\"CloseSyncActiveDirectoryModal\" type=\"button\"\r\n class=\"btn btn-secondary\" data-dismiss=\"modal\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"runSyncronization()\"\r\n class=\"btn btn-danger\">\r\n {{utilityService.getResourceValue(\"Yes\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n", components: [{ type: i4.BlockUIComponent, selector: "block-ui", inputs: ["name", "template", "message", "delayStart", "delayStop"] }, { type: i5.ɵd, selector: "BBSF-TextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i6.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i7.EmptyDataComponent, selector: "lib-empty-data", inputs: ["Message", "ShowImage", "ImgURL"] }, { type: i5.ɵs, selector: "BBSF-Paging", inputs: ["options", "group"], outputs: ["Items"] }, { type: i5.ɵh, selector: "BBSF-DropdownList", inputs: ["group", "options"], outputs: ["OnChange", "onClear"] }, { type: i5.ɵj, selector: "BBSF-Toggleslide", inputs: ["group", "options"] }, { type: i5.ɵg, selector: "BBSF-CheckBox", inputs: ["group", "options"], outputs: ["OnChange"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i9.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i10.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["routerLink", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["matMenuTriggerRestoreFocus", "mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { type: i11.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { type: i9.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] });
|
|
402
|
+
ActiveDirectoryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: ActiveDirectoryComponent, deps: [{ token: i1.AuthService }, { token: i2.PageInfoService }, { token: i1.UtilityService }, { token: i1.BBSFTranslateService }, { token: i3.ActiveDirectoryService }, { token: i4.NgbModal }, { token: i1.RequestHandlerService }], target: i0.ɵɵFactoryTarget.Component });
|
|
403
|
+
ActiveDirectoryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: ActiveDirectoryComponent, selector: "lib-active-directory", viewQueries: [{ propertyName: "pagingElement", first: true, predicate: ["activeDirectoryPagingViewElement"], descendants: true }, { propertyName: "deleteConfirmationModalControl", first: true, predicate: ["deleteConfirmationModalControl"], descendants: true }, { propertyName: "syncConfirmationModalControl", first: true, predicate: ["syncConfirmationModalControl"], descendants: true }], ngImport: i0, template: "<block-ui></block-ui>\r\n\r\n<!-- Page Content -->\r\n<div *ngIf=\"showPageContent\" class=\"container-fluid\">\r\n <!-- begin::Header -->\r\n <div class=\"card card-custom-h\">\r\n <div class=\"card-header border-0 pt-5\">\r\n <div class=\"card-title align-items-start flex-column\" *ngIf=\"isFilterLoaded\">\r\n <form [formGroup]=\"activeDirectoryForm\">\r\n <BBSF-TextBox [options]=\"searchTextBox\" [group]=\"activeDirectoryForm\"></BBSF-TextBox>\r\n </form>\r\n </div>\r\n <div class=\"card-toolbar\">\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" title='{{utilityService.getResourceValue(\"Add\")}}' [routerLink]=\"['/Admin/ADConnection/Add']\">\r\n <i class=\"fas fa-plus me-1\"></i>\r\n {{utilityService.getResourceValue(\"Add\")}}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-3\">\r\n <!--begin::ActiveDirectory list-->\r\n <div class=\"table-responsive\">\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Name\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Type\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"PermissionSet\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"AdConnectionRunningNow\")}}</th>\r\n <th class=\"min-w-50px\">{{utilityService.getResourceValue(\"Actions\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let activeDirectory of clientSidePagingResult\">\r\n\r\n <td class=\"text-dark\">\r\n {{activeDirectory.name}}\r\n </td>\r\n <td>\r\n {{activeDirectory.adTypeName}}\r\n </td>\r\n <td>\r\n {{activeDirectory.permissionSetName}}\r\n </td>\r\n <td>\r\n <span class=\"badge badge-light-success\" *ngIf=\"activeDirectory.isRunningNow;else not_Running\">\r\n {{utilityService.getResourceValue(\"Yes\")}}\r\n </span>\r\n <ng-template #not_Running>\r\n <span class=\"badge badge-light-danger\">\r\n {{utilityService.getResourceValue(\"No\")}}\r\n </span>\r\n </ng-template>\r\n </td>\r\n <td>\r\n <div>\r\n <button mat-button [matMenuTriggerFor]=\"menu\" class=\"btn btn-sm btn-icon btn-light btn-active-light-primary\">\r\n <i class=\"fa fa-ellipsis-h\" aria-hidden=\"true\"></i>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <a class=\"drop-item px-3\" ngbDropdownItem\r\n (click)=\"showEditActiveDirectoryModal(activeDirectory.id,activeDirectory.idEncrypted,editActiveDirectoryModal)\">\r\n <span class=\"drop-link px-3\">{{utilityService.getResourceValue(\"Edit\")}}</span>\r\n </a>\r\n <a ngbDropdownItem class=\"drop-item px-3\"\r\n (click)=\"showDeleteActiveDirectoryModal(activeDirectory.idEncrypted)\">\r\n <span class=\"drop-link px-3\">{{utilityService.getResourceValue(\"Delete\")}}</span>\r\n </a>\r\n <a ngbDropdownItem class=\"drop-item px-3\"\r\n (click)=\"showADSynchronizationModal(activeDirectory.idEncrypted)\">\r\n <span class=\"drop-link px-3\">{{utilityService.getResourceValue(\"ActiveDirectoryRunSyncronization\")}}</span>\r\n </a>\r\n <a ngbDropdownItem class=\"drop-item px-3\"\r\n (click)=\"showADLastRunLogsModal(activeDirectory.idEncrypted,lastRunLogsModal)\">\r\n <span class=\"drop-link px-3\">{{utilityService.getResourceValue(\"ActiveDirectoryLastRunLogs\")}}</span>\r\n </a>\r\n </mat-menu>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"clientSidePagingResult.length == 0\">\r\n <td colspan=\"5\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <!--end::Active directory list-->\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setActiveDirectoryListResult($event)\" *ngIf=\"isFilterLoaded\"\r\n [options]=\"activeDirectoryPaging\" [group]=\"activeDirectoryForm\" #activeDirectoryPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<!-- Edit Modal -->\r\n<ng-template #editActiveDirectoryModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-sm btn-icon btn-active-color-primary\" (click)=\"modal.dismiss()\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">\r\n {{utilityService.getResourceValue(\"Edit\")}} {{utilityService.getResourceValue(\"ActiveDirectory\")}}\r\n </h1>\r\n </div>\r\n <BBSF-Form [options]=\"editActiveDirectoryFormOptions\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <BBSF-TextBox [options]=\"editName\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-TextBox>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <BBSF-DropdownList [options]=\"editPermissionSetOptions\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <BBSF-DropdownList [options]=\"editLanguageOptions\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <BBSF-DropdownList [options]=\"editWelcomeMsgTemplateOptions\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <h6>\r\n {{utilityService.getResourceValue(\"ADType\")}}\r\n </h6>\r\n <label>\r\n {{editADTypeName}}\r\n </label>\r\n </div>\r\n </div>\r\n <div *ngIf=\"showWindowsControl\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <h6>\r\n {{utilityService.getResourceValue(\"Identifier\")}}\r\n </h6>\r\n <label>\r\n {{editIdentifier}}\r\n </label>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <h6>\r\n {{utilityService.getResourceValue(\"Type\")}}\r\n </h6>\r\n <label>\r\n {{editWindowsTypeName}}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-TextBox [options]=\"editDomain\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-TextBox>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <BBSF-TextBox [options]=\"editSamAccount\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-TextBox>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <BBSF-TextBox [options]=\"editPassword\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-TextBox>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"showAzureControl\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-TextBox [options]=\"editTenantID\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-TextBox>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-TextBox [options]=\"editClientID\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-TextBox>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-TextBox [options]=\"editClientSecret\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-TextBox>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <BBSF-Toggleslide [options]=\"editInactive\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-Toggleslide>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <BBSF-Toggleslide [options]=\"editDailyJob\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-Toggleslide>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <table class=\"table amsx-table-users\">\r\n <thead>\r\n <tr>\r\n <th>{{utilityService.getResourceValue(\"Type\")}}</th>\r\n <th>{{utilityService.getResourceValue(\"Property\")}}</th>\r\n <th>{{utilityService.getResourceValue(\"ActiveDirectory_Property\")}}</th>\r\n <th>{{utilityService.getResourceValue(\"IncludeInUpdate\")}}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let option of editMappingsOptions;let i=index;\">\r\n\r\n <td>\r\n <BBSF-DropdownList [options]=\"option[0]\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-DropdownList>\r\n </td>\r\n <td>\r\n <BBSF-DropdownList [options]=\"option[1]\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-DropdownList>\r\n </td>\r\n <td>\r\n <BBSF-TextBox [options]=\"option[2]\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-TextBox>\r\n </td>\r\n <td>\r\n <BBSF-CheckBox [options]=\"option[3]\" [group]=\"editActiveDirectoryForm\">\r\n </BBSF-CheckBox>\r\n <!--Hidden include in update value-->\r\n <BBSF-TextBox [options]=\"option[4]\" [group]=\"editActiveDirectoryForm\" [hidden]=\"true\">\r\n </BBSF-TextBox>\r\n </td>\r\n\r\n <td class=\"text-center align-middle\">\r\n <a class=\"kt-nav__link\" (click)=\"deleteADMapping(option)\">\r\n <i class=\"kt-nav__link-icon fa fa-trash hidden\" aria-hidden=\"true\"></i>\r\n </a>\r\n </td>\r\n </tr>\r\n <tr>\r\n <td colspan=\"5\">\r\n <button type=\"button\" class=\"w-100 btn btn-success\" (click)=\"addADMapping()\">\r\n {{utilityService.getResourceValue(\"AddNewRecord\")}}\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n </div>\r\n <div class=\"text-center pt-7\">\r\n <button #CloseEditADModal id=\"CloseEditADModal\" type=\"button\"\r\n data-dismiss=\"modal\" (click)=\"modal.dismiss()\" class=\"btn btn-light me-3 btn-sm\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </BBSF-Form>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Delete Modal -->\r\n<BBSF-ConfirmationModal *ngIf=\"deleteControlLoaded\" [options]=\"deleteConfirmationOptions\" id=\"deleteConfirmationModalControl\" #deleteConfirmationModalControl></BBSF-ConfirmationModal>\r\n\r\n<!-- Synchronization Modal -->\r\n<BBSF-ConfirmationModal *ngIf=\"syncControlLoaded\" [options]=\"syncConfirmationOptions\" id=\"syncConfirmationModalControl\" #syncConfirmationModalControl></BBSF-ConfirmationModal>\r\n\r\n<!-- View Last Run Logs -->\r\n<ng-template #lastRunLogsModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-sm btn-icon btn-active-color-primary\" (click)=\"modal.dismiss()\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"ActiveDirectoryLastRunLogs\")}} : {{adConnectionName}}</h1>\r\n </div>\r\n <div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <p>{{utilityService.getResourceValue(\"Name\")}} : {{adConnectionName}}</p>\r\n <pre class=\"col-md-12\">{{lastRunLogs}}</pre>\r\n </div>\r\n </div>\r\n <div class=\"text-center pt-7\">\r\n <button #CloseDefaultProviderModal id=\"CloseDefaultProviderModal\" type=\"button\"\r\n class=\"btn btn-light btn-sm me-3 \" data-dismiss=\"modal\" (click)=\"modal.dismiss()\">\r\n {{utilityService.getResourceValue(\"Close\")}}\r\n </button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n", components: [{ type: i5.BlockUIComponent, selector: "block-ui", inputs: ["name", "template", "message", "delayStart", "delayStop"] }, { type: i6.ɵd, selector: "BBSF-TextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i8.EmptyDataComponent, selector: "lib-empty-data", inputs: ["Message", "ShowImage", "ImgURL"] }, { type: i6.ɵs, selector: "BBSF-Paging", inputs: ["options", "group"], outputs: ["Items"] }, { type: i6.ɵv, selector: "BBSF-Form", inputs: ["options"] }, { type: i6.ɵh, selector: "BBSF-DropdownList", inputs: ["group", "options"], outputs: ["OnChange", "onClear"] }, { type: i6.ɵj, selector: "BBSF-Toggleslide", inputs: ["group", "options"] }, { type: i6.ɵg, selector: "BBSF-CheckBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i6.ɵw, selector: "BBSF-ConfirmationModal", inputs: ["options"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i11.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["routerLink", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["matMenuTriggerRestoreFocus", "mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { type: i4.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { type: i12.InlineSVGDirective, selector: "[inlineSVG]", inputs: ["resolveSVGUrl", "replaceContents", "prepend", "injectComponent", "cacheSVG", "forceEvalStyles", "evalScripts", "inlineSVG", "setSVGAttributes", "removeSVGAttributes", "fallbackImgUrl", "onSVGLoaded"], outputs: ["onSVGInserted", "onSVGFailed"] }] });
|
|
340
404
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: ActiveDirectoryComponent, decorators: [{
|
|
341
405
|
type: Component,
|
|
342
406
|
args: [{
|
|
343
407
|
selector: 'lib-active-directory',
|
|
344
408
|
templateUrl: './active-directory.component.html'
|
|
345
409
|
}]
|
|
346
|
-
}], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.PageInfoService }, { type: i1.UtilityService }, { type: i1.BBSFTranslateService }, { type:
|
|
347
|
-
type: ViewChild,
|
|
348
|
-
args: ['ActiveDirectoryPagingViewElement', { static: false }]
|
|
349
|
-
}], CloseEditActiveDirectoryModal: [{
|
|
350
|
-
type: ViewChild,
|
|
351
|
-
args: ['CloseEditActiveDirectoryModal', { static: false }]
|
|
352
|
-
}], CloseDeleteActiveDirectoryModal: [{
|
|
410
|
+
}], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.PageInfoService }, { type: i1.UtilityService }, { type: i1.BBSFTranslateService }, { type: i3.ActiveDirectoryService }, { type: i4.NgbModal }, { type: i1.RequestHandlerService }]; }, propDecorators: { pagingElement: [{
|
|
353
411
|
type: ViewChild,
|
|
354
|
-
args: ['
|
|
355
|
-
}],
|
|
412
|
+
args: ['activeDirectoryPagingViewElement', { static: false }]
|
|
413
|
+
}], deleteConfirmationModalControl: [{
|
|
356
414
|
type: ViewChild,
|
|
357
|
-
args: ['
|
|
358
|
-
}],
|
|
415
|
+
args: ['deleteConfirmationModalControl', { static: false }]
|
|
416
|
+
}], syncConfirmationModalControl: [{
|
|
359
417
|
type: ViewChild,
|
|
360
|
-
args: ['
|
|
418
|
+
args: ['syncConfirmationModalControl', { static: false }]
|
|
361
419
|
}] } });
|
|
362
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlLWRpcmVjdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL0FjdGl2ZURpcmVjdG9yaWVzL2FjdGl2ZS1kaXJlY3RvcnkvYWN0aXZlLWRpcmVjdG9yeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL0FjdGl2ZURpcmVjdG9yaWVzL2FjdGl2ZS1kaXJlY3RvcnkvYWN0aXZlLWRpcmVjdG9yeS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBc0IsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhMLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7Ozs7Ozs7QUFRckYsTUFBTSxPQUFPLHdCQUF3QjtJQXFFbkMsWUFBb0IsV0FBd0IsRUFBVSxlQUFnQyxFQUFTLGNBQThCLEVBQVUsb0JBQTBDLEVBQVUsa0JBQXNDLEVBQVUsc0JBQThDO1FBQXJRLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQVMsbUJBQWMsR0FBZCxjQUFj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aGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENoZWNrQm94T3B0aW9ucywgQ29udHJvbExheW91dCwgRHJvcGRvd25PcHRpb25zLCBGaWx0ZXJJdGVtLCBGaWx0ZXJUeXBlLCBJbnB1dFR5cGUsIFBhZ2luZ09wdGlvbnMsIFRleHRCb3hPcHRpb25zLCBUb2dnbGVTbGlkZU9wdGlvbnMgfSBmcm9tICdAYm5zaWdodHMvYmJzZi1jb250cm9scyc7XHJcbmltcG9ydCB7IEFjdGl2ZURpcmVjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvU2VydmljZXMvQWN0aXZlRGlyZWN0b3J5U2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWN0aXZlRGlyZWN0b3J5QWRkRWRpdE1vZGVsIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9BRE1vZGVscy9BY3RpdmVEaXJlY3RvcnlBZGRFZGl0TW9kZWwnO1xyXG5pbXBvcnQgeyBBRE1hcHBpbmdNb2RlbCB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvQURNb2RlbHMvQURNYXBwaW5nTW9kZWwnO1xyXG5pbXBvcnQgeyBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9fbWV0cm9uaWMvY29yZS9zZXJ2aWNlcy9wYWdlLWluZm8uc2VydmljZSc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlLCBVdGlsaXR5U2VydmljZSwgQkJTRlRyYW5zbGF0ZVNlcnZpY2UsIEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJ0BibnNpZ2h0cy9iYnNmLXV0aWxpdGllcyc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYWN0aXZlLWRpcmVjdG9yeScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FjdGl2ZS1kaXJlY3RvcnkuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBY3RpdmVEaXJlY3RvcnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBBcGlVcmwgPSBcIi9hcGkvYWRtaW4vQURDb25uZWN0aW9uL1wiO1xyXG4gIHNlYXJjaFRleHRCb3g6IFRleHRCb3hPcHRpb25zO1xyXG4gIFNob3dQYWdlQ29udGVudCA9IGZhbHNlO1xyXG4gIFBlcm1pc3Npb25TZXRMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIExhbmd1YWdlc0xpc3Q6IGFueVtdID0gW107XHJcbiAgV2VsY29tZU1zZ1RlbXBMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIG1hcHBpbmdUeXBlc0xpc3Q6IGFueVtdID0gW107XHJcbiAgbWFwcGluZ1Byb3BlcnRpZXNMaXN0OiBhbnlbXSA9IFtdO1xyXG5cclxuICBBY3RpdmVEaXJlY3RvcnlGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgc2hvd0ZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEFjdGl2ZURpcmVjdG9yeVBhZ2luZ1Jlc3VsdDogYW55W10gPSBbXTtcclxuICBBY3RpdmVEaXJlY3RvcnlQYWdpbmc6IFBhZ2luZ09wdGlvbnM7XHJcbiAgVGV4dElucHV0RmlsdGVyOiBGaWx0ZXJJdGVtO1xyXG4gIElzRmlsdGVyTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgUHJvZHVjdGlvbk1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdBY3RpdmVEaXJlY3RvcnlQYWdpbmdWaWV3RWxlbWVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBpbnB1dDogRWxlbWVudFJlZjtcclxuXHJcbiAgLy8vL0VkaXQgTW9kZWwgQ29udHJvbHNcclxuICBFZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIEVkaXROYW1lOiBUZXh0Qm94T3B0aW9ucztcclxuICBFZGl0RG9tYWluOiBUZXh0Qm94T3B0aW9ucztcclxuICBFZGl0U2FtQWNjb3VudDogVGV4dEJveE9wdGlvbnM7XHJcbiAgRWRpdElkZW50aWZpZXI6IHN0cmluZztcclxuICBFZGl0VHlwZU5hbWU6IHN0cmluZztcclxuICBFZGl0UGFzc3dvcmQ6IFRleHRCb3hPcHRpb25zO1xyXG4gIEVkaXRJbmFjdGl2ZTogVG9nZ2xlU2xpZGVPcHRpb25zO1xyXG4gIEVkaXREYWlseUpvYjogVG9nZ2xlU2xpZGVPcHRpb25zO1xyXG4gIEVkaXRQZXJtaXNzaW9uU2V0T3B0aW9uczogRHJvcGRvd25PcHRpb25zO1xyXG4gIEVkaXRMYW5ndWFnZU9wdGlvbnM6IERyb3Bkb3duT3B0aW9ucztcclxuICBFZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9uczogRHJvcGRvd25PcHRpb25zO1xyXG4gIEVkaXRNYXBwaW5nc09wdGlvbnM6IGFueVtdID0gW107XHJcbiAgRWRpdE1hcHBpbmdzQ291bnQ6IG51bWJlcjtcclxuICAvL0VkaXRQcm92aWRlclR5cGVJdGVtSUQ6IG51bWJlciA9IDA7XHJcbiAgLy9FZGl0UHJvdmlkZXJBdHRyaWJ1dGVzT3B0aW9uczogYW55W10gPSBbXTtcclxuICAvL0VkaXRQcm92aWRlckF0dHJpYnV0ZXNDb3VudDogbnVtYmVyID0gMDtcclxuXHJcblxyXG4gIElzRWRpdEFjdGl2ZURpcmVjdG9yeU1vZGFsTG9hZGVkOiBib29sZWFuO1xyXG4gIEFjdGl2ZURpcmVjdG9yeUlkOiBudW1iZXI7XHJcbiAgQFZpZXdDaGlsZCgnQ2xvc2VFZGl0QWN0aXZlRGlyZWN0b3J5TW9kYWwnLCB7IHN0YXRpYzogZmFsc2UgfSkgQ2xvc2VFZGl0QWN0aXZlRGlyZWN0b3J5TW9kYWw6IEVsZW1lbnRSZWY7XHJcblxyXG4gIC8vLy9kZWxldGUgIE1vZGVsIENvbnRyb2xzXHJcbiAgLy9kZWxldGVQcm92aWRlckxpc3Q6IGFueVtdID0gW11cclxuICAvL0lzT3BlbkRlbGV0ZVByb3ZpZGVyTW9kYWw6IGJvb2xlYW4gPSBmYWxzZVxyXG4gIC8vQFZpZXdDaGlsZCgnQ2xvc2VEZWxldGVQcm92aWRlck1vZGFsJywgeyBzdGF0aWM6IGZhbHNlIH0pIENsb3NlRGVsZXRlUHJvdmlkZXJNb2RhbDogRWxlbWVudFJlZjtcclxuXHJcbiAgLy9kZWxldGUgIE1vZGVsIENvbnRyb2xzXHJcbiAgZGVsZXRlQWN0aXZlRGlyZWN0b3J5SWQ6IHN0cmluZztcclxuICBJc09wZW5EZWxldGVBY3RpdmVEaXJlY3RvcnlNb2RhbDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgQFZpZXdDaGlsZCgnQ2xvc2VEZWxldGVBY3RpdmVEaXJlY3RvcnlNb2RhbCcsIHsgc3RhdGljOiBmYWxzZSB9KSBDbG9zZURlbGV0ZUFjdGl2ZURpcmVjdG9yeU1vZGFsOiBFbGVtZW50UmVmO1xyXG5cclxuICAvL0xhc3QgcnVuIGxvZ3NcclxuICBsYXN0UnVuTG9nc0Zvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBBRENvbm5lY3Rpb25OYW1lOiBzdHJpbmc7XHJcbiAgTGFzdFJ1bkxvZ3M6IHN0cmluZztcclxuICBJc2xhc3RSdW5Mb2dzTW9kYWxMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdDbG9zZUxBc3RSdW5Mb2dzQWN0aXZlRGlyZWN0b3J5TW9kYWwnLCB7IHN0YXRpYzogZmFsc2UgfSkgQ2xvc2VMQXN0UnVuTG9nc0FjdGl2ZURpcmVjdG9yeU1vZGFsOiBFbGVtZW50UmVmO1xyXG5cclxuXHJcbiAgLy9TeW5jaHJvbml6YXRpb24gbW9kYWxcclxuICBzeW5jQWN0aXZlRGlyZWN0b3J5SWQ6IHN0cmluZztcclxuICBJc09wZW5TeW5jQWN0aXZlRGlyZWN0b3J5TW9kYWw6IGJvb2xlYW4gPSBmYWxzZVxyXG4gIEBWaWV3Q2hpbGQoJ0Nsb3NlU3luY0FjdGl2ZURpcmVjdG9yeU1vZGFsJywgeyBzdGF0aWM6IGZhbHNlIH0pIENsb3NlU3luY0FjdGl2ZURpcmVjdG9yeU1vZGFsOiBFbGVtZW50UmVmO1xyXG5cclxuICBsYW5ndWFnZTogc3RyaW5nID0gXCJcIlxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSwgcHJpdmF0ZSBwYWdlSW5mb1NlcnZpY2U6IFBhZ2VJbmZvU2VydmljZSwgcHVibGljIHV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZSwgcHJpdmF0ZSBiYnNmVHJhbnNsYXRlU2VydmljZTogQkJTRlRyYW5zbGF0ZVNlcnZpY2UsIHByaXZhdGUgZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UsIHByaXZhdGUgQWN0aXZlRGlyZWN0b3J5U2VydmljZTogQWN0aXZlRGlyZWN0b3J5U2VydmljZSkge1xyXG4gIH1cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuU2hvd1BhZ2VDb250ZW50ID0gdHJ1ZTtcclxuICAgIFBhZ2VJbmZvU2VydmljZS5QYWdlVGl0bGUgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBY3RpdmVEaXJlY3Rvcmllc1wiKVxyXG4gICAgUGFnZUluZm9TZXJ2aWNlLlBhZ2VCcmVhZGNydW1icyA9IFtcclxuICAgICAgeyB0aXRsZTogdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSG9tZVwiKSwgcGF0aDogJy9BZG1pbi9Ib21lJywgaXNTZXBhcmF0b3I6IGZhbHNlLCBpc0FjdGl2ZTogZmFsc2UgfSxcclxuICAgICAgeyB0aXRsZTogJycsIHBhdGg6ICcnLCBpc1NlcGFyYXRvcjogdHJ1ZSwgaXNBY3RpdmU6IGZhbHNlIH1cclxuXHJcbiAgICBdO1xyXG4gICAgdGhpcy5wYWdlSW5mb1NlcnZpY2UuY2FsY3VsYXRlVGl0bGUoKTtcclxuICAgIHRoaXMucGFnZUluZm9TZXJ2aWNlLmNhbGN1bGF0ZUJyZWFkY3J1bWJzKCk7XHJcbiAgICB0aGlzLmJic2ZUcmFuc2xhdGVTZXJ2aWNlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMuU2hvd1BhZ2VDb250ZW50ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubGFuZ3VhZ2UgPSBldmVudC5sYW5nO1xyXG4gICAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5sYW5ndWFnZSA9IGF3YWl0IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0Q3VycmVudExhbmd1YWdlKCk7XHJcbiAgICB0aGlzLlByb2R1Y3Rpb25Nb2RlID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0UHJvZHVjdGlvbk1vZGUoKVxyXG4gICAgdGhpcy5pbml0aWFsaXplUGFnZSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIHJlc2V0RmlsdGVycygpIHtcclxuICAgIHRoaXMuQWN0aXZlRGlyZWN0b3J5Rm9ybS5jb250cm9sc1tcInNlYXJjaFRleHRCb3hcIl0uc2V0VmFsdWUobnVsbCk7XHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5wdXQgYXMgYW55O1xyXG4gICAgZWxlbWVudC5SZWluaXRpYWxpemVQYWdpbmcoKTtcclxuICB9XHJcbiAgLy9pbml0aWFsaXplIGZpbHRlcnMgYW5kIGxvYWQgYW55IGRyb3AgZG93biBsaXN0XHJcbiAgaW5pdGlhbGl6ZVBhZ2UoKSB7XHJcbiAgICAvLyBUZXh0Qm94IGludGlcclxuICAgIHRoaXMuc2VhcmNoVGV4dEJveCA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgdGhpcy5zZWFyY2hUZXh0Qm94Lk5hbWUgPSBcInNlYXJjaFRleHRCb3hcIlxyXG4gICAgdGhpcy5zZWFyY2hUZXh0Qm94LlR5cGUgPSBJbnB1dFR5cGUuVGV4dFxyXG4gICAgdGhpcy5zZWFyY2hUZXh0Qm94LlBsYWNlaG9sZGVyID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiU2VhcmNoQnlOYW1lXCIpXHJcbiAgICB0aGlzLnNlYXJjaFRleHRCb3guSGlkZUxhYmVsID0gdHJ1ZVxyXG5cclxuICAgIHRoaXMuVGV4dElucHV0RmlsdGVyID0gbmV3IEZpbHRlckl0ZW0oKTtcclxuICAgIHRoaXMuVGV4dElucHV0RmlsdGVyLkZvcm1Db250cm9sTmFtZSA9IFwic2VhcmNoVGV4dEJveFwiXHJcbiAgICB0aGlzLlRleHRJbnB1dEZpbHRlci5BY3Rpb25QYXJhbWV0ZXJOYW1lID0gXCJzZWFyY2hUZXh0XCJcclxuICAgIHRoaXMuVGV4dElucHV0RmlsdGVyLklzRm9ybUNvbnRyb2wgPSB0cnVlXHJcbiAgICB0aGlzLlRleHRJbnB1dEZpbHRlci5GaWx0ZXJUeXBlID0gRmlsdGVyVHlwZS5UZXh0Qm94XHJcblxyXG4gICAgLy8gUHJvdmlkZXIgVHlwZXMgRmlsdGVyIEluaXQgICBcclxuXHJcbiAgICB0aGlzLkFjdGl2ZURpcmVjdG9yeVBhZ2luZyA9IG5ldyBQYWdpbmdPcHRpb25zKCk7XHJcbiAgICBkZWJ1Z2dlcjtcclxuICAgIHRoaXMuQWN0aXZlRGlyZWN0b3J5UGFnaW5nLkFjdGlvblBvc3RVUkwgPSB0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRBcGlVcmwoKSArIHRoaXMuQXBpVXJsICsgJ0dldEFEQ29ubmVjdGlvbkJ5RmlsdGVyJztcclxuICAgIHRoaXMuQWN0aXZlRGlyZWN0b3J5UGFnaW5nLk9uS2V5UHJlc3NGaWx0ZXJzQ29udHJvbE5hbWVzID0gW1wic2VhcmNoVGV4dEJveFwiXTtcclxuICAgIHRoaXMuQWN0aXZlRGlyZWN0b3J5UGFnaW5nLkZpbHRlcnMgPSBbdGhpcy5UZXh0SW5wdXRGaWx0ZXJdXHJcbiAgICB0aGlzLkFjdGl2ZURpcmVjdG9yeVBhZ2luZy5WYWxpZGF0aW9uVG9rZW4gPSB0aGlzLmF1dGhTZXJ2aWNlLmF1dGhvcml6YXRpb25IZWFkZXJWYWx1ZSgpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLklzRmlsdGVyTG9hZGVkID0gdHJ1ZTtcclxuICAgIH0sIDEwKTtcclxuICB9XHJcblxyXG4gIFJlaW5pdGlhbGl6ZUFjdGl2ZURpcmVjdG9yeVBhZ2luZygpIHtcclxuICAgIGxldCBlbGVtZW50ID0gdGhpcy5pbnB1dCBhcyBhbnk7XHJcbiAgICBlbGVtZW50LlJlaW5pdGlhbGl6ZVBhZ2luZygpO1xyXG4gIH1cclxuXHJcbiAgVXBkYXRlQWN0aXZlRGlyZWN0b3J5UGFnaW5nKCkge1xyXG4gICAgbGV0IGVsZW1lbnQgPSB0aGlzLmlucHV0IGFzIGFueTtcclxuICAgIGVsZW1lbnQuVXBkYXRlUGFnaW5nKCk7XHJcbiAgfVxyXG5cclxuICBzZXRBY3RpdmVEaXJlY3RvcnlMaXN0UmVzdWx0KHJlc3VsdCkge1xyXG4gICAgdGhpcy5BY3RpdmVEaXJlY3RvcnlQYWdpbmdSZXN1bHQgPSByZXN1bHQ7XHJcbiAgICB0aGlzLlNob3dQYWdlQ29udGVudCA9IHRydWU7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0b3BCbG9ja1VJKClcclxuICB9XHJcblxyXG5cclxuICBlZGl0QWN0aXZlRGlyZWN0b3J5KCkge1xyXG4gICAgaWYgKHRoaXMuRWRpdEFjdGl2ZURpcmVjdG9yeUZvcm0uaW52YWxpZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IFJlc3VsdE1vZGVsID0gdGhpcy5FZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybS52YWx1ZTtcclxuICAgICAgbGV0IEVkaXRNb2RlbCA9IG5ldyBBY3RpdmVEaXJlY3RvcnlBZGRFZGl0TW9kZWwoKTtcclxuXHJcbiAgICAgIEVkaXRNb2RlbC5JRCA9IE51bWJlcih0aGlzLkFjdGl2ZURpcmVjdG9yeUlkKTtcclxuICAgICAgRWRpdE1vZGVsLkNvbm5lY3Rpb25OYW1lID0gUmVzdWx0TW9kZWwuRWRpdE5hbWU7IC8vKCMjMSlcclxuICAgICAgRWRpdE1vZGVsLkRvbWFpbiA9IFJlc3VsdE1vZGVsLkVkaXREb21haW47XHJcbiAgICAgIEVkaXRNb2RlbC5TYW1BY2NvdW50ID0gUmVzdWx0TW9kZWwuRWRpdFNhbUFjY291bnQ7XHJcbiAgICAgIEVkaXRNb2RlbC5QYXNzd29yZCA9IFJlc3VsdE1vZGVsLkVkaXRQYXNzd29yZDtcclxuICAgICAgRWRpdE1vZGVsLlBlcm1pc3Npb25TZXRJRCA9IFJlc3VsdE1vZGVsLkVkaXRQZXJtaXNzaW9uU2V0T3B0aW9ucyAhPSBudWxsID8gTnVtYmVyKFJlc3VsdE1vZGVsLkVkaXRQZXJtaXNzaW9uU2V0T3B0aW9ucykgOiBudWxsXHJcbiAgICAgIEVkaXRNb2RlbC5MYW5nS2V5ID0gUmVzdWx0TW9kZWwuRWRpdExhbmd1YWdlT3B0aW9ucztcclxuICAgICAgRWRpdE1vZGVsLldlbGNvbWVUZW1wbGF0ZUlEID0gUmVzdWx0TW9kZWwuRWRpdFdlbGNvbWVNc2dUZW1wbGF0ZU9wdGlvbnMgIT0gbnVsbCA/IE51bWJlcihSZXN1bHRNb2RlbC5FZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9ucykgOiBudWxsXHJcbiAgICAgIEVkaXRNb2RlbC5NYXJrQXNJbmFjdGl2ZSA9IFJlc3VsdE1vZGVsLkVkaXRJbmFjdGl2ZTtcclxuICAgICAgRWRpdE1vZGVsLkFkZFRvRGFpbHlKb2IgPSBSZXN1bHRNb2RlbC5FZGl0RGFpbHlKb2I7XHJcblxyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuRWRpdE1hcHBpbmdzQ291bnQ7IGorKykge1xyXG4gICAgICAgIGxldCBlZGl0TUFwcGluZ1R5cGUgPSBSZXN1bHRNb2RlbFtcIkFETWFwcGluZ1R5cGVcIiArIGpdO1xyXG4gICAgICAgIGlmIChlZGl0TUFwcGluZ1R5cGUgPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgbGV0IGVkaXRNQXBwaW5nUHJvcGVydHkgPSBSZXN1bHRNb2RlbFtcIkFETWFwcGluZ1Byb3BlcnR5XCIgKyBqXTtcclxuICAgICAgICBsZXQgZWRpdE1BcHBpbmdQcm9wZXJ0eU5hbWUgPSBSZXN1bHRNb2RlbFtcIkFETWFwcGluZ1Byb3BlcnR5TmFtZVwiICsgal07XHJcblxyXG4gICAgICAgIGxldCBhZE1BcHBpbmdPYmo6IEFETWFwcGluZ01vZGVsID0gbmV3IEFETWFwcGluZ01vZGVsKCk7XHJcbiAgICAgICAgYWRNQXBwaW5nT2JqLkFETWFwcGluZ1R5cGVJdGVtSUQgPSBOdW1iZXIoZWRpdE1BcHBpbmdUeXBlKTtcclxuICAgICAgICBhZE1BcHBpbmdPYmouQkJTRlByb3BlcnR5TmFtZSA9IGVkaXRNQXBwaW5nUHJvcGVydHk7XHJcbiAgICAgICAgYWRNQXBwaW5nT2JqLkFEUHJvcGVydHlOYW1lID0gZWRpdE1BcHBpbmdQcm9wZXJ0eU5hbWU7XHJcbiAgICAgICAgRWRpdE1vZGVsLkFETWFwcGluZ3MucHVzaChhZE1BcHBpbmdPYmopO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLkFjdGl2ZURpcmVjdG9yeVNlcnZpY2UuRWRpdEFjdGl2ZURpcmVjdG9yeShFZGl0TW9kZWwpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgZGVidWdnZXI7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ0Nsb3NlRWRpdEFjdGl2ZURpcmVjdG9yeU1vZGFsJykuY2xpY2soKVxyXG4gICAgICAgIHRoaXMuRWRpdEFjdGl2ZURpcmVjdG9yeUZvcm0ucmVzZXQoKVxyXG4gICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5pbnB1dCBhcyBhbnk7XHJcbiAgICAgICAgZWxlbWVudC5VcGRhdGVQYWdpbmcoKTtcclxuICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93RWRpdEFjdGl2ZURpcmVjdG9yeU1vZGFsKEFjdGl2ZURpcmVjdG9yeUlEOiBudW1iZXIsIEFjdGl2ZURpcmVjdG9yeUlERW5jOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuQWN0aXZlRGlyZWN0b3J5U2VydmljZS5HZXRFZGl0QWN0aXZlRGlyZWN0b3J5KEFjdGl2ZURpcmVjdG9yeUlERW5jKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBsZXQgZGF0YVJlc3VsdCA9IHJlc3VsdCBhcyBhbnk7XHJcbiAgICAgIC8vZ2V0IGFjdGl2ZSBkaXJlY3RvcnkgZGF0YVxyXG4gICAgICBsZXQgYWN0aXZlRGlyZWN0b3J5ID0gZGF0YVJlc3VsdC5tb2RlbFxyXG4gICAgICAvL0xvYWQgaXN0c1xyXG4gICAgICB0aGlzLlBlcm1pc3Npb25TZXRMaXN0ID0gZGF0YVJlc3VsdC5kcm9wZG93bnNEYXRhLnBlcm1pc3Npb25TZXRzO1xyXG4gICAgICB0aGlzLkxhbmd1YWdlc0xpc3QgPSBkYXRhUmVzdWx0LmRyb3Bkb3duc0RhdGEubGFuZ3VhZ2VzO1xyXG4gICAgICB0aGlzLldlbGNvbWVNc2dUZW1wTGlzdCA9IGRhdGFSZXN1bHQuZHJvcGRvd25zRGF0YS50ZW1wbGF0ZXM7XHJcbiAgICAgIHRoaXMubWFwcGluZ1R5cGVzTGlzdCA9IGRhdGFSZXN1bHQuZHJvcGRvd25zRGF0YS5tYXBwaW5nVHlwZXM7XHJcbiAgICAgIHRoaXMubWFwcGluZ1Byb3BlcnRpZXNMaXN0ID0gZGF0YVJlc3VsdC5kcm9wZG93bnNEYXRhLm1hcHBpbmdQcm9wZXJ0aWVzO1xyXG5cclxuXHJcbiAgICAgIHRoaXMuSXNFZGl0QWN0aXZlRGlyZWN0b3J5TW9kYWxMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy51dGlsaXR5U2VydmljZS5zdGFydEJsb2NrVUkoKTtcclxuICAgICAgdGhpcy5FZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybS5yZXNldCgpO1xyXG4gICAgICB0aGlzLkFjdGl2ZURpcmVjdG9yeUlkID0gQWN0aXZlRGlyZWN0b3J5SUQ7XHJcblxyXG5cclxuICAgICAgdGhpcy5FZGl0TmFtZSA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgICB0aGlzLkVkaXROYW1lLk5hbWUgPSBcIkVkaXROYW1lXCI7ICAgLyp1c2VkIHdoZW4gY2FsbCB0aGUgY29udHJvbCAoaW1wb3J0YW50KSAoIyMxKSovXHJcbiAgICAgIHRoaXMuRWRpdE5hbWUuTGFiZWxLZXkgPSBcIk5hbWVcIjtcclxuICAgICAgdGhpcy5FZGl0TmFtZS5UeXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICAgIHRoaXMuRWRpdE5hbWUuSXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuRWRpdE5hbWUuVmFsdWUgPSBhY3RpdmVEaXJlY3RvcnkuY29ubmVjdGlvbk5hbWU7XHJcblxyXG4gICAgICBsZXQgc2VsZWN0ZWRQZXJtaXNzaW9uU2V0ID0gdGhpcy5QZXJtaXNzaW9uU2V0TGlzdC5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIGl0ZW0ua2V5ID09IGFjdGl2ZURpcmVjdG9yeS5wZXJtaXNzaW9uU2V0SUQ7IH0pLm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpWzBdO1xyXG5cclxuICAgICAgdGhpcy5FZGl0UGVybWlzc2lvblNldE9wdGlvbnMgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuRWRpdFBlcm1pc3Npb25TZXRPcHRpb25zLk5hbWUgPSBcIkVkaXRQZXJtaXNzaW9uU2V0T3B0aW9uc1wiXHJcbiAgICAgIHRoaXMuRWRpdFBlcm1pc3Npb25TZXRPcHRpb25zLkxhYmVsS2V5ID0gXCJQZXJtaXNzaW9uU2V0XCJcclxuICAgICAgdGhpcy5FZGl0UGVybWlzc2lvblNldE9wdGlvbnMuRGF0YVNvdXJjZSA9IHRoaXMuUGVybWlzc2lvblNldExpc3RcclxuICAgICAgdGhpcy5FZGl0UGVybWlzc2lvblNldE9wdGlvbnMuU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5FZGl0UGVybWlzc2lvblNldE9wdGlvbnMuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLkVkaXRQZXJtaXNzaW9uU2V0T3B0aW9ucy5QbGFjZWhvbGRlciA9IFwiXCI7XHJcbiAgICAgIHRoaXMuRWRpdFBlcm1pc3Npb25TZXRPcHRpb25zLklzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLkVkaXRQZXJtaXNzaW9uU2V0T3B0aW9ucy5TZWxlY3RlZEl0ZW1zID0gc2VsZWN0ZWRQZXJtaXNzaW9uU2V0O1xyXG5cclxuICAgICAgbGV0IHNlbGVjdGVkTGFuZ3VhZ2UgPSB0aGlzLkxhbmd1YWdlc0xpc3QuZmlsdGVyKChpdGVtKSA9PiB7IHJldHVybiBpdGVtLmtleSA9PSBhY3RpdmVEaXJlY3RvcnkubGFuZ0tleTsgfSkubWFwKChpdGVtKSA9PiBpdGVtLmtleSlbMF07XHJcblxyXG4gICAgICB0aGlzLkVkaXRMYW5ndWFnZU9wdGlvbnMgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuRWRpdExhbmd1YWdlT3B0aW9ucy5OYW1lID0gXCJFZGl0TGFuZ3VhZ2VPcHRpb25zXCJcclxuICAgICAgdGhpcy5FZGl0TGFuZ3VhZ2VPcHRpb25zLkxhYmVsVmFsdWUgPSBcIkxhbmd1YWdlXCJcclxuICAgICAgdGhpcy5FZGl0TGFuZ3VhZ2VPcHRpb25zLkxhYmVsS2V5ID0gXCJMYW5ndWFnZVwiXHJcbiAgICAgIHRoaXMuRWRpdExhbmd1YWdlT3B0aW9ucy5EYXRhU291cmNlID0gdGhpcy5MYW5ndWFnZXNMaXN0XHJcbiAgICAgIHRoaXMuRWRpdExhbmd1YWdlT3B0aW9ucy5TaW5nbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICB0aGlzLkVkaXRMYW5ndWFnZU9wdGlvbnMuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLkVkaXRMYW5ndWFnZU9wdGlvbnMuUGxhY2Vob2xkZXIgPSBcIlwiO1xyXG4gICAgICB0aGlzLkVkaXRMYW5ndWFnZU9wdGlvbnMuSXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuRWRpdExhbmd1YWdlT3B0aW9ucy5TZWxlY3RlZEl0ZW1zID0gc2VsZWN0ZWRMYW5ndWFnZTtcclxuXHJcbiAgICAgIGxldCBzZWxlY3RlZFdlbGNvbWVNc2dUZW1wID0gYWN0aXZlRGlyZWN0b3J5LndlbGNvbWVUZW1wbGF0ZUlEICE9IG51bGwgPyB0aGlzLldlbGNvbWVNc2dUZW1wTGlzdC5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIGl0ZW0ua2V5ID09IGFjdGl2ZURpcmVjdG9yeS53ZWxjb21lVGVtcGxhdGVJRDsgfSkubWFwKChpdGVtKSA9PiBpdGVtLmtleSlbMF0gOiBudWxsO1xyXG5cclxuICAgICAgdGhpcy5FZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9ucyA9IG5ldyBEcm9wZG93bk9wdGlvbnMoKTtcclxuICAgICAgdGhpcy5FZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9ucy5OYW1lID0gXCJFZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9uc1wiXHJcbiAgICAgIHRoaXMuRWRpdFdlbGNvbWVNc2dUZW1wbGF0ZU9wdGlvbnMuTGFiZWxLZXkgPSBcIldlbGNvbWVNc2dUZW1wbGF0ZVwiXHJcbiAgICAgIHRoaXMuRWRpdFdlbGNvbWVNc2dUZW1wbGF0ZU9wdGlvbnMuRGF0YVNvdXJjZSA9IHRoaXMuV2VsY29tZU1zZ1RlbXBMaXN0XHJcbiAgICAgIHRoaXMuRWRpdFdlbGNvbWVNc2dUZW1wbGF0ZU9wdGlvbnMuU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5FZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9ucy5BbGxvd1NlYXJjaEZpbHRlciA9IHRydWU7XHJcbiAgICAgIHRoaXMuRWRpdFdlbGNvbWVNc2dUZW1wbGF0ZU9wdGlvbnMuUGxhY2Vob2xkZXIgPSBcIlwiO1xyXG4gICAgICB0aGlzLkVkaXRXZWxjb21lTXNnVGVtcGxhdGVPcHRpb25zLklzUmVxdWlyZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5FZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9ucy5TZWxlY3RlZEl0ZW1zID0gc2VsZWN0ZWRXZWxjb21lTXNnVGVtcDtcclxuXHJcbiAgICAgIHRoaXMuRWRpdElkZW50aWZpZXIgPSBhY3RpdmVEaXJlY3RvcnkuaWRlbnRpZmllcjtcclxuICAgICAgdGhpcy5FZGl0VHlwZU5hbWUgPSBhY3RpdmVEaXJlY3RvcnkuYWRDb25uZWN0aW9uVHlwZUl0ZW1OYW1lO1xyXG5cclxuICAgICAgdGhpcy5FZGl0RG9tYWluID0gbmV3IFRleHRCb3hPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuRWRpdERvbWFpbi5OYW1lID0gXCJFZGl0RG9tYWluXCI7ICAgLyp1c2VkIHdoZW4gY2FsbCB0aGUgY29udHJvbCAoaW1wb3J0YW50KSAoIyMxKSovXHJcbiAgICAgIHRoaXMuRWRpdERvbWFpbi5MYWJlbEtleSA9IFwiRG9tYWluXCI7XHJcbiAgICAgIHRoaXMuRWRpdERvbWFpbi5UeXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICAgIHRoaXMuRWRpdERvbWFpbi5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5FZGl0RG9tYWluLlZhbHVlID0gYWN0aXZlRGlyZWN0b3J5LmRvbWFpbjtcclxuXHJcbiAgICAgIHRoaXMuRWRpdFNhbUFjY291bnQgPSBuZXcgVGV4dEJveE9wdGlvbnMoKTtcclxuICAgICAgdGhpcy5FZGl0U2FtQWNjb3VudC5OYW1lID0gXCJFZGl0U2FtQWNjb3VudFwiOyAgIC8qdXNlZCB3aGVuIGNhbGwgdGhlIGNvbnRyb2wgKGltcG9ydGFudCkgKCMjMSkqL1xyXG4gICAgICB0aGlzLkVkaXRTYW1BY2NvdW50LkxhYmVsS2V5ID0gXCJTYW1BY2NvdW50XCI7XHJcbiAgICAgIHRoaXMuRWRpdFNhbUFjY291bnQuVHlwZSA9IElucHV0VHlwZS5UZXh0O1xyXG4gICAgICB0aGlzLkVkaXRTYW1BY2NvdW50LlZhbHVlID0gYWN0aXZlRGlyZWN0b3J5LnNhbUFjY291bnQ7XHJcblxyXG4gICAgICB0aGlzLkVkaXRQYXNzd29yZCA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgICB0aGlzLkVkaXRQYXNzd29yZC5OYW1lID0gXCJFZGl0UGFzc3dvcmRcIjsgICAvKnVzZWQgd2hlbiBjYWxsIHRoZSBjb250cm9sIChpbXBvcnRhbnQpICgjIzEpKi9cclxuICAgICAgdGhpcy5FZGl0UGFzc3dvcmQuTGFiZWxLZXkgPSBcIlBhc3N3b3JkXCI7XHJcbiAgICAgIHRoaXMuRWRpdFBhc3N3b3JkLlR5cGUgPSBJbnB1dFR5cGUuUGFzc3dvcmQ7XHJcbiAgICAgIHRoaXMuRWRpdFBhc3N3b3JkLlJlbW92ZURlZmF1bHRQYXNzd29yZFZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgICB0aGlzLkVkaXRQYXNzd29yZC5WYWx1ZSA9IGFjdGl2ZURpcmVjdG9yeS5wYXNzd29yZDtcclxuXHJcbiAgICAgIHRoaXMuRWRpdEluYWN0aXZlID0gbmV3IFRvZ2dsZVNsaWRlT3B0aW9ucygpO1xyXG4gICAgICB0aGlzLkVkaXRJbmFjdGl2ZS5OYW1lID0gXCJFZGl0SW5hY3RpdmVcIjtcclxuICAgICAgdGhpcy5FZGl0SW5hY3RpdmUuVmFsdWUgPSBhY3RpdmVEaXJlY3RvcnkubWFya0FzSW5hY3RpdmU7XHJcbiAgICAgIHRoaXMuRWRpdEluYWN0aXZlLkxhYmVsS2V5ID0gXCJNYXJrQXNJbmFjdGl2ZVwiXHJcbiAgICAgIHRoaXMuRWRpdEluYWN0aXZlLlZpZXdUeXBlID0gQ29udHJvbExheW91dC5Ib3Jpem9udGFsO1xyXG5cclxuXHJcbiAgICAgIHRoaXMuRWRpdERhaWx5Sm9iID0gbmV3IFRvZ2dsZVNsaWRlT3B0aW9ucygpO1xyXG4gICAgICB0aGlzLkVkaXREYWlseUpvYi5OYW1lID0gXCJFZGl0RGFpbHlKb2JcIlxyXG4gICAgICB0aGlzLkVkaXREYWlseUpvYi5MYWJlbEtleSA9IFwiQWRkVG9EYWlseUpvYlwiXHJcbiAgICAgIHRoaXMuRWRpdERhaWx5Sm9iLlZhbHVlID0gYWN0aXZlRGlyZWN0b3J5LmFkZFRvRGFpbHlKb2I7XHJcbiAgICAgIHRoaXMuRWRpdERhaWx5Sm9iLlZpZXdUeXBlID0gQ29udHJvbExheW91dC5Ib3Jpem9udGFsO1xyXG5cclxuICAgICAgbGV0IGRhdGE6IGFueSA9IHRoaXMuZ2V0QURNYXBwaW5nT3B0aW9ucyhhY3RpdmVEaXJlY3RvcnkuYWRNYXBwaW5ncyk7XHJcblxyXG4gICAgICB0aGlzLkVkaXRNYXBwaW5nc09wdGlvbnMgPSBkYXRhWzBdO1xyXG4gICAgICB0aGlzLkVkaXRNYXBwaW5nc0NvdW50ID0gZGF0YVsxXTtcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuSXNFZGl0QWN0aXZlRGlyZWN0b3J5TW9kYWxMb2FkZWQgPSB0cnVlO1xyXG4gICAgICB9LCAxMDApO1xyXG4gICAgfSwgKGVycm9yKSA9PiB7XHJcblxyXG4gICAgfSlcclxuICB9XHJcbiAgZ2V0QURNYXBwaW5nT3B0aW9ucyhBRE1hcHBpbmdzOiBhbnlbXSkge1xyXG4gICAgbGV0IEFETWFwcGluZ09wdGlvbnM6IGFueVtdID0gW107XHJcbiAgICBsZXQgQURNYXBwaW5nQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IEFETWFwcGluZ3MubGVuZ3RoOyBpKyspIHtcclxuXHJcbiAgICAgIGxldCBvYmplY3RNYXBwaW5nT3B0aW9uczogYW55W10gPSBbXTtcclxuXHJcbiAgICAgIGxldCBBRE1hcHBpbmdUeXBlID0gbmV3IERyb3Bkb3duT3B0aW9ucygpO1xyXG4gICAgICBsZXQgc2VsZWN0ZWRUeXBlID0gdGhpcy5tYXBwaW5nVHlwZXNMaXN0LmZpbHRlcigoaXRlbSkgPT4geyByZXR1cm4gaXRlbS5rZXkgPT0gQURNYXBwaW5nc1tpXS5hZE1hcHBpbmdUeXBlSXRlbUlEOyB9KS5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KVswXTtcclxuICAgICAgQURNYXBwaW5nVHlwZS5OYW1lID0gXCJBRE1hcHBpbmdUeXBlXCIgKyBpO1xyXG4gICAgICBBRE1hcHBpbmdUeXBlLkhpZGVMYWJlbCA9IHRydWU7XHJcbiAgICAgIEFETWFwcGluZ1R5cGUuU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgQURNYXBwaW5nVHlwZS5TZWxlY3RlZEl0ZW1zID0gc2VsZWN0ZWRUeXBlO1xyXG4gICAgICBBRE1hcHBpbmdUeXBlLlZpZXdUeXBlID0gQ29udHJvbExheW91dC5Ib3Jpem9udGFsO1xyXG4gICAgICBBRE1hcHBpbmdUeXBlLkRhdGFTb3VyY2UgPSB0aGlzLm1hcHBpbmdUeXBlc0xpc3Q7XHJcblxyXG4gICAgICBsZXQgQURNYXBwaW5nUHJvcGVydHkgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICAgIGxldCBzZWxlY3RlZFByb3BlcnR5ID0gdGhpcy5tYXBwaW5nUHJvcGVydGllc0xpc3QuZmlsdGVyKChpdGVtKSA9PiB7IHJldHVybiBpdGVtLmtleSA9PSBBRE1hcHBpbmdzW2ldLmJic2ZQcm9wZXJ0eU5hbWU7IH0pLm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpWzBdO1xyXG4gICAgICBBRE1hcHBpbmdQcm9wZXJ0eS5OYW1lID0gXCJBRE1hcHBpbmdQcm9wZXJ0eVwiICsgaTtcclxuICAgICAgQURNYXBwaW5nUHJvcGVydHkuSGlkZUxhYmVsID0gdHJ1ZTtcclxuICAgICAgQURNYXBwaW5nUHJvcGVydHkuU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgQURNYXBwaW5nUHJvcGVydHkuU2VsZWN0ZWRJdGVtcyA9IHNlbGVjdGVkUHJvcGVydHk7XHJcbiAgICAgIEFETWFwcGluZ1Byb3BlcnR5LlZpZXdUeXBlID0gQ29udHJvbExheW91dC5Ib3Jpem9udGFsO1xyXG4gICAgICBBRE1hcHBpbmdQcm9wZXJ0eS5EYXRhU291cmNlID0gdGhpcy5tYXBwaW5nUHJvcGVydGllc0xpc3Q7XHJcblxyXG5cclxuICAgICAgbGV0IEFETWFwcGluZ1Byb3BlcnR5TmFtZSA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgICBBRE1hcHBpbmdQcm9wZXJ0eU5hbWUuTmFtZSA9IFwiQURNYXBwaW5nUHJvcGVydHlOYW1lXCIgKyBpO1xyXG4gICAgICBBRE1hcHBpbmdQcm9wZXJ0eU5hbWUuSGlkZUxhYmVsID0gdHJ1ZTtcclxuICAgICAgQURNYXBwaW5nUHJvcGVydHlOYW1lLlR5cGUgPSBJbnB1dFR5cGUuVGV4dDtcclxuICAgICAgQURNYXBwaW5nUHJvcGVydHlOYW1lLlZhbHVlID0gQURNYXBwaW5nc1tpXS5hZFByb3BlcnR5TmFtZTtcclxuICAgICAgQURNYXBwaW5nUHJvcGVydHlOYW1lLklzUmVxdWlyZWQgPSBmYWxzZTtcclxuICAgICAgQURNYXBwaW5nUHJvcGVydHlOYW1lLlZpZXdUeXBlID0gQ29udHJvbExheW91dC5Ib3Jpem9udGFsO1xyXG5cclxuICAgICAgbGV0IEFETWFwcGluZ0luY2x1ZGVVcGRhdGUgPSBuZXcgQ2hlY2tCb3hPcHRpb25zKCk7XHJcbiAgICAgIEFETWFwcGluZ0luY2x1ZGVVcGRhdGUuTmFtZSA9IFwiQURNYXBwaW5nSW5jbHVkZVVwZGF0ZVwiICsgaTtcclxuICAgICAgQURNYXBwaW5nSW5jbHVkZVVwZGF0ZS5WYWx1ZSA9IEFETWFwcGluZ3NbaV0uaW5jbHVkZUluVXBkYXRlO1xyXG4gICAgICBBRE1hcHBpbmdJbmNsdWRlVXBkYXRlLklzRGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuXHJcbiAgICAgIG9iamVjdE1hcHBpbmdPcHRpb25zLnB1c2goQURNYXBwaW5nVHlwZSwgQURNYXBwaW5nUHJvcGVydHksIEFETWFwcGluZ1Byb3BlcnR5TmFtZSwgQURNYXBwaW5nSW5jbHVkZVVwZGF0ZSk7XHJcbiAgICAgIEFETWFwcGluZ09wdGlvbnMucHVzaChvYmplY3RNYXBwaW5nT3B0aW9ucyk7XHJcbiAgICAgIEFETWFwcGluZ0NvdW50ICs9IDE7XHJcblxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtBRE1hcHBpbmdPcHRpb25zLCBBRE1hcHBpbmdDb3VudF07XHJcbiAgfVxyXG4gIHNob3dEZWxldGVBY3RpdmVEaXJlY3RvcnlNb2RhbChhY3RpdmVEaXJlY3Rvcnk6IGFueSkge1xyXG4gICAgdGhpcy5kZWxldGVBY3RpdmVEaXJlY3RvcnlJZCA9IGFjdGl2ZURpcmVjdG9yeS5pZEVuY3J5cHRlZDtcclxuICAgIHRoaXMuSXNPcGVuRGVsZXRlQWN0aXZlRGlyZWN0b3J5TW9kYWwgPSBmYWxzZTtcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RhcnRCbG9ja1VJKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5Jc09wZW5EZWxldGVBY3RpdmVEaXJlY3RvcnlNb2RhbCA9IHRydWU7XHJcbiAgICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RvcEJsb2NrVUkoKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVBY3RpdmVEaXJlY3RvcnkoKSB7XHJcbiAgICB0aGlzLkFjdGl2ZURpcmVjdG9yeVNlcnZpY2UuRGVsZXRlQWN0aXZlRGlyZWN0b3J5KHRoaXMuZGVsZXRlQWN0aXZlRGlyZWN0b3J5SWQpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGVsZXRlQWN0aXZlRGlyZWN0b3J5SWQgPSBcIlwiO1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnQ2xvc2VEZWxldGVBY3RpdmVEaXJlY3RvcnlNb2RhbCcpLmNsaWNrKClcclxuICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLmlucHV0IGFzIGFueTtcclxuICAgICAgZWxlbWVudC5SZWluaXRpYWxpemVQYWdpbmcoKTtcclxuICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgfSlcclxuICB9XHJcbiAgc2hvd0FEU3luY2hyb25pemF0aW9uTW9kYWwoQWN0aXZlRGlyZWN0b3J5SUQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5zeW5jQWN0aXZlRGlyZWN0b3J5SWQgPSBBY3RpdmVEaXJlY3RvcnlJRDtcclxuICAgIHRoaXMuSXNPcGVuU3luY0FjdGl2ZURpcmVjdG9yeU1vZGFsID0gZmFsc2U7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0YXJ0QmxvY2tVSSgpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuSXNPcGVuU3luY0FjdGl2ZURpcmVjdG9yeU1vZGFsID0gdHJ1ZTtcclxuICAgICAgdGhpcy51dGlsaXR5U2VydmljZS5zdG9wQmxvY2tVSSgpO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcbiAgcnVuU3luY3Jvbml6YXRpb24oKSB7XHJcbiAgICB0aGlzLkFjdGl2ZURpcmVjdG9yeVNlcnZpY2UuUnVuQURTeW5jaHJvbml6YXRpb24odGhpcy5zeW5jQWN0aXZlRGlyZWN0b3J5SWQpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgIHRoaXMuc3luY0FjdGl2ZURpcmVjdG9yeUlkID0gXCJcIjtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ0Nsb3NlU3luY0FjdGl2ZURpcmVjdG9yeU1vZGFsJykuY2xpY2soKVxyXG4gICAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5wdXQgYXMgYW55O1xyXG4gICAgICBlbGVtZW50LlJlaW5pdGlhbGl6ZVBhZ2luZygpO1xyXG4gICAgfSwgKGVycm9yKSA9PiB7XHJcblxyXG4gICAgfSlcclxuICB9XHJcbiAgc2hvd0FETGFzdFJ1bkxvZ3NNb2RhbChBY3RpdmVEaXJlY3RvcnlJRDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLkFjdGl2ZURpcmVjdG9yeVNlcnZpY2UuR2V0TGFzdFJ1bkxvZ3MoQWN0aXZlRGlyZWN0b3J5SUQpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGxldCBsYXN0UnVuTG9nc01vZGVsID0gcmVzdWx0IGFzIGFueTtcclxuXHJcbiAgICAgIHRoaXMuSXNsYXN0UnVuTG9nc01vZGFsTG9hZGVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuQURDb25uZWN0aW9uTmFtZSA9IGxhc3RSdW5Mb2dzTW9kZWwubW9kZWwuYWRDb25uZWN0aW9uTmFtZTtcclxuICAgICAgdGhpcy5MYXN0UnVuTG9ncyA9IGxhc3RSdW5Mb2dzTW9kZWwubW9kZWwubG9ncztcclxuXHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLklzbGFzdFJ1bkxvZ3NNb2RhbExvYWRlZCA9IHRydWU7XHJcbiAgICAgIH0sIDEwMCk7XHJcbiAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBkZWxldGVBRE1hcHBpbmcoZGVsZXRlZEFETUFwcGluZzogYW55KSB7XHJcbiAgICBkZWJ1Z2dlcjtcclxuICAgIGxldCBkZWxldGVkTWFwcGluZ0luZGV4OiBudW1iZXIgPSB0aGlzLkVkaXRNYXBwaW5nc09wdGlvbnMuaW5kZXhPZihkZWxldGVkQURNQXBwaW5nKTtcclxuICAgIGlmIChkZWxldGVkTWFwcGluZ0luZGV4ICE9PSAtMSkge1xyXG4gICAgICB0aGlzLkVkaXRNYXBwaW5nc09wdGlvbnMuc3BsaWNlKGRlbGV0ZWRNYXBwaW5nSW5kZXgsIDEpO1xyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0ZWRBRE1BcHBpbmcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB0aGlzLkVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtLnJlbW92ZUNvbnRyb2woZGVsZXRlZEFETUFwcGluZ1tpXS5OYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIiwiPGJsb2NrLXVpPjwvYmxvY2stdWk+XHJcblxyXG4gIDwhLS0gUGFnZSBDb250ZW50IC0tPlxyXG4gIDxkaXYgKm5nSWY9XCJTaG93UGFnZUNvbnRlbnRcIiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxyXG4gICAgPCEtLSBiZWdpbjo6SGVhZGVyIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1jdXN0b20taFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgcHQtNVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlIGFsaWduLWl0ZW1zLXN0YXJ0IGZsZXgtY29sdW1uXCIgKm5nSWY9XCJJc0ZpbHRlckxvYWRlZFwiPlxyXG4gICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJBY3RpdmVEaXJlY3RvcnlGb3JtXCI+XHJcbiAgICAgICAgICAgIDxCQlNGLVRleHRCb3ggW29wdGlvbnNdPVwic2VhcmNoVGV4dEJveFwiIFtncm91cF09XCJBY3RpdmVEaXJlY3RvcnlGb3JtXCI+PC9CQlNGLVRleHRCb3g+XHJcbiAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9vbGJhclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5XCIgdGl0bGU9J3t7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFkZFwiKX19JyBbcm91dGVyTGlua109XCJbJy9BZG1pbi9BRENvbm5lY3Rpb24vQWRkJ11cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGx1cyBtZS0xXCI+PC9pPlxyXG4gICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBZGRcIil9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTNcIj5cclxuICAgICAgICA8IS0tYmVnaW46OkFjdGl2ZURpcmVjdG9yeSBsaXN0LS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGFsaWduLW1pZGRsZSB0YWJsZS1yb3ctZGFzaGVkIGZzLTYgZ3ktNSBkYXRhVGFibGUgbm8tZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LXN0YXJ0IHRleHQtZ3JheS00MDAgZnctYm9sZGVyIGZzLTcgdGV4dC11cHBlcmNhc2UgZ3MtMFwiPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJOYW1lXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJUeXBlXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJQZXJtaXNzaW9uU2V0XCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBZENvbm5lY3Rpb25SdW5uaW5nTm93XCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBY3RpdmVEaXJlY3RvcnlJZGVudGlmaWVyXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFjdGlvbnNcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgPHRib2R5IGlkPVwibGlzdGluZ0NvbnRhaW5lclwiIGNsYXNzPVwiZnctYm9sZCB0ZXh0LWdyYXktNjAwIGJvcmRlci0wXCI+XHJcbiAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBhY3RpdmVEaXJlY3Rvcnkgb2YgQWN0aXZlRGlyZWN0b3J5UGFnaW5nUmVzdWx0XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1kYXJrXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7YWN0aXZlRGlyZWN0b3J5Lm5hbWV9fVxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAge3thY3RpdmVEaXJlY3RvcnkuYWRDb25uZWN0aW9uVHlwZU5hbWV9fVxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAge3thY3RpdmVEaXJlY3RvcnkucGVybWlzc2lvblNldE5hbWV9fVxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1zdWNjZXNzXCIgKm5nSWY9XCJhY3RpdmVEaXJlY3RvcnkuaXNSdW5uaW5nTm93O2Vsc2Ugbm90X1J1bm5pbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJZZXNcIil9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm90X1J1bm5pbmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIk5vXCIpfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICB7e2FjdGl2ZURpcmVjdG9yeS5pZGVudGlmaWVyfX1cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgIHt7YWN0aXZlRGlyZWN0b3J5Lm5hbWV9fVxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gYnRuLWxpZ2h0IGJ0bi1hY3RpdmUtbGlnaHQtcHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1lbGxpcHNpcy1oXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcC1pdGVtIHB4LTNcIiBuZ2JEcm9wZG93bkl0ZW0gZGF0YS10b2dnbGU9XCJtb2RhbFwiIGRhdGEtdGFyZ2V0PVwiI2VkaXRBY3RpdmVEaXJlY3RvcnlNb2RhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0VkaXRBY3RpdmVEaXJlY3RvcnlNb2RhbChhY3RpdmVEaXJlY3RvcnkuaWQsYWN0aXZlRGlyZWN0b3J5LmlkRW5jcnlwdGVkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyb3AtbGluayBweC0zXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRWRpdFwiKX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGEgbmdiRHJvcGRvd25JdGVtIGNsYXNzPVwiZHJvcC1pdGVtIHB4LTNcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjZGVsZXRlQWN0aXZlRGlyZWN0b3J5TW9kYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dEZWxldGVBY3RpdmVEaXJlY3RvcnlNb2RhbChhY3RpdmVEaXJlY3RvcnkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcC1saW5rIHB4LTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJEZWxldGVcIil9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxhIG5nYkRyb3Bkb3duSXRlbSBjbGFzcz1cImRyb3AtaXRlbSBweC0zXCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiIGRhdGEtdGFyZ2V0PVwiI3N5bmNocm9uaXphdGlvbk1vZGFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93QURTeW5jaHJvbml6YXRpb25Nb2RhbChhY3RpdmVEaXJlY3RvcnkuaWRFbmNyeXB0ZWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcC1saW5rIHB4LTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBY3RpdmVEaXJlY3RvcnlSdW5TeW5jcm9uaXphdGlvblwiKX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGEgbmdiRHJvcGRvd25JdGVtIGNsYXNzPVwiZHJvcC1pdGVtIHB4LTNcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjbGFzdFJ1bkxvZ3NNb2RhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0FETGFzdFJ1bkxvZ3NNb2RhbChhY3RpdmVEaXJlY3RvcnkuaWRFbmNyeXB0ZWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcC1saW5rIHB4LTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBY3RpdmVEaXJlY3RvcnlMYXN0UnVuTG9nc1wiKX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgIDx0ciAqbmdJZj1cIkFjdGl2ZURpcmVjdG9yeVBhZ2luZ1Jlc3VsdC5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI2XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsaWItZW1wdHktZGF0YT48L2xpYi1lbXB0eS1kYXRhPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tZW5kOjpBY3RpdmUgZGlyZWN0b3J5IGxpc3QtLT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBib3JkZXItMFwiPlxyXG4gICAgICAgIDxCQlNGLVBhZ2luZyAoSXRlbXMpPVwic2V0QWN0aXZlRGlyZWN0b3J5TGlzdFJlc3VsdCgkZXZlbnQpXCIgKm5nSWY9XCJJc0ZpbHRlckxvYWRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIkFjdGl2ZURpcmVjdG9yeVBhZ2luZ1wiIFtncm91cF09XCJBY3RpdmVEaXJlY3RvcnlGb3JtXCIgI0FjdGl2ZURpcmVjdG9yeVBhZ2luZ1ZpZXdFbGVtZW50PlxyXG4gICAgICAgIDwvQkJTRi1QYWdpbmc+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG5cclxuICA8IS0tIEVkaXQgTW9kYWwgLS0+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cImVkaXRBY3RpdmVEaXJlY3RvcnlNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJleGFtcGxlTW9kYWxMYWJlbFwiXHJcbiAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIj5cclxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJFZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybVwiICpuZ0lmPVwiSXNFZGl0QWN0aXZlRGlyZWN0b3J5TW9kYWxMb2FkZWRcIiAobmdTdWJtaXQpPVwiZWRpdEFjdGl2ZURpcmVjdG9yeSgpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRWRpdFwiKX19IHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFjdGl2ZURpcmVjdG9yeVwiKX19PC9oNT5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4taWNvblwiPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGltZXNcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICA8QkJTRi1UZXh0Qm94IFtvcHRpb25zXT1cIkVkaXROYW1lXCIgW2dyb3VwXT1cIkVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICA8L0JCU0YtVGV4dEJveD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgIDxCQlNGLURyb3Bkb3duTGlzdCBbb3B0aW9uc109XCJFZGl0UGVybWlzc2lvblNldE9wdGlvbnNcIiBbZ3JvdXBdPVwiRWRpdEFjdGl2ZURpcmVjdG9yeUZvcm1cIj5cclxuICAgICAgICAgICAgICAgIDwvQkJTRi1Ecm9wZG93bkxpc3Q+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICA8QkJTRi1Ecm9wZG93bkxpc3QgW29wdGlvbnNdPVwiRWRpdExhbmd1YWdlT3B0aW9uc1wiIFtncm91cF09XCJFZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgPC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgIDxCQlNGLURyb3Bkb3duTGlzdCBbb3B0aW9uc109XCJFZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9uc1wiIFtncm91cF09XCJFZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgPC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICA8aDY+XHJcbiAgICAgICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIklkZW50aWZpZXJcIil9fVxyXG4gICAgICAgICAgICAgICAgPC9oNj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAge3tFZGl0SWRlbnRpZmllcn19XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgICAgPGg2PlxyXG4gICAgICAgICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJUeXBlXCIpfX1cclxuICAgICAgICAgICAgICAgIDwvaDY+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIHt7RWRpdFR5cGVOYW1lfX1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgPEJCU0YtVGV4dEJveCBbb3B0aW9uc109XCJFZGl0RG9tYWluXCIgW2dyb3VwXT1cIkVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICA8L0JCU0YtVGV4dEJveD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgIDxCQlNGLVRleHRCb3ggW29wdGlvbnNdPVwiRWRpdFNhbUFjY291bnRcIiBbZ3JvdXBdPVwiRWRpdEFjdGl2ZURpcmVjdG9yeUZvcm1cIj5cclxuICAgICAgICAgICAgICAgIDwvQkJTRi1UZXh0Qm94PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgICAgPEJCU0YtVGV4dEJveCBbb3B0aW9uc109XCJFZGl0UGFzc3dvcmRcIiBbZ3JvdXBdPVwiRWRpdEFjdGl2ZURpcmVjdG9yeUZvcm1cIj5cclxuICAgICAgICAgICAgICAgIDwvQkJTRi1UZXh0Qm94PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgIDxCQlNGLVRvZ2dsZXNsaWRlIFtvcHRpb25zXT1cIkVkaXRJbmFjdGl2ZVwiIFtncm91cF09XCJFZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgPC9CQlNGLVRvZ2dsZXNsaWRlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgICAgPEJCU0YtVG9nZ2xlc2xpZGUgW29wdGlvbnNdPVwiRWRpdERhaWx5Sm9iXCIgW2dyb3VwXT1cIkVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICA8L0JCU0YtVG9nZ2xlc2xpZGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYW1zeC10YWJsZS11c2Vyc1wiPlxyXG4gICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlR5cGVcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlByb3BlcnR5XCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBY3RpdmVEaXJlY3RvcnlfUHJvcGVydHlcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkluY2x1ZGVJblVwZGF0ZVwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIEVkaXRNYXBwaW5nc09wdGlvbnM7bGV0IGk9aW5kZXg7XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxCQlNGLURyb3Bkb3duTGlzdCBbb3B0aW9uc109XCJvcHRpb25bMF1cIiBbZ3JvdXBdPVwiRWRpdEFjdGl2ZURpcmVjdG9yeUZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvQkJTRi1Ecm9wZG93bkxpc3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8QkJTRi1Ecm9wZG93bkxpc3QgW29wdGlvbnNdPVwib3B0aW9uWzFdXCIgW2dyb3VwXT1cIkVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L0JCU0YtRHJvcGRvd25MaXN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPEJCU0YtVGV4dEJveCBbb3B0aW9uc109XCJvcHRpb25bMl1cIiBbZ3JvdXBdPVwiRWRpdEFjdGl2ZURpcmVjdG9yeUZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvQkJTRi1UZXh0Qm94PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPEJCU0YtQ2hlY2tCb3ggW29wdGlvbnNdPVwib3B0aW9uWzNdXCIgW2dyb3VwXT1cIkVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L0JCU0YtQ2hlY2tCb3g+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXIgYWxpZ24tbWlkZGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImt0LW5hdl9fbGlua1wiIChjbGljayk9XCJkZWxldGVBRE1hcHBpbmcob3B0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImt0LW5hdl9fbGluay1pY29uIGZhIGZhLXRyYXNoIGhpZGRlblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJFZGl0TWFwcGluZ3NPcHRpb25zLmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGliLWVtcHR5LWRhdGE+PC9saWItZW1wdHktZGF0YT5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICA8L3RhYmxlPlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgIDwhLS08bGliLXByb3ZpZGVyLWF0dHJpYnV0ZXMgW1Byb3ZpZGVyQXR0cmlidXRlc109XCJQcm92aWRlckF0dHJpYnV0ZXNcIj48L2xpYi1wcm92aWRlci1hdHRyaWJ1dGVzPi0tPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uICNDbG9zZUVkaXRBY3RpdmVEaXJlY3RvcnlNb2RhbCBpZD1cIkNsb3NlRWRpdEFjdGl2ZURpcmVjdG9yeU1vZGFsXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+XHJcbiAgICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ2FuY2VsTGFiZWxcIil9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTYXZlTGFiZWxcIil9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZm9ybT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIERlbGV0ZSAgTW9kYWwgLS0+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cImRlbGV0ZUFjdGl2ZURpcmVjdG9yeU1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cImV4YW1wbGVNb2RhbExhYmVsXCJcclxuICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiPlxyXG4gICAgICA8Zm9ybSAqbmdJZj1cIklzT3BlbkRlbGV0ZUFjdGl2ZURpcmVjdG9yeU1vZGFsXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRGVsZXRlXCIpfX0ge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQWN0aXZlRGlyZWN0b3J5XCIpfX08L2g1PlxyXG5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4taWNvblwiPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGltZXNcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm90ZSBub3RlLXdhcm5pbmcgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJEZWxldGVfUXVlc3Rpb25cIil9fVxyXG4gICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uICNDbG9zZURlbGV0ZUFjdGl2ZURpcmVjdG9yeU1vZGFsIGlkPVwiQ2xvc2VEZWxldGVBY3RpdmVEaXJlY3RvcnlNb2RhbFwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxyXG4gICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkZWxldGVBY3RpdmVEaXJlY3RvcnkoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkRlbGV0ZVwiKX19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZm9ybT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFZpZXcgTGFzdCBSdW4gTG9nc2wgLS0+XHJcbiAgPGRpdiBpZD1cImxhc3RSdW5Mb2dzTW9kYWxcIiBjbGFzcz1cIm1vZGFsIGZhZGUgZXhhbXBsZS1tb2RhbC1sZ1wiIGFyaWEtbGFiZWxsZWRieT1cImV4YW1wbGVPcHRpb25hbExhcmdlXCIgZGF0YS1iYWNrZHJvcD1cInN0YXRpY1wiIHJvbGU9XCJkaWFsb2dcIiB0YWJpbmRleD1cIi0xXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1zaW1wbGUgbW9kYWwtbGdcIj5cclxuICAgICAgPGRpdiBpZD1cImdlbmVyYXRlQ29kZVBhcmVudFwiIGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwibGFzdFJ1bkxvZ3NGb3JtXCIgKm5nSWY9XCJJc2xhc3RSdW5Mb2dzTW9kYWxMb2FkZWRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFjdGl2ZURpcmVjdG9yeUxhc3RSdW5Mb2dzXCIpfX0gOiB7e0FEQ29ubmVjdGlvbk5hbWV9fTwvaDU+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZSBidG4gYnRuLWljb25cIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10aW1lc1wiPjwvaT5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgPCEtLTxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJDb3B5VG9DbGlwYm9hcmRcIiAoY2xpY2spPVwiY29weVRvQ2xpcGJvYXJkKClcIiAgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3MgZmxvYXQtcmlnaHRcIiAvPlxyXG4gICAgICAgICAgICAgIDwvZGl2Pi0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgPHA+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiTmFtZVwiKX19IDoge3tBRENvbm5lY3Rpb25OYW1lfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9XCJjb2wtbWQtMTJcIj57e0xhc3RSdW5Mb2dzfX08L3ByZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uICNDbG9zZUxBc3RSdW5Mb2dzQWN0aXZlRGlyZWN0b3J5TW9kYWwgaWQ9XCJDbG9zZUxBc3RSdW5Mb2dzQWN0aXZlRGlyZWN0b3J5TW9kYWxcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxyXG4gICAgICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ2FuY2VsTGFiZWxcIil9fVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBTeW5jaHJvbml6YXRpb24gIE1vZGFsIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbCBmYWRlXCIgaWQ9XCJzeW5jaHJvbml6YXRpb25Nb2RhbFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJleGFtcGxlTW9kYWxMYWJlbFwiXHJcbiAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIj5cclxuICAgICAgPGZvcm0gKm5nSWY9XCJJc09wZW5TeW5jQWN0aXZlRGlyZWN0b3J5TW9kYWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4taWNvblwiPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGltZXNcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm90ZSBub3RlLXdhcm5pbmcgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTeW5jaHJvbml6ZUNvbmZpcm1hdGlvblwiKX19XHJcbiAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gI0Nsb3NlU3luY0FjdGl2ZURpcmVjdG9yeU1vZGFsIGlkPVwiQ2xvc2VTeW5jQWN0aXZlRGlyZWN0b3J5TW9kYWxcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cclxuICAgICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJDYW5jZWxMYWJlbFwiKX19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicnVuU3luY3Jvbml6YXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlllc1wiKX19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZm9ybT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4iXX0=
|
|
420
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlLWRpcmVjdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL0FjdGl2ZURpcmVjdG9yaWVzL2FjdGl2ZS1kaXJlY3RvcnkvYWN0aXZlLWRpcmVjdG9yeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL0FjdGl2ZURpcmVjdG9yaWVzL2FjdGl2ZS1kaXJlY3RvcnkvYWN0aXZlLWRpcmVjdG9yeS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsd0JBQXdCLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhRLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFNckYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQU9uRCxNQUFNLE9BQU8sd0JBQXdCO0lBa0VuQyxZQUFvQixXQUF3QixFQUFVLGVBQWdDLEVBQVMsY0FBOEIsRUFDbkgsb0JBQTBDLEVBQVUsc0JBQThDLEVBQ2xHLFlBQXNCLEVBQVUscUJBQTRDO1FBRmxFLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQVMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ25ILHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFBVSwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQ2xHLGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBQVUsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQW5FdEYsbUJBQW1CO1FBQ25CLFdBQU0sR0FBRywwQkFBMEIsQ0FBQztRQUNwQyxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUV4Qiw4QkFBOEI7UUFDOUIsd0JBQW1CLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFHeEMsZ0NBQTJCLEdBQVUsRUFBRSxDQUFDO1FBQ3hDLDJCQUFzQixHQUFVLEVBQUUsQ0FBQztRQUVuQyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUdoQyxnQkFBZ0I7UUFDaEIsc0JBQWlCLEdBQVUsRUFBRSxDQUFDO1FBQzlCLGtCQUFhLEdBQVUsRUFBRSxDQUFDO1FBQzFCLHVCQUFrQixHQUFVLEVBQUUsQ0FBQztRQUMvQixxQkFBZ0IsR0FBVSxFQUFFLENBQUM7UUFDN0IsMEJBQXFCLEdBQVUsRUFBRSxDQUFDO1FBRWxDLHVCQUF1QjtRQUN2QixpQkFBaUI7UUFDakIsNEJBQXVCLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFVNUMsd0JBQW1CLEdBQVUsRUFBRSxDQUFDO1FBbUJoQyx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFVckMsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBZ05uQyxtQkFBYyxHQUFHLEdBQUcsRUFBRTtZQUNwQixJQUFJLFVBQVUsR0FBVSxFQUFFLENBQUM7WUFDM0IsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQztZQUNyRCxJQUFJLFNBQVMsR0FBRyxJQUFJLDJCQUEyQixFQUFFLENBQUM7WUFFbEQsU0FBUyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDOUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO1lBQ2hELFNBQVMsQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDLHdCQUF3QixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7WUFDOUgsU0FBUyxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsbUJBQW1CLENBQUM7WUFDcEQsU0FBUyxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyw2QkFBNkIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1lBQzFJLFNBQVMsQ0FBQyxjQUFjLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQztZQUNwRCxTQUFTLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUM7WUFFbkQsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQy9DLFNBQVMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQztnQkFDMUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDO2dCQUNsRCxTQUFTLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUM7YUFDL0M7aUJBQ0ksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2xELFNBQVMsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQztnQkFDOUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDO2dCQUM5QyxTQUFTLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQzthQUN2RDtZQUdELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQy9DLElBQUksZUFBZSxHQUFHLFdBQVcsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksZUFBZSxJQUFJLFNBQVM7b0JBQzlCLFNBQVM7Z0JBQ1gsSUFBSSxtQkFBbUIsR0FBRyxXQUFXLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELElBQUksdUJBQXVCLEdBQUcsV0FBVyxDQUFDLHVCQUF1QixHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLDBCQUEwQixHQUFHLFdBQVcsQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxnQ0FBZ0MsR0FBRyxXQUFXLENBQUMsOEJBQThCLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBRXZGLElBQUksWUFBWSxHQUFtQixJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUN4RCxZQUFZLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMzRCxZQUFZLENBQUMsZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUM7Z0JBQ3BELFlBQVksQ0FBQyxjQUFjLEdBQUcsdUJBQXVCLENBQUM7Z0JBQ3RELFlBQVksQ0FBQyxlQUFlLEdBQUcsMEJBQTBCLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUM7Z0JBQ3ZJLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3pDO1lBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQixPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDLENBQUE7UUFFRCxzQkFBaUIsR0FBRyxDQUFDLFNBQVMsRUFBbUIsRUFBRTtZQUNqRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNuRSxDQUFDLENBQUE7UUE0SEQsMEJBQXFCLEdBQUcsQ0FBQyxFQUFVLEVBQW1CLEVBQUU7WUFDdEQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFBO1FBMEJELHNCQUFpQixHQUFHLENBQUMsRUFBVSxFQUFtQixFQUFFO1lBQ2xELE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQTtRQUVELHFCQUFnQixHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDNUIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUE7SUF2WkQsQ0FBQztJQUdLLFFBQVE7O1lBQ1osSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsZUFBZSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLENBQUE7WUFDckYsZUFBZSxDQUFDLGVBQWUsR0FBRztnQkFDaEMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtnQkFDakgsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO2FBRTVELENBQUM7WUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN6RCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLENBQUM7S0FBQTtJQUVELCtCQUErQjtJQUMvQixjQUFjO1FBQ1osZUFBZTtRQUNmLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUE7UUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQTtRQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ3JGLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtRQUVuQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFBO1FBQ3RELElBQUksQ0FBQyxlQUFlLENBQUMsbUJBQW1CLEdBQUcsWUFBWSxDQUFBO1FBQ3ZELElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtRQUN6QyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFBO1FBR3BELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQztRQUNuRixJQUFJLENBQUMscUJBQXFCLENBQUMsNkJBQTZCLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQzNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBRXpGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsNEJBQTRCLENBQUMsTUFBTTtRQUNqQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsTUFBTSxDQUFDO1FBQzFDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxNQUFNLENBQUM7UUFDckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNuQyxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLDRCQUE0QixDQUFDLGlCQUF5QixFQUFFLG9CQUE0QixFQUFFLFdBQVc7UUFDL0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUU5QixJQUFJLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUM1RixJQUFJLFNBQVMsR0FBRyxNQUFhLENBQUM7WUFDOUIsSUFBSSxlQUFlLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUN0QyxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDO1lBRXBDLElBQUksQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQztZQUNqRCxXQUFXO1lBQ1gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDOUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQzFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQzNDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUM7WUFFckQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyw4QkFBOEIsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFBO1lBQzVFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQzNFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDbkYsSUFBSSxDQUFDLDhCQUE4QixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFBO1lBQ3hFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUE7WUFHOUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztZQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQztZQUVyRCxJQUFJLHFCQUFxQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDLEdBQUcsSUFBSSxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFeEosSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksR0FBRywwQkFBMEIsQ0FBQTtZQUMvRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQTtZQUN4RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQTtZQUNqRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUNyRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1lBQ3ZELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ2hELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLEdBQUcscUJBQXFCLENBQUM7WUFFcEUsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxJQUFJLENBQUMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV2SSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFBO1lBQ3JELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1lBQ2hELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFBO1lBQzlDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQTtZQUN4RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUNoRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1lBQ2xELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQzNDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7WUFFMUQsSUFBSSxzQkFBc0IsR0FBRyxlQUFlLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQyxHQUFHLElBQUksZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUUvTSxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUMzRCxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxHQUFHLCtCQUErQixDQUFBO1lBQ3pFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLEdBQUcsb0JBQW9CLENBQUE7WUFDbEUsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUE7WUFDdkUsSUFBSSxDQUFDLDZCQUE2QixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDMUQsSUFBSSxDQUFDLDZCQUE2QixDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUM1RCxJQUFJLENBQUMsNkJBQTZCLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsNkJBQTZCLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN0RCxJQUFJLENBQUMsNkJBQTZCLENBQUMsYUFBYSxHQUFHLHNCQUFzQixDQUFDO1lBRzFFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQztZQUN4QyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDO1lBQ3pELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLGdCQUFnQixDQUFBO1lBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUM7WUFFdEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFBO1lBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQTtZQUM1QyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUMsYUFBYSxDQUFDO1lBQ3hELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUM7WUFHdEQsY0FBYztZQUNkLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUMvQyxJQUFJLENBQUMsY0FBYyxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDO2dCQUV0RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQztnQkFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7Z0JBRS9DLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQztnQkFDNUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDMUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FBQztnQkFFdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQywrQkFBK0IsR0FBRyxJQUFJLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUM7Z0JBRW5ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7YUFDaEM7aUJBQ0ksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQztnQkFFbkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDO2dCQUVuRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDNUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQztnQkFFM0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQzthQUU5QjtZQUdELElBQUksSUFBSSxHQUFRLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFckUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXRDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQW1ERCxzQkFBc0I7SUFDdEIsbUJBQW1CLENBQUMsVUFBaUI7UUFDbkMsSUFBSSxnQkFBZ0IsR0FBVSxFQUFFLENBQUM7UUFDakMsSUFBSSxjQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBRTFDLElBQUksb0JBQW9CLEdBQVUsRUFBRSxDQUFDO1lBRXJDLElBQUksYUFBYSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7WUFDMUMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hKLGFBQWEsQ0FBQyxJQUFJLEdBQUcsZUFBZSxHQUFHLENBQUMsQ0FBQztZQUN6QyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUMvQixhQUFhLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUNyQyxhQUFhLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztZQUMzQyxhQUFhLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUM7WUFDbEQsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFFakQsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQzlDLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RKLGlCQUFpQixDQUFDLElBQUksR0FBRyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7WUFDakQsaUJBQWlCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUNuQyxpQkFBaUIsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQ3pDLGlCQUFpQixDQUFDLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztZQUNuRCxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQztZQUN0RCxpQkFBaUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1lBRzFELElBQUkscUJBQXFCLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNqRCxxQkFBcUIsQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO1lBQ3pELHFCQUFxQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdkMscUJBQXFCLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDNUMscUJBQXFCLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7WUFDM0QscUJBQXFCLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUM7WUFFMUQsSUFBSSxzQkFBc0IsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ25ELHNCQUFzQixDQUFDLElBQUksR0FBRyx3QkFBd0IsR0FBRyxDQUFDLENBQUM7WUFDM0Qsc0JBQXNCLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7WUFDN0Qsc0JBQXNCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUV6QyxJQUFJLDRCQUE0QixHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7WUFDeEQsNEJBQTRCLENBQUMsSUFBSSxHQUFHLDhCQUE4QixHQUFHLENBQUMsQ0FBQztZQUN2RSw0QkFBNEIsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQzlDLDRCQUE0QixDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ25ELDRCQUE0QixDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO1lBR25FLG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztZQUN6SSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM1QyxjQUFjLElBQUksQ0FBQyxDQUFDO1NBRXJCO1FBQ0QsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCxlQUFlLENBQUMsZ0JBQXFCO1FBQ25DLFFBQVEsQ0FBQztRQUNULElBQUksbUJBQW1CLEdBQVcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3JGLElBQUksbUJBQW1CLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3RFO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUVuQyxJQUFJLG9CQUFvQixHQUFVLEVBQUUsQ0FBQztRQUVyQyxJQUFJLGFBQWEsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUMvQixhQUFhLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUNyQyxhQUFhLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUM7UUFDbEQsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFFakQsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzlDLGlCQUFpQixDQUFDLElBQUksR0FBRyxtQkFBbUIsR0FBRSxLQUFLLENBQUM7UUFDcEQsaUJBQWlCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNuQyxpQkFBaUIsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3pDLGlCQUFpQixDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDO1FBQ3RELGlCQUFpQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFHMUQsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ2pELHFCQUFxQixDQUFDLElBQUksR0FBRyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDN0QscUJBQXFCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN2QyxxQkFBcUIsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztRQUM1QyxxQkFBcUIsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLHFCQUFxQixDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDO1FBRTFELElBQUksc0JBQXNCLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNuRCxzQkFBc0IsQ0FBQyxJQUFJLEdBQUcsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO1FBRS9ELElBQUksNEJBQTRCLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUN4RCw0QkFBNEIsQ0FBQyxJQUFJLEdBQUcsOEJBQThCLEdBQUcsS0FBSyxDQUFDO1FBQzNFLDRCQUE0QixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDOUMsNEJBQTRCLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFFbkQsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO1FBRXpJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDO0lBRTlCLENBQUM7SUFDRCx3QkFBd0I7SUFDeEIsOEJBQThCLENBQUMsaUJBQXlCO1FBQ3RELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxpQkFBaUIsQ0FBQztRQUVqRCxnQ0FBZ0M7UUFDaEMsSUFBSSxVQUFVLEdBQVUsRUFBRSxDQUFDO1FBQzNCLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFOUMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksd0JBQXdCLEVBQUUsQ0FBQztRQUNoRSxJQUFJLENBQUMseUJBQXlCLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1FBQ2xGLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUM7UUFDL0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNsRCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBS0QsdUJBQXVCO0lBQ3ZCLDBCQUEwQixDQUFDLGlCQUF5QjtRQUNsRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsaUJBQWlCLENBQUM7UUFFL0MsZ0NBQWdDO1FBQ2hDLElBQUksVUFBVSxHQUFVLEVBQUUsQ0FBQztRQUMzQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDOUQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUM1RSxJQUFJLENBQUMsdUJBQXVCLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDO1FBQzdELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNsRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsWUFBWSxDQUFDO1FBQzlFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDN0csSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUN2SCxJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUMsT0FBTyxDQUFDO1FBQ25GLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFDL0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUN0RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsNEJBQTRCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDaEQsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQVFELGVBQWU7SUFDZixzQkFBc0IsQ0FBQyxpQkFBeUIsRUFBQyxnQkFBZ0I7UUFDL0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2pGLElBQUksZ0JBQWdCLEdBQUcsTUFBYSxDQUFDO1lBRXJDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7WUFDaEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBRS9DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBWTtJQUNaLFdBQVc7UUFDVCxJQUFJLENBQUMscUJBQXFCLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDOUMsQ0FBQzs7c0hBNWVVLHdCQUF3QjswR0FBeEIsd0JBQXdCLGljQ25CckMsdTFiQTJUQTs0RkR4U2Esd0JBQXdCO2tCQUpwQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFdBQVcsRUFBRSxtQ0FBbUM7aUJBQ2pEO2dTQWNtRSxhQUFhO3NCQUE5RSxTQUFTO3VCQUFDLGtDQUFrQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkF5Q0EsOEJBQThCO3NCQUE3RixTQUFTO3VCQUFDLGdDQUFnQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFVQSw0QkFBNEI7c0JBQXpGLFNBQVM7dUJBQUMsOEJBQThCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENoZWNrQm94T3B0aW9ucywgQ29uZmlybWF0aW9uTW9kYWxPcHRpb25zLCBDb250cm9sTGF5b3V0LCBEcm9wZG93bk9wdGlvbnMsIEZpbHRlckl0ZW0sIEZpbHRlclR5cGUsIEZvcm1PcHRpb25zLCBJbnB1dFR5cGUsIFBhZ2luZ0FjdGlvbk1vZGUsIFBhZ2luZ09wdGlvbnMsIFN0eWxlQ29uZmlybWF0aW9uTW9kZSwgVGV4dEJveE9wdGlvbnMsIFRvZ2dsZVNsaWRlT3B0aW9ucyB9IGZyb20gJ0BibnNpZ2h0cy9iYnNmLWNvbnRyb2xzJztcclxuaW1wb3J0IHsgQWN0aXZlRGlyZWN0b3J5U2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9TZXJ2aWNlcy9BY3RpdmVEaXJlY3RvcnlTZXJ2aWNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBY3RpdmVEaXJlY3RvcnlBZGRFZGl0TW9kZWwgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL0FETW9kZWxzL0FjdGl2ZURpcmVjdG9yeUFkZEVkaXRNb2RlbCc7XHJcbmltcG9ydCB7IEFETWFwcGluZ01vZGVsIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9BRE1vZGVscy9BRE1hcHBpbmdNb2RlbCc7XHJcbmltcG9ydCB7IFBhZ2VJbmZvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL19tZXRyb25pYy9jb3JlL3NlcnZpY2VzL3BhZ2UtaW5mby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UsIFV0aWxpdHlTZXJ2aWNlLCBCQlNGVHJhbnNsYXRlU2VydmljZSwgUmVxdWVzdEhhbmRsZXJTZXJ2aWNlIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQgfSBmcm9tICdAYm5zaWdodHMvYmJzZi1jb250cm9scy9saWIvY29udHJvbHMvQ29uZmlybWF0aW9uTW9kYWwvQ29uZmlybWF0aW9uTW9kYWwuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUGFnaW5nQ29tcG9uZW50IH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtY29udHJvbHMvbGliL2NvbnRyb2xzL1BhZ2luZy9QYWdpbmcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgQURUeXBlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL0VudW1zL0FEVHlwZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYWN0aXZlLWRpcmVjdG9yeScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FjdGl2ZS1kaXJlY3RvcnkuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBY3RpdmVEaXJlY3RvcnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIC8vUGFnZSByZXF1aXJlbWVudHNcclxuICBhcGlVcmwgPSBcIi9hcGkvYWRtaW4vQURDb25uZWN0aW9uL1wiO1xyXG4gIHNob3dQYWdlQ29udGVudCA9IGZhbHNlO1xyXG5cclxuICAvL0ZpbHRlciBhbmQgcGFnaW5nIGNvbXBvbmVudHNcclxuICBhY3RpdmVEaXJlY3RvcnlGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgc2VhcmNoVGV4dEJveDogVGV4dEJveE9wdGlvbnM7XHJcbiAgdGV4dElucHV0RmlsdGVyOiBGaWx0ZXJJdGVtO1xyXG4gIGFjdGl2ZURpcmVjdG9yeVBhZ2luZ1Jlc3VsdDogYW55W10gPSBbXTtcclxuICBjbGllbnRTaWRlUGFnaW5nUmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gIGFjdGl2ZURpcmVjdG9yeVBhZ2luZzogUGFnaW5nT3B0aW9ucztcclxuICBpc0ZpbHRlckxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ2FjdGl2ZURpcmVjdG9yeVBhZ2luZ1ZpZXdFbGVtZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIHBhZ2luZ0VsZW1lbnQ6IFBhZ2luZ0NvbXBvbmVudDxhbnk+O1xyXG5cclxuICAvL1JlcXVpcmVkIGxpc3RzXHJcbiAgcGVybWlzc2lvblNldExpc3Q6IGFueVtdID0gW107XHJcbiAgbGFuZ3VhZ2VzTGlzdDogYW55W10gPSBbXTtcclxuICB3ZWxjb21lTXNnVGVtcExpc3Q6IGFueVtdID0gW107XHJcbiAgbWFwcGluZ1R5cGVzTGlzdDogYW55W10gPSBbXTtcclxuICBtYXBwaW5nUHJvcGVydGllc0xpc3Q6IGFueVtdID0gW107XHJcblxyXG4gIC8vLy9FZGl0IE1vZGVsIENvbnRyb2xzXHJcbiAgLy9TaGFyZWQgY29udHJvbHNcclxuICBlZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIGVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtT3B0aW9uczogRm9ybU9wdGlvbnNcclxuICBlZGl0TmFtZTogVGV4dEJveE9wdGlvbnM7XHJcbiAgZWRpdEFEVHlwZU5hbWU6IHN0cmluZzsgLy9XaW5kb3dzIG9yIEF6dXJlXHJcbiAgZWRpdEFEVHlwZUlEOiBudW1iZXI7XHJcbiAgZWRpdEluYWN0aXZlOiBUb2dnbGVTbGlkZU9wdGlvbnM7XHJcbiAgZWRpdERhaWx5Sm9iOiBUb2dnbGVTbGlkZU9wdGlvbnM7XHJcbiAgZWRpdFBlcm1pc3Npb25TZXRPcHRpb25zOiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgZWRpdExhbmd1YWdlT3B0aW9uczogRHJvcGRvd25PcHRpb25zO1xyXG4gIGVkaXRXZWxjb21lTXNnVGVtcGxhdGVPcHRpb25zOiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgZWRpdE1hcHBpbmdzT3B0aW9uczogYW55W10gPSBbXTtcclxuICBlZGl0TWFwcGluZ3NDb3VudDogbnVtYmVyO1xyXG4gIGFjdGl2ZURpcmVjdG9yeUlkOiBudW1iZXI7XHJcbiAgLy9XaW5kb3dzIE1vZGVcclxuICBlZGl0RG9tYWluOiBUZXh0Qm94T3B0aW9ucztcclxuICBlZGl0U2FtQWNjb3VudDogVGV4dEJveE9wdGlvbnM7XHJcbiAgZWRpdElkZW50aWZpZXI6IHN0cmluZztcclxuICBlZGl0V2luZG93c1R5cGVOYW1lOiBzdHJpbmc7XHJcbiAgZWRpdFBhc3N3b3JkOiBUZXh0Qm94T3B0aW9ucztcclxuICBzaG93V2luZG93c0NvbnRyb2w6IGJvb2xlYW47XHJcbiAgLy9BenVyZSBNb2RlXHJcbiAgZWRpdFRlbmFudElEOiBUZXh0Qm94T3B0aW9ucztcclxuICBlZGl0Q2xpZW50SUQ6IFRleHRCb3hPcHRpb25zO1xyXG4gIGVkaXRDbGllbnRTZWNyZXQ6IFRleHRCb3hPcHRpb25zO1xyXG4gIHNob3dBenVyZUNvbnRyb2w6IGJvb2xlYW47XHJcblxyXG4gIC8vZGVsZXRlICBNb2RlbCBDb250cm9sc1xyXG4gIGRlbGV0ZUFjdGl2ZURpcmVjdG9yeUlkOiBzdHJpbmc7XHJcbiAgZGVsZXRlQ29uZmlybWF0aW9uT3B0aW9uczogQ29uZmlybWF0aW9uTW9kYWxPcHRpb25zO1xyXG4gIGRlbGV0ZUNvbnRyb2xMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdkZWxldGVDb25maXJtYXRpb25Nb2RhbENvbnRyb2wnLCB7IHN0YXRpYzogZmFsc2UgfSkgZGVsZXRlQ29uZmlybWF0aW9uTW9kYWxDb250cm9sOiBDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudDtcclxuXHJcbiAgLy9MYXN0IHJ1biBsb2dzXHJcbiAgYWRDb25uZWN0aW9uTmFtZTogc3RyaW5nO1xyXG4gIGxhc3RSdW5Mb2dzOiBzdHJpbmc7XHJcblxyXG4gIC8vU3luY2hyb25pemF0aW9uIG1vZGFsXHJcbiAgc3luY0FjdGl2ZURpcmVjdG9yeUlkOiBzdHJpbmc7XHJcbiAgc3luY0NvbmZpcm1hdGlvbk9wdGlvbnM6IENvbmZpcm1hdGlvbk1vZGFsT3B0aW9ucztcclxuICBzeW5jQ29udHJvbExvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ3N5bmNDb25maXJtYXRpb25Nb2RhbENvbnRyb2wnLCB7IHN0YXRpYzogZmFsc2UgfSkgc3luY0NvbmZpcm1hdGlvbk1vZGFsQ29udHJvbDogQ29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLCBwcml2YXRlIHBhZ2VJbmZvU2VydmljZTogUGFnZUluZm9TZXJ2aWNlLCBwdWJsaWMgdXRpbGl0eVNlcnZpY2U6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBiYnNmVHJhbnNsYXRlU2VydmljZTogQkJTRlRyYW5zbGF0ZVNlcnZpY2UsIHByaXZhdGUgYWN0aXZlRGlyZWN0b3J5U2VydmljZTogQWN0aXZlRGlyZWN0b3J5U2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCwgcHJpdmF0ZSByZXF1ZXN0SGFuZGxlclNlcnZpY2U6IFJlcXVlc3RIYW5kbGVyU2VydmljZSkge1xyXG4gIH1cclxuXHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zaG93UGFnZUNvbnRlbnQgPSB0cnVlO1xyXG4gICAgUGFnZUluZm9TZXJ2aWNlLlBhZ2VUaXRsZSA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFjdGl2ZURpcmVjdG9yaWVzXCIpXHJcbiAgICBQYWdlSW5mb1NlcnZpY2UuUGFnZUJyZWFkY3J1bWJzID0gW1xyXG4gICAgICB7IHRpdGxlOiB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJIb21lXCIpLCBwYXRoOiAnL0FkbWluL0hvbWUnLCBpc1NlcGFyYXRvcjogZmFsc2UsIGlzQWN0aXZlOiBmYWxzZSB9LFxyXG4gICAgICB7IHRpdGxlOiAnJywgcGF0aDogJycsIGlzU2VwYXJhdG9yOiB0cnVlLCBpc0FjdGl2ZTogZmFsc2UgfVxyXG5cclxuICAgIF07XHJcbiAgICB0aGlzLnBhZ2VJbmZvU2VydmljZS5jYWxjdWxhdGVUaXRsZSgpO1xyXG4gICAgdGhpcy5wYWdlSW5mb1NlcnZpY2UuY2FsY3VsYXRlQnJlYWRjcnVtYnMoKTtcclxuICAgIHRoaXMuYmJzZlRyYW5zbGF0ZVNlcnZpY2Uub25MYW5nQ2hhbmdlLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcclxuICAgICAgdGhpcy5zaG93UGFnZUNvbnRlbnQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5uZ09uSW5pdCgpO1xyXG4gICAgfSlcclxuICAgIHRoaXMuaW5pdGlhbGl6ZVBhZ2UoKTtcclxuICB9XHJcblxyXG4gIC8vaW5pdGlhbGl6ZSBmaWx0ZXJzIGFuZCBwYWdpbmdcclxuICBpbml0aWFsaXplUGFnZSgpIHtcclxuICAgIC8vIFRleHRCb3ggaW5pdFxyXG4gICAgdGhpcy5zZWFyY2hUZXh0Qm94ID0gbmV3IFRleHRCb3hPcHRpb25zKCk7XHJcbiAgICB0aGlzLnNlYXJjaFRleHRCb3guTmFtZSA9IFwic2VhcmNoVGV4dEJveFwiXHJcbiAgICB0aGlzLnNlYXJjaFRleHRCb3guVHlwZSA9IElucHV0VHlwZS5UZXh0XHJcbiAgICB0aGlzLnNlYXJjaFRleHRCb3guUGxhY2Vob2xkZXIgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTZWFyY2hCeU5hbWVcIilcclxuICAgIHRoaXMuc2VhcmNoVGV4dEJveC5IaWRlTGFiZWwgPSB0cnVlXHJcblxyXG4gICAgdGhpcy50ZXh0SW5wdXRGaWx0ZXIgPSBuZXcgRmlsdGVySXRlbSgpO1xyXG4gICAgdGhpcy50ZXh0SW5wdXRGaWx0ZXIuRm9ybUNvbnRyb2xOYW1lID0gXCJzZWFyY2hUZXh0Qm94XCJcclxuICAgIHRoaXMudGV4dElucHV0RmlsdGVyLkFjdGlvblBhcmFtZXRlck5hbWUgPSBcInNlYXJjaFRleHRcIlxyXG4gICAgdGhpcy50ZXh0SW5wdXRGaWx0ZXIuSXNGb3JtQ29udHJvbCA9IHRydWVcclxuICAgIHRoaXMudGV4dElucHV0RmlsdGVyLkZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlLlRleHRCb3hcclxuXHJcblxyXG4gICAgdGhpcy5hY3RpdmVEaXJlY3RvcnlQYWdpbmcgPSBuZXcgUGFnaW5nT3B0aW9ucygpO1xyXG4gICAgdGhpcy5hY3RpdmVEaXJlY3RvcnlQYWdpbmcuQWN0aW9uUG9zdFVSTCA9IHRoaXMuYXBpVXJsICsgJ0dldEFEQ29ubmVjdGlvbkJ5RmlsdGVyJztcclxuICAgIHRoaXMuYWN0aXZlRGlyZWN0b3J5UGFnaW5nLk9uS2V5UHJlc3NGaWx0ZXJzQ29udHJvbE5hbWVzID0gW1wic2VhcmNoVGV4dEJveFwiXTtcclxuICAgIHRoaXMuYWN0aXZlRGlyZWN0b3J5UGFnaW5nLkZpbHRlcnMgPSBbdGhpcy50ZXh0SW5wdXRGaWx0ZXJdXHJcbiAgICB0aGlzLmFjdGl2ZURpcmVjdG9yeVBhZ2luZy5WYWxpZGF0aW9uVG9rZW4gPSB0aGlzLmF1dGhTZXJ2aWNlLmF1dGhvcml6YXRpb25IZWFkZXJWYWx1ZSgpO1xyXG5cclxuICAgIHRoaXMuaXNGaWx0ZXJMb2FkZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy9QYWdpbmcgZnVuY3Rpb25zXHJcbiAgc2V0QWN0aXZlRGlyZWN0b3J5TGlzdFJlc3VsdChyZXN1bHQpIHtcclxuICAgIHRoaXMuYWN0aXZlRGlyZWN0b3J5UGFnaW5nUmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgdGhpcy5jbGllbnRTaWRlUGFnaW5nUmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgdGhpcy5zaG93UGFnZUNvbnRlbnQgPSB0cnVlO1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdG9wQmxvY2tVSSgpXHJcbiAgfVxyXG5cclxuICAvL0VkaXQgQWN0aXZlRGlyZWN0b3J5XHJcbiAgc2hvd0VkaXRBY3RpdmVEaXJlY3RvcnlNb2RhbChhY3RpdmVEaXJlY3RvcnlJRDogbnVtYmVyLCBhY3RpdmVEaXJlY3RvcnlJREVuYzogc3RyaW5nLCBlZGl0QURNb2RhbCkge1xyXG4gICAgdGhpcy5hY3RpdmVEaXJlY3RvcnlJZCA9IGFjdGl2ZURpcmVjdG9yeUlEO1xyXG4gICAgdGhpcy5zaG93V2luZG93c0NvbnRyb2wgPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd0F6dXJlQ29udHJvbCA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuYWN0aXZlRGlyZWN0b3J5U2VydmljZS5nZXRFZGl0QWN0aXZlRGlyZWN0b3J5KGFjdGl2ZURpcmVjdG9yeUlERW5jKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBsZXQgcmVzdWx0T2JqID0gcmVzdWx0IGFzIGFueTtcclxuICAgICAgbGV0IGFjdGl2ZURpcmVjdG9yeSA9IHJlc3VsdE9iai5tb2RlbDtcclxuICAgICAgbGV0IGxpc3RzID0gcmVzdWx0T2JqLmRyb3Bkb3duc0RhdGE7XHJcblxyXG4gICAgICB0aGlzLmVkaXRBRFR5cGVJRCA9IGFjdGl2ZURpcmVjdG9yeS5hZFR5cGVJdGVtSUQ7XHJcbiAgICAgIC8vTG9hZCBpc3RzXHJcbiAgICAgIHRoaXMucGVybWlzc2lvblNldExpc3QgPSBsaXN0cy5wZXJtaXNzaW9uU2V0cztcclxuICAgICAgdGhpcy5sYW5ndWFnZXNMaXN0ID0gbGlzdHMubGFuZ3VhZ2VzO1xyXG4gICAgICB0aGlzLndlbGNvbWVNc2dUZW1wTGlzdCA9IGxpc3RzLnRlbXBsYXRlcztcclxuICAgICAgdGhpcy5tYXBwaW5nVHlwZXNMaXN0ID0gbGlzdHMubWFwcGluZ1R5cGVzO1xyXG4gICAgICB0aGlzLm1hcHBpbmdQcm9wZXJ0aWVzTGlzdCA9IGxpc3RzLm1hcHBpbmdQcm9wZXJ0aWVzO1xyXG5cclxuICAgICAgdGhpcy5lZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgICB0aGlzLmVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtT3B0aW9ucyA9IG5ldyBGb3JtT3B0aW9ucygpO1xyXG4gICAgICB0aGlzLmVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtT3B0aW9ucy5Gb3JtR3JvdXAgPSB0aGlzLmVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtXHJcbiAgICAgIHRoaXMuZWRpdEFjdGl2ZURpcmVjdG9yeUZvcm1PcHRpb25zLkdldE1vZGVsRnVuY3Rpb24gPSB0aGlzLmdldEVkaXRBRE1vZGVsO1xyXG4gICAgICB0aGlzLmVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtT3B0aW9ucy5TZXJ2aWNlU3VibWl0RnVuY3Rpb24gPSB0aGlzLmdldEVkaXRBREZ1bmN0aW9uO1xyXG4gICAgICB0aGlzLmVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtT3B0aW9ucy5QYWdpbmdSZWZlcmVuY2UgPSB0aGlzLnBhZ2luZ0VsZW1lbnRcclxuICAgICAgdGhpcy5lZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybU9wdGlvbnMuUGFnaW5nQWN0aW9uTW9kZSA9IFBhZ2luZ0FjdGlvbk1vZGUuVXBkYXRlXHJcblxyXG5cclxuICAgICAgdGhpcy5lZGl0TmFtZSA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgICB0aGlzLmVkaXROYW1lLk5hbWUgPSBcImVkaXROYW1lXCI7ICAgXHJcbiAgICAgIHRoaXMuZWRpdE5hbWUuTGFiZWxLZXkgPSBcIk5hbWVcIjtcclxuICAgICAgdGhpcy5lZGl0TmFtZS5UeXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICAgIHRoaXMuZWRpdE5hbWUuSXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZWRpdE5hbWUuVmFsdWUgPSBhY3RpdmVEaXJlY3RvcnkuY29ubmVjdGlvbk5hbWU7XHJcblxyXG4gICAgICBsZXQgc2VsZWN0ZWRQZXJtaXNzaW9uU2V0ID0gdGhpcy5wZXJtaXNzaW9uU2V0TGlzdC5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIGl0ZW0ua2V5ID09IGFjdGl2ZURpcmVjdG9yeS5wZXJtaXNzaW9uU2V0SUQ7IH0pLm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpWzBdO1xyXG5cclxuICAgICAgdGhpcy5lZGl0UGVybWlzc2lvblNldE9wdGlvbnMgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuZWRpdFBlcm1pc3Npb25TZXRPcHRpb25zLk5hbWUgPSBcImVkaXRQZXJtaXNzaW9uU2V0T3B0aW9uc1wiXHJcbiAgICAgIHRoaXMuZWRpdFBlcm1pc3Npb25TZXRPcHRpb25zLkxhYmVsS2V5ID0gXCJQZXJtaXNzaW9uU2V0XCJcclxuICAgICAgdGhpcy5lZGl0UGVybWlzc2lvblNldE9wdGlvbnMuRGF0YVNvdXJjZSA9IHRoaXMucGVybWlzc2lvblNldExpc3RcclxuICAgICAgdGhpcy5lZGl0UGVybWlzc2lvblNldE9wdGlvbnMuU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5lZGl0UGVybWlzc2lvblNldE9wdGlvbnMuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLmVkaXRQZXJtaXNzaW9uU2V0T3B0aW9ucy5QbGFjZWhvbGRlciA9IFwiXCI7XHJcbiAgICAgIHRoaXMuZWRpdFBlcm1pc3Npb25TZXRPcHRpb25zLklzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmVkaXRQZXJtaXNzaW9uU2V0T3B0aW9ucy5TZWxlY3RlZEl0ZW1zID0gc2VsZWN0ZWRQZXJtaXNzaW9uU2V0O1xyXG5cclxuICAgICAgbGV0IHNlbGVjdGVkTGFuZ3VhZ2UgPSB0aGlzLmxhbmd1YWdlc0xpc3QuZmlsdGVyKChpdGVtKSA9PiB7IHJldHVybiBpdGVtLmtleSA9PSBhY3RpdmVEaXJlY3RvcnkubGFuZ0tleTsgfSkubWFwKChpdGVtKSA9PiBpdGVtLmtleSlbMF07XHJcblxyXG4gICAgICB0aGlzLmVkaXRMYW5ndWFnZU9wdGlvbnMgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuZWRpdExhbmd1YWdlT3B0aW9ucy5OYW1lID0gXCJlZGl0TGFuZ3VhZ2VPcHRpb25zXCJcclxuICAgICAgdGhpcy5lZGl0TGFuZ3VhZ2VPcHRpb25zLkxhYmVsVmFsdWUgPSBcIkxhbmd1YWdlXCJcclxuICAgICAgdGhpcy5lZGl0TGFuZ3VhZ2VPcHRpb25zLkxhYmVsS2V5ID0gXCJMYW5ndWFnZVwiXHJcbiAgICAgIHRoaXMuZWRpdExhbmd1YWdlT3B0aW9ucy5EYXRhU291cmNlID0gdGhpcy5sYW5ndWFnZXNMaXN0XHJcbiAgICAgIHRoaXMuZWRpdExhbmd1YWdlT3B0aW9ucy5TaW5nbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICB0aGlzLmVkaXRMYW5ndWFnZU9wdGlvbnMuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLmVkaXRMYW5ndWFnZU9wdGlvbnMuUGxhY2Vob2xkZXIgPSBcIlwiO1xyXG4gICAgICB0aGlzLmVkaXRMYW5ndWFnZU9wdGlvbnMuSXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZWRpdExhbmd1YWdlT3B0aW9ucy5TZWxlY3RlZEl0ZW1zID0gc2VsZWN0ZWRMYW5ndWFnZTtcclxuXHJcbiAgICAgIGxldCBzZWxlY3RlZFdlbGNvbWVNc2dUZW1wID0gYWN0aXZlRGlyZWN0b3J5LndlbGNvbWVUZW1wbGF0ZUlEICE9IG51bGwgPyB0aGlzLndlbGNvbWVNc2dUZW1wTGlzdC5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIGl0ZW0ua2V5ID09IGFjdGl2ZURpcmVjdG9yeS53ZWxjb21lVGVtcGxhdGVJRDsgfSkubWFwKChpdGVtKSA9PiBpdGVtLmtleSlbMF0gOiBudWxsO1xyXG5cclxuICAgICAgdGhpcy5lZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9ucyA9IG5ldyBEcm9wZG93bk9wdGlvbnMoKTtcclxuICAgICAgdGhpcy5lZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9ucy5OYW1lID0gXCJlZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9uc1wiXHJcbiAgICAgIHRoaXMuZWRpdFdlbGNvbWVNc2dUZW1wbGF0ZU9wdGlvbnMuTGFiZWxLZXkgPSBcIldlbGNvbWVNc2dUZW1wbGF0ZVwiXHJcbiAgICAgIHRoaXMuZWRpdFdlbGNvbWVNc2dUZW1wbGF0ZU9wdGlvbnMuRGF0YVNvdXJjZSA9IHRoaXMud2VsY29tZU1zZ1RlbXBMaXN0XHJcbiAgICAgIHRoaXMuZWRpdFdlbGNvbWVNc2dUZW1wbGF0ZU9wdGlvbnMuU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5lZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9ucy5BbGxvd1NlYXJjaEZpbHRlciA9IHRydWU7XHJcbiAgICAgIHRoaXMuZWRpdFdlbGNvbWVNc2dUZW1wbGF0ZU9wdGlvbnMuUGxhY2Vob2xkZXIgPSBcIlwiO1xyXG4gICAgICB0aGlzLmVkaXRXZWxjb21lTXNnVGVtcGxhdGVPcHRpb25zLklzUmVxdWlyZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5lZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9ucy5TZWxlY3RlZEl0ZW1zID0gc2VsZWN0ZWRXZWxjb21lTXNnVGVtcDtcclxuXHJcblxyXG4gICAgICB0aGlzLmVkaXRJbmFjdGl2ZSA9IG5ldyBUb2dnbGVTbGlkZU9wdGlvbnMoKTtcclxuICAgICAgdGhpcy5lZGl0SW5hY3RpdmUuTmFtZSA9IFwiZWRpdEluYWN0aXZlXCI7XHJcbiAgICAgIHRoaXMuZWRpdEluYWN0aXZlLlZhbHVlID0gYWN0aXZlRGlyZWN0b3J5Lm1hcmtBc0luYWN0aXZlO1xyXG4gICAgICB0aGlzLmVkaXRJbmFjdGl2ZS5MYWJlbEtleSA9IFwiTWFya0FzSW5hY3RpdmVcIlxyXG4gICAgICB0aGlzLmVkaXRJbmFjdGl2ZS5WaWV3VHlwZSA9IENvbnRyb2xMYXlvdXQuSG9yaXpvbnRhbDtcclxuXHJcbiAgICAgIHRoaXMuZWRpdERhaWx5Sm9iID0gbmV3IFRvZ2dsZVNsaWRlT3B0aW9ucygpO1xyXG4gICAgICB0aGlzLmVkaXREYWlseUpvYi5OYW1lID0gXCJlZGl0RGFpbHlKb2JcIlxyXG4gICAgICB0aGlzLmVkaXREYWlseUpvYi5MYWJlbEtleSA9IFwiQWRkVG9EYWlseUpvYlwiXHJcbiAgICAgIHRoaXMuZWRpdERhaWx5Sm9iLlZhbHVlID0gYWN0aXZlRGlyZWN0b3J5LmFkZFRvRGFpbHlKb2I7XHJcbiAgICAgIHRoaXMuZWRpdERhaWx5Sm9iLlZpZXdUeXBlID0gQ29udHJvbExheW91dC5Ib3Jpem9udGFsO1xyXG5cclxuXHJcbiAgICAgIC8vV2luZG93cyBtb2RlXHJcbiAgICAgIGlmICh0aGlzLmVkaXRBRFR5cGVJRCA9PSBOdW1iZXIoQURUeXBlLldpbmRvd3MpKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0SWRlbnRpZmllciA9IGFjdGl2ZURpcmVjdG9yeS5pZGVudGlmaWVyO1xyXG4gICAgICAgIHRoaXMuZWRpdFdpbmRvd3NUeXBlTmFtZSA9IGFjdGl2ZURpcmVjdG9yeS5hZFR5cGVOYW1lO1xyXG5cclxuICAgICAgICB0aGlzLmVkaXREb21haW4gPSBuZXcgVGV4dEJveE9wdGlvbnMoKTtcclxuICAgICAgICB0aGlzLmVkaXREb21haW4uTmFtZSA9IFwiZWRpdERvbWFpblwiOyAgIFxyXG4gICAgICAgIHRoaXMuZWRpdERvbWFpbi5MYWJlbEtleSA9IFwiRG9tYWluXCI7XHJcbiAgICAgICAgdGhpcy5lZGl0RG9tYWluLlR5cGUgPSBJbnB1dFR5cGUuVGV4dDtcclxuICAgICAgICB0aGlzLmVkaXREb21haW4uSXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5lZGl0RG9tYWluLlZhbHVlID0gYWN0aXZlRGlyZWN0b3J5LmRvbWFpbjtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0U2FtQWNjb3VudCA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgICAgIHRoaXMuZWRpdFNhbUFjY291bnQuTmFtZSA9IFwiZWRpdFNhbUFjY291bnRcIjsgICBcclxuICAgICAgICB0aGlzLmVkaXRTYW1BY2NvdW50LkxhYmVsS2V5ID0gXCJTYW1BY2NvdW50XCI7XHJcbiAgICAgICAgdGhpcy5lZGl0U2FtQWNjb3VudC5UeXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICAgICAgdGhpcy5lZGl0U2FtQWNjb3VudC5WYWx1ZSA9IGFjdGl2ZURpcmVjdG9yeS5zYW1BY2NvdW50O1xyXG5cclxuICAgICAgICB0aGlzLmVkaXRQYXNzd29yZCA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgICAgIHRoaXMuZWRpdFBhc3N3b3JkLk5hbWUgPSBcImVkaXRQYXNzd29yZFwiOyAgIFxyXG4gICAgICAgIHRoaXMuZWRpdFBhc3N3b3JkLkxhYmVsS2V5ID0gXCJQYXNzd29yZFwiO1xyXG4gICAgICAgIHRoaXMuZWRpdFBhc3N3b3JkLlR5cGUgPSBJbnB1dFR5cGUuUGFzc3dvcmQ7XHJcbiAgICAgICAgdGhpcy5lZGl0UGFzc3dvcmQuUmVtb3ZlRGVmYXVsdFBhc3N3b3JkVmFsaWRhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5lZGl0UGFzc3dvcmQuVmFsdWUgPSBhY3RpdmVEaXJlY3RvcnkucGFzc3dvcmQ7XHJcblxyXG4gICAgICAgIHRoaXMuc2hvd1dpbmRvd3NDb250cm9sID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmVkaXRBRFR5cGVJRCA9PSBOdW1iZXIoQURUeXBlLkF6dXJlKSkge1xyXG4gICAgICAgIHRoaXMuZWRpdFRlbmFudElEID0gbmV3IFRleHRCb3hPcHRpb25zKCk7XHJcbiAgICAgICAgdGhpcy5lZGl0VGVuYW50SUQuTmFtZSA9IFwiZWRpdFRlbmFudElEXCI7XHJcbiAgICAgICAgdGhpcy5lZGl0VGVuYW50SUQuTGFiZWxLZXkgPSBcIlRlbmFudElEXCI7XHJcbiAgICAgICAgdGhpcy5lZGl0VGVuYW50SUQuVHlwZSA9IElucHV0VHlwZS5UZXh0O1xyXG4gICAgICAgIHRoaXMuZWRpdFRlbmFudElELklzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZWRpdFRlbmFudElELlZhbHVlID0gYWN0aXZlRGlyZWN0b3J5LnRlbmFudElEO1xyXG5cclxuICAgICAgICB0aGlzLmVkaXRDbGllbnRJRCA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgICAgIHRoaXMuZWRpdENsaWVudElELk5hbWUgPSBcImVkaXRDbGllbnRJRFwiO1xyXG4gICAgICAgIHRoaXMuZWRpdENsaWVudElELkxhYmVsS2V5ID0gXCJDbGllbnRJRFwiO1xyXG4gICAgICAgIHRoaXMuZWRpdENsaWVudElELlR5cGUgPSBJbnB1dFR5cGUuVGV4dDtcclxuICAgICAgICB0aGlzLmVkaXRDbGllbnRJRC5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmVkaXRDbGllbnRJRC5WYWx1ZSA9IGFjdGl2ZURpcmVjdG9yeS5jbGllbnRJRDtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0Q2xpZW50U2VjcmV0ID0gbmV3IFRleHRCb3hPcHRpb25zKCk7XHJcbiAgICAgICAgdGhpcy5lZGl0Q2xpZW50U2VjcmV0Lk5hbWUgPSBcImVkaXRDbGllbnRTZWNyZXRcIjtcclxuICAgICAgICB0aGlzLmVkaXRDbGllbnRTZWNyZXQuTGFiZWxLZXkgPSBcIkNsaWVudFNlY3JldFwiO1xyXG4gICAgICAgIHRoaXMuZWRpdENsaWVudFNlY3JldC5UeXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICAgICAgdGhpcy5lZGl0Q2xpZW50U2VjcmV0LklzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZWRpdENsaWVudFNlY3JldC5WYWx1ZSA9IGFjdGl2ZURpcmVjdG9yeS5jbGllbnRTZWNyZXQ7XHJcblxyXG4gICAgICAgIHRoaXMuc2hvd0F6dXJlQ29udHJvbCA9IHRydWU7XHJcblxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgbGV0IGRhdGE6IGFueSA9IHRoaXMuZ2V0QURNYXBwaW5nT3B0aW9ucyhhY3RpdmVEaXJlY3RvcnkuYWRNYXBwaW5ncyk7XHJcblxyXG4gICAgICB0aGlzLmVkaXRNYXBwaW5nc09wdGlvbnMgPSBkYXRhWzBdO1xyXG4gICAgICB0aGlzLmVkaXRNYXBwaW5nc0NvdW50ID0gZGF0YVsxXTtcclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihlZGl0QURNb2RhbCk7XHJcblxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldEVkaXRBRE1vZGVsID0gKCkgPT4ge1xyXG4gICAgbGV0IHBhcmFtQXJyYXk6IGFueVtdID0gW107XHJcbiAgICBsZXQgcmVzdWx0TW9kZWwgPSB0aGlzLmVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtLnZhbHVlO1xyXG4gICAgbGV0IEVkaXRNb2RlbCA9IG5ldyBBY3RpdmVEaXJlY3RvcnlBZGRFZGl0TW9kZWwoKTtcclxuXHJcbiAgICBFZGl0TW9kZWwuSUQgPSBOdW1iZXIodGhpcy5hY3RpdmVEaXJlY3RvcnlJZCk7XHJcbiAgICBFZGl0TW9kZWwuQ29ubmVjdGlvbk5hbWUgPSByZXN1bHRNb2RlbC5lZGl0TmFtZTsgXHJcbiAgICBFZGl0TW9kZWwuUGVybWlzc2lvblNldElEID0gcmVzdWx0TW9kZWwuZWRpdFBlcm1pc3Npb25TZXRPcHRpb25zICE9IG51bGwgPyBOdW1iZXIocmVzdWx0TW9kZWwuZWRpdFBlcm1pc3Npb25TZXRPcHRpb25zKSA6IG51bGxcclxuICAgIEVkaXRNb2RlbC5MYW5nS2V5ID0gcmVzdWx0TW9kZWwuZWRpdExhbmd1YWdlT3B0aW9ucztcclxuICAgIEVkaXRNb2RlbC5XZWxjb21lVGVtcGxhdGVJRCA9IHJlc3VsdE1vZGVsLmVkaXRXZWxjb21lTXNnVGVtcGxhdGVPcHRpb25zICE9IG51bGwgPyBOdW1iZXIocmVzdWx0TW9kZWwuZWRpdFdlbGNvbWVNc2dUZW1wbGF0ZU9wdGlvbnMpIDogbnVsbFxyXG4gICAgRWRpdE1vZGVsLk1hcmtBc0luYWN0aXZlID0gcmVzdWx0TW9kZWwuZWRpdEluYWN0aXZlO1xyXG4gICAgRWRpdE1vZGVsLkFkZFRvRGFpbHlKb2IgPSByZXN1bHRNb2RlbC5lZGl0RGFpbHlKb2I7XHJcblxyXG4gICAgaWYgKHRoaXMuZWRpdEFEVHlwZUlEID09IE51bWJlcihBRFR5cGUuV2luZG93cykpIHtcclxuICAgICAgRWRpdE1vZGVsLkRvbWFpbiA9IHJlc3VsdE1vZGVsLmVkaXREb21haW47XHJcbiAgICAgIEVkaXRNb2RlbC5TYW1BY2NvdW50ID0gcmVzdWx0TW9kZWwuZWRpdFNhbUFjY291bnQ7XHJcbiAgICAgIEVkaXRNb2RlbC5QYXNzd29yZCA9IHJlc3VsdE1vZGVsLmVkaXRQYXNzd29yZDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuZWRpdEFEVHlwZUlEID09IE51bWJlcihBRFR5cGUuQXp1cmUpKSB7XHJcbiAgICAgIEVkaXRNb2RlbC5UZW5hbnRJRCA9IHJlc3VsdE1vZGVsLmVkaXRUZW5hbnRJRDtcclxuICAgICAgRWRpdE1vZGVsLkNsaWVudElEID0gcmVzdWx0TW9kZWwuZWRpdENsaWVudElEO1xyXG4gICAgICBFZGl0TW9kZWwuQ2xpZW50U2VjcmV0ID0gcmVzdWx0TW9kZWwuZWRpdENsaWVudFNlY3JldDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmVkaXRNYXBwaW5nc0NvdW50OyBqKyspIHtcclxuICAgICAgbGV0IGVkaXRNQXBwaW5nVHlwZSA9IHJlc3VsdE1vZGVsW1wiQURNYXBwaW5nVHlwZVwiICsgal07XHJcbiAgICAgIGlmIChlZGl0TUFwcGluZ1R5cGUgPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICBsZXQgZWRpdE1BcHBpbmdQcm9wZXJ0eSA9IHJlc3VsdE1vZGVsW1wiQURNYXBwaW5nUHJvcGVydHlcIiArIGpdO1xyXG4gICAgICBsZXQgZWRpdE1BcHBpbmdQcm9wZXJ0eU5hbWUgPSByZXN1bHRNb2RlbFtcIkFETWFwcGluZ1Byb3BlcnR5TmFtZVwiICsgal07XHJcbiAgICAgIGxldCBlZGl0TUFwcGluZ0luY2x1ZGVJblVwZGF0ZSA9IHJlc3VsdE1vZGVsW1wiQURNYXBwaW5nSW5jbHVkZVVwZGF0ZVwiICsgal07XHJcbiAgICAgIGxldCBlZGl0TUFwcGluZ0hpZGRlbkluY2x1ZGVJblVwZGF0ZSA9IHJlc3VsdE1vZGVsW1wiQURNYXBwaW5nSGlkZGVuSW5jbHVkZVVwZGF0ZVwiICsgal07XHJcblxyXG4gICAgICBsZXQgYWRNQXBwaW5nT2JqOiBBRE1hcHBpbmdNb2RlbCA9IG5ldyBBRE1hcHBpbmdNb2RlbCgpO1xyXG4gICAgICBhZE1BcHBpbmdPYmouQURNYXBwaW5nVHlwZUl0ZW1JRCA9IE51bWJlcihlZGl0TUFwcGluZ1R5cGUpO1xyXG4gICAgICBhZE1BcHBpbmdPYmouQkJTRlByb3BlcnR5TmFtZSA9IGVkaXRNQXBwaW5nUHJvcGVydHk7XHJcbiAgICAgIGFkTUFwcGluZ09iai5BRFByb3BlcnR5TmFtZSA9IGVkaXRNQXBwaW5nUHJvcGVydHlOYW1lO1xyXG4gICAgICBhZE1BcHBpbmdPYmouSW5jbHVkZUluVXBkYXRlID0gZWRpdE1BcHBpbmdJbmNsdWRlSW5VcGRhdGUgPT0gdW5kZWZpbmVkID8gZWRpdE1BcHBpbmdIaWRkZW5JbmNsdWRlSW5VcGRhdGUgOiBlZGl0TUFwcGluZ0luY2x1ZGVJblVwZGF0ZTtcclxuICAgICAgRWRpdE1vZGVsLkFETWFwcGluZ3MucHVzaChhZE1BcHBpbmdPYmopO1xyXG4gICAgfVxyXG4gICAgcGFyYW1BcnJheS5wdXNoKEVkaXRNb2RlbCk7XHJcbiAgICByZXR1cm4gcGFyYW1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldEVkaXRBREZ1bmN0aW9uID0gKEVkaXRNb2RlbCk6IE9ic2VydmFibGU8YW55PiA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVEaXJlY3RvcnlTZXJ2aWNlLmVkaXRBY3RpdmVEaXJlY3RvcnkoRWRpdE1vZGVsKVxyXG4gIH1cclxuXHJcbiAgLy9BRCBNYXBwaW5nIGZ1bmN0aW9uc1xyXG4gIGdldEFETWFwcGluZ09wdGlvbnMoQURNYXBwaW5nczogYW55W10pIHtcclxuICAgIGxldCBBRE1hcHBpbmdPcHRpb25zOiBhbnlbXSA9IFtdO1xyXG4gICAgbGV0IEFETWFwcGluZ0NvdW50OiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBBRE1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7XHJcblxyXG4gICAgICBsZXQgb2JqZWN0TWFwcGluZ09wdGlvbnM6IGFueVtdID0gW107XHJcblxyXG4gICAgICBsZXQgQURNYXBwaW5nVHlwZSA9IG5ldyBEcm9wZG93bk9wdGlvbnMoKTtcclxuICAgICAgbGV0IHNlbGVjdGVkVHlwZSA9IHRoaXMubWFwcGluZ1R5cGVzTGlzdC5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIGl0ZW0ua2V5ID09IEFETWFwcGluZ3NbaV0uYWRNYXBwaW5nVHlwZUl0ZW1JRDsgfSkubWFwKChpdGVtKSA9PiBpdGVtLmtleSlbMF07XHJcbiAgICAgIEFETWFwcGluZ1R5cGUuTmFtZSA9IFwiQURNYXBwaW5nVHlwZVwiICsgaTtcclxuICAgICAgQURNYXBwaW5nVHlwZS5IaWRlTGFiZWwgPSB0cnVlO1xyXG4gICAgICBBRE1hcHBpbmdUeXBlLlNpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgIEFETWFwcGluZ1R5cGUuU2VsZWN0ZWRJdGVtcyA9IHNlbGVjdGVkVHlwZTtcclxuICAgICAgQURNYXBwaW5nVHlwZS5WaWV3VHlwZSA9IENvbnRyb2xMYXlvdXQuSG9yaXpvbnRhbDtcclxuICAgICAgQURNYXBwaW5nVHlwZS5EYXRhU291cmNlID0gdGhpcy5tYXBwaW5nVHlwZXNMaXN0O1xyXG5cclxuICAgICAgbGV0IEFETWFwcGluZ1Byb3BlcnR5ID0gbmV3IERyb3Bkb3duT3B0aW9ucygpO1xyXG4gICAgICBsZXQgc2VsZWN0ZWRQcm9wZXJ0eSA9IHRoaXMubWFwcGluZ1Byb3BlcnRpZXNMaXN0LmZpbHRlcigoaXRlbSkgPT4geyByZXR1cm4gaXRlbS5rZXkgPT0gQURNYXBwaW5nc1tpXS5iYnNmUHJvcGVydHlOYW1lOyB9KS5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KVswXTtcclxuICAgICAgQURNYXBwaW5nUHJvcGVydHkuTmFtZSA9IFwiQURNYXBwaW5nUHJvcGVydHlcIiArIGk7XHJcbiAgICAgIEFETWFwcGluZ1Byb3BlcnR5LkhpZGVMYWJlbCA9IHRydWU7XHJcbiAgICAgIEFETWFwcGluZ1Byb3BlcnR5LlNpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgIEFETWFwcGluZ1Byb3BlcnR5LlNlbGVjdGVkSXRlbXMgPSBzZWxlY3RlZFByb3BlcnR5O1xyXG4gICAgICBBRE1hcHBpbmdQcm9wZXJ0eS5WaWV3VHlwZSA9IENvbnRyb2xMYXlvdXQuSG9yaXpvbnRhbDtcclxuICAgICAgQURNYXBwaW5nUHJvcGVydHkuRGF0YVNvdXJjZSA9IHRoaXMubWFwcGluZ1Byb3BlcnRpZXNMaXN0O1xyXG5cclxuXHJcbiAgICAgIGxldCBBRE1hcHBpbmdQcm9wZXJ0eU5hbWUgPSBuZXcgVGV4dEJveE9wdGlvbnMoKTtcclxuICAgICAgQURNYXBwaW5nUHJvcGVydHlOYW1lLk5hbWUgPSBcIkFETWFwcGluZ1Byb3BlcnR5TmFtZVwiICsgaTtcclxuICAgICAgQURNYXBwaW5nUHJvcGVydHlOYW1lLkhpZGVMYWJlbCA9IHRydWU7XHJcbiAgICAgIEFETWFwcGluZ1Byb3BlcnR5TmFtZS5UeXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICAgIEFETWFwcGluZ1Byb3BlcnR5TmFtZS5WYWx1ZSA9IEFETWFwcGluZ3NbaV0uYWRQcm9wZXJ0eU5hbWU7XHJcbiAgICAgIEFETWFwcGluZ1Byb3BlcnR5TmFtZS5WaWV3VHlwZSA9IENvbnRyb2xMYXlvdXQuSG9yaXpvbnRhbDtcclxuXHJcbiAgICAgIGxldCBBRE1hcHBpbmdJbmNsdWRlVXBkYXRlID0gbmV3IENoZWNrQm94T3B0aW9ucygpO1xyXG4gICAgICBBRE1hcHBpbmdJbmNsdWRlVXBkYXRlLk5hbWUgPSBcIkFETWFwcGluZ0luY2x1ZGVVcGRhdGVcIiArIGk7XHJcbiAgICAgIEFETWFwcGluZ0luY2x1ZGVVcGRhdGUuVmFsdWUgPSBBRE1hcHBpbmdzW2ldLmluY2x1ZGVJblVwZGF0ZTtcclxuICAgICAgQURNYXBwaW5nSW5jbHVkZVVwZGF0ZS5Jc0Rpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIGxldCBBRE1hcHBpbmdIaWRkZW5JbmNsdWRlVXBkYXRlID0gbmV3IFRleHRCb3hPcHRpb25zKCk7XHJcbiAgICAgIEFETWFwcGluZ0hpZGRlbkluY2x1ZGVVcGRhdGUuTmFtZSA9IFwiQURNYXBwaW5nSGlkZGVuSW5jbHVkZVVwZGF0ZVwiICsgaTtcclxuICAgICAgQURNYXBwaW5nSGlkZGVuSW5jbHVkZVVwZGF0ZS5IaWRlTGFiZWwgPSB0cnVlO1xyXG4gICAgICBBRE1hcHBpbmdIaWRkZW5JbmNsdWRlVXBkYXRlLlR5cGUgPSBJbnB1dFR5cGUuVGV4dDtcclxuICAgICAgQURNYXBwaW5nSGlkZGVuSW5jbHVkZVVwZGF0ZS5WYWx1ZSA9IEFETWFwcGluZ3NbaV0uaW5jbHVkZUluVXBkYXRlO1xyXG5cclxuXHJcbiAgICAgIG9iamVjdE1hcHBpbmdPcHRpb25zLnB1c2goQURNYXBwaW5nVHlwZSwgQURNYXBwaW5nUHJvcGVydHksIEFETWFwcGluZ1Byb3BlcnR5TmFtZSwgQURNYXBwaW5nSW5jbHVkZVVwZGF0ZSwgQURNYXBwaW5nSGlkZGVuSW5jbHVkZVVwZGF0ZSk7XHJcbiAgICAgIEFETWFwcGluZ09wdGlvbnMucHVzaChvYmplY3RNYXBwaW5nT3B0aW9ucyk7XHJcbiAgICAgIEFETWFwcGluZ0NvdW50ICs9IDE7XHJcblxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtBRE1hcHBpbmdPcHRpb25zLCBBRE1hcHBpbmdDb3VudF07XHJcbiAgfVxyXG4gIGRlbGV0ZUFETWFwcGluZyhkZWxldGVkQURNQXBwaW5nOiBhbnkpIHtcclxuICAgIGRlYnVnZ2VyO1xyXG4gICAgbGV0IGRlbGV0ZWRNYXBwaW5nSW5kZXg6IG51bWJlciA9IHRoaXMuZWRpdE1hcHBpbmdzT3B0aW9ucy5pbmRleE9mKGRlbGV0ZWRBRE1BcHBpbmcpO1xyXG4gICAgaWYgKGRlbGV0ZWRNYXBwaW5nSW5kZXggIT09IC0xKSB7XHJcbiAgICAgIHRoaXMuZWRpdE1hcHBpbmdzT3B0aW9ucy5zcGxpY2UoZGVsZXRlZE1hcHBpbmdJbmRleCwgMSk7XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRlZEFETUFwcGluZy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMuZWRpdEFjdGl2ZURpcmVjdG9yeUZvcm0ucmVtb3ZlQ29udHJvbChkZWxldGVkQURNQXBwaW5nW2ldLk5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRBRE1hcHBpbmcoKSB7XHJcbiAgICBsZXQgaW5kZXggPSB0aGlzLmVkaXRNYXBwaW5nc0NvdW50O1xyXG5cclxuICAgIGxldCBvYmplY3RNYXBwaW5nT3B0aW9uczogYW55W10gPSBbXTtcclxuXHJcbiAgICBsZXQgQURNYXBwaW5nVHlwZSA9IG5ldyBEcm9wZG93bk9wdGlvbnMoKTtcclxuICAgIEFETWFwcGluZ1R5cGUuTmFtZSA9IFwiQURNYXBwaW5nVHlwZVwiICsgaW5kZXg7XHJcbiAgICBBRE1hcHBpbmdUeXBlLkhpZGVMYWJlbCA9IHRydWU7XHJcbiAgICBBRE1hcHBpbmdUeXBlLlNpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICBBRE1hcHBpbmdUeXBlLlZpZXdUeXBlID0gQ29udHJvbExheW91dC5Ib3Jpem9udGFsO1xyXG4gICAgQURNYXBwaW5nVHlwZS5EYXRhU291cmNlID0gdGhpcy5tYXBwaW5nVHlwZXNMaXN0O1xyXG5cclxuICAgIGxldCBBRE1hcHBpbmdQcm9wZXJ0eSA9IG5ldyBEcm9wZG93bk9wdGlvbnMoKTtcclxuICAgIEFETWFwcGluZ1Byb3BlcnR5Lk5hbWUgPSBcIkFETWFwcGluZ1Byb3BlcnR5XCIgK2luZGV4O1xyXG4gICAgQURNYXBwaW5nUHJvcGVydHkuSGlkZUxhYmVsID0gdHJ1ZTtcclxuICAgIEFETWFwcGluZ1Byb3BlcnR5LlNpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICBBRE1hcHBpbmdQcm9wZXJ0eS5WaWV3VHlwZSA9IENvbnRyb2xMYXlvdXQuSG9yaXpvbnRhbDtcclxuICAgIEFETWFwcGluZ1Byb3BlcnR5LkRhdGFTb3VyY2UgPSB0aGlzLm1hcHBpbmdQcm9wZXJ0aWVzTGlzdDtcclxuXHJcblxyXG4gICAgbGV0IEFETWFwcGluZ1Byb3BlcnR5TmFtZSA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgQURNYXBwaW5nUHJvcGVydHlOYW1lLk5hbWUgPSBcIkFETWFwcGluZ1Byb3BlcnR5TmFtZVwiICsgaW5kZXg7XHJcbiAgICBBRE1hcHBpbmdQcm9wZXJ0eU5hbWUuSGlkZUxhYmVsID0gdHJ1ZTtcclxuICAgIEFETWFwcGluZ1Byb3BlcnR5TmFtZS5UeXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICBBRE1hcHBpbmdQcm9wZXJ0eU5hbWUuSXNSZXF1aXJlZCA9IGZhbHNlO1xyXG4gICAgQURNYXBwaW5nUHJvcGVydHlOYW1lLlZpZXdUeXBlID0gQ29udHJvbExheW91dC5Ib3Jpem9udGFsO1xyXG5cclxuICAgIGxldCBBRE1hcHBpbmdJbmNsdWRlVXBkYXRlID0gbmV3IENoZWNrQm94T3B0aW9ucygpO1xyXG4gICAgQURNYXBwaW5nSW5jbHVkZVVwZGF0ZS5OYW1lID0gXCJBRE1hcHBpbmdJbmNsdWRlVXBkYXRlXCIgKyBpbmRleDtcclxuXHJcbiAgICBsZXQgQURNYXBwaW5nSGlkZGVuSW5jbHVkZVVwZGF0ZSA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgQURNYXBwaW5nSGlkZGVuSW5jbHVkZVVwZGF0ZS5OYW1lID0gXCJBRE1hcHBpbmdIaWRkZW5JbmNsdWRlVXBkYXRlXCIgKyBpbmRleDtcclxuICAgIEFETWFwcGluZ0hpZGRlbkluY2x1ZGVVcGRhdGUuSGlkZUxhYmVsID0gdHJ1ZTtcclxuICAgIEFETWFwcGluZ0hpZGRlbkluY2x1ZGVVcGRhdGUuVHlwZSA9IElucHV0VHlwZS5UZXh0O1xyXG5cclxuICAgIG9iamVjdE1hcHBpbmdPcHRpb25zLnB1c2goQURNYXBwaW5nVHlwZSwgQURNYXBwaW5nUHJvcGVydHksIEFETWFwcGluZ1Byb3BlcnR5TmFtZSwgQURNYXBwaW5nSW5jbHVkZVVwZGF0ZSwgQURNYXBwaW5nSGlkZGVuSW5jbHVkZVVwZGF0ZSk7XHJcblxyXG4gICAgdGhpcy5lZGl0TWFwcGluZ3NPcHRpb25zLnB1c2gob2JqZWN0TWFwcGluZ09wdGlvbnMpO1xyXG4gICAgdGhpcy5lZGl0TWFwcGluZ3NDb3VudCArPSAxO1xyXG5cclxuICB9XHJcbiAgLy9EZWxldGUgQUN0aXZlRGlyZWN0b3J5XHJcbiAgc2hvd0RlbGV0ZUFjdGl2ZURpcmVjdG9yeU1vZGFsKGFjdGl2ZURpcmVjdG9yeUlEOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGVsZXRlQWN0aXZlRGlyZWN0b3J5SWQgPSBhY3RpdmVEaXJlY3RvcnlJRDtcclxuXHJcbiAgICAvL2FycmF5IHNlbnQgdG8gc2VydmljZSBmdW5jdGlvblxyXG4gICAgbGV0IHBhcmFtQXJyYXk6IGFueVtdID0gW107XHJcbiAgICBwYXJhbUFycmF5LnB1c2godGhpcy5kZWxldGVBY3RpdmVEaXJlY3RvcnlJZCk7XHJcblxyXG4gICAgdGhpcy5kZWxldGVDb25maXJtYXRpb25PcHRpb25zID0gbmV3IENvbmZpcm1hdGlvbk1vZGFsT3B0aW9ucygpO1xyXG4gICAgdGhpcy5kZWxldGVDb25maXJtYXRpb25PcHRpb25zLlNlcnZpY2VTdWJtaXRGdW5jdGlvbiA9IHRoaXMuZGVsZXRlQWN0aXZlRGlyZWN0b3J5O1xyXG4gICAgdGhpcy5kZWxldGVDb25maXJtYXRpb25PcHRpb25zLlNlcnZpY2VTdWJtaXRNb2RlbCA9IHBhcmFtQXJyYXk7XHJcbiAgICB0aGlzLmRlbGV0ZUNvbmZpcm1hdGlvbk9wdGlvbnMuUGFnaW5nUmVmZXJlbmNlID0gdGhpcy5wYWdpbmdFbGVtZW50O1xyXG4gICAgdGhpcy5kZWxldGVDb250cm9sTG9hZGVkID0gdHJ1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmRlbGV0ZUNvbmZpcm1hdGlvbk1vZGFsQ29udHJvbC5zaG93TW9kYWwoKTtcclxuICAgIH0sIDIwMCk7XHJcbiAgfVxyXG4gIGRlbGV0ZUFjdGl2ZURpcmVjdG9yeSA9IChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcclxuICAgIHJldHVybiB0aGlzLmFjdGl2ZURpcmVjdG9yeVNlcnZpY2UuZGVsZXRlQWN0aXZlRGlyZWN0b3J5KGlkKTtcclxuICB9XHJcblxyXG4gIC8vU3luYyBBY3RpdmUgRGlyZWN0b3J5XHJcbiAgc2hvd0FEU3luY2hyb25pemF0aW9uTW9kYWwoYWN0aXZlRGlyZWN0b3J5SUQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5zeW5jQWN0aXZlRGlyZWN0b3J5SWQgPSBhY3RpdmVEaXJlY3RvcnlJRDtcclxuXHJcbiAgICAvL2FycmF5IHNlbnQgdG8gc2VydmljZSBmdW5jdGlvblxyXG4gICAgbGV0IHBhcmFtQXJyYXk6IGFueVtdID0gW107XHJcbiAgICBwYXJhbUFycmF5LnB1c2godGhpcy5zeW5jQWN0aXZlRGlyZWN0b3J5SWQpO1xyXG5cclxuICAgIHRoaXMuc3luY0NvbmZpcm1hdGlvbk9wdGlvbnMgPSBuZXcgQ29uZmlybWF0aW9uTW9kYWxPcHRpb25zKCk7XHJcbiAgICB0aGlzLnN5bmNDb25maXJtYXRpb25PcHRpb25zLlNlcnZpY2VTdWJtaXRGdW5jdGlvbiA9IHRoaXMucnVuU3luY3Jvbml6YXRpb247XHJcbiAgICB0aGlzLnN5bmNDb25maXJtYXRpb25PcHRpb25zLlNlcnZpY2VTdWJtaXRNb2RlbCA9IHBhcmFtQXJyYXk7XHJcbiAgICB0aGlzLnN5bmNDb25maXJtYXRpb25PcHRpb25zLlBhZ2luZ1JlZmVyZW5jZSA9IHRoaXMucGFnaW5nRWxlbWVudDtcclxuICAgIHRoaXMuc3luY0NvbmZpcm1hdGlvbk9wdGlvbnMuUGFnaW5nQWN0aW9uTW9kZSA9IFBhZ2luZ0FjdGlvbk1vZGUuUmVpbml0aWFsaXplO1xyXG4gICAgdGhpcy5zeW5jQ29uZmlybWF0aW9uT3B0aW9ucy5Db25maXJtYXRpb25IZWFkZXIgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJSdW5TeW5jaHJvbml6YXRpb25cIik7XHJcbiAgICB0aGlzLnN5bmNDb25maXJtYXRpb25PcHRpb25zLkNvbmZpcm1hdGlvbkJvZHkgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJSdW5TeW5jaHJvbml6YXRpb25Db25maXJtYXRpb25cIik7XHJcbiAgICB0aGlzLnN5bmNDb25maXJtYXRpb25PcHRpb25zLlN0eWxlQ29uZmlybWF0aW9uTW9kZSA9IFN0eWxlQ29uZmlybWF0aW9uTW9kZS5XYXJuaW5nO1xyXG4gICAgdGhpcy5zeW5jQ29uZmlybWF0aW9uT3B0aW9ucy5TdWJtaXRCdXR0b25UZXh0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiWWVzXCIpO1xyXG4gICAgdGhpcy5zeW5jQ29uZmlybWF0aW9uT3B0aW9ucy5EaXNhYmxlU3VjY2Vzc05vdGlmaWNhdGlvbiA9IHRydWU7XHJcbiAgICB0aGlzLnN5bmNDb25maXJtYXRpb25PcHRpb25zLk9uU3VjY2Vzc0hhbmRsZXIgPSB0aGlzLnJ1blN5bmNPblN1Y2Nlc3M7XHJcbiAgICB0aGlzLnN5bmNDb250cm9sTG9hZGVkID0gdHJ1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnN5bmNDb25maXJtYXRpb25Nb2RhbENvbnRyb2wuc2hvd01vZGFsKCk7XHJcbiAgICB9LCAyMDApO1xyXG4gIH1cclxuICBydW5TeW5jcm9uaXphdGlvbiA9IChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcclxuICAgIHJldHVybiB0aGlzLmFjdGl2ZURpcmVjdG9yeVNlcnZpY2UucnVuQURTeW5jaHJvbml6YXRpb24oaWQpO1xyXG4gIH1cclxuXHJcbiAgcnVuU3luY09uU3VjY2VzcyA9IChyZXN1bHQpID0+IHtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICB9XHJcbiAgLy9MYXN0IHJ1biBsb2dzXHJcbiAgc2hvd0FETGFzdFJ1bkxvZ3NNb2RhbChhY3RpdmVEaXJlY3RvcnlJRDogc3RyaW5nLGxhc3RSdW5Mb2dzTW9kYWwpIHtcclxuICAgIHRoaXMuYWN0aXZlRGlyZWN0b3J5U2VydmljZS5nZXRMYXN0UnVuTG9ncyhhY3RpdmVEaXJlY3RvcnlJRCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgbGV0IGxhc3RSdW5Mb2dzTW9kZWwgPSByZXN1bHQgYXMgYW55O1xyXG5cclxuICAgICAgdGhpcy5hZENvbm5lY3Rpb25OYW1lID0gbGFzdFJ1bkxvZ3NNb2RlbC5tb2RlbC5hZENvbm5lY3Rpb25OYW1lO1xyXG4gICAgICB0aGlzLmxhc3RSdW5Mb2dzID0gbGFzdFJ1bkxvZ3NNb2RlbC5tb2RlbC5sb2dzO1xyXG5cclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihsYXN0UnVuTG9nc01vZGFsKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy9PbiBkZXN0cm95XHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlcXVlc3RIYW5kbGVyU2VydmljZS5kZXN0cm95SGFuZGxlcigpO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGJsb2NrLXVpPjwvYmxvY2stdWk+XHJcblxyXG48IS0tIFBhZ2UgQ29udGVudCAtLT5cclxuPGRpdiAqbmdJZj1cInNob3dQYWdlQ29udGVudFwiIGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XHJcbiAgPCEtLSBiZWdpbjo6SGVhZGVyIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtY3VzdG9tLWhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBwdC01XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlIGFsaWduLWl0ZW1zLXN0YXJ0IGZsZXgtY29sdW1uXCIgKm5nSWY9XCJpc0ZpbHRlckxvYWRlZFwiPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiYWN0aXZlRGlyZWN0b3J5Rm9ybVwiPlxyXG4gICAgICAgICAgPEJCU0YtVGV4dEJveCBbb3B0aW9uc109XCJzZWFyY2hUZXh0Qm94XCIgW2dyb3VwXT1cImFjdGl2ZURpcmVjdG9yeUZvcm1cIj48L0JCU0YtVGV4dEJveD5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10b29sYmFyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5XCIgdGl0bGU9J3t7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFkZFwiKX19JyBbcm91dGVyTGlua109XCJbJy9BZG1pbi9BRENvbm5lY3Rpb24vQWRkJ11cIj5cclxuICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXMgbWUtMVwiPjwvaT5cclxuICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFkZFwiKX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTNcIj5cclxuICAgICAgPCEtLWJlZ2luOjpBY3RpdmVEaXJlY3RvcnkgbGlzdC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGFsaWduLW1pZGRsZSB0YWJsZS1yb3ctZGFzaGVkIGZzLTYgZ3ktNSBkYXRhVGFibGUgbm8tZm9vdGVyXCI+XHJcbiAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0ciBjbGFzcz1cInRleHQtc3RhcnQgdGV4dC1ncmF5LTQwMCBmdy1ib2xkZXIgZnMtNyB0ZXh0LXVwcGVyY2FzZSBncy0wXCI+XHJcbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJOYW1lXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MHB4XCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiVHlwZVwiKX19PC90aD5cclxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlBlcm1pc3Npb25TZXRcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBZENvbm5lY3Rpb25SdW5uaW5nTm93XCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBY3Rpb25zXCIpfX08L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgIDx0Ym9keSBpZD1cImxpc3RpbmdDb250YWluZXJcIiBjbGFzcz1cImZ3LWJvbGQgdGV4dC1ncmF5LTYwMCBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGFjdGl2ZURpcmVjdG9yeSBvZiBjbGllbnRTaWRlUGFnaW5nUmVzdWx0XCI+XHJcblxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZGFya1wiPlxyXG4gICAgICAgICAgICAgICAge3thY3RpdmVEaXJlY3RvcnkubmFtZX19XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICB7e2FjdGl2ZURpcmVjdG9yeS5hZFR5cGVOYW1lfX1cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIHt7YWN0aXZlRGlyZWN0b3J5LnBlcm1pc3Npb25TZXROYW1lfX1cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtc3VjY2Vzc1wiICpuZ0lmPVwiYWN0aXZlRGlyZWN0b3J5LmlzUnVubmluZ05vdztlbHNlIG5vdF9SdW5uaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlllc1wiKX19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vdF9SdW5uaW5nPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIk5vXCIpfX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4taWNvbiBidG4tbGlnaHQgYnRuLWFjdGl2ZS1saWdodC1wcmltYXJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1lbGxpcHNpcy1oXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcC1pdGVtIHB4LTNcIiBuZ2JEcm9wZG93bkl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0VkaXRBY3RpdmVEaXJlY3RvcnlNb2RhbChhY3RpdmVEaXJlY3RvcnkuaWQsYWN0aXZlRGlyZWN0b3J5LmlkRW5jcnlwdGVkLGVkaXRBY3RpdmVEaXJlY3RvcnlNb2RhbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcC1saW5rIHB4LTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFZGl0XCIpfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIG5nYkRyb3Bkb3duSXRlbSBjbGFzcz1cImRyb3AtaXRlbSBweC0zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0RlbGV0ZUFjdGl2ZURpcmVjdG9yeU1vZGFsKGFjdGl2ZURpcmVjdG9yeS5pZEVuY3J5cHRlZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcC1saW5rIHB4LTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJEZWxldGVcIil9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgbmdiRHJvcGRvd25JdGVtIGNsYXNzPVwiZHJvcC1pdGVtIHB4LTNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93QURTeW5jaHJvbml6YXRpb25Nb2RhbChhY3RpdmVEaXJlY3RvcnkuaWRFbmNyeXB0ZWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyb3AtbGluayBweC0zXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQWN0aXZlRGlyZWN0b3J5UnVuU3luY3Jvbml6YXRpb25cIil9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgbmdiRHJvcGRvd25JdGVtIGNsYXNzPVwiZHJvcC1pdGVtIHB4LTNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93QURMYXN0UnVuTG9nc01vZGFsKGFjdGl2ZURpcmVjdG9yeS5pZEVuY3J5cHRlZCxsYXN0UnVuTG9nc01vZGFsKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkcm9wLWxpbmsgcHgtM1wiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFjdGl2ZURpcmVjdG9yeUxhc3RSdW5Mb2dzXCIpfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPHRyICpuZ0lmPVwiY2xpZW50U2lkZVBhZ2luZ1Jlc3VsdC5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNVwiPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1lbXB0eS1kYXRhPjwvbGliLWVtcHR5LWRhdGE+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS1lbmQ6OkFjdGl2ZSBkaXJlY3RvcnkgbGlzdC0tPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTBcIj5cclxuICAgICAgPEJCU0YtUGFnaW5nIChJdGVtcyk9XCJzZXRBY3RpdmVEaXJlY3RvcnlMaXN0UmVzdWx0KCRldmVudClcIiAqbmdJZj1cImlzRmlsdGVyTG9hZGVkXCJcclxuICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImFjdGl2ZURpcmVjdG9yeVBhZ2luZ1wiIFtncm91cF09XCJhY3RpdmVEaXJlY3RvcnlGb3JtXCIgI2FjdGl2ZURpcmVjdG9yeVBhZ2luZ1ZpZXdFbGVtZW50PlxyXG4gICAgICA8L0JCU0YtUGFnaW5nPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjwhLS0gRWRpdCBNb2RhbCAtLT5cclxuPG5nLXRlbXBsYXRlICNlZGl0QWN0aXZlRGlyZWN0b3J5TW9kYWwgbGV0LW1vZGFsPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgcGItMCBib3JkZXItMCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwiZXhhbXBsZU1vZGFsTGFiZWxcIj48L2g1PlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gYnRuLWFjdGl2ZS1jb2xvci1wcmltYXJ5XCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLTFcIj5cclxuICAgICAgICA8c3BhbiBbaW5saW5lU1ZHXT1cIicuL3NyYy9hc3NldHMvaW1hZ2VzL2FycjA2MS5zdmcnXCI+PC9zcGFuPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWItMTMgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgPGgxIGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkVkaXRcIil9fSB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBY3RpdmVEaXJlY3RvcnlcIil9fVxyXG4gICAgICA8L2gxPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8QkJTRi1Gb3JtIFtvcHRpb25zXT1cImVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtT3B0aW9uc1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICA8QkJTRi1UZXh0Qm94IFtvcHRpb25zXT1cImVkaXROYW1lXCIgW2dyb3VwXT1cImVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtXCI+XHJcbiAgICAgICAgICA8L0JCU0YtVGV4dEJveD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgIDxCQlNGLURyb3Bkb3duTGlzdCBbb3B0aW9uc109XCJlZGl0UGVybWlzc2lvblNldE9wdGlvbnNcIiBbZ3JvdXBdPVwiZWRpdEFjdGl2ZURpcmVjdG9yeUZvcm1cIj5cclxuICAgICAgICAgIDwvQkJTRi1Ecm9wZG93bkxpc3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICA8QkJTRi1Ecm9wZG93bkxpc3QgW29wdGlvbnNdPVwiZWRpdExhbmd1YWdlT3B0aW9uc1wiIFtncm91cF09XCJlZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybVwiPlxyXG4gICAgICAgICAgPC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgIDxCQlNGLURyb3Bkb3duTGlzdCBbb3B0aW9uc109XCJlZGl0V2VsY29tZU1zZ1RlbXBsYXRlT3B0aW9uc1wiIFtncm91cF09XCJlZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybVwiPlxyXG4gICAgICAgICAgPC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICA8aDY+XHJcbiAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFEVHlwZVwiKX19XHJcbiAgICAgICAgICA8L2g2PlxyXG4gICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICB7e2VkaXRBRFR5cGVOYW1lfX1cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd1dpbmRvd3NDb250cm9sXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgIDxoNj5cclxuICAgICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJJZGVudGlmaWVyXCIpfX1cclxuICAgICAgICAgICAgPC9oNj5cclxuICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgIHt7ZWRpdElkZW50aWZpZXJ9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgPGg2PlxyXG4gICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlR5cGVcIil9fVxyXG4gICAgICAgICAgICA8L2g2PlxyXG4gICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAge3tlZGl0V2luZG93c1R5cGVOYW1lfX1cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPEJCU0YtVGV4dEJveCBbb3B0aW9uc109XCJlZGl0RG9tYWluXCIgW2dyb3VwXT1cImVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtXCI+XHJcbiAgICAgICAgICAgIDwvQkJTRi1UZXh0Qm94PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgIDxCQlNGLVRleHRCb3ggW29wdGlvbnNdPVwiZWRpdFNhbUFjY291bnRcIiBbZ3JvdXBdPVwiZWRpdEFjdGl2ZURpcmVjdG9yeUZvcm1cIj5cclxuICAgICAgICAgICAgPC9CQlNGLVRleHRCb3g+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICA8QkJTRi1UZXh0Qm94IFtvcHRpb25zXT1cImVkaXRQYXNzd29yZFwiIFtncm91cF09XCJlZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybVwiPlxyXG4gICAgICAgICAgICA8L0JCU0YtVGV4dEJveD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cInNob3dBenVyZUNvbnRyb2xcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgIDxCQlNGLVRleHRCb3ggW29wdGlvbnNdPVwiZWRpdFRlbmFudElEXCIgW2dyb3VwXT1cImVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtXCI+XHJcbiAgICAgICAgICAgIDwvQkJTRi1UZXh0Qm94PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8QkJTRi1UZXh0Qm94IFtvcHRpb25zXT1cImVkaXRDbGllbnRJRFwiIFtncm91cF09XCJlZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybVwiPlxyXG4gICAgICAgICAgICA8L0JCU0YtVGV4dEJveD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPEJCU0YtVGV4dEJveCBbb3B0aW9uc109XCJlZGl0Q2xpZW50U2VjcmV0XCIgW2dyb3VwXT1cImVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtXCI+XHJcbiAgICAgICAgICAgIDwvQkJTRi1UZXh0Qm94PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgIDxCQlNGLVRvZ2dsZXNsaWRlIFtvcHRpb25zXT1cImVkaXRJbmFjdGl2ZVwiIFtncm91cF09XCJlZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybVwiPlxyXG4gICAgICAgICAgPC9CQlNGLVRvZ2dsZXNsaWRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgPEJCU0YtVG9nZ2xlc2xpZGUgW29wdGlvbnNdPVwiZWRpdERhaWx5Sm9iXCIgW2dyb3VwXT1cImVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtXCI+XHJcbiAgICAgICAgICA8L0JCU0YtVG9nZ2xlc2xpZGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYW1zeC10YWJsZS11c2Vyc1wiPlxyXG4gICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgPHRoPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlR5cGVcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgPHRoPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlByb3BlcnR5XCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgIDx0aD57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBY3RpdmVEaXJlY3RvcnlfUHJvcGVydHlcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgPHRoPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkluY2x1ZGVJblVwZGF0ZVwiKX19PC90aD5cclxuICAgICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGVkaXRNYXBwaW5nc09wdGlvbnM7bGV0IGk9aW5kZXg7XCI+XHJcblxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxCQlNGLURyb3Bkb3duTGlzdCBbb3B0aW9uc109XCJvcHRpb25bMF1cIiBbZ3JvdXBdPVwiZWRpdEFjdGl2ZURpcmVjdG9yeUZvcm1cIj5cclxuICAgICAgICAgICAgICAgIDwvQkJTRi1Ecm9wZG93bkxpc3Q+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8QkJTRi1Ecm9wZG93bkxpc3QgW29wdGlvbnNdPVwib3B0aW9uWzFdXCIgW2dyb3VwXT1cImVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICA8L0JCU0YtRHJvcGRvd25MaXN0PlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPEJCU0YtVGV4dEJveCBbb3B0aW9uc109XCJvcHRpb25bMl1cIiBbZ3JvdXBdPVwiZWRpdEFjdGl2ZURpcmVjdG9yeUZvcm1cIj5cclxuICAgICAgICAgICAgICAgIDwvQkJTRi1UZXh0Qm94PlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPEJCU0YtQ2hlY2tCb3ggW29wdGlvbnNdPVwib3B0aW9uWzNdXCIgW2dyb3VwXT1cImVkaXRBY3RpdmVEaXJlY3RvcnlGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICA8L0JCU0YtQ2hlY2tCb3g+XHJcbiAgICAgICAgICAgICAgICA8IS0tSGlkZGVuIGluY2x1ZGUgaW4gdXBkYXRlIHZhbHVlLS0+XHJcbiAgICAgICAgICAgICAgICA8QkJTRi1UZXh0Qm94IFtvcHRpb25zXT1cIm9wdGlvbls0XVwiIFtncm91cF09XCJlZGl0QWN0aXZlRGlyZWN0b3J5Rm9ybVwiIFtoaWRkZW5dPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9CQlNGLVRleHRCb3g+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXIgYWxpZ24tbWlkZGxlXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImt0LW5hdl9fbGlua1wiIChjbGljayk9XCJkZWxldGVBRE1hcHBpbmcob3B0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImt0LW5hdl9fbGluay1pY29uIGZhIGZhLXRyYXNoIGhpZGRlblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI1XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInctMTAwIGJ0biBidG4tc3VjY2Vzc1wiIChjbGljayk9XCJhZGRBRE1hcHBpbmcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBZGROZXdSZWNvcmRcIil9fVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHQtN1wiPlxyXG4gICAgICAgIDxidXR0b24gI0Nsb3NlRWRpdEFETW9kYWwgaWQ9XCJDbG9zZUVkaXRBRE1vZGFsXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMyBidG4tc21cIj5cclxuICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTYXZlTGFiZWxcIil9fTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvQkJTRi1Gb3JtPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSBEZWxldGUgIE1vZGFsIC0tPlxyXG48QkJTRi1Db25maXJtYXRpb25Nb2RhbCAqbmdJZj1cImRlbGV0ZUNvbnRyb2xMb2FkZWRcIiBbb3B0aW9uc109XCJkZWxldGVDb25maXJtYXRpb25PcHRpb25zXCIgaWQ9XCJkZWxldGVDb25maXJtYXRpb25Nb2RhbENvbnRyb2xcIiAjZGVsZXRlQ29uZmlybWF0aW9uTW9kYWxDb250cm9sPjwvQkJTRi1Db25maXJtYXRpb25Nb2RhbD5cclxuXHJcbjwhLS0gU3luY2hyb25pemF0aW9uICBNb2RhbCAtLT5cclxuPEJCU0YtQ29uZmlybWF0aW9uTW9kYWwgKm5nSWY9XCJzeW5jQ29udHJvbExvYWRlZFwiIFtvcHRpb25zXT1cInN5bmNDb25maXJtYXRpb25PcHRpb25zXCIgaWQ9XCJzeW5jQ29uZmlybWF0aW9uTW9kYWxDb250cm9sXCIgI3N5bmNDb25maXJtYXRpb25Nb2RhbENvbnRyb2w+PC9CQlNGLUNvbmZpcm1hdGlvbk1vZGFsPlxyXG5cclxuPCEtLSBWaWV3IExhc3QgUnVuIExvZ3MgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjbGFzdFJ1bkxvZ3NNb2RhbCBsZXQtbW9kYWw+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwYi0wIGJvcmRlci0wIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJleGFtcGxlTW9kYWxMYWJlbFwiPjwvaDU+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4taWNvbiBidG4tYWN0aXZlLWNvbG9yLXByaW1hcnlcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMVwiPlxyXG4gICAgICAgIDxzcGFuIFtpbmxpbmVTVkddPVwiJy4vc3JjL2Fzc2V0cy9pbWFnZXMvYXJyMDYxLnN2ZydcIj48L3NwYW4+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHNjcm9sbC15IHB4LTEwIHB4LWxnLTE1IHB0LTAgcGItMTVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0xMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICA8aDEgY2xhc3M9XCJtYi0zXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQWN0aXZlRGlyZWN0b3J5TGFzdFJ1bkxvZ3NcIil9fSA6IHt7YWRDb25uZWN0aW9uTmFtZX19PC9oMT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgIDxwPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIk5hbWVcIil9fSA6IHt7YWRDb25uZWN0aW9uTmFtZX19PC9wPlxyXG4gICAgICAgICAgPHByZSBjbGFzcz1cImNvbC1tZC0xMlwiPnt7bGFzdFJ1bkxvZ3N9fTwvcHJlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHB0LTdcIj5cclxuICAgICAgICA8YnV0dG9uICNDbG9zZURlZmF1bHRQcm92aWRlck1vZGFsIGlkPVwiQ2xvc2VEZWZhdWx0UHJvdmlkZXJNb2RhbFwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBtZS0zIFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPlxyXG4gICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ2xvc2VcIil9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG4iXX0=
|