bpm-core 0.0.105 → 0.0.107

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.
Files changed (131) hide show
  1. package/fesm2022/bpm-core.mjs +249 -257
  2. package/fesm2022/bpm-core.mjs.map +1 -1
  3. package/lib/components/shared-components/form-field/checkbox/checkbox.component.d.ts +2 -1
  4. package/lib/components/shared-components/form-field/control-value-accessor.directive.d.ts +1 -1
  5. package/lib/components/shared-components/form-field/doc-uploader/docs-uploader.component.d.ts +2 -1
  6. package/lib/components/shared-components/form-field/shared-imports.d.ts +2 -2
  7. package/lib/components/shared-components/form-field/textarea/special-chars.directive.d.ts +1 -1
  8. package/lib/components/shared-components/title-section/title-section.component.d.ts +1 -1
  9. package/lib/pipes/currency.pipe.d.ts +1 -1
  10. package/lib/pipes/format-as-password.pipe.d.ts +1 -1
  11. package/lib/validators/string-to-boolean.pipe.d.ts +1 -1
  12. package/lib/validators/text.directive.d.ts +1 -1
  13. package/lib/validators/timer.pipe.d.ts +1 -1
  14. package/package.json +2 -4
  15. package/esm2022/bpm-core.mjs +0 -5
  16. package/esm2022/lib/app/app.component.mjs +0 -79
  17. package/esm2022/lib/classes/form-validation.mjs +0 -80
  18. package/esm2022/lib/classes/index.mjs +0 -2
  19. package/esm2022/lib/components/app-component-sections/activities/activities.component.mjs +0 -44
  20. package/esm2022/lib/components/app-component-sections/approvals/approvals.component.mjs +0 -23
  21. package/esm2022/lib/components/app-component-sections/approvals-workflow/approvals-workflow.component.mjs +0 -113
  22. package/esm2022/lib/components/app-component-sections/faq-sidenav/faq-sidenav.component.mjs +0 -25
  23. package/esm2022/lib/components/app-component-sections/faqs/faqs.component.mjs +0 -27
  24. package/esm2022/lib/components/app-component-sections/faqs/index.mjs +0 -2
  25. package/esm2022/lib/components/app-component-sections/feedback-section/feedback-section.component.mjs +0 -237
  26. package/esm2022/lib/components/app-component-sections/form-section/form-section.component.mjs +0 -255
  27. package/esm2022/lib/components/app-component-sections/index.mjs +0 -9
  28. package/esm2022/lib/components/app-component-sections/layout/header/header.component.mjs +0 -79
  29. package/esm2022/lib/components/app-component-sections/layout/layout.component.mjs +0 -89
  30. package/esm2022/lib/components/app-component-sections/layout/side-nav/side-nav.component.mjs +0 -158
  31. package/esm2022/lib/components/app-component-sections/main-request-details/main-request-details.component.mjs +0 -34
  32. package/esm2022/lib/components/app-component-sections/previous-requests/previous-requests.component.mjs +0 -345
  33. package/esm2022/lib/components/app-component-sections/profile-section/profile-section.component.mjs +0 -45
  34. package/esm2022/lib/components/app-component-sections/service-header/service-header.component.mjs +0 -271
  35. package/esm2022/lib/components/app-component-sections/status/status.component.mjs +0 -38
  36. package/esm2022/lib/components/app-component-sections/workflow-section/workflow-section.component.mjs +0 -164
  37. package/esm2022/lib/components/shared-components/action-buttons/action-buttons.component.mjs +0 -138
  38. package/esm2022/lib/components/shared-components/dialogs/confirm-dialog/confirm-dialog.component.mjs +0 -30
  39. package/esm2022/lib/components/shared-components/dialogs/delete-dialog/delete-dialog.component.mjs +0 -29
  40. package/esm2022/lib/components/shared-components/dialogs/submit-dialog/submit-dialog.component.mjs +0 -67
  41. package/esm2022/lib/components/shared-components/form-field/add-attachment-section/add-attachment-section.component.mjs +0 -138
  42. package/esm2022/lib/components/shared-components/form-field/attachment-section/attachment-section.component.mjs +0 -234
  43. package/esm2022/lib/components/shared-components/form-field/base-component/base-component.component.mjs +0 -198
  44. package/esm2022/lib/components/shared-components/form-field/checkbox/checkbox.component.mjs +0 -91
  45. package/esm2022/lib/components/shared-components/form-field/control-value-accessor.directive.mjs +0 -185
  46. package/esm2022/lib/components/shared-components/form-field/custom-searchable-autocomplete/custom-searchable.component.mjs +0 -131
  47. package/esm2022/lib/components/shared-components/form-field/date-picker/date-format.mjs +0 -31
  48. package/esm2022/lib/components/shared-components/form-field/date-picker/date-picker.component.mjs +0 -175
  49. package/esm2022/lib/components/shared-components/form-field/date-range-picker/date-range-picker.component.mjs +0 -186
  50. package/esm2022/lib/components/shared-components/form-field/doc-uploader/docs-uploader.component.mjs +0 -525
  51. package/esm2022/lib/components/shared-components/form-field/form-label/form-label.component.mjs +0 -33
  52. package/esm2022/lib/components/shared-components/form-field/index.mjs +0 -26
  53. package/esm2022/lib/components/shared-components/form-field/info-item/info-item.component.mjs +0 -76
  54. package/esm2022/lib/components/shared-components/form-field/input/input.component.mjs +0 -71
  55. package/esm2022/lib/components/shared-components/form-field/input-autocomplete/index.mjs +0 -3
  56. package/esm2022/lib/components/shared-components/form-field/input-autocomplete/input-autocomplete.model.mjs +0 -2
  57. package/esm2022/lib/components/shared-components/form-field/input-currency/input-currency.component.mjs +0 -73
  58. package/esm2022/lib/components/shared-components/form-field/input-email/input-email.component.mjs +0 -69
  59. package/esm2022/lib/components/shared-components/form-field/input-mask/input-mask.component.mjs +0 -61
  60. package/esm2022/lib/components/shared-components/form-field/input-number/input-number.component.mjs +0 -74
  61. package/esm2022/lib/components/shared-components/form-field/input-telephone/input-telephone.component.mjs +0 -85
  62. package/esm2022/lib/components/shared-components/form-field/radio/radio.component.mjs +0 -52
  63. package/esm2022/lib/components/shared-components/form-field/repeated-list/repeated-list.component.mjs +0 -32
  64. package/esm2022/lib/components/shared-components/form-field/search-employee/search-employee.component.mjs +0 -192
  65. package/esm2022/lib/components/shared-components/form-field/select/select.component.mjs +0 -191
  66. package/esm2022/lib/components/shared-components/form-field/shared-imports.mjs +0 -36
  67. package/esm2022/lib/components/shared-components/form-field/table-list/table-list.component.mjs +0 -116
  68. package/esm2022/lib/components/shared-components/form-field/textarea/special-chars.directive.mjs +0 -39
  69. package/esm2022/lib/components/shared-components/form-field/textarea/textarea.component.mjs +0 -57
  70. package/esm2022/lib/components/shared-components/form-field/toggle-button/toggle-button.component.mjs +0 -90
  71. package/esm2022/lib/components/shared-components/form-field/validation-errors/validation-errors.component.mjs +0 -43
  72. package/esm2022/lib/components/shared-components/index.mjs +0 -9
  73. package/esm2022/lib/components/shared-components/table/table.component.mjs +0 -243
  74. package/esm2022/lib/components/shared-components/terms-conditions/terms-conditions.component.mjs +0 -31
  75. package/esm2022/lib/components/shared-components/title-section/title-section.component.mjs +0 -31
  76. package/esm2022/lib/constants/constants.mjs +0 -149
  77. package/esm2022/lib/constants/index.mjs +0 -2
  78. package/esm2022/lib/directives/ar.directive.mjs +0 -54
  79. package/esm2022/lib/directives/currency.directive.mjs +0 -92
  80. package/esm2022/lib/directives/en.directive.mjs +0 -51
  81. package/esm2022/lib/directives/number.directive.mjs +0 -68
  82. package/esm2022/lib/directives/skip-location.directive.mjs +0 -28
  83. package/esm2022/lib/enums/actions.enum.mjs +0 -22
  84. package/esm2022/lib/enums/colors.enum.mjs +0 -6
  85. package/esm2022/lib/enums/events.enum.mjs +0 -6
  86. package/esm2022/lib/functions/data-to-blob.mjs +0 -12
  87. package/esm2022/lib/functions/encode-password.mjs +0 -14
  88. package/esm2022/lib/functions/handel-error-response.mjs +0 -12
  89. package/esm2022/lib/functions/index.mjs +0 -5
  90. package/esm2022/lib/functions/is-valid-data.mjs +0 -42
  91. package/esm2022/lib/helpers/shared.helper.mjs +0 -26
  92. package/esm2022/lib/hooks/index.mjs +0 -3
  93. package/esm2022/lib/hooks/load-form.mjs +0 -13
  94. package/esm2022/lib/hooks/save-form.mjs +0 -18
  95. package/esm2022/lib/i18n/ar.mjs +0 -200
  96. package/esm2022/lib/i18n/en.mjs +0 -204
  97. package/esm2022/lib/i18n/index.mjs +0 -3
  98. package/esm2022/lib/interfaces/action.interface.mjs +0 -2
  99. package/esm2022/lib/interfaces/api-response.interface.mjs +0 -2
  100. package/esm2022/lib/interfaces/document-file.interface.mjs +0 -2
  101. package/esm2022/lib/interfaces/form-items.interface.mjs +0 -2
  102. package/esm2022/lib/interfaces/form.interface.mjs +0 -150
  103. package/esm2022/lib/interfaces/igate-user.interface.mjs +0 -2
  104. package/esm2022/lib/interfaces/index.mjs +0 -8
  105. package/esm2022/lib/interfaces/lov-list.interface.mjs +0 -2
  106. package/esm2022/lib/interfaces/lov.interface.mjs +0 -2
  107. package/esm2022/lib/interfaces/shared.interface.mjs +0 -2
  108. package/esm2022/lib/pipes/currency.pipe.mjs +0 -66
  109. package/esm2022/lib/pipes/format-as-password.pipe.mjs +0 -19
  110. package/esm2022/lib/pipes/index.mjs +0 -3
  111. package/esm2022/lib/pipes/status-style.pipe.mjs +0 -57
  112. package/esm2022/lib/pipes/translate.pipe.mjs +0 -36
  113. package/esm2022/lib/regex/index.mjs +0 -2
  114. package/esm2022/lib/regex/regex-patterns.mjs +0 -4
  115. package/esm2022/lib/services/action.service.ts.mjs +0 -25
  116. package/esm2022/lib/services/core.service.ts.mjs +0 -527
  117. package/esm2022/lib/services/feedBack.service.mjs +0 -81
  118. package/esm2022/lib/services/i18n.service.mjs +0 -36
  119. package/esm2022/lib/services/index.mjs +0 -6
  120. package/esm2022/lib/services/sidenav.service.mjs +0 -36
  121. package/esm2022/lib/testComponent/config/segment-dynamic-loader.config.mjs +0 -8
  122. package/esm2022/lib/testComponent/general-approver-section/general-approver-section.component.mjs +0 -90
  123. package/esm2022/lib/testComponent/request-details-section/request-details-section.component.mjs +0 -482
  124. package/esm2022/lib/testComponent/services/i18n.service.mjs +0 -39
  125. package/esm2022/lib/testComponent/services/segment-dynamic-loader.service.mjs +0 -54
  126. package/esm2022/lib/validators/id.validator.mjs +0 -66
  127. package/esm2022/lib/validators/index.mjs +0 -8
  128. package/esm2022/lib/validators/string-to-boolean.pipe.mjs +0 -16
  129. package/esm2022/lib/validators/text.directive.mjs +0 -50
  130. package/esm2022/lib/validators/timer.pipe.mjs +0 -19
  131. package/esm2022/public-api.mjs +0 -19
