@alfresco/adf-process-services-cloud 8.1.0-15714928883 → 8.1.0-15782677066
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/adf-process-services-cloud.mjs +5 -0
- package/esm2022/lib/app/app-list-cloud.module.mjs +20 -0
- package/esm2022/lib/app/components/app-details-cloud/app-details-cloud.component.mjs +67 -0
- package/esm2022/lib/app/components/app-list-cloud/app-list-cloud.component.mjs +126 -0
- package/esm2022/lib/app/models/application-instance.model.mjs +24 -0
- package/esm2022/lib/app/public-api.mjs +22 -0
- package/esm2022/lib/app/services/apps-process-cloud.service.mjs +97 -0
- package/esm2022/lib/common/date-range-filter/date-range-filter.component.mjs +164 -0
- package/esm2022/lib/common/date-range-filter/date-range-filter.service.mjs +97 -0
- package/esm2022/lib/common/index.mjs +18 -0
- package/esm2022/lib/common/interface/environment.interface.mjs +18 -0
- package/esm2022/lib/common/interface/index.mjs +18 -0
- package/esm2022/lib/common/interface/public-api.mjs +18 -0
- package/esm2022/lib/common/public-api.mjs +19 -0
- package/esm2022/lib/form/components/cloud-form-rendering.service.mjs +57 -0
- package/esm2022/lib/form/components/form-cloud-custom-outcomes.component.mjs +31 -0
- package/esm2022/lib/form/components/form-cloud.component.mjs +416 -0
- package/esm2022/lib/form/components/form-definition-selector-cloud.component.mjs +54 -0
- package/esm2022/lib/form/components/spinner/form-spinner.component.mjs +36 -0
- package/esm2022/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.mjs +250 -0
- package/esm2022/lib/form/components/widgets/attach-file/file-properties-table/file-properties-table-cloud.component.mjs +137 -0
- package/esm2022/lib/form/components/widgets/data-table/data-table-adapter.widget.mjs +107 -0
- package/esm2022/lib/form/components/widgets/data-table/data-table.widget.mjs +121 -0
- package/esm2022/lib/form/components/widgets/data-table/helpers/data-table-path-parser.helper.mjs +122 -0
- package/esm2022/lib/form/components/widgets/date/date-cloud.widget.mjs +190 -0
- package/esm2022/lib/form/components/widgets/display-external-property/display-external-property.widget.mjs +86 -0
- package/esm2022/lib/form/components/widgets/display-rich-text/display-rich-text.widget.mjs +80 -0
- package/esm2022/lib/form/components/widgets/dropdown/dropdown-cloud.widget.mjs +464 -0
- package/esm2022/lib/form/components/widgets/dropdown/validators.mjs +29 -0
- package/esm2022/lib/form/components/widgets/file-viewer/file-viewer.widget.mjs +47 -0
- package/esm2022/lib/form/components/widgets/group/group-cloud.widget.mjs +83 -0
- package/esm2022/lib/form/components/widgets/people/people-cloud.widget.mjs +92 -0
- package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer-wrapper/properties-viewer-wrapper.component.mjs +81 -0
- package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer.widget.mjs +54 -0
- package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.schema.mjs +86 -0
- package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.mjs +117 -0
- package/esm2022/lib/form/components/widgets/upload/upload-cloud.widget.mjs +188 -0
- package/esm2022/lib/form/form-cloud.module.mjs +103 -0
- package/esm2022/lib/form/models/form-cloud-representation.model.mjs +48 -0
- package/esm2022/lib/form/models/task-variable-cloud.model.mjs +28 -0
- package/esm2022/lib/form/public-api.mjs +44 -0
- package/esm2022/lib/form/services/content-cloud-node-selector.service.mjs +120 -0
- package/esm2022/lib/form/services/display-mode.service.mjs +146 -0
- package/esm2022/lib/form/services/form-cloud.service.interface.mjs +18 -0
- package/esm2022/lib/form/services/form-cloud.service.mjs +201 -0
- package/esm2022/lib/form/services/form-definition-selector-cloud.service.interface.mjs +18 -0
- package/esm2022/lib/form/services/form-definition-selector-cloud.service.mjs +51 -0
- package/esm2022/lib/form/services/form-utils.service.mjs +37 -0
- package/esm2022/lib/form/services/process-cloud-content.service.mjs +71 -0
- package/esm2022/lib/form/services/spinner/form-cloud-spinner.service.mjs +52 -0
- package/esm2022/lib/group/components/group-cloud.component.mjs +424 -0
- package/esm2022/lib/group/group-cloud.module.mjs +33 -0
- package/esm2022/lib/group/models/identity-group.model.mjs +18 -0
- package/esm2022/lib/group/public-api.mjs +21 -0
- package/esm2022/lib/group/services/identity-group.service.mjs +89 -0
- package/esm2022/lib/models/application-version.model.mjs +21 -0
- package/esm2022/lib/models/constant-values.type.mjs +18 -0
- package/esm2022/lib/models/data-column-custom-data.mjs +18 -0
- package/esm2022/lib/models/date-cloud-filter.model.mjs +31 -0
- package/esm2022/lib/models/date-format-cloud.model.mjs +18 -0
- package/esm2022/lib/models/engine-event-cloud.model.mjs +18 -0
- package/esm2022/lib/models/filter-cloud-model.mjs +128 -0
- package/esm2022/lib/models/process-definition-cloud.model.mjs +32 -0
- package/esm2022/lib/models/process-instance-variable.model.mjs +18 -0
- package/esm2022/lib/models/process-variable-filter.model.mjs +18 -0
- package/esm2022/lib/models/task-cloud.model.mjs +23 -0
- package/esm2022/lib/models/task-list-sorting.model.mjs +40 -0
- package/esm2022/lib/models/variable-definition.mjs +18 -0
- package/esm2022/lib/people/components/people-cloud.component.mjs +499 -0
- package/esm2022/lib/people/models/identity-user.model.mjs +18 -0
- package/esm2022/lib/people/people-cloud.module.mjs +33 -0
- package/esm2022/lib/people/public-api.mjs +21 -0
- package/esm2022/lib/people/services/identity-user.service.mjs +119 -0
- package/esm2022/lib/process/process-cloud.module.mjs +40 -0
- package/esm2022/lib/process/process-filters/components/edit-process-filter/edit-process-filter-cloud.component.mjs +802 -0
- package/esm2022/lib/process/process-filters/components/process-filter-dialog/process-filter-dialog-cloud.component.mjs +59 -0
- package/esm2022/lib/process/process-filters/components/process-filters/process-filters-cloud.component.mjs +293 -0
- package/esm2022/lib/process/process-filters/models/process-filter-cloud.model.mjs +170 -0
- package/esm2022/lib/process/process-filters/process-filters-cloud.module.mjs +44 -0
- package/esm2022/lib/process/process-filters/public-api.mjs +23 -0
- package/esm2022/lib/process/process-filters/services/process-filter-cloud.service.mjs +408 -0
- package/esm2022/lib/process/process-header/components/process-header-cloud.component.mjs +137 -0
- package/esm2022/lib/process/process-header/process-header-cloud.module.mjs +33 -0
- package/esm2022/lib/process/process-header/public-api.mjs +19 -0
- package/esm2022/lib/process/process-list/components/process-list-cloud.component.mjs +594 -0
- package/esm2022/lib/process/process-list/datatable/process-list-datatable-adapter.mjs +31 -0
- package/esm2022/lib/process/process-list/models/perocess-instance-cloud-view.model.mjs +18 -0
- package/esm2022/lib/process/process-list/models/process-cloud-preferences.mjs +24 -0
- package/esm2022/lib/process/process-list/models/process-cloud-preset.model.mjs +37 -0
- package/esm2022/lib/process/process-list/models/process-cloud-query-request.model.mjs +107 -0
- package/esm2022/lib/process/process-list/models/process-list-sorting.model.mjs +40 -0
- package/esm2022/lib/process/process-list/process-list-cloud.module.mjs +45 -0
- package/esm2022/lib/process/process-list/public-api.mjs +25 -0
- package/esm2022/lib/process/process-list/services/process-list-cloud.service.mjs +253 -0
- package/esm2022/lib/process/process-list/services/process-task-list-cloud.service.mjs +109 -0
- package/esm2022/lib/process/public-api.mjs +23 -0
- package/esm2022/lib/process/services/process-cloud.service.mjs +105 -0
- package/esm2022/lib/process/start-process/components/start-process-cloud.component.mjs +481 -0
- package/esm2022/lib/process/start-process/models/process-instance-cloud.model.mjs +18 -0
- package/esm2022/lib/process/start-process/models/process-payload-cloud.model.mjs +26 -0
- package/esm2022/lib/process/start-process/models/process-with-form-payload-cloud.model.mjs +26 -0
- package/esm2022/lib/process/start-process/public-api.mjs +21 -0
- package/esm2022/lib/process/start-process/services/start-process-cloud.service.mjs +125 -0
- package/esm2022/lib/process-services-cloud.module.mjs +91 -0
- package/esm2022/lib/rich-text-editor/editorjs-config.mjs +101 -0
- package/esm2022/lib/rich-text-editor/index.mjs +18 -0
- package/esm2022/lib/rich-text-editor/public-api.mjs +19 -0
- package/esm2022/lib/rich-text-editor/rich-text-editor.component.mjs +80 -0
- package/esm2022/lib/rich-text-editor/rich-text-editor.module.mjs +33 -0
- package/esm2022/lib/screen/components/screen-cloud/screen-cloud.component.mjs +186 -0
- package/esm2022/lib/screen/models/screen-cloud.model.mjs +18 -0
- package/esm2022/lib/screen/public-api.mjs +18 -0
- package/esm2022/lib/services/base-cloud.service.mjs +83 -0
- package/esm2022/lib/services/cloud-token.service.mjs +23 -0
- package/esm2022/lib/services/form-fields.interfaces.mjs +55 -0
- package/esm2022/lib/services/local-preference-cloud.service.mjs +122 -0
- package/esm2022/lib/services/notification-cloud.service.mjs +45 -0
- package/esm2022/lib/services/preference-cloud.interface.mjs +18 -0
- package/esm2022/lib/services/public-api.mjs +28 -0
- package/esm2022/lib/services/screen-rendering.service.mjs +30 -0
- package/esm2022/lib/services/task-list-cloud.service.interface.mjs +18 -0
- package/esm2022/lib/services/user-preference-cloud.service.mjs +105 -0
- package/esm2022/lib/services/variable-mapper.sevice.mjs +77 -0
- package/esm2022/lib/services/web-socket.service.mjs +146 -0
- package/esm2022/lib/task/models/start-task-cloud-request.model.mjs +32 -0
- package/esm2022/lib/task/models/task-details-cloud.model.mjs +26 -0
- package/esm2022/lib/task/models/task.model.mjs +23 -0
- package/esm2022/lib/task/public-api.mjs +26 -0
- package/esm2022/lib/task/services/task-cloud.service.mjs +272 -0
- package/esm2022/lib/task/task-cloud.module.mjs +45 -0
- package/esm2022/lib/task/task-filters/components/base-task-filters-cloud.component.mjs +59 -0
- package/esm2022/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.mjs +467 -0
- package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-service-task-filter/edit-service-task-filter-cloud.component.mjs +206 -0
- package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-task-filter/edit-task-filter-cloud.component.mjs +318 -0
- package/esm2022/lib/task/task-filters/components/service-task-filters/service-task-filters-cloud.component.mjs +147 -0
- package/esm2022/lib/task/task-filters/components/task-assignment-filter/task-assignment-filter.component.mjs +143 -0
- package/esm2022/lib/task/task-filters/components/task-filter-dialog/task-filter-dialog-cloud.component.mjs +73 -0
- package/esm2022/lib/task/task-filters/components/task-filters/task-filters-cloud.component.mjs +256 -0
- package/esm2022/lib/task/task-filters/models/filter-cloud.model.mjs +207 -0
- package/esm2022/lib/task/task-filters/public-api.mjs +27 -0
- package/esm2022/lib/task/task-filters/services/service-task-filter-cloud.service.mjs +283 -0
- package/esm2022/lib/task/task-filters/services/task-filter-cloud.service.mjs +392 -0
- package/esm2022/lib/task/task-filters/task-filters-cloud.module.mjs +56 -0
- package/esm2022/lib/task/task-form/components/task-form-cloud/task-form-cloud.component.mjs +214 -0
- package/esm2022/lib/task/task-form/components/user-task-cloud/complete-task/complete-task.directive.mjs +89 -0
- package/esm2022/lib/task/task-form/components/user-task-cloud/user-task-cloud.component.mjs +284 -0
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/claim-task/claim-task-cloud.directive.mjs +101 -0
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/unclaim-task/unclaim-task-cloud.directive.mjs +87 -0
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/user-task-cloud-buttons.component.mjs +79 -0
- package/esm2022/lib/task/task-form/public-api.mjs +21 -0
- package/esm2022/lib/task/task-form/task-form.module.mjs +36 -0
- package/esm2022/lib/task/task-header/components/task-header-cloud.component.mjs +280 -0
- package/esm2022/lib/task/task-header/public-api.mjs +19 -0
- package/esm2022/lib/task/task-header/task-header-cloud.module.mjs +33 -0
- package/esm2022/lib/task/task-list/components/base-task-list-cloud.component.mjs +331 -0
- package/esm2022/lib/task/task-list/components/service-task-list/service-task-list-cloud.component.mjs +116 -0
- package/esm2022/lib/task/task-list/components/task-list/datatable/task-list-datatable-adapter.mjs +31 -0
- package/esm2022/lib/task/task-list/components/task-list/task-list-cloud.component.mjs +390 -0
- package/esm2022/lib/task/task-list/models/service-task-cloud.model.mjs +18 -0
- package/esm2022/lib/task/task-list/models/task-cloud-view.model.mjs +18 -0
- package/esm2022/lib/task/task-list/public-api.mjs +23 -0
- package/esm2022/lib/task/task-list/services/service-task-list-cloud.service.mjs +115 -0
- package/esm2022/lib/task/task-list/services/task-list-cloud.service.mjs +178 -0
- package/esm2022/lib/task/task-list/task-list-cloud.module.mjs +57 -0
- package/esm2022/lib/types.mjs +18 -0
- package/esm2022/public-api.mjs +40 -0
- package/fesm2022/adf-process-services-cloud.mjs +347 -346
- package/fesm2022/adf-process-services-cloud.mjs.map +1 -1
- package/lib/task/task-filters/components/base-task-filters-cloud.component.d.ts +1 -1
- package/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.d.ts +1 -1
- package/lib/task/task-list/components/base-task-list-cloud.component.d.ts +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import { Component, DestroyRef, EventEmitter, HostListener, inject, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
18
|
+
import { ConfirmDialogComponent, InplaceFormInputComponent, LocalizedDatePipe, TranslationService, isOutcomeButtonVisible } from '@alfresco/adf-core';
|
|
19
|
+
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
20
|
+
import { MatAutocompleteModule, MatAutocompleteTrigger } from '@angular/material/autocomplete';
|
|
21
|
+
import { catchError, debounceTime, map } from 'rxjs/operators';
|
|
22
|
+
import { ProcessPayloadCloud } from '../models/process-payload-cloud.model';
|
|
23
|
+
import { ProcessWithFormPayloadCloud } from '../models/process-with-form-payload-cloud.model';
|
|
24
|
+
import { StartProcessCloudService } from '../services/start-process-cloud.service';
|
|
25
|
+
import { BehaviorSubject, forkJoin, of, combineLatest } from 'rxjs';
|
|
26
|
+
import { ProcessDefinitionCloud } from '../../../models/process-definition-cloud.model';
|
|
27
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
28
|
+
import { getTime } from 'date-fns';
|
|
29
|
+
import { CommonModule } from '@angular/common';
|
|
30
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
31
|
+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
32
|
+
import { MatCardModule } from '@angular/material/card';
|
|
33
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
34
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
35
|
+
import { MatInputModule } from '@angular/material/input';
|
|
36
|
+
import { MatOptionModule } from '@angular/material/core';
|
|
37
|
+
import { FormCloudComponent } from '../../../form/components/form-cloud.component';
|
|
38
|
+
import { FormCustomOutcomesComponent } from '../../../form/components/form-cloud-custom-outcomes.component';
|
|
39
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
40
|
+
import * as i0 from "@angular/core";
|
|
41
|
+
import * as i1 from "@alfresco/adf-core";
|
|
42
|
+
import * as i2 from "@angular/common";
|
|
43
|
+
import * as i3 from "@ngx-translate/core";
|
|
44
|
+
import * as i4 from "@angular/material/progress-spinner";
|
|
45
|
+
import * as i5 from "@angular/material/card";
|
|
46
|
+
import * as i6 from "@angular/material/button";
|
|
47
|
+
import * as i7 from "@angular/material/icon";
|
|
48
|
+
import * as i8 from "@angular/material/input";
|
|
49
|
+
import * as i9 from "@angular/material/form-field";
|
|
50
|
+
import * as i10 from "@angular/material/core";
|
|
51
|
+
import * as i11 from "@angular/material/autocomplete";
|
|
52
|
+
import * as i12 from "@angular/forms";
|
|
53
|
+
const MAX_NAME_LENGTH = 255;
|
|
54
|
+
const PROCESS_DEFINITION_DEBOUNCE = 300;
|
|
55
|
+
const DATE_TIME_IDENTIFIER_REG_EXP = new RegExp('%{datetime}', 'i');
|
|
56
|
+
const PROCESS_DEFINITION_IDENTIFIER_REG_EXP = new RegExp('%{processdefinition}', 'i');
|
|
57
|
+
export class StartProcessCloudComponent {
|
|
58
|
+
get isProcessFormValid() {
|
|
59
|
+
if (this.hasForm && this.isFormCloudLoaded) {
|
|
60
|
+
return (this.formCloud ? !Object.keys(this.formCloud.values).length : false) || this.formCloud?.isValid || this.isProcessStarting;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
return this.processForm.valid || this.isProcessStarting;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
get disableStartButton() {
|
|
67
|
+
return !this.appName || !this.processDefinition.valid || this.isProcessStarting || this.isFormCloudLoading;
|
|
68
|
+
}
|
|
69
|
+
get isProcessDefinitionsEmpty() {
|
|
70
|
+
return !this.processDefinitionList.length;
|
|
71
|
+
}
|
|
72
|
+
get processInstanceName() {
|
|
73
|
+
return this.processForm.controls.processInstanceName;
|
|
74
|
+
}
|
|
75
|
+
get processDefinition() {
|
|
76
|
+
return this.processForm.controls.processDefinition;
|
|
77
|
+
}
|
|
78
|
+
get hasForm() {
|
|
79
|
+
return !!this.processDefinitionCurrent?.formKey;
|
|
80
|
+
}
|
|
81
|
+
get defaultStartProcessButtonLabel() {
|
|
82
|
+
return this.translateService.instant('ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.ACTION.START').toUpperCase();
|
|
83
|
+
}
|
|
84
|
+
get defaultCancelProcessButtonLabel() {
|
|
85
|
+
return this.translateService.instant('ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.ACTION.CANCEL').toUpperCase();
|
|
86
|
+
}
|
|
87
|
+
constructor(translateService) {
|
|
88
|
+
this.translateService = translateService;
|
|
89
|
+
/** (required) Name of the app. */
|
|
90
|
+
this.appName = '';
|
|
91
|
+
/** Maximum length of the process name. */
|
|
92
|
+
this.maxNameLength = MAX_NAME_LENGTH;
|
|
93
|
+
/** Name of the process. */
|
|
94
|
+
this.name = '';
|
|
95
|
+
/** Show/hide the process dropdown list. */
|
|
96
|
+
this.showSelectProcessDropdown = true;
|
|
97
|
+
/** Show/hide title. */
|
|
98
|
+
this.showTitle = true;
|
|
99
|
+
/** Show/hide cancel button. */
|
|
100
|
+
this.showCancelButton = true;
|
|
101
|
+
/** Toggle rendering of the `Open next task` checkbox. */
|
|
102
|
+
this.showNextTaskCheckbox = false;
|
|
103
|
+
/** Whether the `Open next task` checkbox is checked by default or not. */
|
|
104
|
+
this.isNextTaskCheckboxChecked = false;
|
|
105
|
+
/** Emitted when the process is successfully started. */
|
|
106
|
+
this.success = new EventEmitter();
|
|
107
|
+
/** Emitted when the starting process is cancelled */
|
|
108
|
+
this.cancel = new EventEmitter();
|
|
109
|
+
/** Emitted when an error occurs. */
|
|
110
|
+
this.error = new EventEmitter();
|
|
111
|
+
/** Emitted when form content is clicked. */
|
|
112
|
+
this.formContentClicked = new EventEmitter();
|
|
113
|
+
/** Emitted when process definition selection changes. */
|
|
114
|
+
this.processDefinitionSelection = new EventEmitter();
|
|
115
|
+
/** Emitted when the `Open next task` checkbox was toggled. */
|
|
116
|
+
this.nextTaskCheckboxCheckedChanged = new EventEmitter();
|
|
117
|
+
this.processDefinitionList = [];
|
|
118
|
+
this.errorMessageId = '';
|
|
119
|
+
this.processPayloadCloud = new ProcessPayloadCloud();
|
|
120
|
+
this.filteredProcesses = [];
|
|
121
|
+
this.staticMappings = [];
|
|
122
|
+
this.isProcessStarting = false;
|
|
123
|
+
this.isFormCloudLoaded = false;
|
|
124
|
+
this.isFormCloudLoading = false;
|
|
125
|
+
this.processDefinitionLoaded = false;
|
|
126
|
+
this.processForm = new FormGroup({
|
|
127
|
+
processInstanceName: new FormControl('', [
|
|
128
|
+
Validators.required,
|
|
129
|
+
Validators.maxLength(this.getMaxNameLength()),
|
|
130
|
+
Validators.pattern('^[^\\s]+(\\s+[^\\s]+)*$')
|
|
131
|
+
]),
|
|
132
|
+
processDefinition: new FormControl('', [Validators.required, this.processDefinitionNameValidator()])
|
|
133
|
+
});
|
|
134
|
+
this.destroyRef = inject(DestroyRef);
|
|
135
|
+
this.startProcessCloudService = inject(StartProcessCloudService);
|
|
136
|
+
this.localizedDatePipe = inject(LocalizedDatePipe);
|
|
137
|
+
this.displayStartSubject = new BehaviorSubject(null);
|
|
138
|
+
this.hasVisibleOutcomesSubject = new BehaviorSubject(false);
|
|
139
|
+
this.dialog = inject(MatDialog);
|
|
140
|
+
this.showSaveButton = false;
|
|
141
|
+
this.showCompleteButton = false;
|
|
142
|
+
this.startProcessButtonLabel = this.defaultStartProcessButtonLabel;
|
|
143
|
+
this.cancelButtonLabel = this.defaultCancelProcessButtonLabel;
|
|
144
|
+
}
|
|
145
|
+
ngOnInit() {
|
|
146
|
+
this.processDefinition.setValue(this.processDefinitionName);
|
|
147
|
+
this.processDefinition.valueChanges
|
|
148
|
+
.pipe(debounceTime(PROCESS_DEFINITION_DEBOUNCE))
|
|
149
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
150
|
+
.subscribe((processDefinitionName) => {
|
|
151
|
+
this.selectProcessDefinitionByProcessDefinitionName(processDefinitionName);
|
|
152
|
+
});
|
|
153
|
+
this.showStartProcessButton$ = combineLatest([this.displayStartSubject, this.hasVisibleOutcomesSubject]).pipe(map(([displayStart, hasVisibleOutcomes]) => (displayStart !== null ? displayStart === 'true' : !hasVisibleOutcomes)));
|
|
154
|
+
}
|
|
155
|
+
ngOnChanges(changes) {
|
|
156
|
+
if (changes['appName'] && changes['appName'].currentValue !== changes['appName'].previousValue) {
|
|
157
|
+
this.appName = changes['appName'].currentValue;
|
|
158
|
+
if (this.appName || this.appName === '') {
|
|
159
|
+
this.loadProcessDefinitions();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (changes['values'] && changes['values'].currentValue !== changes['values'].previousValue) {
|
|
163
|
+
this.resolvedValues = this.staticMappings.concat(this.values || []);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
onKeyDown(event) {
|
|
167
|
+
event.stopPropagation();
|
|
168
|
+
}
|
|
169
|
+
onFormLoaded(form) {
|
|
170
|
+
this.isFormCloudLoaded = true;
|
|
171
|
+
this.formCloud = form;
|
|
172
|
+
const anyOutcomeVisible = form?.outcomes?.some((outcome) => isOutcomeButtonVisible(outcome, {
|
|
173
|
+
isFormReadOnly: form.readOnly,
|
|
174
|
+
showCompleteButton: this.showCompleteButton,
|
|
175
|
+
showSaveButton: this.showSaveButton
|
|
176
|
+
}));
|
|
177
|
+
this.hasVisibleOutcomesSubject.next(anyOutcomeVisible);
|
|
178
|
+
}
|
|
179
|
+
getMaxNameLength() {
|
|
180
|
+
return this.maxNameLength > MAX_NAME_LENGTH ? MAX_NAME_LENGTH : this.maxNameLength;
|
|
181
|
+
}
|
|
182
|
+
selectProcessDefinitionByProcessDefinitionName(processDefinitionName) {
|
|
183
|
+
this.filteredProcesses = this.getProcessDefinitionListByNameOrKey(processDefinitionName);
|
|
184
|
+
if (this.isProcessFormValid && this.filteredProcesses && this.filteredProcesses.length === 1) {
|
|
185
|
+
this.setProcessDefinitionOnForm(this.filteredProcesses[0].name);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
setProcessDefinitionOnForm(selectedProcessDefinitionName) {
|
|
189
|
+
this.isFormCloudLoading = true;
|
|
190
|
+
const processDefinitionCurrent = this.filteredProcesses.find((process) => process.name === selectedProcessDefinitionName || process.key === selectedProcessDefinitionName);
|
|
191
|
+
forkJoin([
|
|
192
|
+
this.startProcessCloudService
|
|
193
|
+
.getStartEventFormStaticValuesMapping(this.appName, processDefinitionCurrent.id)
|
|
194
|
+
.pipe(catchError(() => of([]))),
|
|
195
|
+
this.startProcessCloudService
|
|
196
|
+
.getStartEventConstants(this.appName, processDefinitionCurrent.id)
|
|
197
|
+
.pipe(catchError(() => of([])))
|
|
198
|
+
]).subscribe(([staticMappings, constants]) => {
|
|
199
|
+
this.staticMappings = staticMappings;
|
|
200
|
+
this.resolvedValues = this.staticMappings.concat(this.values || []);
|
|
201
|
+
this.processDefinitionCurrent = processDefinitionCurrent;
|
|
202
|
+
this.isFormCloudLoading = false;
|
|
203
|
+
const displayStart = constants?.find((constant) => constant.name === 'startEnabled');
|
|
204
|
+
const startLabel = constants?.find((constant) => constant.name === 'startLabel');
|
|
205
|
+
const displayCancel = constants?.find((constant) => constant.name === 'cancelEnabled');
|
|
206
|
+
const cancelLabel = constants?.find((constant) => constant.name === 'cancelLabel');
|
|
207
|
+
if (displayStart) {
|
|
208
|
+
this.displayStartSubject.next(displayStart?.value);
|
|
209
|
+
}
|
|
210
|
+
if (startLabel) {
|
|
211
|
+
this.startProcessButtonLabel = startLabel?.value?.trim()?.length > 0 ? startLabel.value.trim() : this.defaultStartProcessButtonLabel;
|
|
212
|
+
}
|
|
213
|
+
if (displayCancel) {
|
|
214
|
+
this.showCancelButton = displayCancel?.value === 'true' && this.showCancelButton;
|
|
215
|
+
}
|
|
216
|
+
if (cancelLabel) {
|
|
217
|
+
this.cancelButtonLabel = cancelLabel?.value?.trim()?.length > 0 ? cancelLabel.value.trim() : this.defaultCancelProcessButtonLabel;
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
this.isFormCloudLoaded = false;
|
|
221
|
+
this.processPayloadCloud.processDefinitionKey = processDefinitionCurrent.key;
|
|
222
|
+
}
|
|
223
|
+
getProcessDefinitionListByNameOrKey(processDefinitionName) {
|
|
224
|
+
return this.processDefinitionList.filter((processDefinitionCloud) => !processDefinitionName || this.getProcessDefinition(processDefinitionCloud, processDefinitionName));
|
|
225
|
+
}
|
|
226
|
+
getProcessIfExists(processDefinition) {
|
|
227
|
+
let matchedProcess = this.processDefinitionList.find((option) => this.getProcessDefinition(option, processDefinition));
|
|
228
|
+
if (!matchedProcess) {
|
|
229
|
+
matchedProcess = new ProcessDefinitionCloud();
|
|
230
|
+
}
|
|
231
|
+
return matchedProcess;
|
|
232
|
+
}
|
|
233
|
+
getProcessDefinitionByName(processDefinitionName) {
|
|
234
|
+
const matchedProcess = processDefinitionName ? this.getProcessIfExists(processDefinitionName) : this.processDefinitionList[0];
|
|
235
|
+
return matchedProcess;
|
|
236
|
+
}
|
|
237
|
+
selectDefaultProcessDefinition() {
|
|
238
|
+
const selectedProcess = this.getProcessDefinitionByName(this.processDefinitionName);
|
|
239
|
+
if (selectedProcess) {
|
|
240
|
+
this.processDefinition.setValue(selectedProcess.name);
|
|
241
|
+
this.processDefinitionSelectionChanged(selectedProcess);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
loadProcessDefinitions() {
|
|
245
|
+
this.resetErrorMessage();
|
|
246
|
+
this.startProcessCloudService
|
|
247
|
+
.getProcessDefinitions(this.appName)
|
|
248
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
249
|
+
.subscribe((processDefinitionRepresentations) => {
|
|
250
|
+
this.processDefinitionList = processDefinitionRepresentations;
|
|
251
|
+
if (processDefinitionRepresentations.length === 1) {
|
|
252
|
+
this.selectDefaultProcessDefinition();
|
|
253
|
+
}
|
|
254
|
+
else if (this.processDefinitionName) {
|
|
255
|
+
this.processDefinition.setValue(this.processDefinitionName);
|
|
256
|
+
const processDefinition = this.processDefinitionList.find((process) => process.name === this.processDefinitionName);
|
|
257
|
+
if (processDefinition) {
|
|
258
|
+
this.filteredProcesses = this.getProcessDefinitionListByNameOrKey(processDefinition.name);
|
|
259
|
+
this.setProcessDefinitionOnForm(processDefinition.name);
|
|
260
|
+
this.processDefinitionSelectionChanged(processDefinition);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
this.processDefinitionLoaded = true;
|
|
264
|
+
}, () => {
|
|
265
|
+
this.errorMessageId = 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.LOAD_PROCESS_DEFS';
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
isValidName(name) {
|
|
269
|
+
return !!name;
|
|
270
|
+
}
|
|
271
|
+
getProcessDefinition(processDefinitionCloud, processDefinitionName) {
|
|
272
|
+
return ((this.isValidName(processDefinitionCloud.name) &&
|
|
273
|
+
processDefinitionCloud.name.toLowerCase().includes(processDefinitionName.toLowerCase())) ||
|
|
274
|
+
processDefinitionCloud.key?.toLowerCase().includes(processDefinitionName.toLowerCase()));
|
|
275
|
+
}
|
|
276
|
+
buildProcessCloudPayload() {
|
|
277
|
+
this.processPayloadCloud.name = this.processInstanceName.value;
|
|
278
|
+
if (this.variables) {
|
|
279
|
+
this.processPayloadCloud.variables = this.variables;
|
|
280
|
+
}
|
|
281
|
+
if (this.hasForm) {
|
|
282
|
+
this.processPayloadCloud.variables = Object.assign(this.processPayloadCloud.variables, this.formCloud.values);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
onCustomOutcomeClicked(outcome) {
|
|
286
|
+
this.customOutcome = outcome;
|
|
287
|
+
this.startProcess();
|
|
288
|
+
}
|
|
289
|
+
startProcessWithoutConfirmation() {
|
|
290
|
+
this.isProcessStarting = true;
|
|
291
|
+
const action = this.hasForm
|
|
292
|
+
? this.startProcessCloudService.startProcessWithForm(this.appName, this.processDefinitionCurrent.formKey, this.processDefinitionCurrent.version, new ProcessWithFormPayloadCloud({
|
|
293
|
+
processName: this.processInstanceName.value,
|
|
294
|
+
processDefinitionKey: this.processPayloadCloud.processDefinitionKey,
|
|
295
|
+
variables: this.variables ?? {},
|
|
296
|
+
values: this.formCloud.values,
|
|
297
|
+
outcome: this.customOutcome
|
|
298
|
+
}))
|
|
299
|
+
: this.startProcessCloudService.startProcess(this.appName, new ProcessPayloadCloud({
|
|
300
|
+
name: this.processInstanceName.value,
|
|
301
|
+
processDefinitionKey: this.processPayloadCloud.processDefinitionKey,
|
|
302
|
+
variables: this.variables ?? {}
|
|
303
|
+
}));
|
|
304
|
+
action.subscribe({
|
|
305
|
+
next: (res) => {
|
|
306
|
+
this.success.emit(res);
|
|
307
|
+
this.isProcessStarting = false;
|
|
308
|
+
},
|
|
309
|
+
error: (err) => {
|
|
310
|
+
this.errorMessageId = 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.START';
|
|
311
|
+
this.unifyErrorResponse(err);
|
|
312
|
+
this.error.emit(err);
|
|
313
|
+
this.isProcessStarting = false;
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
startProcess() {
|
|
318
|
+
if (!this.formCloud?.confirmMessage?.show) {
|
|
319
|
+
this.startProcessWithoutConfirmation();
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
const dialogRef = this.dialog.open(ConfirmDialogComponent, {
|
|
323
|
+
data: {
|
|
324
|
+
message: this.formCloud.confirmMessage.message
|
|
325
|
+
},
|
|
326
|
+
minWidth: '450px'
|
|
327
|
+
});
|
|
328
|
+
dialogRef.afterClosed().subscribe((result) => {
|
|
329
|
+
if (result) {
|
|
330
|
+
this.startProcessWithoutConfirmation();
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
unifyErrorResponse(err) {
|
|
336
|
+
if (!err?.response?.body?.entry && err?.response?.body?.message) {
|
|
337
|
+
err.response.body = {
|
|
338
|
+
entry: JSON.parse(err.response.body.message)
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
cancelStartProcess() {
|
|
343
|
+
this.cancel.emit();
|
|
344
|
+
}
|
|
345
|
+
resetErrorMessage() {
|
|
346
|
+
this.errorMessageId = '';
|
|
347
|
+
}
|
|
348
|
+
resetProcessDefinitionList() {
|
|
349
|
+
this.processDefinition.setValue('');
|
|
350
|
+
this.filteredProcesses = this.processDefinitionList;
|
|
351
|
+
}
|
|
352
|
+
displayProcessNameOnDropdown(process) {
|
|
353
|
+
if (process) {
|
|
354
|
+
let processName = process;
|
|
355
|
+
if (typeof process !== 'string') {
|
|
356
|
+
processName = process.name;
|
|
357
|
+
}
|
|
358
|
+
return processName;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
displayDropdown(event) {
|
|
362
|
+
event.stopPropagation();
|
|
363
|
+
if (!this.inputAutocomplete.panelOpen) {
|
|
364
|
+
this.resetProcessDefinitionList();
|
|
365
|
+
this.inputAutocomplete.openPanel();
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
this.inputAutocomplete.closePanel();
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
processDefinitionNameValidator() {
|
|
372
|
+
return (control) => {
|
|
373
|
+
const processDefinitionFieldValue = control.value;
|
|
374
|
+
let processDefinitionNameError = false;
|
|
375
|
+
if (processDefinitionFieldValue) {
|
|
376
|
+
const processDefinition = this.getProcessIfExists(processDefinitionFieldValue);
|
|
377
|
+
if (!processDefinition.key) {
|
|
378
|
+
processDefinitionNameError = true;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return processDefinitionNameError ? { 'invalid name': true } : null;
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
getProcessDefinitionValue(process) {
|
|
385
|
+
return process.name ? process.name : process.key;
|
|
386
|
+
}
|
|
387
|
+
onFormContentClicked(content) {
|
|
388
|
+
this.formContentClicked.emit(content);
|
|
389
|
+
}
|
|
390
|
+
processDefinitionSelectionChanged(processDefinition) {
|
|
391
|
+
if (processDefinition) {
|
|
392
|
+
this.setDefaultProcessName(processDefinition.name);
|
|
393
|
+
this.processDefinitionSelection.emit(processDefinition);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
setDefaultProcessName(processDefinitionName) {
|
|
397
|
+
const processInstanceDetails = { processDefinitionName };
|
|
398
|
+
const defaultProcessName = this.getDefaultProcessName(this.name, processInstanceDetails);
|
|
399
|
+
this.processInstanceName.setValue(defaultProcessName);
|
|
400
|
+
this.processInstanceName.markAsDirty();
|
|
401
|
+
this.processInstanceName.markAsTouched();
|
|
402
|
+
}
|
|
403
|
+
getDefaultProcessName(processNameFormat, processInstance) {
|
|
404
|
+
let processName = processNameFormat;
|
|
405
|
+
if (processName.match(DATE_TIME_IDENTIFIER_REG_EXP)) {
|
|
406
|
+
const presentDateTime = getTime(new Date());
|
|
407
|
+
processName = processName.replace(DATE_TIME_IDENTIFIER_REG_EXP, this.localizedDatePipe.transform(presentDateTime, 'medium'));
|
|
408
|
+
}
|
|
409
|
+
if (processName.match(PROCESS_DEFINITION_IDENTIFIER_REG_EXP)) {
|
|
410
|
+
const selectedProcessDefinitionName = processInstance ? processInstance.processDefinitionName : '';
|
|
411
|
+
processName = processName.replace(PROCESS_DEFINITION_IDENTIFIER_REG_EXP, selectedProcessDefinitionName);
|
|
412
|
+
}
|
|
413
|
+
return processName;
|
|
414
|
+
}
|
|
415
|
+
onNextTaskCheckboxCheckedChanged(event) {
|
|
416
|
+
this.nextTaskCheckboxCheckedChanged.emit(event);
|
|
417
|
+
}
|
|
418
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StartProcessCloudComponent, deps: [{ token: i1.TranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
419
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StartProcessCloudComponent, isStandalone: true, selector: "adf-cloud-start-process", inputs: { appName: "appName", maxNameLength: "maxNameLength", name: "name", processDefinitionName: "processDefinitionName", variables: "variables", values: "values", showSelectProcessDropdown: "showSelectProcessDropdown", showTitle: "showTitle", showCancelButton: "showCancelButton", displayModeConfigurations: "displayModeConfigurations", showNextTaskCheckbox: "showNextTaskCheckbox", isNextTaskCheckboxChecked: "isNextTaskCheckboxChecked" }, outputs: { success: "success", cancel: "cancel", error: "error", formContentClicked: "formContentClicked", processDefinitionSelection: "processDefinitionSelection", nextTaskCheckboxCheckedChanged: "nextTaskCheckboxCheckedChanged" }, host: { listeners: { "keydown": "onKeyDown($event)" } }, providers: [LocalizedDatePipe], viewQueries: [{ propertyName: "inputAutocomplete", first: true, predicate: MatAutocompleteTrigger, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-card appearance=\"outlined\" class=\"adf-start-process\" *ngIf=\"processDefinitionLoaded; else spinner\">\n\n <mat-card-content>\n <mat-card-title\n *ngIf=\"showTitle\"\n class=\"adf-title\">\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.TITLE' | translate}}\n </mat-card-title>\n\n <mat-card-subtitle id=\"error-message\" *ngIf=\"errorMessageId\">\n {{ errorMessageId | translate }}\n </mat-card-subtitle>\n\n <div *ngIf=\"!isProcessDefinitionsEmpty; else emptyProcessDefinitionsList\">\n <form [formGroup]=\"processForm\" class=\"adf-select-process-form\">\n <mat-form-field\n class=\"adf-process-input-container\"\n floatLabel=\"always\"\n *ngIf=\"showSelectProcessDropdown\"\n data-automation-id=\"adf-select-cloud-process-dropdown\"\n >\n <mat-label class=\"adf-start-process-input-label\">{{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.TYPE' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"processDefinition\"\n [matAutocomplete]=\"auto\"\n id=\"processDefinitionName\"\n >\n\n <div class=\"adf-process-input-autocomplete\">\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n id=\"processDefinitionOptions\"\n [displayWith]=\"displayProcessNameOnDropdown\"\n (optionSelected)=\"setProcessDefinitionOnForm($event.option.value)\" >\n <mat-option\n *ngFor=\"let processDef of filteredProcesses\"\n [value]=\"getProcessDefinitionValue(processDef)\"\n (click)=\"processDefinitionSelectionChanged(processDef)\">\n {{ getProcessDefinitionValue(processDef) }}\n </mat-option>\n </mat-autocomplete>\n\n <button\n id=\"adf-select-process-dropdown\"\n title=\"{{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.SELECT_PROCESS_DROPDOWN' | translate}}\"\n mat-icon-button\n (click)=\"displayDropdown($event)\">\n <mat-icon>arrow_drop_down</mat-icon>\n </button>\n\n </div>\n <mat-error\n *ngIf=\"processDefinition.hasError('required')\"\n class=\"adf-error-pb\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_DEFINITION_REQUIRED' | translate }}\n </mat-error>\n </mat-form-field>\n\n <adf-inplace-form-input [control]=\"processInstanceName\">\n <ng-container label>\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.NAME' | translate}}\n </ng-container>\n\n <ng-container error>\n <span *ngIf=\"processInstanceName.hasError('required')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_NAME_REQUIRED' | translate }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('maxlength')\" id=\"adf-start-process-maxlength-error\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.MAXIMUM_LENGTH' | translate : { characters : maxNameLength } }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('pattern')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.SPACE_VALIDATOR' | translate }}\n </span>\n </ng-container>\n </adf-inplace-form-input>\n </form>\n\n <ng-container *ngIf=\"hasForm else taskFormCloudButtons\">\n <adf-cloud-form\n #startForm\n [appName]=\"appName\"\n [appVersion]=\"processDefinitionCurrent.appVersion\"\n [data]=\"resolvedValues\"\n [formId]=\"processDefinitionCurrent.formKey\"\n [displayModeConfigurations]=\"displayModeConfigurations\"\n [showSaveButton]=\"showSaveButton\"\n [showCompleteButton]=\"showCompleteButton\"\n [showRefreshButton]=\"false\"\n [showValidationIcon]=\"false\"\n [showTitle]=\"false\"\n [showNextTaskCheckbox]=\"showNextTaskCheckbox\"\n [isNextTaskCheckboxChecked]=\"isNextTaskCheckboxChecked\"\n (formContentClicked)=\"onFormContentClicked($event)\"\n (formLoaded)=\"onFormLoaded($event)\"\n (executeOutcome)=\"onCustomOutcomeClicked($event.outcome.name)\"\n (nextTaskCheckboxCheckedChanged)=\"onNextTaskCheckboxCheckedChanged($event)\"\n >\n <adf-cloud-form-custom-outcomes>\n <ng-template [ngTemplateOutlet]=\"taskFormCloudButtons\" />\n </adf-cloud-form-custom-outcomes>\n </adf-cloud-form>\n </ng-container>\n </div>\n\n </mat-card-content>\n\n</mat-card>\n\n<ng-template #taskFormCloudButtons>\n <div class=\"adf-start-process-cloud-actions\">\n <button\n *ngIf=\"showCancelButton\"\n mat-button\n (click)=\"cancelStartProcess()\"\n id=\"cancel_process\"\n >\n {{ cancelButtonLabel }}\n </button>\n <button\n *ngIf=\"showStartProcessButton$ | async\"\n color=\"primary\"\n mat-raised-button\n [disabled]=\"disableStartButton || !isProcessFormValid\"\n (click)=\"startProcess()\"\n data-automation-id=\"btn-start\"\n id=\"button-start\"\n class=\"adf-btn-start\"\n >\n {{ startProcessButtonLabel }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #emptyProcessDefinitionsList>\n <mat-card-content *ngIf=\"processDefinitionLoaded\">\n <mat-card-subtitle class=\"error-message\" id=\"no-process-message\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.NO_PROCESS_DEFINITIONS' | translate | uppercase}}\n </mat-card-subtitle>\n </mat-card-content>\n</ng-template>\n\n<ng-template #spinner>\n <div class=\"adf-loading-container\">\n <mat-progress-spinner\n class=\"adf-loading\"\n color=\"primary\"\n mode=\"indeterminate\" />\n </div>\n</ng-template>\n", styles: [".adf-start-process .adf-start-process-input-label{color:var(--adf-theme-mat-grey-color-a200-dark)}.adf-start-process-cloud-actions{display:flex;justify-content:flex-end}.adf-select-process-form{display:flex;flex-direction:column}.adf-title{padding-bottom:1.25em}.adf-process-input-container{margin:0 7px}.adf-process-input-autocomplete{display:flex}.adf-process-input-autocomplete button{position:absolute;right:-14px;top:0}.adf-form-container .adf-form-container-card:has(.adf-form-container-card-content){box-shadow:none;padding:0}.adf-start-form-actions{text-align:right}.adf-loading{margin:auto}.adf-loading-container{min-height:300px;display:flex;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.UpperCasePipe, name: "uppercase" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i5.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i5.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i5.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i5.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: InplaceFormInputComponent, selector: "adf-inplace-form-input", inputs: ["control"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "component", type: i10.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i11.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i11.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i12.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i12.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i12.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: FormCloudComponent, selector: "adf-cloud-form", inputs: ["appName", "appVersion", "formId", "processInstanceId", "taskId", "data", "displayModeConfigurations", "showNextTaskCheckbox", "isNextTaskCheckboxChecked", "showCompleteButton"], outputs: ["formSaved", "formCompleted", "formLoaded", "formDataRefreshed", "formContentClicked", "displayModeOn", "displayModeOff", "nextTaskCheckboxCheckedChanged"] }, { kind: "component", type: FormCustomOutcomesComponent, selector: "adf-cloud-form-custom-outcomes" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
420
|
+
}
|
|
421
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StartProcessCloudComponent, decorators: [{
|
|
422
|
+
type: Component,
|
|
423
|
+
args: [{ selector: 'adf-cloud-start-process', standalone: true, imports: [
|
|
424
|
+
CommonModule,
|
|
425
|
+
TranslateModule,
|
|
426
|
+
MatProgressSpinnerModule,
|
|
427
|
+
MatCardModule,
|
|
428
|
+
MatButtonModule,
|
|
429
|
+
InplaceFormInputComponent,
|
|
430
|
+
MatIconModule,
|
|
431
|
+
MatInputModule,
|
|
432
|
+
MatOptionModule,
|
|
433
|
+
MatAutocompleteModule,
|
|
434
|
+
ReactiveFormsModule,
|
|
435
|
+
FormCloudComponent,
|
|
436
|
+
FormCustomOutcomesComponent
|
|
437
|
+
], providers: [LocalizedDatePipe], encapsulation: ViewEncapsulation.None, template: "<mat-card appearance=\"outlined\" class=\"adf-start-process\" *ngIf=\"processDefinitionLoaded; else spinner\">\n\n <mat-card-content>\n <mat-card-title\n *ngIf=\"showTitle\"\n class=\"adf-title\">\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.TITLE' | translate}}\n </mat-card-title>\n\n <mat-card-subtitle id=\"error-message\" *ngIf=\"errorMessageId\">\n {{ errorMessageId | translate }}\n </mat-card-subtitle>\n\n <div *ngIf=\"!isProcessDefinitionsEmpty; else emptyProcessDefinitionsList\">\n <form [formGroup]=\"processForm\" class=\"adf-select-process-form\">\n <mat-form-field\n class=\"adf-process-input-container\"\n floatLabel=\"always\"\n *ngIf=\"showSelectProcessDropdown\"\n data-automation-id=\"adf-select-cloud-process-dropdown\"\n >\n <mat-label class=\"adf-start-process-input-label\">{{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.TYPE' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"processDefinition\"\n [matAutocomplete]=\"auto\"\n id=\"processDefinitionName\"\n >\n\n <div class=\"adf-process-input-autocomplete\">\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n id=\"processDefinitionOptions\"\n [displayWith]=\"displayProcessNameOnDropdown\"\n (optionSelected)=\"setProcessDefinitionOnForm($event.option.value)\" >\n <mat-option\n *ngFor=\"let processDef of filteredProcesses\"\n [value]=\"getProcessDefinitionValue(processDef)\"\n (click)=\"processDefinitionSelectionChanged(processDef)\">\n {{ getProcessDefinitionValue(processDef) }}\n </mat-option>\n </mat-autocomplete>\n\n <button\n id=\"adf-select-process-dropdown\"\n title=\"{{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.SELECT_PROCESS_DROPDOWN' | translate}}\"\n mat-icon-button\n (click)=\"displayDropdown($event)\">\n <mat-icon>arrow_drop_down</mat-icon>\n </button>\n\n </div>\n <mat-error\n *ngIf=\"processDefinition.hasError('required')\"\n class=\"adf-error-pb\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_DEFINITION_REQUIRED' | translate }}\n </mat-error>\n </mat-form-field>\n\n <adf-inplace-form-input [control]=\"processInstanceName\">\n <ng-container label>\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.NAME' | translate}}\n </ng-container>\n\n <ng-container error>\n <span *ngIf=\"processInstanceName.hasError('required')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_NAME_REQUIRED' | translate }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('maxlength')\" id=\"adf-start-process-maxlength-error\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.MAXIMUM_LENGTH' | translate : { characters : maxNameLength } }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('pattern')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.SPACE_VALIDATOR' | translate }}\n </span>\n </ng-container>\n </adf-inplace-form-input>\n </form>\n\n <ng-container *ngIf=\"hasForm else taskFormCloudButtons\">\n <adf-cloud-form\n #startForm\n [appName]=\"appName\"\n [appVersion]=\"processDefinitionCurrent.appVersion\"\n [data]=\"resolvedValues\"\n [formId]=\"processDefinitionCurrent.formKey\"\n [displayModeConfigurations]=\"displayModeConfigurations\"\n [showSaveButton]=\"showSaveButton\"\n [showCompleteButton]=\"showCompleteButton\"\n [showRefreshButton]=\"false\"\n [showValidationIcon]=\"false\"\n [showTitle]=\"false\"\n [showNextTaskCheckbox]=\"showNextTaskCheckbox\"\n [isNextTaskCheckboxChecked]=\"isNextTaskCheckboxChecked\"\n (formContentClicked)=\"onFormContentClicked($event)\"\n (formLoaded)=\"onFormLoaded($event)\"\n (executeOutcome)=\"onCustomOutcomeClicked($event.outcome.name)\"\n (nextTaskCheckboxCheckedChanged)=\"onNextTaskCheckboxCheckedChanged($event)\"\n >\n <adf-cloud-form-custom-outcomes>\n <ng-template [ngTemplateOutlet]=\"taskFormCloudButtons\" />\n </adf-cloud-form-custom-outcomes>\n </adf-cloud-form>\n </ng-container>\n </div>\n\n </mat-card-content>\n\n</mat-card>\n\n<ng-template #taskFormCloudButtons>\n <div class=\"adf-start-process-cloud-actions\">\n <button\n *ngIf=\"showCancelButton\"\n mat-button\n (click)=\"cancelStartProcess()\"\n id=\"cancel_process\"\n >\n {{ cancelButtonLabel }}\n </button>\n <button\n *ngIf=\"showStartProcessButton$ | async\"\n color=\"primary\"\n mat-raised-button\n [disabled]=\"disableStartButton || !isProcessFormValid\"\n (click)=\"startProcess()\"\n data-automation-id=\"btn-start\"\n id=\"button-start\"\n class=\"adf-btn-start\"\n >\n {{ startProcessButtonLabel }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #emptyProcessDefinitionsList>\n <mat-card-content *ngIf=\"processDefinitionLoaded\">\n <mat-card-subtitle class=\"error-message\" id=\"no-process-message\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.NO_PROCESS_DEFINITIONS' | translate | uppercase}}\n </mat-card-subtitle>\n </mat-card-content>\n</ng-template>\n\n<ng-template #spinner>\n <div class=\"adf-loading-container\">\n <mat-progress-spinner\n class=\"adf-loading\"\n color=\"primary\"\n mode=\"indeterminate\" />\n </div>\n</ng-template>\n", styles: [".adf-start-process .adf-start-process-input-label{color:var(--adf-theme-mat-grey-color-a200-dark)}.adf-start-process-cloud-actions{display:flex;justify-content:flex-end}.adf-select-process-form{display:flex;flex-direction:column}.adf-title{padding-bottom:1.25em}.adf-process-input-container{margin:0 7px}.adf-process-input-autocomplete{display:flex}.adf-process-input-autocomplete button{position:absolute;right:-14px;top:0}.adf-form-container .adf-form-container-card:has(.adf-form-container-card-content){box-shadow:none;padding:0}.adf-start-form-actions{text-align:right}.adf-loading{margin:auto}.adf-loading-container{min-height:300px;display:flex;height:100%}\n"] }]
|
|
438
|
+
}], ctorParameters: () => [{ type: i1.TranslationService }], propDecorators: { inputAutocomplete: [{
|
|
439
|
+
type: ViewChild,
|
|
440
|
+
args: [MatAutocompleteTrigger]
|
|
441
|
+
}], appName: [{
|
|
442
|
+
type: Input
|
|
443
|
+
}], maxNameLength: [{
|
|
444
|
+
type: Input
|
|
445
|
+
}], name: [{
|
|
446
|
+
type: Input
|
|
447
|
+
}], processDefinitionName: [{
|
|
448
|
+
type: Input
|
|
449
|
+
}], variables: [{
|
|
450
|
+
type: Input
|
|
451
|
+
}], values: [{
|
|
452
|
+
type: Input
|
|
453
|
+
}], showSelectProcessDropdown: [{
|
|
454
|
+
type: Input
|
|
455
|
+
}], showTitle: [{
|
|
456
|
+
type: Input
|
|
457
|
+
}], showCancelButton: [{
|
|
458
|
+
type: Input
|
|
459
|
+
}], displayModeConfigurations: [{
|
|
460
|
+
type: Input
|
|
461
|
+
}], showNextTaskCheckbox: [{
|
|
462
|
+
type: Input
|
|
463
|
+
}], isNextTaskCheckboxChecked: [{
|
|
464
|
+
type: Input
|
|
465
|
+
}], success: [{
|
|
466
|
+
type: Output
|
|
467
|
+
}], cancel: [{
|
|
468
|
+
type: Output
|
|
469
|
+
}], error: [{
|
|
470
|
+
type: Output
|
|
471
|
+
}], formContentClicked: [{
|
|
472
|
+
type: Output
|
|
473
|
+
}], processDefinitionSelection: [{
|
|
474
|
+
type: Output
|
|
475
|
+
}], nextTaskCheckboxCheckedChanged: [{
|
|
476
|
+
type: Output
|
|
477
|
+
}], onKeyDown: [{
|
|
478
|
+
type: HostListener,
|
|
479
|
+
args: ['keydown', ['$event']]
|
|
480
|
+
}] } });
|
|
481
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQtcHJvY2Vzcy1jbG91ZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvcHJvY2Vzcy1zZXJ2aWNlcy1jbG91ZC9zcmMvbGliL3Byb2Nlc3Mvc3RhcnQtcHJvY2Vzcy9jb21wb25lbnRzL3N0YXJ0LXByb2Nlc3MtY2xvdWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3Byb2Nlc3Mtc2VydmljZXMtY2xvdWQvc3JjL2xpYi9wcm9jZXNzL3N0YXJ0LXByb2Nlc3MvY29tcG9uZW50cy9zdGFydC1wcm9jZXNzLWNsb3VkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsc0JBQXNCLEVBR3RCLHlCQUF5QixFQUN6QixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2SCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRixPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM5RixP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QUFLO2dCQUtOLG9CQUFvQjtzQkFEbkIsS0FBSztnQkFLTix5QkFBeUI7c0JBRHhCLEtBQUs7Z0JBS04sT0FBTztzQkFETixNQUFNO2dCQUtQLE1BQU07c0JBREwsTUFBTTtnQkFLUCxLQUFLO3NCQURKLE1BQU07Z0JBS1Asa0JBQWtCO3NCQURqQixNQUFNO2dCQUtQLDBCQUEwQjtzQkFEekIsTUFBTTtnQkFLUCw4QkFBOEI7c0JBRDdCLE1BQU07Z0JBK0dQLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENvbmZpcm1EaWFsb2dDb21wb25lbnQsXG4gICAgQ29udGVudExpbmtNb2RlbCxcbiAgICBGb3JtTW9kZWwsXG4gICAgSW5wbGFjZUZvcm1JbnB1dENvbXBvbmVudCxcbiAgICBMb2NhbGl6ZWREYXRlUGlwZSxcbiAgICBUcmFuc2xhdGlvblNlcnZpY2UsXG4gICAgaXNPdXRjb21lQnV0dG9uVmlzaWJsZVxufSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZU1vZHVsZSwgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFByb2Nlc3NJbnN0YW5jZUNsb3VkIH0gZnJvbSAnLi4vbW9kZWxzL3Byb2Nlc3MtaW5zdGFuY2UtY2xvdWQubW9kZWwnO1xuaW1wb3J0IHsgUHJvY2Vzc1BheWxvYWRDbG91ZCB9IGZyb20gJy4uL21vZGVscy9wcm9jZXNzLXBheWxvYWQtY2xvdWQubW9kZWwnO1xuaW1wb3J0IHsgUHJvY2Vzc1dpdGhGb3JtUGF5bG9hZENsb3VkIH0gZnJvbSAnLi4vbW9kZWxzL3Byb2Nlc3Mtd2l0aC1mb3JtLXBheWxvYWQtY2xvdWQubW9kZWwnO1xuaW1wb3J0IHsgU3RhcnRQcm9jZXNzQ2xvdWRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc3RhcnQtcHJvY2Vzcy1jbG91ZC5zZXJ2aWNlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3Byb2Nlc3MtZGVmaW5pdGlvbi1jbG91ZC5tb2RlbCc7XG5pbXBvcnQgeyBUYXNrVmFyaWFibGVDbG91ZCB9IGZyb20gJy4uLy4uLy4uL2Zvcm0vbW9kZWxzL3Rhc2stdmFyaWFibGUtY2xvdWQubW9kZWwnO1xuaW1wb3J0IHsgRm9ybUNsb3VkRGlzcGxheU1vZGVDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZm9ybS1maWVsZHMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBnZXRUaW1lIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQgeyBNYXRDYXJkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2FyZCc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IEZvcm1DbG91ZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Zvcm0vY29tcG9uZW50cy9mb3JtLWNsb3VkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtQ3VzdG9tT3V0Y29tZXNDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9mb3JtL2NvbXBvbmVudHMvZm9ybS1jbG91ZC1jdXN0b20tb3V0Y29tZXMuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdENoZWNrYm94Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuY29uc3QgTUFYX05BTUVfTEVOR1RIOiBudW1iZXIgPSAyNTU7XG5jb25zdCBQUk9DRVNTX0RFRklOSVRJT05fREVCT1VOQ0U6IG51bWJlciA9IDMwMDtcbmNvbnN0IERBVEVfVElNRV9JREVOVElGSUVSX1JFR19FWFAgPSBuZXcgUmVnRXhwKCcle2RhdGV0aW1lfScsICdpJyk7XG5jb25zdCBQUk9DRVNTX0RFRklOSVRJT05fSURFTlRJRklFUl9SRUdfRVhQID0gbmV3IFJlZ0V4cCgnJXtwcm9jZXNzZGVmaW5pdGlvbn0nLCAnaScpO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FkZi1jbG91ZC1zdGFydC1wcm9jZXNzJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICAgICAgTWF0Q2FyZE1vZHVsZSxcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgICAgICBJbnBsYWNlRm9ybUlucHV0Q29tcG9uZW50LFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICAgICAgTWF0T3B0aW9uTW9kdWxlLFxuICAgICAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIEZvcm1DbG91ZENvbXBvbmVudCxcbiAgICAgICAgRm9ybUN1c3RvbU91dGNvbWVzQ29tcG9uZW50XG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFtMb2NhbGl6ZWREYXRlUGlwZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3N0YXJ0LXByb2Nlc3MtY2xvdWQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3N0YXJ0LXByb2Nlc3MtY2xvdWQuY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFN0YXJ0UHJvY2Vzc0Nsb3VkQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQge1xuICAgIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcilcbiAgICBpbnB1dEF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcblxuICAgIC8qKiAocmVxdWlyZWQpIE5hbWUgb2YgdGhlIGFwcC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFwcE5hbWU6IHN0cmluZyA9ICcnO1xuXG4gICAgLyoqIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBwcm9jZXNzIG5hbWUuICovXG4gICAgQElucHV0KClcbiAgICBtYXhOYW1lTGVuZ3RoOiBudW1iZXIgPSBNQVhfTkFNRV9MRU5HVEg7XG5cbiAgICAvKiogTmFtZSBvZiB0aGUgcHJvY2Vzcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIG5hbWU6IHN0cmluZyA9ICcnO1xuXG4gICAgLyoqIE5hbWUgb2YgdGhlIHByb2Nlc3MgZGVmaW5pdGlvbi4gKi9cbiAgICBASW5wdXQoKVxuICAgIHByb2Nlc3NEZWZpbml0aW9uTmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIFZhcmlhYmxlcyB0byBhdHRhY2ggdG8gdGhlIHBheWxvYWQuICovXG4gICAgQElucHV0KClcbiAgICB2YXJpYWJsZXM6IGFueTtcblxuICAgIC8qKiBQYXJhbWV0ZXIgdG8gcGFzcyBmb3JtIGZpZWxkIHZhbHVlcyBpbiB0aGUgc3RhcnQgZm9ybSBpZiBvbmUgaXMgYXNzb2NpYXRlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHZhbHVlczogVGFza1ZhcmlhYmxlQ2xvdWRbXTtcblxuICAgIC8qKiBTaG93L2hpZGUgdGhlIHByb2Nlc3MgZHJvcGRvd24gbGlzdC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dTZWxlY3RQcm9jZXNzRHJvcGRvd246IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIFNob3cvaGlkZSB0aXRsZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dUaXRsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogU2hvdy9oaWRlIGNhbmNlbCBidXR0b24uICovXG4gICAgQElucHV0KClcbiAgICBzaG93Q2FuY2VsQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhdmFpbGFibGUgZGlzcGxheSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGZvcm0uXG4gICAgICogKHN0YXJ0IHByb2Nlc3MgZXZlbnQgY2FuIGhhdmUgYXNzaWduZWQgZm9ybSlcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc3BsYXlNb2RlQ29uZmlndXJhdGlvbnM6IEZvcm1DbG91ZERpc3BsYXlNb2RlQ29uZmlndXJhdGlvbltdO1xuXG4gICAgLyoqIFRvZ2dsZSByZW5kZXJpbmcgb2YgdGhlIGBPcGVuIG5leHQgdGFza2AgY2hlY2tib3guICovXG4gICAgQElucHV0KClcbiAgICBzaG93TmV4dFRhc2tDaGVja2JveCA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGBPcGVuIG5leHQgdGFza2AgY2hlY2tib3ggaXMgY2hlY2tlZCBieSBkZWZhdWx0IG9yIG5vdC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGlzTmV4dFRhc2tDaGVja2JveENoZWNrZWQgPSBmYWxzZTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHByb2Nlc3MgaXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgc3VjY2VzcyA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvY2Vzc0luc3RhbmNlQ2xvdWQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBzdGFydGluZyBwcm9jZXNzIGlzIGNhbmNlbGxlZCAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvY2Vzc0luc3RhbmNlQ2xvdWQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGFuIGVycm9yIG9jY3Vycy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBlcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBmb3JtIGNvbnRlbnQgaXMgY2xpY2tlZC4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBmb3JtQ29udGVudENsaWNrZWQ6IEV2ZW50RW1pdHRlcjxDb250ZW50TGlua01vZGVsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gcHJvY2VzcyBkZWZpbml0aW9uIHNlbGVjdGlvbiBjaGFuZ2VzLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHByb2Nlc3NEZWZpbml0aW9uU2VsZWN0aW9uOiBFdmVudEVtaXR0ZXI8UHJvY2Vzc0RlZmluaXRpb25DbG91ZD4gPSBuZXcgRXZlbnRFbWl0dGVyPFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBgT3BlbiBuZXh0IHRhc2tgIGNoZWNrYm94IHdhcyB0b2dnbGVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIG5leHRUYXNrQ2hlY2tib3hDaGVja2VkQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TWF0Q2hlY2tib3hDaGFuZ2U+KCk7XG5cbiAgICBwcm9jZXNzRGVmaW5pdGlvbkxpc3Q6IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWRbXSA9IFtdO1xuICAgIHByb2Nlc3NEZWZpbml0aW9uQ3VycmVudD86IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQ7XG4gICAgZXJyb3JNZXNzYWdlSWQ6IHN0cmluZyA9ICcnO1xuICAgIHByb2Nlc3NQYXlsb2FkQ2xvdWQgPSBuZXcgUHJvY2Vzc1BheWxvYWRDbG91ZCgpO1xuICAgIGZpbHRlcmVkUHJvY2Vzc2VzOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkW10gPSBbXTtcbiAgICBzdGF0aWNNYXBwaW5nczogVGFza1ZhcmlhYmxlQ2xvdWRbXSA9IFtdO1xuICAgIHJlc29sdmVkVmFsdWVzPzogVGFza1ZhcmlhYmxlQ2xvdWRbXTtcbiAgICBjdXN0b21PdXRjb21lOiBzdHJpbmc7XG5cbiAgICBpc1Byb2Nlc3NTdGFydGluZyA9IGZhbHNlO1xuICAgIGlzRm9ybUNsb3VkTG9hZGVkID0gZmFsc2U7XG4gICAgaXNGb3JtQ2xvdWRMb2FkaW5nID0gZmFsc2U7XG4gICAgcHJvY2Vzc0RlZmluaXRpb25Mb2FkZWQgPSBmYWxzZTtcblxuICAgIHNob3dTdGFydFByb2Nlc3NCdXR0b24kOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHN0YXJ0UHJvY2Vzc0J1dHRvbkxhYmVsOiBzdHJpbmc7XG4gICAgY2FuY2VsQnV0dG9uTGFiZWw6IHN0cmluZztcblxuICAgIGZvcm1DbG91ZD86IEZvcm1Nb2RlbDtcbiAgICBwcm9jZXNzRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgICBwcm9jZXNzSW5zdGFuY2VOYW1lOiBuZXcgRm9ybUNvbnRyb2woJycsIFtcbiAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLmdldE1heE5hbWVMZW5ndGgoKSksXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oJ15bXlxcXFxzXSsoXFxcXHMrW15cXFxcc10rKSokJylcbiAgICAgICAgXSksXG4gICAgICAgIHByb2Nlc3NEZWZpbml0aW9uOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTmFtZVZhbGlkYXRvcigpXSlcbiAgICB9KTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0UHJvY2Vzc0Nsb3VkU2VydmljZSA9IGluamVjdChTdGFydFByb2Nlc3NDbG91ZFNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxpemVkRGF0ZVBpcGUgPSBpbmplY3QoTG9jYWxpemVkRGF0ZVBpcGUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheVN0YXJ0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihudWxsKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhc1Zpc2libGVPdXRjb21lc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuXG4gICAgc2hvd1NhdmVCdXR0b24gPSBmYWxzZTtcbiAgICBzaG93Q29tcGxldGVCdXR0b24gPSBmYWxzZTtcblxuICAgIGdldCBpc1Byb2Nlc3NGb3JtVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0Zvcm0gJiYgdGhpcy5pc0Zvcm1DbG91ZExvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLmZvcm1DbG91ZCA/ICFPYmplY3Qua2V5cyh0aGlzLmZvcm1DbG91ZC52YWx1ZXMpLmxlbmd0aCA6IGZhbHNlKSB8fCB0aGlzLmZvcm1DbG91ZD8uaXNWYWxpZCB8fCB0aGlzLmlzUHJvY2Vzc1N0YXJ0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0Zvcm0udmFsaWQgfHwgdGhpcy5pc1Byb2Nlc3NTdGFydGluZztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBkaXNhYmxlU3RhcnRCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5hcHBOYW1lIHx8ICF0aGlzLnByb2Nlc3NEZWZpbml0aW9uLnZhbGlkIHx8IHRoaXMuaXNQcm9jZXNzU3RhcnRpbmcgfHwgdGhpcy5pc0Zvcm1DbG91ZExvYWRpbmc7XG4gICAgfVxuXG4gICAgZ2V0IGlzUHJvY2Vzc0RlZmluaXRpb25zRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkxpc3QubGVuZ3RoO1xuICAgIH1cblxuICAgIGdldCBwcm9jZXNzSW5zdGFuY2VOYW1lKCk6IEZvcm1Db250cm9sPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRm9ybS5jb250cm9scy5wcm9jZXNzSW5zdGFuY2VOYW1lO1xuICAgIH1cblxuICAgIGdldCBwcm9jZXNzRGVmaW5pdGlvbigpOiBGb3JtQ29udHJvbDxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0Zvcm0uY29udHJvbHMucHJvY2Vzc0RlZmluaXRpb247XG4gICAgfVxuXG4gICAgZ2V0IGhhc0Zvcm0oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucHJvY2Vzc0RlZmluaXRpb25DdXJyZW50Py5mb3JtS2V5O1xuICAgIH1cblxuICAgIGdldCBkZWZhdWx0U3RhcnRQcm9jZXNzQnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkZPUk0uQUNUSU9OLlNUQVJUJykudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBnZXQgZGVmYXVsdENhbmNlbFByb2Nlc3NCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRk9STS5BQ1RJT04uQ0FOQ0VMJykudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSkge1xuICAgICAgICB0aGlzLnN0YXJ0UHJvY2Vzc0J1dHRvbkxhYmVsID0gdGhpcy5kZWZhdWx0U3RhcnRQcm9jZXNzQnV0dG9uTGFiZWw7XG4gICAgICAgIHRoaXMuY2FuY2VsQnV0dG9uTGFiZWwgPSB0aGlzLmRlZmF1bHRDYW5jZWxQcm9jZXNzQnV0dG9uTGFiZWw7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb24uc2V0VmFsdWUodGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWUpO1xuICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKFBST0NFU1NfREVGSU5JVElPTl9ERUJPVU5DRSkpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHByb2Nlc3NEZWZpbml0aW9uTmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0UHJvY2Vzc0RlZmluaXRpb25CeVByb2Nlc3NEZWZpbml0aW9uTmFtZShwcm9jZXNzRGVmaW5pdGlvbk5hbWUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zaG93U3RhcnRQcm9jZXNzQnV0dG9uJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZGlzcGxheVN0YXJ0U3ViamVjdCwgdGhpcy5oYXNWaXNpYmxlT3V0Y29tZXNTdWJqZWN0XSkucGlwZShcbiAgICAgICAgICAgIG1hcCgoW2Rpc3BsYXlTdGFydCwgaGFzVmlzaWJsZU91dGNvbWVzXSkgPT4gKGRpc3BsYXlTdGFydCAhPT0gbnVsbCA/IGRpc3BsYXlTdGFydCA9PT0gJ3RydWUnIDogIWhhc1Zpc2libGVPdXRjb21lcykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlc1snYXBwTmFtZSddICYmIGNoYW5nZXNbJ2FwcE5hbWUnXS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ2FwcE5hbWUnXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcE5hbWUgPSBjaGFuZ2VzWydhcHBOYW1lJ10uY3VycmVudFZhbHVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5hcHBOYW1lIHx8IHRoaXMuYXBwTmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRQcm9jZXNzRGVmaW5pdGlvbnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzWyd2YWx1ZXMnXSAmJiBjaGFuZ2VzWyd2YWx1ZXMnXS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ3ZhbHVlcyddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZWRWYWx1ZXMgPSB0aGlzLnN0YXRpY01hcHBpbmdzLmNvbmNhdCh0aGlzLnZhbHVlcyB8fCBbXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgb25Gb3JtTG9hZGVkKGZvcm06IEZvcm1Nb2RlbCkge1xuICAgICAgICB0aGlzLmlzRm9ybUNsb3VkTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb3JtQ2xvdWQgPSBmb3JtO1xuXG4gICAgICAgIGNvbnN0IGFueU91dGNvbWVWaXNpYmxlID0gZm9ybT8ub3V0Y29tZXM/LnNvbWUoKG91dGNvbWUpID0+XG4gICAgICAgICAgICBpc091dGNvbWVCdXR0b25WaXNpYmxlKG91dGNvbWUsIHtcbiAgICAgICAgICAgICAgICBpc0Zvcm1SZWFkT25seTogZm9ybS5yZWFkT25seSxcbiAgICAgICAgICAgICAgICBzaG93Q29tcGxldGVCdXR0b246IHRoaXMuc2hvd0NvbXBsZXRlQnV0dG9uLFxuICAgICAgICAgICAgICAgIHNob3dTYXZlQnV0dG9uOiB0aGlzLnNob3dTYXZlQnV0dG9uXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmhhc1Zpc2libGVPdXRjb21lc1N1YmplY3QubmV4dChhbnlPdXRjb21lVmlzaWJsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNYXhOYW1lTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heE5hbWVMZW5ndGggPiBNQVhfTkFNRV9MRU5HVEggPyBNQVhfTkFNRV9MRU5HVEggOiB0aGlzLm1heE5hbWVMZW5ndGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RQcm9jZXNzRGVmaW5pdGlvbkJ5UHJvY2Vzc0RlZmluaXRpb25OYW1lKHByb2Nlc3NEZWZpbml0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRQcm9jZXNzZXMgPSB0aGlzLmdldFByb2Nlc3NEZWZpbml0aW9uTGlzdEJ5TmFtZU9yS2V5KHByb2Nlc3NEZWZpbml0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNQcm9jZXNzRm9ybVZhbGlkICYmIHRoaXMuZmlsdGVyZWRQcm9jZXNzZXMgJiYgdGhpcy5maWx0ZXJlZFByb2Nlc3Nlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UHJvY2Vzc0RlZmluaXRpb25PbkZvcm0odGhpcy5maWx0ZXJlZFByb2Nlc3Nlc1swXS5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFByb2Nlc3NEZWZpbml0aW9uT25Gb3JtKHNlbGVjdGVkUHJvY2Vzc0RlZmluaXRpb25OYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5pc0Zvcm1DbG91ZExvYWRpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBwcm9jZXNzRGVmaW5pdGlvbkN1cnJlbnQgPSB0aGlzLmZpbHRlcmVkUHJvY2Vzc2VzLmZpbmQoXG4gICAgICAgICAgICAocHJvY2VzczogUHJvY2Vzc0RlZmluaXRpb25DbG91ZCkgPT4gcHJvY2Vzcy5uYW1lID09PSBzZWxlY3RlZFByb2Nlc3NEZWZpbml0aW9uTmFtZSB8fCBwcm9jZXNzLmtleSA9PT0gc2VsZWN0ZWRQcm9jZXNzRGVmaW5pdGlvbk5hbWVcbiAgICAgICAgKTtcblxuICAgICAgICBmb3JrSm9pbihbXG4gICAgICAgICAgICB0aGlzLnN0YXJ0UHJvY2Vzc0Nsb3VkU2VydmljZVxuICAgICAgICAgICAgICAgIC5nZXRTdGFydEV2ZW50Rm9ybVN0YXRpY1ZhbHVlc01hcHBpbmcodGhpcy5hcHBOYW1lLCBwcm9jZXNzRGVmaW5pdGlvbkN1cnJlbnQuaWQpXG4gICAgICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihbXSBhcyBUYXNrVmFyaWFibGVDbG91ZFtdKSkpLFxuICAgICAgICAgICAgdGhpcy5zdGFydFByb2Nlc3NDbG91ZFNlcnZpY2VcbiAgICAgICAgICAgICAgICAuZ2V0U3RhcnRFdmVudENvbnN0YW50cyh0aGlzLmFwcE5hbWUsIHByb2Nlc3NEZWZpbml0aW9uQ3VycmVudC5pZClcbiAgICAgICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKFtdIGFzIFRhc2tWYXJpYWJsZUNsb3VkW10pKSlcbiAgICAgICAgXSkuc3Vic2NyaWJlKChbc3RhdGljTWFwcGluZ3MsIGNvbnN0YW50c10pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGljTWFwcGluZ3MgPSBzdGF0aWNNYXBwaW5ncztcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZWRWYWx1ZXMgPSB0aGlzLnN0YXRpY01hcHBpbmdzLmNvbmNhdCh0aGlzLnZhbHVlcyB8fCBbXSk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uQ3VycmVudCA9IHByb2Nlc3NEZWZpbml0aW9uQ3VycmVudDtcbiAgICAgICAgICAgIHRoaXMuaXNGb3JtQ2xvdWRMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlTdGFydCA9IGNvbnN0YW50cz8uZmluZCgoY29uc3RhbnQpID0+IGNvbnN0YW50Lm5hbWUgPT09ICdzdGFydEVuYWJsZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0TGFiZWwgPSBjb25zdGFudHM/LmZpbmQoKGNvbnN0YW50KSA9PiBjb25zdGFudC5uYW1lID09PSAnc3RhcnRMYWJlbCcpO1xuXG4gICAgICAgICAgICBjb25zdCBkaXNwbGF5Q2FuY2VsID0gY29uc3RhbnRzPy5maW5kKChjb25zdGFudCkgPT4gY29uc3RhbnQubmFtZSA9PT0gJ2NhbmNlbEVuYWJsZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbExhYmVsID0gY29uc3RhbnRzPy5maW5kKChjb25zdGFudCkgPT4gY29uc3RhbnQubmFtZSA9PT0gJ2NhbmNlbExhYmVsJyk7XG5cbiAgICAgICAgICAgIGlmIChkaXNwbGF5U3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlTdGFydFN1YmplY3QubmV4dChkaXNwbGF5U3RhcnQ/LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGFydExhYmVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFByb2Nlc3NCdXR0b25MYWJlbCA9IHN0YXJ0TGFiZWw/LnZhbHVlPy50cmltKCk/Lmxlbmd0aCA+IDAgPyBzdGFydExhYmVsLnZhbHVlLnRyaW0oKSA6IHRoaXMuZGVmYXVsdFN0YXJ0UHJvY2Vzc0J1dHRvbkxhYmVsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGlzcGxheUNhbmNlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0NhbmNlbEJ1dHRvbiA9IGRpc3BsYXlDYW5jZWw/LnZhbHVlID09PSAndHJ1ZScgJiYgdGhpcy5zaG93Q2FuY2VsQnV0dG9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhbmNlbExhYmVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxCdXR0b25MYWJlbCA9IGNhbmNlbExhYmVsPy52YWx1ZT8udHJpbSgpPy5sZW5ndGggPiAwID8gY2FuY2VsTGFiZWwudmFsdWUudHJpbSgpIDogdGhpcy5kZWZhdWx0Q2FuY2VsUHJvY2Vzc0J1dHRvbkxhYmVsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmlzRm9ybUNsb3VkTG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJvY2Vzc1BheWxvYWRDbG91ZC5wcm9jZXNzRGVmaW5pdGlvbktleSA9IHByb2Nlc3NEZWZpbml0aW9uQ3VycmVudC5rZXk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzRGVmaW5pdGlvbkxpc3RCeU5hbWVPcktleShwcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTGlzdC5maWx0ZXIoXG4gICAgICAgICAgICAocHJvY2Vzc0RlZmluaXRpb25DbG91ZCkgPT4gIXByb2Nlc3NEZWZpbml0aW9uTmFtZSB8fCB0aGlzLmdldFByb2Nlc3NEZWZpbml0aW9uKHByb2Nlc3NEZWZpbml0aW9uQ2xvdWQsIHByb2Nlc3NEZWZpbml0aW9uTmFtZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByb2Nlc3NJZkV4aXN0cyhwcm9jZXNzRGVmaW5pdGlvbjogc3RyaW5nKTogUHJvY2Vzc0RlZmluaXRpb25DbG91ZCB7XG4gICAgICAgIGxldCBtYXRjaGVkUHJvY2VzcyA9IHRoaXMucHJvY2Vzc0RlZmluaXRpb25MaXN0LmZpbmQoKG9wdGlvbikgPT4gdGhpcy5nZXRQcm9jZXNzRGVmaW5pdGlvbihvcHRpb24sIHByb2Nlc3NEZWZpbml0aW9uKSk7XG4gICAgICAgIGlmICghbWF0Y2hlZFByb2Nlc3MpIHtcbiAgICAgICAgICAgIG1hdGNoZWRQcm9jZXNzID0gbmV3IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXRjaGVkUHJvY2VzcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByb2Nlc3NEZWZpbml0aW9uQnlOYW1lKHByb2Nlc3NEZWZpbml0aW9uTmFtZTogc3RyaW5nKTogUHJvY2Vzc0RlZmluaXRpb25DbG91ZCB7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRQcm9jZXNzID0gcHJvY2Vzc0RlZmluaXRpb25OYW1lID8gdGhpcy5nZXRQcm9jZXNzSWZFeGlzdHMocHJvY2Vzc0RlZmluaXRpb25OYW1lKSA6IHRoaXMucHJvY2Vzc0RlZmluaXRpb25MaXN0WzBdO1xuICAgICAgICByZXR1cm4gbWF0Y2hlZFByb2Nlc3M7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3REZWZhdWx0UHJvY2Vzc0RlZmluaXRpb24oKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUHJvY2VzcyA9IHRoaXMuZ2V0UHJvY2Vzc0RlZmluaXRpb25CeU5hbWUodGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRQcm9jZXNzKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uLnNldFZhbHVlKHNlbGVjdGVkUHJvY2Vzcy5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25TZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGVkUHJvY2Vzcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZFByb2Nlc3NEZWZpbml0aW9ucygpIHtcbiAgICAgICAgdGhpcy5yZXNldEVycm9yTWVzc2FnZSgpO1xuXG4gICAgICAgIHRoaXMuc3RhcnRQcm9jZXNzQ2xvdWRTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0UHJvY2Vzc0RlZmluaXRpb25zKHRoaXMuYXBwTmFtZSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAocHJvY2Vzc0RlZmluaXRpb25SZXByZXNlbnRhdGlvbnM6IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWRbXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTGlzdCA9IHByb2Nlc3NEZWZpbml0aW9uUmVwcmVzZW50YXRpb25zO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc0RlZmluaXRpb25SZXByZXNlbnRhdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRQcm9jZXNzRGVmaW5pdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJvY2Vzc0RlZmluaXRpb25OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uLnNldFZhbHVlKHRoaXMucHJvY2Vzc0RlZmluaXRpb25OYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0RlZmluaXRpb24gPSB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTGlzdC5maW5kKChwcm9jZXNzKSA9PiBwcm9jZXNzLm5hbWUgPT09IHRoaXMucHJvY2Vzc0RlZmluaXRpb25OYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzRGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRQcm9jZXNzZXMgPSB0aGlzLmdldFByb2Nlc3NEZWZpbml0aW9uTGlzdEJ5TmFtZU9yS2V5KHByb2Nlc3NEZWZpbml0aW9uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UHJvY2Vzc0RlZmluaXRpb25PbkZvcm0ocHJvY2Vzc0RlZmluaXRpb24ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvblNlbGVjdGlvbkNoYW5nZWQocHJvY2Vzc0RlZmluaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlSWQgPSAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5FUlJPUi5MT0FEX1BST0NFU1NfREVGUyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWROYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISFuYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvY2Vzc0RlZmluaXRpb24ocHJvY2Vzc0RlZmluaXRpb25DbG91ZDogUHJvY2Vzc0RlZmluaXRpb25DbG91ZCwgcHJvY2Vzc0RlZmluaXRpb25OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0aGlzLmlzVmFsaWROYW1lKHByb2Nlc3NEZWZpbml0aW9uQ2xvdWQubmFtZSkgJiZcbiAgICAgICAgICAgICAgICBwcm9jZXNzRGVmaW5pdGlvbkNsb3VkLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhwcm9jZXNzRGVmaW5pdGlvbk5hbWUudG9Mb3dlckNhc2UoKSkpIHx8XG4gICAgICAgICAgICBwcm9jZXNzRGVmaW5pdGlvbkNsb3VkLmtleT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhwcm9jZXNzRGVmaW5pdGlvbk5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBidWlsZFByb2Nlc3NDbG91ZFBheWxvYWQoKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1BheWxvYWRDbG91ZC5uYW1lID0gdGhpcy5wcm9jZXNzSW5zdGFuY2VOYW1lLnZhbHVlO1xuICAgICAgICBpZiAodGhpcy52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BheWxvYWRDbG91ZC52YXJpYWJsZXMgPSB0aGlzLnZhcmlhYmxlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0Zvcm0pIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BheWxvYWRDbG91ZC52YXJpYWJsZXMgPSBPYmplY3QuYXNzaWduKHRoaXMucHJvY2Vzc1BheWxvYWRDbG91ZC52YXJpYWJsZXMsIHRoaXMuZm9ybUNsb3VkLnZhbHVlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkN1c3RvbU91dGNvbWVDbGlja2VkKG91dGNvbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmN1c3RvbU91dGNvbWUgPSBvdXRjb21lO1xuICAgICAgICB0aGlzLnN0YXJ0UHJvY2VzcygpO1xuICAgIH1cblxuICAgIHN0YXJ0UHJvY2Vzc1dpdGhvdXRDb25maXJtYXRpb24oKSB7XG4gICAgICAgIHRoaXMuaXNQcm9jZXNzU3RhcnRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuaGFzRm9ybVxuICAgICAgICAgICAgPyB0aGlzLnN0YXJ0UHJvY2Vzc0Nsb3VkU2VydmljZS5zdGFydFByb2Nlc3NXaXRoRm9ybShcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXBwTmFtZSxcbiAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25DdXJyZW50LmZvcm1LZXksXG4gICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uQ3VycmVudC52ZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgbmV3IFByb2Nlc3NXaXRoRm9ybVBheWxvYWRDbG91ZCh7XG4gICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc05hbWU6IHRoaXMucHJvY2Vzc0luc3RhbmNlTmFtZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRGVmaW5pdGlvbktleTogdGhpcy5wcm9jZXNzUGF5bG9hZENsb3VkLnByb2Nlc3NEZWZpbml0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczogdGhpcy52YXJpYWJsZXMgPz8ge30sXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiB0aGlzLmZvcm1DbG91ZC52YWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZTogdGhpcy5jdXN0b21PdXRjb21lXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IHRoaXMuc3RhcnRQcm9jZXNzQ2xvdWRTZXJ2aWNlLnN0YXJ0UHJvY2VzcyhcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXBwTmFtZSxcbiAgICAgICAgICAgICAgICAgIG5ldyBQcm9jZXNzUGF5bG9hZENsb3VkKHtcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLnByb2Nlc3NJbnN0YW5jZU5hbWUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25LZXk6IHRoaXMucHJvY2Vzc1BheWxvYWRDbG91ZC5wcm9jZXNzRGVmaW5pdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHRoaXMudmFyaWFibGVzID8/IHt9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgIGFjdGlvbi5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VjY2Vzcy5lbWl0KHJlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1Byb2Nlc3NTdGFydGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VJZCA9ICdBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkVSUk9SLlNUQVJUJztcbiAgICAgICAgICAgICAgICB0aGlzLnVuaWZ5RXJyb3JSZXNwb25zZShlcnIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdChlcnIpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNQcm9jZXNzU3RhcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhcnRQcm9jZXNzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUNsb3VkPy5jb25maXJtTWVzc2FnZT8uc2hvdykge1xuICAgICAgICAgICAgdGhpcy5zdGFydFByb2Nlc3NXaXRob3V0Q29uZmlybWF0aW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuZm9ybUNsb3VkLmNvbmZpcm1NZXNzYWdlLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnNDUwcHgnXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRQcm9jZXNzV2l0aG91dENvbmZpcm1hdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bmlmeUVycm9yUmVzcG9uc2UoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKCFlcnI/LnJlc3BvbnNlPy5ib2R5Py5lbnRyeSAmJiBlcnI/LnJlc3BvbnNlPy5ib2R5Py5tZXNzYWdlKSB7XG4gICAgICAgICAgICBlcnIucmVzcG9uc2UuYm9keSA9IHtcbiAgICAgICAgICAgICAgICBlbnRyeTogSlNPTi5wYXJzZShlcnIucmVzcG9uc2UuYm9keS5tZXNzYWdlKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNhbmNlbFN0YXJ0UHJvY2VzcygpIHtcbiAgICAgICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRFcnJvck1lc3NhZ2UoKSB7XG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlSWQgPSAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0UHJvY2Vzc0RlZmluaXRpb25MaXN0KCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uLnNldFZhbHVlKCcnKTtcbiAgICAgICAgdGhpcy5maWx0ZXJlZFByb2Nlc3NlcyA9IHRoaXMucHJvY2Vzc0RlZmluaXRpb25MaXN0O1xuICAgIH1cblxuICAgIGRpc3BsYXlQcm9jZXNzTmFtZU9uRHJvcGRvd24ocHJvY2VzczogYW55KSB7XG4gICAgICAgIGlmIChwcm9jZXNzKSB7XG4gICAgICAgICAgICBsZXQgcHJvY2Vzc05hbWUgPSBwcm9jZXNzO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NOYW1lID0gcHJvY2Vzcy5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NOYW1lO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcGxheURyb3Bkb3duKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoIXRoaXMuaW5wdXRBdXRvY29tcGxldGUucGFuZWxPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0UHJvY2Vzc0RlZmluaXRpb25MaXN0KCk7XG4gICAgICAgICAgICB0aGlzLmlucHV0QXV0b2NvbXBsZXRlLm9wZW5QYW5lbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbnB1dEF1dG9jb21wbGV0ZS5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9jZXNzRGVmaW5pdGlvbk5hbWVWYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NEZWZpbml0aW9uRmllbGRWYWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICBsZXQgcHJvY2Vzc0RlZmluaXRpb25OYW1lRXJyb3IgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKHByb2Nlc3NEZWZpbml0aW9uRmllbGRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NEZWZpbml0aW9uID0gdGhpcy5nZXRQcm9jZXNzSWZFeGlzdHMocHJvY2Vzc0RlZmluaXRpb25GaWVsZFZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NEZWZpbml0aW9uLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRGVmaW5pdGlvbk5hbWVFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0RlZmluaXRpb25OYW1lRXJyb3IgPyB7ICdpbnZhbGlkIG5hbWUnOiB0cnVlIH0gOiBudWxsO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFByb2Nlc3NEZWZpbml0aW9uVmFsdWUocHJvY2VzczogUHJvY2Vzc0RlZmluaXRpb25DbG91ZCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLm5hbWUgPyBwcm9jZXNzLm5hbWUgOiBwcm9jZXNzLmtleTtcbiAgICB9XG5cbiAgICBvbkZvcm1Db250ZW50Q2xpY2tlZChjb250ZW50OiBDb250ZW50TGlua01vZGVsKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRlbnRDbGlja2VkLmVtaXQoY29udGVudCk7XG4gICAgfVxuXG4gICAgcHJvY2Vzc0RlZmluaXRpb25TZWxlY3Rpb25DaGFuZ2VkKHByb2Nlc3NEZWZpbml0aW9uOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkKSB7XG4gICAgICAgIGlmIChwcm9jZXNzRGVmaW5pdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0UHJvY2Vzc05hbWUocHJvY2Vzc0RlZmluaXRpb24ubmFtZSk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uU2VsZWN0aW9uLmVtaXQocHJvY2Vzc0RlZmluaXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RGVmYXVsdFByb2Nlc3NOYW1lKHByb2Nlc3NEZWZpbml0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NJbnN0YW5jZURldGFpbHM6IFByb2Nlc3NJbnN0YW5jZUNsb3VkID0geyBwcm9jZXNzRGVmaW5pdGlvbk5hbWUgfTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFByb2Nlc3NOYW1lID0gdGhpcy5nZXREZWZhdWx0UHJvY2Vzc05hbWUodGhpcy5uYW1lLCBwcm9jZXNzSW5zdGFuY2VEZXRhaWxzKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzSW5zdGFuY2VOYW1lLnNldFZhbHVlKGRlZmF1bHRQcm9jZXNzTmFtZSk7XG4gICAgICAgIHRoaXMucHJvY2Vzc0luc3RhbmNlTmFtZS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLnByb2Nlc3NJbnN0YW5jZU5hbWUubWFya0FzVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRQcm9jZXNzTmFtZShwcm9jZXNzTmFtZUZvcm1hdDogc3RyaW5nLCBwcm9jZXNzSW5zdGFuY2U/OiBQcm9jZXNzSW5zdGFuY2VDbG91ZCk6IHN0cmluZyB7XG4gICAgICAgIGxldCBwcm9jZXNzTmFtZSA9IHByb2Nlc3NOYW1lRm9ybWF0O1xuICAgICAgICBpZiAocHJvY2Vzc05hbWUubWF0Y2goREFURV9USU1FX0lERU5USUZJRVJfUkVHX0VYUCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbnREYXRlVGltZSA9IGdldFRpbWUobmV3IERhdGUoKSk7XG4gICAgICAgICAgICBwcm9jZXNzTmFtZSA9IHByb2Nlc3NOYW1lLnJlcGxhY2UoREFURV9USU1FX0lERU5USUZJRVJfUkVHX0VYUCwgdGhpcy5sb2NhbGl6ZWREYXRlUGlwZS50cmFuc2Zvcm0ocHJlc2VudERhdGVUaW1lLCAnbWVkaXVtJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb2Nlc3NOYW1lLm1hdGNoKFBST0NFU1NfREVGSU5JVElPTl9JREVOVElGSUVSX1JFR19FWFApKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFByb2Nlc3NEZWZpbml0aW9uTmFtZSA9IHByb2Nlc3NJbnN0YW5jZSA/IHByb2Nlc3NJbnN0YW5jZS5wcm9jZXNzRGVmaW5pdGlvbk5hbWUgOiAnJztcbiAgICAgICAgICAgIHByb2Nlc3NOYW1lID0gcHJvY2Vzc05hbWUucmVwbGFjZShQUk9DRVNTX0RFRklOSVRJT05fSURFTlRJRklFUl9SRUdfRVhQLCBzZWxlY3RlZFByb2Nlc3NEZWZpbml0aW9uTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2Nlc3NOYW1lO1xuICAgIH1cblxuICAgIG9uTmV4dFRhc2tDaGVja2JveENoZWNrZWRDaGFuZ2VkKGV2ZW50OiBNYXRDaGVja2JveENoYW5nZSkge1xuICAgICAgICB0aGlzLm5leHRUYXNrQ2hlY2tib3hDaGVja2VkQ2hhbmdlZC5lbWl0KGV2ZW50KTtcbiAgICB9XG59XG4iLCI8bWF0LWNhcmQgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCIgY2xhc3M9XCJhZGYtc3RhcnQtcHJvY2Vzc1wiICpuZ0lmPVwicHJvY2Vzc0RlZmluaXRpb25Mb2FkZWQ7IGVsc2Ugc3Bpbm5lclwiPlxuXG4gICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgIDxtYXQtY2FyZC10aXRsZVxuICAgICAgICAgICAgKm5nSWY9XCJzaG93VGl0bGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJhZGYtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICB7eydBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkZPUk0uVElUTEUnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgPC9tYXQtY2FyZC10aXRsZT5cblxuICAgICAgICA8bWF0LWNhcmQtc3VidGl0bGUgaWQ9XCJlcnJvci1tZXNzYWdlXCIgKm5nSWY9XCJlcnJvck1lc3NhZ2VJZFwiPlxuICAgICAgICAgICAge3sgZXJyb3JNZXNzYWdlSWQgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9tYXQtY2FyZC1zdWJ0aXRsZT5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzUHJvY2Vzc0RlZmluaXRpb25zRW1wdHk7IGVsc2UgZW1wdHlQcm9jZXNzRGVmaW5pdGlvbnNMaXN0XCI+XG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInByb2Nlc3NGb3JtXCIgY2xhc3M9XCJhZGYtc2VsZWN0LXByb2Nlc3MtZm9ybVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFkZi1wcm9jZXNzLWlucHV0LWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgIGZsb2F0TGFiZWw9XCJhbHdheXNcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dTZWxlY3RQcm9jZXNzRHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJhZGYtc2VsZWN0LWNsb3VkLXByb2Nlc3MtZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJhZGYtc3RhcnQtcHJvY2Vzcy1pbnB1dC1sYWJlbFwiPnt7ICdBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkZPUk0uTEFCRUwuVFlQRScgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvY2Vzc0RlZmluaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwcm9jZXNzRGVmaW5pdGlvbk5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLXByb2Nlc3MtaW5wdXQtYXV0b2NvbXBsZXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInByb2Nlc3NEZWZpbml0aW9uT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5UHJvY2Vzc05hbWVPbkRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cInNldFByb2Nlc3NEZWZpbml0aW9uT25Gb3JtKCRldmVudC5vcHRpb24udmFsdWUpXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcHJvY2Vzc0RlZiBvZiBmaWx0ZXJlZFByb2Nlc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldFByb2Nlc3NEZWZpbml0aW9uVmFsdWUocHJvY2Vzc0RlZilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwcm9jZXNzRGVmaW5pdGlvblNlbGVjdGlvbkNoYW5nZWQocHJvY2Vzc0RlZilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0UHJvY2Vzc0RlZmluaXRpb25WYWx1ZShwcm9jZXNzRGVmKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhZGYtc2VsZWN0LXByb2Nlc3MtZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7J0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRk9STS5TRUxFQ1RfUFJPQ0VTU19EUk9QRE9XTicgfCB0cmFuc2xhdGV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGlzcGxheURyb3Bkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd19kcm9wX2Rvd248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb2Nlc3NEZWZpbml0aW9uLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFkZi1lcnJvci1wYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5FUlJPUi5QUk9DRVNTX0RFRklOSVRJT05fUkVRVUlSRUQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgICAgPGFkZi1pbnBsYWNlLWZvcm0taW5wdXQgW2NvbnRyb2xdPVwicHJvY2Vzc0luc3RhbmNlTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5GT1JNLkxBQkVMLk5BTUUnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBlcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvY2Vzc0luc3RhbmNlTmFtZS5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkVSUk9SLlBST0NFU1NfTkFNRV9SRVFVSVJFRCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvY2Vzc0luc3RhbmNlTmFtZS5oYXNFcnJvcignbWF4bGVuZ3RoJylcIiBpZD1cImFkZi1zdGFydC1wcm9jZXNzLW1heGxlbmd0aC1lcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkVSUk9SLk1BWElNVU1fTEVOR1RIJyB8IHRyYW5zbGF0ZSA6IHsgY2hhcmFjdGVycyA6IG1heE5hbWVMZW5ndGggfSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwcm9jZXNzSW5zdGFuY2VOYW1lLmhhc0Vycm9yKCdwYXR0ZXJuJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5FUlJPUi5TUEFDRV9WQUxJREFUT1InIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYWRmLWlucGxhY2UtZm9ybS1pbnB1dD5cbiAgICAgICAgICAgIDwvZm9ybT5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0Zvcm0gZWxzZSB0YXNrRm9ybUNsb3VkQnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgIDxhZGYtY2xvdWQtZm9ybVxuICAgICAgICAgICAgICAgICAgICAjc3RhcnRGb3JtXG4gICAgICAgICAgICAgICAgICAgIFthcHBOYW1lXT1cImFwcE5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbYXBwVmVyc2lvbl09XCJwcm9jZXNzRGVmaW5pdGlvbkN1cnJlbnQuYXBwVmVyc2lvblwiXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInJlc29sdmVkVmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1JZF09XCJwcm9jZXNzRGVmaW5pdGlvbkN1cnJlbnQuZm9ybUtleVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5TW9kZUNvbmZpZ3VyYXRpb25zXT1cImRpc3BsYXlNb2RlQ29uZmlndXJhdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd1NhdmVCdXR0b25dPVwic2hvd1NhdmVCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0NvbXBsZXRlQnV0dG9uXT1cInNob3dDb21wbGV0ZUJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93UmVmcmVzaEJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93VmFsaWRhdGlvbkljb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd1RpdGxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dOZXh0VGFza0NoZWNrYm94XT1cInNob3dOZXh0VGFza0NoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgW2lzTmV4dFRhc2tDaGVja2JveENoZWNrZWRdPVwiaXNOZXh0VGFza0NoZWNrYm94Q2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgIChmb3JtQ29udGVudENsaWNrZWQpPVwib25Gb3JtQ29udGVudENsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChmb3JtTG9hZGVkKT1cIm9uRm9ybUxvYWRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGV4ZWN1dGVPdXRjb21lKT1cIm9uQ3VzdG9tT3V0Y29tZUNsaWNrZWQoJGV2ZW50Lm91dGNvbWUubmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAobmV4dFRhc2tDaGVja2JveENoZWNrZWRDaGFuZ2VkKT1cIm9uTmV4dFRhc2tDaGVja2JveENoZWNrZWRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhZGYtY2xvdWQtZm9ybS1jdXN0b20tb3V0Y29tZXM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRhc2tGb3JtQ2xvdWRCdXR0b25zXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYWRmLWNsb3VkLWZvcm0tY3VzdG9tLW91dGNvbWVzPlxuICAgICAgICAgICAgICAgIDwvYWRmLWNsb3VkLWZvcm0+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG5cbjwvbWF0LWNhcmQ+XG5cbjxuZy10ZW1wbGF0ZSAjdGFza0Zvcm1DbG91ZEJ1dHRvbnM+XG4gICAgPGRpdiBjbGFzcz1cImFkZi1zdGFydC1wcm9jZXNzLWNsb3VkLWFjdGlvbnNcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJzaG93Q2FuY2VsQnV0dG9uXCJcbiAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxTdGFydFByb2Nlc3MoKVwiXG4gICAgICAgICAgICBpZD1cImNhbmNlbF9wcm9jZXNzXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3sgY2FuY2VsQnV0dG9uTGFiZWwgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1N0YXJ0UHJvY2Vzc0J1dHRvbiQgfCBhc3luY1wiXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlU3RhcnRCdXR0b24gfHwgIWlzUHJvY2Vzc0Zvcm1WYWxpZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic3RhcnRQcm9jZXNzKClcIlxuICAgICAgICAgICAgZGF0YS1hdXRvbWF0aW9uLWlkPVwiYnRuLXN0YXJ0XCJcbiAgICAgICAgICAgIGlkPVwiYnV0dG9uLXN0YXJ0XCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRmLWJ0bi1zdGFydFwiXG4gICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBzdGFydFByb2Nlc3NCdXR0b25MYWJlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlQcm9jZXNzRGVmaW5pdGlvbnNMaXN0PlxuICAgIDxtYXQtY2FyZC1jb250ZW50ICpuZ0lmPVwicHJvY2Vzc0RlZmluaXRpb25Mb2FkZWRcIj5cbiAgICAgICAgPG1hdC1jYXJkLXN1YnRpdGxlIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiIGlkPVwibm8tcHJvY2Vzcy1tZXNzYWdlXCI+XG4gICAgICAgICAgICB7eyAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5OT19QUk9DRVNTX0RFRklOSVRJT05TJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZX19XG4gICAgICAgIDwvbWF0LWNhcmQtc3VidGl0bGU+XG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzcGlubmVyPlxuICAgIDxkaXYgY2xhc3M9XCJhZGYtbG9hZGluZy1jb250YWluZXJcIj5cbiAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyXG4gICAgICAgICAgICBjbGFzcz1cImFkZi1sb2FkaW5nXCJcbiAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIC8+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|