@ironcode/vas-lib 1.8.0-alpha.8 → 1.8.0

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 (211) hide show
  1. package/cjs/lib/control-value/vas-camera-control-value.model.js +1 -2
  2. package/cjs/lib/control-value/vas-camera-control-value.model.js.map +1 -1
  3. package/cjs/lib/controls-config/vas-control-config-direction.enum.js +1 -1
  4. package/cjs/lib/controls-config/vas-control-config-direction.enum.js.map +1 -1
  5. package/cjs/lib/entity/index.d.ts +1 -0
  6. package/cjs/lib/entity/index.d.ts.map +1 -1
  7. package/cjs/lib/entity/index.js +1 -0
  8. package/cjs/lib/entity/index.js.map +1 -1
  9. package/cjs/lib/entity/vas-account.dto.js +1 -1
  10. package/cjs/lib/entity/vas-account.dto.js.map +1 -1
  11. package/cjs/lib/entity/vas-base.model.d.ts +1 -2
  12. package/cjs/lib/entity/vas-base.model.d.ts.map +1 -1
  13. package/cjs/lib/entity/vas-base.model.js +1 -1
  14. package/cjs/lib/entity/vas-base.model.js.map +1 -1
  15. package/cjs/lib/entity/vas-contact.model.d.ts.map +1 -1
  16. package/cjs/lib/entity/vas-contact.model.js +2 -0
  17. package/cjs/lib/entity/vas-contact.model.js.map +1 -1
  18. package/cjs/lib/entity/vas-control.model.d.ts +2 -1
  19. package/cjs/lib/entity/vas-control.model.d.ts.map +1 -1
  20. package/cjs/lib/entity/vas-control.model.js +21 -1
  21. package/cjs/lib/entity/vas-control.model.js.map +1 -1
  22. package/cjs/lib/entity/vas-field.model.d.ts +10 -9
  23. package/cjs/lib/entity/vas-field.model.d.ts.map +1 -1
  24. package/cjs/lib/entity/vas-field.model.js +43 -27
  25. package/cjs/lib/entity/vas-field.model.js.map +1 -1
  26. package/cjs/lib/entity/vas-file.dto.js +1 -2
  27. package/cjs/lib/entity/vas-file.dto.js.map +1 -1
  28. package/cjs/lib/entity/vas-file.model.d.ts +1 -0
  29. package/cjs/lib/entity/vas-file.model.d.ts.map +1 -1
  30. package/cjs/lib/entity/vas-file.model.js +10 -0
  31. package/cjs/lib/entity/vas-file.model.js.map +1 -1
  32. package/cjs/lib/entity/vas-fire-user.model.d.ts +1 -1
  33. package/cjs/lib/entity/vas-fire-user.model.d.ts.map +1 -1
  34. package/cjs/lib/entity/vas-fire-user.model.js.map +1 -1
  35. package/cjs/lib/entity/vas-form-config.dto.d.ts +2 -23
  36. package/cjs/lib/entity/vas-form-config.dto.d.ts.map +1 -1
  37. package/cjs/lib/entity/vas-form-config.dto.js.map +1 -1
  38. package/cjs/lib/entity/vas-form-config.model.d.ts +3 -13
  39. package/cjs/lib/entity/vas-form-config.model.d.ts.map +1 -1
  40. package/cjs/lib/entity/vas-form-config.model.js.map +1 -1
  41. package/cjs/lib/entity/vas-form.model.d.ts +1 -0
  42. package/cjs/lib/entity/vas-form.model.d.ts.map +1 -1
  43. package/cjs/lib/entity/vas-form.model.js +12 -1
  44. package/cjs/lib/entity/vas-form.model.js.map +1 -1
  45. package/cjs/lib/entity/vas-group.model.d.ts +1 -0
  46. package/cjs/lib/entity/vas-group.model.d.ts.map +1 -1
  47. package/cjs/lib/entity/vas-group.model.js +11 -0
  48. package/cjs/lib/entity/vas-group.model.js.map +1 -1
  49. package/cjs/lib/entity/vas-invitation.js +1 -1
  50. package/cjs/lib/entity/vas-invitation.js.map +1 -1
  51. package/cjs/lib/entity/vas-job-action.dto.d.ts +67 -0
  52. package/cjs/lib/entity/vas-job-action.dto.d.ts.map +1 -0
  53. package/cjs/lib/entity/vas-job-action.dto.js +20 -0
  54. package/cjs/lib/entity/vas-job-action.dto.js.map +1 -0
  55. package/cjs/lib/entity/vas-job-email.model.d.ts +2 -0
  56. package/cjs/lib/entity/vas-job-email.model.d.ts.map +1 -1
  57. package/cjs/lib/entity/vas-job-email.model.js +15 -9
  58. package/cjs/lib/entity/vas-job-email.model.js.map +1 -1
  59. package/cjs/lib/entity/vas-job.dto.d.ts +10 -2
  60. package/cjs/lib/entity/vas-job.dto.d.ts.map +1 -1
  61. package/cjs/lib/entity/vas-job.dto.js.map +1 -1
  62. package/cjs/lib/entity/vas-job.model.d.ts +13 -4
  63. package/cjs/lib/entity/vas-job.model.d.ts.map +1 -1
  64. package/cjs/lib/entity/vas-job.model.js +46 -16
  65. package/cjs/lib/entity/vas-job.model.js.map +1 -1
  66. package/cjs/lib/entity/vas-lookup.model.d.ts +1 -0
  67. package/cjs/lib/entity/vas-lookup.model.d.ts.map +1 -1
  68. package/cjs/lib/entity/vas-lookup.model.js +13 -1
  69. package/cjs/lib/entity/vas-lookup.model.js.map +1 -1
  70. package/cjs/lib/entity/vas-note.model.d.ts +1 -0
  71. package/cjs/lib/entity/vas-note.model.d.ts.map +1 -1
  72. package/cjs/lib/entity/vas-note.model.js +9 -0
  73. package/cjs/lib/entity/vas-note.model.js.map +1 -1
  74. package/cjs/lib/entity/vas-report.dto.d.ts +1 -1
  75. package/cjs/lib/entity/vas-report.dto.d.ts.map +1 -1
  76. package/cjs/lib/entity/vas-report.dto.js.map +1 -1
  77. package/cjs/lib/entity/vas-report.model.d.ts +5 -2
  78. package/cjs/lib/entity/vas-report.model.d.ts.map +1 -1
  79. package/cjs/lib/entity/vas-report.model.js +15 -4
  80. package/cjs/lib/entity/vas-report.model.js.map +1 -1
  81. package/cjs/lib/entity/vas-task.model.d.ts +1 -0
  82. package/cjs/lib/entity/vas-task.model.d.ts.map +1 -1
  83. package/cjs/lib/entity/vas-task.model.js +12 -0
  84. package/cjs/lib/entity/vas-task.model.js.map +1 -1
  85. package/cjs/lib/entity/vas-user.model.d.ts +1 -1
  86. package/cjs/lib/entity/vas-user.model.d.ts.map +1 -1
  87. package/cjs/lib/entity/vas-vehicle.model.d.ts.map +1 -1
  88. package/cjs/lib/entity/vas-vehicle.model.js.map +1 -1
  89. package/cjs/lib/utils/find-form-control.js.map +1 -1
  90. package/cjs/lib/utils/get-value-by-path.d.ts.map +1 -1
  91. package/cjs/lib/utils/get-value-by-path.js.map +1 -1
  92. package/cjs/lib/utils/is-array-string.d.ts +1 -1
  93. package/cjs/lib/utils/is-array-string.d.ts.map +1 -1
  94. package/cjs/lib/utils/omit.d.ts.map +1 -1
  95. package/cjs/lib/utils/omit.js.map +1 -1
  96. package/cjs/lib/utils/only.d.ts.map +1 -1
  97. package/cjs/lib/utils/only.js.map +1 -1
  98. package/{fesm2020 → fesm2022}/ironcode-vas-lib.mjs +712 -60
  99. package/fesm2022/ironcode-vas-lib.mjs.map +1 -0
  100. package/lib/entity/index.d.ts +1 -0
  101. package/lib/entity/vas-base.model.d.ts +1 -2
  102. package/lib/entity/vas-control.model.d.ts +2 -1
  103. package/lib/entity/vas-field.model.d.ts +10 -9
  104. package/lib/entity/vas-file.model.d.ts +1 -0
  105. package/lib/entity/vas-fire-user.model.d.ts +1 -1
  106. package/lib/entity/vas-form-config.dto.d.ts +2 -23
  107. package/lib/entity/vas-form-config.model.d.ts +3 -13
  108. package/lib/entity/vas-form.model.d.ts +1 -0
  109. package/lib/entity/vas-group.model.d.ts +1 -0
  110. package/lib/entity/vas-job-action.dto.d.ts +66 -0
  111. package/lib/entity/vas-job-email.model.d.ts +2 -0
  112. package/lib/entity/vas-job.dto.d.ts +10 -2
  113. package/lib/entity/vas-job.model.d.ts +13 -4
  114. package/lib/entity/vas-lookup.model.d.ts +1 -0
  115. package/lib/entity/vas-note.model.d.ts +1 -0
  116. package/lib/entity/vas-report.dto.d.ts +1 -1
  117. package/lib/entity/vas-report.model.d.ts +5 -2
  118. package/lib/entity/vas-task.model.d.ts +1 -0
  119. package/lib/entity/vas-user.model.d.ts +1 -1
  120. package/lib/utils/is-array-string.d.ts +1 -1
  121. package/package.json +4 -11
  122. package/cjs/package.json +0 -67
  123. package/esm2020/ironcode-vas-lib.mjs +0 -5
  124. package/esm2020/lib/control-value/index.mjs +0 -3
  125. package/esm2020/lib/control-value/vas-camera-control-value.model.mjs +0 -8
  126. package/esm2020/lib/control-value/vas-function-control-value.dto.mjs +0 -2
  127. package/esm2020/lib/controls-config/index.mjs +0 -5
  128. package/esm2020/lib/controls-config/vas-control-config-direction.enum.mjs +0 -8
  129. package/esm2020/lib/controls-config/vas-control-config.model.mjs +0 -2
  130. package/esm2020/lib/controls-config/vas-function-control-config.dto.mjs +0 -2
  131. package/esm2020/lib/controls-config/vas-select-control-config.model.mjs +0 -2
  132. package/esm2020/lib/elastic/index.mjs +0 -2
  133. package/esm2020/lib/elastic/job.elastic-doc.mjs +0 -2
  134. package/esm2020/lib/entity/index.mjs +0 -68
  135. package/esm2020/lib/entity/vas-access-group.dto.mjs +0 -2
  136. package/esm2020/lib/entity/vas-account-config.dto.mjs +0 -2
  137. package/esm2020/lib/entity/vas-account-object.dto.mjs +0 -2
  138. package/esm2020/lib/entity/vas-account-object.model.mjs +0 -24
  139. package/esm2020/lib/entity/vas-account.dto.mjs +0 -7
  140. package/esm2020/lib/entity/vas-base.dto.mjs +0 -2
  141. package/esm2020/lib/entity/vas-base.model.mjs +0 -34
  142. package/esm2020/lib/entity/vas-branch.dto.mjs +0 -2
  143. package/esm2020/lib/entity/vas-branch.model.mjs +0 -68
  144. package/esm2020/lib/entity/vas-contact-type.dto.mjs +0 -2
  145. package/esm2020/lib/entity/vas-contact.dto.mjs +0 -2
  146. package/esm2020/lib/entity/vas-contact.model.mjs +0 -99
  147. package/esm2020/lib/entity/vas-control-type.dto.mjs +0 -2
  148. package/esm2020/lib/entity/vas-control-type.model.mjs +0 -52
  149. package/esm2020/lib/entity/vas-control.dto.mjs +0 -2
  150. package/esm2020/lib/entity/vas-control.model.mjs +0 -171
  151. package/esm2020/lib/entity/vas-field.dto.mjs +0 -2
  152. package/esm2020/lib/entity/vas-field.model.mjs +0 -97
  153. package/esm2020/lib/entity/vas-file.dto.mjs +0 -9
  154. package/esm2020/lib/entity/vas-file.model.mjs +0 -125
  155. package/esm2020/lib/entity/vas-fire-user.dto.mjs +0 -2
  156. package/esm2020/lib/entity/vas-fire-user.model.mjs +0 -102
  157. package/esm2020/lib/entity/vas-form-config.dto.mjs +0 -2
  158. package/esm2020/lib/entity/vas-form-config.model.mjs +0 -31
  159. package/esm2020/lib/entity/vas-form.dto.mjs +0 -2
  160. package/esm2020/lib/entity/vas-form.model.mjs +0 -203
  161. package/esm2020/lib/entity/vas-group.dto.mjs +0 -2
  162. package/esm2020/lib/entity/vas-group.model.mjs +0 -97
  163. package/esm2020/lib/entity/vas-instruction-job-field.dto.mjs +0 -2
  164. package/esm2020/lib/entity/vas-instruction-job-field.model.mjs +0 -48
  165. package/esm2020/lib/entity/vas-instruction-job.dto.mjs +0 -2
  166. package/esm2020/lib/entity/vas-instruction-job.model.mjs +0 -81
  167. package/esm2020/lib/entity/vas-instruction-provider.dto.mjs +0 -2
  168. package/esm2020/lib/entity/vas-instruction-provider.model.mjs +0 -66
  169. package/esm2020/lib/entity/vas-instruction.dto.mjs +0 -2
  170. package/esm2020/lib/entity/vas-instruction.model.mjs +0 -52
  171. package/esm2020/lib/entity/vas-invitation.mjs +0 -88
  172. package/esm2020/lib/entity/vas-job-data.dto.mjs +0 -2
  173. package/esm2020/lib/entity/vas-job-data.model.mjs +0 -21
  174. package/esm2020/lib/entity/vas-job-email.dto.mjs +0 -2
  175. package/esm2020/lib/entity/vas-job-email.model.mjs +0 -79
  176. package/esm2020/lib/entity/vas-job-status.dto.mjs +0 -2
  177. package/esm2020/lib/entity/vas-job-type.dto.mjs +0 -2
  178. package/esm2020/lib/entity/vas-job.dto.mjs +0 -2
  179. package/esm2020/lib/entity/vas-job.model.mjs +0 -497
  180. package/esm2020/lib/entity/vas-lookup-type.dto.mjs +0 -2
  181. package/esm2020/lib/entity/vas-lookup.dto.mjs +0 -2
  182. package/esm2020/lib/entity/vas-lookup.model.mjs +0 -63
  183. package/esm2020/lib/entity/vas-membership.dto.mjs +0 -2
  184. package/esm2020/lib/entity/vas-membership.model.mjs +0 -62
  185. package/esm2020/lib/entity/vas-note.dto.mjs +0 -2
  186. package/esm2020/lib/entity/vas-note.model.mjs +0 -59
  187. package/esm2020/lib/entity/vas-report-layout.dto.mjs +0 -2
  188. package/esm2020/lib/entity/vas-report-layout.model.mjs +0 -22
  189. package/esm2020/lib/entity/vas-report-request.dto.mjs +0 -2
  190. package/esm2020/lib/entity/vas-report-request.model.mjs +0 -44
  191. package/esm2020/lib/entity/vas-report.dto.mjs +0 -2
  192. package/esm2020/lib/entity/vas-report.model.mjs +0 -57
  193. package/esm2020/lib/entity/vas-restricted-account-object.dto.mjs +0 -2
  194. package/esm2020/lib/entity/vas-restricted-account-object.model.mjs +0 -24
  195. package/esm2020/lib/entity/vas-task-type.dto.mjs +0 -2
  196. package/esm2020/lib/entity/vas-task.dto.mjs +0 -2
  197. package/esm2020/lib/entity/vas-task.model.mjs +0 -68
  198. package/esm2020/lib/entity/vas-user.dto.mjs +0 -2
  199. package/esm2020/lib/entity/vas-user.model.mjs +0 -42
  200. package/esm2020/lib/entity/vas-vehicle.dto.mjs +0 -2
  201. package/esm2020/lib/entity/vas-vehicle.model.mjs +0 -69
  202. package/esm2020/lib/model/geo-location.mjs +0 -12
  203. package/esm2020/lib/model/index.mjs +0 -3
  204. package/esm2020/lib/model/vas-time-range.model.mjs +0 -2
  205. package/esm2020/lib/utils/get-value-by-path.mjs +0 -64
  206. package/esm2020/lib/utils/is-array-string.mjs +0 -4
  207. package/esm2020/lib/utils/only.mjs +0 -22
  208. package/esm2020/public-api.mjs +0 -6
  209. package/fesm2015/ironcode-vas-lib.mjs +0 -2536
  210. package/fesm2015/ironcode-vas-lib.mjs.map +0 -1
  211. package/fesm2020/ironcode-vas-lib.mjs.map +0 -1