@@ -1,527 +0,0 @@
1
- import { HttpHeaders } from "@angular/common/http";
2
- import { DestroyRef, inject, Inject, Injectable } from "@angular/core";
3
- import { CommentsDrop, Form, Header, InboxItem, Messages, MY_LIB_CONFIG_TOKEN, ProfileInfoDrop, Section, SectionHeader } from "../../public-api";
4
- import * as constants from '../constants';
5
- import { catchError, from, switchMap, throwError } from "rxjs";
6
- import { map } from "rxjs/operators";
7
- import saveFormHooks from '../hooks/save-form';
8
- import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/common/http";
11
- export class CoreService {
12
- http;
13
- config;
14
- apiUrl = '';
15
- authToken;
16
- refreshToken;
17
- projectConfig;
18
- userData;
19
- localUser;
20
- loggedInUserData;
21
- currentActor;
22
- authorizedEmail;
23
- requesterEmail;
24
- currentSubmitter;
25
- language;
26
- activities = [];
27
- approvals;
28
- historyDataLoaded;
29
- historyData = [];
30
- isMobile;
31
- destroyRef = inject(DestroyRef);
32
- constructor(http, config) {
33
- this.http = http;
34
- this.config = config;
35
- const language = window?.wmConfig?.language ? window.wmConfig.language : 'en';
36
- this.apiUrl = this.config.proxyServiceBaseUrl + language + this.config.proxyFullAddress + this.config.proxyServiceExecute;
37
- console.log('Config: ', this.config);
38
- this.localUser = {
39
- "formPrefix": "CEP",
40
- "formId": "CEP5595432",
41
- "inboxUri": "\/group\/hub\/inbox",
42
- "baseUrl": "\/group\/i-gate\/wm-bpm\/forms\/-\/proxy",
43
- "showPrint": true,
44
- "language": "en",
45
- "isMobile": true,
46
- "outlook": false,
47
- "loggedInUserEmail": "ibrahimmaa.c@stc.com.sa"
48
- };
49
- this.projectConfig = (this.config.production) ? window['wmConfig'] : btoa(JSON.stringify(this.localUser));
50
- this.userData = this.projectConfig;
51
- this.language = window?.wmConfig?.language ? window.wmConfig.language : "en";
52
- this.isMobile = this.projectConfig?.['isMobile'];
53
- }
54
- getLoggedInUserData() {
55
- let loggedInEmail = this.loggedInUserId();
56
- this.employeeProfile(loggedInEmail).pipe(takeUntilDestroyed(this.destroyRef)).subscribe((response) => {
57
- this.loggedInUserData = response?.["Users"]?.[0];
58
- console.log('getLoggedInUserData', response);
59
- });
60
- }
61
- loadForm() {
62
- const authUrl = this.buildAuthUrl();
63
- return this.http.get(authUrl, { observe: 'response' }).pipe(map((res) => {
64
- const tokenInformation = res.body;
65
- this.authToken = tokenInformation.token;
66
- this.getLoggedInUserData();
67
- this.refreshToken = tokenInformation.refreshToken;
68
- const body = this.buildBody();
69
- const options = this.getRequestOptions();
70
- return this.callPost(body, options);
71
- }), switchMap(postObservable => postObservable), catchError((httpError) => {
72
- return throwError(httpError);
73
- }));
74
- }
75
- buildAuthUrl() {
76
- const baseUrl = this.config.proxyServiceBaseUrl;
77
- const language = window?.wmConfig?.language ? window.wmConfig.language : 'en';
78
- const fullAddress = this.config.proxyFullAddress;
79
- const authPart = this.config.proxyServiceAuthorization;
80
- return `${baseUrl}${language}${fullAddress}${authPart}?ts=${(new Date()).valueOf()}`;
81
- }
82
- buildBody() {
83
- const baseBody = {
84
- method: constants.HTTP_METHOD_GET,
85
- destination: constants.TARGET_SERVER_WM,
86
- serviceName: constants.SERVICE_NAME_WM_FORM,
87
- formName: this.config.formName,
88
- formId: "",
89
- // queryParameters: null
90
- };
91
- if (!this.config.formId) {
92
- delete baseBody.formId;
93
- }
94
- else {
95
- baseBody.formId = this.config.formId;
96
- }
97
- return baseBody;
98
- }
99
- employeeProfile(employeeEmail) {
100
- let body = {
101
- method: constants.HTTP_METHOD_GET,
102
- formName: this.config.formName,
103
- destination: constants.TARGET_SERVER_DP,
104
- serviceName: constants.SERVICE_NAME_DP_SEARCH_EMPLOYEE,
105
- parameters: {
106
- q: employeeEmail
107
- }
108
- };
109
- return this.http.post(this.apiUrl, body, {
110
- headers: new HttpHeaders({
111
- authToken: this.authToken,
112
- "Content-Type": "application/x-www-form-urlencoded"
113
- }),
114
- observe: "body"
115
- }).pipe(map((response) => {
116
- return response;
117
- }), catchError((err) => {
118
- return throwError(err);
119
- }));
120
- }
121
- getRequestOptions() {
122
- const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
123
- const ts = (new Date()).valueOf()?.toString();
124
- const userAgent = navigator.userAgent;
125
- return {
126
- headers: new HttpHeaders({
127
- authToken: this.authToken,
128
- 'Content-Type': constants.HEADER_CONTENT_TYPE_FORM,
129
- 'feHeader': '{"isMobile":' + this.isMobile + ', ",aIsMobile":' + isMobile + ',ts:' + ts + ',loggedInUserEmail:' + this.loggedInUserId() + ',formName:' + this.config.formName + ',user-agent:' + userAgent + '}'
130
- }),
131
- observe: 'body'
132
- };
133
- }
134
- getDraftId(val) {
135
- return val.toUpperCase().startsWith('DRAFT');
136
- }
137
- submitForm(...args) {
138
- const [section, action] = args;
139
- const method = this.getHttpMethod();
140
- let sectionId = this.beforeTranspileSectionWrapper(section).id;
141
- let serviceName = this.getServiceName(action);
142
- let formName = this.getFormName(action);
143
- let body = this.getBodyObject(method, serviceName, action, formName, this.populatedPayload(sectionId, section), this.config.formId);
144
- const options = this.getRequestOptions();
145
- return this.submit(body, options);
146
- }
147
- getHttpMethod() {
148
- return (this.config.formId && !this.getDraftId(this.config.formId)) ? constants.HTTP_METHOD_PUT : constants.HTTP_METHOD_POST;
149
- }
150
- beforeTranspileSectionWrapper(section) {
151
- return saveFormHooks.beforeTranspileSection ? saveFormHooks.beforeTranspileSection(section) : section;
152
- }
153
- getServiceName(action) {
154
- if (action === constants.WM_ACTION_SAVE_CHANGES) {
155
- return constants.SERVICE_NAME_WM_DRAFT_FORM;
156
- }
157
- else {
158
- return constants.SERVICE_NAME_WM_FORM;
159
- }
160
- }
161
- getFormName(action) {
162
- if (action === constants.WM_ACTION_SAVE_CHANGES) {
163
- return 'common';
164
- }
165
- else {
166
- return this.config.formName;
167
- }
168
- }
169
- populatedPayload(sectionId, section) {
170
- let payload;
171
- if (sectionId === constants.SECTION_ID_REQUEST_DETAILS) {
172
- payload = { request: { details: section.body.details } };
173
- }
174
- else {
175
- payload = { workflowSteps: {} };
176
- payload.workflowSteps.details = section.body.details;
177
- payload.workflowSteps.actor = this.currentSubmitter.actor;
178
- payload.workflowSteps.actor.email = this.currentActor;
179
- payload.workflowSteps.status = constants.SECTION_STATUS_PENDING;
180
- }
181
- return payload;
182
- }
183
- getBodyObject(method, serviceName, action, formName, payload, formId) {
184
- let body = {
185
- method: method,
186
- destination: constants.TARGET_SERVER_WM,
187
- serviceName: serviceName,
188
- parameters: {
189
- action: action
190
- },
191
- formName: formName,
192
- body: payload,
193
- formId: formId,
194
- queryParameters: {},
195
- // payload
196
- };
197
- if (this.config.formId) {
198
- body.formId = this.config.formId;
199
- }
200
- if (!this.authorizedEmail || !this.authorizedEmail.length || this.authorizedEmail === this.requesterEmail) {
201
- delete body.queryParameters;
202
- }
203
- if (saveFormHooks.beforeSendPayload) {
204
- body.body.payload = saveFormHooks.beforeSendPayload(body.body.payload);
205
- }
206
- return body;
207
- }
208
- callPost(body, options) {
209
- const language = window?.wmConfig?.language ? window.wmConfig.language : "en";
210
- let apiUrl = this.config.proxyServiceBaseUrl + language + this.config.proxyFullAddress + this.config.proxyServiceExecute;
211
- return this.http.post(apiUrl, encodeURIComponent(JSON.stringify(body)), options).pipe(map((responseObject) => this.successWm(responseObject)), catchError((httpError) => throwError(httpError)));
212
- }
213
- submit(body, options) {
214
- const language = window?.wmConfig?.language ? window.wmConfig.language : "en";
215
- const apiUrl = this.config.proxyServiceBaseUrl + language + this.config.proxyFullAddress + this.config.proxyServiceExecute;
216
- return from(this.http.post(apiUrl, encodeURIComponent(JSON.stringify(body)), options).toPromise().then((responseObject) => {
217
- let formResponse = responseObject.data.form;
218
- if (saveFormHooks.afterSendPayload) {
219
- formResponse = saveFormHooks.afterSendPayload(formResponse);
220
- }
221
- let result = {
222
- id: null,
223
- status: null,
224
- nextApprover: {
225
- name: null,
226
- email: null,
227
- role: null
228
- },
229
- creationDate: null
230
- };
231
- result.id = formResponse.formId;
232
- result.status = formResponse['formStatus'];
233
- if (formResponse.currentActor) {
234
- result.nextApprover = {
235
- name: formResponse.currentActor.name,
236
- email: formResponse.currentActor.email,
237
- role: formResponse['formStep']
238
- };
239
- }
240
- result.creationDate = formResponse.creationDate;
241
- return result;
242
- }, (httpError) => {
243
- throw httpError;
244
- }));
245
- }
246
- successWm(...args) {
247
- let [payload] = args;
248
- let wasSendBack = false;
249
- let result = new Form(constants.NO_VALUE, constants.NO_VALUE, constants.NO_VALUE, constants.NO_VALUE, constants.NO_VALUE, constants.NO_VALUE, constants.NO_VALUE);
250
- this.requesterEmail = payload.data['requester'].employeeEmail;
251
- this.authorizedEmail = payload.data['requester'].authorizedEmail;
252
- /* Generate Header Object */
253
- let payloadFormDetails = payload.data.form;
254
- let isReadOnly = (payloadFormDetails.readOnly.toUpperCase() === constants.TRUE_STRING ? constants.TRUE_BOOL : (payloadFormDetails.readOnly.toUpperCase() === constants.FALSE_STRING ? constants.FALSE_BOOL : constants.NO_VALUE));
255
- result.header = new Header(payload.data['requester'].fullName, constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + payload.data['requester'].employeeEmail, (payloadFormDetails.formId ? payloadFormDetails.formId : constants.DONT_SHOW), (payloadFormDetails.creationDate ? payloadFormDetails.creationDate : constants.DONT_SHOW), payloadFormDetails['formStatus'], payloadFormDetails.details);
256
- /* Generate Profile Information Object */
257
- let payloadProfileInfo = payload.data['requester'];
258
- result.profileInfoDrop = new ProfileInfoDrop((payloadProfileInfo['onBehalfAuthorized'] ? JSON.parse(payloadProfileInfo['onBehalfAuthorized']) : null), payloadProfileInfo['employeeId'], payloadProfileInfo.employeeEmail, payloadProfileInfo.fullName, payloadProfileInfo.generalDepartmentName, payloadProfileInfo.jobPosition, payloadProfileInfo['sectorName'], payloadProfileInfo.departmentName, payloadProfileInfo.generalDepartmentCode, payloadProfileInfo['humanResourceLocation'], payloadProfileInfo.nationality, payloadProfileInfo.businessPhone, payloadProfileInfo['directManagerName'], payloadProfileInfo.seniorSectorName);
259
- result.sections = [];
260
- let requestDetailsHasComment = false;
261
- if (payload.data.request.details.comment) {
262
- requestDetailsHasComment = true;
263
- }
264
- result.sections.push(new Section(constants.SECTION_ID_REQUEST_DETAILS, new SectionHeader(constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, requestDetailsHasComment, (payload.data['workflowSteps'] ? constants.READ_ONLY : isReadOnly)), payload.data.request));
265
- if (result.header.formId) {
266
- result.commentsDrop = (!result.commentsDrop ? [] : result.commentsDrop);
267
- this.loadHistory(result.header.formId).pipe(takeUntilDestroyed(this.destroyRef)).subscribe((response) => {
268
- if (response) {
269
- response.items.forEach((item) => {
270
- if (item.sequenceNumber !== '0' && item.processedBy) {
271
- const name = item.processedBy['firstName'] + ' ' + item.processedBy['secondMiddleName'] + ' ' + item.processedBy['familyName'];
272
- result.commentsDrop.push(new CommentsDrop(constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + item.processedBy.email, name, item.comments, item['modifiedDate'], item.attachments, item.processedBy.job));
273
- }
274
- });
275
- }
276
- });
277
- }
278
- const inboxType = this.getInboxType(result);
279
- if (result.header.formId && (!this.isOpenOnInbox())) {
280
- this.getInboxItem(result.header.formId, inboxType).pipe(takeUntilDestroyed(this.destroyRef)).subscribe((response) => {
281
- if (response) {
282
- const item = response.item;
283
- result.inboxItem = new InboxItem(item['flagging'].flagPriority, item['flagging']['isFlagged'], item.feedback['canRequestFeedback'], item.feedback['hasFeedback'], item.feedback['isPending'], item.feedback['isRequested'], item.feedback['isResponded']);
284
- }
285
- });
286
- }
287
- let payloadWorkflowSteps = payload.data.workflowSteps;
288
- if (payloadWorkflowSteps && payloadWorkflowSteps.constructor === Array && payloadWorkflowSteps.length > 0) {
289
- payloadWorkflowSteps.forEach((step, index) => {
290
- let currentIsRequesterSendBack = JSON.stringify(step.details) === JSON.stringify({});
291
- let hasComments = (!currentIsRequesterSendBack && (step.details.comment || step.comment) ? constants.HAS_COMMENTS : constants.NO_COMMENTS);
292
- let currentActor = (step.actor.email === step.actor.recipient.email ? step.actor.recipient : (step.actor.delegate ? step.actor.delegate : null));
293
- if (wasSendBack && step.actor.recipient.role === 'REQUESTER') {
294
- console.log("wasSendBack && REQUESTER");
295
- result.sections = [new Section(constants.SECTION_ID_REQUEST_DETAILS, new SectionHeader(constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, requestDetailsHasComment, (payload.data.workflowSteps ? constants.READ_ONLY : isReadOnly)), payload.data.request)];
296
- }
297
- else if (wasSendBack) {
298
- console.log("Pop");
299
- if (result.sections.length > 1) {
300
- result.sections.pop();
301
- }
302
- wasSendBack = false;
303
- }
304
- if (step.details.decision && step.details.decision.key === constants.FORM_STATUS_SEND_BACK) {
305
- wasSendBack = true;
306
- }
307
- else if (JSON.stringify(step.details) !== JSON.stringify({})) {
308
- let date = step.date;
309
- let currentActorName = currentActor ? this.getShortName(currentActor.name)?.toString() : "";
310
- let shortName = step.actor.recipient?.name ? this.getShortName(step.actor.recipient.name)?.toString() : "";
311
- let delegateName = step.actor.delegate?.name ? this.getShortName(step.actor.delegate.name)?.toString() : "";
312
- let image = constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + step.actor.recipient.email;
313
- let delegateImage = step.actor.delegate?.email ? constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + step.actor.delegate.email : "";
314
- let status = step.actor.status;
315
- result.sections.push(new Section(step.actor.recipient.role.toLowerCase() + constants.SECTION_ID_APPROVAL_PARTIAL_NAME, new SectionHeader(currentActorName, date, shortName, image, delegateName, delegateImage, status, hasComments, (index < payloadWorkflowSteps.length - 1 ? constants.READ_ONLY : isReadOnly)), { details: step.details, processingDate: step.date }));
316
- this.currentSubmitter = { actor: step.actor, recipient: step.recipient, delegate: step.actor.delegate };
317
- }
318
- });
319
- }
320
- /* Create Lov Sections */
321
- result.lovs = (payload?.meta?.lovs ? payload.meta.lovs : null);
322
- if (payload?.meta?.messages) {
323
- result.messages = new Messages({}, [], [], []);
324
- payload.meta.messages.forEach((message) => {
325
- result.messages.originalMsgs.push(message);
326
- result.messages[message.type].push(message.message);
327
- });
328
- }
329
- result.sections[result.sections.length - 1].header.readOnly = isReadOnly;
330
- return result;
331
- }
332
- loadFile(...args) {
333
- const [id] = args;
334
- return this.http.get(`${this.config.proxyFullAddress}${this.config.proxyServiceForms}${this.config.formId}${this.config.proxyServiceAttachment}${id}`, { observe: 'response' });
335
- }
336
- dataURItoBlob(dataURI) {
337
- const byteString = atob(dataURI);
338
- const arrayBuffer = new ArrayBuffer(byteString.length);
339
- const int8Array = new Uint8Array(arrayBuffer);
340
- for (let i = 0; i < byteString.length; i++) {
341
- int8Array[i] = byteString.charCodeAt(i);
342
- }
343
- return new Blob([arrayBuffer], { type: 'image/jpeg' });
344
- }
345
- saveFile(fileInformation) {
346
- const fileBlob = this.dataURItoBlob(fileInformation.fileContents);
347
- const file = new File([fileBlob], fileInformation.fileName, { type: fileInformation.mimeType });
348
- const blobUrl = URL.createObjectURL(file);
349
- const link = document.createElement('a');
350
- link.href = blobUrl;
351
- link.download = fileInformation.fileName;
352
- link.click();
353
- URL.revokeObjectURL(blobUrl);
354
- }
355
- setFlagPriority(id) {
356
- let body = {
357
- method: constants.HTTP_METHOD_PUT,
358
- destination: constants.TARGET_SERVER_DP,
359
- serviceName: constants.SERVICE_NAME_DP_UPDATE_INBOX_ITEM,
360
- formName: this.config.formName,
361
- urlParameters: {
362
- inboxid: this.config.formId
363
- },
364
- body: {
365
- flag: id
366
- }
367
- };
368
- let options = this.getRequestOptions();
369
- return this.generalCallApi(body, constants.STATE_MACHINE_ACTION_SUCCESS_INBOX_ITEM, options);
370
- }
371
- loadHistory(...args) {
372
- const [id] = args;
373
- const body = {
374
- method: constants.HTTP_METHOD_GET,
375
- destination: constants.TARGET_SERVER_WM,
376
- serviceName: constants.WORKFLOW_ITEMS,
377
- formId: id || this.config.formId,
378
- formName: "bpm",
379
- };
380
- let options = this.getRequestOptions();
381
- return this.generalCallApi(body, constants.STATE_MACHINE_ACTION_LOAD_HISTORY, options);
382
- }
383
- getInboxItem(...args) {
384
- const [id, inboxType] = args;
385
- const body = {
386
- formName: this.config.formName,
387
- method: constants.HTTP_METHOD_GET,
388
- destination: constants.TARGET_SERVER_DP,
389
- serviceName: constants.SERVICE_NAME_DP_INBOX_ITEM,
390
- urlParameters: {
391
- inboxid: id,
392
- inboxtype: inboxType
393
- }
394
- };
395
- let options = this.getRequestOptions();
396
- return this.generalCallApi(body, constants.STATE_MACHINE_ACTION_GET_INBOX_ITEM, options);
397
- }
398
- perspectiveApproves(details) {
399
- if (!this.config.production) {
400
- details = {};
401
- }
402
- let serviceName = "form/" + this.config.formName;
403
- if (this.config.formId) {
404
- serviceName = "form/" + this.config.formId;
405
- }
406
- let body = {
407
- method: constants.HTTP_METHOD_POST,
408
- destination: constants.TARGET_SERVER_WM,
409
- serviceName: serviceName,
410
- formName: constants.APPROVERS,
411
- body: {
412
- "request": {
413
- "details": details
414
- }
415
- }
416
- };
417
- let options = this.getRequestOptions();
418
- return this.generalCallApi(body, constants.STATE_MACHINE_ACTION_SUCCESS_RESPONSE, options);
419
- }
420
- getAttachments(data, ...args) {
421
- let body = {
422
- method: constants.HTTP_METHOD_POST,
423
- destination: constants.TARGET_SERVER_WM,
424
- serviceName: 'attachment',
425
- formName: 'common',
426
- body: {
427
- attachment: {
428
- fileName: this.config.production ? data.fileName : '',
429
- mimeType: this.config.production ? data.mimeType : '',
430
- fileContents: this.config.production ? data.fileContents : '',
431
- },
432
- comment: data.attachmentcomment,
433
- description: data.fileDescription,
434
- }
435
- };
436
- let options = this.getRequestOptions();
437
- return this.generalCallApi(body, constants.STATE_MACHINE_ACTION_SUCCESS_RESPONSE, options);
438
- }
439
- searchEmployee(...args) {
440
- let [searchString] = args;
441
- let body = {
442
- method: constants.HTTP_METHOD_GET,
443
- formName: this.config.formName,
444
- destination: constants.TARGET_SERVER_DP,
445
- serviceName: constants.SERVICE_NAME_DP_SEARCH_EMPLOYEE,
446
- parameters: {
447
- q: searchString,
448
- limit: 10
449
- }
450
- };
451
- let options = this.getRequestOptions();
452
- return this.generalCallApi(body, constants.STATE_MACHINE_ACTION_SUCCESS_RESPONSE, options);
453
- }
454
- myRequests(details) {
455
- let body = {
456
- method: constants.HTTP_METHOD_GET,
457
- destination: constants.TARGET_SERVER_WM,
458
- serviceName: "form" //, //this.getServiceName(),
459
- ,
460
- formName: "history",
461
- queryParameters: {
462
- formName: this.config.formName,
463
- year: details.year,
464
- month: details.month,
465
- email: this.loggedInUserId()
466
- }
467
- };
468
- let options = this.getRequestOptions();
469
- return this.generalCallApi(body, constants.STATE_MACHINE_ACTION_SUCCESS_RESPONSE, options);
470
- }
471
- generalCallApi(body, type, options) {
472
- let apiUrl = this.config.proxyServiceBaseUrl + this.language + this.config.proxyFullAddress + this.config.proxyServiceExecute;
473
- return this.http.post(apiUrl, encodeURIComponent(JSON.stringify(body)), options).pipe(map((responseObject) => {
474
- return responseObject;
475
- }), catchError((httpError) => {
476
- return throwError(httpError);
477
- }));
478
- }
479
- loggedInUserId() {
480
- return this.userData['loggedInUserEmail'];
481
- }
482
- getShortName(name) {
483
- if (name) {
484
- let nameTokens = name.split(' ');
485
- if (nameTokens.length == 1) {
486
- return [nameTokens[0]];
487
- }
488
- else if (nameTokens[nameTokens.length - 2].toLowerCase() == 'al') {
489
- return [nameTokens[0], nameTokens[nameTokens.length - 2], nameTokens[nameTokens.length - 1]].join(' ');
490
- }
491
- else {
492
- return [nameTokens[0], nameTokens[nameTokens.length - 1]].join(' ');
493
- }
494
- }
495
- else {
496
- return null;
497
- }
498
- }
499
- isMobileApp() {
500
- return window.wmConfig.isMobile;
501
- }
502
- getInboxType(result) {
503
- let rtn = null;
504
- if (this.loggedInUserId() === result.profileInfoDrop.employeeEmail) {
505
- rtn = constants.INBOX_STATUS_SENT;
506
- }
507
- else {
508
- rtn = constants.INBOX_STATUS_PENDING;
509
- }
510
- return rtn;
511
- }
512
- isOpenOnInbox() {
513
- return window.wmConfig.outlook;
514
- }
515
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CoreService, deps: [{ token: i1.HttpClient }, { token: MY_LIB_CONFIG_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable });
516
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CoreService, providedIn: "root" });
517
- }
518
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CoreService, decorators: [{
519
- type: Injectable,
520
- args: [{
521
- providedIn: "root"
522
- }]
523
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
524
- type: Inject,
525
- args: [MY_LIB_CONFIG_TOKEN]
526
- }] }] });
527
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5zZXJ2aWNlLnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYnBtLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9jb3JlLnNlcnZpY2UudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFhLFdBQVcsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFckUsT0FBTyxFQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMvSSxPQUFPLEtBQUssU0FBUyxNQUFNLGNBQWMsQ0FBQTtBQUN6QyxPQUFPLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBa0IsU0FBUyxFQUFFLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3RSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkMsT0FBTyxhQUFhLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7OztBQUs5RCxNQUFNLE9BQU8sV0FBVztJQXFCTztJQUM2QjtJQXJCMUQsTUFBTSxHQUFXLEVBQUUsQ0FBQTtJQUNYLFNBQVMsQ0FBUztJQUNsQixZQUFZLENBQVM7SUFDWixhQUFhLENBQVM7SUFDaEMsUUFBUSxDQUFTO0lBQ1AsU0FBUyxDQUFLO0lBQ3hCLGdCQUFnQixDQUFLO0lBQzVCLFlBQVksQ0FBUTtJQUNaLGVBQWUsQ0FBVTtJQUN6QixjQUFjLENBQVU7SUFDeEIsZ0JBQWdCLENBQU07SUFDOUIsUUFBUSxDQUFRO0lBQ2hCLFVBQVUsR0FBRyxFQUFFLENBQUE7SUFDZixT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MUMsQ0FBQzt1R0FocEJVLFdBQVcsNENBc0JGLG1CQUFtQjsyR0F0QjVCLFdBQVcsY0FGVixNQUFNOzsyRkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBdUJjLE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwSGVhZGVyc30gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7RGVzdHJveVJlZiwgaW5qZWN0LCBJbmplY3QsIEluamVjdGFibGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB0eXBlIHtNeUxpYkNvbmZpZ30gZnJvbSBcIi4uL2ludGVyZmFjZXMvc2hhcmVkLmludGVyZmFjZVwiO1xyXG5pbXBvcnQge0NvbW1lbnRzRHJvcCwgRm9ybSwgSGVhZGVyLCBJbmJveEl0ZW0sIE1lc3NhZ2VzLCBNWV9MSUJfQ09ORklHX1RPS0VOLCBQcm9maWxlSW5mb0Ryb3AsIFNlY3Rpb24sIFNlY3Rpb25IZWFkZXJ9IGZyb20gXCIuLi8uLi9wdWJsaWMtYXBpXCI7XHJcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICcuLi9jb25zdGFudHMnXHJcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZnJvbSwgT2JzZXJ2YWJsZSwgb2YsIHN3aXRjaE1hcCwgdGhyb3dFcnJvcn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHttYXB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgc2F2ZUZvcm1Ib29rcyBmcm9tICcuLi9ob29rcy9zYXZlLWZvcm0nO1xyXG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogXCJyb290XCJcclxufSlcclxuZXhwb3J0IGNsYXNzIENvcmVTZXJ2aWNlIHtcclxuICBhcGlVcmw6IHN0cmluZyA9ICcnXHJcbiAgcHJpdmF0ZSBhdXRoVG9rZW46IHN0cmluZztcclxuICBwcml2YXRlIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdENvbmZpZzogc3RyaW5nO1xyXG4gIHB1YmxpYyB1c2VyRGF0YTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxVc2VyOiB7fTtcclxuICBwdWJsaWMgbG9nZ2VkSW5Vc2VyRGF0YToge307XHJcbiAgY3VycmVudEFjdG9yOiBzdHJpbmdcclxuICBwcml2YXRlIGF1dGhvcml6ZWRFbWFpbCE6IHN0cmluZztcclxuICBwcml2YXRlIHJlcXVlc3RlckVtYWlsITogc3RyaW5nO1xyXG4gIHByaXZhdGUgY3VycmVudFN1Ym1pdHRlcjogYW55O1xyXG4gIGxhbmd1YWdlOiBzdHJpbmdcclxuICBhY3Rpdml0aWVzID0gW11cclxuICBhcHByb3ZhbHM6IGFueVxyXG4gIGhpc3RvcnlEYXRhTG9hZGVkOiBib29sZWFuXHJcbiAgaGlzdG9yeURhdGE6IGFueVtdID0gW11cclxuICBwcml2YXRlIHJlYWRvbmx5IGlzTW9iaWxlOiBib29sZWFuO1xyXG4gIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgICAgICAgQEluamVjdChNWV9MSUJfQ09ORklHX1RPS0VOKSBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTXlMaWJDb25maWcpIHtcclxuICAgIGNvbnN0IGxhbmd1YWdlID0gKHdpbmRvdyBhcyBhbnkpPy53bUNvbmZpZz8ubGFuZ3VhZ2UgPyAod2luZG93IGFzIGFueSkud21Db25maWcubGFuZ3VhZ2UgOiAnZW4nO1xyXG4gICAgdGhpcy5hcGlVcmwgPSB0aGlzLmNvbmZpZy5wcm94eVNlcnZpY2VCYXNlVXJsICsgbGFuZ3VhZ2UgKyB0aGlzLmNvbmZpZy5wcm94eUZ1bGxBZGRyZXNzICsgdGhpcy5jb25maWcucHJveHlTZXJ2aWNlRXhlY3V0ZTtcclxuICAgIGNvbnNvbGUubG9nKCdDb25maWc6ICcsIHRoaXMuY29uZmlnKTtcclxuICAgIHRoaXMubG9jYWxVc2VyID0ge1xyXG4gICAgICBcImZvcm1QcmVmaXhcIjogXCJDRVBcIixcclxuICAgICAgXCJmb3JtSWRcIjogXCJDRVA1NTk1NDMyXCIsXHJcbiAgICAgIFwiaW5ib3hVcmlcIjogXCJcXC9ncm91cFxcL2h1YlxcL2luYm94XCIsXHJcbiAgICAgIFwiYmFzZVVybFwiOiBcIlxcL2dyb3VwXFwvaS1nYXRlXFwvd20tYnBtXFwvZm9ybXNcXC8tXFwvcHJveHlcIixcclxuICAgICAgXCJzaG93UHJpbnRcIjogdHJ1ZSxcclxuICAgICAgXCJsYW5ndWFnZVwiOiBcImVuXCIsXHJcbiAgICAgIFwiaXNNb2JpbGVcIjogdHJ1ZSxcclxuICAgICAgXCJvdXRsb29rXCI6IGZhbHNlLFxyXG4gICAgICBcImxvZ2dlZEluVXNlckVtYWlsXCI6IFwiaWJyYWhpbW1hYS5jQHN0Yy5jb20uc2FcIlxyXG4gICAgfVxyXG4gICAgdGhpcy5wcm9qZWN0Q29uZmlnID0gKHRoaXMuY29uZmlnLnByb2R1Y3Rpb24pID8gKHdpbmRvdyBhcyBhbnkpWyd3bUNvbmZpZyddIDogYnRvYShKU09OLnN0cmluZ2lmeSh0aGlzLmxvY2FsVXNlcikpO1xyXG4gICAgdGhpcy51c2VyRGF0YSA9IHRoaXMucHJvamVjdENvbmZpZztcclxuICAgIHRoaXMubGFuZ3VhZ2UgPSAod2luZG93IGFzIGFueSk/LndtQ29uZmlnPy5sYW5ndWFnZSA/ICh3aW5kb3cgYXMgYW55KS53bUNvbmZpZy5sYW5ndWFnZSA6IFwiZW5cIjtcclxuICAgIHRoaXMuaXNNb2JpbGUgPSB0aGlzLnByb2plY3RDb25maWc/LlsnaXNNb2JpbGUnXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRMb2dnZWRJblVzZXJEYXRhKCkge1xyXG4gICAgbGV0IGxvZ2dlZEluRW1haWwgPSB0aGlzLmxvZ2dlZEluVXNlcklkKClcclxuICAgIHRoaXMuZW1wbG95ZWVQcm9maWxlKGxvZ2dlZEluRW1haWwpLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXHJcbiAgICApLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmxvZ2dlZEluVXNlckRhdGEgPSByZXNwb25zZT8uW1wiVXNlcnNcIl0/LlswXVxyXG4gICAgICBjb25zb2xlLmxvZygnZ2V0TG9nZ2VkSW5Vc2VyRGF0YScsIHJlc3BvbnNlKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkRm9ybSgpIHtcclxuICAgIGNvbnN0IGF1dGhVcmwgPSB0aGlzLmJ1aWxkQXV0aFVybCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYXV0aFVybCwge29ic2VydmU6ICdyZXNwb25zZSd9KS5waXBlKFxyXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdG9rZW5JbmZvcm1hdGlvbiA9IHJlcy5ib2R5O1xyXG4gICAgICAgIHRoaXMuYXV0aFRva2VuID0gdG9rZW5JbmZvcm1hdGlvbi50b2tlbjtcclxuICAgICAgICB0aGlzLmdldExvZ2dlZEluVXNlckRhdGEoKTtcclxuICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IHRva2VuSW5mb3JtYXRpb24ucmVmcmVzaFRva2VuO1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmJ1aWxkQm9keSgpO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldFJlcXVlc3RPcHRpb25zKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbFBvc3QoYm9keSwgb3B0aW9ucyk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAocG9zdE9ic2VydmFibGUgPT4gcG9zdE9ic2VydmFibGUpLFxyXG4gICAgICBjYXRjaEVycm9yKChodHRwRXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGh0dHBFcnJvcik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZEF1dGhVcmwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmNvbmZpZy5wcm94eVNlcnZpY2VCYXNlVXJsO1xyXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSAod2luZG93IGFzIGFueSk/LndtQ29uZmlnPy5sYW5ndWFnZSA/ICh3aW5kb3cgYXMgYW55KS53bUNvbmZpZy5sYW5ndWFnZSA6ICdlbic7XHJcbiAgICBjb25zdCBmdWxsQWRkcmVzcyA9IHRoaXMuY29uZmlnLnByb3h5RnVsbEFkZHJlc3M7XHJcbiAgICBjb25zdCBhdXRoUGFydCA9IHRoaXMuY29uZmlnLnByb3h5U2VydmljZUF1dGhvcml6YXRpb247XHJcbiAgICByZXR1cm4gYCR7YmFzZVVybH0ke2xhbmd1YWdlfSR7ZnVsbEFkZHJlc3N9JHthdXRoUGFydH0/dHM9JHsobmV3IERhdGUoKSkudmFsdWVPZigpfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkQm9keSgpOiBvYmplY3Qge1xyXG4gICAgY29uc3QgYmFzZUJvZHkgPSB7XHJcbiAgICAgIG1ldGhvZDogY29uc3RhbnRzLkhUVFBfTUVUSE9EX0dFVCxcclxuICAgICAgZGVzdGluYXRpb246IGNvbnN0YW50cy5UQVJHRVRfU0VSVkVSX1dNLFxyXG4gICAgICBzZXJ2aWNlTmFtZTogY29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9XTV9GT1JNLFxyXG4gICAgICBmb3JtTmFtZTogdGhpcy5jb25maWcuZm9ybU5hbWUsXHJcbiAgICAgIGZvcm1JZDogXCJcIixcclxuICAgICAgLy8gcXVlcnlQYXJhbWV0ZXJzOiBudWxsXHJcbiAgICB9O1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5mb3JtSWQpIHtcclxuICAgICAgZGVsZXRlIGJhc2VCb2R5LmZvcm1JZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGJhc2VCb2R5LmZvcm1JZCA9IHRoaXMuY29uZmlnLmZvcm1JZDtcclxuICAgIH1cclxuICAgIHJldHVybiBiYXNlQm9keTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlbXBsb3llZVByb2ZpbGUoZW1wbG95ZWVFbWFpbDogYW55KSB7XHJcbiAgICBsZXQgYm9keSA9IHtcclxuICAgICAgbWV0aG9kOiBjb25zdGFudHMuSFRUUF9NRVRIT0RfR0VULFxyXG4gICAgICBmb3JtTmFtZTogdGhpcy5jb25maWcuZm9ybU5hbWUsXHJcbiAgICAgIGRlc3RpbmF0aW9uOiBjb25zdGFudHMuVEFSR0VUX1NFUlZFUl9EUCxcclxuICAgICAgc2VydmljZU5hbWU6IGNvbnN0YW50cy5TRVJWSUNFX05BTUVfRFBfU0VBUkNIX0VNUExPWUVFLFxyXG4gICAgICBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgcTogZW1wbG95ZWVFbWFpbFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuYXBpVXJsLCBib2R5LCB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgYXV0aFRva2VuOiB0aGlzLmF1dGhUb2tlbixcclxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiXHJcbiAgICAgIH0pLFxyXG4gICAgICBvYnNlcnZlOiBcImJvZHlcIlxyXG4gICAgfSkucGlwZShcclxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlXHJcbiAgICAgIH0pXHJcbiAgICAgICwgY2F0Y2hFcnJvcigoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnIpXHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UmVxdWVzdE9wdGlvbnMoKSB7XHJcbiAgICBjb25zdCBpc01vYmlsZSA9IC9pUGhvbmV8aVBhZHxpUG9kfEFuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xyXG4gICAgY29uc3QgdHMgPSAobmV3IERhdGUoKSkudmFsdWVPZigpPy50b1N0cmluZygpO1xyXG4gICAgY29uc3QgdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgYXV0aFRva2VuOiB0aGlzLmF1dGhUb2tlbixcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogY29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEVfRk9STSxcclxuICAgICAgICAnZmVIZWFkZXInOiAne1wiaXNNb2JpbGVcIjonICsgdGhpcy5pc01vYmlsZSArICcsIFwiLGFJc01vYmlsZVwiOicgKyBpc01vYmlsZSArICcsdHM6JyArIHRzICsgJyxsb2dnZWRJblVzZXJFbWFpbDonICsgdGhpcy5sb2dnZWRJblVzZXJJZCgpICsgJyxmb3JtTmFtZTonICsgdGhpcy5jb25maWcuZm9ybU5hbWUgKyAnLHVzZXItYWdlbnQ6JyArIHVzZXJBZ2VudCArICd9J1xyXG4gICAgICB9KSxcclxuICAgICAgb2JzZXJ2ZTogJ2JvZHknXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERyYWZ0SWQodmFsKSB7XHJcbiAgICByZXR1cm4gdmFsLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgnRFJBRlQnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdWJtaXRGb3JtKC4uLmFyZ3MpIHtcclxuICAgIGNvbnN0IFtzZWN0aW9uLCBhY3Rpb25dID0gYXJncztcclxuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0SHR0cE1ldGhvZCgpO1xyXG4gICAgbGV0IHNlY3Rpb25JZCA9IHRoaXMuYmVmb3JlVHJhbnNwaWxlU2VjdGlvbldyYXBwZXIoc2VjdGlvbikuaWQ7XHJcbiAgICBsZXQgc2VydmljZU5hbWUgPSB0aGlzLmdldFNlcnZpY2VOYW1lKGFjdGlvbik7XHJcbiAgICBsZXQgZm9ybU5hbWUgPSB0aGlzLmdldEZvcm1OYW1lKGFjdGlvbik7XHJcbiAgICBsZXQgYm9keSA9IHRoaXMuZ2V0Qm9keU9iamVjdChtZXRob2QsIHNlcnZpY2VOYW1lLCBhY3Rpb24sIGZvcm1OYW1lLCB0aGlzLnBvcHVsYXRlZFBheWxvYWQoc2VjdGlvbklkLCBzZWN0aW9uKSwgdGhpcy5jb25maWcuZm9ybUlkKTtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldFJlcXVlc3RPcHRpb25zKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc3VibWl0KGJvZHksIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRIdHRwTWV0aG9kKCkge1xyXG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZy5mb3JtSWQgJiYgIXRoaXMuZ2V0RHJhZnRJZCh0aGlzLmNvbmZpZy5mb3JtSWQpKSA/IGNvbnN0YW50cy5IVFRQX01FVEhPRF9QVVQgOiBjb25zdGFudHMuSFRUUF9NRVRIT0RfUE9TVDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlVHJhbnNwaWxlU2VjdGlvbldyYXBwZXIoc2VjdGlvbikge1xyXG4gICAgcmV0dXJuIHNhdmVGb3JtSG9va3MuYmVmb3JlVHJhbnNwaWxlU2VjdGlvbiA/IHNhdmVGb3JtSG9va3MuYmVmb3JlVHJhbnNwaWxlU2VjdGlvbihzZWN0aW9uKSA6IHNlY3Rpb247XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlcnZpY2VOYW1lKGFjdGlvbikge1xyXG4gICAgaWYgKGFjdGlvbiA9PT0gY29uc3RhbnRzLldNX0FDVElPTl9TQVZFX0NIQU5HRVMpIHtcclxuICAgICAgcmV0dXJuIGNvbnN0YW50cy5TRVJWSUNFX05BTUVfV01fRFJBRlRfRk9STVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGNvbnN0YW50cy5TRVJWSUNFX05BTUVfV01fRk9STVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGb3JtTmFtZShhY3Rpb24pIHtcclxuICAgIGlmIChhY3Rpb24gPT09IGNvbnN0YW50cy5XTV9BQ1RJT05fU0FWRV9DSEFOR0VTKSB7XHJcbiAgICAgIHJldHVybiAnY29tbW9uJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5mb3JtTmFtZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcG9wdWxhdGVkUGF5bG9hZChzZWN0aW9uSWQsIHNlY3Rpb24pIHtcclxuICAgIGxldCBwYXlsb2FkO1xyXG4gICAgaWYgKHNlY3Rpb25JZCA9PT0gY29uc3RhbnRzLlNFQ1RJT05fSURfUkVRVUVTVF9ERVRBSUxTKSB7XHJcbiAgICAgIHBheWxvYWQgPSB7cmVxdWVzdDoge2RldGFpbHM6IHNlY3Rpb24uYm9keS5kZXRhaWxzfX07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwYXlsb2FkID0ge3dvcmtmbG93U3RlcHM6IHt9fTtcclxuICAgICAgcGF5bG9hZC53b3JrZmxvd1N0ZXBzLmRldGFpbHMgPSBzZWN0aW9uLmJvZHkuZGV0YWlscztcclxuICAgICAgcGF5bG9hZC53b3JrZmxvd1N0ZXBzLmFjdG9yID0gdGhpcy5jdXJyZW50U3VibWl0dGVyLmFjdG9yO1xyXG4gICAgICBwYXlsb2FkLndvcmtmbG93U3RlcHMuYWN0b3IuZW1haWwgPSB0aGlzLmN1cnJlbnRBY3RvcjtcclxuICAgICAgcGF5bG9hZC53b3JrZmxvd1N0ZXBzLnN0YXR1cyA9IGNvbnN0YW50cy5TRUNUSU9OX1NUQVRVU19QRU5ESU5HO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBheWxvYWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEJvZHlPYmplY3QobWV0aG9kLCBzZXJ2aWNlTmFtZSwgYWN0aW9uLCBmb3JtTmFtZSwgcGF5bG9hZCwgZm9ybUlkKSB7XHJcbiAgICBsZXQgYm9keSA9IHtcclxuICAgICAgbWV0aG9kOiBtZXRob2QsXHJcbiAgICAgIGRlc3RpbmF0aW9uOiBjb25zdGFudHMuVEFSR0VUX1NFUlZFUl9XTSxcclxuICAgICAgc2VydmljZU5hbWU6IHNlcnZpY2VOYW1lLFxyXG4gICAgICBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgYWN0aW9uOiBhY3Rpb25cclxuICAgICAgfSxcclxuICAgICAgZm9ybU5hbWU6IGZvcm1OYW1lLFxyXG4gICAgICBib2R5OiBwYXlsb2FkLFxyXG4gICAgICBmb3JtSWQ6IGZvcm1JZCxcclxuICAgICAgcXVlcnlQYXJhbWV0ZXJzOiB7fSxcclxuICAgICAgLy8gcGF5bG9hZFxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5mb3JtSWQpIHtcclxuICAgICAgYm9keS5mb3JtSWQgPSB0aGlzLmNvbmZpZy5mb3JtSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmF1dGhvcml6ZWRFbWFpbCB8fCAhdGhpcy5hdXRob3JpemVkRW1haWwubGVuZ3RoIHx8IHRoaXMuYXV0aG9yaXplZEVtYWlsID09PSB0aGlzLnJlcXVlc3RlckVtYWlsKSB7XHJcbiAgICAgIGRlbGV0ZSBib2R5LnF1ZXJ5UGFyYW1ldGVycztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2F2ZUZvcm1Ib29rcy5iZWZvcmVTZW5kUGF5bG9hZCkge1xyXG4gICAgICBib2R5LmJvZHkucGF5bG9hZCA9IHNhdmVGb3JtSG9va3MuYmVmb3JlU2VuZFBheWxvYWQoYm9keS5ib2R5LnBheWxvYWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBib2R5O1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgY2FsbFBvc3QoYm9keSwgb3B0aW9ucyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBsYW5ndWFnZSA9ICh3aW5kb3cgYXMgYW55KT8ud21Db25maWc/Lmxhbmd1YWdlID8gKHdpbmRvdyBhcyBhbnkpLndtQ29uZmlnLmxhbmd1YWdlIDogXCJlblwiO1xyXG4gICAgbGV0IGFwaVVybCA9IHRoaXMuY29uZmlnLnByb3h5U2VydmljZUJhc2VVcmwgKyBsYW5ndWFnZSArIHRoaXMuY29uZmlnLnByb3h5RnVsbEFkZHJlc3MgKyB0aGlzLmNvbmZpZy5wcm94eVNlcnZpY2VFeGVjdXRlO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGlVcmwsIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShib2R5KSksIG9wdGlvbnMpLnBpcGUoXHJcbiAgICAgIG1hcCgocmVzcG9uc2VPYmplY3Q6IGFueSkgPT4gdGhpcy5zdWNjZXNzV20ocmVzcG9uc2VPYmplY3QpKSxcclxuICAgICAgY2F0Y2hFcnJvcigoaHR0cEVycm9yOiBhbnkpID0+IHRocm93RXJyb3IoaHR0cEVycm9yKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1Ym1pdChib2R5OiBhbnksIG9wdGlvbnM6IGFueSkge1xyXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSAod2luZG93IGFzIGFueSk/LndtQ29uZmlnPy5sYW5ndWFnZSA/ICh3aW5kb3cgYXMgYW55KS53bUNvbmZpZy5sYW5ndWFnZSA6IFwiZW5cIjtcclxuICAgIGNvbnN0IGFwaVVybCA9IHRoaXMuY29uZmlnLnByb3h5U2VydmljZUJhc2VVcmwgKyBsYW5ndWFnZSArIHRoaXMuY29uZmlnLnByb3h5RnVsbEFkZHJlc3MgKyB0aGlzLmNvbmZpZy5wcm94eVNlcnZpY2VFeGVjdXRlO1xyXG5cclxuICAgIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLmh0dHAucG9zdChhcGlVcmwsIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShib2R5KSksIG9wdGlvbnMpLnRvUHJvbWlzZSgpLnRoZW4oXHJcbiAgICAgICAgKHJlc3BvbnNlT2JqZWN0OiBhbnkpID0+IHtcclxuICAgICAgICAgIGxldCBmb3JtUmVzcG9uc2UgPSByZXNwb25zZU9iamVjdC5kYXRhLmZvcm07XHJcbiAgICAgICAgICBpZiAoc2F2ZUZvcm1Ib29rcy5hZnRlclNlbmRQYXlsb2FkKSB7XHJcbiAgICAgICAgICAgIGZvcm1SZXNwb25zZSA9IHNhdmVGb3JtSG9va3MuYWZ0ZXJTZW5kUGF5bG9hZChmb3JtUmVzcG9uc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgaWQ6IG51bGwsXHJcbiAgICAgICAgICAgIHN0YXR1czogbnVsbCxcclxuICAgICAgICAgICAgbmV4dEFwcHJvdmVyOiB7XHJcbiAgICAgICAgICAgICAgbmFtZTogbnVsbCxcclxuICAgICAgICAgICAgICBlbWFpbDogbnVsbCxcclxuICAgICAgICAgICAgICByb2xlOiBudWxsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNyZWF0aW9uRGF0ZTogbnVsbFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHJlc3VsdC5pZCA9IGZvcm1SZXNwb25zZS5mb3JtSWQ7XHJcbiAgICAgICAgICByZXN1bHQuc3RhdHVzID0gZm9ybVJlc3BvbnNlWydmb3JtU3RhdHVzJ107XHJcbiAgICAgICAgICBpZiAoZm9ybVJlc3BvbnNlLmN1cnJlbnRBY3Rvcikge1xyXG4gICAgICAgICAgICByZXN1bHQubmV4dEFwcHJvdmVyID0ge1xyXG4gICAgICAgICAgICAgIG5hbWU6IGZvcm1SZXNwb25zZS5jdXJyZW50QWN0b3IubmFtZSxcclxuICAgICAgICAgICAgICBlbWFpbDogZm9ybVJlc3BvbnNlLmN1cnJlbnRBY3Rvci5lbWFpbCxcclxuICAgICAgICAgICAgICByb2xlOiBmb3JtUmVzcG9uc2VbJ2Zvcm1TdGVwJ11cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVzdWx0LmNyZWF0aW9uRGF0ZSA9IGZvcm1SZXNwb25zZS5jcmVhdGlvbkRhdGU7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0sIChodHRwRXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgaHR0cEVycm9yO1xyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3VjY2Vzc1dtKC4uLmFyZ3MpIHtcclxuICAgIGxldCBbcGF5bG9hZF0gPSBhcmdzO1xyXG4gICAgbGV0IHdhc1NlbmRCYWNrID0gZmFsc2U7XHJcbiAgICBsZXQgcmVzdWx0ID0gbmV3IEZvcm0oXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRVxyXG4gICAgKTtcclxuICAgIHRoaXMucmVxdWVzdGVyRW1haWwgPSBwYXlsb2FkLmRhdGFbJ3JlcXVlc3RlciddLmVtcGxveWVlRW1haWw7XHJcbiAgICB0aGlzLmF1dGhvcml6ZWRFbWFpbCA9IHBheWxvYWQuZGF0YVsncmVxdWVzdGVyJ10uYXV0aG9yaXplZEVtYWlsO1xyXG4gICAgLyogR2VuZXJhdGUgSGVhZGVyIE9iamVjdCAqL1xyXG4gICAgbGV0IHBheWxvYWRGb3JtRGV0YWlscyA9IHBheWxvYWQuZGF0YS5mb3JtO1xyXG4gICAgbGV0IGlzUmVhZE9ubHkgPSAocGF5bG9hZEZvcm1EZXRhaWxzLnJlYWRPbmx5LnRvVXBwZXJDYXNlKCkgPT09IGNvbnN0YW50cy5UUlVFX1NUUklORyA/IGNvbnN0YW50cy5UUlVFX0JPT0wgOiAocGF5bG9hZEZvcm1EZXRhaWxzLnJlYWRPbmx5LnRvVXBwZXJDYXNlKCkgPT09IGNvbnN0YW50cy5GQUxTRV9TVFJJTkcgPyBjb25zdGFudHMuRkFMU0VfQk9PTCA6IGNvbnN0YW50cy5OT19WQUxVRSkpXHJcbiAgICByZXN1bHQuaGVhZGVyID0gbmV3IEhlYWRlcihcclxuICAgICAgcGF5bG9hZC5kYXRhWydyZXF1ZXN0ZXInXS5mdWxsTmFtZSxcclxuICAgICAgY29uc3RhbnRzLklHQVRFX1NUQVRJQ19BU1NFVF9QUk9GSUxFX1BIT1RPX1VSTCArIHBheWxvYWQuZGF0YVsncmVxdWVzdGVyJ10uZW1wbG95ZWVFbWFpbCxcclxuICAgICAgKHBheWxvYWRGb3JtRGV0YWlscy5mb3JtSWQgPyBwYXlsb2FkRm9ybURldGFpbHMuZm9ybUlkIDogY29uc3RhbnRzLkRPTlRfU0hPVyksXHJcbiAgICAgIChwYXlsb2FkRm9ybURldGFpbHMuY3JlYXRpb25EYXRlID8gcGF5bG9hZEZvcm1EZXRhaWxzLmNyZWF0aW9uRGF0ZSA6IGNvbnN0YW50cy5ET05UX1NIT1cpLFxyXG4gICAgICBwYXlsb2FkRm9ybURldGFpbHNbJ2Zvcm1TdGF0dXMnXSxcclxuICAgICAgcGF5bG9hZEZvcm1EZXRhaWxzLmRldGFpbHNcclxuICAgICk7XHJcbiAgICAvKiBHZW5lcmF0ZSBQcm9maWxlIEluZm9ybWF0aW9uIE9iamVjdCAqL1xyXG4gICAgbGV0IHBheWxvYWRQcm9maWxlSW5mbyA9IHBheWxvYWQuZGF0YVsncmVxdWVzdGVyJ107XHJcbiAgICByZXN1bHQucHJvZmlsZUluZm9Ecm9wID0gbmV3IFByb2ZpbGVJbmZvRHJvcChcclxuICAgICAgKHBheWxvYWRQcm9maWxlSW5mb1snb25CZWhhbGZBdXRob3JpemVkJ10gPyBKU09OLnBhcnNlKHBheWxvYWRQcm9maWxlSW5mb1snb25CZWhhbGZBdXRob3JpemVkJ10pIDogbnVsbCksXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mb1snZW1wbG95ZWVJZCddLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZW1wbG95ZWVFbWFpbCxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmZ1bGxOYW1lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZ2VuZXJhbERlcGFydG1lbnROYW1lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uam9iUG9zaXRpb24sXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mb1snc2VjdG9yTmFtZSddLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZGVwYXJ0bWVudE5hbWUsXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5nZW5lcmFsRGVwYXJ0bWVudENvZGUsXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mb1snaHVtYW5SZXNvdXJjZUxvY2F0aW9uJ10sXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5uYXRpb25hbGl0eSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmJ1c2luZXNzUGhvbmUsXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mb1snZGlyZWN0TWFuYWdlck5hbWUnXSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLnNlbmlvclNlY3Rvck5hbWVcclxuICAgICk7XHJcbiAgICByZXN1bHQuc2VjdGlvbnMgPSBbXTtcclxuICAgIGxldCByZXF1ZXN0RGV0YWlsc0hhc0NvbW1lbnQgPSBmYWxzZTtcclxuICAgIGlmIChwYXlsb2FkLmRhdGEucmVxdWVzdC5kZXRhaWxzLmNvbW1lbnQpIHtcclxuICAgICAgcmVxdWVzdERldGFpbHNIYXNDb21tZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJlc3VsdC5zZWN0aW9ucy5wdXNoKFxyXG4gICAgICBuZXcgU2VjdGlvbihcclxuICAgICAgICBjb25zdGFudHMuU0VDVElPTl9JRF9SRVFVRVNUX0RFVEFJTFMsXHJcbiAgICAgICAgbmV3IFNlY3Rpb25IZWFkZXIoY29uc3RhbnRzLkRPTlRfU0hPVywgY29uc3RhbnRzLkRPTlRfU0hPVywgY29uc3RhbnRzLkRPTlRfU0hPVywgY29uc3RhbnRzLkRPTlRfU0hPVywgY29uc3RhbnRzLkRPTlRfU0hPVywgY29uc3RhbnRzLkRPTlRfU0hPVywgY29uc3RhbnRzLkRPTlRfU0hPVywgcmVxdWVzdERldGFpbHNIYXNDb21tZW50LCAocGF5bG9hZC5kYXRhWyd3b3JrZmxvd1N0ZXBzJ10gPyBjb25zdGFudHMuUkVBRF9PTkxZIDogaXNSZWFkT25seSkpLFxyXG4gICAgICAgIHBheWxvYWQuZGF0YS5yZXF1ZXN0XHJcbiAgICAgIClcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHJlc3VsdC5oZWFkZXIuZm9ybUlkKSB7XHJcbiAgICAgIHJlc3VsdC5jb21tZW50c0Ryb3AgPSAoIXJlc3VsdC5jb21tZW50c0Ryb3AgPyBbXSA6IHJlc3VsdC5jb21tZW50c0Ryb3ApO1xyXG4gICAgICAgIHRoaXMubG9hZEhpc3RvcnkocmVzdWx0LmhlYWRlci5mb3JtSWQpLnBpcGUoXHJcbiAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxyXG4gICAgICAgICkuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgcmVzcG9uc2UuaXRlbXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5zZXF1ZW5jZU51bWJlciAhPT0gJzAnICYmIGl0ZW0ucHJvY2Vzc2VkQnkpIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGl0ZW0ucHJvY2Vzc2VkQnlbJ2ZpcnN0TmFtZSddICsgJyAnICsgaXRlbS5wcm9jZXNzZWRCeVsnc2Vjb25kTWlkZGxlTmFtZSddICsgJyAnICsgaXRlbS5wcm9jZXNzZWRCeVsnZmFtaWx5TmFtZSddO1xyXG4gICAgICAgICAgICAgICAgICByZXN1bHQuY29tbWVudHNEcm9wLnB1c2gobmV3IENvbW1lbnRzRHJvcChcclxuICAgICAgICAgICAgICAgICAgICBjb25zdGFudHMuSUdBVEVfU1RBVElDX0FTU0VUX1BST0ZJTEVfUEhPVE9fVVJMICsgaXRlbS5wcm9jZXNzZWRCeS5lbWFpbCxcclxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uY29tbWVudHMsXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbVsnbW9kaWZpZWREYXRlJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5hdHRhY2htZW50cyxcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnByb2Nlc3NlZEJ5LmpvYlxyXG4gICAgICAgICAgICAgICAgICApKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBjb25zdCBpbmJveFR5cGUgPSB0aGlzLmdldEluYm94VHlwZShyZXN1bHQpO1xyXG4gICAgaWYgKHJlc3VsdC5oZWFkZXIuZm9ybUlkICYmICghdGhpcy5pc09wZW5PbkluYm94KCkpKSB7XHJcbiAgICAgIHRoaXMuZ2V0SW5ib3hJdGVtKHJlc3VsdC5oZWFkZXIuZm9ybUlkLCBpbmJveFR5cGUpLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcclxuICAgICAgKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gcmVzcG9uc2UuaXRlbTtcclxuICAgICAgICAgICAgcmVzdWx0LmluYm94SXRlbSA9IG5ldyBJbmJveEl0ZW0oXHJcbiAgICAgICAgICAgICAgaXRlbVsnZmxhZ2dpbmcnXS5mbGFnUHJpb3JpdHksXHJcbiAgICAgICAgICAgICAgaXRlbVsnZmxhZ2dpbmcnXVsnaXNGbGFnZ2VkJ10sXHJcbiAgICAgICAgICAgICAgaXRlbS5mZWVkYmFja1snY2FuUmVxdWVzdEZlZWRiYWNrJ10sXHJcbiAgICAgICAgICAgICAgaXRlbS5mZWVkYmFja1snaGFzRmVlZGJhY2snXSxcclxuICAgICAgICAgICAgICBpdGVtLmZlZWRiYWNrWydpc1BlbmRpbmcnXSxcclxuICAgICAgICAgICAgICBpdGVtLmZlZWRiYWNrWydpc1JlcXVlc3RlZCddLFxyXG4gICAgICAgICAgICAgIGl0ZW0uZmVlZGJhY2tbJ2lzUmVzcG9uZGVkJ11cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwYXlsb2FkV29ya2Zsb3dTdGVwcyA9IHBheWxvYWQuZGF0YS53b3JrZmxvd1N0ZXBzO1xyXG4gICAgaWYgKHBheWxvYWRXb3JrZmxvd1N0ZXBzICYmIHBheWxvYWRXb3JrZmxvd1N0ZXBzLmNvbnN0cnVjdG9yID09PSBBcnJheSAmJiBwYXlsb2FkV29ya2Zsb3dTdGVwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHBheWxvYWRXb3JrZmxvd1N0ZXBzLmZvckVhY2goKHN0ZXAsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRJc1JlcXVlc3RlclNlbmRCYWNrID0gSlNPTi5zdHJpbmdpZnkoc3RlcC5kZXRhaWxzKSA9PT0gSlNPTi5zdHJpbmdpZnkoe30pO1xyXG4gICAgICAgIGxldCBoYXNDb21tZW50cyA9ICghY3VycmVudElzUmVxdWVzdGVyU2VuZEJhY2sgJiYgKHN0ZXAuZGV0YWlscy5jb21tZW50IHx8IHN0ZXAuY29tbWVudCkgPyBjb25zdGFudHMuSEFTX0NPTU1FTlRTIDogY29uc3RhbnRzLk5PX0NPTU1FTlRTKTtcclxuICAgICAgICBsZXQgY3VycmVudEFjdG9yID0gKHN0ZXAuYWN0b3IuZW1haWwgPT09IHN0ZXAuYWN0b3IucmVjaXBpZW50LmVtYWlsID8gc3RlcC5hY3Rvci5yZWNpcGllbnQgOiAoc3RlcC5hY3Rvci5kZWxlZ2F0ZSA/IHN0ZXAuYWN0b3IuZGVsZWdhdGUgOiBudWxsKSlcclxuICAgICAgICBpZiAod2FzU2VuZEJhY2sgJiYgc3RlcC5hY3Rvci5yZWNpcGllbnQucm9sZSA9PT0gJ1JFUVVFU1RFUicpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwid2FzU2VuZEJhY2sgJiYgUkVRVUVTVEVSXCIpXHJcbiAgICAgICAgICByZXN1bHQuc2VjdGlvbnMgPSBbbmV3IFNlY3Rpb24oXHJcbiAgICAgICAgICAgIGNvbnN0YW50cy5TRUNUSU9OX0lEX1JFUVVFU1RfREVUQUlMUyxcclxuICAgICAgICAgICAgbmV3IFNlY3Rpb25IZWFkZXIoXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICByZXF1ZXN0RGV0YWlsc0hhc0NvbW1lbnQsXHJcbiAgICAgICAgICAgICAgKHBheWxvYWQuZGF0YS53b3JrZmxvd1N0ZXBzID8gY29uc3RhbnRzLlJFQURfT05MWSA6IGlzUmVhZE9ubHkpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHBheWxvYWQuZGF0YS5yZXF1ZXN0XHJcbiAgICAgICAgICApXVxyXG4gICAgICAgIH0gZWxzZSBpZiAod2FzU2VuZEJhY2spIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiUG9wXCIpXHJcbiAgICAgICAgICBpZiAocmVzdWx0LnNlY3Rpb25zLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgcmVzdWx0LnNlY3Rpb25zLnBvcCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgd2FzU2VuZEJhY2sgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZiAoc3RlcC5kZXRhaWxzLmRlY2lzaW9uICYmIHN0ZXAuZGV0YWlscy5kZWNpc2lvbi5rZXkgPT09IGNvbnN0YW50cy5GT1JNX1NUQVRVU19TRU5EX0JBQ0spIHtcclxuICAgICAgICAgIHdhc1NlbmRCYWNrID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKEpTT04uc3RyaW5naWZ5KHN0ZXAuZGV0YWlscykgIT09IEpTT04uc3RyaW5naWZ5KHt9KSkge1xyXG5cclxuICAgICAgICAgIGxldCBkYXRlID0gICBzdGVwLmRhdGVcclxuICAgICAgICAgIGxldCBjdXJyZW50QWN0b3JOYW1lID0gY3VycmVudEFjdG9yID8gdGhpcy5nZXRTaG9ydE5hbWUoY3VycmVudEFjdG9yLm5hbWUpPy50b1N0cmluZygpIDogXCJcIlxyXG4gICAgICAgICAgbGV0IHNob3J0TmFtZSA9IHN0ZXAuYWN0b3IucmVjaXBpZW50Py5uYW1lID8gdGhpcy5nZXRTaG9ydE5hbWUoc3RlcC5hY3Rvci5yZWNpcGllbnQubmFtZSk/LnRvU3RyaW5nKCkgOiBcIlwiXHJcbiAgICAgICAgICBsZXQgZGVsZWdhdGVOYW1lPSBzdGVwLmFjdG9yLmRlbGVnYXRlPy5uYW1lID8gdGhpcy5nZXRTaG9ydE5hbWUoc3RlcC5hY3Rvci5kZWxlZ2F0ZS5uYW1lKT8udG9TdHJpbmcoKSA6IFwiXCJcclxuICAgICAgICAgIGxldCBpbWFnZSA9IGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBzdGVwLmFjdG9yLnJlY2lwaWVudC5lbWFpbFxyXG4gICAgICAgICAgbGV0IGRlbGVnYXRlSW1hZ2UgPSBzdGVwLmFjdG9yLmRlbGVnYXRlPy5lbWFpbCA/IGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBzdGVwLmFjdG9yLmRlbGVnYXRlLmVtYWlsIDogXCJcIlxyXG4gICAgICAgICAgbGV0IHN0YXR1cyA9IHN0ZXAuYWN0b3Iuc3RhdHVzXHJcbiAgICAgICAgICByZXN1bHQuc2VjdGlvbnMucHVzaChcclxuICAgICAgICAgICAgbmV3IFNlY3Rpb24oXHJcbiAgICAgICAgICAgICAgc3RlcC5hY3Rvci5yZWNpcGllbnQucm9sZS50b0xvd2VyQ2FzZSgpICsgY29uc3RhbnRzLlNFQ1RJT05fSURfQVBQUk9WQUxfUEFSVElBTF9OQU1FLFxyXG4gICAgICAgICAgICAgIG5ldyBTZWN0aW9uSGVhZGVyKFxyXG4gICAgICAgICAgICAgICAgY3VycmVudEFjdG9yTmFtZSxcclxuICAgICAgICAgICAgICAgIGRhdGUsXHJcbiAgICAgICAgICAgICAgICBzaG9ydE5hbWUsXHJcbiAgICAgICAgICAgICAgICBpbWFnZSxcclxuICAgICAgICAgICAgICAgIGRlbGVnYXRlTmFtZSxcclxuICAgICAgICAgICAgICAgIGRlbGVnYXRlSW1hZ2UsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXMsXHJcbiAgICAgICAgICAgICAgICBoYXNDb21tZW50cyxcclxuICAgICAgICAgICAgICAgIChpbmRleCA8IHBheWxvYWRXb3JrZmxvd1N0ZXBzLmxlbmd0aCAtIDEgPyBjb25zdGFudHMuUkVBRF9PTkxZIDogaXNSZWFkT25seSlcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIHtkZXRhaWxzOiBzdGVwLmRldGFpbHMsIHByb2Nlc3NpbmdEYXRlOiBzdGVwLmRhdGV9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTdWJtaXR0ZXIgPSB7YWN0b3I6IHN0ZXAuYWN0b3IsIHJlY2lwaWVudDogc3RlcC5yZWNpcGllbnQsIGRlbGVnYXRlOiBzdGVwLmFjdG9yLmRlbGVnYXRlfTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyogQ3JlYXRlIExvdiBTZWN0aW9ucyAqL1xyXG4gICAgcmVzdWx0LmxvdnMgPSAocGF5bG9hZD8ubWV0YT8ubG92cyA/IHBheWxvYWQubWV0YS5sb3ZzIDogbnVsbCk7XHJcblxyXG4gICAgaWYgKHBheWxvYWQ/Lm1ldGE/Lm1lc3NhZ2VzKSB7XHJcbiAgICAgIHJlc3VsdC5tZXNzYWdlcyA9IG5ldyBNZXNzYWdlcyhcclxuICAgICAgICB7fSxcclxuICAgICAgICBbXSxcclxuICAgICAgICBbXSxcclxuICAgICAgICBbXVxyXG4gICAgICApO1xyXG4gICAgICBwYXlsb2FkLm1ldGEubWVzc2FnZXMuZm9yRWFjaCgobWVzc2FnZSkgPT4ge1xyXG4gICAgICAgIHJlc3VsdC5tZXNzYWdlcy5vcmlnaW5hbE1zZ3MucHVzaChtZXNzYWdlKTtcclxuICAgICAgICByZXN1bHQubWVzc2FnZXNbbWVzc2FnZS50eXBlXS5wdXNoKG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmVzdWx0LnNlY3Rpb25zW3Jlc3VsdC5zZWN0aW9ucy5sZW5ndGggLSAxXS5oZWFkZXIucmVhZE9ubHkgPSBpc1JlYWRPbmx5O1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkRmlsZSguLi5hcmdzOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgW2lkXSA9IGFyZ3M7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChcclxuICAgICAgYCR7dGhpcy5jb25maWcucHJveHlGdWxsQWRkcmVzc30ke3RoaXMuY29uZmlnLnByb3h5U2VydmljZUZvcm1zfSR7dGhpcy5jb25maWcuZm9ybUlkfSR7dGhpcy5jb25maWcucHJveHlTZXJ2aWNlQXR0YWNobWVudH0ke2lkfWAsXHJcbiAgICAgIHtvYnNlcnZlOiAncmVzcG9uc2UnfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkYXRhVVJJdG9CbG9iKGRhdGFVUkk6IGFueSkge1xyXG4gICAgY29uc3QgYnl0ZVN0cmluZyA9IGF0b2IoZGF0YVVSSSk7XHJcbiAgICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XHJcbiAgICBjb25zdCBpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaW50OEFycmF5W2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBCbG9iKFthcnJheUJ1ZmZlcl0sIHt0eXBlOiAnaW1hZ2UvanBlZyd9KTtcclxuICB9XHJcblxyXG4gIHNhdmVGaWxlKGZpbGVJbmZvcm1hdGlvbikge1xyXG4gICAgY29uc3QgZmlsZUJsb2IgPSB0aGlzLmRhdGFVUkl0b0Jsb2IoZmlsZUluZm9ybWF0aW9uLmZpbGVDb250ZW50cyk7XHJcbiAgICBjb25zdCBmaWxlID0gbmV3IEZpbGUoW2ZpbGVCbG9iXSwgZmlsZUluZm9ybWF0aW9uLmZpbGVOYW1lLCB7dHlwZTogZmlsZUluZm9ybWF0aW9uLm1pbWVUeXBlfSk7XHJcbiAgICBjb25zdCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcclxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rLmhyZWYgPSBibG9iVXJsO1xyXG4gICAgbGluay5kb3dubG9hZCA9IGZpbGVJbmZvcm1hdGlvbi5maWxlTmFtZTtcclxuICAgIGxpbmsuY2xpY2soKTtcclxuICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7XHJcbiAgfVxyXG5cclxuICBzZXRGbGFnUHJpb3JpdHkoaWQ6IHN0cmluZykge1xyXG4gICAgbGV0IGJvZHkgPSB7XHJcbiAgICAgIG1ldGhvZDogY29uc3RhbnRzLkhUVFBfTUVUSE9EX1BVVCxcclxuICAgICAgZGVzdGluYXRpb246IGNvbnN0YW50cy5UQVJHRVRfU0VSVkVSX0RQLFxyXG4gICAgICBzZXJ2aWNlTmFtZTogY29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9EUF9VUERBVEVfSU5CT1hfSVRFTSxcclxuICAgICAgZm9ybU5hbWU6IHRoaXMuY29uZmlnLmZvcm1OYW1lLFxyXG4gICAgICB1cmxQYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgaW5ib3hpZDogdGhpcy5jb25maWcuZm9ybUlkXHJcbiAgICAgIH0sXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICBmbGFnOiBpZFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgb3B0aW9ucyA9IHRoaXMuZ2V0UmVxdWVzdE9wdGlvbnMoKTtcclxuICAgIHJldHVybiB0aGlzLmdlbmVyYWxDYWxsQXBpKGJvZHksIGNvbnN0YW50cy5TVEFURV9NQUNISU5FX0FDVElPTl9TVUNDRVNTX0lOQk9YX0lURU0sIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvYWRIaXN0b3J5KC4uLmFyZ3MpIHtcclxuICAgIGNvbnN0IFtpZF0gPSBhcmdzO1xyXG4gICAgY29uc3QgYm9keSA9IHtcclxuICAgICAgbWV0aG9kOiBjb25zdGFudHMuSFRUUF9NRVRIT0RfR0VULFxyXG4gICAgICBkZXN0aW5hdGlvbjogY29uc3RhbnRzLlRBUkdFVF9TRVJWRVJfV00sXHJcbiAgICAgIHNlcnZpY2VOYW1lOiBjb25zdGFudHMuV09SS0ZMT1dfSVRFTVMsXHJcbiAgICAgIGZvcm1JZDogaWQgfHwgdGhpcy5jb25maWcuZm9ybUlkLFxyXG4gICAgICBmb3JtTmFtZTogXCJicG1cIixcclxuICAgIH07XHJcbiAgICBsZXQgb3B0aW9ucyA9IHRoaXMuZ2V0UmVxdWVzdE9wdGlvbnMoKTtcclxuICAgIHJldHVybiB0aGlzLmdlbmVyYWxDYWxsQXBpKGJvZHksIGNvbnN0YW50cy5TVEFURV9NQUNISU5FX0FDVElPTl9MT0FEX0hJU1RPUlksIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEluYm94SXRlbSguLi5hcmdzKSB7XHJcbiAgICBjb25zdCBbaWQsIGluYm94VHlwZV0gPSBhcmdzO1xyXG4gICAgY29uc3QgYm9keSA9IHtcclxuICAgICAgZm9ybU5hbWU6IHRoaXMuY29uZmlnLmZvcm1OYW1lLFxyXG4gICAgICBtZXRob2Q6IGNvbnN0YW50cy5IVFRQX01FVEhPRF9HRVQsXHJcbiAgICAgIGRlc3RpbmF0aW9uOiBjb25zdGFudHMuVEFSR0VUX1NFUlZFUl9EUCxcclxuICAgICAgc2VydmljZU5hbWU6IGNvbnN0YW50cy5TRVJWSUNFX05BTUVfRFBfSU5CT1hfSVRFTSxcclxuICAgICAgdXJsUGFyYW1ldGVyczoge1xyXG4gICAgICAgIGluYm94aWQ6IGlkLFxyXG4gICAgICAgIGluYm94dHlwZTogaW5ib3hUeXBlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBvcHRpb25zID0gdGhpcy5nZXRSZXF1ZXN0T3B0aW9ucygpO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhbENhbGxBcGkoYm9keSwgY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfQUNUSU9OX0dFVF9JTkJPWF9JVEVNLCBvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBwZXJzcGVjdGl2ZUFwcHJvdmVzKGRldGFpbHMpIHtcclxuICAgIGlmICghdGhpcy5jb25maWcucHJvZHVjdGlvbikge1xyXG4gICAgICBkZXRhaWxzID0ge31cclxuICAgIH1cclxuICAgIGxldCBzZXJ2aWNlTmFtZSA9IFwiZm9ybS9cIiArIHRoaXMuY29uZmlnLmZvcm1OYW1lXHJcbiAgICBpZiAodGhpcy5jb25maWcuZm9ybUlkKSB7XHJcbiAgICAgIHNlcnZpY2VOYW1lID0gXCJmb3JtL1wiICsgdGhpcy5jb25maWcuZm9ybUlkXHJcbiAgICB9XHJcbiAgICBsZXQgYm9keSA9IHtcclxuICAgICAgbWV0aG9kOiBjb25zdGFudHMuSFRUUF9NRVRIT0RfUE9TVCxcclxuICAgICAgZGVzdGluYXRpb246IGNvbnN0YW50cy5UQVJHRVRfU0VSVkVSX1dNLFxyXG4gICAgICBzZXJ2aWNlTmFtZTogc2VydmljZU5hbWVcclxuICAgICAgLCBmb3JtTmFtZTogY29uc3RhbnRzLkFQUFJPVkVSU1xyXG4gICAgICAsIGJvZHk6IHtcclxuICAgICAgICBcInJlcXVlc3RcIjoge1xyXG4gICAgICAgICAgXCJkZXRhaWxzXCI6XHJcbiAgICAgICAgICBkZXRhaWxzXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgb3B0aW9ucyA9IHRoaXMuZ2V0UmVxdWVzdE9wdGlvbnMoKTtcclxuICAgIHJldHVybiB0aGlzLmdlbmVyYWxDYWxsQXBpKGJvZHksIGNvbnN0YW50cy5TVEFURV9NQUNISU5FX0FDVElPTl9TVUNDRVNTX1JFU1BPTlNFLCBvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGdldEF0dGFjaG1lbnRzKGRhdGE6IGFueSwgLi4uYXJnczogYW55KSB7XHJcbiAgICBsZXQgYm9keSA9IHtcclxuICAgICAgbWV0aG9kOiBjb25zdGFudHMuSFRUUF9NRVRIT0RfUE9TVCxcclxuICAgICAgZGVzdGluYXRpb246IGNvbnN0YW50cy5UQVJHRVRfU0VSVkVSX1dNLFxyXG4gICAgICBzZXJ2aWNlTmFtZTogJ2F0dGFjaG1lbnQnXHJcbiAgICAgICwgZm9ybU5hbWU6ICdjb21tb24nXHJcbiAgICAgICwgYm9keToge1xyXG4gICAgICAgIGF0dGFjaG1lbnQ6IHtcclxuICAgICAgICAgIGZpbGVOYW1lOiB0aGlzLmNvbmZpZy5wcm9kdWN0aW9uID8gZGF0YS5maWxlTmFtZSA6ICcnLFxyXG4gICAgICAgICAgbWltZVR5cGU6IHRoaXMuY29uZmlnLnByb2R1Y3Rpb24gPyBkYXRhLm1pbWVUeXBlIDogJycsXHJcbiAgICAgICAgICBmaWxlQ29udGVudHM6IHRoaXMuY29uZmlnLnByb2R1Y3Rpb24gPyBkYXRhLmZpbGVDb250ZW50cyA6ICcnLFxyXG4gICAgICAgIH1cclxuICAgICAgICAsIGNvbW1lbnQ6IGRhdGEuYXR0YWNobWVudGNvbW1lbnRcclxuICAgICAgICAsIGRlc2NyaXB0aW9uOiBkYXRhLmZpbGVEZXNjcmlwdGlvbixcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IG9wdGlvbnMgPSB0aGlzLmdldFJlcXVlc3RPcHRpb25zKCk7XHJcbiAgICByZXR1cm4gdGhpcy5nZW5lcmFsQ2FsbEFwaShib2R5LCBjb25zdGFudHMuU1RBVEVfTUFDSElORV9BQ1RJT05fU1VDQ0VTU19SRVNQT05TRSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBzZWFyY2hFbXBsb3llZSguLi5hcmdzKSB7XHJcbiAgICBsZXQgW3NlYXJjaFN0cmluZ10gPSBhcmdzO1xyXG4gICAgbGV0IGJvZHkgPSB7XHJcbiAgICAgIG1ldGhvZDogY29uc3RhbnRzLkhUVFBfTUVUSE9EX0dFVCxcclxuICAgICAgZm9ybU5hbWU6IHRoaXMuY29uZmlnLmZvcm1OYW1lLFxyXG4gICAgICBkZXN0aW5hdGlvbjogY29uc3RhbnRzLlRBUkdFVF9TRVJWRVJfRFAsXHJcbiAgICAgIHNlcnZpY2VOYW1lOiBjb25zdGFudHMuU0VSVklDRV9OQU1FX0RQX1NFQVJDSF9FTVBMT1lFRSxcclxuICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgIHE6IHNlYXJjaFN0cmluZyxcclxuICAgICAgICBsaW1pdDogMTBcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IG9wdGlvbnMgPSB0aGlzLmdldFJlcXVlc3RPcHRpb25zKCk7XHJcbiAgICByZXR1cm4gdGhpcy5nZW5lcmFsQ2FsbEFwaShib2R5LCBjb25zdGFudHMuU1RBVEVfTUFDSElORV9BQ1RJT05fU1VDQ0VTU19SRVNQT05TRSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbXlSZXF1ZXN0cyhkZXRhaWxzKSB7XHJcbiAgICBsZXQgYm9keSA9IHtcclxuICAgICAgbWV0aG9kOiBjb25zdGFudHMuSFRUUF9NRVRIT0RfR0VULFxyXG4gICAgICBkZXN0aW5hdGlvbjogY29uc3RhbnRzLlRBUkdFVF9TRVJWRVJfV00sXHJcbiAgICAgIHNlcnZpY2VOYW1lOiBcImZvcm1cIiAvLywgIC8vdGhpcy5nZXRTZXJ2aWNlTmFtZSgpLFxyXG4gICAgICAsIGZvcm1OYW1lOiBcImhpc3RvcnlcIlxyXG4gICAgICAsIHF1ZXJ5UGFyYW1ldGVyczoge1xyXG4gICAgICAgIGZvcm1OYW1lOiB0aGlzLmNvbmZpZy5mb3JtTmFtZSxcclxuICAgICAgICB5ZWFyOiBkZXRhaWxzLnllYXIsXHJcbiAgICAgICAgbW9udGg6IGRldGFpbHMubW9udGgsXHJcbiAgICAgICAgZW1haWw6IHRoaXMubG9nZ2VkSW5Vc2VySWQoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgb3B0aW9ucyA9IHRoaXMuZ2V0UmVxdWVzdE9wdGlvbnMoKTtcclxuICAgIHJldHVybiB0aGlzLmdlbmVyYWxDYWxsQXBpKGJvZHksIGNvbnN0YW50cy5TVEFURV9NQUNISU5FX0FDVElPTl9TVUNDRVNTX1JFU1BPTlNFLCBvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGdlbmVyYWxDYWxsQXBpKGJvZHksIHR5cGU6IHN0cmluZywgb3B0aW9ucykge1xyXG4gICAgbGV0IGFwaVVybCA9IHRoaXMuY29uZmlnLnByb3h5U2VydmljZUJhc2VVcmwgKyB0aGlzLmxhbmd1YWdlICsgdGhpcy5jb25maWcucHJveHlGdWxsQWRkcmVzcyArIHRoaXMuY29uZmlnLnByb3h5U2VydmljZUV4ZWN1dGU7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpVXJsLCBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoYm9keSkpLCBvcHRpb25zKS5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlT2JqZWN0OiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2VPYmplY3RcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGh0dHBFcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoaHR0cEVycm9yKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9nZ2VkSW5Vc2VySWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy51c2VyRGF0YVsnbG9nZ2VkSW5Vc2VyRW1haWwnXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTaG9ydE5hbWUobmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAobmFtZSkge1xyXG4gICAgICBsZXQgbmFtZVRva2VucyA9IG5hbWUuc3BsaXQoJyAnKTtcclxuICAgICAgaWYgKG5hbWVUb2tlbnMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICByZXR1cm4gW25hbWVUb2tlbnNbMF1dXHJcbiAgICAgIH0gZWxzZSBpZiAobmFtZVRva2Vuc1tuYW1lVG9rZW5zLmxlbmd0aCAtIDJdLnRvTG93ZXJDYXNlKCkgPT0gJ2FsJykge1xyXG4gICAgICAgIHJldHVybiBbbmFtZVRva2Vuc1swXSwgbmFtZVRva2Vuc1tuYW1lVG9rZW5zLmxlbmd0aCAtIDJdLCBuYW1lVG9rZW5zW25hbWVUb2tlbnMubGVuZ3RoIC0gMV1dLmpvaW4oJyAnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gW25hbWVUb2tlbnNbMF0sIG5hbWVUb2tlbnNbbmFtZVRva2Vucy5sZW5ndGggLSAxXV0uam9pbignICcpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc01vYmlsZUFwcCgpIHtcclxuICAgIHJldHVybiAod2luZG93IGFzIGFueSkud21Db25maWcuaXNNb2JpbGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SW5ib3hUeXBlKHJlc3VsdCkge1xyXG4gICAgbGV0IHJ0biA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5sb2dnZWRJblVzZXJJZCgpID09PSByZXN1bHQucHJvZmlsZUluZm9Ecm9wLmVtcGxveWVlRW1haWwpIHtcclxuICAgICAgcnRuID0gY29uc3RhbnRzLklOQk9YX1NUQVRVU19TRU5UO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcnRuID0gY29uc3RhbnRzLklOQk9YX1NUQVRVU19QRU5ESU5HO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ0bjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc09wZW5PbkluYm94KCkge1xyXG4gICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KS53bUNvbmZpZy5vdXRsb29rO1xyXG4gIH1cclxufVxyXG4iXX0=