@deeksha2309/sunbird-collection-editor 8.0.7

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 (204) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/collection-editor-cursor.service.mjs +3 -0
  3. package/esm2022/lib/collection-editor-library.component.mjs +16 -0
  4. package/esm2022/lib/collection-editor-library.module.mjs +137 -0
  5. package/esm2022/lib/components/answer/answer.component.mjs +43 -0
  6. package/esm2022/lib/components/asset-browser/asset-browser.component.mjs +325 -0
  7. package/esm2022/lib/components/asset-browser/asset-browser.data.mjs +53 -0
  8. package/esm2022/lib/components/assign-page-number/assign-page-number.component.mjs +191 -0
  9. package/esm2022/lib/components/ckeditor-tool/ckeditor-tool.component.mjs +895 -0
  10. package/esm2022/lib/components/collection-icon/collection-icon.component.mjs +43 -0
  11. package/esm2022/lib/components/contentplayer-page/contentplayer-page.component.mjs +351 -0
  12. package/esm2022/lib/components/csv-upload/csv-upload.component.mjs +178 -0
  13. package/esm2022/lib/components/dialcode/dialcode.component.mjs +182 -0
  14. package/esm2022/lib/components/editor/editor.component.mjs +1125 -0
  15. package/esm2022/lib/components/fancy-tree/fancy-tree.component.mjs +529 -0
  16. package/esm2022/lib/components/header/header.component.mjs +123 -0
  17. package/esm2022/lib/components/library/library.component.mjs +242 -0
  18. package/esm2022/lib/components/library-filter/library-filter.component.mjs +149 -0
  19. package/esm2022/lib/components/library-list/library-list.component.mjs +92 -0
  20. package/esm2022/lib/components/library-player/library-player.component.mjs +62 -0
  21. package/esm2022/lib/components/manage-collaborator/manage-collaborator.component.mjs +256 -0
  22. package/esm2022/lib/components/meta-form/meta-form.component.mjs +377 -0
  23. package/esm2022/lib/components/options/options.component.mjs +144 -0
  24. package/esm2022/lib/components/plain-tree/plain-tree.component.mjs +125 -0
  25. package/esm2022/lib/components/progress-status/progress-status.component.mjs +46 -0
  26. package/esm2022/lib/components/publish-checklist/publish-checklist.component.mjs +67 -0
  27. package/esm2022/lib/components/quality-params-modal/quality-params-modal.component.mjs +52 -0
  28. package/esm2022/lib/components/question/question.component.mjs +1360 -0
  29. package/esm2022/lib/components/quml-player/quml-player.component.mjs +73 -0
  30. package/esm2022/lib/components/qumlplayer-page/qumlplayer-page.component.mjs +84 -0
  31. package/esm2022/lib/components/resource-reorder/resource-reorder.component.mjs +143 -0
  32. package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +26 -0
  33. package/esm2022/lib/components/template/template.component.mjs +42 -0
  34. package/esm2022/lib/components/term-and-condition/term-and-condition.component.mjs +68 -0
  35. package/esm2022/lib/directives/telemetry-interact/telemetry-interact.directive.mjs +33 -0
  36. package/esm2022/lib/interfaces/McqForm.mjs +29 -0
  37. package/esm2022/lib/interfaces/editor.mjs +2 -0
  38. package/esm2022/lib/interfaces/framework.mjs +2 -0
  39. package/esm2022/lib/interfaces/httpOptions.mjs +2 -0
  40. package/esm2022/lib/interfaces/requestParam.mjs +2 -0
  41. package/esm2022/lib/interfaces/serverResponse.mjs +2 -0
  42. package/esm2022/lib/pipes/sanitize-html.pipe.mjs +20 -0
  43. package/esm2022/lib/services/config/category.config.json +8 -0
  44. package/esm2022/lib/services/config/config.service.mjs +27 -0
  45. package/esm2022/lib/services/config/editor.config.json +31 -0
  46. package/esm2022/lib/services/config/label.config.json +314 -0
  47. package/esm2022/lib/services/config/player.config.json +96 -0
  48. package/esm2022/lib/services/config/url.config.json +69 -0
  49. package/esm2022/lib/services/data/data.service.mjs +192 -0
  50. package/esm2022/lib/services/dialcode/dialcode.service.mjs +309 -0
  51. package/esm2022/lib/services/editor/editor.service.mjs +682 -0
  52. package/esm2022/lib/services/framework/framework.service.mjs +106 -0
  53. package/esm2022/lib/services/helper/helper.service.mjs +160 -0
  54. package/esm2022/lib/services/player/player.service.mjs +99 -0
  55. package/esm2022/lib/services/public-data/public-data.service.mjs +21 -0
  56. package/esm2022/lib/services/question/question.service.mjs +167 -0
  57. package/esm2022/lib/services/telemetry/telemetry.service.mjs +120 -0
  58. package/esm2022/lib/services/toaster/toaster.service.mjs +105 -0
  59. package/esm2022/lib/services/tree/tree.service.mjs +284 -0
  60. package/esm2022/project-sunbird-sunbird-collection-editor.mjs +5 -0
  61. package/esm2022/public-api.mjs +4 -0
  62. package/fesm2022/project-sunbird-sunbird-collection-editor.mjs +10138 -0
  63. package/fesm2022/project-sunbird-sunbird-collection-editor.mjs.map +1 -0
  64. package/index.d.ts +6 -0
  65. package/lib/assets/.gitkeep +0 -0
  66. package/lib/assets/images/MCQ.png +0 -0
  67. package/lib/assets/images/Spin.gif +0 -0
  68. package/lib/assets/images/bulkuploadfile.png +0 -0
  69. package/lib/assets/images/cancel-sign copy.png +0 -0
  70. package/lib/assets/images/cancel-sign.png +0 -0
  71. package/lib/assets/images/emptyResult.svg +1 -0
  72. package/lib/assets/images/icons-rtl.gif +0 -0
  73. package/lib/assets/images/icons.gif +0 -0
  74. package/lib/assets/images/imageicon.svg +16 -0
  75. package/lib/assets/images/imageicon_blue.svg +16 -0
  76. package/lib/assets/images/layoutoneicon.svg +16 -0
  77. package/lib/assets/images/layoutoneicon_blue.svg +16 -0
  78. package/lib/assets/images/layoutthreeicon.svg +18 -0
  79. package/lib/assets/images/layoutthreeicon_blue.svg +18 -0
  80. package/lib/assets/images/layouttwoicon.svg +18 -0
  81. package/lib/assets/images/layouttwoicon_blue.svg +18 -0
  82. package/lib/assets/images/leftalignicon.svg +17 -0
  83. package/lib/assets/images/leftalignicon_blue.svg +17 -0
  84. package/lib/assets/images/loader.gif +0 -0
  85. package/lib/assets/images/loader.svg +1 -0
  86. package/lib/assets/images/loading.gif +0 -0
  87. package/lib/assets/images/middlealignicon.svg +17 -0
  88. package/lib/assets/images/middlealignicon_blue.svg +17 -0
  89. package/lib/assets/images/question_collection.svg +18 -0
  90. package/lib/assets/images/rightalignicon.svg +17 -0
  91. package/lib/assets/images/rightalignicon_blue.svg +17 -0
  92. package/lib/assets/images/vline-rtl.gif +0 -0
  93. package/lib/assets/images/vline.gif +0 -0
  94. package/lib/assets/images/writing.png +0 -0
  95. package/lib/collection-editor-cursor.service.d.ts +5 -0
  96. package/lib/collection-editor-cursor.service.d.ts.map +1 -0
  97. package/lib/collection-editor-library.component.d.ts +9 -0
  98. package/lib/collection-editor-library.component.d.ts.map +1 -0
  99. package/lib/collection-editor-library.module.d.ts +50 -0
  100. package/lib/collection-editor-library.module.d.ts.map +1 -0
  101. package/lib/components/answer/answer.component.d.ts +24 -0
  102. package/lib/components/answer/answer.component.d.ts.map +1 -0
  103. package/lib/components/asset-browser/asset-browser.component.d.ts +81 -0
  104. package/lib/components/asset-browser/asset-browser.component.d.ts.map +1 -0
  105. package/lib/components/asset-browser/asset-browser.data.d.ts +52 -0
  106. package/lib/components/asset-browser/asset-browser.data.d.ts.map +1 -0
  107. package/lib/components/assign-page-number/assign-page-number.component.d.ts +38 -0
  108. package/lib/components/assign-page-number/assign-page-number.component.d.ts.map +1 -0
  109. package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts +161 -0
  110. package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts.map +1 -0
  111. package/lib/components/collection-icon/collection-icon.component.d.ts +18 -0
  112. package/lib/components/collection-icon/collection-icon.component.d.ts.map +1 -0
  113. package/lib/components/contentplayer-page/contentplayer-page.component.d.ts +54 -0
  114. package/lib/components/contentplayer-page/contentplayer-page.component.d.ts.map +1 -0
  115. package/lib/components/csv-upload/csv-upload.component.d.ts +42 -0
  116. package/lib/components/csv-upload/csv-upload.component.d.ts.map +1 -0
  117. package/lib/components/dialcode/dialcode.component.d.ts +48 -0
  118. package/lib/components/dialcode/dialcode.component.d.ts.map +1 -0
  119. package/lib/components/editor/editor.component.d.ts +146 -0
  120. package/lib/components/editor/editor.component.d.ts.map +1 -0
  121. package/lib/components/fancy-tree/fancy-tree.component.d.ts +77 -0
  122. package/lib/components/fancy-tree/fancy-tree.component.d.ts.map +1 -0
  123. package/lib/components/header/header.component.d.ts +46 -0
  124. package/lib/components/header/header.component.d.ts.map +1 -0
  125. package/lib/components/library/library.component.d.ts +69 -0
  126. package/lib/components/library/library.component.d.ts.map +1 -0
  127. package/lib/components/library-filter/library-filter.component.d.ts +47 -0
  128. package/lib/components/library-filter/library-filter.component.d.ts.map +1 -0
  129. package/lib/components/library-list/library-list.component.d.ts +32 -0
  130. package/lib/components/library-list/library-list.component.d.ts.map +1 -0
  131. package/lib/components/library-player/library-player.component.d.ts +24 -0
  132. package/lib/components/library-player/library-player.component.d.ts.map +1 -0
  133. package/lib/components/manage-collaborator/manage-collaborator.component.d.ts +75 -0
  134. package/lib/components/manage-collaborator/manage-collaborator.component.d.ts.map +1 -0
  135. package/lib/components/meta-form/meta-form.component.d.ts +51 -0
  136. package/lib/components/meta-form/meta-form.component.d.ts.map +1 -0
  137. package/lib/components/options/options.component.d.ts +53 -0
  138. package/lib/components/options/options.component.d.ts.map +1 -0
  139. package/lib/components/plain-tree/plain-tree.component.d.ts +20 -0
  140. package/lib/components/plain-tree/plain-tree.component.d.ts.map +1 -0
  141. package/lib/components/progress-status/progress-status.component.d.ts +25 -0
  142. package/lib/components/progress-status/progress-status.component.d.ts.map +1 -0
  143. package/lib/components/publish-checklist/publish-checklist.component.d.ts +23 -0
  144. package/lib/components/publish-checklist/publish-checklist.component.d.ts.map +1 -0
  145. package/lib/components/quality-params-modal/quality-params-modal.component.d.ts +24 -0
  146. package/lib/components/quality-params-modal/quality-params-modal.component.d.ts.map +1 -0
  147. package/lib/components/question/question.component.d.ts +215 -0
  148. package/lib/components/question/question.component.d.ts.map +1 -0
  149. package/lib/components/quml-player/quml-player.component.d.ts +26 -0
  150. package/lib/components/quml-player/quml-player.component.d.ts.map +1 -0
  151. package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts +31 -0
  152. package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts.map +1 -0
  153. package/lib/components/resource-reorder/resource-reorder.component.d.ts +45 -0
  154. package/lib/components/resource-reorder/resource-reorder.component.d.ts.map +1 -0
  155. package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +13 -0
  156. package/lib/components/skeleton-loader/skeleton-loader.component.d.ts.map +1 -0
  157. package/lib/components/template/template.component.d.ts +21 -0
  158. package/lib/components/template/template.component.d.ts.map +1 -0
  159. package/lib/components/term-and-condition/term-and-condition.component.d.ts +26 -0
  160. package/lib/components/term-and-condition/term-and-condition.component.d.ts.map +1 -0
  161. package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts +27 -0
  162. package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts.map +1 -0
  163. package/lib/interfaces/McqForm.d.ts +32 -0
  164. package/lib/interfaces/McqForm.d.ts.map +1 -0
  165. package/lib/interfaces/editor.d.ts +78 -0
  166. package/lib/interfaces/editor.d.ts.map +1 -0
  167. package/lib/interfaces/framework.d.ts +46 -0
  168. package/lib/interfaces/framework.d.ts.map +1 -0
  169. package/lib/interfaces/httpOptions.d.ts +35 -0
  170. package/lib/interfaces/httpOptions.d.ts.map +1 -0
  171. package/lib/interfaces/requestParam.d.ts +24 -0
  172. package/lib/interfaces/requestParam.d.ts.map +1 -0
  173. package/lib/interfaces/serverResponse.d.ts +38 -0
  174. package/lib/interfaces/serverResponse.d.ts.map +1 -0
  175. package/lib/pipes/sanitize-html.pipe.d.ts +11 -0
  176. package/lib/pipes/sanitize-html.pipe.d.ts.map +1 -0
  177. package/lib/services/config/config.service.d.ts +13 -0
  178. package/lib/services/config/config.service.d.ts.map +1 -0
  179. package/lib/services/data/data.service.d.ts +85 -0
  180. package/lib/services/data/data.service.d.ts.map +1 -0
  181. package/lib/services/dialcode/dialcode.service.d.ts +36 -0
  182. package/lib/services/dialcode/dialcode.service.d.ts.map +1 -0
  183. package/lib/services/editor/editor.service.d.ts +150 -0
  184. package/lib/services/editor/editor.service.d.ts.map +1 -0
  185. package/lib/services/framework/framework.service.d.ts +35 -0
  186. package/lib/services/framework/framework.service.d.ts.map +1 -0
  187. package/lib/services/helper/helper.service.d.ts +41 -0
  188. package/lib/services/helper/helper.service.d.ts.map +1 -0
  189. package/lib/services/player/player.service.d.ts +33 -0
  190. package/lib/services/player/player.service.d.ts.map +1 -0
  191. package/lib/services/public-data/public-data.service.d.ts +15 -0
  192. package/lib/services/public-data/public-data.service.d.ts.map +1 -0
  193. package/lib/services/question/question.service.d.ts +30 -0
  194. package/lib/services/question/question.service.d.ts.map +1 -0
  195. package/lib/services/telemetry/telemetry.service.d.ts +45 -0
  196. package/lib/services/telemetry/telemetry.service.d.ts.map +1 -0
  197. package/lib/services/toaster/toaster.service.d.ts +50 -0
  198. package/lib/services/toaster/toaster.service.d.ts.map +1 -0
  199. package/lib/services/tree/tree.service.d.ts +51 -0
  200. package/lib/services/tree/tree.service.d.ts.map +1 -0
  201. package/package.json +32 -0
  202. package/project-sunbird-sunbird-collection-editor.d.ts.map +1 -0
  203. package/public-api.d.ts +4 -0
  204. package/public-api.d.ts.map +1 -0
