@openmrs/ngx-formentry 19.0.1-pre.489 → 19.0.1-pre.497

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 (208) hide show
  1. package/components/input/label.component.d.ts +1 -1
  2. package/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.d.ts +1 -1
  3. package/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.d.ts +1 -1
  4. package/components/number-input/number-input.component.d.ts +1 -1
  5. package/components/select/select.component.d.ts +1 -1
  6. package/fesm2022/openmrs-ngx-formentry.mjs +412 -380
  7. package/fesm2022/openmrs-ngx-formentry.mjs.map +1 -1
  8. package/form-entry/form-entry.module.d.ts +2 -2
  9. package/form-entry/form-factory/form.factory.d.ts +2 -2
  10. package/form-entry/helpers/js-expression-helper.d.ts +2 -2
  11. package/form-entry/services/form-schema-compiler.service.d.ts +2 -0
  12. package/form-entry/value-adapters/obs.adapter.d.ts +0 -1
  13. package/form-entry/value-adapters/person-attribute.adapter.d.ts +3 -3
  14. package/lib/index.d.ts +1 -1
  15. package/package.json +10 -12
  16. package/esm2022/abstract-controls-extension/afe-control-type.mjs +0 -8
  17. package/esm2022/abstract-controls-extension/afe-form-array.mjs +0 -89
  18. package/esm2022/abstract-controls-extension/afe-form-control.mjs +0 -91
  19. package/esm2022/abstract-controls-extension/afe-form-group.mjs +0 -66
  20. package/esm2022/abstract-controls-extension/control-extensions.mjs +0 -5
  21. package/esm2022/abstract-controls-extension/index.mjs +0 -5
  22. package/esm2022/abstract-controls-extension/value-change.listener.mjs +0 -2
  23. package/esm2022/change-tracking/control-relation.mjs +0 -44
  24. package/esm2022/change-tracking/control-relations.mjs +0 -32
  25. package/esm2022/components/afe-ng-select.component.mjs +0 -101
  26. package/esm2022/components/appointments-overview/appointments-overview.component.mjs +0 -116
  27. package/esm2022/components/check-box/checkbox.component.mjs +0 -110
  28. package/esm2022/components/check-box/checkbox.module.mjs +0 -19
  29. package/esm2022/components/custom-component-wrapper/custom-component-wrapper..module.mjs +0 -22
  30. package/esm2022/components/custom-component-wrapper/custom-component-wrapper.component.mjs +0 -21
  31. package/esm2022/components/custom-control-wrapper/custom-control-wrapper..module.mjs +0 -23
  32. package/esm2022/components/custom-control-wrapper/custom-control-wrapper.component.mjs +0 -68
  33. package/esm2022/components/date-time-picker/date-picker/date-picker.component.mjs +0 -188
  34. package/esm2022/components/date-time-picker/date-time-picker.component.mjs +0 -115
  35. package/esm2022/components/date-time-picker/date-time-picker.module.mjs +0 -48
  36. package/esm2022/components/date-time-picker/index.mjs +0 -9
  37. package/esm2022/components/date-time-picker/picker-modal/modal.component.mjs +0 -25
  38. package/esm2022/components/date-time-picker/pipes/moment.pipe.mjs +0 -17
  39. package/esm2022/components/date-time-picker/time-picker/time-picker.component.mjs +0 -121
  40. package/esm2022/components/file-upload/file-upload.component.mjs +0 -109
  41. package/esm2022/components/file-upload/file-upload.module.mjs +0 -37
  42. package/esm2022/components/file-upload/secure.pipe.mjs +0 -101
  43. package/esm2022/components/input/input.directive.mjs +0 -78
  44. package/esm2022/components/input/input.module.mjs +0 -23
  45. package/esm2022/components/input/label.component.mjs +0 -263
  46. package/esm2022/components/input/text-area.directive.mjs +0 -58
  47. package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.component.mjs +0 -87
  48. package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.module.mjs +0 -40
  49. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-adapter.class.mjs +0 -114
  50. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-format.class.mjs +0 -7
  51. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-adapter.class.mjs +0 -347
  52. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-format.class.mjs +0 -16
  53. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time.module.mjs +0 -39
  54. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-body.component.mjs +0 -142
  55. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-month-view.component.mjs +0 -439
  56. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-multi-year-view.component.mjs +0 -373
  57. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-year-view.component.mjs +0 -367
  58. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar.component.mjs +0 -342
  59. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.mjs +0 -259
  60. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-container.component.mjs +0 -392
  61. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.mjs +0 -614
  62. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-intl.service.mjs +0 -65
  63. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
  64. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.animations.mjs +0 -21
  65. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.component.mjs +0 -522
  66. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.class.mjs +0 -166
  67. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.module.mjs +0 -97
  68. package/esm2022/components/ngx-pick-datetime/lib/date-time/numberedFixLen.pipe.mjs +0 -28
  69. package/esm2022/components/ngx-pick-datetime/lib/date-time/timer-box.component.mjs +0 -90
  70. package/esm2022/components/ngx-pick-datetime/lib/date-time/timer.component.mjs +0 -292
  71. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-config.class.mjs +0 -56
  72. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-container.component.mjs +0 -243
  73. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-ref.class.mjs +0 -119
  74. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.module.mjs +0 -26
  75. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.service.mjs +0 -233
  76. package/esm2022/components/ngx-pick-datetime/lib/utils/index.mjs +0 -5
  77. package/esm2022/components/ngx-pick-datetime/lib/utils/object.utils.mjs +0 -26
  78. package/esm2022/components/ngx-remote-select/ngx-remote-select.component.mjs +0 -151
  79. package/esm2022/components/ngx-remote-select/ngx-remote-select.module.mjs +0 -22
  80. package/esm2022/components/ngx-tabset/components/ngx-tab-set.component.mjs +0 -74
  81. package/esm2022/components/ngx-tabset/components/tab.component.mjs +0 -33
  82. package/esm2022/components/ngx-tabset/directives/hover-class.directive.mjs +0 -30
  83. package/esm2022/components/ngx-tabset/modules/ngx-tabset.module.mjs +0 -38
  84. package/esm2022/components/number-input/number-input.component.mjs +0 -254
  85. package/esm2022/components/number-input/number-input.module.mjs +0 -21
  86. package/esm2022/components/number-input/number.directive.mjs +0 -22
  87. package/esm2022/components/radio-button/radio.component.mjs +0 -98
  88. package/esm2022/components/radio-button/radio.module.mjs +0 -19
  89. package/esm2022/components/select/optgroup.directive.mjs +0 -19
  90. package/esm2022/components/select/option.directive.mjs +0 -19
  91. package/esm2022/components/select/select.component.mjs +0 -182
  92. package/esm2022/components/select/select.module.mjs +0 -23
  93. package/esm2022/components/workspace-launcher/workspace-launcher.component.mjs +0 -26
  94. package/esm2022/components/workspace-launcher/workspace-launcher.module.mjs +0 -19
  95. package/esm2022/form-entry/control-alerts/alert-helpers.mjs +0 -40
  96. package/esm2022/form-entry/control-alerts/can-generate-alert.mjs +0 -2
  97. package/esm2022/form-entry/control-calculators/can-calculate.mjs +0 -2
  98. package/esm2022/form-entry/control-hiders-disablers/can-disable.mjs +0 -2
  99. package/esm2022/form-entry/control-hiders-disablers/can-hide.mjs +0 -2
  100. package/esm2022/form-entry/control-hiders-disablers/disabler-helper.mjs +0 -32
  101. package/esm2022/form-entry/control-hiders-disablers/hider-helpers.mjs +0 -41
  102. package/esm2022/form-entry/data-sources/data-sources.mjs +0 -30
  103. package/esm2022/form-entry/data-sources/dummy-data-source.mjs +0 -104
  104. package/esm2022/form-entry/directives/collapse-animations.mjs +0 -11
  105. package/esm2022/form-entry/directives/collapse.directive.mjs +0 -172
  106. package/esm2022/form-entry/directives/historical-value.directive.mjs +0 -68
  107. package/esm2022/form-entry/error-renderer/error-renderer.component.mjs +0 -53
  108. package/esm2022/form-entry/expression-runner/expression-runner.mjs +0 -170
  109. package/esm2022/form-entry/form-entry.module.mjs +0 -194
  110. package/esm2022/form-entry/form-factory/control-relations.factory.mjs +0 -238
  111. package/esm2022/form-entry/form-factory/form-control.service.mjs +0 -118
  112. package/esm2022/form-entry/form-factory/form-node.mjs +0 -99
  113. package/esm2022/form-entry/form-factory/form.factory.mjs +0 -144
  114. package/esm2022/form-entry/form-factory/form.mjs +0 -190
  115. package/esm2022/form-entry/form-factory/hiders-disablers.factory.mjs +0 -68
  116. package/esm2022/form-entry/form-factory/index.mjs +0 -7
  117. package/esm2022/form-entry/form-factory/question.factory.mjs +0 -1123
  118. package/esm2022/form-entry/form-factory/show-messages.factory.mjs +0 -31
  119. package/esm2022/form-entry/form-factory/validation.factory.mjs +0 -182
  120. package/esm2022/form-entry/form-renderer/form-renderer.component.mjs +0 -277
  121. package/esm2022/form-entry/helpers/historical-expression-helper-service.mjs +0 -42
  122. package/esm2022/form-entry/helpers/historical-field-helper-service.mjs +0 -39
  123. package/esm2022/form-entry/helpers/js-expression-helper.mjs +0 -314
  124. package/esm2022/form-entry/helpers/risk-dataset-table.mjs +0 -247
  125. package/esm2022/form-entry/pipes/time-ago.pipe.mjs +0 -110
  126. package/esm2022/form-entry/question-models/checkbox.model.mjs +0 -11
  127. package/esm2022/form-entry/question-models/conditional-validation.model.mjs +0 -9
  128. package/esm2022/form-entry/question-models/custom-control-question.model.mjs +0 -10
  129. package/esm2022/form-entry/question-models/date-question.mjs +0 -12
  130. package/esm2022/form-entry/question-models/date-validation.model.mjs +0 -10
  131. package/esm2022/form-entry/question-models/decimal-validation.model.mjs +0 -19
  132. package/esm2022/form-entry/question-models/diagnosis-question.mjs +0 -12
  133. package/esm2022/form-entry/question-models/disallow-decimals-validation.model.mjs +0 -18
  134. package/esm2022/form-entry/question-models/file-upload-question.mjs +0 -13
  135. package/esm2022/form-entry/question-models/group-question.mjs +0 -12
  136. package/esm2022/form-entry/question-models/index.mjs +0 -24
  137. package/esm2022/form-entry/question-models/interfaces/base-options.mjs +0 -2
  138. package/esm2022/form-entry/question-models/interfaces/checkbox-options.mjs +0 -2
  139. package/esm2022/form-entry/question-models/interfaces/data-source.mjs +0 -2
  140. package/esm2022/form-entry/question-models/interfaces/date-question-options.mjs +0 -2
  141. package/esm2022/form-entry/question-models/interfaces/diagnosis-question-options.mjs +0 -2
  142. package/esm2022/form-entry/question-models/interfaces/file-upload-question-options.mjs +0 -2
  143. package/esm2022/form-entry/question-models/interfaces/group-question-options.mjs +0 -2
  144. package/esm2022/form-entry/question-models/interfaces/multi-select-options.mjs +0 -2
  145. package/esm2022/form-entry/question-models/interfaces/nested-questions.mjs +0 -7
  146. package/esm2022/form-entry/question-models/interfaces/radio-button-options.mjs +0 -2
  147. package/esm2022/form-entry/question-models/interfaces/remote-select-question-options.mjs +0 -2
  148. package/esm2022/form-entry/question-models/interfaces/repeating-question-options.mjs +0 -2
  149. package/esm2022/form-entry/question-models/interfaces/select-option.mjs +0 -2
  150. package/esm2022/form-entry/question-models/interfaces/select-question-options.mjs +0 -2
  151. package/esm2022/form-entry/question-models/interfaces/test-order-question-options.mjs +0 -2
  152. package/esm2022/form-entry/question-models/interfaces/text-area-question-options.mjs +0 -2
  153. package/esm2022/form-entry/question-models/interfaces/text-question-options.mjs +0 -2
  154. package/esm2022/form-entry/question-models/interfaces/ui-select-question-options.mjs +0 -2
  155. package/esm2022/form-entry/question-models/interfaces/workspace-launcher-options.mjs +0 -2
  156. package/esm2022/form-entry/question-models/js-expression-validation.model.mjs +0 -8
  157. package/esm2022/form-entry/question-models/max-length-validation.model.mjs +0 -9
  158. package/esm2022/form-entry/question-models/max-validation.model.mjs +0 -9
  159. package/esm2022/form-entry/question-models/min-length-validation.model.mjs +0 -9
  160. package/esm2022/form-entry/question-models/min-validation.model.mjs +0 -9
  161. package/esm2022/form-entry/question-models/models.mjs +0 -13
  162. package/esm2022/form-entry/question-models/multi-select-question.mjs +0 -11
  163. package/esm2022/form-entry/question-models/pair.model.mjs +0 -7
  164. package/esm2022/form-entry/question-models/question-base.mjs +0 -26
  165. package/esm2022/form-entry/question-models/radio-button.model.mjs +0 -12
  166. package/esm2022/form-entry/question-models/remote-select-question.mjs +0 -12
  167. package/esm2022/form-entry/question-models/rendering-type.mjs +0 -9
  168. package/esm2022/form-entry/question-models/repeating-question.mjs +0 -11
  169. package/esm2022/form-entry/question-models/select-option.mjs +0 -7
  170. package/esm2022/form-entry/question-models/select-question.mjs +0 -12
  171. package/esm2022/form-entry/question-models/test-order-question.mjs +0 -15
  172. package/esm2022/form-entry/question-models/text-area-input-question.mjs +0 -13
  173. package/esm2022/form-entry/question-models/text-input-question.mjs +0 -10
  174. package/esm2022/form-entry/question-models/ui-select-question.mjs +0 -11
  175. package/esm2022/form-entry/question-models/validation.model.mjs +0 -7
  176. package/esm2022/form-entry/question-models/workspace-launcher.model.mjs +0 -15
  177. package/esm2022/form-entry/services/debug-mode.service.mjs +0 -24
  178. package/esm2022/form-entry/services/form-errors.service.mjs +0 -21
  179. package/esm2022/form-entry/services/form-schema-compiler.service.mjs +0 -248
  180. package/esm2022/form-entry/services/historical-encounter-data.service.mjs +0 -172
  181. package/esm2022/form-entry/validators/conditional-answered.validator.mjs +0 -46
  182. package/esm2022/form-entry/validators/conditional-required.validator.mjs +0 -40
  183. package/esm2022/form-entry/validators/date.validator.mjs +0 -18
  184. package/esm2022/form-entry/validators/disallow-decimals.validator.mjs +0 -15
  185. package/esm2022/form-entry/validators/future-date-restriction.validator.mjs +0 -21
  186. package/esm2022/form-entry/validators/js-expression.validator.mjs +0 -26
  187. package/esm2022/form-entry/validators/max-date.validator.mjs +0 -23
  188. package/esm2022/form-entry/validators/max-length.validator.mjs +0 -17
  189. package/esm2022/form-entry/validators/max.validator.mjs +0 -21
  190. package/esm2022/form-entry/validators/min-date.validator.mjs +0 -23
  191. package/esm2022/form-entry/validators/min-length.validator.mjs +0 -17
  192. package/esm2022/form-entry/validators/min.validator.mjs +0 -21
  193. package/esm2022/form-entry/validators/required.validator.mjs +0 -11
  194. package/esm2022/form-entry/validators/validations.mjs +0 -5
  195. package/esm2022/form-entry/value-adapters/diagnosis.adapter.mjs +0 -241
  196. package/esm2022/form-entry/value-adapters/encounter.adapter.mjs +0 -190
  197. package/esm2022/form-entry/value-adapters/obs-adapter-helper.mjs +0 -559
  198. package/esm2022/form-entry/value-adapters/obs.adapter.mjs +0 -542
  199. package/esm2022/form-entry/value-adapters/order.adapter.mjs +0 -186
  200. package/esm2022/form-entry/value-adapters/patient-identifier.adapter.mjs +0 -77
  201. package/esm2022/form-entry/value-adapters/person-attribute.adapter.mjs +0 -88
  202. package/esm2022/form-entry/value-adapters/value.adapter.mjs +0 -2
  203. package/esm2022/lib/index.mjs +0 -59
  204. package/esm2022/openmrs-ngx-formentry.mjs +0 -5
  205. package/esm2022/public_api.mjs +0 -2
  206. package/esm2022/shared.module.mjs +0 -21
  207. /package/components/custom-component-wrapper/{custom-component-wrapper..module.d.ts → custom-component-wrapper.module.d.ts} +0 -0
  208. /package/components/custom-control-wrapper/{custom-control-wrapper..module.d.ts → custom-control-wrapper.module.d.ts} +0 -0