@@ -1,497 +0,0 @@
1
- import { isFileDto } from './vas-file.dto';
2
- import { UUID } from 'angular2-uuid';
3
- import moment from 'moment';
4
- import { getValueByPath } from '../utils/get-value-by-path';
5
- import { VasFieldModel } from './vas-field.model';
6
- import { VasRestrictedAccountObjectModel } from './vas-restricted-account-object.model';
7
- import { getEmptyGeoLocation } from '../model/geo-location';
8
- import { isCameraControlValueV1 } from '../control-value/vas-camera-control-value.model';
9
- import { isArrayString } from '../utils/is-array-string';
10
- /**
11
- * JobModel
12
- */
13
- export class VasJobModel extends VasRestrictedAccountObjectModel {
14
- constructor(id, created, serverCreated, createdBy, modified, serverModified, modifiedBy, createdByName, modifiedByName, account, accessGroup, reference, jobDate, jobStatus, jobType, assigneeId, formId, timeZoneOffset, pendingFields, childModified, version, fields, files, createdByDisplayName, modifiedByDisplayName, geoLocation) {
15
- super(id, created, serverCreated, createdBy, modified, serverModified, modifiedBy, createdByName, modifiedByName, account, accessGroup);
16
- this.id = id;
17
- this.created = created;
18
- this.serverCreated = serverCreated;
19
- this.createdBy = createdBy;
20
- this.modified = modified;
21
- this.serverModified = serverModified;
22
- this.modifiedBy = modifiedBy;
23
- this.createdByName = createdByName;
24
- this.modifiedByName = modifiedByName;
25
- this.account = account;
26
- this.accessGroup = accessGroup;
27
- this.reference = reference;
28
- this.jobDate = jobDate;
29
- this.jobStatus = jobStatus;
30
- this.jobType = jobType;
31
- this.assigneeId = assigneeId;
32
- this.formId = formId;
33
- this.timeZoneOffset = timeZoneOffset;
34
- this.pendingFields = pendingFields;
35
- this.childModified = childModified;
36
- this.version = version;
37
- this.fields = fields;
38
- this.files = files;
39
- this.createdByDisplayName = createdByDisplayName;
40
- this.modifiedByDisplayName = modifiedByDisplayName;
41
- this.geoLocation = geoLocation;
42
- }
43
- /**
44
- * Returns this with the dynamic interface
45
- * @return {VasJobModelDynamicInterface}
46
- */
47
- get $this() {
48
- return this;
49
- }
50
- /**
51
- * Returns a list of Job dynamic properties i.e. those that are added by the
52
- * dynamic forms
53
- */
54
- get dynamicProperties() {
55
- const nativeProps = this.staticProperties;
56
- return Object
57
- .getOwnPropertyNames(this)
58
- .filter(prop => !nativeProps.includes(prop));
59
- }
60
- /**
61
- * Returns the list of properties of the Job type
62
- */
63
- get staticProperties() {
64
- return Object.getOwnPropertyNames(VasJobModel.empty());
65
- }
66
- /**
67
- * @return {VasJobModel}
68
- */
69
- static empty() {
70
- return new VasJobModel('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', moment().utcOffset(), 0, '', 0, [], [], '', '', getEmptyGeoLocation());
71
- }
72
- static fromDto(dto) {
73
- const model = new VasJobModel(dto.id || '', dto.created || '', dto.serverCreated || '', dto.createdBy || '', dto.modified || '', dto.serverModified || '', dto.modifiedBy || '', dto.createdByName || '', dto.modifiedByName || '', dto.account || '', dto.accessGroup || '', dto.reference || '', dto.jobDate || '', dto.jobStatus || '', dto.jobType || '', dto.assigneeId || '', dto.formId || dto.lastForm || '', dto.timeZoneOffset || moment().utcOffset(), dto.pendingFields || 0, dto.childModified || '', dto.version || 0, dto.fields || [], dto.files || [], dto.createdByDisplayName || '', dto.modifiedByDisplayName || '', dto.geoLocation || getEmptyGeoLocation());
74
- const emptyKeys = model.staticProperties;
75
- Object
76
- .keys(dto)
77
- .filter(key => emptyKeys.indexOf(key) === -1)
78
- .forEach((key) => model.$this[key] = dto[key]);
79
- return model;
80
- }
81
- /**
82
- * This method will instantiate a new JobModel. The difference with this
83
- * method of instantiation is that we are coming from a relation frame i.e.
84
- * the job has a list of {@link VasFieldDto} instead of a Job document.
85
- *
86
- */
87
- static fromRelational(dto, form) {
88
- const model = new VasJobModel(dto.id || '', dto.created || '', dto.serverCreated || '', dto.createdBy || '', dto.modified || '', dto.serverModified || '', dto.modifiedBy || '', dto.createdByName || '', dto.modifiedByName || '', dto.account || '', dto.accessGroup || '', dto.reference || '', dto.jobDate || '', dto.jobStatus || '', dto.jobType || '', dto.assigneeId || '', dto.formId || '', dto.timeZoneOffset || moment().utcOffset(), dto.pendingFields || 0, dto.childModified || '', dto.version || 0, dto.fields || [], dto.files || [], dto.createdByDisplayName || '', dto.modifiedByDisplayName || '', dto.geoLocation || getEmptyGeoLocation());
89
- form.groups
90
- .forEach(group => {
91
- group.controls
92
- .forEach(control => {
93
- const field = dto.fields?.find(f => f.control === control.id);
94
- if (!field) {
95
- return;
96
- }
97
- model.getGroup(group.name)[control.name] = field.value;
98
- });
99
- });
100
- return model;
101
- }
102
- /**
103
- * @param {VasFormModel} formModel
104
- * @return {Record<string, VasFieldDtoValue>}
105
- */
106
- getFields(formModel) {
107
- const fields = {};
108
- formModel.groups
109
- .forEach(group => {
110
- group.controls.forEach(control => {
111
- (fields)[control.reportTemplateName] =
112
- this.getValueByPath([group.name, control.name]) || null;
113
- });
114
- });
115
- return fields;
116
- }
117
- /**
118
- * Will return an object whose keys are the names of all fields in the job.
119
- * This method is similar to `getFields` except that this method will only
120
- * return values where a value was set, as opposed to `getFields` which will
121
- * return a value for every control even if not value was set, because it uses
122
- * the form to drive the logic. Note also this method will return values for
123
- * any Fields in the fields array.
124
- * @return {Record<string, VasFieldDtoValue>}
125
- */
126
- getFields2() {
127
- let fields = {};
128
- this.dynamicProperties
129
- .forEach((groupName) => {
130
- Object
131
- .keys(this.$this[groupName])
132
- .forEach(controlName => {
133
- fields[controlName] =
134
- this.getValueByPath([groupName, controlName]) || null;
135
- });
136
- }, {});
137
- this.fields.forEach(field => fields[field.controlName] = field.value);
138
- return fields;
139
- }
140
- /**
141
- * Returns an object describing how many attachments were added to this job
142
- * (camera controls and files), and how many have not been uploaded yet.
143
- *
144
- * @param formModel instance of {@link VasFormModel} that was used when the
145
- * job was created
146
- */
147
- getFilesUploadStatus(formModel) {
148
- const pathsWithValue = formModel
149
- .getCameraControlPaths()
150
- .map(path => {
151
- const value = this.getValueByPath(path);
152
- if (value && !!value.id) {
153
- return path;
154
- }
155
- return null;
156
- })
157
- .filter(path => path !== null ? path : null)
158
- .filter(isArrayString);
159
- let total = pathsWithValue.length;
160
- total += this.files.length;
161
- // calculate the number of camera images still to upload
162
- let pending = pathsWithValue
163
- .map(path => this.getValueByPath(path))
164
- .map((value) => {
165
- if (isFileDto(value)) {
166
- return value.id && value.status !== 'COMPLETE';
167
- }
168
- else if (isCameraControlValueV1(value)) {
169
- // if url is not set, it hasn't been uploaded
170
- return value.id && !value.url;
171
- }
172
- return false;
173
- })
174
- .filter(hasUploaded => hasUploaded)
175
- .length;
176
- // add total from files that are pending
177
- pending += this.files
178
- .filter(value => value.status !== 'COMPLETE')
179
- .length;
180
- return {
181
- pending,
182
- total
183
- };
184
- }
185
- /**
186
- * This method will return the dynamic property from the JobModel that
187
- * represent a group (from a form).
188
- *
189
- * @param name the name of the group
190
- * @param init if true (default) and group is not found, initialise an empty
191
- * group, otherwise throw an error
192
- */
193
- getGroup(name, init = true) {
194
- let prop;
195
- if (this.staticProperties.includes(name)) {
196
- throw Error(`invalid group name ${name}, not a dynamic property`);
197
- }
198
- else if (this.$this[name] === undefined) {
199
- if (init) {
200
- prop = this.$this[name] = {};
201
- }
202
- else {
203
- throw Error(`invalid group name ${name}, not found`);
204
- }
205
- }
206
- else {
207
- prop = this.$this[name];
208
- if (typeof prop !== 'object') {
209
- throw Error(`invalid group name ${name}, not an object`);
210
- }
211
- }
212
- return prop;
213
- }
214
- /**
215
- * @param path path segments
216
- */
217
- getValueByPath(path = []) {
218
- return getValueByPath(path, this.$this);
219
- }
220
- /**
221
- * In order to understand why we need this method it is important to
222
- * understand that within the system, Jobs can be represented in one of two
223
- * ways, document and relational.
224
- *
225
- * The important distinction is how values submitted by a form are stored.
226
- *
227
- * Jobs stored as documents (JSON objects) will store user values, as dynamic
228
- * properties of the document.
229
- *
230
- * Whereas, Jobs stored as relational, will store user values in an array of
231
- * {@link VasFieldDto} objects.
232
- *
233
- * Depending on where we are in the system, either one of these approaches can
234
- * be more useful than the other.
235
- *
236
- * This method, assumes that the JobModel has been instantiated from a
237
- * document representation, and serves to hydrate the fields array. In order
238
- * to achieve this, knowledge of the {@link VasFormDto} that created the job
239
- * is required.
240
- *
241
- *
242
- * Job in document representation
243
- * {
244
- * id: <guid>,
245
- * reference: "something"
246
- * <other static job properties>...
247
- * foo: {
248
- * bar: "value"
249
- * }
250
- * }
251
- *
252
- * Job in relational representation
253
- * {
254
- * id: <guid>,
255
- * reference: "something"
256
- * <other static job properties>...
257
- * <will not have dynamic properties>...
258
- * fields: [
259
- * {
260
- * id: <guid>,
261
- * <other field properties>,
262
- * value: "value"
263
- * }
264
- * ]
265
- * }
266
- *
267
- *
268
- * @param formModel the VasFormModel that was used to create the job
269
- * @param controlFieldIdMap This is used to determine the id each field.
270
- * Either one will be found in the map, or a new one is generated.
271
- * @param controlNames if a value is provided, it will be used
272
- * to filter the fields that are returned.
273
- * @return {Array<VasFieldDto>}
274
- */
275
- hydrateFields(formModel, controlFieldIdMap = new Map(), controlNames) {
276
- const fields = [];
277
- formModel.groups
278
- .forEach(group => {
279
- group.controls.forEach(control => {
280
- if (!control.name.startsWith('fields.')) {
281
- return;
282
- }
283
- if (controlNames && !controlNames.includes(control.name)) {
284
- return;
285
- }
286
- fields.push(VasFieldModel.fromDto({
287
- // if the controlId exists in the map, use the associated fieldId,
288
- // otherwise generate a new id for the field.
289
- id: controlFieldIdMap.get(control.id) || UUID.UUID(),
290
- account: this.account,
291
- job: this.id,
292
- createdBy: this.createdBy,
293
- created: this.created,
294
- modifiedBy: this.modifiedBy,
295
- modified: this.modified,
296
- control: control.id,
297
- value: this.getValueByPath([group.name, control.name])
298
- }));
299
- });
300
- });
301
- this.fields = fields;
302
- }
303
- /**
304
- * A very non sophisticated way to set values in the job via paths
305
- *
306
- * For example:
307
- *
308
- * setValueByPath('value', ['foo', 'bar']);
309
- *
310
- * will make results in job
311
- * {
312
- * foo: {
313
- * bar: 'value'
314
- * }
315
- * }
316
- *
317
- * @param value the value to set
318
- * @param path path segments
319
- */
320
- setValueByPath(value, path = []) {
321
- switch (path.length) {
322
- case 0: {
323
- return;
324
- }
325
- case 1: {
326
- this[path[0]] = value;
327
- return;
328
- }
329
- case 2: {
330
- // eslint-disable-next-line max-len
331
- this.$this[path[0]][path[1]] = value;
332
- return;
333
- }
334
- case 3: {
335
- // eslint-disable-next-line max-len
336
- this.$this[path[0]][path[1]][path[2]] = value;
337
- return;
338
- }
339
- default: {
340
- throw Error('path has too many segments');
341
- }
342
- }
343
- }
344
- /**
345
- * @param staticOnly if true, will only output values for the static
346
- * properties in the dto
347
- */
348
- toDto(staticOnly = false) {
349
- if (staticOnly) {
350
- return {
351
- id: this.id,
352
- created: this.created,
353
- createdBy: this.createdBy,
354
- modified: this.modified,
355
- modifiedBy: this.modifiedBy,
356
- serverCreated: this.serverCreated,
357
- serverModified: this.serverModified,
358
- createdByName: this.createdByName,
359
- modifiedByName: this.modifiedByName,
360
- account: this.account,
361
- accessGroup: this.accessGroup,
362
- reference: this.reference,
363
- jobDate: this.jobDate,
364
- jobStatus: this.jobStatus,
365
- jobType: this.jobType,
366
- assigneeId: this.assigneeId,
367
- formId: this.formId,
368
- timeZoneOffset: this.timeZoneOffset,
369
- pendingFields: this.pendingFields,
370
- childModified: this.childModified,
371
- version: this.version,
372
- fields: this.fields,
373
- files: this.files,
374
- createdByDisplayName: this.createdByDisplayName,
375
- modifiedByDisplayName: this.modifiedByDisplayName,
376
- geoLocation: this.geoLocation
377
- };
378
- }
379
- const dto = {};
380
- [...this.staticProperties, ...this.dynamicProperties]
381
- .forEach(prop => dto[prop] = this.$this[prop]);
382
- return dto;
383
- }
384
- /**
385
- * This method will parse a syntax that allows us to build strings from the
386
- * values of from the job model. For example if the job model was:
387
- *
388
- * {
389
- * foo: 'bar'
390
- * }
391
- *
392
- * and we pass "i am foo {foo}", the result would be:
393
- *
394
- * "i am foo bar"
395
- *
396
- * we can also use moment to parse dates, for example if the job model was:
397
- *
398
- * {
399
- * created: "2022-01-01T00:00:00+0000"
400
- * }
401
- *
402
- * and we pass "{created|date:YY-MM-DD}", the result would be:
403
- *
404
- * "2022-01-01"
405
- *
406
- * @param {string} value a string with the syntax
407
- * @param {ParseSyntaxOptions} options
408
- * @return the results of parsing the syntax on this job
409
- */
410
- parseSyntax(value, options = {
411
- timeZoneOffset: 0
412
- }) {
413
- if (!value || typeof value !== 'string') {
414
- return '';
415
- }
416
- return value.replace(/({[^}]*})/g, (match, token) => {
417
- const syntax = token.substring(1, token.length - 1);
418
- let [key, filter] = syntax.split('|');
419
- key = (key || '').trim();
420
- filter = (filter || '').trim();
421
- let filterName, filterArg = '';
422
- if (filter) {
423
- const splitIndex = filter.indexOf(':');
424
- if (splitIndex !== -1) {
425
- filterName = filter.substring(0, splitIndex);
426
- filterArg = filter.substring(splitIndex + 1);
427
- }
428
- else {
429
- filterName = filter;
430
- filterArg = '';
431
- }
432
- filterName = (filterName || '').trim();
433
- filterArg = (filterArg || '').trim();
434
- }
435
- const path = key.split('.');
436
- const objectKey = path.shift() || '';
437
- let result = '';
438
- if (objectKey === 'job') {
439
- result = (this.getValueByPath(path) || '').toString();
440
- }
441
- else if (objectKey === 'fields') {
442
- result = (getValueByPath(['fields.' + path.shift(), ...path], this.getFields2()) || '').toString();
443
- }
444
- else if (objectKey.length) {
445
- if (options.objects) {
446
- if (options.objects[objectKey] === undefined) {
447
- console.debug(`objectKey ${objectKey} is not present in options.object`);
448
- result = '';
449
- }
450
- else {
451
- result = (getValueByPath(path, options.objects[objectKey]) || '')
452
- .toString();
453
- }
454
- }
455
- else {
456
- console.debug(`objectKey ${objectKey} was used but options.object is not set`);
457
- return '';
458
- }
459
- }
460
- else {
461
- return '';
462
- }
463
- if (filterName && result) {
464
- switch (filterName) {
465
- case 'date': {
466
- return moment(result)
467
- .utcOffset(options.timeZoneOffset)
468
- .format(filterArg || '');
469
- }
470
- default: {
471
- console.warn('unknown filter %s', filterName);
472
- }
473
- }
474
- }
475
- return result;
476
- }).trim();
477
- }
478
- ;
479
- /**
480
- * @return {object}
481
- */
482
- toApiDto() {
483
- return {
484
- ...super.toApiDto(),
485
- reference: this.reference || '~',
486
- jobDate: this.jobDate || '~',
487
- jobType: this.jobType || '~',
488
- accessGroup: this.accessGroup || '~',
489
- jobStatus: this.jobStatus || '~',
490
- assigneeId: this.assigneeId || '~',
491
- timeZoneOffset: this.timeZoneOffset || 0,
492
- pendingFields: this.pendingFields || 0,
493
- lastForm: this.formId || '~'
494
- };
495
- }
496
- }
497
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWpvYi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Zhcy1saWIvc3JjL2xpYi9lbnRpdHkvdmFzLWpvYi5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdsRCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQWUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQThCLE1BQU0saURBQWlELENBQUM7QUFDckgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBcUJ6RDs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsK0JBQStCO0lBRTlELFlBQ2tCLEVBQVUsRUFDVixPQUFlLEVBQ2YsYUFBcUIsRUFDckIsU0FBaUIsRUFDakIsUUFBZ0IsRUFDaEIsY0FBc0IsRUFDdEIsVUFBa0IsRUFDbEIsYUFBcUIsRUFDckIsY0FBc0IsRUFDdEIsT0FBZSxFQUNmLFdBQW1CLEVBQzVCLFNBQWlCLEVBQ2pCLE9BQWUsRUFDZixTQUFpQixFQUNqQixPQUFlLEVBQ2YsVUFBa0IsRUFDbEIsTUFBYyxFQUNkLGNBQXNCLEVBQ3RCLGFBQXFCLEVBQ3JCLGFBQXFCLEVBQ3JCLE9BQWUsRUFDZixNQUEwQixFQUMxQixLQUF3QixFQUN4QixvQkFBNEIsRUFDNUIscUJBQTZCLEVBQzdCLFdBQXdCO1FBRS9CLEtBQUssQ0FD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UyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7NkJBQ2pDLE1BQU0sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQzVCO29CQUNELE9BQU8sQ0FBQyxDQUFDO3dCQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLENBQUM7cUJBQy9DO2lCQUNGO2FBQ0Y7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFBQSxDQUFDO0lBRUY7O09BRUc7SUFDTSxRQUFRO1FBQ2YsT0FBTztZQUNMLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxHQUFHO1lBQ2hDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLEdBQUc7WUFDNUIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksR0FBRztZQUM1QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxHQUFHO1lBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLEdBQUc7WUFDaEMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksR0FBRztZQUNsQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDO1lBQ3hDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUM7WUFDdEMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksR0FBRztTQUM3QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNGaWxlRHRvLCBWYXNGaWxlRHRvIH0gZnJvbSAnLi92YXMtZmlsZS5kdG8nO1xuaW1wb3J0IHsgVVVJRCB9IGZyb20gJ2FuZ3VsYXIyLXV1aWQnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgZ2V0VmFsdWVCeVBhdGggfSBmcm9tICcuLi91dGlscy9nZXQtdmFsdWUtYnktcGF0aCc7XG5pbXBvcnQgeyBWYXNCYXNlRHRvIH0gZnJvbSAnLi92YXMtYmFzZS5kdG8nO1xuaW1wb3J0IHsgVmFzRmllbGREdG8sIFZhc0ZpZWxkRHRvVmFsdWUgfSBmcm9tICcuL3Zhcy1maWVsZC5kdG8nO1xuaW1wb3J0IHsgVmFzRmllbGRNb2RlbCB9IGZyb20gJy4vdmFzLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IFZhc0Zvcm1Nb2RlbCB9IGZyb20gJy4vdmFzLWZvcm0ubW9kZWwnO1xuaW1wb3J0IHsgVmFzSm9iRHRvIH0gZnJvbSAnLi92YXMtam9iLmR0byc7XG5pbXBvcnQgeyBWYXNSZXN0cmljdGVkQWNjb3VudE9iamVjdE1vZGVsIH0gZnJvbSAnLi92YXMtcmVzdHJpY3RlZC1hY2NvdW50LW9iamVjdC5tb2RlbCc7XG5pbXBvcnQgeyBHZW9Mb2NhdGlvbiwgZ2V0RW1wdHlHZW9Mb2NhdGlvbiB9IGZyb20gJy4uL21vZGVsL2dlby1sb2NhdGlvbic7XG5pbXBvcnQgeyBpc0NhbWVyYUNvbnRyb2xWYWx1ZVYxLCBWYXNDYW1lcmFDb250cm9sVmFsdWVNb2RlbCB9IGZyb20gJy4uL2NvbnRyb2wtdmFsdWUvdmFzLWNhbWVyYS1jb250cm9sLXZhbHVlLm1vZGVsJztcbmltcG9ydCB7IGlzQXJyYXlTdHJpbmcgfSBmcm9tICcuLi91dGlscy9pcy1hcnJheS1zdHJpbmcnO1xuaW1wb3J0IHsgVmFzRm9ybUR0byB9IGZyb20gJy4vdmFzLWZvcm0uZHRvJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFZhc0pvYk1vZGVsRHluYW1pY0ludGVyZmFjZSB7XG4gIFtzOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZVN5bnRheE9wdGlvbnMge1xuICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCB0byBhZGp1c3QgYW55IGRhdGV0aW1lIHZhbHVlcyB0aGF0IGFyZSByZWZlcmVuY2VkXG4gIC8vIGluIHRoZSBzeW50YXggc3RyaW5nLiBTZWVcbiAgLy8gaHR0cHM6Ly9tb21lbnRqc2NvbS5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvbW9tZW50LzAzLW1hbmlwdWxhdGluZy8wOS11dGMtb2Zmc2V0L1xuICAvLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgYG1vbWVudGAgd2lsbCBoYW5kbGUgdGhlIHZhbHVlLlxuICB0aW1lWm9uZU9mZnNldDogbnVtYmVyLFxuICAvLyB0aGlzIGRpY3Rpb25hcnkgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250YWluIG90aGVyIG9iamVjdHMgdG8gYmUgcmVmZXJlbmNlZFxuICAvLyBpbiB0aGUgc3ludGF4LiBGb3IgZXhhbXBsZSBpZiB3ZSBoYXZlIHtqb2IuZm9vfSB0aGlzIHdpbGwgcmVmZXJlbmNlIHRoZVxuICAvLyBqb2IncyBgZm9vYCBwcm9wZXJ0eSwgaG93ZXZlciBpZiB3ZSBoYXZlIFwicmVwb3J0TGF5b3V0LnRpdGxlXCIgdGhpcyB3aWxsXG4gIC8vIGV4cGVjdCB0byBmaW5kIGEgcHJvcGVydHkgb2YgYG9iamVjdHNgIGNhbGxlZCBgcmVwb3J0TGF5b3V0YCB3aGljaCB3aWxsXG4gIC8vIGhhdmUgYSBwcm9wZXJ0eSBjYWxsZWQgYHRpdGxlYFxuICBvYmplY3RzPzogUmVjb3JkPHN0cmluZywgUGFydGlhbDxWYXNCYXNlRHRvPiB8IFJlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+Pjtcbn1cblxuLyoqXG4gKiBKb2JNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgVmFzSm9iTW9kZWwgZXh0ZW5kcyBWYXNSZXN0cmljdGVkQWNjb3VudE9iamVjdE1vZGVsIHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgb3ZlcnJpZGUgaWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgY3JlYXRlZDogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJ2ZXJDcmVhdGVkOiBzdHJpbmcsXG4gICAgcHVibGljIG92ZXJyaWRlIGNyZWF0ZWRCeTogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBtb2RpZmllZDogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJ2ZXJNb2RpZmllZDogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBtb2RpZmllZEJ5OiBzdHJpbmcsXG4gICAgcHVibGljIG92ZXJyaWRlIGNyZWF0ZWRCeU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgbW9kaWZpZWRCeU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgYWNjb3VudDogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBhY2Nlc3NHcm91cDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWZlcmVuY2U6IHN0cmluZyxcbiAgICBwdWJsaWMgam9iRGF0ZTogc3RyaW5nLFxuICAgIHB1YmxpYyBqb2JTdGF0dXM6IHN0cmluZyxcbiAgICBwdWJsaWMgam9iVHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyBhc3NpZ25lZUlkOiBzdHJpbmcsXG4gICAgcHVibGljIGZvcm1JZDogc3RyaW5nLFxuICAgIHB1YmxpYyB0aW1lWm9uZU9mZnNldDogbnVtYmVyLFxuICAgIHB1YmxpYyBwZW5kaW5nRmllbGRzOiBudW1iZXIsXG4gICAgcHVibGljIGNoaWxkTW9kaWZpZWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgdmVyc2lvbjogbnVtYmVyLFxuICAgIHB1YmxpYyBmaWVsZHM6IEFycmF5PFZhc0ZpZWxkRHRvPixcbiAgICBwdWJsaWMgZmlsZXM6IEFycmF5PFZhc0ZpbGVEdG8+LFxuICAgIHB1YmxpYyBjcmVhdGVkQnlEaXNwbGF5TmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyBtb2RpZmllZEJ5RGlzcGxheU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgZ2VvTG9jYXRpb246IEdlb0xvY2F0aW9uXG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgaWQsXG4gICAgICBjcmVhdGVkLFxuICAgICAgc2VydmVyQ3JlYXRlZCxcbiAgICAgIGNyZWF0ZWRCeSxcbiAgICAgIG1vZGlmaWVkLFxuICAgICAgc2VydmVyTW9kaWZpZWQsXG4gICAgICBtb2RpZmllZEJ5LFxuICAgICAgY3JlYXRlZEJ5TmFtZSxcbiAgICAgIG1vZGlmaWVkQnlOYW1lLFxuICAgICAgYWNjb3VudCxcbiAgICAgIGFjY2Vzc0dyb3VwXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoaXMgd2l0aCB0aGUgZHluYW1pYyBpbnRlcmZhY2VcbiAgICogQHJldHVybiB7VmFzSm9iTW9kZWxEeW5hbWljSW50ZXJmYWNlfVxuICAgKi9cbiAgZ2V0ICR0aGlzKCk6IFZhc0pvYk1vZGVsRHluYW1pY0ludGVyZmFjZSB7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIEpvYiBkeW5hbWljIHByb3BlcnRpZXMgaS5lLiB0aG9zZSB0aGF0IGFyZSBhZGRlZCBieSB0aGVcbiAgICogZHluYW1pYyBmb3Jtc1xuICAgKi9cbiAgZ2V0IGR5bmFtaWNQcm9wZXJ0aWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGNvbnN0IG5hdGl2ZVByb3BzID0gdGhpcy5zdGF0aWNQcm9wZXJ0aWVzO1xuICAgIHJldHVybiBPYmplY3RcbiAgICAgIC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpXG4gICAgICAuZmlsdGVyKHByb3AgPT4gIW5hdGl2ZVByb3BzLmluY2x1ZGVzKHByb3ApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMgb2YgdGhlIEpvYiB0eXBlXG4gICAqL1xuICBnZXQgc3RhdGljUHJvcGVydGllcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoVmFzSm9iTW9kZWwuZW1wdHkoKSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7VmFzSm9iTW9kZWx9XG4gICAqL1xuICBzdGF0aWMgZW1wdHkoKTogVmFzSm9iTW9kZWwge1xuICAgIHJldHVybiBuZXcgVmFzSm9iTW9kZWwoXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgbW9tZW50KCkudXRjT2Zmc2V0KCksXG4gICAgICAwLFxuICAgICAgJycsXG4gICAgICAwLFxuICAgICAgW10sXG4gICAgICBbXSxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICBnZXRFbXB0eUdlb0xvY2F0aW9uKClcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGZyb21EdG8oZHRvOiBQYXJ0aWFsPFZhc0pvYkR0bz4pOiBWYXNKb2JNb2RlbCB7XG4gICAgY29uc3QgbW9kZWwgPSBuZXcgVmFzSm9iTW9kZWwoXG4gICAgICBkdG8uaWQgfHwgJycsXG4gICAgICBkdG8uY3JlYXRlZCB8fCAnJyxcbiAgICAgIGR0by5zZXJ2ZXJDcmVhdGVkIHx8ICcnLFxuICAgICAgZHRvLmNyZWF0ZWRCeSB8fCAnJyxcbiAgICAgIGR0by5tb2RpZmllZCB8fCAnJyxcbiAgICAgIGR0by5zZXJ2ZXJNb2RpZmllZCB8fCAnJyxcbiAgICAgIGR0by5tb2RpZmllZEJ5IHx8ICcnLFxuICAgICAgZHRvLmNyZWF0ZWRCeU5hbWUgfHwgJycsXG4gICAgICBkdG8ubW9kaWZpZWRCeU5hbWUgfHwgJycsXG4gICAgICBkdG8uYWNjb3VudCB8fCAnJyxcbiAgICAgIGR0by5hY2Nlc3NHcm91cCB8fCAnJyxcbiAgICAgIGR0by5yZWZlcmVuY2UgfHwgJycsXG4gICAgICBkdG8uam9iRGF0ZSB8fCAnJyxcbiAgICAgIGR0by5qb2JTdGF0dXMgfHwgJycsXG4gICAgICBkdG8uam9iVHlwZSB8fCAnJyxcbiAgICAgIGR0by5hc3NpZ25lZUlkIHx8ICcnLFxuICAgICAgZHRvLmZvcm1JZCB8fCAoZHRvIGFzIGFueSkubGFzdEZvcm0gfHwgJycsXG4gICAgICBkdG8udGltZVpvbmVPZmZzZXQgfHwgbW9tZW50KCkudXRjT2Zmc2V0KCksXG4gICAgICBkdG8ucGVuZGluZ0ZpZWxkcyB8fCAwLFxuICAgICAgZHRvLmNoaWxkTW9kaWZpZWQgfHwgJycsXG4gICAgICBkdG8udmVyc2lvbiB8fCAwLFxuICAgICAgZHRvLmZpZWxkcyB8fCBbXSxcbiAgICAgIGR0by5maWxlcyB8fCBbXSxcbiAgICAgIGR0by5jcmVhdGVkQnlEaXNwbGF5TmFtZSB8fCAnJyxcbiAgICAgIGR0by5tb2RpZmllZEJ5RGlzcGxheU5hbWUgfHwgJycsXG4gICAgICBkdG8uZ2VvTG9jYXRpb24gfHwgZ2V0RW1wdHlHZW9Mb2NhdGlvbigpXG4gICAgKTtcbiAgICBjb25zdCBlbXB0eUtleXMgPSBtb2RlbC5zdGF0aWNQcm9wZXJ0aWVzO1xuICAgIE9iamVjdFxuICAgICAgLmtleXMoZHRvKVxuICAgICAgLmZpbHRlcihrZXkgPT4gZW1wdHlLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpXG4gICAgICAuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+XG4gICAgICAgIG1vZGVsLiR0aGlzW2tleV0gPSAoZHRvIGFzIFZhc0pvYk1vZGVsRHluYW1pY0ludGVyZmFjZSlba2V5XVxuICAgICAgKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBpbnN0YW50aWF0ZSBhIG5ldyBKb2JNb2RlbC4gVGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGlzXG4gICAqIG1ldGhvZCBvZiBpbnN0YW50aWF0aW9uIGlzIHRoYXQgd2UgYXJlIGNvbWluZyBmcm9tIGEgcmVsYXRpb24gZnJhbWUgaS5lLlxuICAgKiB0aGUgam9iIGhhcyBhIGxpc3Qgb2Yge0BsaW5rIFZhc0ZpZWxkRHRvfSBpbnN0ZWFkIG9mIGEgSm9iIGRvY3VtZW50LlxuICAgKlxuICAgKi9cbiAgc3RhdGljIGZyb21SZWxhdGlvbmFsKFxuICAgIGR0bzogUGFydGlhbDxWYXNKb2JEdG8+LFxuICAgIGZvcm06IFZhc0Zvcm1EdG9cbiAgKTogVmFzSm9iTW9kZWwge1xuICAgIGNvbnN0IG1vZGVsID0gbmV3IFZhc0pvYk1vZGVsKFxuICAgICAgZHRvLmlkIHx8ICcnLFxuICAgICAgZHRvLmNyZWF0ZWQgfHwgJycsXG4gICAgICBkdG8uc2VydmVyQ3JlYXRlZCB8fCAnJyxcbiAgICAgIGR0by5jcmVhdGVkQnkgfHwgJycsXG4gICAgICBkdG8ubW9kaWZpZWQgfHwgJycsXG4gICAgICBkdG8uc2VydmVyTW9kaWZpZWQgfHwgJycsXG4gICAgICBkdG8ubW9kaWZpZWRCeSB8fCAnJyxcbiAgICAgIGR0by5jcmVhdGVkQnlOYW1lIHx8ICcnLFxuICAgICAgZHRvLm1vZGlmaWVkQnlOYW1lIHx8ICcnLFxuICAgICAgZHRvLmFjY291bnQgfHwgJycsXG4gICAgICBkdG8uYWNjZXNzR3JvdXAgfHwgJycsXG4gICAgICBkdG8ucmVmZXJlbmNlIHx8ICcnLFxuICAgICAgZHRvLmpvYkRhdGUgfHwgJycsXG4gICAgICBkdG8uam9iU3RhdHVzIHx8ICcnLFxuICAgICAgZHRvLmpvYlR5cGUgfHwgJycsXG4gICAgICBkdG8uYXNzaWduZWVJZCB8fCAnJyxcbiAgICAgIGR0by5mb3JtSWQgfHwgJycsXG4gICAgICBkdG8udGltZVpvbmVPZmZzZXQgfHwgbW9tZW50KCkudXRjT2Zmc2V0KCksXG4gICAgICBkdG8ucGVuZGluZ0ZpZWxkcyB8fCAwLFxuICAgICAgZHRvLmNoaWxkTW9kaWZpZWQgfHwgJycsXG4gICAgICBkdG8udmVyc2lvbiB8fCAwLFxuICAgICAgZHRvLmZpZWxkcyB8fCBbXSxcbiAgICAgIGR0by5maWxlcyB8fCBbXSxcbiAgICAgIGR0by5jcmVhdGVkQnlEaXNwbGF5TmFtZSB8fCAnJyxcbiAgICAgIGR0by5tb2RpZmllZEJ5RGlzcGxheU5hbWUgfHwgJycsXG4gICAgICBkdG8uZ2VvTG9jYXRpb24gfHwgZ2V0RW1wdHlHZW9Mb2NhdGlvbigpXG4gICAgKTtcblxuICAgIGZvcm0uZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgIGdyb3VwLmNvbnRyb2xzXG4gICAgICAgICAgLmZvckVhY2goY29udHJvbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGR0by5maWVsZHM/LmZpbmQoZiA9PiBmLmNvbnRyb2wgPT09IGNvbnRyb2wuaWQpO1xuICAgICAgICAgICAgaWYgKCFmaWVsZCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtb2RlbC5nZXRHcm91cChncm91cC5uYW1lKVtjb250cm9sLm5hbWVdID0gZmllbGQudmFsdWU7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtWYXNGb3JtTW9kZWx9IGZvcm1Nb2RlbFxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPn1cbiAgICovXG4gIGdldEZpZWxkcyhmb3JtTW9kZWw6IFZhc0Zvcm1Nb2RlbCk6IFJlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+IHtcbiAgICBjb25zdCBmaWVsZHM6IHsgW2tleTogc3RyaW5nXTogVmFzRmllbGREdG9WYWx1ZSB9ID0ge307XG4gICAgZm9ybU1vZGVsLmdyb3Vwc1xuICAgICAgLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICBncm91cC5jb250cm9scy5mb3JFYWNoKGNvbnRyb2wgPT4ge1xuICAgICAgICAgIChmaWVsZHMpW2NvbnRyb2wucmVwb3J0VGVtcGxhdGVOYW1lXSA9XG4gICAgICAgICAgICB0aGlzLmdldFZhbHVlQnlQYXRoKFtncm91cC5uYW1lLCBjb250cm9sLm5hbWVdKSB8fCBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIHJldHVybiBmaWVsZHM7XG4gIH1cblxuICAvKipcbiAgICogV2lsbCByZXR1cm4gYW4gb2JqZWN0IHdob3NlIGtleXMgYXJlIHRoZSBuYW1lcyBvZiBhbGwgZmllbGRzIGluIHRoZSBqb2IuXG4gICAqIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gYGdldEZpZWxkc2AgZXhjZXB0IHRoYXQgdGhpcyBtZXRob2Qgd2lsbCBvbmx5XG4gICAqIHJldHVybiB2YWx1ZXMgd2hlcmUgYSB2YWx1ZSB3YXMgc2V0LCBhcyBvcHBvc2VkIHRvIGBnZXRGaWVsZHNgIHdoaWNoIHdpbGxcbiAgICogcmV0dXJuIGEgdmFsdWUgZm9yIGV2ZXJ5IGNvbnRyb2wgZXZlbiBpZiBub3QgdmFsdWUgd2FzIHNldCwgYmVjYXVzZSBpdCB1c2VzXG4gICAqIHRoZSBmb3JtIHRvIGRyaXZlIHRoZSBsb2dpYy4gTm90ZSBhbHNvIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHZhbHVlcyBmb3JcbiAgICogYW55IEZpZWxkcyBpbiB0aGUgZmllbGRzIGFycmF5LlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPn1cbiAgICovXG4gIGdldEZpZWxkczIoKTogUmVjb3JkPHN0cmluZywgVmFzRmllbGREdG9WYWx1ZT4ge1xuICAgIGxldCBmaWVsZHM6IHsgW2tleTogc3RyaW5nXTogVmFzRmllbGREdG9WYWx1ZSB9ID0ge307XG4gICAgdGhpcy5keW5hbWljUHJvcGVydGllc1xuICAgICAgLmZvckVhY2goKGdyb3VwTmFtZSkgPT4ge1xuICAgICAgICBPYmplY3RcbiAgICAgICAgICAua2V5cyh0aGlzLiR0aGlzW2dyb3VwTmFtZV0pXG4gICAgICAgICAgLmZvckVhY2goY29udHJvbE5hbWUgPT4ge1xuICAgICAgICAgICAgZmllbGRzW2NvbnRyb2xOYW1lXSA9XG4gICAgICAgICAgICAgIHRoaXMuZ2V0VmFsdWVCeVBhdGgoW2dyb3VwTmFtZSwgY29udHJvbE5hbWVdKSB8fCBudWxsO1xuICAgICAgICAgIH0pO1xuICAgICAgfSwge30pO1xuICAgIHRoaXMuZmllbGRzLmZvckVhY2goZmllbGQgPT4gZmllbGRzW2ZpZWxkLmNvbnRyb2xOYW1lXSA9IGZpZWxkLnZhbHVlKTtcbiAgICByZXR1cm4gZmllbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IGRlc2NyaWJpbmcgaG93IG1hbnkgYXR0YWNobWVudHMgd2VyZSBhZGRlZCB0byB0aGlzIGpvYlxuICAgKiAoY2FtZXJhIGNvbnRyb2xzIGFuZCBmaWxlcyksIGFuZCBob3cgbWFueSBoYXZlIG5vdCBiZWVuIHVwbG9hZGVkIHlldC5cbiAgICpcbiAgICogQHBhcmFtIGZvcm1Nb2RlbCBpbnN0YW5jZSBvZiB7QGxpbmsgVmFzRm9ybU1vZGVsfSB0aGF0IHdhcyB1c2VkIHdoZW4gdGhlXG4gICAqIGpvYiB3YXMgY3JlYXRlZFxuICAgKi9cbiAgZ2V0RmlsZXNVcGxvYWRTdGF0dXMoXG4gICAgZm9ybU1vZGVsOiBWYXNGb3JtTW9kZWxcbiAgKTogeyBwZW5kaW5nOiBudW1iZXI7IHRvdGFsOiBudW1iZXIgfSB7XG5cbiAgICBjb25zdCBwYXRoc1dpdGhWYWx1ZTogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBmb3JtTW9kZWxcbiAgICAgIC5nZXRDYW1lcmFDb250cm9sUGF0aHMoKVxuICAgICAgLm1hcChwYXRoID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWU6IFZhc0ZpbGVEdG8gfCBWYXNDYW1lcmFDb250cm9sVmFsdWVNb2RlbCA9XG4gICAgICAgICAgdGhpcy5nZXRWYWx1ZUJ5UGF0aChwYXRoKSBhcyBhbnk7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhIXZhbHVlLmlkKSB7XG4gICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihwYXRoID0+IHBhdGggIT09IG51bGwgPyBwYXRoIDogbnVsbClcbiAgICAgIC5maWx0ZXIoaXNBcnJheVN0cmluZyk7XG5cbiAgICBsZXQgdG90YWwgPSBwYXRoc1dpdGhWYWx1ZS5sZW5ndGg7XG5cbiAgICB0b3RhbCArPSB0aGlzLmZpbGVzLmxlbmd0aDtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNhbWVyYSBpbWFnZXMgc3RpbGwgdG8gdXBsb2FkXG4gICAgbGV0IHBlbmRpbmcgPSBwYXRoc1dpdGhWYWx1ZVxuICAgICAgLm1hcChwYXRoID0+IHRoaXMuZ2V0VmFsdWVCeVBhdGgocGF0aCkgYXMgYW55KVxuICAgICAgLm1hcCgodmFsdWU6IFZhc0ZpbGVEdG8gfCBWYXNDYW1lcmFDb250cm9sVmFsdWVNb2RlbCkgPT4ge1xuICAgICAgICBpZiAoaXNGaWxlRHRvKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS5pZCAmJiB2YWx1ZS5zdGF0dXMgIT09ICdDT01QTEVURSc7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDYW1lcmFDb250cm9sVmFsdWVWMSh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyBpZiB1cmwgaXMgbm90IHNldCwgaXQgaGFzbid0IGJlZW4gdXBsb2FkZWRcbiAgICAgICAgICByZXR1cm4gdmFsdWUuaWQgJiYgIXZhbHVlLnVybDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihoYXNVcGxvYWRlZCA9PiBoYXNVcGxvYWRlZClcbiAgICAgIC5sZW5ndGg7XG5cbiAgICAvLyBhZGQgdG90YWwgZnJvbSBmaWxlcyB0aGF0IGFyZSBwZW5kaW5nXG4gICAgcGVuZGluZyArPSB0aGlzLmZpbGVzXG4gICAgICAuZmlsdGVyKHZhbHVlID0+IHZhbHVlLnN0YXR1cyAhPT0gJ0NPTVBMRVRFJylcbiAgICAgIC5sZW5ndGg7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGVuZGluZyxcbiAgICAgIHRvdGFsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgZHluYW1pYyBwcm9wZXJ0eSBmcm9tIHRoZSBKb2JNb2RlbCB0aGF0XG4gICAqIHJlcHJlc2VudCBhIGdyb3VwIChmcm9tIGEgZm9ybSkuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBncm91cFxuICAgKiBAcGFyYW0gaW5pdCBpZiB0cnVlIChkZWZhdWx0KSBhbmQgZ3JvdXAgaXMgbm90IGZvdW5kLCBpbml0aWFsaXNlIGFuIGVtcHR5XG4gICAqIGdyb3VwLCBvdGhlcndpc2UgdGhyb3cgYW4gZXJyb3JcbiAgICovXG4gIGdldEdyb3VwKG5hbWU6IHN0cmluZywgaW5pdCA9IHRydWUpOiBSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPiB7XG4gICAgbGV0IHByb3A7XG4gICAgaWYgKHRoaXMuc3RhdGljUHJvcGVydGllcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYGludmFsaWQgZ3JvdXAgbmFtZSAke25hbWV9LCBub3QgYSBkeW5hbWljIHByb3BlcnR5YCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLiR0aGlzW25hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpbml0KSB7XG4gICAgICAgIHByb3AgPSB0aGlzLiR0aGlzW25hbWVdID0ge307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgaW52YWxpZCBncm91cCBuYW1lICR7bmFtZX0sIG5vdCBmb3VuZGApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wID0gdGhpcy4kdGhpc1tuYW1lXTtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYGludmFsaWQgZ3JvdXAgbmFtZSAke25hbWV9LCBub3QgYW4gb2JqZWN0YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIHBhdGggc2VnbWVudHNcbiAgICovXG4gIGdldFZhbHVlQnlQYXRoPFQgZXh0ZW5kcyBWYXNGaWVsZER0b1ZhbHVlPihcbiAgICBwYXRoOiBzdHJpbmdbXSA9IFtdXG4gICk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBnZXRWYWx1ZUJ5UGF0aChwYXRoLCB0aGlzLiR0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBvcmRlciB0byB1bmRlcnN0YW5kIHdoeSB3ZSBuZWVkIHRoaXMgbWV0aG9kIGl0IGlzIGltcG9ydGFudCB0b1xuICAgKiB1bmRlcnN0YW5kIHRoYXQgd2l0aGluIHRoZSBzeXN0ZW0sIEpvYnMgY2FuIGJlIHJlcHJlc2VudGVkIGluIG9uZSBvZiB0d29cbiAgICogd2F5cywgZG9jdW1lbnQgYW5kIHJlbGF0aW9uYWwuXG4gICAqXG4gICAqIFRoZSBpbXBvcnRhbnQgZGlzdGluY3Rpb24gaXMgaG93IHZhbHVlcyBzdWJtaXR0ZWQgYnkgYSBmb3JtIGFyZSBzdG9yZWQuXG4gICAqXG4gICAqIEpvYnMgc3RvcmVkIGFzIGRvY3VtZW50cyAoSlNPTiBvYmplY3RzKSB3aWxsIHN0b3JlIHVzZXIgdmFsdWVzLCBhcyBkeW5hbWljXG4gICAqIHByb3BlcnRpZXMgb2YgdGhlIGRvY3VtZW50LlxuICAgKlxuICAgKiBXaGVyZWFzLCBKb2JzIHN0b3JlZCBhcyByZWxhdGlvbmFsLCB3aWxsIHN0b3JlIHVzZXIgdmFsdWVzIGluIGFuIGFycmF5IG9mXG4gICAqIHtAbGluayBWYXNGaWVsZER0b30gb2JqZWN0cy5cbiAgICpcbiAgICogRGVwZW5kaW5nIG9uIHdoZXJlIHdlIGFyZSBpbiB0aGUgc3lzdGVtLCBlaXRoZXIgb25lIG9mIHRoZXNlIGFwcHJvYWNoZXMgY2FuXG4gICAqIGJlIG1vcmUgdXNlZnVsIHRoYW4gdGhlIG90aGVyLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCwgYXNzdW1lcyB0aGF0IHRoZSBKb2JNb2RlbCBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgZnJvbSBhXG4gICAqIGRvY3VtZW50IHJlcHJlc2VudGF0aW9uLCBhbmQgc2VydmVzIHRvIGh5ZHJhdGUgdGhlIGZpZWxkcyBhcnJheS4gSW4gb3JkZXJcbiAgICogdG8gYWNoaWV2ZSB0aGlzLCBrbm93bGVkZ2Ugb2YgdGhlIHtAbGluayBWYXNGb3JtRHRvfSB0aGF0IGNyZWF0ZWQgdGhlIGpvYlxuICAgKiBpcyByZXF1aXJlZC5cbiAgICpcbiAgICpcbiAgICogSm9iIGluIGRvY3VtZW50IHJlcHJlc2VudGF0aW9uXG4gICAqIHtcbiAgICogICBpZDogPGd1aWQ+LFxuICAgKiAgIHJlZmVyZW5jZTogXCJzb21ldGhpbmdcIlxuICAgKiAgIDxvdGhlciBzdGF0aWMgam9iIHByb3BlcnRpZXM+Li4uXG4gICAqICAgZm9vOiB7XG4gICAqICAgICBiYXI6IFwidmFsdWVcIlxuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBKb2IgaW4gcmVsYXRpb25hbCByZXByZXNlbnRhdGlvblxuICAgKiB7XG4gICAqICAgaWQ6IDxndWlkPixcbiAgICogICByZWZlcmVuY2U6IFwic29tZXRoaW5nXCJcbiAgICogICA8b3RoZXIgc3RhdGljIGpvYiBwcm9wZXJ0aWVzPi4uLlxuICAgKiAgIDx3aWxsIG5vdCBoYXZlIGR5bmFtaWMgcHJvcGVydGllcz4uLi5cbiAgICogICBmaWVsZHM6IFtcbiAgICogICAgIHtcbiAgICogICAgICAgaWQ6IDxndWlkPixcbiAgICogICAgICAgPG90aGVyIGZpZWxkIHByb3BlcnRpZXM+LFxuICAgKiAgICAgICB2YWx1ZTogXCJ2YWx1ZVwiXG4gICAqICAgICB9XG4gICAqICAgXVxuICAgKiB9XG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSBmb3JtTW9kZWwgdGhlIFZhc0Zvcm1Nb2RlbCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgam9iXG4gICAqIEBwYXJhbSBjb250cm9sRmllbGRJZE1hcCBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBpZCBlYWNoIGZpZWxkLlxuICAgKiBFaXRoZXIgb25lIHdpbGwgYmUgZm91bmQgaW4gdGhlIG1hcCwgb3IgYSBuZXcgb25lIGlzIGdlbmVyYXRlZC5cbiAgICogQHBhcmFtIGNvbnRyb2xOYW1lcyBpZiBhIHZhbHVlIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWRcbiAgICogdG8gZmlsdGVyIHRoZSBmaWVsZHMgdGhhdCBhcmUgcmV0dXJuZWQuXG4gICAqIEByZXR1cm4ge0FycmF5PFZhc0ZpZWxkRHRvPn1cbiAgICovXG4gIGh5ZHJhdGVGaWVsZHMoXG4gICAgZm9ybU1vZGVsOiBWYXNGb3JtTW9kZWwsXG4gICAgY29udHJvbEZpZWxkSWRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpLFxuICAgIGNvbnRyb2xOYW1lcz86IEFycmF5PHN0cmluZz5cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZmllbGRzOiBBcnJheTxWYXNGaWVsZER0bz4gPSBbXTtcbiAgICBmb3JtTW9kZWwuZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgIGdyb3VwLmNvbnRyb2xzLmZvckVhY2goY29udHJvbCA9PiB7XG5cbiAgICAgICAgICBpZiAoIWNvbnRyb2wubmFtZS5zdGFydHNXaXRoKCdmaWVsZHMuJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29udHJvbE5hbWVzICYmICFjb250cm9sTmFtZXMuaW5jbHVkZXMoY29udHJvbC5uYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpZWxkcy5wdXNoKFZhc0ZpZWxkTW9kZWwuZnJvbUR0byh7XG4gICAgICAgICAgICAvLyBpZiB0aGUgY29udHJvbElkIGV4aXN0cyBpbiB0aGUgbWFwLCB1c2UgdGhlIGFzc29jaWF0ZWQgZmllbGRJZCxcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBnZW5lcmF0ZSBhIG5ldyBpZCBmb3IgdGhlIGZpZWxkLlxuICAgICAgICAgICAgaWQ6IGNvbnRyb2xGaWVsZElkTWFwLmdldChjb250cm9sLmlkKSB8fCBVVUlELlVVSUQoKSxcbiAgICAgICAgICAgIGFjY291bnQ6IHRoaXMuYWNjb3VudCxcbiAgICAgICAgICAgIGpvYjogdGhpcy5pZCxcbiAgICAgICAgICAgIGNyZWF0ZWRCeTogdGhpcy5jcmVhdGVkQnksXG4gICAgICAgICAgICBjcmVhdGVkOiB0aGlzLmNyZWF0ZWQsXG4gICAgICAgICAgICBtb2RpZmllZEJ5OiB0aGlzLm1vZGlmaWVkQnksXG4gICAgICAgICAgICBtb2RpZmllZDogdGhpcy5tb2RpZmllZCxcbiAgICAgICAgICAgIGNvbnRyb2w6IGNvbnRyb2wuaWQsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5nZXRWYWx1ZUJ5UGF0aChcbiAgICAgICAgICAgICAgW2dyb3VwLm5hbWUsIGNvbnRyb2wubmFtZV1cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gIH1cblxuICAvKipcbiAgICogQSB2ZXJ5IG5vbiBzb3BoaXN0aWNhdGVkIHdheSB0byBzZXQgdmFsdWVzIGluIHRoZSBqb2IgdmlhIHBhdGhzXG4gICAqXG4gICAqIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiBzZXRWYWx1ZUJ5UGF0aCgndmFsdWUnLCBbJ2ZvbycsICdiYXInXSk7XG4gICAqXG4gICAqIHdpbGwgbWFrZSByZXN1bHRzIGluIGpvYlxuICAgKiB7XG4gICAqICAgZm9vOiB7XG4gICAqICAgICBiYXI6ICd2YWx1ZSdcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXRcbiAgICogQHBhcmFtIHBhdGggcGF0aCBzZWdtZW50c1xuICAgKi9cbiAgc2V0VmFsdWVCeVBhdGgodmFsdWU6IFZhc0ZpZWxkRHRvVmFsdWUsIHBhdGg6IHN0cmluZ1tdID0gW10pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHBhdGgubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6IHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAxOiB7XG4gICAgICAgICh0aGlzIGFzIGFueSlbcGF0aFswXV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAyOiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgICh0aGlzLiR0aGlzW3BhdGhbMF1dIGFzIFJlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+KVtwYXRoWzFdXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlIDM6IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgKCh0aGlzLiR0aGlzW3BhdGhbMF1dIGFzIFJlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+KVtwYXRoWzFdXSBhcyBSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPilbcGF0aFsyXV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBFcnJvcigncGF0aCBoYXMgdG9vIG1hbnkgc2VnbWVudHMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHN0YXRpY09ubHkgaWYgdHJ1ZSwgd2lsbCBvbmx5IG91dHB1dCB2YWx1ZXMgZm9yIHRoZSBzdGF0aWNcbiAgICogcHJvcGVydGllcyBpbiB0aGUgZHRvXG4gICAqL1xuICBwdWJsaWMgdG9EdG8oc3RhdGljT25seSA9IGZhbHNlKTogVmFzSm9iRHRvIHtcblxuICAgIGlmIChzdGF0aWNPbmx5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgY3JlYXRlZDogdGhpcy5jcmVhdGVkLFxuICAgICAgICBjcmVhdGVkQnk6IHRoaXMuY3JlYXRlZEJ5LFxuICAgICAgICBtb2RpZmllZDogdGhpcy5tb2RpZmllZCxcbiAgICAgICAgbW9kaWZpZWRCeTogdGhpcy5tb2RpZmllZEJ5LFxuICAgICAgICBzZXJ2ZXJDcmVhdGVkOiB0aGlzLnNlcnZlckNyZWF0ZWQsXG4gICAgICAgIHNlcnZlck1vZGlmaWVkOiB0aGlzLnNlcnZlck1vZGlmaWVkLFxuICAgICAgICBjcmVhdGVkQnlOYW1lOiB0aGlzLmNyZWF0ZWRCeU5hbWUsXG4gICAgICAgIG1vZGlmaWVkQnlOYW1lOiB0aGlzLm1vZGlmaWVkQnlOYW1lLFxuICAgICAgICBhY2NvdW50OiB0aGlzLmFjY291bnQsXG4gICAgICAgIGFjY2Vzc0dyb3VwOiB0aGlzLmFjY2Vzc0dyb3VwLFxuICAgICAgICByZWZlcmVuY2U6IHRoaXMucmVmZXJlbmNlLFxuICAgICAgICBqb2JEYXRlOiB0aGlzLmpvYkRhdGUsXG4gICAgICAgIGpvYlN0YXR1czogdGhpcy5qb2JTdGF0dXMsXG4gICAgICAgIGpvYlR5cGU6IHRoaXMuam9iVHlwZSxcbiAgICAgICAgYXNzaWduZWVJZDogdGhpcy5hc3NpZ25lZUlkLFxuICAgICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgICAgICB0aW1lWm9uZU9mZnNldDogdGhpcy50aW1lWm9uZU9mZnNldCxcbiAgICAgICAgcGVuZGluZ0ZpZWxkczogdGhpcy5wZW5kaW5nRmllbGRzLFxuICAgICAgICBjaGlsZE1vZGlmaWVkOiB0aGlzLmNoaWxkTW9kaWZpZWQsXG4gICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgZmllbGRzOiB0aGlzLmZpZWxkcyxcbiAgICAgICAgZmlsZXM6IHRoaXMuZmlsZXMsXG4gICAgICAgIGNyZWF0ZWRCeURpc3BsYXlOYW1lOiB0aGlzLmNyZWF0ZWRCeURpc3BsYXlOYW1lLFxuICAgICAgICBtb2RpZmllZEJ5RGlzcGxheU5hbWU6IHRoaXMubW9kaWZpZWRCeURpc3BsYXlOYW1lLFxuICAgICAgICBnZW9Mb2NhdGlvbjogdGhpcy5nZW9Mb2NhdGlvblxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBkdG8gPSB7fSBhcyBWYXNKb2JNb2RlbER5bmFtaWNJbnRlcmZhY2U7XG4gICAgWy4uLnRoaXMuc3RhdGljUHJvcGVydGllcywgLi4udGhpcy5keW5hbWljUHJvcGVydGllc11cbiAgICAgIC5mb3JFYWNoKHByb3AgPT4gZHRvW3Byb3BdID0gdGhpcy4kdGhpc1twcm9wXSk7XG5cbiAgICByZXR1cm4gZHRvIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIHBhcnNlIGEgc3ludGF4IHRoYXQgYWxsb3dzIHVzIHRvIGJ1aWxkIHN0cmluZ3MgZnJvbSB0aGVcbiAgICogdmFsdWVzIG9mIGZyb20gdGhlIGpvYiBtb2RlbC4gRm9yIGV4YW1wbGUgaWYgdGhlIGpvYiBtb2RlbCB3YXM6XG4gICAqXG4gICAqIHtcbiAgICogICBmb286ICdiYXInXG4gICAqIH1cbiAgICpcbiAgICogYW5kIHdlIHBhc3MgXCJpIGFtIGZvbyB7Zm9vfVwiLCB0aGUgcmVzdWx0IHdvdWxkIGJlOlxuICAgKlxuICAgKiBcImkgYW0gZm9vIGJhclwiXG4gICAqXG4gICAqIHdlIGNhbiBhbHNvIHVzZSBtb21lbnQgdG8gcGFyc2UgZGF0ZXMsIGZvciBleGFtcGxlIGlmIHRoZSBqb2IgbW9kZWwgd2FzOlxuICAgKlxuICAgKiB7XG4gICAqICAgY3JlYXRlZDogXCIyMDIyLTAxLTAxVDAwOjAwOjAwKzAwMDBcIlxuICAgKiB9XG4gICAqXG4gICAqIGFuZCB3ZSBwYXNzIFwie2NyZWF0ZWR8ZGF0ZTpZWS1NTS1ERH1cIiwgdGhlIHJlc3VsdCB3b3VsZCBiZTpcbiAgICpcbiAgICogXCIyMDIyLTAxLTAxXCJcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIGEgc3RyaW5nIHdpdGggdGhlIHN5bnRheFxuICAgKiBAcGFyYW0ge1BhcnNlU3ludGF4T3B0aW9uc30gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHRoZSByZXN1bHRzIG9mIHBhcnNpbmcgdGhlIHN5bnRheCBvbiB0aGlzIGpvYlxuICAgKi9cbiAgcGFyc2VTeW50YXgoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBQYXJzZVN5bnRheE9wdGlvbnMgPSB7XG4gICAgICB0aW1lWm9uZU9mZnNldDogMFxuICAgIH1cbiAgKTogc3RyaW5nIHtcblxuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvKHtbXn1dKn0pL2csIChtYXRjaDogc3RyaW5nLCB0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzeW50YXggPSB0b2tlbi5zdWJzdHJpbmcoMSwgdG9rZW4ubGVuZ3RoIC0gMSk7XG5cbiAgICAgIGxldCBba2V5LCBmaWx0ZXJdID0gc3ludGF4LnNwbGl0KCd8Jyk7XG4gICAgICBrZXkgPSAoa2V5IHx8ICcnKS50cmltKCk7XG4gICAgICBmaWx0ZXIgPSAoZmlsdGVyIHx8ICcnKS50cmltKCk7XG5cbiAgICAgIGxldCBmaWx0ZXJOYW1lLCBmaWx0ZXJBcmc6IHN0cmluZyA9ICcnO1xuICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICBjb25zdCBzcGxpdEluZGV4ID0gZmlsdGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKHNwbGl0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZmlsdGVyTmFtZSA9IGZpbHRlci5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCk7XG4gICAgICAgICAgZmlsdGVyQXJnID0gZmlsdGVyLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsdGVyTmFtZSA9IGZpbHRlcjtcbiAgICAgICAgICBmaWx0ZXJBcmcgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBmaWx0ZXJOYW1lID0gKGZpbHRlck5hbWUgfHwgJycpLnRyaW0oKTtcbiAgICAgICAgZmlsdGVyQXJnID0gKGZpbHRlckFyZyB8fCAnJykudHJpbSgpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF0aCA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgY29uc3Qgb2JqZWN0S2V5ID0gcGF0aC5zaGlmdCgpIHx8ICcnO1xuICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgaWYgKG9iamVjdEtleSA9PT0gJ2pvYicpIHtcbiAgICAgICAgcmVzdWx0ID0gKHRoaXMuZ2V0VmFsdWVCeVBhdGgocGF0aCkgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2UgaWYgKG9iamVjdEtleSA9PT0gJ2ZpZWxkcycpIHtcbiAgICAgICAgcmVzdWx0ID0gKGdldFZhbHVlQnlQYXRoKFxuICAgICAgICAgIFsnZmllbGRzLicgKyBwYXRoLnNoaWZ0KCksIC4uLnBhdGhdLFxuICAgICAgICAgIHRoaXMuZ2V0RmllbGRzMigpXG4gICAgICAgICkgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2UgaWYgKG9iamVjdEtleS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMub2JqZWN0cykge1xuICAgICAgICAgIGlmIChvcHRpb25zLm9iamVjdHNbb2JqZWN0S2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAgICAgICBgb2JqZWN0S2V5ICR7b2JqZWN0S2V5fSBpcyBub3QgcHJlc2VudCBpbiBvcHRpb25zLm9iamVjdGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXN1bHQgPSAnJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gKGdldFZhbHVlQnlQYXRoKHBhdGgsIG9wdGlvbnMub2JqZWN0c1tvYmplY3RLZXldKSB8fCAnJylcbiAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgICAgICBgb2JqZWN0S2V5ICR7b2JqZWN0S2V5fSB3YXMgdXNlZCBidXQgb3B0aW9ucy5vYmplY3QgaXMgbm90IHNldGBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG5cbiAgICAgIGlmIChmaWx0ZXJOYW1lICYmIHJlc3VsdCkge1xuICAgICAgICBzd2l0Y2ggKGZpbHRlck5hbWUpIHtcbiAgICAgICAgICBjYXNlICdkYXRlJzoge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudChyZXN1bHQpXG4gICAgICAgICAgICAgIC51dGNPZmZzZXQob3B0aW9ucy50aW1lWm9uZU9mZnNldClcbiAgICAgICAgICAgICAgLmZvcm1hdChmaWx0ZXJBcmcgfHwgJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ3Vua25vd24gZmlsdGVyICVzJywgZmlsdGVyTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSkudHJpbSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBvdmVycmlkZSB0b0FwaUR0bygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLnRvQXBpRHRvKCksXG4gICAgICByZWZlcmVuY2U6IHRoaXMucmVmZXJlbmNlIHx8ICd+JyxcbiAgICAgIGpvYkRhdGU6IHRoaXMuam9iRGF0ZSB8fCAnficsXG4gICAgICBqb2JUeXBlOiB0aGlzLmpvYlR5cGUgfHwgJ34nLFxuICAgICAgYWNjZXNzR3JvdXA6IHRoaXMuYWNjZXNzR3JvdXAgfHwgJ34nLFxuICAgICAgam9iU3RhdHVzOiB0aGlzLmpvYlN0YXR1cyB8fCAnficsXG4gICAgICBhc3NpZ25lZUlkOiB0aGlzLmFzc2lnbmVlSWQgfHwgJ34nLFxuICAgICAgdGltZVpvbmVPZmZzZXQ6IHRoaXMudGltZVpvbmVPZmZzZXQgfHwgMCxcbiAgICAgIHBlbmRpbmdGaWVsZHM6IHRoaXMucGVuZGluZ0ZpZWxkcyB8fCAwLFxuICAgICAgbGFzdEZvcm06IHRoaXMuZm9ybUlkIHx8ICd+J1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWxvb2t1cC10eXBlLmR0by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Zhcy1saWIvc3JjL2xpYi9lbnRpdHkvdmFzLWxvb2t1cC10eXBlLmR0by50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmFzQWNjb3VudE9iamVjdER0byB9IGZyb20gJy4vdmFzLWFjY291bnQtb2JqZWN0LmR0byc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFzTG9va3VwVHlwZUR0byBleHRlbmRzIFZhc0FjY291bnRPYmplY3REdG8ge1xuICB0aXRsZTogc3RyaW5nO1xuICBzZXF1ZW5jZTogbnVtYmVyO1xuICBjYXRlZ29yeUdyb3VwczogQXJyYXk8c3RyaW5nPjtcbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWxvb2t1cC5kdG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YXMtbGliL3NyYy9saWIvZW50aXR5L3Zhcy1sb29rdXAuZHRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWYXNBY2NvdW50T2JqZWN0RHRvIH0gZnJvbSAnLi92YXMtYWNjb3VudC1vYmplY3QuZHRvJztcblxuZXhwb3J0IGludGVyZmFjZSBWYXNMb29rdXBEdG8gZXh0ZW5kcyBWYXNBY2NvdW50T2JqZWN0RHRvIHtcbiAgaWQ6IHN0cmluZztcbiAgY3JlYXRlZDogc3RyaW5nO1xuICBzZXJ2ZXJDcmVhdGVkOiBzdHJpbmc7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICBzZXJ2ZXJNb2RpZmllZDogc3RyaW5nO1xuICBtb2RpZmllZEJ5OiBzdHJpbmc7XG4gIGFjY291bnQ6IHN0cmluZztcbiAgYWNjZXNzR3JvdXA6IHN0cmluZztcbiAgbG9va3VwVHlwZTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHNlcXVlbmNlOiBudW1iZXI7XG59XG4iXX0=