@@ -0,0 +1,682 @@
1
+ import { Injectable, EventEmitter } from '@angular/core';
2
+ import { Subject, BehaviorSubject } from 'rxjs';
3
+ import * as _ from 'lodash-es';
4
+ import { map } from 'rxjs/operators';
5
+ import { ExportToCsv } from 'export-to-csv';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../tree/tree.service";
8
+ import * as i2 from "../../services/toaster/toaster.service";
9
+ import * as i3 from "../config/config.service";
10
+ import * as i4 from "../../services/telemetry/telemetry.service";
11
+ import * as i5 from "../public-data/public-data.service";
12
+ import * as i6 from "../data/data.service";
13
+ import * as i7 from "@angular/common/http";
14
+ export class EditorService {
15
+ constructor(treeService, toasterService, configService, telemetryService, publicDataService, dataService, httpClient) {
16
+ this.treeService = treeService;
17
+ this.toasterService = toasterService;
18
+ this.configService = configService;
19
+ this.telemetryService = telemetryService;
20
+ this.publicDataService = publicDataService;
21
+ this.dataService = dataService;
22
+ this.httpClient = httpClient;
23
+ this.data = {};
24
+ this._selectedChildren = {};
25
+ this.questionStream$ = new Subject();
26
+ this._editorMode = 'edit';
27
+ this._isReviewerEditEnable = false;
28
+ this._isReviewModificationAllowed = false;
29
+ this.showLibraryPage = new EventEmitter();
30
+ this.showQuestionLibraryPage = new EventEmitter();
31
+ this._bulkUploadStatus$ = new BehaviorSubject(undefined);
32
+ this.bulkUploadStatus$ = this._bulkUploadStatus$;
33
+ this.contentsCount = 0;
34
+ this.templateList = [];
35
+ this.branchingLogic = {};
36
+ this.questionIds = [];
37
+ }
38
+ initialize(config) {
39
+ this._editorConfig = config;
40
+ if (this.configService.editorConfig && this.configService.editorConfig.default) {
41
+ this._editorConfig.config = _.assign(this.configService.editorConfig.default, this._editorConfig.config);
42
+ }
43
+ this._editorMode = _.get(this._editorConfig, 'config.mode').toLowerCase();
44
+ this.setIsReviewerEditEnable(_.get(this._editorConfig, 'context.enableReviewEdit', false));
45
+ this.setQualityFormConfig(_.get(this._editorConfig, 'config.qualityFormConfig', null));
46
+ this.setIsReviewerQualityCheckEnabled(_.get(this._editorConfig, 'config.isReviewerQualityCheckEnabled', false));
47
+ }
48
+ set selectedChildren(value) {
49
+ if (value.mimeType) {
50
+ this._selectedChildren.mimeType = value.mimeType;
51
+ }
52
+ if (value.primaryCategory) {
53
+ this._selectedChildren.primaryCategory = value.primaryCategory;
54
+ }
55
+ if (value.interactionType) {
56
+ this._selectedChildren.interactionType = value.interactionType;
57
+ }
58
+ }
59
+ get selectedChildren() {
60
+ return this._selectedChildren;
61
+ }
62
+ get editorConfig() {
63
+ return this._editorConfig;
64
+ }
65
+ get editorMode() {
66
+ return this._editorMode;
67
+ }
68
+ get isReviewerEditEnable() {
69
+ return this._isReviewerEditEnable;
70
+ }
71
+ setIsReviewerEditEnable(value) {
72
+ return this._isReviewerEditEnable = value;
73
+ }
74
+ get isReviewModificationAllowed() {
75
+ return this._isReviewModificationAllowed;
76
+ }
77
+ setIsReviewModificationAllowed(value) {
78
+ return this._isReviewModificationAllowed = value;
79
+ }
80
+ get contentPolicyUrl() {
81
+ const url = _.get(this.editorConfig, 'config.contentPolicyUrl');
82
+ return url ? url : this.configService.urlConFig.ContentPolicyUrl;
83
+ }
84
+ getToolbarConfig() {
85
+ return _.cloneDeep(_.merge(this.configService.labelConfig.button_labels, _.get(this.editorConfig, 'context.labels')));
86
+ }
87
+ emitshowLibraryPageEvent(page) {
88
+ this.showLibraryPage.emit(page);
89
+ }
90
+ getshowLibraryPageEmitter() {
91
+ return this.showLibraryPage;
92
+ }
93
+ getQuestionList(questionIds) {
94
+ const option = {
95
+ url: _.get(this.configService.urlConFig, 'URLS.QUESTION.LIST'),
96
+ data: {
97
+ request: {
98
+ search: {
99
+ identifier: questionIds
100
+ }
101
+ }
102
+ }
103
+ };
104
+ return this.dataService.post(option).pipe(map(data => _.get(data, 'result')));
105
+ }
106
+ fetchCollectionHierarchy(collectionId) {
107
+ const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
108
+ const hierarchyUrl = `${url.HIERARCHY_READ}/${collectionId}`;
109
+ const req = {
110
+ url: hierarchyUrl,
111
+ param: { mode: 'edit' }
112
+ };
113
+ return this.publicDataService.get(req);
114
+ }
115
+ readQuestionSet(questionSetId, option = { params: {} }) {
116
+ const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
117
+ const param = {
118
+ mode: 'edit',
119
+ fields: url.DEFAULT_PARAMS_FIELDS
120
+ };
121
+ const hierarchyUrl = `${url.READ}/${questionSetId}`;
122
+ const req = {
123
+ url: hierarchyUrl,
124
+ param: { ...param, ...option.params }
125
+ };
126
+ return this.publicDataService.get(req);
127
+ }
128
+ fetchContentDetails(contentId) {
129
+ const req = {
130
+ url: _.get(this.configService.urlConFig, 'URLS.CONTENT.READ') + contentId
131
+ };
132
+ return this.publicDataService.get(req);
133
+ }
134
+ updateHierarchy() {
135
+ const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
136
+ const req = {
137
+ url: url.HIERARCHY_UPDATE,
138
+ data: {
139
+ request: {
140
+ data: {
141
+ ...this.getCollectionHierarchy(),
142
+ ...{ lastUpdatedBy: _.get(this.editorConfig, 'context.user.id') }
143
+ }
144
+ }
145
+ }
146
+ };
147
+ return this.publicDataService.patch(req);
148
+ }
149
+ getFieldsToUpdate(collectionId) {
150
+ let formFields = {};
151
+ const editableFields = _.get(this.editorConfig.config, 'editableFields');
152
+ if (editableFields && !_.isEmpty(editableFields[this.editorMode])) {
153
+ const fields = editableFields[this.editorMode];
154
+ const nodesModified = _.get(this.getCollectionHierarchy(), 'nodesModified');
155
+ const collectionFormData = _.get(nodesModified[collectionId], 'metadata');
156
+ _.forEach(fields, fieldCode => {
157
+ formFields[fieldCode] = collectionFormData[fieldCode];
158
+ });
159
+ }
160
+ return formFields;
161
+ }
162
+ updateCollection(collectionId, data) {
163
+ let objType = this.configService.categoryConfig[this.editorConfig.config.objectType];
164
+ objType = objType.toLowerCase();
165
+ const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
166
+ const fieldsObj = this.getFieldsToUpdate(collectionId);
167
+ const requestBody = {
168
+ request: {
169
+ [objType]: {
170
+ ...fieldsObj,
171
+ lastPublishedBy: this.editorConfig.context.user.id
172
+ }
173
+ }
174
+ };
175
+ const publishData = _.get(data, 'publishData');
176
+ if (publishData) {
177
+ requestBody.request[objType] = { ...requestBody.request[objType], ...publishData };
178
+ }
179
+ const option = {
180
+ url: `${url.SYSYTEM_UPDATE}${collectionId}`,
181
+ data: requestBody
182
+ };
183
+ return this.publicDataService.patch(option);
184
+ }
185
+ reviewContent(contentId) {
186
+ let objType = this.configService.categoryConfig[this.editorConfig.config.objectType];
187
+ objType = objType.toLowerCase();
188
+ const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
189
+ const option = {
190
+ url: url.CONTENT_REVIEW + contentId,
191
+ data: {
192
+ request: {
193
+ [objType]: {}
194
+ }
195
+ }
196
+ };
197
+ return this.publicDataService.post(option);
198
+ }
199
+ submitRequestChanges(contentId, comment) {
200
+ let objType = this.configService.categoryConfig[this.editorConfig.config.objectType];
201
+ objType = objType.toLowerCase();
202
+ const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
203
+ const requestBody = {
204
+ request: {
205
+ [objType]: {
206
+ rejectComment: _.trim(comment)
207
+ }
208
+ }
209
+ };
210
+ const option = {
211
+ url: `${url.CONTENT_REJECT}${contentId}`,
212
+ data: requestBody
213
+ };
214
+ return this.publicDataService.post(option);
215
+ }
216
+ publishContent(contentId, event) {
217
+ let objType = this.configService.categoryConfig[this.editorConfig.config.objectType];
218
+ objType = objType.toLowerCase();
219
+ const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
220
+ const requestBody = {
221
+ request: {
222
+ [objType]: {
223
+ lastPublishedBy: this.editorConfig.context.user.id
224
+ }
225
+ }
226
+ };
227
+ const publishData = _.get(event, 'publishData');
228
+ if (publishData) {
229
+ requestBody.request[objType] = { ...requestBody.request[objType], ...publishData };
230
+ }
231
+ const option = {
232
+ url: `${url.CONTENT_PUBLISH}${contentId}`,
233
+ data: requestBody
234
+ };
235
+ return this.publicDataService.post(option);
236
+ }
237
+ addResourceToHierarchy(collection, unitIdentifier, contentId) {
238
+ const req = {
239
+ url: _.get(this.configService.urlConFig, 'URLS.CONTENT.HIERARCHY_ADD'),
240
+ data: {
241
+ request: {
242
+ rootId: collection,
243
+ unitId: unitIdentifier,
244
+ children: [contentId]
245
+ }
246
+ }
247
+ };
248
+ return this.publicDataService.patch(req);
249
+ }
250
+ addResourceToQuestionset(collection, unitIdentifier, contentId) {
251
+ const children = _.isArray(contentId) ? contentId : [contentId];
252
+ let req = {
253
+ url: _.get(this.configService.urlConFig, 'URLS.QuestionSet.ADD'),
254
+ data: {
255
+ request: {
256
+ questionset: {
257
+ rootId: collection,
258
+ collectionId: unitIdentifier,
259
+ children
260
+ }
261
+ }
262
+ }
263
+ };
264
+ if (collection === unitIdentifier) {
265
+ req = _.omit(req, 'data.request.questionset.collectionId');
266
+ }
267
+ return this.publicDataService.patch(req);
268
+ }
269
+ getQuestionStream$() {
270
+ return this.questionStream$;
271
+ }
272
+ publish(value) {
273
+ this.questionStream$.next(value);
274
+ }
275
+ setQuestionIds(childrens) {
276
+ const self = this;
277
+ for (const children of childrens) {
278
+ if (children.data.objectType === 'QuestionSet') {
279
+ let questionCount = 0;
280
+ if (children?.data?.metadata?.maxQuestions && (children?.data?.metadata?.maxQuestions < children?.children?.length)) {
281
+ questionCount = children.data.metadata.maxQuestions;
282
+ }
283
+ else {
284
+ questionCount = children?.children ?
285
+ children?.children?.length : 0;
286
+ }
287
+ if (questionCount > 0) {
288
+ for (let i = 0; i < questionCount; i++) {
289
+ if (!_.isEmpty(children, 'children')) {
290
+ if (children.children[i].data.objectType === 'QuestionSet') {
291
+ self.setQuestionIds([children.children[i]]);
292
+ }
293
+ else {
294
+ if (!_.includes(this.questionIds, children.children[i].data.id)) {
295
+ this.questionIds.push(children.children[i].data.id);
296
+ }
297
+ }
298
+ }
299
+ }
300
+ }
301
+ }
302
+ }
303
+ }
304
+ async getMaxScore() {
305
+ let maxScore = 0;
306
+ let rootNode = [];
307
+ this.questionIds = [];
308
+ const rootNodeData = this.treeService.getFirstChild();
309
+ if (rootNodeData.children) {
310
+ rootNode = [rootNodeData];
311
+ }
312
+ if (!_.isEmpty(rootNode)) {
313
+ this.setQuestionIds(rootNode);
314
+ }
315
+ if (!_.isEmpty(this.questionIds)) {
316
+ const { questions } = await this.getQuestionList(this.questionIds).toPromise();
317
+ maxScore = this.calculateMaxScore(questions);
318
+ }
319
+ return maxScore;
320
+ }
321
+ calculateMaxScore(questions) {
322
+ return _.reduce(questions, (sum, question) => {
323
+ const nodeData = this.treeService.getNodeById(question.identifier);
324
+ if (_.has(nodeData.parent.data.metadata, 'shuffle') && nodeData.parent.data.metadata.shuffle === true) {
325
+ return sum + 1;
326
+ }
327
+ else {
328
+ return sum + (question?.responseDeclaration?.response1?.maxScore ? _.get(question, 'responseDeclaration.response1.maxScore') : 0);
329
+ }
330
+ }, 0);
331
+ }
332
+ getCollectionHierarchy() {
333
+ const instance = this;
334
+ this.data = {};
335
+ const data = this.treeService.getFirstChild();
336
+ return {
337
+ nodesModified: this.treeService.treeCache.nodesModified,
338
+ hierarchy: instance._toFlatObj(data)
339
+ };
340
+ }
341
+ _toFlatObj(data, questionId, selectUnitId) {
342
+ const instance = this;
343
+ if (data && data.data) {
344
+ instance.data[data.data.id] = {
345
+ name: data.title,
346
+ children: _.map(data.children, (child) => {
347
+ return child.data.id;
348
+ }),
349
+ root: data.data.root
350
+ };
351
+ if (questionId && selectUnitId && selectUnitId === data.data.id) {
352
+ instance.data[data.data.id].children.push(questionId);
353
+ }
354
+ if (questionId && selectUnitId && data.folder === false) {
355
+ delete instance.data[data.data.id];
356
+ }
357
+ _.forEach(data.children, (collection) => {
358
+ instance._toFlatObj(collection, questionId, selectUnitId);
359
+ });
360
+ }
361
+ return instance.data;
362
+ }
363
+ getHierarchyObj(data, questionId, selectUnitId, parentIdentifier) {
364
+ return this._toFlatObj(data, questionId, selectUnitId);
365
+ }
366
+ _toFlatObjFromHierarchy(data) {
367
+ const instance = this;
368
+ if (data && data.children) {
369
+ instance.data[data.identifier] = {
370
+ name: data.name,
371
+ children: _.map(data.children, (child) => {
372
+ return child.identifier;
373
+ }),
374
+ branchingLogic: data.branchingLogic
375
+ };
376
+ _.forEach(data.children, (collection) => {
377
+ instance._toFlatObjFromHierarchy(collection);
378
+ });
379
+ }
380
+ return instance.data;
381
+ }
382
+ getRelationalMetadataObj(data) {
383
+ let relationalMetadata = {};
384
+ _.forEach(data, (child) => {
385
+ if (_.get(child, 'data.metadata.relationalMetadata')) {
386
+ relationalMetadata = {
387
+ ...relationalMetadata,
388
+ [child.data.id]: _.get(child, 'data.metadata.relationalMetadata')
389
+ };
390
+ }
391
+ });
392
+ return relationalMetadata;
393
+ }
394
+ getCategoryDefinition(categoryName, channel, objectType) {
395
+ const req = {
396
+ url: _.get(this.configService.urlConFig, 'URLS.getCategoryDefinition'),
397
+ data: {
398
+ request: {
399
+ objectCategoryDefinition: {
400
+ objectType: objectType ? objectType : 'Content',
401
+ name: categoryName,
402
+ ...(channel && { channel })
403
+ },
404
+ }
405
+ }
406
+ };
407
+ return this.publicDataService.post(req);
408
+ }
409
+ fetchContentListDetails(req) {
410
+ return this.publicDataService.post(req);
411
+ }
412
+ sort(a, b, column) {
413
+ if (!this.isNotEmpty(a, column) || !this.isNotEmpty(b, column)) {
414
+ return 1;
415
+ }
416
+ let aColumn = a[column];
417
+ let bColumn = b[column];
418
+ if (_.isArray(aColumn)) {
419
+ aColumn = _.join(aColumn, ', ');
420
+ }
421
+ if (_.isArray(bColumn)) {
422
+ bColumn = _.join(bColumn, ', ');
423
+ }
424
+ if (_.isNumber(aColumn)) {
425
+ aColumn = _.toString(aColumn);
426
+ }
427
+ if (_.isNumber(bColumn)) {
428
+ bColumn = _.toString(bColumn);
429
+ }
430
+ return bColumn.localeCompare(aColumn);
431
+ }
432
+ isNotEmpty(obj, key) {
433
+ if (_.isNil(obj) || _.isNil(obj[key])) {
434
+ return false;
435
+ }
436
+ return true;
437
+ }
438
+ apiErrorHandling(err, errorInfo) {
439
+ if (_.get(err, 'error.params.errmsg') || errorInfo.errorMsg) {
440
+ this.toasterService.error(_.get(err, 'error.params.errmsg') || errorInfo.errorMsg);
441
+ }
442
+ const telemetryErrorData = {
443
+ err: _.toString(err.status),
444
+ errtype: 'SYSTEM',
445
+ stacktrace: JSON.stringify({ response: _.pick(err, ['error', 'url']), request: _.get(errorInfo, 'request') }) || errorInfo.errorMsg,
446
+ pageid: this.telemetryService.telemetryPageId
447
+ };
448
+ this.telemetryService.error(telemetryErrorData);
449
+ }
450
+ // this method is used to get all the contents in course/question inside every module and sub module
451
+ getContentChildrens(activeNode) {
452
+ let treeObj = this.treeService.getTreeObject();
453
+ const contents = [];
454
+ if (activeNode) {
455
+ treeObj = activeNode;
456
+ }
457
+ treeObj.visit((node) => {
458
+ if (node.folder === false) {
459
+ contents.push(node.data.id);
460
+ }
461
+ });
462
+ return contents;
463
+ }
464
+ // this method is used to keep count of contents added from library page
465
+ contentsCountAddedInLibraryPage(setToZero) {
466
+ if (setToZero) {
467
+ this.contentsCount = 0; // setting this count to zero while going out from library page
468
+ }
469
+ else {
470
+ this.contentsCount = this.contentsCount + 1;
471
+ }
472
+ }
473
+ checkIfContentsCanbeAdded() {
474
+ const config = {
475
+ errorMessage: '',
476
+ maxLimit: 0
477
+ };
478
+ if (_.get(this.editorConfig, 'config.objectType') === 'QuestionSet') {
479
+ config.errorMessage = _.get(this.configService, 'labelConfig.messages.error.031');
480
+ config.maxLimit = _.get(this.editorConfig, 'config.questionSet.maxQuestionsLimit');
481
+ }
482
+ else {
483
+ config.errorMessage = _.get(this.configService, 'labelConfig.messages.error.032');
484
+ config.maxLimit = _.get(this.editorConfig, 'config.collection.maxContentsLimit');
485
+ }
486
+ const childrenCount = this.getContentChildrens().length + this.contentsCount;
487
+ if (childrenCount >= config.maxLimit) {
488
+ this.toasterService.error(config.errorMessage);
489
+ return false;
490
+ }
491
+ else {
492
+ return true;
493
+ }
494
+ }
495
+ getHierarchyFolder() {
496
+ const treeObj = this.treeService.getTreeObject();
497
+ const contents = [];
498
+ if (treeObj) {
499
+ treeObj.visit((node) => {
500
+ if (node && !node.data.root) {
501
+ contents.push(node.data.id);
502
+ }
503
+ });
504
+ }
505
+ return contents;
506
+ }
507
+ validateCSVFile(formData, collectionnId) {
508
+ const url = _.get(this.configService.urlConFig, 'URLS.CSV.UPLOAD');
509
+ const reqParam = {
510
+ url: `${url}${collectionnId}`,
511
+ data: formData.data
512
+ };
513
+ return this.publicDataService.post(reqParam);
514
+ }
515
+ downloadHierarchyCsv(collectionId) {
516
+ const url = _.get(this.configService.urlConFig, 'URLS.CSV.DOWNLOAD');
517
+ const req = {
518
+ url: `${url}${collectionId}`,
519
+ };
520
+ return this.publicDataService.get(req);
521
+ }
522
+ generatePreSignedUrl(req, contentId, type) {
523
+ const reqParam = {
524
+ url: `${this.configService.urlConFig.URLS.CONTENT.UPLOAD_URL}${contentId}?type=${type}`,
525
+ data: {
526
+ request: req
527
+ }
528
+ };
529
+ return this.publicDataService.post(reqParam);
530
+ }
531
+ downloadBlobUrlFile(config) {
532
+ try {
533
+ this.httpClient.get(config.blobUrl, { responseType: 'blob' })
534
+ .subscribe(blob => {
535
+ const objectUrl = URL.createObjectURL(blob);
536
+ const a = document.createElement('a');
537
+ a.href = objectUrl;
538
+ a.download = config.fileName;
539
+ document.body.appendChild(a);
540
+ a.click();
541
+ document.body.removeChild(a);
542
+ URL.revokeObjectURL(objectUrl);
543
+ if (config.successMessage) {
544
+ this.toasterService.success(config.successMessage);
545
+ }
546
+ }, (error) => {
547
+ console.error(_.get(this.configService, 'labelConfig.messages.error.034') + error);
548
+ });
549
+ }
550
+ catch (error) {
551
+ console.error(_.replace(_.get(this.configService, 'labelConfig.messages.error.033'), '{FILE_TYPE}', config.fileType) + error);
552
+ }
553
+ }
554
+ generateCSV(config) {
555
+ const tableData = config.tableData;
556
+ delete config.tableData;
557
+ let options = {
558
+ fieldSeparator: ',',
559
+ quoteStrings: '"',
560
+ decimalSeparator: '.',
561
+ showLabels: true,
562
+ useTextFile: false,
563
+ useBom: true,
564
+ showTitle: true,
565
+ title: '',
566
+ filename: '',
567
+ headers: []
568
+ };
569
+ options = _.merge(options, config);
570
+ const csvExporter = new ExportToCsv(options);
571
+ csvExporter.generateCsv(tableData);
572
+ }
573
+ getBranchingLogicByFolder(identifier) {
574
+ const nodeData = this.treeService.getNodeById(identifier);
575
+ const branchingLogic = _.get(nodeData, 'data.metadata.branchingLogic');
576
+ return branchingLogic || {};
577
+ }
578
+ /**
579
+ *
580
+ * @public
581
+ * @param identifier identifier of the node
582
+ * @returns { source: [], target: [], sourceTarget?: [] }
583
+ * @memberof EditorService
584
+ */
585
+ getDependentNodes(identifier) {
586
+ const sectionBranchingLogic = this.getBranchingLogicByNodeId(identifier);
587
+ if (!_.isEmpty(sectionBranchingLogic)) {
588
+ const branchingEntry = this.getBranchingLogicEntry(sectionBranchingLogic, identifier);
589
+ const source = _.get(branchingEntry, 'source');
590
+ if (!_.isEmpty(source)) { // if the node is a dependent node
591
+ const sourceBranchingEntry = this.getBranchingLogicEntry(sectionBranchingLogic, _.first(branchingEntry.source));
592
+ return !_.isEmpty(sourceBranchingEntry) ? { source: branchingEntry.source, target: branchingEntry.target,
593
+ sourceTarget: sourceBranchingEntry.target } : {};
594
+ }
595
+ else { // if the node is a parent node
596
+ return !_.isEmpty(branchingEntry) ? { source: branchingEntry.source, target: branchingEntry.target } : {};
597
+ }
598
+ }
599
+ }
600
+ /**
601
+ *
602
+ * @public
603
+ * @param identifier identifier of the node
604
+ * @returns {"do_id": { "target": [ "do_id123", "do_id456" ], "preCondition": {}, "source": [] }}
605
+ * @memberof EditorService
606
+ */
607
+ getBranchingLogicByNodeId(identifier) {
608
+ const leafNode = this.treeService.getNodeById(identifier);
609
+ const parentIdentifier = _.get(leafNode, 'parent.data.id');
610
+ return this.getBranchingLogicByFolder(parentIdentifier);
611
+ }
612
+ getBranchingLogicEntry(parentBranchingLogic, identifier) {
613
+ return _.find(parentBranchingLogic, (logic, key) => {
614
+ return key === identifier;
615
+ });
616
+ }
617
+ getFlattenedBranchingLogic(data) {
618
+ const flatHierarchy = this._toFlatObjFromHierarchy(data);
619
+ const branchingLogics = _.compact(_.map(flatHierarchy, 'branchingLogic'));
620
+ return _.reduce(branchingLogics, (acc, val) => {
621
+ return _.assign(acc, val);
622
+ }, {});
623
+ }
624
+ getParentDependentMap(data) {
625
+ const branchingLogic = this.getFlattenedBranchingLogic(data);
626
+ const obj = {};
627
+ _.forEach(_.keys(branchingLogic), item => {
628
+ obj[item] = !_.isEmpty(branchingLogic[item].source) ? 'dependent' : !_.isEmpty(branchingLogic[item].target) ? 'parent' : '';
629
+ });
630
+ return obj;
631
+ }
632
+ getPrimaryCategoryName(sectionId) {
633
+ const nodeData = this.treeService.getNodeById(sectionId);
634
+ return _.get(nodeData, 'data.primaryCategory');
635
+ }
636
+ /**
637
+ * fetch Outcome Declaration levels using the questionsetId
638
+ * only for Observation with Rubrics
639
+ * @param identifier questionset identifier
640
+ */
641
+ fetchOutComeDeclaration(questionSetId, option = { params: {} }) {
642
+ const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
643
+ const param = {
644
+ fields: 'outcomeDeclaration'
645
+ };
646
+ const hierarchyUrl = `${url.READ}/${questionSetId}`;
647
+ const req = {
648
+ url: hierarchyUrl,
649
+ param: { ...param, ...option.params }
650
+ };
651
+ return this.publicDataService.get(req);
652
+ }
653
+ get qualityFormConfig() {
654
+ return this._qualityFormConfig;
655
+ }
656
+ setQualityFormConfig(value) {
657
+ return this._qualityFormConfig = value;
658
+ }
659
+ get isReviewerQualityCheckEnabled() {
660
+ return this._isReviewerQualityCheckEnabled;
661
+ }
662
+ setIsReviewerQualityCheckEnabled(value) {
663
+ return this._isReviewerQualityCheckEnabled = value;
664
+ }
665
+ appendCloudStorageHeaders(config) {
666
+ const headers = _.get(this.editorConfig, 'context.cloudStorage.presigned_headers', {});
667
+ if (!_.isEmpty(headers)) {
668
+ config.headers = { ...config.headers, ...headers };
669
+ return config;
670
+ }
671
+ else {
672
+ return config;
673
+ }
674
+ }
675
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorService, deps: [{ token: i1.TreeService }, { token: i2.ToasterService }, { token: i3.ConfigService }, { token: i4.EditorTelemetryService }, { token: i5.PublicDataService }, { token: i6.DataService }, { token: i7.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
676
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorService, providedIn: 'root' }); }
677
+ }
678
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorService, decorators: [{
679
+ type: Injectable,
680
+ args: [{ providedIn: 'root' }]
681
+ }], ctorParameters: function () { return [{ type: i1.TreeService }, { type: i2.ToasterService }, { type: i3.ConfigService }, { type: i4.EditorTelemetryService }, { type: i5.PublicDataService }, { type: i6.DataService }, { type: i7.HttpClient }]; } });
682
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2xsZWN0aW9uLWVkaXRvci1saWJyYXJ5L3NyYy9saWIvc2VydmljZXMvZWRpdG9yL2VkaXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBYyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sS0FBSyxDQUFDLE1BQU0sV0FBVyxDQUFDO0FBUS9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFTNUMsTUFBTSxPQUFPLGFBQWE7SUF5QnhCLFlBQW1CLFdBQXdCLEVBQVUsY0FBOEIsRUFDaEUsYUFBNEIsRUFBVSxnQkFBd0MsRUFDN0UsaUJBQW9DLEVBQVUsV0FBd0IsRUFBUyxVQUFzQjtRQUZ0RyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUNoRSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0I7UUFDN0Usc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQTFCekgsU0FBSSxHQUFRLEVBQUUsQ0FBQztRQUNQLHNCQUFpQixHQUFxQixFQUFFLENBQUM7UUFDMUMsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBRXBDLGdCQUFXLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5QixpQ0FBNEIsR0FBRyxLQUFLLENBQUM7UUFD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QixLQUFLLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUU7U0FDdEMsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEtBQVU7UUFDckMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLDZCQUE2QjtRQUMvQixPQUFPLElBQUksQ0FBQyw4QkFBOEIsQ0FBQztJQUMzQyxDQUFDO0lBRU8sZ0NBQWdDLENBQUMsS0FBYztRQUNyRCxPQUFPLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxLQUFLLENBQUM7SUFDckQsQ0FBQztJQUVILHlCQUF5QixDQUFDLE1BQU07UUFDOUIsTUFBTSxPQUFPLEdBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLHdDQUF3QyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsRUFBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUMsQ0FBQztZQUNqRCxPQUFPLE1BQU0sQ0FBQztTQUNmO2FBQU07WUFDTCxPQUFPLE1BQU0sQ0FBQztTQUNmO0lBQ0gsQ0FBQzsrR0Fwc0JVLGFBQWE7bUhBQWIsYUFBYSxjQUZBLE1BQU07OzRGQUVuQixhQUFhO2tCQUZ6QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBUcmVlU2VydmljZSB9IGZyb20gJy4uL3RyZWUvdHJlZS5zZXJ2aWNlJztcbmltcG9ydCB7IFB1YmxpY0RhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vcHVibGljLWRhdGEvcHVibGljLWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBJRWRpdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9lZGl0b3InO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL2NvbmZpZy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdGVyU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvdG9hc3Rlci90b2FzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdG9yVGVsZW1ldHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RlbGVtZXRyeS90ZWxlbWV0cnkuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRhU2VydmljZSB9IGZyb20gJy4uL2RhdGEvZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBFeHBvcnRUb0NzdiB9IGZyb20gJ2V4cG9ydC10by1jc3YnO1xuXG5pbnRlcmZhY2UgU2VsZWN0ZWRDaGlsZHJlbiB7XG4gIHByaW1hcnlDYXRlZ29yeT86IHN0cmluZztcbiAgbWltZVR5cGU/OiBzdHJpbmc7XG4gIGludGVyYWN0aW9uVHlwZT86IHN0cmluZztcbn1cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5cbmV4cG9ydCBjbGFzcyBFZGl0b3JTZXJ2aWNlIHtcbiAgZGF0YTogYW55ID0ge307XG4gIHByaXZhdGUgX3NlbGVjdGVkQ2hpbGRyZW46IFNlbGVjdGVkQ2hpbGRyZW4gPSB7fTtcbiAgcHVibGljIHF1ZXN0aW9uU3RyZWFtJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgcHJpdmF0ZSBfZWRpdG9yQ29uZmlnOiBJRWRpdG9yQ29uZmlnO1xuICBwcml2YXRlIF9lZGl0b3JNb2RlID0gJ2VkaXQnO1xuICBwcml2YXRlIF9pc1Jldmlld2VyRWRpdEVuYWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIF9pc1Jldmlld01vZGlmaWNhdGlvbkFsbG93ZWQgPSBmYWxzZTtcbiAgcHVibGljIHNob3dMaWJyYXJ5UGFnZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBzaG93UXVlc3Rpb25MaWJyYXJ5UGFnZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHByaXZhdGUgX2J1bGtVcGxvYWRTdGF0dXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyByZWFkb25seSBidWxrVXBsb2FkU3RhdHVzJDogT2JzZXJ2YWJsZTxhbnk+ID0gdGhpcy5fYnVsa1VwbG9hZFN0YXR1cyQ7XG4gIHB1YmxpYyBjb250ZW50c0NvdW50ID0gMDtcbiAgdGVtcGxhdGVMaXN0ID0gW107XG4gIHBhcmVudElkZW50aWZpZXI6IGFueTtcbiAgYnJhbmNoaW5nTG9naWMgPSB7fTtcbiAgc2VsZWN0ZWRTZWN0aW9uOiBhbnk7XG4gIG9wdGlvbnNMZW5ndGg6IGFueTtcbiAgc2VsZWN0ZWRQcmltYXJ5Q2F0ZWdvcnk6IGFueTtcbiAgbGVhZlBhcmVudElkZW50aWZpZXI6IGFueTtcbiAgcXVlc3Rpb25JZHMgPSBbXTtcbiAgb3V0Y29tZURlY2xhcmF0aW9uOiBhbnk7XG4gIHRyZWVEYXRhOiBhbnk7XG4gIHByaXZhdGUgX3F1YWxpdHlGb3JtQ29uZmlnOiBhbnk7XG4gIHByaXZhdGUgX2lzUmV2aWV3ZXJRdWFsaXR5Q2hlY2tFbmFibGVkOiBib29sZWFuO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHJlZVNlcnZpY2U6IFRyZWVTZXJ2aWNlLCBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSxcbiAgICAgICAgICAgICAgcHVibGljIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsIHByaXZhdGUgdGVsZW1ldHJ5U2VydmljZTogRWRpdG9yVGVsZW1ldHJ5U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBwdWJsaWNEYXRhU2VydmljZTogUHVibGljRGF0YVNlcnZpY2UsIHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLCBwdWJsaWMgaHR0cENsaWVudDogSHR0cENsaWVudCkge1xuICAgICAgICAgICAgICB9XG5cbiAgcHVibGljIGluaXRpYWxpemUoY29uZmlnOiBJRWRpdG9yQ29uZmlnKSB7XG4gICAgdGhpcy5fZWRpdG9yQ29uZmlnID0gY29uZmlnO1xuICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuZWRpdG9yQ29uZmlnICYmIHRoaXMuY29uZmlnU2VydmljZS5lZGl0b3JDb25maWcuZGVmYXVsdCkge1xuICAgICAgdGhpcy5fZWRpdG9yQ29uZmlnLmNvbmZpZyA9IF8uYXNzaWduKHRoaXMuY29uZmlnU2VydmljZS5lZGl0b3JDb25maWcuZGVmYXVsdCwgdGhpcy5fZWRpdG9yQ29uZmlnLmNvbmZpZyk7XG4gICAgfVxuICAgIHRoaXMuX2VkaXRvck1vZGUgPSBfLmdldCh0aGlzLl9lZGl0b3JDb25maWcsICdjb25maWcubW9kZScpLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5zZXRJc1Jldmlld2VyRWRpdEVuYWJsZShfLmdldCh0aGlzLl9lZGl0b3JDb25maWcsICdjb250ZXh0LmVuYWJsZVJldmlld0VkaXQnLCBmYWxzZSkpO1xuICAgIHRoaXMuc2V0UXVhbGl0eUZvcm1Db25maWcoXy5nZXQodGhpcy5fZWRpdG9yQ29uZmlnLCAnY29uZmlnLnF1YWxpdHlGb3JtQ29uZmlnJywgbnVsbCkpO1xuICAgIHRoaXMuc2V0SXNSZXZpZXdlclF1YWxpdHlDaGVja0VuYWJsZWQoXy5nZXQodGhpcy5fZWRpdG9yQ29uZmlnLCAnY29uZmlnLmlzUmV2aWV3ZXJRdWFsaXR5Q2hlY2tFbmFibGVkJywgZmFsc2UpKTtcbiAgfVxuXG4gIHNldCBzZWxlY3RlZENoaWxkcmVuKHZhbHVlOiBTZWxlY3RlZENoaWxkcmVuKSB7XG4gICAgaWYgKHZhbHVlLm1pbWVUeXBlKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZENoaWxkcmVuLm1pbWVUeXBlID0gdmFsdWUubWltZVR5cGU7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5wcmltYXJ5Q2F0ZWdvcnkpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkQ2hpbGRyZW4ucHJpbWFyeUNhdGVnb3J5ID0gdmFsdWUucHJpbWFyeUNhdGVnb3J5O1xuICAgIH1cbiAgICBpZiAodmFsdWUuaW50ZXJhY3Rpb25UeXBlKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZENoaWxkcmVuLmludGVyYWN0aW9uVHlwZSA9IHZhbHVlLmludGVyYWN0aW9uVHlwZTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRDaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRDaGlsZHJlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZWRpdG9yQ29uZmlnKCk6IElFZGl0b3JDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9lZGl0b3JDb25maWc7XG4gIH1cblxuICBnZXQgZWRpdG9yTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWRpdG9yTW9kZTtcbiAgfVxuXG4gIGdldCBpc1Jldmlld2VyRWRpdEVuYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZXZpZXdlckVkaXRFbmFibGU7XG4gIH1cblxuICBwcml2YXRlIHNldElzUmV2aWV3ZXJFZGl0RW5hYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmV2aWV3ZXJFZGl0RW5hYmxlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgaXNSZXZpZXdNb2RpZmljYXRpb25BbGxvd2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Jldmlld01vZGlmaWNhdGlvbkFsbG93ZWQ7XG4gIH1cblxuICBzZXRJc1Jldmlld01vZGlmaWNhdGlvbkFsbG93ZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZXZpZXdNb2RpZmljYXRpb25BbGxvd2VkID0gdmFsdWU7XG4gIH1cblxuICBnZXQgY29udGVudFBvbGljeVVybCgpIHtcbiAgICBjb25zdCB1cmwgPSBfLmdldCh0aGlzLmVkaXRvckNvbmZpZywgJ2NvbmZpZy5jb250ZW50UG9saWN5VXJsJyk7XG4gICAgcmV0dXJuIHVybCA/IHVybCA6IHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuQ29udGVudFBvbGljeVVybDtcbiAgfVxuXG4gIGdldFRvb2xiYXJDb25maWcoKSB7XG4gICAgcmV0dXJuIF8uY2xvbmVEZWVwKF8ubWVyZ2UodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLmJ1dHRvbl9sYWJlbHMsIF8uZ2V0KHRoaXMuZWRpdG9yQ29uZmlnLCAnY29udGV4dC5sYWJlbHMnKSkpO1xuICB9XG5cbiAgZW1pdHNob3dMaWJyYXJ5UGFnZUV2ZW50KHBhZ2UpIHtcbiAgICB0aGlzLnNob3dMaWJyYXJ5UGFnZS5lbWl0KHBhZ2UpO1xuICB9XG4gIGdldHNob3dMaWJyYXJ5UGFnZUVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0xpYnJhcnlQYWdlO1xuICB9XG5cbiAgZ2V0UXVlc3Rpb25MaXN0KHF1ZXN0aW9uSWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3Qgb3B0aW9uID0ge1xuICAgICAgdXJsOiBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UudXJsQ29uRmlnLCAnVVJMUy5RVUVTVElPTi5MSVNUJyksXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBzZWFyY2g6IHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IHF1ZXN0aW9uSWRzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5wb3N0KG9wdGlvbikucGlwZShtYXAoZGF0YSA9PiBfLmdldChkYXRhLCAncmVzdWx0JykpKTtcbiAgfVxuXG4gIGZldGNoQ29sbGVjdGlvbkhpZXJhcmNoeShjb2xsZWN0aW9uSWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuVVJMU1t0aGlzLmVkaXRvckNvbmZpZy5jb25maWcub2JqZWN0VHlwZV07XG4gICAgY29uc3QgaGllcmFyY2h5VXJsID0gYCR7dXJsLkhJRVJBUkNIWV9SRUFEfS8ke2NvbGxlY3Rpb25JZH1gO1xuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIHVybDogaGllcmFyY2h5VXJsLFxuICAgICAgcGFyYW06IHsgbW9kZTogJ2VkaXQnIH1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLmdldChyZXEpO1xuICB9XG5cbiAgcmVhZFF1ZXN0aW9uU2V0KHF1ZXN0aW9uU2V0SWQsIG9wdGlvbjogYW55ID0geyBwYXJhbXM6IHt9IH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuVVJMU1t0aGlzLmVkaXRvckNvbmZpZy5jb25maWcub2JqZWN0VHlwZV07XG4gICAgY29uc3QgcGFyYW0gPSB7XG4gICAgICBtb2RlOiAnZWRpdCcsXG4gICAgICBmaWVsZHM6IHVybC5ERUZBVUxUX1BBUkFNU19GSUVMRFNcbiAgICB9O1xuICAgIGNvbnN0IGhpZXJhcmNoeVVybCA9IGAke3VybC5SRUFEfS8ke3F1ZXN0aW9uU2V0SWR9YDtcbiAgICBjb25zdCByZXEgPSB7XG4gICAgICB1cmw6IGhpZXJhcmNoeVVybCxcbiAgICAgIHBhcmFtOiB7IC4uLnBhcmFtLCAuLi5vcHRpb24ucGFyYW1zIH1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLmdldChyZXEpO1xuICB9XG5cbiAgZmV0Y2hDb250ZW50RGV0YWlscyhjb250ZW50SWQpIHtcbiAgICBjb25zdCByZXEgPSB7XG4gICAgICB1cmw6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcsICdVUkxTLkNPTlRFTlQuUkVBRCcpICsgY29udGVudElkXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5wdWJsaWNEYXRhU2VydmljZS5nZXQocmVxKTtcbiAgfVxuXG4gIHVwZGF0ZUhpZXJhcmNoeSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuVVJMU1t0aGlzLmVkaXRvckNvbmZpZy5jb25maWcub2JqZWN0VHlwZV07XG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgdXJsOiB1cmwuSElFUkFSQ0hZX1VQREFURSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIC4uLnRoaXMuZ2V0Q29sbGVjdGlvbkhpZXJhcmNoeSgpLFxuICAgICAgICAgICAgLi4ue2xhc3RVcGRhdGVkQnk6IF8uZ2V0KHRoaXMuZWRpdG9yQ29uZmlnLCAnY29udGV4dC51c2VyLmlkJyl9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5wdWJsaWNEYXRhU2VydmljZS5wYXRjaChyZXEpO1xuICB9XG5cbiAgZ2V0RmllbGRzVG9VcGRhdGUoY29sbGVjdGlvbklkKSB7XG4gICAgbGV0IGZvcm1GaWVsZHMgPSB7fTtcbiAgICBjb25zdCBlZGl0YWJsZUZpZWxkcyA9IF8uZ2V0KHRoaXMuZWRpdG9yQ29uZmlnLmNvbmZpZywgJ2VkaXRhYmxlRmllbGRzJyk7XG4gICAgaWYgKGVkaXRhYmxlRmllbGRzICYmICFfLmlzRW1wdHkoZWRpdGFibGVGaWVsZHNbdGhpcy5lZGl0b3JNb2RlXSkpIHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IGVkaXRhYmxlRmllbGRzW3RoaXMuZWRpdG9yTW9kZV07XG4gICAgICBjb25zdCBub2Rlc01vZGlmaWVkID0gXy5nZXQodGhpcy5nZXRDb2xsZWN0aW9uSGllcmFyY2h5KCksICdub2Rlc01vZGlmaWVkJyk7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uRm9ybURhdGEgPSBfLmdldChub2Rlc01vZGlmaWVkW2NvbGxlY3Rpb25JZF0sICdtZXRhZGF0YScpO1xuICAgICAgXy5mb3JFYWNoKGZpZWxkcywgZmllbGRDb2RlID0+IHtcbiAgICAgICAgZm9ybUZpZWxkc1tmaWVsZENvZGVdID0gY29sbGVjdGlvbkZvcm1EYXRhW2ZpZWxkQ29kZV07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1GaWVsZHM7XG4gIH1cblxuICB1cGRhdGVDb2xsZWN0aW9uKGNvbGxlY3Rpb25JZCwgZGF0YT8pIHtcbiAgICBsZXQgb2JqVHlwZSA9IHRoaXMuY29uZmlnU2VydmljZS5jYXRlZ29yeUNvbmZpZ1t0aGlzLmVkaXRvckNvbmZpZy5jb25maWcub2JqZWN0VHlwZV07XG4gICAgb2JqVHlwZSA9IG9ialR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmNvbmZpZ1NlcnZpY2UudXJsQ29uRmlnLlVSTFNbdGhpcy5lZGl0b3JDb25maWcuY29uZmlnLm9iamVjdFR5cGVdO1xuICAgIGNvbnN0IGZpZWxkc09iaiA9IHRoaXMuZ2V0RmllbGRzVG9VcGRhdGUoY29sbGVjdGlvbklkKTtcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgW29ialR5cGVdOiB7XG4gICAgICAgICAgLi4uZmllbGRzT2JqLFxuICAgICAgICAgIGxhc3RQdWJsaXNoZWRCeTogdGhpcy5lZGl0b3JDb25maWcuY29udGV4dC51c2VyLmlkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHB1Ymxpc2hEYXRhID0gIF8uZ2V0KGRhdGEsICdwdWJsaXNoRGF0YScpO1xuICAgIGlmKHB1Ymxpc2hEYXRhKSB7IFxuICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0W29ialR5cGVdID0geyAuLi5yZXF1ZXN0Qm9keS5yZXF1ZXN0W29ialR5cGVdLCAuLi5wdWJsaXNoRGF0YSB9O1xuICAgIH1cbiAgICBjb25zdCBvcHRpb24gPSB7XG4gICAgICB1cmw6IGAke3VybC5TWVNZVEVNX1VQREFURX0ke2NvbGxlY3Rpb25JZH1gLFxuICAgICAgZGF0YTogcmVxdWVzdEJvZHlcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLnBhdGNoKG9wdGlvbik7XG4gIH1cblxuICByZXZpZXdDb250ZW50KGNvbnRlbnRJZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IG9ialR5cGUgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuY2F0ZWdvcnlDb25maWdbdGhpcy5lZGl0b3JDb25maWcuY29uZmlnLm9iamVjdFR5cGVdO1xuICAgIG9ialR5cGUgPSBvYmpUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdXJsID0gdGhpcy5jb25maWdTZXJ2aWNlLnVybENvbkZpZy5VUkxTW3RoaXMuZWRpdG9yQ29uZmlnLmNvbmZpZy5vYmplY3RUeXBlXTtcbiAgICBjb25zdCBvcHRpb24gPSB7XG4gICAgICB1cmw6IHVybC5DT05URU5UX1JFVklFVyArIGNvbnRlbnRJZCxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIFtvYmpUeXBlXToge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMucHVibGljRGF0YVNlcnZpY2UucG9zdChvcHRpb24pO1xuICB9XG5cbiAgc3VibWl0UmVxdWVzdENoYW5nZXMoY29udGVudElkLCBjb21tZW50KSB7XG4gICAgbGV0IG9ialR5cGUgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuY2F0ZWdvcnlDb25maWdbdGhpcy5lZGl0b3JDb25maWcuY29uZmlnLm9iamVjdFR5cGVdO1xuICAgIG9ialR5cGUgPSBvYmpUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdXJsID0gdGhpcy5jb25maWdTZXJ2aWNlLnVybENvbkZpZy5VUkxTW3RoaXMuZWRpdG9yQ29uZmlnLmNvbmZpZy5vYmplY3RUeXBlXTtcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgW29ialR5cGVdOiB7XG4gICAgICAgICAgcmVqZWN0Q29tbWVudDogXy50cmltKGNvbW1lbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IG9wdGlvbiA9IHtcbiAgICAgIHVybDogYCR7dXJsLkNPTlRFTlRfUkVKRUNUfSR7Y29udGVudElkfWAsXG4gICAgICBkYXRhOiByZXF1ZXN0Qm9keVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMucHVibGljRGF0YVNlcnZpY2UucG9zdChvcHRpb24pO1xuICB9XG5cbiAgcHVibGlzaENvbnRlbnQoY29udGVudElkLCBldmVudCkge1xuICAgIGxldCBvYmpUeXBlID0gdGhpcy5jb25maWdTZXJ2aWNlLmNhdGVnb3J5Q29uZmlnW3RoaXMuZWRpdG9yQ29uZmlnLmNvbmZpZy5vYmplY3RUeXBlXTtcbiAgICBvYmpUeXBlID0gb2JqVHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuVVJMU1t0aGlzLmVkaXRvckNvbmZpZy5jb25maWcub2JqZWN0VHlwZV07XG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIFtvYmpUeXBlXToge1xuICAgICAgICAgIGxhc3RQdWJsaXNoZWRCeTogdGhpcy5lZGl0b3JDb25maWcuY29udGV4dC51c2VyLmlkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgY29uc3QgcHVibGlzaERhdGEgPSAgXy5nZXQoZXZlbnQsICdwdWJsaXNoRGF0YScpO1xuICAgaWYocHVibGlzaERhdGEpIHsgXG4gICAgcmVxdWVzdEJvZHkucmVxdWVzdFtvYmpUeXBlXSA9IHsgLi4ucmVxdWVzdEJvZHkucmVxdWVzdFtvYmpUeXBlXSwgLi4ucHVibGlzaERhdGEgfTtcbiAgIH0gXG4gICAgY29uc3Qgb3B0aW9uID0ge1xuICAgICAgdXJsOiBgJHt1cmwuQ09OVEVOVF9QVUJMSVNIfSR7Y29udGVudElkfWAsXG4gICAgICBkYXRhOiByZXF1ZXN0Qm9keVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMucHVibGljRGF0YVNlcnZpY2UucG9zdChvcHRpb24pO1xuICB9XG5cbiAgYWRkUmVzb3VyY2VUb0hpZXJhcmNoeShjb2xsZWN0aW9uLCB1bml0SWRlbnRpZmllciwgY29udGVudElkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCByZXEgPSB7XG4gICAgICB1cmw6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcsICdVUkxTLkNPTlRFTlQuSElFUkFSQ0hZX0FERCcpLFxuICAgICAgZGF0YToge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgcm9vdElkOiBjb2xsZWN0aW9uLFxuICAgICAgICAgIHVuaXRJZDogdW5pdElkZW50aWZpZXIsXG4gICAgICAgICAgY2hpbGRyZW46IFtjb250ZW50SWRdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLnBhdGNoKHJlcSk7XG4gIH1cblxuICBhZGRSZXNvdXJjZVRvUXVlc3Rpb25zZXQoY29sbGVjdGlvbiwgdW5pdElkZW50aWZpZXIsIGNvbnRlbnRJZCkge1xuICAgIGNvbnN0IGNoaWxkcmVuOiBhbnlbXSA9IF8uaXNBcnJheShjb250ZW50SWQpID8gY29udGVudElkIDogW2NvbnRlbnRJZF07XG4gICAgbGV0IHJlcSA9IHtcbiAgICAgIHVybDogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLnVybENvbkZpZywgJ1VSTFMuUXVlc3Rpb25TZXQuQUREJyksXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBxdWVzdGlvbnNldDoge1xuICAgICAgICAgICAgcm9vdElkOiBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgY29sbGVjdGlvbklkOiB1bml0SWRlbnRpZmllcixcbiAgICAgICAgICAgIGNoaWxkcmVuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoY29sbGVjdGlvbiA9PT0gdW5pdElkZW50aWZpZXIpIHtcbiAgICAgIHJlcSA9IF8ub21pdChyZXEsICdkYXRhLnJlcXVlc3QucXVlc3Rpb25zZXQuY29sbGVjdGlvbklkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLnBhdGNoKHJlcSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UXVlc3Rpb25TdHJlYW0kKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uU3RyZWFtJDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnF1ZXN0aW9uU3RyZWFtJC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIHNldFF1ZXN0aW9uSWRzKGNoaWxkcmVucykge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGZvciAoY29uc3QgY2hpbGRyZW4gb2YgY2hpbGRyZW5zKSB7XG4gICAgICBpZiAoY2hpbGRyZW4uZGF0YS5vYmplY3RUeXBlID09PSAnUXVlc3Rpb25TZXQnKSB7XG4gICAgICAgIGxldCBxdWVzdGlvbkNvdW50ID0gMDtcbiAgICAgICAgaWYgKGNoaWxkcmVuPy5kYXRhPy5tZXRhZGF0YT8ubWF4UXVlc3Rpb25zICYmIChjaGlsZHJlbj8uZGF0YT8ubWV0YWRhdGE/Lm1heFF1ZXN0aW9ucyA8IGNoaWxkcmVuPy5jaGlsZHJlbj8ubGVuZ3RoKSkge1xuICAgICAgICAgIHF1ZXN0aW9uQ291bnQgPSBjaGlsZHJlbi5kYXRhLm1ldGFkYXRhLm1heFF1ZXN0aW9ucztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVzdGlvbkNvdW50ID0gY2hpbGRyZW4/LmNoaWxkcmVuID9cbiAgICAgICAgICBjaGlsZHJlbj8uY2hpbGRyZW4/Lmxlbmd0aCA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXN0aW9uQ291bnQgPiAwKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVzdGlvbkNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGlmICghXy5pc0VtcHR5KGNoaWxkcmVuLCAnY2hpbGRyZW4nKSkge1xuICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4uY2hpbGRyZW5baV0uZGF0YS5vYmplY3RUeXBlID09PSAnUXVlc3Rpb25TZXQnKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5zZXRRdWVzdGlvbklkcyhbY2hpbGRyZW4uY2hpbGRyZW5baV1dKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIV8uaW5jbHVkZXModGhpcy5xdWVzdGlvbklkcywgY2hpbGRyZW4uY2hpbGRyZW5baV0uZGF0YS5pZCkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25JZHMucHVzaChjaGlsZHJlbi5jaGlsZHJlbltpXS5kYXRhLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRNYXhTY29yZSgpIHtcbiAgICBsZXQgbWF4U2NvcmUgPSAwO1xuICAgIGxldCByb290Tm9kZSA9IFtdO1xuICAgIHRoaXMucXVlc3Rpb25JZHMgPSBbXTtcbiAgICBjb25zdCByb290Tm9kZURhdGEgPSB0aGlzLnRyZWVTZXJ2aWNlLmdldEZpcnN0Q2hpbGQoKTtcbiAgICBpZiAocm9vdE5vZGVEYXRhLmNoaWxkcmVuKSB7XG4gICAgICByb290Tm9kZSA9IFtyb290Tm9kZURhdGFdO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShyb290Tm9kZSkpIHtcbiAgICAgIHRoaXMuc2V0UXVlc3Rpb25JZHMocm9vdE5vZGUpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLnF1ZXN0aW9uSWRzKSkge1xuICAgICAgY29uc3QgeyBxdWVzdGlvbnMgfSA9ICBhd2FpdCB0aGlzLmdldFF1ZXN0aW9uTGlzdCh0aGlzLnF1ZXN0aW9uSWRzKS50b1Byb21pc2UoKTtcbiAgICAgIG1heFNjb3JlID0gdGhpcy5jYWxjdWxhdGVNYXhTY29yZShxdWVzdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gbWF4U2NvcmU7XG4gIH1cblxuICBjYWxjdWxhdGVNYXhTY29yZShxdWVzdGlvbnM6IEFycmF5PGFueT4pIHtcbiAgIHJldHVybiBfLnJlZHVjZShxdWVzdGlvbnMsIChzdW0sIHF1ZXN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0Tm9kZUJ5SWQocXVlc3Rpb24uaWRlbnRpZmllcik7XG4gICAgICBpZiAoXy5oYXMobm9kZURhdGEucGFyZW50LmRhdGEubWV0YWRhdGEsICdzaHVmZmxlJykgJiYgbm9kZURhdGEucGFyZW50LmRhdGEubWV0YWRhdGEuc2h1ZmZsZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gc3VtICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdW0gKyAocXVlc3Rpb24/LnJlc3BvbnNlRGVjbGFyYXRpb24/LnJlc3BvbnNlMT8ubWF4U2NvcmUgPyBfLmdldChxdWVzdGlvbiwgJ3Jlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLm1heFNjb3JlJykgOiAwKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIGdldENvbGxlY3Rpb25IaWVyYXJjaHkoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzO1xuICAgIHRoaXMuZGF0YSA9IHt9O1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnRyZWVTZXJ2aWNlLmdldEZpcnN0Q2hpbGQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZXNNb2RpZmllZDogdGhpcy50cmVlU2VydmljZS50cmVlQ2FjaGUubm9kZXNNb2RpZmllZCxcbiAgICAgIGhpZXJhcmNoeTogaW5zdGFuY2UuX3RvRmxhdE9iaihkYXRhKVxuICAgIH07XG4gIH1cblxuICBfdG9GbGF0T2JqKGRhdGEsIHF1ZXN0aW9uSWQ/LCBzZWxlY3RVbml0SWQ/KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzO1xuICAgIGlmIChkYXRhICYmIGRhdGEuZGF0YSkge1xuICAgICAgaW5zdGFuY2UuZGF0YVtkYXRhLmRhdGEuaWRdID0ge1xuICAgICAgICBuYW1lOiBkYXRhLnRpdGxlLFxuICAgICAgICBjaGlsZHJlbjogXy5tYXAoZGF0YS5jaGlsZHJlbiwgKGNoaWxkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkLmRhdGEuaWQ7XG4gICAgICAgIH0pLFxuICAgICAgICByb290OiBkYXRhLmRhdGEucm9vdFxuICAgICAgfTtcbiAgICAgIGlmIChxdWVzdGlvbklkICYmIHNlbGVjdFVuaXRJZCAmJiBzZWxlY3RVbml0SWQgPT09IGRhdGEuZGF0YS5pZCkge1xuICAgICAgICAgIGluc3RhbmNlLmRhdGFbZGF0YS5kYXRhLmlkXS5jaGlsZHJlbi5wdXNoKHF1ZXN0aW9uSWQpO1xuICAgICAgfVxuICAgICAgaWYgKHF1ZXN0aW9uSWQgJiYgc2VsZWN0VW5pdElkICYmIGRhdGEuZm9sZGVyID09PSBmYWxzZSkge1xuICAgICAgICAgIGRlbGV0ZSBpbnN0YW5jZS5kYXRhW2RhdGEuZGF0YS5pZF07XG4gICAgICB9XG4gICAgICBfLmZvckVhY2goZGF0YS5jaGlsZHJlbiwgKGNvbGxlY3Rpb24pID0+IHtcbiAgICAgICAgaW5zdGFuY2UuX3RvRmxhdE9iaihjb2xsZWN0aW9uLCBxdWVzdGlvbklkLCBzZWxlY3RVbml0SWQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZS5kYXRhO1xuICB9XG5cbiAgZ2V0SGllcmFyY2h5T2JqKGRhdGEsIHF1ZXN0aW9uSWQ/LCBzZWxlY3RVbml0SWQ/LCBwYXJlbnRJZGVudGlmaWVyPykge1xuICAgIHJldHVybiB0aGlzLl90b0ZsYXRPYmooZGF0YSwgcXVlc3Rpb25JZCwgc2VsZWN0VW5pdElkKTtcbiAgfVxuXG4gX3RvRmxhdE9iakZyb21IaWVyYXJjaHkoZGF0YSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcztcbiAgICBpZiAoZGF0YSAmJiBkYXRhLmNoaWxkcmVuKSB7XG4gICAgICBpbnN0YW5jZS5kYXRhW2RhdGEuaWRlbnRpZmllcl0gPSB7XG4gICAgICAgIG5hbWU6IGRhdGEubmFtZSxcbiAgICAgICAgY2hpbGRyZW46IF8ubWFwKGRhdGEuY2hpbGRyZW4sIChjaGlsZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBjaGlsZC5pZGVudGlmaWVyO1xuICAgICAgICB9KSxcbiAgICAgICAgYnJhbmNoaW5nTG9naWM6IGRhdGEuYnJhbmNoaW5nTG9naWNcbiAgICAgIH07XG4gICAgICBfLmZvckVhY2goZGF0YS5jaGlsZHJlbiwgKGNvbGxlY3Rpb24pID0+IHtcbiAgICAgICAgaW5zdGFuY2UuX3RvRmxhdE9iakZyb21IaWVyYXJjaHkoY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlLmRhdGE7XG4gIH1cblxuICBnZXRSZWxhdGlvbmFsTWV0YWRhdGFPYmooZGF0YSkge1xuICAgIGxldCByZWxhdGlvbmFsTWV0YWRhdGEgPSB7fTtcbiAgICBfLmZvckVhY2goZGF0YSwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoXy5nZXQoY2hpbGQsICdkYXRhLm1ldGFkYXRhLnJlbGF0aW9uYWxNZXRhZGF0YScpKSB7XG4gICAgICAgIHJlbGF0aW9uYWxNZXRhZGF0YSA9IHtcbiAgICAgICAgICAuLi5yZWxhdGlvbmFsTWV0YWRhdGEsXG4gICAgICAgICAgW2NoaWxkLmRhdGEuaWRdOiBfLmdldChjaGlsZCwgJ2RhdGEubWV0YWRhdGEucmVsYXRpb25hbE1ldGFkYXRhJylcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVsYXRpb25hbE1ldGFkYXRhO1xuICB9XG5cbiAgZ2V0Q2F0ZWdvcnlEZWZpbml0aW9uKGNhdGVnb3J5TmFtZSwgY2hhbm5lbCwgb2JqZWN0VHlwZT86IGFueSkge1xuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIHVybDogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLnVybENvbkZpZywgJ1VSTFMuZ2V0Q2F0ZWdvcnlEZWZpbml0aW9uJyksXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBvYmplY3RDYXRlZ29yeURlZmluaXRpb246IHtcbiAgICAgICAgICAgICAgb2JqZWN0VHlwZTogb2JqZWN0VHlwZSA/IG9iamVjdFR5cGUgOiAnQ29udGVudCcsXG4gICAgICAgICAgICAgIG5hbWU6IGNhdGVnb3J5TmFtZSxcbiAgICAgICAgICAgICAgLi4uKGNoYW5uZWwgJiYgeyBjaGFubmVsIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMucHVibGljRGF0YVNlcnZpY2UucG9zdChyZXEpO1xuICB9XG4gIGZldGNoQ29udGVudExpc3REZXRhaWxzKHJlcSkge1xuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLnBvc3QocmVxKTtcbiAgfVxuICBzb3J0KGEsIGIsIGNvbHVtbikge1xuICAgIGlmICghdGhpcy5pc05vdEVtcHR5KGEsIGNvbHVtbikgfHwgIXRoaXMuaXNOb3RFbXB0eShiLCBjb2x1bW4pKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgbGV0IGFDb2x1bW4gPSBhW2NvbHVtbl07XG4gICAgbGV0IGJDb2x1bW4gPSBiW2NvbHVtbl07XG4gICAgaWYgKF8uaXNBcnJheShhQ29sdW1uKSkge1xuICAgICAgYUNvbHVtbiA9IF8uam9pbihhQ29sdW1uLCAnLCAnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNBcnJheShiQ29sdW1uKSkge1xuICAgICAgYkNvbHVtbiA9IF8uam9pbihiQ29sdW1uLCAnLCAnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNOdW1iZXIoYUNvbHVtbikpIHtcbiAgICBhQ29sdW1uID0gXy50b1N0cmluZyhhQ29sdW1uKTtcbiAgICB9XG4gICAgaWYgKF8uaXNOdW1iZXIoYkNvbHVtbikpIHtcbiAgICBiQ29sdW1uID0gXy50b1N0cmluZyhiQ29sdW1uKTtcbiAgICB9XG4gICAgcmV0dXJuIGJDb2x1bW4ubG9jYWxlQ29tcGFyZShhQ29sdW1uKTtcbiAgfVxuICBpc05vdEVtcHR5KG9iaiwga2V5KSB7XG4gICAgaWYgKF8uaXNOaWwob2JqKSB8fCBfLmlzTmlsKG9ialtrZXldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgIH1cblxuICAgYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVycm9ySW5mbykge1xuICAgIGlmIChfLmdldChlcnIsICdlcnJvci5wYXJhbXMuZXJybXNnJykgfHwgZXJyb3JJbmZvLmVycm9yTXNnKSB7XG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KGVyciwgJ2Vycm9yLnBhcmFtcy5lcnJtc2cnKSB8fCBlcnJvckluZm8uZXJyb3JNc2cpO1xuICAgIH1cbiAgICBjb25zdCB0ZWxlbWV0cnlFcnJvckRhdGEgPSB7XG4gICAgICAgIGVycjogXy50b1N0cmluZyhlcnIuc3RhdHVzKSxcbiAgICAgICAgZXJydHlwZTogJ1NZU1RFTScsXG4gICAgICAgIHN0YWNrdHJhY2U6IEpTT04uc3RyaW5naWZ5KHtyZXNwb25zZTogXy5waWNrKGVyciwgWydlcnJvcicsICd1cmwnXSksIHJlcXVlc3Q6IF8uZ2V0KGVycm9ySW5mbywgJ3JlcXVlc3QnKX0pIHx8IGVycm9ySW5mby5lcnJvck1zZyxcbiAgICAgICAgcGFnZWlkOiB0aGlzLnRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkXG4gICAgfTtcbiAgICB0aGlzLnRlbGVtZXRyeVNlcnZpY2UuZXJyb3IodGVsZW1ldHJ5RXJyb3JEYXRhKTtcbiAgfVxuICAvLyB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCBhbGwgdGhlIGNvbnRlbnRzIGluIGNvdXJzZS9xdWVzdGlvbiBpbnNpZGUgZXZlcnkgbW9kdWxlIGFuZCBzdWIgbW9kdWxlXG4gIGdldENvbnRlbnRDaGlsZHJlbnMoYWN0aXZlTm9kZT8pIHtcbiAgICBsZXQgdHJlZU9iaiA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0VHJlZU9iamVjdCgpO1xuICAgIGNvbnN0IGNvbnRlbnRzID0gW107XG4gICAgaWYgKGFjdGl2ZU5vZGUpIHsgdHJlZU9iaiA9IGFjdGl2ZU5vZGU7IH1cbiAgICB0cmVlT2JqLnZpc2l0KChub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZS5mb2xkZXIgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRlbnRzLnB1c2gobm9kZS5kYXRhLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29udGVudHM7XG4gIH1cbiAgLy8gdGhpcyBtZXRob2QgaXMgdXNlZCB0byBrZWVwIGNvdW50IG9mIGNvbnRlbnRzIGFkZGVkIGZyb20gbGlicmFyeSBwYWdlXG4gIGNvbnRlbnRzQ291bnRBZGRlZEluTGlicmFyeVBhZ2Uoc2V0VG9aZXJvPykge1xuICAgIGlmIChzZXRUb1plcm8pIHtcbiAgICAgIHRoaXMuY29udGVudHNDb3VudCA9IDA7IC8vIHNldHRpbmcgdGhpcyBjb3VudCB0byB6ZXJvICB3aGlsZSBnb2luZyBvdXQgZnJvbSBsaWJyYXJ5IHBhZ2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZW50c0NvdW50ID0gdGhpcy5jb250ZW50c0NvdW50ICsgMTtcbiAgICB9XG4gIH1cbiAgY2hlY2tJZkNvbnRlbnRzQ2FuYmVBZGRlZCgpIHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBlcnJvck1lc3NhZ2U6ICcnLFxuICAgICAgbWF4TGltaXQ6IDBcbiAgICB9O1xuICAgIGlmIChfLmdldCh0aGlzLmVkaXRvckNvbmZpZywgJ2NvbmZpZy5vYmplY3RUeXBlJykgPT09ICdRdWVzdGlvblNldCcpIHtcbiAgICAgIGNvbmZpZy5lcnJvck1lc3NhZ2UgPSBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMzEnKTtcbiAgICAgIGNvbmZpZy5tYXhMaW1pdCA9IF8uZ2V0KHRoaXMuZWRpdG9yQ29uZmlnLCAnY29uZmlnLnF1ZXN0aW9uU2V0Lm1heFF1ZXN0aW9uc0xpbWl0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZy5lcnJvck1lc3NhZ2UgPSBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMzInKTtcbiAgICAgIGNvbmZpZy5tYXhMaW1pdCA9IF8uZ2V0KHRoaXMuZWRpdG9yQ29uZmlnLCAnY29uZmlnLmNvbGxlY3Rpb24ubWF4Q29udGVudHNMaW1pdCcpO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbkNvdW50ID0gdGhpcy5nZXRDb250ZW50Q2hpbGRyZW5zKCkubGVuZ3RoICsgdGhpcy5jb250ZW50c0NvdW50O1xuICAgIGlmIChjaGlsZHJlbkNvdW50ID49IGNvbmZpZy5tYXhMaW1pdCkge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihjb25maWcuZXJyb3JNZXNzYWdlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIGdldEhpZXJhcmNoeUZvbGRlcigpIHtcbiAgICBjb25zdCB0cmVlT2JqID0gdGhpcy50cmVlU2VydmljZS5nZXRUcmVlT2JqZWN0KCk7XG4gICAgY29uc3QgY29udGVudHMgPSBbXTtcbiAgICBpZiAodHJlZU9iaikge1xuICAgIHRyZWVPYmoudmlzaXQoKG5vZGUpID0+IHtcbiAgICAgIGlmIChub2RlICYmICFub2RlLmRhdGEucm9vdCkge1xuICAgICAgICBjb250ZW50cy5wdXNoKG5vZGUuZGF0YS5pZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgICByZXR1cm4gY29udGVudHM7XG4gIH1cbiAgdmFsaWRhdGVDU1ZGaWxlKGZvcm1EYXRhLCBjb2xsZWN0aW9ubklkOiBhbnkpIHtcbiAgICBjb25zdCB1cmwgPSBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UudXJsQ29uRmlnLCAnVVJMUy5DU1YuVVBMT0FEJyk7XG4gICAgY29uc3QgcmVxUGFyYW0gPSB7XG4gICAgICB1cmw6IGAke3VybH0ke2NvbGxlY3Rpb25uSWR9YCxcbiAgICAgIGRhdGE6IGZvcm1EYXRhLmRhdGFcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLnBvc3QocmVxUGFyYW0pO1xuICB9XG4gIGRvd25sb2FkSGllcmFyY2h5Q3N2KGNvbGxlY3Rpb25JZCkge1xuICAgIGNvbnN0IHVybCA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcsICdVUkxTLkNTVi5ET1dOTE9BRCcpO1xuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIHVybDogYCR7dXJsfSR7Y29sbGVjdGlvbklkfWAsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5wdWJsaWNEYXRhU2VydmljZS5nZXQocmVxKTtcbiAgfVxuICBnZW5lcmF0ZVByZVNpZ25lZFVybChyZXEsIGNvbnRlbnRJZDogYW55LCB0eXBlKSB7XG4gICAgY29uc3QgcmVxUGFyYW0gPSB7XG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuVVJMUy5DT05URU5ULlVQTE9BRF9VUkx9JHtjb250ZW50SWR9P3R5cGU9JHt0eXBlfWAsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlcXVlc3Q6IHJlcVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMucHVibGljRGF0YVNlcnZpY2UucG9zdChyZXFQYXJhbSk7XG4gIH1cbiAgZG93bmxvYWRCbG9iVXJsRmlsZShjb25maWcpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5odHRwQ2xpZW50LmdldChjb25maWcuYmxvYlVybCwge3Jlc3BvbnNlVHlwZTogJ2Jsb2InfSlcbiAgICAgIC5zdWJzY3JpYmUoYmxvYiA9PiB7XG4gICAgICAgIGNvbnN0IG9iamVjdFVybDogc3RyaW5nID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgY29uc3QgYTogSFRNTEFuY2hvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XG4gICAgICAgIGEuaHJlZiA9IG9iamVjdFVybDtcbiAgICAgICAgYS5kb3dubG9hZCA9IGNvbmZpZy5maWxlTmFtZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgICAgYS5jbGljaygpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCk7XG4gICAgICAgIGlmIChjb25maWcuc3VjY2Vzc01lc3NhZ2UpIHtcbiAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MoY29uZmlnLnN1Y2Nlc3NNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDM0JykgKyBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvciggXy5yZXBsYWNlKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAzMycpLCAne0ZJTEVfVFlQRX0nLCBjb25maWcuZmlsZVR5cGUgKSArIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZUNTVihjb25maWcpIHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSBjb25maWcudGFibGVEYXRhO1xuICAgIGRlbGV0ZSBjb25maWcudGFibGVEYXRhO1xuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgZmllbGRTZXBhcmF0b3I6ICcsJyxcbiAgICAgIHF1b3RlU3RyaW5nczogJ1wiJyxcbiAgICAgIGRlY2ltYWxTZXBhcmF0b3I6ICcuJyxcbiAgICAgIHNob3dMYWJlbHM6IHRydWUsXG4gICAgICB1c2VUZXh0RmlsZTogZmFsc2UsXG4gICAgICB1c2VCb206IHRydWUsXG4gICAgICBzaG93VGl0bGU6IHRydWUsXG4gICAgICB0aXRsZTogJycsXG4gICAgICBmaWxlbmFtZTogJycsXG4gICAgICBoZWFkZXJzOiBbXVxuICAgIH07XG4gICAgb3B0aW9ucyA9IF8ubWVyZ2Uob3B0aW9ucywgY29uZmlnKTtcbiAgICBjb25zdCBjc3ZFeHBvcnRlciA9IG5ldyBFeHBvcnRUb0NzdihvcHRpb25zKTtcbiAgICBjc3ZFeHBvcnRlci5nZW5lcmF0ZUNzdih0YWJsZURhdGEpO1xuICB9XG5cbiAgZ2V0QnJhbmNoaW5nTG9naWNCeUZvbGRlcihpZGVudGlmaWVyKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLnRyZWVTZXJ2aWNlLmdldE5vZGVCeUlkKGlkZW50aWZpZXIpO1xuICAgIGNvbnN0IGJyYW5jaGluZ0xvZ2ljID0gXy5nZXQobm9kZURhdGEsICdkYXRhLm1ldGFkYXRhLmJyYW5jaGluZ0xvZ2ljJyk7XG4gICAgcmV0dXJuIGJyYW5jaGluZ0xvZ2ljIHx8IHt9O1xuICB9XG5cbi8qKlxuICpcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSBpZGVudGlmaWVyIGlkZW50aWZpZXIgb2YgdGhlIG5vZGVcbiAqIEByZXR1cm5zIHsgc291cmNlOiBbXSwgdGFyZ2V0OiBbXSwgc291cmNlVGFyZ2V0PzogW10gfVxuICogQG1lbWJlcm9mIEVkaXRvclNlcnZpY2VcbiAqL1xuZ2V0RGVwZW5kZW50Tm9kZXMoaWRlbnRpZmllcikge1xuICAgIGNvbnN0IHNlY3Rpb25CcmFuY2hpbmdMb2dpYyA9IHRoaXMuZ2V0QnJhbmNoaW5nTG9naWNCeU5vZGVJZChpZGVudGlmaWVyKTtcblxuICAgIGlmICghXy5pc0VtcHR5KHNlY3Rpb25CcmFuY2hpbmdMb2dpYykpIHtcbiAgICAgY29uc3QgYnJhbmNoaW5nRW50cnkgPSB0aGlzLmdldEJyYW5jaGluZ0xvZ2ljRW50cnkoc2VjdGlvbkJyYW5jaGluZ0xvZ2ljLCBpZGVudGlmaWVyKTtcbiAgICAgY29uc3Qgc291cmNlID0gXy5nZXQoYnJhbmNoaW5nRW50cnksICdzb3VyY2UnKTtcbiAgICAgaWYgKCFfLmlzRW1wdHkoc291cmNlKSkgeyAvLyBpZiB0aGUgbm9kZSBpcyBhIGRlcGVuZGVudCBub2RlXG5cbiAgICAgICBjb25zdCBzb3VyY2VCcmFuY2hpbmdFbnRyeSA9IHRoaXMuZ2V0QnJhbmNoaW5nTG9naWNFbnRyeShzZWN0aW9uQnJhbmNoaW5nTG9naWMsIF8uZmlyc3QoYnJhbmNoaW5nRW50cnkuc291cmNlKSk7XG5cbiAgICAgICByZXR1cm4gIV8uaXNFbXB0eShzb3VyY2VCcmFuY2hpbmdFbnRyeSkgPyB7IHNvdXJjZTogYnJhbmNoaW5nRW50cnkuc291cmNlLCB0YXJnZXQ6IGJyYW5jaGluZ0VudHJ5LnRhcmdldCxcbiAgICAgICAgc291cmNlVGFyZ2V0OiBzb3VyY2VCcmFuY2hpbmdFbnRyeS50YXJnZXQgfSA6IHt9O1xuXG4gICAgIH0gZWxzZSB7IC8vIGlmIHRoZSBub2RlIGlzIGEgcGFyZW50IG5vZGVcbiAgICAgICByZXR1cm4gIV8uaXNFbXB0eShicmFuY2hpbmdFbnRyeSkgPyB7IHNvdXJjZTogYnJhbmNoaW5nRW50cnkuc291cmNlLCB0YXJnZXQ6IGJyYW5jaGluZ0VudHJ5LnRhcmdldCB9IDoge307XG4gICAgIH1cbiAgICB9XG4gIH1cblxuLyoqXG4gKlxuICogQHB1YmxpY1xuICogQHBhcmFtIGlkZW50aWZpZXIgaWRlbnRpZmllciBvZiB0aGUgbm9kZVxuICogQHJldHVybnMge1wiZG9faWRcIjogeyBcInRhcmdldFwiOiBbIFwiZG9faWQxMjNcIiwgXCJkb19pZDQ1NlwiIF0sIFwicHJlQ29uZGl0aW9uXCI6IHt9LCBcInNvdXJjZVwiOiBbXSB9fVxuICogQG1lbWJlcm9mIEVkaXRvclNlcnZpY2VcbiAqL1xuICBnZXRCcmFuY2hpbmdMb2dpY0J5Tm9kZUlkKGlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBsZWFmTm9kZSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0Tm9kZUJ5SWQoaWRlbnRpZmllcik7XG4gICAgY29uc3QgcGFyZW50SWRlbnRpZmllciA9IF8uZ2V0KGxlYWZOb2RlLCAncGFyZW50LmRhdGEuaWQnKTtcbiAgICByZXR1cm4gdGhpcy5nZXRCcmFuY2hpbmdMb2dpY0J5Rm9sZGVyKHBhcmVudElkZW50aWZpZXIpO1xuICB9XG5cbiAgZ2V0QnJhbmNoaW5nTG9naWNFbnRyeShwYXJlbnRCcmFuY2hpbmdMb2dpYywgaWRlbnRpZmllcikge1xuICAgIHJldHVybiBfLmZpbmQocGFyZW50QnJhbmNoaW5nTG9naWMsIChsb2dpYywga2V5KSA9PiB7XG4gICAgICByZXR1cm4ga2V5ID09PSBpZGVudGlmaWVyO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RmxhdHRlbmVkQnJhbmNoaW5nTG9naWMoZGF0YSkge1xuICAgIGNvbnN0IGZsYXRIaWVyYXJjaHkgPSB0aGlzLl90b0ZsYXRPYmpGcm9tSGllcmFyY2h5KGRhdGEpO1xuICAgIGNvbnN0IGJyYW5jaGluZ0xvZ2ljcyA9IF8uY29tcGFjdChfLm1hcChmbGF0SGllcmFyY2h5LCAnYnJhbmNoaW5nTG9naWMnKSk7XG4gICAgcmV0dXJuIF8ucmVkdWNlKGJyYW5jaGluZ0xvZ2ljcywgKGFjYywgdmFsKSA9PiB7XG4gICAgICByZXR1cm4gIF8uYXNzaWduKGFjYywgdmFsKTtcbiAgICB9LCB7fSk7XG4gIH1cblxuICBnZXRQYXJlbnREZXBlbmRlbnRNYXAoZGF0YSkge1xuICAgIGNvbnN0IGJyYW5jaGluZ0xvZ2ljID0gdGhpcy5nZXRGbGF0dGVuZWRCcmFuY2hpbmdMb2dpYyhkYXRhKTtcbiAgICBjb25zdCBvYmogPSB7fTtcbiAgICBfLmZvckVhY2goXy5rZXlzKGJyYW5jaGluZ0xvZ2ljKSwgaXRlbSA9PiB7XG4gICAgICBvYmpbaXRlbV0gPSAhXy5pc0VtcHR5KGJyYW5jaGluZ0xvZ2ljW2l0ZW1dLnNvdXJjZSkgPyAnZGVwZW5kZW50JyA6ICFfLmlzRW1wdHkoYnJhbmNoaW5nTG9naWNbaXRlbV0udGFyZ2V0KSA/ICdwYXJlbnQnIDogJyc7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGdldFByaW1hcnlDYXRlZ29yeU5hbWUoc2VjdGlvbklkKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLnRyZWVTZXJ2aWNlLmdldE5vZGVCeUlkKHNlY3Rpb25JZCk7XG4gICAgcmV0dXJuIF8uZ2V0KG5vZGVEYXRhLCAnZGF0YS5wcmltYXJ5Q2F0ZWdvcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmZXRjaCBPdXRjb21lIERlY2xhcmF0aW9uIGxldmVscyB1c2luZyB0aGUgcXVlc3Rpb25zZXRJZFxuICAgKiBvbmx5IGZvciBPYnNlcnZhdGlvbiB3aXRoIFJ1YnJpY3NcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgcXVlc3Rpb25zZXQgaWRlbnRpZmllclxuICAgKi9cbiAgIGZldGNoT3V0Q29tZURlY2xhcmF0aW9uKHF1ZXN0aW9uU2V0SWQsIG9wdGlvbjogYW55ID0geyBwYXJhbXM6IHt9IH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuVVJMU1t0aGlzLmVkaXRvckNvbmZpZy5jb25maWcub2JqZWN0VHlwZV07XG4gICAgY29uc3QgcGFyYW0gPSB7XG4gICAgICBmaWVsZHM6ICdvdXRjb21lRGVjbGFyYXRpb24nXG4gICAgfTtcbiAgICBjb25zdCBoaWVyYXJjaHlVcmwgPSBgJHt1cmwuUkVBRH0vJHtxdWVzdGlvblNldElkfWA7XG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgdXJsOiBoaWVyYXJjaHlVcmwsXG4gICAgICBwYXJhbTogeyAuLi5wYXJhbSwgLi4ub3B0aW9uLnBhcmFtcyB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5wdWJsaWNEYXRhU2VydmljZS5nZXQocmVxKTtcbiAgfVxuXG4gIGdldCBxdWFsaXR5Rm9ybUNvbmZpZygpe1xuICAgIHJldHVybiB0aGlzLl9xdWFsaXR5Rm9ybUNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgc2V0UXVhbGl0eUZvcm1Db25maWcodmFsdWU6IGFueSl7XG4gICAgcmV0dXJuIHRoaXMuX3F1YWxpdHlGb3JtQ29uZmlnID0gdmFsdWU7XG4gIH1cblxuICBnZXQgaXNSZXZpZXdlclF1YWxpdHlDaGVja0VuYWJsZWQoKXtcbiAgICByZXR1cm4gdGhpcy5faXNSZXZpZXdlclF1YWxpdHlDaGVja0VuYWJsZWQ7XG4gICAgfVxuICBcbiAgICBwcml2YXRlIHNldElzUmV2aWV3ZXJRdWFsaXR5Q2hlY2tFbmFibGVkKHZhbHVlOiBib29sZWFuKXtcbiAgICAgIHJldHVybiB0aGlzLl9pc1Jldmlld2VyUXVhbGl0eUNoZWNrRW5hYmxlZCA9IHZhbHVlO1xuICAgIH1cblxuICBhcHBlbmRDbG91ZFN0b3JhZ2VIZWFkZXJzKGNvbmZpZykge1xuICAgIGNvbnN0IGhlYWRlcnMgPSAgXy5nZXQodGhpcy5lZGl0b3JDb25maWcsICdjb250ZXh0LmNsb3VkU3RvcmFnZS5wcmVzaWduZWRfaGVhZGVycycsIHt9KTtcbiAgICBpZiAoIV8uaXNFbXB0eShoZWFkZXJzKSkge1xuICAgICAgY29uZmlnLmhlYWRlcnMgPSB7Li4uY29uZmlnLmhlYWRlcnMsIC4uLmhlYWRlcnN9O1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH1cbn1cbiJdfQ==