@@ -1,542 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import 'rxjs';
3
- import * as _ from 'lodash';
4
- import { LeafNode, GroupNode } from '../form-factory/form-node';
5
- import { ObsAdapterHelper } from './obs-adapter-helper';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "./obs-adapter-helper";
8
- export class ObsValueAdapter {
9
- constructor(helper) {
10
- this.helper = helper;
11
- }
12
- generateFormPayload(form) {
13
- return this.helper.getObsNodePayload(form.rootNode);
14
- // TODO: Get rid of the section below when the helper is stable.
15
- // // Traverse to get all nodes
16
- // let pages = this.traverse(form.rootNode);
17
- // // Extract actual question nodes
18
- // let questionNodes = this.getQuestionNodes(pages);
19
- // // Get obs Payload
20
- // return this.getObsPayload(questionNodes);
21
- }
22
- populateForm(form, payload) {
23
- this.helper.setNodeValue(form.rootNode, payload);
24
- // TODO: Get rid of the section below when the helper is stable.
25
- // // Traverse to get all nodes
26
- // let pages = this.traverse(form.rootNode);
27
- // // Extract actual question nodes
28
- // let questionNodes = this.getQuestionNodes(pages);
29
- // // Extract set obs
30
- // this.setValues(questionNodes, payload);
31
- }
32
- // TODO: Get rid of all the functions below as they will not be needed
33
- // once the helper is stable
34
- setValues(nodes, payload, forcegroup) {
35
- if (nodes) {
36
- for (const node of nodes) {
37
- if (node instanceof LeafNode) {
38
- this.setObsValue(node, payload);
39
- if (node.question.enableHistoricalValue &&
40
- node.initialValue !== undefined) {
41
- node.question.setHistoricalValue(false);
42
- }
43
- }
44
- else if ((node.question &&
45
- node.question.extras &&
46
- node.question.renderingType === 'group') ||
47
- forcegroup) {
48
- const groupObs = _.find(payload, (o) => {
49
- return (o.concept.uuid === node.question.extras.questionOptions.concept &&
50
- o.groupMembers);
51
- });
52
- if (groupObs) {
53
- if (node.node) {
54
- node.node['initialValue'] = groupObs;
55
- }
56
- this.setValues(node.groupMembers, groupObs.groupMembers);
57
- }
58
- if (forcegroup && node.payload) {
59
- this.setValues(node.groupMembers, node.payload.groupMembers);
60
- }
61
- }
62
- else if (node instanceof GroupNode &&
63
- node.question.extras.type === 'complex-obs') {
64
- this.setComplexObsValue(node, payload);
65
- }
66
- else if (node.question &&
67
- node.question.extras &&
68
- node.question.renderingType === 'repeating' &&
69
- !forcegroup) {
70
- this.setRepeatingGroupValues(node, payload);
71
- node.node.control.updateValueAndValidity();
72
- }
73
- else {
74
- throw new Error('not implemented');
75
- }
76
- }
77
- }
78
- }
79
- setObsValue(node, payload) {
80
- if ((node.question &&
81
- node.question.extras &&
82
- (node.question.extras.type === 'obs' ||
83
- (node.question.extras.type === 'complex-obs-child' &&
84
- node.question.extras.questionOptions.obsField === 'value')) &&
85
- node.question.extras.questionOptions.rendering !== 'multiCheckbox') ||
86
- node.question.extras.questionOptions.rendering !== 'checkbox' ||
87
- node.question.extras.questionOptions.rendering !== 'multi-select') {
88
- const obs = _.find(payload, (o) => {
89
- return o.concept.uuid === node.question.extras.questionOptions.concept;
90
- });
91
- if (obs) {
92
- if (obs.value instanceof Object) {
93
- node.control.setValue(obs.value.uuid);
94
- node.control.updateValueAndValidity();
95
- }
96
- else {
97
- node.control.setValue(obs.value);
98
- node.control.updateValueAndValidity();
99
- }
100
- node['initialValue'] = { obsUuid: obs.uuid, value: obs.value };
101
- }
102
- }
103
- else {
104
- const multiObs = _.filter(payload, (o) => {
105
- return o.concept.uuid === node.question.extras.questionOptions.concept;
106
- });
107
- if (multiObs && multiObs.length > 0) {
108
- node.control.setValue(this.getMultiselectValues(multiObs));
109
- node.control.updateValueAndValidity();
110
- node['initialValue'] = multiObs;
111
- }
112
- }
113
- }
114
- setComplexObsValue(node, payload) {
115
- let valueField;
116
- let dateField;
117
- for (const o in node.children) {
118
- if (node.children[o].question.extras.questionOptions
119
- .obsField === 'value') {
120
- valueField = node.children[o];
121
- }
122
- if (node.children[o].question.extras.questionOptions
123
- .obsField === 'obsDatetime') {
124
- dateField = node.children[o];
125
- }
126
- }
127
- // set the usual obs value
128
- this.setObsValue(valueField, payload);
129
- // set the obs date
130
- const obs = _.find(payload, (o) => {
131
- return o.concept.uuid === node.question.extras.questionOptions.concept;
132
- });
133
- if (obs) {
134
- dateField['initialValue'] = { obsUuid: obs.uuid, value: obs.obsDatetime };
135
- dateField.control.setValue(obs.obsDatetime);
136
- dateField.control.updateValueAndValidity();
137
- }
138
- }
139
- getMultiselectValues(multiObs) {
140
- const values = [];
141
- for (const m of multiObs) {
142
- values.push(m.value.uuid);
143
- }
144
- return values;
145
- }
146
- setRepeatingGroupValues(node, payload) {
147
- const groupRepeatingObs = _.filter(payload, (o) => {
148
- const found = o.concept.uuid === node.question.extras.questionOptions.concept;
149
- let intersect = false;
150
- if (found && o.groupMembers) {
151
- const obs = o.groupMembers.map((a) => {
152
- return a.concept.uuid;
153
- });
154
- const schemaQuestions = node.question.questions.map((a) => {
155
- return a.extras.questionOptions.concept;
156
- });
157
- intersect = _.intersection(obs, schemaQuestions).length > 0;
158
- }
159
- return found && intersect;
160
- });
161
- if (groupRepeatingObs.length > 0) {
162
- node.node['initialValue'] = groupRepeatingObs;
163
- for (let i = 0; i < groupRepeatingObs.length; i++) {
164
- node.node.createChildNode();
165
- }
166
- }
167
- const groups = [];
168
- let index = 0;
169
- for (const child of node.node.children) {
170
- const children = Object.keys(child.children).map(function (key) {
171
- return child.children[key];
172
- });
173
- const groupPayload = groupRepeatingObs[index];
174
- groups.push({
175
- question: node.question,
176
- groupMembers: children,
177
- payload: groupPayload
178
- });
179
- index++;
180
- }
181
- this.setValues(groups, groupRepeatingObs, true);
182
- }
183
- getQuestionNodes(pages) {
184
- const merged = [];
185
- const arrays = [];
186
- for (const page of pages) {
187
- for (const section of page.page) {
188
- arrays.push(section.section);
189
- }
190
- }
191
- return merged.concat.apply([], arrays);
192
- }
193
- repeatingGroup(nodes) {
194
- const toReturn = [];
195
- for (const node of nodes) {
196
- toReturn.push({
197
- question: node.question,
198
- groupMembers: this.traverse(node)
199
- });
200
- }
201
- return toReturn;
202
- }
203
- processGroup(obs, obsPayload) {
204
- if (obs.question &&
205
- obs.question.extras &&
206
- obs.question.extras.questionOptions.rendering === 'group') {
207
- const members = _.filter(this.getObsPayload(obs.groupMembers), (o) => {
208
- return o.value !== '';
209
- });
210
- const mappedMembers = members.map((a) => {
211
- return a.voided;
212
- });
213
- if (members.length > 0 && mappedMembers.every(Boolean)) {
214
- obsPayload.push({
215
- uuid: obs.node.initialValue.uuid,
216
- voided: true
217
- });
218
- }
219
- else if (members.length > 0) {
220
- if (obs.node.initialValue) {
221
- obsPayload.push({
222
- uuid: obs.node.initialValue.uuid,
223
- groupMembers: members
224
- });
225
- }
226
- else {
227
- obsPayload.push({
228
- concept: obs.question.extras.questionOptions.concept,
229
- groupMembers: members
230
- });
231
- }
232
- }
233
- }
234
- }
235
- mapInitialGroup(group) {
236
- let current = {};
237
- for (const member of group.groupMembers) {
238
- let value = '';
239
- if (member.value instanceof Object) {
240
- value = member.value.uuid;
241
- }
242
- else if (member.value) {
243
- value = member.value;
244
- }
245
- else if (member.groupMembers && member.groupMembers.length > 0) {
246
- current = this.mapInitialGroup(group);
247
- }
248
- current[member.concept.uuid + ':' + value] = value;
249
- }
250
- return current;
251
- }
252
- mapModelGroup(node, value) {
253
- const current = {};
254
- for (const key in value) {
255
- if (value.hasOwnProperty(key)) {
256
- const groupQuestion = _.find(node.question.questions, {
257
- key: key
258
- });
259
- const modelValue = value[key];
260
- if (modelValue instanceof Object) {
261
- }
262
- else if (modelValue !== '') {
263
- current[groupQuestion.extras.questionOptions.concept + ':' + modelValue] = modelValue;
264
- }
265
- }
266
- }
267
- return current;
268
- }
269
- processRepeatingGroups(node, obsPayload) {
270
- const initialValues = [];
271
- if (node.node.initialValue) {
272
- for (const group of node.node.initialValue) {
273
- initialValues.push({
274
- uuid: group.uuid,
275
- value: this.mapInitialGroup(group)
276
- });
277
- }
278
- }
279
- const repeatingModel = [];
280
- for (const value of node.node.control.value) {
281
- repeatingModel.push({ value: this.mapModelGroup(node, value) });
282
- }
283
- const deleted = this.leftOuterJoinArrays(initialValues, repeatingModel);
284
- const newObs = this.leftOuterJoinArrays(repeatingModel, initialValues);
285
- const groupConcept = node.question.extras.questionOptions.concept;
286
- let newObsPayload = [];
287
- if (deleted.length > 0) {
288
- const deletedObs = this.createGroupDeletedObs(deleted);
289
- for (const d of deletedObs) {
290
- obsPayload.push(d);
291
- }
292
- if (newObs.length > 0) {
293
- newObsPayload = this.createGroupNewObs(newObs, groupConcept);
294
- }
295
- }
296
- else {
297
- newObsPayload = this.createGroupNewObs(newObs, groupConcept);
298
- }
299
- if (newObsPayload.length > 0) {
300
- for (const p of newObsPayload) {
301
- obsPayload.push(p);
302
- }
303
- }
304
- }
305
- leftOuterJoinArrays(first, second) {
306
- const unique = first.filter(function (obj) {
307
- return !second.some(function (obj2) {
308
- return _.isEqual(obj.value, obj2.value);
309
- });
310
- });
311
- return unique;
312
- }
313
- createGroupNewObs(payload, groupConcept) {
314
- const newPayload = [];
315
- for (const obs of payload) {
316
- const groupPayload = [];
317
- for (let key in obs.value) {
318
- let concept = key.split(':')[0];
319
- let value = key.split(':')[1];
320
- groupPayload.push({ concept: concept, value: value });
321
- }
322
- newPayload.push({ concept: groupConcept, groupMembers: groupPayload });
323
- }
324
- return newPayload;
325
- }
326
- createGroupDeletedObs(payload) {
327
- const deletedObs = [];
328
- for (const d of payload) {
329
- deletedObs.push({ uuid: d.uuid, voided: true });
330
- }
331
- return deletedObs;
332
- }
333
- getExactTime(datetime) {
334
- return datetime.substring(0, 19).replace('T', ' ');
335
- }
336
- processObs(obs, obsPayload) {
337
- if (obs.control && obs.question.extras) {
338
- const obsValue = {
339
- concept: obs.question.extras.questionOptions.concept,
340
- value: obs.question.extras.questionOptions.rendering === 'date' &&
341
- !this.isEmpty(obs.control.value)
342
- ? this.getExactTime(obs.control.value)
343
- : obs.control.value
344
- };
345
- if (obs.question.extras.questionOptions.rendering === 'multiCheckbox' ||
346
- obs.question.extras.questionOptions.rendering === 'checkbox' ||
347
- obs.question.extras.questionOptions.rendering === 'multi-select') {
348
- const multis = this.processMultiSelect(obs.question.extras.questionOptions.concept, obs.control.value);
349
- if (obs.initialValue) {
350
- const mappedInitial = obs.initialValue.map((a) => {
351
- return {
352
- uuid: a.uuid,
353
- value: { concept: a.concept.uuid, value: a.value.uuid }
354
- };
355
- });
356
- const mappedCurrent = multis.map((a) => {
357
- return { value: a };
358
- });
359
- const deletedObs = this.leftOuterJoinArrays(mappedInitial, mappedCurrent);
360
- const newObs = this.leftOuterJoinArrays(mappedCurrent, mappedInitial);
361
- this.processDeletedMultiSelectObs(deletedObs, obsPayload);
362
- this.processNewMultiSelectObs(newObs, obsPayload);
363
- }
364
- else {
365
- this.processNewMultiSelectObs(multis, obsPayload);
366
- }
367
- }
368
- else {
369
- if (obs.initialValue && obs.initialValue.value && obsValue) {
370
- this.updateOrVoidObs(obsValue, obs.initialValue, obsPayload);
371
- }
372
- else if (obsValue.value !== '' && obsValue.value !== null) {
373
- obsPayload.push(obsValue);
374
- }
375
- }
376
- }
377
- }
378
- processComplexObs(node, obsPayload) {
379
- let valueField;
380
- let dateField;
381
- for (const o in node.children) {
382
- if (node.children[o].question.extras.questionOptions
383
- .obsField === 'value') {
384
- valueField = node.children[o];
385
- }
386
- if (node.children[o].question.extras.questionOptions
387
- .obsField === 'obsDatetime') {
388
- dateField = node.children[o];
389
- }
390
- }
391
- if (valueField) {
392
- // process obs as usual
393
- this.processObs(valueField, obsPayload);
394
- // obtain the last inserted obs and set the obsDatetime
395
- const createdPayload = obsPayload.length > 0 ? obsPayload[obsPayload.length - 1] : undefined;
396
- if (createdPayload &&
397
- ((createdPayload.concept &&
398
- createdPayload.concept ===
399
- node.question.extras.questionOptions.concept) ||
400
- (valueField.initialValue &&
401
- createdPayload.uuid === valueField.initialValue.obsUuid))) {
402
- if (dateField.initialValue &&
403
- dateField.control.value !== dateField.initialValue.value) {
404
- createdPayload.obsDatetime = dateField.control.value;
405
- }
406
- }
407
- }
408
- }
409
- processDeletedMultiSelectObs(values, obsPayload) {
410
- for (const value of values) {
411
- obsPayload.push({ uuid: value.uuid, voided: true });
412
- }
413
- }
414
- processNewMultiSelectObs(values, obsPayload) {
415
- for (const multi of values) {
416
- if (multi.value instanceof Object) {
417
- obsPayload.push(multi.value);
418
- }
419
- else {
420
- obsPayload.push(multi);
421
- }
422
- }
423
- }
424
- updateOrVoidObs(obsValue, initialValue, obsPayload) {
425
- if (this.isEmpty(obsValue.value) && initialValue.value) {
426
- obsPayload.push({ uuid: initialValue.obsUuid, voided: true });
427
- }
428
- else if (!this.isEmpty(obsValue.value) && initialValue.value) {
429
- obsPayload.push({ uuid: initialValue.obsUuid, value: obsValue.value });
430
- }
431
- }
432
- isEmpty(value) {
433
- if (value === '' ||
434
- value === null ||
435
- value === undefined
436
- // || value === [] ||
437
- // value === {}
438
- ) {
439
- return true;
440
- }
441
- return false;
442
- }
443
- traverse(o, type) {
444
- const questions = [];
445
- if (o.children) {
446
- if (o.children instanceof Array) {
447
- const returned = this.repeatingGroup(o.children);
448
- return returned;
449
- }
450
- if (o.children instanceof Object) {
451
- for (const key in o.children) {
452
- if (o.children.hasOwnProperty(key)) {
453
- switch (o.children[key].question.renderingType) {
454
- case 'page':
455
- const page = this.traverse(o.children[key]);
456
- questions.push({
457
- page: page,
458
- label: o.children[key].question.label
459
- });
460
- break;
461
- case 'section':
462
- const section = this.traverse(o.children[key]);
463
- questions.push({
464
- section: section,
465
- node: o.children[key],
466
- label: o.children[key].question.label
467
- });
468
- break;
469
- case 'group':
470
- const qs = this.traverse(o.children[key]);
471
- questions.push({
472
- node: o.children[key],
473
- question: o.children[key].question,
474
- groupMembers: qs
475
- });
476
- break;
477
- case 'repeating':
478
- const rep = this.repeatingGroup(o.children[key].children);
479
- questions.push({
480
- node: o.children[key],
481
- question: o.children[key].question,
482
- groupMembers: rep
483
- });
484
- break;
485
- default:
486
- questions.push(o.children[key]);
487
- break;
488
- }
489
- }
490
- }
491
- }
492
- }
493
- return questions;
494
- }
495
- processMultiSelect(concept, values) {
496
- const multiSelectObs = [];
497
- if (values && values !== null) {
498
- for (const value of values) {
499
- const obs = {
500
- concept: concept,
501
- value: value
502
- };
503
- multiSelectObs.push(obs);
504
- }
505
- }
506
- return multiSelectObs;
507
- }
508
- isObs(node) {
509
- return (node.question.extras.type === 'obs' ||
510
- node.question.extras.type === 'obsGroup' ||
511
- node.question.extras.type === 'complex-obs');
512
- }
513
- getObsPayload(nodes) {
514
- const obsPayload = [];
515
- for (const node of nodes) {
516
- if (this.isObs(node)) {
517
- if ((node.groupMembers,
518
- node.question.extras.questionOptions.rendering === 'group')) {
519
- this.processGroup(node, obsPayload);
520
- }
521
- else if ((node.groupMembers,
522
- node.question.extras.questionOptions.rendering === 'repeating')) {
523
- this.processRepeatingGroups(node, obsPayload);
524
- }
525
- else if (node instanceof GroupNode &&
526
- node.question.extras.type === 'complex-obs') {
527
- this.processComplexObs(node, obsPayload);
528
- }
529
- else {
530
- this.processObs(node, obsPayload);
531
- }
532
- }
533
- }
534
- return obsPayload;
535
- }
536
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ObsValueAdapter, deps: [{ token: i1.ObsAdapterHelper }], target: i0.ɵɵFactoryTarget.Injectable }); }
537
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ObsValueAdapter }); }
538
- }
539
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ObsValueAdapter, decorators: [{
540
- type: Injectable
541
- }], ctorParameters: () => [{ type: i1.ObsAdapterHelper }] });
542
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzLmFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybWVudHJ5L3NyYy9mb3JtLWVudHJ5L3ZhbHVlLWFkYXB0ZXJzL29icy5hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxNQUFNLENBQUM7QUFFZCxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7QUFHeEQsTUFBTSxPQUFPLGVBQWU7SUFDMUIsWUFBb0IsTUFBd0I7UUFBeEIsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7SUFBRyxDQUFDO0lBRWhELG1CQUFtQixDQUFDLElBQVU7UUFDNUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxnRUFBZ0U7UUFDaEUsZ0NBQWdDO1FBQ2hDLDRDQUE0QztRQUM1QyxtQ0FBbUM7UUFDbkMsb0RBQW9EO1FBQ3BELHFCQUFxQjtRQUNyQiw0Q0FBNEM7SUFDOUMsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFVLEVBQUUsT0FBTztRQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRWpELGdFQUFnRTtRQUNoRSxnQ0FBZ0M7UUFDaEMsNENBQTRDO1FBQzVDLG1DQUFtQztRQUNuQyxvREFBb0Q7UUFDcEQscUJBQXFCO1FBQ3JCLDBDQUEwQztJQUM1QyxDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLDRCQUE0QjtJQUU1QixTQUFTLENBQUMsS0FBSyxFQUFFLE9BQVEsRUFB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Q3BDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7K0dBdmxCVSxlQUFlO21IQUFmLGVBQWU7OzRGQUFmLGVBQWU7a0JBRDNCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgJ3J4anMnO1xuXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IExlYWZOb2RlLCBHcm91cE5vZGUgfSBmcm9tICcuLi9mb3JtLWZhY3RvcnkvZm9ybS1ub2RlJztcbmltcG9ydCB7IEZvcm0gfSBmcm9tICcuLi9mb3JtLWZhY3RvcnkvZm9ybSc7XG5pbXBvcnQgeyBWYWx1ZUFkYXB0ZXIgfSBmcm9tICcuL3ZhbHVlLmFkYXB0ZXInO1xuaW1wb3J0IHsgT2JzQWRhcHRlckhlbHBlciB9IGZyb20gJy4vb2JzLWFkYXB0ZXItaGVscGVyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9ic1ZhbHVlQWRhcHRlciBpbXBsZW1lbnRzIFZhbHVlQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaGVscGVyOiBPYnNBZGFwdGVySGVscGVyKSB7fVxuXG4gIGdlbmVyYXRlRm9ybVBheWxvYWQoZm9ybTogRm9ybSkge1xuICAgIHJldHVybiB0aGlzLmhlbHBlci5nZXRPYnNOb2RlUGF5bG9hZChmb3JtLnJvb3ROb2RlKTtcbiAgICAvLyBUT0RPOiBHZXQgcmlkIG9mIHRoZSBzZWN0aW9uIGJlbG93IHdoZW4gdGhlIGhlbHBlciBpcyBzdGFibGUuXG4gICAgLy8gLy8gVHJhdmVyc2UgIHRvIGdldCBhbGwgbm9kZXNcbiAgICAvLyBsZXQgcGFnZXMgPSB0aGlzLnRyYXZlcnNlKGZvcm0ucm9vdE5vZGUpO1xuICAgIC8vIC8vIEV4dHJhY3QgYWN0dWFsIHF1ZXN0aW9uIG5vZGVzXG4gICAgLy8gbGV0IHF1ZXN0aW9uTm9kZXMgPSB0aGlzLmdldFF1ZXN0aW9uTm9kZXMocGFnZXMpO1xuICAgIC8vIC8vIEdldCBvYnMgUGF5bG9hZFxuICAgIC8vIHJldHVybiB0aGlzLmdldE9ic1BheWxvYWQocXVlc3Rpb25Ob2Rlcyk7XG4gIH1cblxuICBwb3B1bGF0ZUZvcm0oZm9ybTogRm9ybSwgcGF5bG9hZCkge1xuICAgIHRoaXMuaGVscGVyLnNldE5vZGVWYWx1ZShmb3JtLnJvb3ROb2RlLCBwYXlsb2FkKTtcblxuICAgIC8vIFRPRE86IEdldCByaWQgb2YgdGhlIHNlY3Rpb24gYmVsb3cgd2hlbiB0aGUgaGVscGVyIGlzIHN0YWJsZS5cbiAgICAvLyAvLyBUcmF2ZXJzZSAgdG8gZ2V0IGFsbCBub2Rlc1xuICAgIC8vIGxldCBwYWdlcyA9IHRoaXMudHJhdmVyc2UoZm9ybS5yb290Tm9kZSk7XG4gICAgLy8gLy8gRXh0cmFjdCBhY3R1YWwgcXVlc3Rpb24gbm9kZXNcbiAgICAvLyBsZXQgcXVlc3Rpb25Ob2RlcyA9IHRoaXMuZ2V0UXVlc3Rpb25Ob2RlcyhwYWdlcyk7XG4gICAgLy8gLy8gRXh0cmFjdCBzZXQgb2JzXG4gICAgLy8gdGhpcy5zZXRWYWx1ZXMocXVlc3Rpb25Ob2RlcywgcGF5bG9hZCk7XG4gIH1cblxuICAvLyBUT0RPOiBHZXQgcmlkIG9mIGFsbCB0aGUgZnVuY3Rpb25zIGJlbG93IGFzIHRoZXkgd2lsbCBub3QgYmUgbmVlZGVkXG4gIC8vIG9uY2UgdGhlIGhlbHBlciBpcyBzdGFibGVcblxuICBzZXRWYWx1ZXMobm9kZXMsIHBheWxvYWQ/LCBmb3JjZWdyb3VwPykge1xuICAgIGlmIChub2Rlcykge1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgTGVhZk5vZGUpIHtcbiAgICAgICAgICB0aGlzLnNldE9ic1ZhbHVlKG5vZGUsIHBheWxvYWQpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG5vZGUucXVlc3Rpb24uZW5hYmxlSGlzdG9yaWNhbFZhbHVlICYmXG4gICAgICAgICAgICBub2RlLmluaXRpYWxWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBub2RlLnF1ZXN0aW9uLnNldEhpc3RvcmljYWxWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIChub2RlLnF1ZXN0aW9uICYmXG4gICAgICAgICAgICBub2RlLnF1ZXN0aW9uLmV4dHJhcyAmJlxuICAgICAgICAgICAgbm9kZS5xdWVzdGlvbi5yZW5kZXJpbmdUeXBlID09PSAnZ3JvdXAnKSB8fFxuICAgICAgICAgIGZvcmNlZ3JvdXBcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZ3JvdXBPYnMgPSBfLmZpbmQocGF5bG9hZCwgKG86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgby5jb25jZXB0LnV1aWQgPT09IG5vZGUucXVlc3Rpb24uZXh0cmFzLnF1ZXN0aW9uT3B0aW9ucy5jb25jZXB0ICYmXG4gICAgICAgICAgICAgIG8uZ3JvdXBNZW1iZXJzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChncm91cE9icykge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZSkge1xuICAgICAgICAgICAgICBub2RlLm5vZGVbJ2luaXRpYWxWYWx1ZSddID0gZ3JvdXBPYnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVzKG5vZGUuZ3JvdXBNZW1iZXJzLCBncm91cE9icy5ncm91cE1lbWJlcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZm9yY2Vncm91cCAmJiBub2RlLnBheWxvYWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVzKG5vZGUuZ3JvdXBNZW1iZXJzLCBub2RlLnBheWxvYWQuZ3JvdXBNZW1iZXJzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgbm9kZSBpbnN0YW5jZW9mIEdyb3VwTm9kZSAmJlxuICAgICAgICAgIG5vZGUucXVlc3Rpb24uZXh0cmFzLnR5cGUgPT09ICdjb21wbGV4LW9icydcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zZXRDb21wbGV4T2JzVmFsdWUobm9kZSwgcGF5bG9hZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgbm9kZS5xdWVzdGlvbiAmJlxuICAgICAgICAgIG5vZGUucXVlc3Rpb24uZXh0cmFzICYmXG4gICAgICAgICAgbm9kZS5xdWVzdGlvbi5yZW5kZXJpbmdUeXBlID09PSAncmVwZWF0aW5nJyAmJlxuICAgICAgICAgICFmb3JjZWdyb3VwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc2V0UmVwZWF0aW5nR3JvdXBWYWx1ZXMobm9kZSwgcGF5bG9hZCk7XG4gICAgICAgICAgbm9kZS5ub2RlLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRPYnNWYWx1ZShub2RlLCBwYXlsb2FkKSB7XG4gICAgaWYgKFxuICAgICAgKG5vZGUucXVlc3Rpb24gJiZcbiAgICAgICAgbm9kZS5xdWVzdGlvbi5leHRyYXMgJiZcbiAgICAgICAgKG5vZGUucXVlc3Rpb24uZXh0cmFzLnR5cGUgPT09ICdvYnMnIHx8XG4gICAgICAgICAgKG5vZGUucXVlc3Rpb24uZXh0cmFzLnR5cGUgPT09ICdjb21wbGV4LW9icy1jaGlsZCcgJiZcbiAgICAgICAgICAgIG5vZGUucXVlc3Rpb24uZXh0cmFzLnF1ZXN0aW9uT3B0aW9ucy5vYnNGaWVsZCA9PT0gJ3ZhbHVlJykpICYmXG4gICAgICAgIG5vZGUucXVlc3Rpb24uZXh0cmFzLnF1ZXN0aW9uT3B0aW9ucy5yZW5kZXJpbmcgIT09ICdtdWx0aUNoZWNrYm94JykgfHxcbiAgICAgIG5vZGUucXVlc3Rpb24uZXh0cmFzLnF1ZXN0aW9uT3B0aW9ucy5yZW5kZXJpbmcgIT09ICdjaGVja2JveCcgfHxcbiAgICAgIG5vZGUucXVlc3Rpb24uZXh0cmFzLnF1ZXN0aW9uT3B0aW9ucy5yZW5kZXJpbmcgIT09ICdtdWx0aS1zZWxlY3QnXG4gICAgKSB7XG4gICAgICBjb25zdCBvYnMgPSBfLmZpbmQocGF5bG9hZCwgKG86IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gby5jb25jZXB0LnV1aWQgPT09IG5vZGUucXVlc3Rpb24uZXh0cmFzLnF1ZXN0aW9uT3B0aW9ucy5jb25jZXB0O1xuICAgICAgfSk7XG4gICAgICBpZiAob2JzKSB7XG4gICAgICAgIGlmIChvYnMudmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICBub2RlLmNvbnRyb2wuc2V0VmFsdWUob2JzLnZhbHVlLnV1aWQpO1xuICAgICAgICAgIG5vZGUuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZS5jb250cm9sLnNldFZhbHVlKG9icy52YWx1ZSk7XG4gICAgICAgICAgbm9kZS5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlWydpbml0aWFsVmFsdWUnXSA9IHsgb2JzVXVpZDogb2JzLnV1aWQsIHZhbHVlOiBvYnMudmFsdWUgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbXVsdGlPYnMgPSBfLmZpbHRlcihwYXlsb2FkLCAobzogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBvLmNvbmNlcHQudXVpZCA9PT0gbm9kZS5xdWVzdGlvbi5leHRyYXMucXVlc3Rpb25PcHRpb25zLmNvbmNlcHQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChtdWx0aU9icyAmJiBtdWx0aU9icy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5vZGUuY29udHJvbC5zZXRWYWx1ZSh0aGlzLmdldE11bHRpc2VsZWN0VmFsdWVzKG11bHRpT2JzKSk7XG4gICAgICAgIG5vZGUuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIG5vZGVbJ2luaXRpYWxWYWx1ZSddID0gbXVsdGlPYnM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0Q29tcGxleE9ic1ZhbHVlKG5vZGUsIHBheWxvYWQpIHtcbiAgICBsZXQgdmFsdWVGaWVsZDogYW55O1xuICAgIGxldCBkYXRlRmllbGQ6IGFueTtcblxuICAgIGZvciAoY29uc3QgbyBpbiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChub2RlLmNoaWxkcmVuW29dIGFzIExlYWZOb2RlKS5xdWVzdGlvbi5leHRyYXMucXVlc3Rpb25PcHRpb25zXG4gICAgICAgICAgLm9ic0ZpZWxkID09PSAndmFsdWUnXG4gICAgICApIHtcbiAgICAgICAgdmFsdWVGaWVsZCA9IG5vZGUuY2hpbGRyZW5bb107XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgKG5vZGUuY2hpbGRyZW5bb10gYXMgTGVhZk5vZGUpLnF1ZXN0aW9uLmV4dHJhcy5xdWVzdGlvbk9wdGlvbnNcbiAgICAgICAgICAub2JzRmllbGQgPT09ICdvYnNEYXRldGltZSdcbiAgICAgICkge1xuICAgICAgICBkYXRlRmllbGQgPSBub2RlLmNoaWxkcmVuW29dO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBzZXQgdGhlIHVzdWFsIG9icyB2YWx1ZVxuICAgIHRoaXMuc2V0T2JzVmFsdWUodmFsdWVGaWVsZCwgcGF5bG9hZCk7XG5cbiAgICAvLyBzZXQgdGhlIG9icyBkYXRlXG4gICAgY29uc3Qgb2JzID0gXy5maW5kKHBheWxvYWQsIChvOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBvLmNvbmNlcHQudXVpZCA9PT0gbm9kZS5xdWVzdGlvbi5leHRyYXMucXVlc3Rpb25PcHRpb25zLmNvbmNlcHQ7XG4gICAgfSk7XG5cbiAgICBpZiAob2JzKSB7XG4gICAgICBkYXRlRmllbGRbJ2luaXRpYWxWYWx1ZSddID0geyBvYnNVdWlkOiBvYnMudXVpZCwgdmFsdWU6IG9icy5vYnNEYXRldGltZSB9O1xuICAgICAgKGRhdGVGaWVsZCBhcyBMZWFmTm9kZSkuY29udHJvbC5zZXRWYWx1ZShvYnMub2JzRGF0ZXRpbWUpO1xuICAgICAgKGRhdGVGaWVsZCBhcyBMZWFmTm9kZSkuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0TXVsdGlzZWxlY3RWYWx1ZXMobXVsdGlPYnMpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG0gb2YgbXVsdGlPYnMpIHtcbiAgICAgIHZhbHVlcy5wdXNoKG0udmFsdWUudXVpZCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBzZXRSZXBlYXRpbmdHcm91cFZhbHVlcyhub2RlLCBwYXlsb2FkKSB7XG4gICAgY29uc3QgZ3JvdXBSZXBlYXRpbmdPYnMgPSBfLmZpbHRlcihwYXlsb2FkLCAobzogYW55KSA9PiB7XG4gICAgICBjb25zdCBmb3VuZCA9XG4gICAgICAgIG8uY29uY2VwdC51dWlkID09PSBub2RlLnF1ZXN0aW9uLmV4dHJhcy5xdWVzdGlvbk9wdGlvbnMuY29uY2VwdDtcbiAgICAgIGxldCBpbnRlcnNlY3QgPSBmYWxzZTtcbiAgICAgIGlmIChmb3VuZCAmJiBvLmdyb3VwTWVtYmVycykge1xuICAgICAgICBjb25zdCBvYnMgPSBvLmdyb3VwTWVtYmVycy5tYXAoKGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gYS5jb25jZXB0LnV1aWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNjaGVtYVF1ZXN0aW9ucyA9IG5vZGUucXVlc3Rpb24ucXVlc3Rpb25zLm1hcCgoYSkgPT4ge1xuICAgICAgICAgIHJldHVybiBhLmV4dHJhcy5xdWVzdGlvbk9wdGlvbnMuY29uY2VwdDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaW50ZXJzZWN0ID0gXy5pbnRlcnNlY3Rpb24ob2JzLCBzY2hlbWFRdWVzdGlvbnMpLmxlbmd0aCA+IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZm91bmQgJiYgaW50ZXJzZWN0O1xuICAgIH0pO1xuICAgIGlmIChncm91cFJlcGVhdGluZ09icy5sZW5ndGggPiAwKSB7XG4gICAgICBub2RlLm5vZGVbJ2luaXRpYWxWYWx1ZSddID0gZ3JvdXBSZXBlYXRpbmdPYnM7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwUmVwZWF0aW5nT2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5vZGUubm9kZS5jcmVhdGVDaGlsZE5vZGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZ3JvdXBzID0gW107XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUubm9kZS5jaGlsZHJlbikge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBPYmplY3Qua2V5cyhjaGlsZC5jaGlsZHJlbikubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkLmNoaWxkcmVuW2tleV07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGdyb3VwUGF5bG9hZCA9IGdyb3VwUmVwZWF0aW5nT2JzW2luZGV4XTtcbiAgICAgIGdyb3Vwcy5wdXNoKHtcbiAgICAgICAgcXVlc3Rpb246IG5vZGUucXVlc3Rpb24sXG4gICAgICAgIGdyb3VwTWVtYmVyczogY2hpbGRyZW4sXG4gICAgICAgIHBheWxvYWQ6IGdyb3VwUGF5bG9hZFxuICAgICAgfSk7XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgICB0aGlzLnNldFZhbHVlcyhncm91cHMsIGdyb3VwUmVwZWF0aW5nT2JzLCB0cnVlKTtcbiAgfVxuXG4gIGdldFF1ZXN0aW9uTm9kZXMocGFnZXMpIHtcbiAgICBjb25zdCBtZXJnZWQgPSBbXTtcbiAgICBjb25zdCBhcnJheXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHtcbiAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBwYWdlLnBhZ2UpIHtcbiAgICAgICAgYXJyYXlzLnB1c2goc2VjdGlvbi5zZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZC5jb25jYXQuYXBwbHkoW10sIGFycmF5cyk7XG4gIH1cblxuICByZXBlYXRpbmdHcm91cChub2Rlcykge1xuICAgIGNvbnN0IHRvUmV0dXJuID0gW107XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICB0b1JldHVybi5wdXNoKHtcbiAgICAgICAgcXVlc3Rpb246IG5vZGUucXVlc3Rpb24sXG4gICAgICAgIGdyb3VwTWVtYmVyczogdGhpcy50cmF2ZXJzZShub2RlKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0b1JldHVybjtcbiAgfVxuXG4gIHByb2Nlc3NHcm91cChvYnMsIG9ic1BheWxvYWQpIHtcbiAgICBpZiAoXG4gICAgICBvYnMucXVlc3Rpb24gJiZcbiAgICAgIG9icy5xdWVzdGlvbi5leHRyYXMgJiZcbiAgICAgIG9icy5xdWVzdGlvbi5leHRyYXMucXVlc3Rpb25PcHRpb25zLnJlbmRlcmluZyA9PT0gJ2dyb3VwJ1xuICAgICkge1xuICAgICAgY29uc3QgbWVtYmVycyA9IF8uZmlsdGVyKFxuICAgICAgICB0aGlzLmdldE9ic1BheWxvYWQob2JzLmdyb3VwTWVtYmVycyksXG4gICAgICAgIChvOiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4gby52YWx1ZSAhPT0gJyc7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG1hcHBlZE1lbWJlcnMgPSBtZW1iZXJzLm1hcCgoYSkgPT4ge1xuICAgICAgICByZXR1cm4gYS52b2lkZWQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChtZW1iZXJzLmxlbmd0aCA+IDAgJiYgbWFwcGVkTWVtYmVycy5ldmVyeShCb29sZWFuKSkge1xuICAgICAgICBvYnNQYXlsb2FkLnB1c2goe1xuICAgICAgICAgIHV1aWQ6IG9icy5ub2RlLmluaXRpYWxWYWx1ZS51dWlkLFxuICAgICAgICAgIHZvaWRlZDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAobWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChvYnMubm9kZS5pbml0aWFsVmFsdWUpIHtcbiAgICAgICAgICBvYnNQYXlsb2FkLnB1c2goe1xuICAgICAgICAgICAgdXVpZDogb2JzLm5vZGUuaW5pdGlhbFZhbHVlLnV1aWQsXG4gICAgICAgICAgICBncm91cE1lbWJlcnM6IG1lbWJlcnNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYnNQYXlsb2FkLnB1c2goe1xuICAgICAgICAgICAgY29uY2VwdDogb2JzLnF1ZXN0aW9uLmV4dHJhcy5xdWVzdGlvbk9wdGlvbnMuY29uY2VwdCxcbiAgICAgICAgICAgIGdyb3VwTWVtYmVyczogbWVtYmVyc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbWFwSW5pdGlhbEdyb3VwKGdyb3VwKSB7XG4gICAgbGV0IGN1cnJlbnQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBncm91cC5ncm91cE1lbWJlcnMpIHtcbiAgICAgIGxldCB2YWx1ZTogYW55ID0gJyc7XG4gICAgICBpZiAobWVtYmVyLnZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgIHZhbHVlID0gbWVtYmVyLnZhbHVlLnV1aWQ7XG4gICAgICB9IGVsc2UgaWYgKG1lbWJlci52YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IG1lbWJlci52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmdyb3VwTWVtYmVycyAmJiBtZW1iZXIuZ3JvdXBNZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY3VycmVudCA9IHRoaXMubWFwSW5pdGlhbEdyb3VwKGdyb3VwKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRbbWVtYmVyLmNvbmNlcHQudXVpZCArICc6JyArIHZhbHVlXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIG1hcE1vZGVsR3JvdXAobm9kZSwgdmFsdWUpIHtcbiAgICBjb25zdCBjdXJyZW50ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwUXVlc3Rpb246IGFueSA9IF8uZmluZChub2RlLnF1ZXN0aW9uLnF1ZXN0aW9ucywge1xuICAgICAgICAgIGtleToga2V5XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBtb2RlbFZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgICAgaWYgKG1vZGVsVmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbFZhbHVlICE9PSAnJykge1xuICAgICAgICAgIGN1cnJlbnRbXG4gICAgICAgICAgICBncm91cFF1ZXN0aW9uLmV4dHJhcy5xdWVzdGlvbk9wdGlvbnMuY29uY2VwdCArICc6JyArIG1vZGVsVmFsdWVcbiAgICAgICAgICBdID0gbW9kZWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIHByb2Nlc3NSZXBlYXRpbmdHcm91cHMobm9kZSwgb2JzUGF5bG9hZCkge1xuICAgIGNvbnN0IGluaXRpYWxWYWx1ZXMgPSBbXTtcbiAgICBpZiAobm9kZS5ub2RlLmluaXRpYWxWYWx1ZSkge1xuICAgICAgZm9yIChjb25zdCBncm91cCBvZiBub2RlLm5vZGUuaW5pdGlhbFZhbHVlKSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZXMucHVzaCh7XG4gICAgICAgICAgdXVpZDogZ3JvdXAudXVpZCxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5tYXBJbml0aWFsR3JvdXAoZ3JvdXApXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXBlYXRpbmdNb2RlbCA9IFtdO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygbm9kZS5ub2RlLmNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHJlcGVhdGluZ01vZGVsLnB1c2goeyB2YWx1ZTogdGhpcy5tYXBNb2RlbEdyb3VwKG5vZGUsIHZhbHVlKSB9KTtcbiAgICB9XG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMubGVmdE91dGVySm9pbkFycmF5cyhpbml0aWFsVmFsdWVzLCByZXBlYXRpbmdNb2RlbCk7XG4gICAgY29uc3QgbmV3T2JzID0gdGhpcy5sZWZ0T3V0ZXJKb2luQXJyYXlzKHJlcGVhdGluZ01vZGVsLCBpbml0aWFsVmFsdWVzKTtcbiAgICBjb25zdCBncm91cENvbmNlcHQgPSBub2RlLnF1ZXN0aW9uLmV4dHJhcy5xdWVzdGlvbk9wdGlvbnMuY29uY2VwdDtcbiAgICBsZXQgbmV3T2JzUGF5bG9hZCA9IFtdO1xuICAgIGlmIChkZWxldGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGRlbGV0ZWRPYnMgPSB0aGlzLmNyZWF0ZUdyb3VwRGVsZXRlZE9icyhkZWxldGVkKTtcbiAgICAgIGZvciAoY29uc3QgZCBvZiBkZWxldGVkT2JzKSB7XG4gICAgICAgIG9ic1BheWxvYWQucHVzaChkKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdPYnMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdPYnNQYXlsb2FkID0gdGhpcy5jcmVhdGVHcm91cE5ld09icyhuZXdPYnMsIGdyb3VwQ29uY2VwdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld09ic1BheWxvYWQgPSB0aGlzLmNyZWF0ZUdyb3VwTmV3T2JzKG5ld09icywgZ3JvdXBDb25jZXB0KTtcbiAgICB9XG5cbiAgICBpZiAobmV3T2JzUGF5bG9hZC5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgbmV3T2JzUGF5bG9hZCkge1xuICAgICAgICBvYnNQYXlsb2FkLnB1c2gocCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGVmdE91dGVySm9pbkFycmF5cyhmaXJzdCwgc2Vjb25kKSB7XG4gICAgY29uc3QgdW5pcXVlID0gZmlyc3QuZmlsdGVyKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiAhc2Vjb25kLnNvbWUoZnVuY3Rpb24gKG9iajIpIHtcbiAgICAgICAgcmV0dXJuIF8uaXNFcXVhbChvYmoudmFsdWUsIG9iajIudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHVuaXF1ZTtcbiAgfVxuXG4gIGNyZWF0ZUdyb3VwTmV3T2JzKHBheWxvYWQsIGdyb3VwQ29uY2VwdCkge1xuICAgIGNvbnN0IG5ld1BheWxvYWQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9icyBvZiBwYXlsb2FkKSB7XG4gICAgICBjb25zdCBncm91cFBheWxvYWQgPSBbXTtcbiAgICAgIGZvciAobGV0IGtleSBpbiBvYnMudmFsdWUpIHtcbiAgICAgICAgbGV0IGNvbmNlcHQgPSBrZXkuc3BsaXQoJzonKVswXTtcbiAgICAgICAgbGV0IHZhbHVlID0ga2V5LnNwbGl0KCc6JylbMV07XG4gICAgICAgIGdyb3VwUGF5bG9hZC5wdXNoKHsgY29uY2VwdDogY29uY2VwdCwgdmFsdWU6IHZhbHVlIH0pO1xuICAgICAgfVxuICAgICAgbmV3UGF5bG9hZC5wdXNoKHsgY29uY2VwdDogZ3JvdXBDb25jZXB0LCBncm91cE1lbWJlcnM6IGdyb3VwUGF5bG9hZCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1BheWxvYWQ7XG4gIH1cblxuICBjcmVhdGVHcm91cERlbGV0ZWRPYnMocGF5bG9hZCkge1xuICAgIGNvbnN0IGRlbGV0ZWRPYnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGQgb2YgcGF5bG9hZCkge1xuICAgICAgZGVsZXRlZE9icy5wdXNoKHsgdXVpZDogZC51dWlkLCB2b2lkZWQ6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkT2JzO1xuICB9XG5cbiAgZ2V0RXhhY3RUaW1lKGRhdGV0aW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZGF0ZXRpbWUuc3Vic3RyaW5nKDAsIDE5KS5yZXBsYWNlKCdUJywgJyAnKTtcbiAgfVxuXG4gIHByb2Nlc3NPYnMob2JzLCBvYnNQYXlsb2FkKSB7XG4gICAgaWYgKG9icy5jb250cm9sICYmIG9icy5xdWVzdGlvbi5leHRyYXMpIHtcbiAgICAgIGNvbnN0IG9ic1ZhbHVlID0ge1xuICAgICAgICBjb25jZXB0OiBvYnMucXVlc3Rpb24uZXh0cmFzLnF1ZXN0aW9uT3B0aW9ucy5jb25jZXB0LFxuICAgICAgICB2YWx1ZTpcbiAgICAgICAgICBvYnMucXVlc3Rpb24uZXh0cmFzLnF1ZXN0aW9uT3B0aW9ucy5yZW5kZXJpbmcgPT09ICdkYXRlJyAmJlxuICAgICAgICAgICF0aGlzLmlzRW1wdHkob2JzLmNvbnRyb2wudmFsdWUpXG4gICAgICAgICAgICA/IHRoaXMuZ2V0RXhhY3RUaW1lKG9icy5jb250cm9sLnZhbHVlKVxuICAgICAgICAgICAgOiBvYnMuY29udHJvbC52YWx1ZVxuICAgICAgfTtcblxuICAgICAgaWYgKFxuICAgICAgICBvYnMucXVlc3Rpb24uZXh0cmFzLnF1ZXN0aW9uT3B0aW9ucy5yZW5kZXJpbmcgPT09ICdtdWx0aUNoZWNrYm94JyB8fFxuICAgICAgICBvYnMucXVlc3Rpb24uZXh0cmFzLnF1ZXN0aW9uT3B0aW9ucy5yZW5kZXJpbmcgPT09ICdjaGVja2JveCcgfHxcbiAgICAgICAgb2JzLnF1ZXN0aW9uLmV4dHJhcy5xdWVzdGlvbk9wdGlvbnMucmVuZGVyaW5nID09PSAnbXVsdGktc2VsZWN0J1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG11bHRpcyA9IHRoaXMucHJvY2Vzc011bHRpU2VsZWN0KFxuICAgICAgICAgIG9icy5xdWVzdGlvbi5leHRyYXMucXVlc3Rpb25PcHRpb25zLmNvbmNlcHQsXG4gICAgICAgICAgb2JzLmNvbnRyb2wudmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG9icy5pbml0aWFsVmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBtYXBwZWRJbml0aWFsID0gb2JzLmluaXRpYWxWYWx1ZS5tYXAoKGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHV1aWQ6IGEudXVpZCxcbiAgICAgICAgICAgICAgdmFsdWU6IHsgY29uY2VwdDogYS5jb25jZXB0LnV1aWQsIHZhbHVlOiBhLnZhbHVlLnV1aWQgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBtYXBwZWRDdXJyZW50ID0gbXVsdGlzLm1hcCgoYSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGEgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBkZWxldGVkT2JzID0gdGhpcy5sZWZ0T3V0ZXJKb2luQXJyYXlzKFxuICAgICAgICAgICAgbWFwcGVkSW5pdGlhbCxcbiAgICAgICAgICAgIG1hcHBlZEN1cnJlbnRcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5ld09icyA9IHRoaXMubGVmdE91dGVySm9pbkFycmF5cyhtYXBwZWRDdXJyZW50LCBtYXBwZWRJbml0aWFsKTtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NEZWxldGVkTXVsdGlTZWxlY3RPYnMoZGVsZXRlZE9icywgb2JzUGF5bG9hZCk7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzTmV3TXVsdGlTZWxlY3RPYnMobmV3T2JzLCBvYnNQYXlsb2FkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NOZXdNdWx0aVNlbGVjdE9icyhtdWx0aXMsIG9ic1BheWxvYWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob2JzLmluaXRpYWxWYWx1ZSAmJiBvYnMuaW5pdGlhbFZhbHVlLnZhbHVlICYmIG9ic1ZhbHVlKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVPclZvaWRPYnMob2JzVmFsdWUsIG9icy5pbml0aWFsVmFsdWUsIG9ic1BheWxvYWQpO1xuICAgICAgICB9IGVsc2UgaWYgKG9ic1ZhbHVlLnZhbHVlICE9PSAnJyAmJiBvYnNWYWx1ZS52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIG9ic1BheWxvYWQucHVzaChvYnNWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm9jZXNzQ29tcGxleE9icyhub2RlLCBvYnNQYXlsb2FkKSB7XG4gICAgbGV0IHZhbHVlRmllbGQ6IGFueTtcbiAgICBsZXQgZGF0ZUZpZWxkOiBhbnk7XG5cbiAgICBmb3IgKGNvbnN0IG8gaW4gbm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKFxuICAgICAgICAobm9kZS5jaGlsZHJlbltvXSBhcyBMZWFmTm9kZSkucXVlc3Rpb24uZXh0cmFzLnF1ZXN0aW9uT3B0aW9uc1xuICAgICAgICAgIC5vYnNGaWVsZCA9PT0gJ3ZhbHVlJ1xuICAgICAgKSB7XG4gICAgICAgIHZhbHVlRmllbGQgPSBub2RlLmNoaWxkcmVuW29dO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIChub2RlLmNoaWxkcmVuW29dIGFzIExlYWZOb2RlKS5xdWVzdGlvbi5leHRyYXMucXVlc3Rpb25PcHRpb25zXG4gICAgICAgICAgLm9ic0ZpZWxkID09PSAnb2JzRGF0ZXRpbWUnXG4gICAgICApIHtcbiAgICAgICAgZGF0ZUZpZWxkID0gbm9kZS5jaGlsZHJlbltvXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsdWVGaWVsZCkge1xuICAgICAgLy8gcHJvY2VzcyBvYnMgYXMgdXN1YWxcbiAgICAgIHRoaXMucHJvY2Vzc09icyh2YWx1ZUZpZWxkLCBvYnNQYXlsb2FkKTtcblxuICAgICAgLy8gb2J0YWluIHRoZSBsYXN0IGluc2VydGVkIG9icyBhbmQgc2V0IHRoZSBvYnNEYXRldGltZVxuICAgICAgY29uc3QgY3JlYXRlZFBheWxvYWQgPVxuICAgICAgICBvYnNQYXlsb2FkLmxlbmd0aCA+IDAgPyBvYnNQYXlsb2FkW29ic1BheWxvYWQubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoXG4gICAgICAgIGNyZWF0ZWRQYXlsb2FkICYmXG4gICAgICAgICgoY3JlYXRlZFBheWxvYWQuY29uY2VwdCAmJlxuICAgICAgICAgIGNyZWF0ZWRQYXlsb2FkLmNvbmNlcHQgPT09XG4gICAgICAgICAgICBub2RlLnF1ZXN0aW9uLmV4dHJhcy5xdWVzdGlvbk9wdGlvbnMuY29uY2VwdCkgfHxcbiAgICAgICAgICAodmFsdWVGaWVsZC5pbml0aWFsVmFsdWUgJiZcbiAgICAgICAgICAgIGNyZWF0ZWRQYXlsb2FkLnV1aWQgPT09IHZhbHVlRmllbGQuaW5pdGlhbFZhbHVlLm9ic1V1aWQpKVxuICAgICAgKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkYXRlRmllbGQuaW5pdGlhbFZhbHVlICYmXG4gICAgICAgICAgZGF0ZUZpZWxkLmNvbnRyb2wudmFsdWUgIT09IGRhdGVGaWVsZC5pbml0aWFsVmFsdWUudmFsdWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3JlYXRlZFBheWxvYWQub2JzRGF0ZXRpbWUgPSBkYXRlRmllbGQuY29udHJvbC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3NEZWxldGVkTXVsdGlTZWxlY3RPYnModmFsdWVzLCBvYnNQYXlsb2FkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIG9ic1BheWxvYWQucHVzaCh7IHV1aWQ6IHZhbHVlLnV1aWQsIHZvaWRlZDogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzTmV3TXVsdGlTZWxlY3RPYnModmFsdWVzLCBvYnNQYXlsb2FkKSB7XG4gICAgZm9yIChjb25zdCBtdWx0aSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmIChtdWx0aS52YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICBvYnNQYXlsb2FkLnB1c2gobXVsdGkudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzUGF5bG9hZC5wdXNoKG11bHRpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVPclZvaWRPYnMob2JzVmFsdWUsIGluaXRpYWxWYWx1ZSwgb2JzUGF5bG9hZCkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkob2JzVmFsdWUudmFsdWUpICYmIGluaXRpYWxWYWx1ZS52YWx1ZSkge1xuICAgICAgb2JzUGF5bG9hZC5wdXNoKHsgdXVpZDogaW5pdGlhbFZhbHVlLm9ic1V1aWQsIHZvaWRlZDogdHJ1ZSB9KTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzRW1wdHkob2JzVmFsdWUudmFsdWUpICYmIGluaXRpYWxWYWx1ZS52YWx1ZSkge1xuICAgICAgb2JzUGF5bG9hZC5wdXNoKHsgdXVpZDogaW5pdGlhbFZhbHVlLm9ic1V1aWQsIHZhbHVlOiBvYnNWYWx1ZS52YWx1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBpc0VtcHR5KHZhbHVlKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT09ICcnIHx8XG4gICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgLy8gfHwgdmFsdWUgPT09IFtdIHx8XG4gICAgICAvLyB2YWx1ZSA9PT0ge31cbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cmF2ZXJzZShvLCB0eXBlPykge1xuICAgIGNvbnN0IHF1ZXN0aW9ucyA9IFtdO1xuICAgIGlmIChvLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoby5jaGlsZHJlbiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGNvbnN0IHJldHVybmVkID0gdGhpcy5yZXBlYXRpbmdHcm91cChvLmNoaWxkcmVuKTtcbiAgICAgICAgcmV0dXJuIHJldHVybmVkO1xuICAgICAgfVxuICAgICAgaWYgKG8uY2hpbGRyZW4gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gby5jaGlsZHJlbikge1xuICAgICAgICAgIGlmIChvLmNoaWxkcmVuLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoby5jaGlsZHJlbltrZXldLnF1ZXN0aW9uLnJlbmRlcmluZ1R5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAncGFnZSc6XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMudHJhdmVyc2Uoby5jaGlsZHJlbltrZXldKTtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBwYWdlOiBwYWdlLFxuICAgICAgICAgICAgICAgICAgbGFiZWw6IG8uY2hpbGRyZW5ba2V5XS5xdWVzdGlvbi5sYWJlbFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdzZWN0aW9uJzpcbiAgICAgICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gdGhpcy50cmF2ZXJzZShvLmNoaWxkcmVuW2tleV0pO1xuICAgICAgICAgICAgICAgIHF1ZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHNlY3Rpb246IHNlY3Rpb24sXG4gICAgICAgICAgICAgICAgICBub2RlOiBvLmNoaWxkcmVuW2tleV0sXG4gICAgICAgICAgICAgICAgICBsYWJlbDogby5jaGlsZHJlbltrZXldLnF1ZXN0aW9uLmxhYmVsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgICAgICAgICAgICBjb25zdCBxcyA9IHRoaXMudHJhdmVyc2Uoby5jaGlsZHJlbltrZXldKTtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBub2RlOiBvLmNoaWxkcmVuW2tleV0sXG4gICAgICAgICAgICAgICAgICBxdWVzdGlvbjogby5jaGlsZHJlbltrZXldLnF1ZXN0aW9uLFxuICAgICAgICAgICAgICAgICAgZ3JvdXBNZW1iZXJzOiBxc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdyZXBlYXRpbmcnOlxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcCA9IHRoaXMucmVwZWF0aW5nR3JvdXAoby5jaGlsZHJlbltrZXldLmNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBub2RlOiBvLmNoaWxkcmVuW2tleV0sXG4gICAgICAgICAgICAgICAgICBxdWVzdGlvbjogby5jaGlsZHJlbltrZXldLnF1ZXN0aW9uLFxuICAgICAgICAgICAgICAgICAgZ3JvdXBNZW1iZXJzOiByZXBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBxdWVzdGlvbnMucHVzaChvLmNoaWxkcmVuW2tleV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25zO1xuICB9XG5cbiAgcHJvY2Vzc011bHRpU2VsZWN0KGNvbmNlcHQsIHZhbHVlcykge1xuICAgIGNvbnN0IG11bHRpU2VsZWN0T2JzID0gW107XG4gICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IG9icyA9IHtcbiAgICAgICAgICBjb25jZXB0OiBjb25jZXB0LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9O1xuICAgICAgICBtdWx0aVNlbGVjdE9icy5wdXNoKG9icyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtdWx0aVNlbGVjdE9icztcbiAgfVxuXG4gIGlzT2JzKG5vZGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgbm9kZS5xdWVzdGlvbi5leHRyYXMudHlwZSA9PT0gJ29icycgfHxcbiAgICAgIG5vZGUucXVlc3Rpb24uZXh0cmFzLnR5cGUgPT09ICdvYnNHcm91cCcgfHxcbiAgICAgIG5vZGUucXVlc3Rpb24uZXh0cmFzLnR5cGUgPT09ICdjb21wbGV4LW9icydcbiAgICApO1xuICB9XG5cbiAgZ2V0T2JzUGF5bG9hZChub2Rlcykge1xuICAgIGNvbnN0IG9ic1BheWxvYWQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIGlmICh0aGlzLmlzT2JzKG5vZGUpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAobm9kZS5ncm91cE1lbWJlcnMsXG4gICAgICAgICAgbm9kZS5xdWVzdGlvbi5leHRyYXMucXVlc3Rpb25PcHRpb25zLnJlbmRlcmluZyA9PT0gJ2dyb3VwJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzR3JvdXAobm9kZSwgb2JzUGF5bG9hZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgKG5vZGUuZ3JvdXBNZW1iZXJzLFxuICAgICAgICAgIG5vZGUucXVlc3Rpb24uZXh0cmFzLnF1ZXN0aW9uT3B0aW9ucy5yZW5kZXJpbmcgPT09ICdyZXBlYXRpbmcnKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NSZXBlYXRpbmdHcm91cHMobm9kZSwgb2JzUGF5bG9hZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgbm9kZSBpbnN0YW5jZW9mIEdyb3VwTm9kZSAmJlxuICAgICAgICAgIChub2RlIGFzIEdyb3VwTm9kZSkucXVlc3Rpb24uZXh0cmFzLnR5cGUgPT09ICdjb21wbGV4LW9icydcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzQ29tcGxleE9icyhub2RlLCBvYnNQYXlsb2FkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NPYnMobm9kZSwgb2JzUGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9ic1BheWxvYWQ7XG4gIH1cbn1cbiJdfQ==