@mediusinc/mng-commons 0.2.0 → 0.2.6

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 (235) hide show
  1. package/esm2020/lib/api/models/builders/query-param.builder.mjs +48 -48
  2. package/esm2020/lib/api/models/filter-match-type.model.mjs +26 -26
  3. package/esm2020/lib/api/models/filter-param.model.mjs +46 -46
  4. package/esm2020/lib/api/models/index.mjs +9 -9
  5. package/esm2020/lib/api/models/mappers.mjs +17 -17
  6. package/esm2020/lib/api/models/query-mode.model.mjs +19 -19
  7. package/esm2020/lib/api/models/query-param.model.mjs +69 -69
  8. package/esm2020/lib/api/models/query-result.model.mjs +45 -45
  9. package/esm2020/lib/api/models/serialization.model.mjs +2 -2
  10. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +72 -72
  11. package/esm2020/lib/api/services/index.mjs +2 -2
  12. package/esm2020/lib/api/utils/index.mjs +3 -3
  13. package/esm2020/lib/api/utils/medius-rest.util.mjs +122 -122
  14. package/esm2020/lib/api/utils/object-serializer.util.mjs +226 -226
  15. package/esm2020/lib/components/action/action.component.mjs +65 -65
  16. package/esm2020/lib/components/action/dialog/action-dialog.component.mjs +148 -148
  17. package/esm2020/lib/components/action/index.mjs +4 -4
  18. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +2 -2
  19. package/esm2020/lib/components/action/models/action-execution.model.mjs +58 -58
  20. package/esm2020/lib/components/action/models/index.mjs +3 -3
  21. package/esm2020/lib/components/action/route/action-route.component.mjs +144 -144
  22. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +114 -114
  23. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +113 -113
  24. package/esm2020/lib/components/form/editor/form-editor.component.mjs +141 -141
  25. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +19 -19
  26. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +19 -19
  27. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +16 -16
  28. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +30 -26
  29. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +108 -109
  30. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +122 -122
  31. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +17 -17
  32. package/esm2020/lib/components/form/formly/fields/index.mjs +8 -8
  33. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +17 -17
  34. package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +16 -16
  35. package/esm2020/lib/components/form/formly/wrappers/index.mjs +3 -3
  36. package/esm2020/lib/components/form/index.mjs +4 -4
  37. package/esm2020/lib/components/form/models/form-editor.event.mjs +7 -7
  38. package/esm2020/lib/components/form/models/index.mjs +2 -2
  39. package/esm2020/lib/components/layout/breadcrumb.component.mjs +17 -17
  40. package/esm2020/lib/components/layout/footer.component.mjs +17 -17
  41. package/esm2020/lib/components/layout/index.mjs +7 -7
  42. package/esm2020/lib/components/layout/main-layout.component.mjs +54 -54
  43. package/esm2020/lib/components/layout/menu-item.component.mjs +173 -173
  44. package/esm2020/lib/components/layout/menu.component.mjs +20 -20
  45. package/esm2020/lib/components/layout/services/index.mjs +2 -2
  46. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +190 -190
  47. package/esm2020/lib/components/layout/topbar.component.mjs +59 -59
  48. package/esm2020/lib/components/tableview/index.mjs +7 -6
  49. package/esm2020/lib/components/tableview/models/index.mjs +2 -2
  50. package/esm2020/lib/components/tableview/models/table.event.mjs +16 -16
  51. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +24 -24
  52. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +33 -0
  53. package/esm2020/lib/components/tableview/services/index.mjs +2 -2
  54. package/esm2020/lib/components/tableview/services/tableview.component.service.mjs +16 -17
  55. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +85 -74
  56. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +25 -25
  57. package/esm2020/lib/components/tableview/table/table.component.mjs +307 -307
  58. package/esm2020/lib/components/tableview/tableview.component.mjs +82 -82
  59. package/esm2020/lib/config/formly.config.mjs +136 -136
  60. package/esm2020/lib/config/index.mjs +2 -2
  61. package/esm2020/lib/config/models/index.mjs +2 -2
  62. package/esm2020/lib/config/models/mng-config.model.mjs +2 -2
  63. package/esm2020/lib/data-providers/base.data-provider.mjs +24 -24
  64. package/esm2020/lib/data-providers/editor.data-provider.mjs +37 -37
  65. package/esm2020/lib/data-providers/index.mjs +6 -6
  66. package/esm2020/lib/data-providers/lookup.data-provider.mjs +16 -16
  67. package/esm2020/lib/data-providers/table.data-provider.mjs +2 -2
  68. package/esm2020/lib/data-providers/tableview.data-provider.mjs +17 -17
  69. package/esm2020/lib/descriptors/action.descriptor.mjs +332 -332
  70. package/esm2020/lib/descriptors/editor.descriptor.mjs +670 -670
  71. package/esm2020/lib/descriptors/field.validator.mjs +21 -21
  72. package/esm2020/lib/descriptors/index.mjs +8 -8
  73. package/esm2020/lib/descriptors/lookup.descriptor.mjs +2 -2
  74. package/esm2020/lib/descriptors/model.descriptor.mjs +34 -34
  75. package/esm2020/lib/descriptors/table.descriptor.mjs +427 -401
  76. package/esm2020/lib/descriptors/tableview.descriptor.mjs +131 -131
  77. package/esm2020/lib/directives/component.directive.mjs +23 -23
  78. package/esm2020/lib/directives/index.mjs +3 -3
  79. package/esm2020/lib/directives/template.directive.mjs +29 -29
  80. package/esm2020/lib/mng-commons.module.mjs +412 -410
  81. package/esm2020/lib/models/index.mjs +2 -3
  82. package/esm2020/lib/models/user.model.mjs +2 -2
  83. package/esm2020/lib/pipes/boolean.pipe.mjs +22 -22
  84. package/esm2020/lib/pipes/index.mjs +3 -3
  85. package/esm2020/lib/pipes/property-path.pipe.mjs +36 -36
  86. package/esm2020/lib/router/index.mjs +2 -0
  87. package/esm2020/lib/router/models/index.mjs +2 -0
  88. package/esm2020/lib/router/models/router.model.mjs +2 -0
  89. package/esm2020/lib/router/route-builder.mjs +288 -0
  90. package/esm2020/lib/services/action.service.mjs +269 -269
  91. package/esm2020/lib/services/commons.service.mjs +354 -353
  92. package/esm2020/lib/services/configuration.service.mjs +78 -78
  93. package/esm2020/lib/services/index.mjs +5 -5
  94. package/esm2020/lib/services/navigation.service.mjs +48 -48
  95. package/esm2020/lib/services/providers/commons-init.provider.mjs +4 -4
  96. package/esm2020/lib/services/providers/config-service.provider.mjs +20 -20
  97. package/esm2020/lib/services/providers/formly-config.provider.mjs +31 -31
  98. package/esm2020/lib/services/providers/index.mjs +4 -4
  99. package/esm2020/lib/services/tokens/browser-storage.token.mjs +6 -6
  100. package/esm2020/lib/services/tokens/index.mjs +3 -3
  101. package/esm2020/lib/services/tokens/module-config.token.mjs +3 -3
  102. package/esm2020/lib/types/index.mjs +3 -3
  103. package/esm2020/lib/types/type.decorator.mjs +7 -7
  104. package/esm2020/lib/types/type.model.mjs +2 -2
  105. package/esm2020/lib/utils/editor-formly.util.mjs +176 -176
  106. package/esm2020/lib/utils/i18n.util.mjs +125 -125
  107. package/esm2020/lib/utils/index.mjs +6 -6
  108. package/esm2020/lib/utils/model.util.mjs +57 -57
  109. package/esm2020/lib/utils/route.util.mjs +24 -0
  110. package/esm2020/lib/utils/toast.util.mjs +39 -39
  111. package/esm2020/lib/utils/type.util.mjs +39 -39
  112. package/esm2020/mediusinc-mng-commons.mjs +5 -5
  113. package/esm2020/public-api.mjs +37 -36
  114. package/fesm2015/mediusinc-mng-commons.mjs +6407 -6024
  115. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  116. package/fesm2020/mediusinc-mng-commons.mjs +6329 -5950
  117. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  118. package/lib/api/models/builders/query-param.builder.d.ts +11 -11
  119. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  120. package/lib/api/models/filter-param.model.d.ts +23 -23
  121. package/lib/api/models/index.d.ts +8 -8
  122. package/lib/api/models/mappers.d.ts +6 -6
  123. package/lib/api/models/query-mode.model.d.ts +16 -16
  124. package/lib/api/models/query-param.model.d.ts +31 -31
  125. package/lib/api/models/query-result.model.d.ts +36 -36
  126. package/lib/api/models/serialization.model.d.ts +8 -8
  127. package/lib/api/services/crud-api.abstract.service.d.ts +23 -23
  128. package/lib/api/services/index.d.ts +1 -1
  129. package/lib/api/utils/index.d.ts +2 -2
  130. package/lib/api/utils/medius-rest.util.d.ts +12 -12
  131. package/lib/api/utils/object-serializer.util.d.ts +30 -30
  132. package/lib/components/action/action.component.d.ts +36 -36
  133. package/lib/components/action/dialog/action-dialog.component.d.ts +46 -46
  134. package/lib/components/action/index.d.ts +3 -3
  135. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  136. package/lib/components/action/models/action-execution.model.d.ts +53 -53
  137. package/lib/components/action/models/index.d.ts +2 -2
  138. package/lib/components/action/route/action-route.component.d.ts +32 -32
  139. package/lib/components/form/autocomplete/autocomplete.component.d.ts +36 -36
  140. package/lib/components/form/dropdown/dropdown.component.d.ts +34 -34
  141. package/lib/components/form/editor/form-editor.component.d.ts +39 -39
  142. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +11 -11
  143. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +11 -11
  144. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +6 -6
  145. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +12 -12
  146. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +17 -17
  147. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +36 -36
  148. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +6 -6
  149. package/lib/components/form/formly/fields/index.d.ts +7 -7
  150. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +8 -8
  151. package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +8 -8
  152. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  153. package/lib/components/form/index.d.ts +3 -3
  154. package/lib/components/form/models/form-editor.event.d.ts +5 -5
  155. package/lib/components/form/models/index.d.ts +1 -1
  156. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  157. package/lib/components/layout/footer.component.d.ts +9 -9
  158. package/lib/components/layout/index.d.ts +6 -6
  159. package/lib/components/layout/main-layout.component.d.ts +21 -21
  160. package/lib/components/layout/menu-item.component.d.ts +29 -29
  161. package/lib/components/layout/menu.component.d.ts +10 -10
  162. package/lib/components/layout/services/index.d.ts +1 -1
  163. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  164. package/lib/components/layout/topbar.component.d.ts +25 -25
  165. package/lib/components/tableview/index.d.ts +6 -5
  166. package/lib/components/tableview/models/index.d.ts +1 -1
  167. package/lib/components/tableview/models/table.event.d.ts +17 -17
  168. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +15 -14
  169. package/lib/components/tableview/route/tableview-route.component.d.ts +15 -0
  170. package/lib/components/tableview/services/index.d.ts +1 -1
  171. package/lib/components/tableview/services/tableview.component.service.d.ts +13 -13
  172. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +27 -22
  173. package/lib/components/tableview/table/column-value/column-value.component.d.ts +12 -12
  174. package/lib/components/tableview/table/table.component.d.ts +79 -79
  175. package/lib/components/tableview/tableview.component.d.ts +35 -35
  176. package/lib/config/formly.config.d.ts +14 -14
  177. package/lib/config/index.d.ts +1 -1
  178. package/lib/config/models/index.d.ts +1 -1
  179. package/lib/config/models/mng-config.model.d.ts +34 -34
  180. package/lib/data-providers/base.data-provider.d.ts +17 -17
  181. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  182. package/lib/data-providers/index.d.ts +5 -5
  183. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  184. package/lib/data-providers/table.data-provider.d.ts +6 -6
  185. package/lib/data-providers/tableview.data-provider.d.ts +15 -15
  186. package/lib/descriptors/action.descriptor.d.ts +148 -148
  187. package/lib/descriptors/editor.descriptor.d.ts +255 -255
  188. package/lib/descriptors/field.validator.d.ts +18 -18
  189. package/lib/descriptors/index.d.ts +7 -7
  190. package/lib/descriptors/lookup.descriptor.d.ts +17 -17
  191. package/lib/descriptors/model.descriptor.d.ts +15 -15
  192. package/lib/descriptors/table.descriptor.d.ts +184 -164
  193. package/lib/descriptors/tableview.descriptor.d.ts +39 -39
  194. package/lib/directives/component.directive.d.ts +11 -11
  195. package/lib/directives/index.d.ts +2 -2
  196. package/lib/directives/template.directive.d.ts +13 -13
  197. package/lib/mng-commons.module.d.ts +80 -79
  198. package/lib/models/index.d.ts +1 -2
  199. package/lib/models/user.model.d.ts +8 -8
  200. package/lib/pipes/boolean.pipe.d.ts +7 -7
  201. package/lib/pipes/index.d.ts +2 -2
  202. package/lib/pipes/property-path.pipe.d.ts +7 -7
  203. package/lib/router/index.d.ts +1 -0
  204. package/lib/router/models/index.d.ts +1 -0
  205. package/lib/router/models/router.model.d.ts +22 -0
  206. package/lib/router/route-builder.d.ts +66 -0
  207. package/lib/services/action.service.d.ts +92 -92
  208. package/lib/services/commons.service.d.ts +72 -72
  209. package/lib/services/configuration.service.d.ts +35 -35
  210. package/lib/services/index.d.ts +4 -4
  211. package/lib/services/navigation.service.d.ts +14 -14
  212. package/lib/services/providers/commons-init.provider.d.ts +2 -2
  213. package/lib/services/providers/config-service.provider.d.ts +5 -5
  214. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  215. package/lib/services/providers/index.d.ts +3 -3
  216. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  217. package/lib/services/tokens/index.d.ts +2 -2
  218. package/lib/services/tokens/module-config.token.d.ts +3 -3
  219. package/lib/types/index.d.ts +2 -2
  220. package/lib/types/type.decorator.d.ts +2 -2
  221. package/lib/types/type.model.d.ts +10 -10
  222. package/lib/utils/editor-formly.util.d.ts +9 -9
  223. package/lib/utils/i18n.util.d.ts +18 -18
  224. package/lib/utils/index.d.ts +5 -5
  225. package/lib/utils/model.util.d.ts +7 -7
  226. package/lib/utils/route.util.d.ts +4 -0
  227. package/lib/utils/toast.util.d.ts +13 -13
  228. package/lib/utils/type.util.d.ts +15 -15
  229. package/mediusinc-mng-commons.d.ts +5 -5
  230. package/package.json +4 -4
  231. package/public-api.d.ts +26 -25
  232. package/scss/common/layout/_exception.scss +1 -1
  233. package/esm2020/lib/models/router.model.mjs +0 -2
  234. package/lib/models/router.model.d.ts +0 -14
  235. package/mediusinc-mng-commons-0.2.0.tgz +0 -0
@@ -1,670 +1,670 @@
1
- import { of } from 'rxjs';
2
- import { LookupDataProvider, TableviewDataProvider } from '../data-providers';
3
- import { ModelDescriptor, FieldValidator } from './';
4
- import { ObjectSerializer } from '../api/utils';
5
- import { ModelUtil } from '../utils';
6
- export class EditorDescriptor {
7
- constructor(modelType, idProperty, titleProperty) {
8
- this._tabs = [];
9
- this._groups = [];
10
- this._fields = [];
11
- this._disabled = false;
12
- this._model = new ModelDescriptor(modelType, idProperty, titleProperty);
13
- }
14
- get model() {
15
- return this._model;
16
- }
17
- get tabs() {
18
- return this._tabs;
19
- }
20
- get disabled() {
21
- return this._disabled;
22
- }
23
- get fields() {
24
- return this._fields;
25
- }
26
- createTabGroup(name, title) {
27
- const tabGroup = new FieldTabGroupDescriptor(this, name);
28
- if (title) {
29
- tabGroup.withTitle(title);
30
- }
31
- this.createTabGroupDescriptor(tabGroup);
32
- return tabGroup;
33
- }
34
- createFieldGroup(name, title) {
35
- const fieldGroup = new FieldGroupDescriptor(this, name);
36
- if (title) {
37
- fieldGroup.withTitle(title);
38
- }
39
- this.createFieldGroupDescriptor(fieldGroup);
40
- return fieldGroup;
41
- }
42
- addFieldDescriptor(field) {
43
- this.createDefaultGroup();
44
- this._fields.push(field);
45
- this._currentGroup?.addField(field);
46
- return this;
47
- }
48
- addField(property) {
49
- const field = new FieldInputDescriptor(this, property);
50
- this.addFieldDescriptor(field);
51
- return field;
52
- }
53
- removeField(property) {
54
- const fieldIdx = this._fields.findIndex(f => f.property === property);
55
- if (fieldIdx < 0) {
56
- throw new Error(`Field ${property} does not exist.`);
57
- }
58
- const field = this._fields[fieldIdx];
59
- if (field.group) {
60
- const groupFieldIdx = field.group.fields.findIndex(f => f instanceof AFieldDescriptor && f.property === property);
61
- if (groupFieldIdx >= 0) {
62
- field.group.fields.splice(groupFieldIdx, 1);
63
- }
64
- }
65
- this._fields.splice(fieldIdx, 1);
66
- return this;
67
- }
68
- getField(property) {
69
- return this._fields.find(f => f.property === property) ?? null;
70
- }
71
- addFieldLookup(property, modelType) {
72
- const field = new FieldLookupDescriptor(this, property, modelType);
73
- this.addFieldDescriptor(field);
74
- return field;
75
- }
76
- addFieldLookupEnum(property, options) {
77
- const propDef = ObjectSerializer.get().findAttributeDefinitionByClassType(this.model.type, property);
78
- if (!propDef) {
79
- throw new Error(`Property (attribute) definition not found for property ${property} on class type ${this._model.typeName}`);
80
- }
81
- const enumDef = ObjectSerializer.get().findEnum(propDef.type);
82
- if (!enumDef) {
83
- throw new Error(`Enum definition ${propDef.type} not found for property ${property} on class type ${this._model.typeName}`);
84
- }
85
- const field = new FieldLookupEnumDescriptor(this, property, propDef.type, options);
86
- this.addFieldDescriptor(field);
87
- return field;
88
- }
89
- addFieldManyEditor(property, type, tableviewDescriptor) {
90
- const field = new FieldManyEditorDescriptor(this, property, type, tableviewDescriptor);
91
- this.addFieldDescriptor(field);
92
- return field;
93
- }
94
- addFieldManyToManyEditor(property, type, mainTableDescriptor, lookupTableDescriptor) {
95
- const field = new FieldManyToManyEditorDescriptor(this, property, type, mainTableDescriptor, lookupTableDescriptor);
96
- this.addFieldDescriptor(field);
97
- return field;
98
- }
99
- withDisabled(disabled = true) {
100
- this._disabled = disabled;
101
- return this;
102
- }
103
- addValidator(name, expression) {
104
- if (this._currentGroup) {
105
- this._currentGroup.withValidator(name, expression);
106
- }
107
- }
108
- copy() {
109
- const editor = new EditorDescriptor(this.model.type, this.model.idPropertyName, this.model.titlePropertyName);
110
- for (const tabGroup of this._tabs) {
111
- editor.createTabGroupDescriptor(tabGroup.copy());
112
- }
113
- for (const tabGroup of editor._tabs) {
114
- for (const fieldGroup of tabGroup.fields) {
115
- editor._fields.push(...fieldGroup.fields);
116
- }
117
- editor._groups.push(...tabGroup.fields);
118
- }
119
- editor._currentTabGroup = editor._tabs[editor._tabs.length - 1];
120
- editor._currentGroup = editor._currentTabGroup.fields[editor._currentTabGroup.fields.length - 1];
121
- editor._disabled = this._disabled;
122
- return editor;
123
- }
124
- createTabGroupDescriptor(tabGroup) {
125
- this._currentTabGroup = tabGroup;
126
- this._tabs.push(tabGroup);
127
- return this;
128
- }
129
- createFieldGroupDescriptor(fieldGroup) {
130
- this.createDefaultTabGroup();
131
- this._currentGroup = fieldGroup;
132
- this._groups.push(fieldGroup);
133
- this._currentTabGroup?.addField(fieldGroup);
134
- return this;
135
- }
136
- createDefaultGroup() {
137
- this.createDefaultTabGroup();
138
- if (this._currentTabGroup?.fields.length === 0) {
139
- this.createFieldGroup(EditorDescriptor.defaultGroupName);
140
- }
141
- }
142
- createDefaultTabGroup() {
143
- if (this._tabs.length === 0) {
144
- this.createTabGroup(EditorDescriptor.defaultGroupName);
145
- }
146
- }
147
- }
148
- EditorDescriptor.defaultGroupName = '_default';
149
- export class AGenericFieldDescriptor {
150
- constructor(editor) {
151
- this._editor = editor;
152
- }
153
- get editor() {
154
- return this._editor;
155
- }
156
- }
157
- export class AFieldDescriptor extends AGenericFieldDescriptor {
158
- constructor(editor, property) {
159
- super(editor);
160
- this._required = false;
161
- this._disabled = false;
162
- this._className = '';
163
- this._validators = [];
164
- this._property = property;
165
- this._label = this._editor.model.typeName + '.properties.' + property;
166
- }
167
- get property() {
168
- return this._property;
169
- }
170
- get group() {
171
- return this._group;
172
- }
173
- get label() {
174
- return this._label;
175
- }
176
- get placeholder() {
177
- return this._placeholder;
178
- }
179
- get required() {
180
- return this._required;
181
- }
182
- get disabled() {
183
- return this._disabled;
184
- }
185
- get className() {
186
- return this._className;
187
- }
188
- get getter() {
189
- return this._getter;
190
- }
191
- get setter() {
192
- return this._setter;
193
- }
194
- get validators() {
195
- return this._validators;
196
- }
197
- withLabel(label) {
198
- this._label = label;
199
- return this;
200
- }
201
- withPlaceholder(placeholder) {
202
- this._placeholder = placeholder;
203
- return this;
204
- }
205
- withRequired(required = true) {
206
- this._required = required;
207
- return this;
208
- }
209
- withDisabled(disabled = true) {
210
- this._disabled = disabled;
211
- return this;
212
- }
213
- withClassName(className) {
214
- this._className = className;
215
- return this;
216
- }
217
- withGetter(getter) {
218
- this._getter = getter;
219
- return this;
220
- }
221
- withSetter(setter) {
222
- this._setter = setter;
223
- return this;
224
- }
225
- withValidator(name, expression, message) {
226
- this._validators.push(new FieldValidator(name, expression, message));
227
- return this;
228
- }
229
- copyFieldsTo(obj) {
230
- obj._label = this._label;
231
- obj._placeholder = this._placeholder;
232
- obj._required = this._required;
233
- obj._disabled = this._disabled;
234
- obj._className = this._className;
235
- obj._getter = this._getter;
236
- obj._setter = this._setter;
237
- obj._validators = this._validators;
238
- }
239
- }
240
- export class FieldInputDescriptor extends AFieldDescriptor {
241
- constructor(editor, property) {
242
- super(editor, property);
243
- this._fieldType = FieldInputDescriptor.TypeEnum.Text;
244
- // radio specific properties
245
- this._radioOptions = [];
246
- this._datePickerShowTime = false;
247
- }
248
- get fieldType() {
249
- return this._fieldType;
250
- }
251
- get numberStep() {
252
- return this._numberStep;
253
- }
254
- get numberMin() {
255
- return this._numberMin;
256
- }
257
- get numberMax() {
258
- return this._numberMax;
259
- }
260
- get rows() {
261
- return this._rows;
262
- }
263
- get numberMinFractionDigits() {
264
- return this._numberMinFractionDigits;
265
- }
266
- get numberMaxFractionDigits() {
267
- return this._numberMaxFractionDigits;
268
- }
269
- get radioOptions() {
270
- return this._radioOptions;
271
- }
272
- get datePickerFormat() {
273
- return this._datePickerFormat;
274
- }
275
- get datePickerMin() {
276
- return this._datePickerMin;
277
- }
278
- get datePickerMax() {
279
- return this._datePickerMax;
280
- }
281
- get datePickerShowTime() {
282
- return this._datePickerShowTime;
283
- }
284
- get maxLength() {
285
- return this._maxLength;
286
- }
287
- get minLength() {
288
- return this._minLength;
289
- }
290
- get pattern() {
291
- return this._pattern;
292
- }
293
- asText(minLength, maxLength, pattern) {
294
- this._fieldType = FieldInputDescriptor.TypeEnum.Text;
295
- this._minLength = minLength;
296
- this._maxLength = maxLength;
297
- this._pattern = pattern;
298
- return this;
299
- }
300
- asTextarea(rows = 3) {
301
- this._fieldType = FieldInputDescriptor.TypeEnum.Textarea;
302
- this._rows = rows;
303
- return this;
304
- }
305
- asNumber(step, min, max, minFractionDigits, maxFractionDigits) {
306
- this._fieldType = FieldInputDescriptor.TypeEnum.Number;
307
- this._numberStep = step;
308
- this._numberMinFractionDigits = minFractionDigits;
309
- this._numberMaxFractionDigits = maxFractionDigits;
310
- this._numberMin = min ?? Number.MIN_SAFE_INTEGER;
311
- this._numberMax = max ?? Number.MAX_SAFE_INTEGER;
312
- return this;
313
- }
314
- asSwitch() {
315
- this._fieldType = FieldInputDescriptor.TypeEnum.Switch;
316
- return this;
317
- }
318
- asRadio(options) {
319
- this._fieldType = FieldInputDescriptor.TypeEnum.Radio;
320
- this._radioOptions = options;
321
- return this;
322
- }
323
- asDatePicker(format, min, max, showTime) {
324
- this._fieldType = FieldInputDescriptor.TypeEnum.Datepicker;
325
- this._datePickerFormat = format ? format : 'dd.mm.yy';
326
- this._datePickerMin = min;
327
- this._datePickerMax = max;
328
- this._datePickerShowTime = showTime ?? false;
329
- return this;
330
- }
331
- copy() {
332
- const field = new FieldInputDescriptor(this._editor, this._property);
333
- this.copyFieldsTo(field);
334
- field._fieldType = this._fieldType;
335
- field._rows = this._rows;
336
- field._numberMin = this._numberMin;
337
- field._numberMax = this._numberMax;
338
- field._numberStep = this._numberStep;
339
- field._numberMinFractionDigits = this._numberMinFractionDigits;
340
- field._numberMaxFractionDigits = this._numberMaxFractionDigits;
341
- field._radioOptions = this._radioOptions;
342
- field._datePickerFormat = this._datePickerFormat;
343
- field._datePickerMin = this._datePickerMin;
344
- field._datePickerMax = this._datePickerMax;
345
- field._datePickerShowTime = this._datePickerShowTime;
346
- field._maxLength = this._maxLength;
347
- field._minLength = this._minLength;
348
- field._pattern = this._pattern;
349
- return field;
350
- }
351
- }
352
- (function (FieldInputDescriptor) {
353
- let TypeEnum;
354
- (function (TypeEnum) {
355
- TypeEnum[TypeEnum["Text"] = 0] = "Text";
356
- TypeEnum[TypeEnum["Textarea"] = 1] = "Textarea";
357
- TypeEnum[TypeEnum["Number"] = 2] = "Number";
358
- TypeEnum[TypeEnum["Switch"] = 3] = "Switch";
359
- TypeEnum[TypeEnum["Radio"] = 4] = "Radio";
360
- TypeEnum[TypeEnum["Datepicker"] = 5] = "Datepicker";
361
- })(TypeEnum = FieldInputDescriptor.TypeEnum || (FieldInputDescriptor.TypeEnum = {}));
362
- })(FieldInputDescriptor || (FieldInputDescriptor = {}));
363
- export class FieldLookupDescriptor extends AFieldDescriptor {
364
- constructor(editor, property, modelType) {
365
- super(editor, property);
366
- this._lookupType = FieldLookupDescriptor.LookupTypeEnum.Dropdown;
367
- this._modelType = modelType;
368
- ModelUtil.trySetLookupItemsProperties(this);
369
- }
370
- get modelType() {
371
- return this._modelType;
372
- }
373
- get lookupType() {
374
- return this._lookupType;
375
- }
376
- get itemsLabelProperty() {
377
- return this._itemsLabelProperty;
378
- }
379
- get itemsValueProperty() {
380
- return this._itemsValueProperty;
381
- }
382
- get dataKeyProperty() {
383
- return this._dataKeyProperty;
384
- }
385
- get dataProvider() {
386
- return this._dataProvider;
387
- }
388
- withItemsLabelProperty(itemsLabelProperty) {
389
- this._itemsLabelProperty = itemsLabelProperty;
390
- return this;
391
- }
392
- withItemsValueProperty(itemsValueProperty) {
393
- this._itemsValueProperty = itemsValueProperty;
394
- return this;
395
- }
396
- withDataKeyProperty(property) {
397
- this._dataKeyProperty = property;
398
- return this;
399
- }
400
- withLookup(lookup, serviceType) {
401
- const dataProvider = new LookupDataProvider(this._modelType);
402
- if (serviceType) {
403
- dataProvider.withServiceType(serviceType);
404
- }
405
- dataProvider.withLookup(lookup);
406
- this._dataProvider = dataProvider;
407
- return this;
408
- }
409
- withLookupDataProvider(dataProvider) {
410
- this._dataProvider = dataProvider;
411
- return this;
412
- }
413
- asAutocomplete() {
414
- this._lookupType = FieldLookupDescriptor.LookupTypeEnum.Autocomplete;
415
- return this;
416
- }
417
- copy() {
418
- const field = new FieldLookupDescriptor(this._editor, this._property, this._modelType);
419
- this.copyFieldsTo(field);
420
- field._lookupType = this._lookupType;
421
- field._itemsLabelProperty = this._itemsLabelProperty;
422
- field._itemsValueProperty = this._itemsValueProperty;
423
- field._dataKeyProperty = this._dataKeyProperty;
424
- field._dataProvider = this._dataProvider;
425
- return field;
426
- }
427
- }
428
- (function (FieldLookupDescriptor) {
429
- let LookupTypeEnum;
430
- (function (LookupTypeEnum) {
431
- LookupTypeEnum[LookupTypeEnum["Dropdown"] = 0] = "Dropdown";
432
- LookupTypeEnum[LookupTypeEnum["Autocomplete"] = 1] = "Autocomplete";
433
- })(LookupTypeEnum = FieldLookupDescriptor.LookupTypeEnum || (FieldLookupDescriptor.LookupTypeEnum = {}));
434
- })(FieldLookupDescriptor || (FieldLookupDescriptor = {}));
435
- export class FieldLookupEnumDescriptor extends FieldLookupDescriptor {
436
- constructor(editor, property, enumName, options) {
437
- super(editor, property, null);
438
- this._enumName = enumName;
439
- const dataProvider = new LookupDataProvider(null)
440
- .withEnumName(enumName)
441
- .withLookup(() => of(options));
442
- this.withLookupDataProvider(dataProvider);
443
- }
444
- get enumName() {
445
- return this._enumName;
446
- }
447
- copy() {
448
- const field = new FieldLookupEnumDescriptor(this._editor, this._property, this._enumName, []);
449
- this.copyFieldsTo(field);
450
- field._lookupType = this._lookupType;
451
- field._itemsLabelProperty = this._itemsLabelProperty;
452
- field._itemsValueProperty = this._itemsValueProperty;
453
- field._dataKeyProperty = this._dataKeyProperty;
454
- field._dataProvider = this._dataProvider;
455
- return field;
456
- }
457
- }
458
- export class FieldManyToManyEditorDescriptor extends AFieldDescriptor {
459
- constructor(editor, property, modelType, mainTableDescriptor, lookupTableDescriptor) {
460
- super(editor, property);
461
- this._fieldType = FieldManyToManyEditorDescriptor.TypeEnum.DialogTableMultiselect;
462
- this._lookupTableDataProvider = null;
463
- this._actions = [];
464
- this._hasLookupExcludeValues = false;
465
- this._excludeFilterProperty = '';
466
- this._excludeValueProperty = '';
467
- this._model = new ModelDescriptor(modelType);
468
- this._mainTableDescriptor = mainTableDescriptor;
469
- this._lookupTableDescriptor = lookupTableDescriptor;
470
- this._actions.push(FieldManyToManyEditorDescriptor.ActionEnum.Add, FieldManyToManyEditorDescriptor.ActionEnum.Delete);
471
- }
472
- get mainTableDescriptor() {
473
- return this._mainTableDescriptor;
474
- }
475
- get lookupTableDescriptor() {
476
- return this._lookupTableDescriptor;
477
- }
478
- get lookupTableDataProvider() {
479
- return this._lookupTableDataProvider;
480
- }
481
- get actions() {
482
- return this._actions;
483
- }
484
- get fieldType() {
485
- return this._fieldType;
486
- }
487
- get hasLookupExcludeValues() {
488
- return this._hasLookupExcludeValues;
489
- }
490
- get excludeFilterProperty() {
491
- return this._excludeFilterProperty;
492
- }
493
- get excludeValueProperty() {
494
- return this._excludeValueProperty;
495
- }
496
- withLookup(getAll, serviceType) {
497
- const dataProvider = new TableviewDataProvider(this._model.type);
498
- if (serviceType) {
499
- dataProvider.withServiceType(serviceType);
500
- }
501
- dataProvider.withGetAll(getAll);
502
- this._lookupTableDataProvider = dataProvider;
503
- return this;
504
- }
505
- withLookupDataProvider(dataProvider) {
506
- this._lookupTableDataProvider = dataProvider;
507
- return this;
508
- }
509
- withActions(actions = []) {
510
- this.actions.push(...actions);
511
- return this;
512
- }
513
- withLookupExclude(filterProperty, valueProperty, hasLookupExclude = true) {
514
- this._hasLookupExcludeValues = hasLookupExclude;
515
- this._excludeFilterProperty = filterProperty;
516
- this._excludeValueProperty = valueProperty;
517
- return this;
518
- }
519
- copy() {
520
- const field = new FieldManyToManyEditorDescriptor(this._editor, this._property, this._model.type, this._mainTableDescriptor.copy(), this._lookupTableDescriptor.copy());
521
- this.copyFieldsTo(field);
522
- field._fieldType = this._fieldType;
523
- field._actions = this._actions.map(a => a);
524
- field._lookupTableDataProvider = this._lookupTableDataProvider;
525
- field._hasLookupExcludeValues = this._hasLookupExcludeValues;
526
- field._excludeFilterProperty = this._excludeFilterProperty;
527
- field._excludeValueProperty = this._excludeValueProperty;
528
- return field;
529
- }
530
- }
531
- (function (FieldManyToManyEditorDescriptor) {
532
- let TypeEnum;
533
- (function (TypeEnum) {
534
- TypeEnum[TypeEnum["DialogTableMultiselect"] = 0] = "DialogTableMultiselect";
535
- })(TypeEnum = FieldManyToManyEditorDescriptor.TypeEnum || (FieldManyToManyEditorDescriptor.TypeEnum = {}));
536
- let ActionEnum;
537
- (function (ActionEnum) {
538
- ActionEnum[ActionEnum["Add"] = 0] = "Add";
539
- ActionEnum[ActionEnum["Delete"] = 1] = "Delete";
540
- })(ActionEnum = FieldManyToManyEditorDescriptor.ActionEnum || (FieldManyToManyEditorDescriptor.ActionEnum = {}));
541
- })(FieldManyToManyEditorDescriptor || (FieldManyToManyEditorDescriptor = {}));
542
- export class FieldManyEditorDescriptor extends AFieldDescriptor {
543
- constructor(editor, property, modelType, tableviewDescriptor) {
544
- super(editor, property);
545
- this._fieldType = FieldManyEditorDescriptor.TypeEnum.DialogEditor;
546
- this._actions = [];
547
- this._modelType = modelType;
548
- this._tableviewDescriptor = tableviewDescriptor;
549
- this._actions.push(FieldManyEditorDescriptor.ActionEnum.Add, FieldManyEditorDescriptor.ActionEnum.Edit, FieldManyEditorDescriptor.ActionEnum.Delete);
550
- }
551
- get tableviewDescriptor() {
552
- return this._tableviewDescriptor;
553
- }
554
- get tableDescriptor() {
555
- return this._tableviewDescriptor.table;
556
- }
557
- get editorForCreate() {
558
- return this._tableviewDescriptor.addEditor;
559
- }
560
- get editorForRead() {
561
- return this._tableviewDescriptor.viewEditor;
562
- }
563
- get editorForUpdate() {
564
- return this._tableviewDescriptor.editEditor;
565
- }
566
- get fieldType() {
567
- return this._fieldType;
568
- }
569
- get actions() {
570
- return this._actions;
571
- }
572
- withActions(actions = []) {
573
- this.actions.push(...actions);
574
- return this;
575
- }
576
- copy() {
577
- const field = new FieldManyEditorDescriptor(this._editor, this._property, this._modelType, this._tableviewDescriptor.copy());
578
- this.copyFieldsTo(field);
579
- field._fieldType = this._fieldType;
580
- field._actions = this._actions.map(a => a);
581
- return field;
582
- }
583
- }
584
- (function (FieldManyEditorDescriptor) {
585
- let TypeEnum;
586
- (function (TypeEnum) {
587
- TypeEnum[TypeEnum["DialogEditor"] = 0] = "DialogEditor";
588
- })(TypeEnum = FieldManyEditorDescriptor.TypeEnum || (FieldManyEditorDescriptor.TypeEnum = {}));
589
- let ActionEnum;
590
- (function (ActionEnum) {
591
- ActionEnum[ActionEnum["Add"] = 0] = "Add";
592
- ActionEnum[ActionEnum["Edit"] = 1] = "Edit";
593
- ActionEnum[ActionEnum["Delete"] = 2] = "Delete";
594
- })(ActionEnum = FieldManyEditorDescriptor.ActionEnum || (FieldManyEditorDescriptor.ActionEnum = {}));
595
- })(FieldManyEditorDescriptor || (FieldManyEditorDescriptor = {}));
596
- export class AFieldGroupDescriptor extends AGenericFieldDescriptor {
597
- constructor(editor, name) {
598
- super(editor);
599
- this._fields = [];
600
- this._validators = [];
601
- this._name = `${this.baseName}${name}`;
602
- this._default = name === EditorDescriptor.defaultGroupName;
603
- }
604
- get baseName() {
605
- return `${this.groupName()}_`;
606
- }
607
- get name() {
608
- return this._name;
609
- }
610
- get default() {
611
- return this._default;
612
- }
613
- get title() {
614
- return this._title;
615
- }
616
- get validators() {
617
- return this._validators;
618
- }
619
- withTitle(title) {
620
- this._title = title;
621
- return this;
622
- }
623
- withValidator(name, expression) {
624
- this._validators.push(new FieldValidator(name, expression, undefined));
625
- return this;
626
- }
627
- }
628
- export class FieldTabGroupDescriptor extends AFieldGroupDescriptor {
629
- constructor(editor, name) {
630
- super(editor, name);
631
- }
632
- get fields() {
633
- return this._fields;
634
- }
635
- groupName() {
636
- return 'tab';
637
- }
638
- addField(field) {
639
- this._fields.push(field);
640
- return this;
641
- }
642
- copy() {
643
- const tab = new FieldTabGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
644
- tab._title = this._title;
645
- tab._fields = this.fields.map(f => f.copy());
646
- return tab;
647
- }
648
- }
649
- export class FieldGroupDescriptor extends AFieldGroupDescriptor {
650
- constructor(editor, name) {
651
- super(editor, name);
652
- }
653
- get fields() {
654
- return this._fields;
655
- }
656
- groupName() {
657
- return 'group';
658
- }
659
- addField(field) {
660
- this._fields.push(field);
661
- return this;
662
- }
663
- copy() {
664
- const group = new FieldGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
665
- group._title = this._title;
666
- group._fields = this.fields.map(f => f.copy());
667
- return group;
668
- }
669
- }
670
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbmctY29tbW9ucy9zcmMvbGliL2Rlc2NyaXB0b3JzL2VkaXRvci5kZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBYSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHcEMsT0FBTyxFQUEwQyxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3JILE9BQU8sRUFBQyxlQUFlLEVBQXdDLGNBQWMsRUFBb0IsTUFBTSxJQUFJLENBQUM7QUFHNUcsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFbkMsTUFBTSxPQUFPLGdCQUFnQjtJQWF6QixZQUFZLFNBQXVCLEVBQUUsVUFBbUIsRUFBRSxhQUFzQjtRQVIvRCxVQUFLLEdBQXNDLEVBQUUsQ0FBQztRQUM5QyxZQUFPLEdBQW1DLEVBQUUsQ0FBQztRQUM3QyxZQUFPLEdBQW9DLEVBQUUsQ0FBQztRQUl2RCxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUksU0FBUyxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFTSxjQUFjLENB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RUFBRSxDQUFDLENBQUM7UUFDN0MsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0NBQ0o7QUFFRCxNQUFNLE9BQU8sb0JBQXlCLFNBQVEscUJBQXlCO0lBRW5FLFlBQVksTUFBNEIsRUFBRSxJQUFZO1FBQ2xELEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQTJDLENBQUM7SUFDNUQsQ0FBQztJQUVNLFNBQVM7UUFDWixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQWdDO1FBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxJQUFJO1FBQ1AsTUFBTSxLQUFLLEdBQUcsSUFBSSxvQkFBb0IsQ0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNwRyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VHlwZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtGb3JtbHlGaWVsZENvbmZpZ30gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5cbmltcG9ydCB7T2JzZXJ2YWJsZSwgb2Z9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0NsYXNzVHlwZSwgRW51bU1lbWJlclR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7SUxvb2t1cERhdGFQcm92aWRlciwgSVRhYmxlRGF0YVByb3ZpZGVyLCBMb29rdXBEYXRhUHJvdmlkZXIsIFRhYmxldmlld0RhdGFQcm92aWRlcn0gZnJvbSAnLi4vZGF0YS1wcm92aWRlcnMnO1xuaW1wb3J0IHtNb2RlbERlc2NyaXB0b3IsIFRhYmxlRGVzY3JpcHRvciwgVGFibGV2aWV3RGVzY3JpcHRvciwgRmllbGRWYWxpZGF0b3IsIElMb29rdXBEZXNjcmlwdG9yfSBmcm9tICcuLyc7XG5cbmltcG9ydCB7TWVkaXVzUXVlcnlQYXJhbSwgTWVkaXVzUXVlcnlSZXN1bHR9IGZyb20gJy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtPYmplY3RTZXJpYWxpemVyfSBmcm9tICcuLi9hcGkvdXRpbHMnO1xuaW1wb3J0IHtNb2RlbFV0aWx9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIEVkaXRvckRlc2NyaXB0b3I8VD4ge1xuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBkZWZhdWx0R3JvdXBOYW1lID0gJ19kZWZhdWx0JztcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21vZGVsOiBNb2RlbERlc2NyaXB0b3I8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiczogQXJyYXk8RmllbGRUYWJHcm91cERlc2NyaXB0b3I8VD4+ID0gW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZ3JvdXBzOiBBcnJheTxGaWVsZEdyb3VwRGVzY3JpcHRvcjxUPj4gPSBbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9maWVsZHM6IEFycmF5PEFGaWVsZERlc2NyaXB0b3I8YW55LCBUPj4gPSBbXTtcbiAgICBwcml2YXRlIF9jdXJyZW50VGFiR3JvdXA/OiBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxUPjtcbiAgICBwcml2YXRlIF9jdXJyZW50R3JvdXA/OiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxUPjtcblxuICAgIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbFR5cGU6IENsYXNzVHlwZTxUPiwgaWRQcm9wZXJ0eT86IHN0cmluZywgdGl0bGVQcm9wZXJ0eT86IHN0cmluZykge1xuICAgICAgICB0aGlzLl9tb2RlbCA9IG5ldyBNb2RlbERlc2NyaXB0b3I8VD4obW9kZWxUeXBlLCBpZFByb3BlcnR5LCB0aXRsZVByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YWJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFicztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZVRhYkdyb3VwKG5hbWU6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcpOiBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIGNvbnN0IHRhYkdyb3VwID0gbmV3IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPFQ+KHRoaXMsIG5hbWUpO1xuICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgIHRhYkdyb3VwLndpdGhUaXRsZSh0aXRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVUYWJHcm91cERlc2NyaXB0b3IodGFiR3JvdXApO1xuICAgICAgICByZXR1cm4gdGFiR3JvdXA7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUZpZWxkR3JvdXAobmFtZTogc3RyaW5nLCB0aXRsZT86IHN0cmluZyk6IEZpZWxkR3JvdXBEZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgY29uc3QgZmllbGRHcm91cCA9IG5ldyBGaWVsZEdyb3VwRGVzY3JpcHRvcjxUPih0aGlzLCBuYW1lKTtcbiAgICAgICAgaWYgKHRpdGxlKSB7XG4gICAgICAgICAgICBmaWVsZEdyb3VwLndpdGhUaXRsZSh0aXRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVGaWVsZEdyb3VwRGVzY3JpcHRvcihmaWVsZEdyb3VwKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkR3JvdXA7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkRGVzY3JpcHRvcjxGVD4oZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8RlQsIFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdEdyb3VwKCk7XG4gICAgICAgIHRoaXMuX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgdGhpcy5fY3VycmVudEdyb3VwPy5hZGRGaWVsZChmaWVsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZChwcm9wZXJ0eTogc3RyaW5nKTogRmllbGRJbnB1dERlc2NyaXB0b3I8VD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZElucHV0RGVzY3JpcHRvcjxUPih0aGlzLCBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVGaWVsZChwcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGZpZWxkSWR4ID0gdGhpcy5fZmllbGRzLmZpbmRJbmRleChmID0+IGYucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGZpZWxkSWR4IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWVsZCAke3Byb3BlcnR5fSBkb2VzIG5vdCBleGlzdC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2ZpZWxkc1tmaWVsZElkeF07XG4gICAgICAgIGlmIChmaWVsZC5ncm91cCkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBGaWVsZElkeCA9IGZpZWxkLmdyb3VwLmZpZWxkcy5maW5kSW5kZXgoZiA9PiBmIGluc3RhbmNlb2YgQUZpZWxkRGVzY3JpcHRvciAmJiBmLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoZ3JvdXBGaWVsZElkeCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuZ3JvdXAuZmllbGRzLnNwbGljZShncm91cEZpZWxkSWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9maWVsZHMuc3BsaWNlKGZpZWxkSWR4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpZWxkKHByb3BlcnR5OiBzdHJpbmcpOiBBRmllbGREZXNjcmlwdG9yPGFueSwgVD58bnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMuZmluZChmID0+IGYucHJvcGVydHkgPT09IHByb3BlcnR5KSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cDxGVD4ocHJvcGVydHk6IHN0cmluZywgbW9kZWxUeXBlOiBDbGFzc1R5cGU8RlQ+KTogRmllbGRMb29rdXBEZXNjcmlwdG9yPEZULCBUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRGVzY3JpcHRvcjxGVCwgVD4odGhpcywgcHJvcGVydHksIG1vZGVsVHlwZSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cEVudW0ocHJvcGVydHk6IHN0cmluZywgb3B0aW9uczogQXJyYXk8RW51bU1lbWJlclR5cGU+KTogRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIGNvbnN0IHByb3BEZWYgPSBPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRBdHRyaWJ1dGVEZWZpbml0aW9uQnlDbGFzc1R5cGUodGhpcy5tb2RlbC50eXBlLCBwcm9wZXJ0eSk7XG4gICAgICAgIGlmICghcHJvcERlZikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSAoYXR0cmlidXRlKSBkZWZpbml0aW9uIG5vdCBmb3VuZCBmb3IgcHJvcGVydHkgJHtwcm9wZXJ0eX0gb24gY2xhc3MgdHlwZSAke3RoaXMuX21vZGVsLnR5cGVOYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudW1EZWYgPSBPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRFbnVtKHByb3BEZWYudHlwZSk7XG4gICAgICAgIGlmICghZW51bURlZikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnVtIGRlZmluaXRpb24gJHtwcm9wRGVmLnR5cGV9IG5vdCBmb3VuZCBmb3IgcHJvcGVydHkgJHtwcm9wZXJ0eX0gb24gY2xhc3MgdHlwZSAke3RoaXMuX21vZGVsLnR5cGVOYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3IodGhpcywgcHJvcGVydHksIHByb3BEZWYudHlwZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZE1hbnlFZGl0b3I8RlQ+KHByb3BlcnR5OiBzdHJpbmcsIHR5cGU6IENsYXNzVHlwZTxGVD4sIHRhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3I8RlQ+KTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxGVCwgVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMsIHByb3BlcnR5LCB0eXBlLCB0YWJsZXZpZXdEZXNjcmlwdG9yKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTWFueVRvTWFueUVkaXRvcjxGVD4ocHJvcGVydHk6IHN0cmluZywgdHlwZTogQ2xhc3NUeXBlPEZUPiwgbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPEZUPiwgbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8RlQ+KTogRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxGVCwgVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMsIHByb3BlcnR5LCB0eXBlLCBtYWluVGFibGVEZXNjcmlwdG9yLCBsb29rdXBUYWJsZURlc2NyaXB0b3IpO1xuICAgICAgICB0aGlzLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERpc2FibGVkKGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkVmFsaWRhdG9yKG5hbWU6IHN0cmluZywgZXhwcmVzc2lvbjogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudEdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50R3JvdXAud2l0aFZhbGlkYXRvcihuYW1lLCBleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEVkaXRvckRlc2NyaXB0b3I8VD4ge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSBuZXcgRWRpdG9yRGVzY3JpcHRvcjxUPih0aGlzLm1vZGVsLnR5cGUsIHRoaXMubW9kZWwuaWRQcm9wZXJ0eU5hbWUsIHRoaXMubW9kZWwudGl0bGVQcm9wZXJ0eU5hbWUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYkdyb3VwIG9mIHRoaXMuX3RhYnMpIHtcbiAgICAgICAgICAgIGVkaXRvci5jcmVhdGVUYWJHcm91cERlc2NyaXB0b3IodGFiR3JvdXAuY29weSgpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHRhYkdyb3VwIG9mIGVkaXRvci5fdGFicykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZEdyb3VwIG9mIHRhYkdyb3VwLmZpZWxkcykge1xuICAgICAgICAgICAgICAgIGVkaXRvci5fZmllbGRzLnB1c2goLi4uZmllbGRHcm91cC5maWVsZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWRpdG9yLl9ncm91cHMucHVzaCguLi50YWJHcm91cC5maWVsZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRvci5fY3VycmVudFRhYkdyb3VwID0gZWRpdG9yLl90YWJzW2VkaXRvci5fdGFicy5sZW5ndGggLSAxXTtcbiAgICAgICAgZWRpdG9yLl9jdXJyZW50R3JvdXAgPSBlZGl0b3IuX2N1cnJlbnRUYWJHcm91cC5maWVsZHNbZWRpdG9yLl9jdXJyZW50VGFiR3JvdXAuZmllbGRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBlZGl0b3IuX2Rpc2FibGVkID0gdGhpcy5fZGlzYWJsZWQ7XG4gICAgICAgIHJldHVybiBlZGl0b3I7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUYWJHcm91cERlc2NyaXB0b3IodGFiR3JvdXA6IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYWJHcm91cCA9IHRhYkdyb3VwO1xuICAgICAgICB0aGlzLl90YWJzLnB1c2godGFiR3JvdXApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlRmllbGRHcm91cERlc2NyaXB0b3IoZmllbGRHcm91cDogRmllbGRHcm91cERlc2NyaXB0b3I8VD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0VGFiR3JvdXAoKTtcbiAgICAgICAgdGhpcy5fY3VycmVudEdyb3VwID0gZmllbGRHcm91cDtcbiAgICAgICAgdGhpcy5fZ3JvdXBzLnB1c2goZmllbGRHcm91cCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYWJHcm91cD8uYWRkRmllbGQoZmllbGRHcm91cCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGVmYXVsdEdyb3VwKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZURlZmF1bHRUYWJHcm91cCgpO1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRhYkdyb3VwPy5maWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZpZWxkR3JvdXAoRWRpdG9yRGVzY3JpcHRvci5kZWZhdWx0R3JvdXBOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGVmYXVsdFRhYkdyb3VwKCkge1xuICAgICAgICBpZiAodGhpcy5fdGFicy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFiR3JvdXAoRWRpdG9yRGVzY3JpcHRvci5kZWZhdWx0R3JvdXBOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9lZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+O1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4pIHtcbiAgICAgICAgdGhpcy5fZWRpdG9yID0gZWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+IGV4dGVuZHMgQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+IHtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfcHJvcGVydHk6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2dyb3VwPzogQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPjtcbiAgICBwcm90ZWN0ZWQgX2xhYmVsPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9yZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2NsYXNzTmFtZTogc3RyaW5nID0gJyc7XG4gICAgcHJvdGVjdGVkIF9nZXR0ZXI/OiAoaXRlbTogRVQpID0+IFQ7XG4gICAgcHJvdGVjdGVkIF9zZXR0ZXI/OiAoaXRlbTogRVQsIHZhbHVlOiBUKSA9PiB2b2lkO1xuICAgIHByb3RlY3RlZCBfdmFsaWRhdG9yczogQXJyYXk8RmllbGRWYWxpZGF0b3I+ID0gW107XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgcHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICBzdXBlcihlZGl0b3IpO1xuICAgICAgICB0aGlzLl9wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICB0aGlzLl9sYWJlbCA9IHRoaXMuX2VkaXRvci5tb2RlbC50eXBlTmFtZSArICcucHJvcGVydGllcy4nICsgcHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGFic3RyYWN0IGNvcHkoKTogQUZpZWxkRGVzY3JpcHRvcjxULCBFVD47XG5cbiAgICBwdWJsaWMgZ2V0IHByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBncm91cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXF1aXJlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGdldHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNldHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbGlkYXRvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3JzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTGFiZWwobGFiZWw6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sYWJlbCA9IGxhYmVsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBsYWNlaG9sZGVyKHBsYWNlaG9sZGVyOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSZXF1aXJlZChyZXF1aXJlZDogYm9vbGVhbiA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSByZXF1aXJlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbiA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEdldHRlcihnZXR0ZXI6IChpdGVtOiBFVCkgPT4gVCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9nZXR0ZXIgPSBnZXR0ZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU2V0dGVyKHNldHRlcjogKGl0ZW06IEVULCB2YWx1ZTogVCkgPT4gdm9pZCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zZXR0ZXIgPSBzZXR0ZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVmFsaWRhdG9yKG5hbWU6IHN0cmluZywgZXhwcmVzc2lvbjogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAoZXJyOiBhbnksIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4gc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMucHVzaChuZXcgRmllbGRWYWxpZGF0b3IobmFtZSwgZXhwcmVzc2lvbiwgbWVzc2FnZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29weUZpZWxkc1RvKG9iajogQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4pIHtcbiAgICAgICAgb2JqLl9sYWJlbCA9IHRoaXMuX2xhYmVsO1xuICAgICAgICBvYmouX3BsYWNlaG9sZGVyID0gdGhpcy5fcGxhY2Vob2xkZXI7XG4gICAgICAgIG9iai5fcmVxdWlyZWQgPSB0aGlzLl9yZXF1aXJlZDtcbiAgICAgICAgb2JqLl9kaXNhYmxlZCA9IHRoaXMuX2Rpc2FibGVkO1xuICAgICAgICBvYmouX2NsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcbiAgICAgICAgb2JqLl9nZXR0ZXIgPSB0aGlzLl9nZXR0ZXI7XG4gICAgICAgIG9iai5fc2V0dGVyID0gdGhpcy5fc2V0dGVyO1xuICAgICAgICBvYmouX3ZhbGlkYXRvcnMgPSB0aGlzLl92YWxpZGF0b3JzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkSW5wdXREZXNjcmlwdG9yPEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8c3RyaW5nfG51bWJlcnxib29sZWFufERhdGUsIEVUPiB7XG5cbiAgICBwcml2YXRlIF9maWVsZFR5cGU6IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uVGV4dDtcblxuICAgIC8vIHRleHRhcmVhIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9yb3dzPzogbnVtYmVyO1xuXG4gICAgLy8gbnVtYmVyIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9udW1iZXJNaW4/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWF4PzogbnVtYmVyO1xuICAgIHByaXZhdGUgX251bWJlclN0ZXA/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWluRnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG5cbiAgICAvLyByYWRpbyBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfcmFkaW9PcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICAvLyBkYXRlcGlja2VyIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyRm9ybWF0Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJNaW4/OiBEYXRlO1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJNYXg/OiBEYXRlO1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJTaG93VGltZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gaW5wdXQgc3BlY2lmaWNcbiAgICBwcml2YXRlIF9tYXhMZW5ndGg/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbWluTGVuZ3RoPzogbnVtYmVyO1xuICAgIHByaXZhdGUgX3BhdHRlcm4/OiBzdHJpbmcgfCBSZWdFeHA7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgcHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyU3RlcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlclN0ZXA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJNaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJNaW47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJNYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJNYXg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1pbkZyYWN0aW9uRGlnaXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyTWluRnJhY3Rpb25EaWdpdHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJNYXhGcmFjdGlvbkRpZ2l0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck1heEZyYWN0aW9uRGlnaXRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmFkaW9PcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmFkaW9PcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlckZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVQaWNrZXJGb3JtYXQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRlUGlja2VyTWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlck1pbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGVQaWNrZXJNYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlUGlja2VyTWF4O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlclNob3dUaW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlclNob3dUaW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWF4TGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4TGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWluTGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluTGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdHRlcm47XG4gICAgfVxuXG4gICAgcHVibGljIGFzVGV4dChtaW5MZW5ndGg/OiBudW1iZXIsIG1heExlbmd0aD86IG51bWJlciwgcGF0dGVybj86IHN0cmluZyB8IFJlZ0V4cCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5UZXh0O1xuICAgICAgICB0aGlzLl9taW5MZW5ndGggPSBtaW5MZW5ndGg7XG4gICAgICAgIHRoaXMuX21heExlbmd0aCA9IG1heExlbmd0aDtcbiAgICAgICAgdGhpcy5fcGF0dGVybiA9IHBhdHRlcm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1RleHRhcmVhKHJvd3M6IG51bWJlciA9IDMpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uVGV4dGFyZWE7XG4gICAgICAgIHRoaXMuX3Jvd3MgPSByb3dzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNOdW1iZXIoc3RlcD86IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIsIG1pbkZyYWN0aW9uRGlnaXRzPzogbnVtYmVyLCBtYXhGcmFjdGlvbkRpZ2l0cz86IG51bWJlcik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5OdW1iZXI7XG4gICAgICAgIHRoaXMuX251bWJlclN0ZXAgPSBzdGVwO1xuICAgICAgICB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cyA9IG1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLl9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cyA9IG1heEZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLl9udW1iZXJNaW4gPSBtaW4gPz8gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgIHRoaXMuX251bWJlck1heCA9IG1heCA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzU3dpdGNoKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5Td2l0Y2g7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1JhZGlvKG9wdGlvbnM6IEFycmF5PHN0cmluZz4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uUmFkaW87XG4gICAgICAgIHRoaXMuX3JhZGlvT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0RhdGVQaWNrZXIoZm9ybWF0Pzogc3RyaW5nLCBtaW4/OiBEYXRlLCBtYXg/OiBEYXRlLCBzaG93VGltZT86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uRGF0ZXBpY2tlcjtcbiAgICAgICAgdGhpcy5fZGF0ZVBpY2tlckZvcm1hdCA9IGZvcm1hdCA/IGZvcm1hdCA6ICdkZC5tbS55eSc7XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJNaW4gPSBtaW47XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJNYXggPSBtYXg7XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJTaG93VGltZSA9IHNob3dUaW1lID8/IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2ZpZWxkVHlwZSA9IHRoaXMuX2ZpZWxkVHlwZTtcbiAgICAgICAgZmllbGQuX3Jvd3MgPSB0aGlzLl9yb3dzO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWluID0gdGhpcy5fbnVtYmVyTWluO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWF4ID0gdGhpcy5fbnVtYmVyTWF4O1xuICAgICAgICBmaWVsZC5fbnVtYmVyU3RlcCA9IHRoaXMuX251bWJlclN0ZXA7XG4gICAgICAgIGZpZWxkLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cyA9IHRoaXMuX251bWJlck1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHMgPSB0aGlzLl9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cztcbiAgICAgICAgZmllbGQuX3JhZGlvT3B0aW9ucyA9IHRoaXMuX3JhZGlvT3B0aW9ucztcbiAgICAgICAgZmllbGQuX2RhdGVQaWNrZXJGb3JtYXQgPSB0aGlzLl9kYXRlUGlja2VyRm9ybWF0O1xuICAgICAgICBmaWVsZC5fZGF0ZVBpY2tlck1pbiA9IHRoaXMuX2RhdGVQaWNrZXJNaW47XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyTWF4ID0gdGhpcy5fZGF0ZVBpY2tlck1heDtcbiAgICAgICAgZmllbGQuX2RhdGVQaWNrZXJTaG93VGltZSA9IHRoaXMuX2RhdGVQaWNrZXJTaG93VGltZTtcbiAgICAgICAgZmllbGQuX21heExlbmd0aCA9IHRoaXMuX21heExlbmd0aDtcbiAgICAgICAgZmllbGQuX21pbkxlbmd0aCA9IHRoaXMuX21pbkxlbmd0aDtcbiAgICAgICAgZmllbGQuX3BhdHRlcm4gPSB0aGlzLl9wYXR0ZXJuO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZElucHV0RGVzY3JpcHRvciB7XG4gICAgZXhwb3J0IGVudW0gVHlwZUVudW0ge1xuICAgICAgICBUZXh0LFxuICAgICAgICBUZXh0YXJlYSxcbiAgICAgICAgTnVtYmVyLFxuICAgICAgICBTd2l0Y2gsXG4gICAgICAgIFJhZGlvLFxuICAgICAgICBEYXRlcGlja2VyXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRMb29rdXBEZXNjcmlwdG9yPFQsIEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+IGltcGxlbWVudHMgSUxvb2t1cERlc2NyaXB0b3I8VD4ge1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9tb2RlbFR5cGU6IENsYXNzVHlwZTxUPnxudWxsO1xuICAgIHByb3RlY3RlZCBfbG9va3VwVHlwZTogRmllbGRMb29rdXBEZXNjcmlwdG9yLkxvb2t1cFR5cGVFbnVtID0gRmllbGRMb29rdXBEZXNjcmlwdG9yLkxvb2t1cFR5cGVFbnVtLkRyb3Bkb3duO1xuICAgIHByb3RlY3RlZCBfaXRlbXNMYWJlbFByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfaXRlbXNWYWx1ZVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfZGF0YUtleVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfZGF0YVByb3ZpZGVyPzogSUxvb2t1cERhdGFQcm92aWRlcjxULCBhbnk+O1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgcHJvcGVydHk6IHN0cmluZywgbW9kZWxUeXBlOiBDbGFzc1R5cGU8VD58bnVsbCkge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fbW9kZWxUeXBlID0gbW9kZWxUeXBlO1xuICAgICAgICBNb2RlbFV0aWwudHJ5U2V0TG9va3VwSXRlbXNQcm9wZXJ0aWVzKHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbW9kZWxUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWxUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvb2t1cFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc0xhYmVsUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc0xhYmVsUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc1ZhbHVlUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhS2V5UHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJdGVtc0xhYmVsUHJvcGVydHkoaXRlbXNMYWJlbFByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5ID0gaXRlbXNMYWJlbFByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEl0ZW1zVmFsdWVQcm9wZXJ0eShpdGVtc1ZhbHVlUHJvcGVydHk6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSBpdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGF0YUtleVByb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGF0YUtleVByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwPFM+KGxvb2t1cDogKHF1ZXJ5UGFyYW0/OiBNZWRpdXNRdWVyeVBhcmFtLCBzZXJ2aWNlPzogUywgc2VhcmNoPzogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPEFycmF5PFQ+Piwgc2VydmljZVR5cGU/OiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBMb29rdXBEYXRhUHJvdmlkZXI8VCwgUz4odGhpcy5fbW9kZWxUeXBlKTtcbiAgICAgICAgaWYgKHNlcnZpY2VUeXBlKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aFNlcnZpY2VUeXBlKHNlcnZpY2VUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhUHJvdmlkZXIud2l0aExvb2t1cChsb29rdXApO1xuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSUxvb2t1cERhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzQXV0b2NvbXBsZXRlKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sb29rdXBUeXBlID0gRmllbGRMb29rdXBEZXNjcmlwdG9yLkxvb2t1cFR5cGVFbnVtLkF1dG9jb21wbGV0ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRMb29rdXBEZXNjcmlwdG9yPFQsIEVUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRGVzY3JpcHRvcih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5LCB0aGlzLl9tb2RlbFR5cGUpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9sb29rdXBUeXBlID0gdGhpcy5fbG9va3VwVHlwZTtcbiAgICAgICAgZmllbGQuX2l0ZW1zTGFiZWxQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zTGFiZWxQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2l0ZW1zVmFsdWVQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zVmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFLZXlQcm9wZXJ0eSA9IHRoaXMuX2RhdGFLZXlQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFQcm92aWRlciA9IHRoaXMuX2RhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZExvb2t1cERlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIExvb2t1cFR5cGVFbnVtIHtcbiAgICAgICAgRHJvcGRvd24sXG4gICAgICAgIEF1dG9jb21wbGV0ZVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgRmllbGRMb29rdXBEZXNjcmlwdG9yPEVudW1NZW1iZXJUeXBlLCBFVD4ge1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZW51bU5hbWU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIGVudW1OYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEFycmF5PEVudW1NZW1iZXJUeXBlPikge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5LCBudWxsKTtcblxuICAgICAgICB0aGlzLl9lbnVtTmFtZSA9IGVudW1OYW1lO1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSBuZXcgTG9va3VwRGF0YVByb3ZpZGVyPEVudW1NZW1iZXJUeXBlLCBhbnk+KG51bGwpXG4gICAgICAgICAgICAud2l0aEVudW1OYW1lKGVudW1OYW1lKVxuICAgICAgICAgICAgLndpdGhMb29rdXAoKCkgPT4gb2Yob3B0aW9ucykpO1xuICAgICAgICB0aGlzLndpdGhMb29rdXBEYXRhUHJvdmlkZXIoZGF0YVByb3ZpZGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVudW1OYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW51bU5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGNvcHkoKTogRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVUPih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5LCB0aGlzLl9lbnVtTmFtZSwgW10pO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9sb29rdXBUeXBlID0gdGhpcy5fbG9va3VwVHlwZTtcbiAgICAgICAgZmllbGQuX2l0ZW1zTGFiZWxQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zTGFiZWxQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2l0ZW1zVmFsdWVQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zVmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFLZXlQcm9wZXJ0eSA9IHRoaXMuX2RhdGFLZXlQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFQcm92aWRlciA9IHRoaXMuX2RhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3I8VCwgRVQ+IGV4dGVuZHMgQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4ge1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD47IC8vIHRhYmxlIGRlc2NyaXB0b3IgZm9yIG1haW4gdGFibGUgY29tcG9uZW50XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD47IC8vIHRhYmxlIGRlc2NyaXB0b3IgZm9yIHdoZXJlIHNlbGVjdCB3aWxsIGJlIGFwcGxpZWRcbiAgICBwcml2YXRlIF9maWVsZFR5cGU6IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuVHlwZUVudW0gPSBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLlR5cGVFbnVtLkRpYWxvZ1RhYmxlTXVsdGlzZWxlY3Q7XG4gICAgcHJpdmF0ZSBfbG9va3VwVGFibGVEYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+fG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2FjdGlvbnM6IEFycmF5PEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXTtcbiAgICBwcml2YXRlIF9oYXNMb29rdXBFeGNsdWRlVmFsdWVzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZUZpbHRlclByb3BlcnR5OiBzdHJpbmcgPSAnJztcbiAgICBwcml2YXRlIF9leGNsdWRlVmFsdWVQcm9wZXJ0eTogc3RyaW5nID0gJyc7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nLCBtb2RlbFR5cGU6IENsYXNzVHlwZTxUPiwgbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+LCBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBuZXcgTW9kZWxEZXNjcmlwdG9yPFQ+KG1vZGVsVHlwZSk7XG4gICAgICAgIHRoaXMuX21haW5UYWJsZURlc2NyaXB0b3IgPSBtYWluVGFibGVEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9sb29rdXBUYWJsZURlc2NyaXB0b3IgPSBsb29rdXBUYWJsZURlc2NyaXB0b3I7XG4gICAgICAgIHRoaXMuX2FjdGlvbnMucHVzaChGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0uQWRkLCBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0uRGVsZXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1haW5UYWJsZURlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWluVGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVGFibGVEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9va3VwVGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVGFibGVEYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzTG9va3VwRXhjbHVkZVZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlRmlsdGVyUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGNsdWRlRmlsdGVyUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlVmFsdWVQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwPFM+KGdldEFsbDogKHF1ZXJ5UGFyYW06IE1lZGl1c1F1ZXJ5UGFyYW0sIHNlcnZpY2U/OiBTKSA9PiBPYnNlcnZhYmxlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+Piwgc2VydmljZVR5cGU/OiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBUYWJsZXZpZXdEYXRhUHJvdmlkZXI8VCwgUz4odGhpcy5fbW9kZWwudHlwZSk7XG4gICAgICAgIGlmIChzZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhTZXJ2aWNlVHlwZShzZXJ2aWNlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhHZXRBbGwoZ2V0QWxsKTtcbiAgICAgICAgdGhpcy5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSVRhYmxlRGF0YVByb3ZpZGVyPFQsIGFueT4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQWN0aW9ucyhhY3Rpb25zOiBBcnJheTxGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0+ID0gW10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hY3Rpb25zLnB1c2goLi4uYWN0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwRXhjbHVkZShmaWx0ZXJQcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZVByb3BlcnR5OiBzdHJpbmcsIGhhc0xvb2t1cEV4Y2x1ZGU6IGJvb2xlYW4gPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXMgPSBoYXNMb29rdXBFeGNsdWRlO1xuICAgICAgICB0aGlzLl9leGNsdWRlRmlsdGVyUHJvcGVydHkgPSBmaWx0ZXJQcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5fZXhjbHVkZVZhbHVlUHJvcGVydHkgPSB2YWx1ZVByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yPFQsIEVUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IodGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSwgdGhpcy5fbW9kZWwudHlwZSwgdGhpcy5fbWFpblRhYmxlRGVzY3JpcHRvci5jb3B5KCksIHRoaXMuX2xvb2t1cFRhYmxlRGVzY3JpcHRvci5jb3B5KCkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9maWVsZFR5cGUgPSB0aGlzLl9maWVsZFR5cGU7XG4gICAgICAgIGZpZWxkLl9hY3Rpb25zID0gdGhpcy5fYWN0aW9ucy5tYXAoYSA9PiBhKTtcbiAgICAgICAgZmllbGQuX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyID0gdGhpcy5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXI7XG4gICAgICAgIGZpZWxkLl9oYXNMb29rdXBFeGNsdWRlVmFsdWVzID0gdGhpcy5faGFzTG9va3VwRXhjbHVkZVZhbHVlcztcbiAgICAgICAgZmllbGQuX2V4Y2x1ZGVGaWx0ZXJQcm9wZXJ0eSA9IHRoaXMuX2V4Y2x1ZGVGaWx0ZXJQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5ID0gdGhpcy5fZXhjbHVkZVZhbHVlUHJvcGVydHk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvciB7XG4gICAgZXhwb3J0IGVudW0gVHlwZUVudW0ge1xuICAgICAgICBEaWFsb2dUYWJsZU11bHRpc2VsZWN0XG4gICAgfVxuXG4gICAgZXhwb3J0IGVudW0gQWN0aW9uRW51bSB7XG4gICAgICAgIEFkZCxcbiAgICAgICAgRGVsZXRlXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiB7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tb2RlbFR5cGU6IENsYXNzVHlwZTxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9yPFQ+O1xuICAgIHByaXZhdGUgX2ZpZWxkVHlwZTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5UeXBlRW51bSA9IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuVHlwZUVudW0uRGlhbG9nRWRpdG9yO1xuICAgIHByaXZhdGUgX2FjdGlvbnM6IEFycmF5PEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIG1vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+LCB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9tb2RlbFR5cGUgPSBtb2RlbFR5cGU7XG4gICAgICAgIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IgPSB0YWJsZXZpZXdEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9hY3Rpb25zLnB1c2goRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLkFkZCwgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLkVkaXQsIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bS5EZWxldGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFibGV2aWV3RGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YWJsZURlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yLnRhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yRm9yQ3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci5hZGRFZGl0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JGb3JSZWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci52aWV3RWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yRm9yVXBkYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci5lZGl0RWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhBY3Rpb25zKGFjdGlvbnM6IEFycmF5PEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLmFjdGlvbnMucHVzaCguLi5hY3Rpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX21vZGVsVHlwZSwgdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci5jb3B5KCkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9maWVsZFR5cGUgPSB0aGlzLl9maWVsZFR5cGU7XG4gICAgICAgIGZpZWxkLl9hY3Rpb25zID0gdGhpcy5fYWN0aW9ucy5tYXAoYSA9PiBhKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yIHtcbiAgICBleHBvcnQgZW51bSBUeXBlRW51bSB7XG4gICAgICAgIERpYWxvZ0VkaXRvclxuICAgIH1cblxuICAgIGV4cG9ydCBlbnVtIEFjdGlvbkVudW0ge1xuICAgICAgICBBZGQsXG4gICAgICAgIEVkaXQsXG4gICAgICAgIERlbGV0ZVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4ge1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9uYW1lOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kZWZhdWx0OiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfdGl0bGU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9maWVsZHM6IEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPltdID0gW107XG4gICAgcHJvdGVjdGVkIF92YWxpZGF0b3JzOiBBcnJheTxGaWVsZFZhbGlkYXRvcj4gPSBbXTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yKTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IGAke3RoaXMuYmFzZU5hbWV9JHtuYW1lfWA7XG4gICAgICAgIHRoaXMuX2RlZmF1bHQgPSBuYW1lID09PSBFZGl0b3JEZXNjcmlwdG9yLmRlZmF1bHRHcm91cE5hbWU7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZ2V0IGZpZWxkcygpOiBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD5bXTtcblxuICAgIGFic3RyYWN0IGdyb3VwTmFtZSgpOiBzdHJpbmc7XG5cbiAgICBhYnN0cmFjdCBhZGRGaWVsZChmaWVsZDogQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+KTogdGhpcztcblxuICAgIGFic3RyYWN0IGNvcHkoKTogQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPjtcblxuICAgIHB1YmxpYyBnZXQgYmFzZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmdyb3VwTmFtZSgpfV9gO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2YWxpZGF0b3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGl0bGUgPSB0aXRsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhWYWxpZGF0b3IobmFtZTogc3RyaW5nLCBleHByZXNzaW9uOiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMucHVzaChuZXcgRmllbGRWYWxpZGF0b3IobmFtZSwgZXhwcmVzc2lvbiwgdW5kZWZpbmVkKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVUPiBleHRlbmRzIEFGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4ge1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8RmllbGRHcm91cERlc2NyaXB0b3I8RVQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMgYXMgQXJyYXk8RmllbGRHcm91cERlc2NyaXB0b3I8RVQ+PjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ3JvdXBOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAndGFiJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQoZmllbGQ6IEZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG4gICAgICAgIGNvbnN0IHRhYiA9IG5ldyBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMuYmFzZU5hbWUubGVuZ3RoKSk7XG4gICAgICAgIHRhYi5fdGl0bGUgPSB0aGlzLl90aXRsZTtcbiAgICAgICAgdGFiLl9maWVsZHMgPSB0aGlzLmZpZWxkcy5tYXAoZiA9PiBmLmNvcHkoKSk7XG4gICAgICAgIHJldHVybiB0YWI7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxBRmllbGREZXNjcmlwdG9yPGFueSwgRVQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMgYXMgQXJyYXk8QUZpZWxkRGVzY3JpcHRvcjxhbnksIEVUPj47XG4gICAgfVxuXG4gICAgcHVibGljIGdyb3VwTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2dyb3VwJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQoZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8YW55LCBFVD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBncm91cCA9IG5ldyBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMuYmFzZU5hbWUubGVuZ3RoKSk7XG4gICAgICAgIGdyb3VwLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICBncm91cC5fZmllbGRzID0gdGhpcy5maWVsZHMubWFwKGYgPT4gZi5jb3B5KCkpO1xuICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfVxufVxuIl19
1
+ import { of } from 'rxjs';
2
+ import { LookupDataProvider, TableviewDataProvider } from '../data-providers';
3
+ import { ModelDescriptor, FieldValidator } from './';
4
+ import { ObjectSerializer } from '../api/utils';
5
+ import { ModelUtil } from '../utils';
6
+ export class EditorDescriptor {
7
+ constructor(modelType, idProperty, titleProperty) {
8
+ this._tabs = [];
9
+ this._groups = [];
10
+ this._fields = [];
11
+ this._disabled = false;
12
+ this._model = new ModelDescriptor(modelType, idProperty, titleProperty);
13
+ }
14
+ get model() {
15
+ return this._model;
16
+ }
17
+ get tabs() {
18
+ return this._tabs;
19
+ }
20
+ get disabled() {
21
+ return this._disabled;
22
+ }
23
+ get fields() {
24
+ return this._fields;
25
+ }
26
+ createTabGroup(name, title) {
27
+ const tabGroup = new FieldTabGroupDescriptor(this, name);
28
+ if (title) {
29
+ tabGroup.withTitle(title);
30
+ }
31
+ this.createTabGroupDescriptor(tabGroup);
32
+ return tabGroup;
33
+ }
34
+ createFieldGroup(name, title) {
35
+ const fieldGroup = new FieldGroupDescriptor(this, name);
36
+ if (title) {
37
+ fieldGroup.withTitle(title);
38
+ }
39
+ this.createFieldGroupDescriptor(fieldGroup);
40
+ return fieldGroup;
41
+ }
42
+ addFieldDescriptor(field) {
43
+ this.createDefaultGroup();
44
+ this._fields.push(field);
45
+ this._currentGroup?.addField(field);
46
+ return this;
47
+ }
48
+ addField(property) {
49
+ const field = new FieldInputDescriptor(this, property);
50
+ this.addFieldDescriptor(field);
51
+ return field;
52
+ }
53
+ removeField(property) {
54
+ const fieldIdx = this._fields.findIndex(f => f.property === property);
55
+ if (fieldIdx < 0) {
56
+ throw new Error(`Field ${property} does not exist.`);
57
+ }
58
+ const field = this._fields[fieldIdx];
59
+ if (field.group) {
60
+ const groupFieldIdx = field.group.fields.findIndex(f => f instanceof AFieldDescriptor && f.property === property);
61
+ if (groupFieldIdx >= 0) {
62
+ field.group.fields.splice(groupFieldIdx, 1);
63
+ }
64
+ }
65
+ this._fields.splice(fieldIdx, 1);
66
+ return this;
67
+ }
68
+ getField(property) {
69
+ return this._fields.find(f => f.property === property) ?? null;
70
+ }
71
+ addFieldLookup(property, modelType) {
72
+ const field = new FieldLookupDescriptor(this, property, modelType);
73
+ this.addFieldDescriptor(field);
74
+ return field;
75
+ }
76
+ addFieldLookupEnum(property, options) {
77
+ const propDef = ObjectSerializer.get().findAttributeDefinitionByClassType(this.model.type, property);
78
+ if (!propDef) {
79
+ throw new Error(`Property (attribute) definition not found for property ${property} on class type ${this._model.typeName}`);
80
+ }
81
+ const enumDef = ObjectSerializer.get().findEnum(propDef.type);
82
+ if (!enumDef) {
83
+ throw new Error(`Enum definition ${propDef.type} not found for property ${property} on class type ${this._model.typeName}`);
84
+ }
85
+ const field = new FieldLookupEnumDescriptor(this, property, propDef.type, options);
86
+ this.addFieldDescriptor(field);
87
+ return field;
88
+ }
89
+ addFieldManyEditor(property, type, tableviewDescriptor) {
90
+ const field = new FieldManyEditorDescriptor(this, property, type, tableviewDescriptor);
91
+ this.addFieldDescriptor(field);
92
+ return field;
93
+ }
94
+ addFieldManyToManyEditor(property, type, mainTableDescriptor, lookupTableDescriptor) {
95
+ const field = new FieldManyToManyEditorDescriptor(this, property, type, mainTableDescriptor, lookupTableDescriptor);
96
+ this.addFieldDescriptor(field);
97
+ return field;
98
+ }
99
+ withDisabled(disabled = true) {
100
+ this._disabled = disabled;
101
+ return this;
102
+ }
103
+ addValidator(name, expression) {
104
+ if (this._currentGroup) {
105
+ this._currentGroup.withValidator(name, expression);
106
+ }
107
+ }
108
+ copy() {
109
+ const editor = new EditorDescriptor(this.model.type, this.model.idPropertyName, this.model.titlePropertyName);
110
+ for (const tabGroup of this._tabs) {
111
+ editor.createTabGroupDescriptor(tabGroup.copy());
112
+ }
113
+ for (const tabGroup of editor._tabs) {
114
+ for (const fieldGroup of tabGroup.fields) {
115
+ editor._fields.push(...fieldGroup.fields);
116
+ }
117
+ editor._groups.push(...tabGroup.fields);
118
+ }
119
+ editor._currentTabGroup = editor._tabs[editor._tabs.length - 1];
120
+ editor._currentGroup = editor._currentTabGroup.fields[editor._currentTabGroup.fields.length - 1];
121
+ editor._disabled = this._disabled;
122
+ return editor;
123
+ }
124
+ createTabGroupDescriptor(tabGroup) {
125
+ this._currentTabGroup = tabGroup;
126
+ this._tabs.push(tabGroup);
127
+ return this;
128
+ }
129
+ createFieldGroupDescriptor(fieldGroup) {
130
+ this.createDefaultTabGroup();
131
+ this._currentGroup = fieldGroup;
132
+ this._groups.push(fieldGroup);
133
+ this._currentTabGroup?.addField(fieldGroup);
134
+ return this;
135
+ }
136
+ createDefaultGroup() {
137
+ this.createDefaultTabGroup();
138
+ if (this._currentTabGroup?.fields.length === 0) {
139
+ this.createFieldGroup(EditorDescriptor.defaultGroupName);
140
+ }
141
+ }
142
+ createDefaultTabGroup() {
143
+ if (this._tabs.length === 0) {
144
+ this.createTabGroup(EditorDescriptor.defaultGroupName);
145
+ }
146
+ }
147
+ }
148
+ EditorDescriptor.defaultGroupName = '_default';
149
+ export class AGenericFieldDescriptor {
150
+ constructor(editor) {
151
+ this._editor = editor;
152
+ }
153
+ get editor() {
154
+ return this._editor;
155
+ }
156
+ }
157
+ export class AFieldDescriptor extends AGenericFieldDescriptor {
158
+ constructor(editor, property) {
159
+ super(editor);
160
+ this._required = false;
161
+ this._disabled = false;
162
+ this._className = '';
163
+ this._validators = [];
164
+ this._property = property;
165
+ this._label = this._editor.model.typeName + '.properties.' + property;
166
+ }
167
+ get property() {
168
+ return this._property;
169
+ }
170
+ get group() {
171
+ return this._group;
172
+ }
173
+ get label() {
174
+ return this._label;
175
+ }
176
+ get placeholder() {
177
+ return this._placeholder;
178
+ }
179
+ get required() {
180
+ return this._required;
181
+ }
182
+ get disabled() {
183
+ return this._disabled;
184
+ }
185
+ get className() {
186
+ return this._className;
187
+ }
188
+ get getter() {
189
+ return this._getter;
190
+ }
191
+ get setter() {
192
+ return this._setter;
193
+ }
194
+ get validators() {
195
+ return this._validators;
196
+ }
197
+ withLabel(label) {
198
+ this._label = label;
199
+ return this;
200
+ }
201
+ withPlaceholder(placeholder) {
202
+ this._placeholder = placeholder;
203
+ return this;
204
+ }
205
+ withRequired(required = true) {
206
+ this._required = required;
207
+ return this;
208
+ }
209
+ withDisabled(disabled = true) {
210
+ this._disabled = disabled;
211
+ return this;
212
+ }
213
+ withClassName(className) {
214
+ this._className = className;
215
+ return this;
216
+ }
217
+ withGetter(getter) {
218
+ this._getter = getter;
219
+ return this;
220
+ }
221
+ withSetter(setter) {
222
+ this._setter = setter;
223
+ return this;
224
+ }
225
+ withValidator(name, expression, message) {
226
+ this._validators.push(new FieldValidator(name, expression, message));
227
+ return this;
228
+ }
229
+ copyFieldsTo(obj) {
230
+ obj._label = this._label;
231
+ obj._placeholder = this._placeholder;
232
+ obj._required = this._required;
233
+ obj._disabled = this._disabled;
234
+ obj._className = this._className;
235
+ obj._getter = this._getter;
236
+ obj._setter = this._setter;
237
+ obj._validators = this._validators;
238
+ }
239
+ }
240
+ export class FieldInputDescriptor extends AFieldDescriptor {
241
+ constructor(editor, property) {
242
+ super(editor, property);
243
+ this._fieldType = FieldInputDescriptor.TypeEnum.Text;
244
+ // radio specific properties
245
+ this._radioOptions = [];
246
+ this._datePickerShowTime = false;
247
+ }
248
+ get fieldType() {
249
+ return this._fieldType;
250
+ }
251
+ get numberStep() {
252
+ return this._numberStep;
253
+ }
254
+ get numberMin() {
255
+ return this._numberMin;
256
+ }
257
+ get numberMax() {
258
+ return this._numberMax;
259
+ }
260
+ get rows() {
261
+ return this._rows;
262
+ }
263
+ get numberMinFractionDigits() {
264
+ return this._numberMinFractionDigits;
265
+ }
266
+ get numberMaxFractionDigits() {
267
+ return this._numberMaxFractionDigits;
268
+ }
269
+ get radioOptions() {
270
+ return this._radioOptions;
271
+ }
272
+ get datePickerFormat() {
273
+ return this._datePickerFormat;
274
+ }
275
+ get datePickerMin() {
276
+ return this._datePickerMin;
277
+ }
278
+ get datePickerMax() {
279
+ return this._datePickerMax;
280
+ }
281
+ get datePickerShowTime() {
282
+ return this._datePickerShowTime;
283
+ }
284
+ get maxLength() {
285
+ return this._maxLength;
286
+ }
287
+ get minLength() {
288
+ return this._minLength;
289
+ }
290
+ get pattern() {
291
+ return this._pattern;
292
+ }
293
+ asText(minLength, maxLength, pattern) {
294
+ this._fieldType = FieldInputDescriptor.TypeEnum.Text;
295
+ this._minLength = minLength;
296
+ this._maxLength = maxLength;
297
+ this._pattern = pattern;
298
+ return this;
299
+ }
300
+ asTextarea(rows = 3) {
301
+ this._fieldType = FieldInputDescriptor.TypeEnum.Textarea;
302
+ this._rows = rows;
303
+ return this;
304
+ }
305
+ asNumber(step, min, max, minFractionDigits, maxFractionDigits) {
306
+ this._fieldType = FieldInputDescriptor.TypeEnum.Number;
307
+ this._numberStep = step;
308
+ this._numberMinFractionDigits = minFractionDigits;
309
+ this._numberMaxFractionDigits = maxFractionDigits;
310
+ this._numberMin = min ?? Number.MIN_SAFE_INTEGER;
311
+ this._numberMax = max ?? Number.MAX_SAFE_INTEGER;
312
+ return this;
313
+ }
314
+ asSwitch() {
315
+ this._fieldType = FieldInputDescriptor.TypeEnum.Switch;
316
+ return this;
317
+ }
318
+ asRadio(options) {
319
+ this._fieldType = FieldInputDescriptor.TypeEnum.Radio;
320
+ this._radioOptions = options;
321
+ return this;
322
+ }
323
+ asDatePicker(format, min, max, showTime) {
324
+ this._fieldType = FieldInputDescriptor.TypeEnum.Datepicker;
325
+ this._datePickerFormat = format ? format : 'dd.mm.yy';
326
+ this._datePickerMin = min;
327
+ this._datePickerMax = max;
328
+ this._datePickerShowTime = showTime ?? false;
329
+ return this;
330
+ }
331
+ copy() {
332
+ const field = new FieldInputDescriptor(this._editor, this._property);
333
+ this.copyFieldsTo(field);
334
+ field._fieldType = this._fieldType;
335
+ field._rows = this._rows;
336
+ field._numberMin = this._numberMin;
337
+ field._numberMax = this._numberMax;
338
+ field._numberStep = this._numberStep;
339
+ field._numberMinFractionDigits = this._numberMinFractionDigits;
340
+ field._numberMaxFractionDigits = this._numberMaxFractionDigits;
341
+ field._radioOptions = this._radioOptions;
342
+ field._datePickerFormat = this._datePickerFormat;
343
+ field._datePickerMin = this._datePickerMin;
344
+ field._datePickerMax = this._datePickerMax;
345
+ field._datePickerShowTime = this._datePickerShowTime;
346
+ field._maxLength = this._maxLength;
347
+ field._minLength = this._minLength;
348
+ field._pattern = this._pattern;
349
+ return field;
350
+ }
351
+ }
352
+ (function (FieldInputDescriptor) {
353
+ let TypeEnum;
354
+ (function (TypeEnum) {
355
+ TypeEnum[TypeEnum["Text"] = 0] = "Text";
356
+ TypeEnum[TypeEnum["Textarea"] = 1] = "Textarea";
357
+ TypeEnum[TypeEnum["Number"] = 2] = "Number";
358
+ TypeEnum[TypeEnum["Switch"] = 3] = "Switch";
359
+ TypeEnum[TypeEnum["Radio"] = 4] = "Radio";
360
+ TypeEnum[TypeEnum["Datepicker"] = 5] = "Datepicker";
361
+ })(TypeEnum = FieldInputDescriptor.TypeEnum || (FieldInputDescriptor.TypeEnum = {}));
362
+ })(FieldInputDescriptor || (FieldInputDescriptor = {}));
363
+ export class FieldLookupDescriptor extends AFieldDescriptor {
364
+ constructor(editor, property, modelType) {
365
+ super(editor, property);
366
+ this._lookupType = FieldLookupDescriptor.LookupTypeEnum.Dropdown;
367
+ this._modelType = modelType;
368
+ ModelUtil.trySetLookupItemsProperties(this);
369
+ }
370
+ get modelType() {
371
+ return this._modelType;
372
+ }
373
+ get lookupType() {
374
+ return this._lookupType;
375
+ }
376
+ get itemsLabelProperty() {
377
+ return this._itemsLabelProperty;
378
+ }
379
+ get itemsValueProperty() {
380
+ return this._itemsValueProperty;
381
+ }
382
+ get dataKeyProperty() {
383
+ return this._dataKeyProperty;
384
+ }
385
+ get dataProvider() {
386
+ return this._dataProvider;
387
+ }
388
+ withItemsLabelProperty(itemsLabelProperty) {
389
+ this._itemsLabelProperty = itemsLabelProperty;
390
+ return this;
391
+ }
392
+ withItemsValueProperty(itemsValueProperty) {
393
+ this._itemsValueProperty = itemsValueProperty;
394
+ return this;
395
+ }
396
+ withDataKeyProperty(property) {
397
+ this._dataKeyProperty = property;
398
+ return this;
399
+ }
400
+ withLookup(lookup, serviceType) {
401
+ const dataProvider = new LookupDataProvider(this._modelType);
402
+ if (serviceType) {
403
+ dataProvider.withServiceType(serviceType);
404
+ }
405
+ dataProvider.withLookup(lookup);
406
+ this._dataProvider = dataProvider;
407
+ return this;
408
+ }
409
+ withLookupDataProvider(dataProvider) {
410
+ this._dataProvider = dataProvider;
411
+ return this;
412
+ }
413
+ asAutocomplete() {
414
+ this._lookupType = FieldLookupDescriptor.LookupTypeEnum.Autocomplete;
415
+ return this;
416
+ }
417
+ copy() {
418
+ const field = new FieldLookupDescriptor(this._editor, this._property, this._modelType);
419
+ this.copyFieldsTo(field);
420
+ field._lookupType = this._lookupType;
421
+ field._itemsLabelProperty = this._itemsLabelProperty;
422
+ field._itemsValueProperty = this._itemsValueProperty;
423
+ field._dataKeyProperty = this._dataKeyProperty;
424
+ field._dataProvider = this._dataProvider;
425
+ return field;
426
+ }
427
+ }
428
+ (function (FieldLookupDescriptor) {
429
+ let LookupTypeEnum;
430
+ (function (LookupTypeEnum) {
431
+ LookupTypeEnum[LookupTypeEnum["Dropdown"] = 0] = "Dropdown";
432
+ LookupTypeEnum[LookupTypeEnum["Autocomplete"] = 1] = "Autocomplete";
433
+ })(LookupTypeEnum = FieldLookupDescriptor.LookupTypeEnum || (FieldLookupDescriptor.LookupTypeEnum = {}));
434
+ })(FieldLookupDescriptor || (FieldLookupDescriptor = {}));
435
+ export class FieldLookupEnumDescriptor extends FieldLookupDescriptor {
436
+ constructor(editor, property, enumName, options) {
437
+ super(editor, property, null);
438
+ this._enumName = enumName;
439
+ const dataProvider = new LookupDataProvider(null)
440
+ .withEnumName(enumName)
441
+ .withLookup(() => of(options));
442
+ this.withLookupDataProvider(dataProvider);
443
+ }
444
+ get enumName() {
445
+ return this._enumName;
446
+ }
447
+ copy() {
448
+ const field = new FieldLookupEnumDescriptor(this._editor, this._property, this._enumName, []);
449
+ this.copyFieldsTo(field);
450
+ field._lookupType = this._lookupType;
451
+ field._itemsLabelProperty = this._itemsLabelProperty;
452
+ field._itemsValueProperty = this._itemsValueProperty;
453
+ field._dataKeyProperty = this._dataKeyProperty;
454
+ field._dataProvider = this._dataProvider;
455
+ return field;
456
+ }
457
+ }
458
+ export class FieldManyToManyEditorDescriptor extends AFieldDescriptor {
459
+ constructor(editor, property, modelType, mainTableDescriptor, lookupTableDescriptor) {
460
+ super(editor, property);
461
+ this._fieldType = FieldManyToManyEditorDescriptor.TypeEnum.DialogTableMultiselect;
462
+ this._lookupTableDataProvider = null;
463
+ this._actions = [];
464
+ this._hasLookupExcludeValues = false;
465
+ this._excludeFilterProperty = '';
466
+ this._excludeValueProperty = '';
467
+ this._model = new ModelDescriptor(modelType);
468
+ this._mainTableDescriptor = mainTableDescriptor;
469
+ this._lookupTableDescriptor = lookupTableDescriptor;
470
+ this._actions.push(FieldManyToManyEditorDescriptor.ActionEnum.Add, FieldManyToManyEditorDescriptor.ActionEnum.Delete);
471
+ }
472
+ get mainTableDescriptor() {
473
+ return this._mainTableDescriptor;
474
+ }
475
+ get lookupTableDescriptor() {
476
+ return this._lookupTableDescriptor;
477
+ }
478
+ get lookupTableDataProvider() {
479
+ return this._lookupTableDataProvider;
480
+ }
481
+ get actions() {
482
+ return this._actions;
483
+ }
484
+ get fieldType() {
485
+ return this._fieldType;
486
+ }
487
+ get hasLookupExcludeValues() {
488
+ return this._hasLookupExcludeValues;
489
+ }
490
+ get excludeFilterProperty() {
491
+ return this._excludeFilterProperty;
492
+ }
493
+ get excludeValueProperty() {
494
+ return this._excludeValueProperty;
495
+ }
496
+ withLookup(getAll, serviceType) {
497
+ const dataProvider = new TableviewDataProvider(this._model.type);
498
+ if (serviceType) {
499
+ dataProvider.withServiceType(serviceType);
500
+ }
501
+ dataProvider.withGetAll(getAll);
502
+ this._lookupTableDataProvider = dataProvider;
503
+ return this;
504
+ }
505
+ withLookupDataProvider(dataProvider) {
506
+ this._lookupTableDataProvider = dataProvider;
507
+ return this;
508
+ }
509
+ withActions(actions = []) {
510
+ this.actions.push(...actions);
511
+ return this;
512
+ }
513
+ withLookupExclude(filterProperty, valueProperty, hasLookupExclude = true) {
514
+ this._hasLookupExcludeValues = hasLookupExclude;
515
+ this._excludeFilterProperty = filterProperty;
516
+ this._excludeValueProperty = valueProperty;
517
+ return this;
518
+ }
519
+ copy() {
520
+ const field = new FieldManyToManyEditorDescriptor(this._editor, this._property, this._model.type, this._mainTableDescriptor.copy(), this._lookupTableDescriptor.copy());
521
+ this.copyFieldsTo(field);
522
+ field._fieldType = this._fieldType;
523
+ field._actions = this._actions.map(a => a);
524
+ field._lookupTableDataProvider = this._lookupTableDataProvider;
525
+ field._hasLookupExcludeValues = this._hasLookupExcludeValues;
526
+ field._excludeFilterProperty = this._excludeFilterProperty;
527
+ field._excludeValueProperty = this._excludeValueProperty;
528
+ return field;
529
+ }
530
+ }
531
+ (function (FieldManyToManyEditorDescriptor) {
532
+ let TypeEnum;
533
+ (function (TypeEnum) {
534
+ TypeEnum[TypeEnum["DialogTableMultiselect"] = 0] = "DialogTableMultiselect";
535
+ })(TypeEnum = FieldManyToManyEditorDescriptor.TypeEnum || (FieldManyToManyEditorDescriptor.TypeEnum = {}));
536
+ let ActionEnum;
537
+ (function (ActionEnum) {
538
+ ActionEnum[ActionEnum["Add"] = 0] = "Add";
539
+ ActionEnum[ActionEnum["Delete"] = 1] = "Delete";
540
+ })(ActionEnum = FieldManyToManyEditorDescriptor.ActionEnum || (FieldManyToManyEditorDescriptor.ActionEnum = {}));
541
+ })(FieldManyToManyEditorDescriptor || (FieldManyToManyEditorDescriptor = {}));
542
+ export class FieldManyEditorDescriptor extends AFieldDescriptor {
543
+ constructor(editor, property, modelType, tableviewDescriptor) {
544
+ super(editor, property);
545
+ this._fieldType = FieldManyEditorDescriptor.TypeEnum.DialogEditor;
546
+ this._actions = [];
547
+ this._modelType = modelType;
548
+ this._tableviewDescriptor = tableviewDescriptor;
549
+ this._actions.push(FieldManyEditorDescriptor.ActionEnum.Add, FieldManyEditorDescriptor.ActionEnum.Edit, FieldManyEditorDescriptor.ActionEnum.Delete);
550
+ }
551
+ get tableviewDescriptor() {
552
+ return this._tableviewDescriptor;
553
+ }
554
+ get tableDescriptor() {
555
+ return this._tableviewDescriptor.table;
556
+ }
557
+ get editorForCreate() {
558
+ return this._tableviewDescriptor.addEditor;
559
+ }
560
+ get editorForRead() {
561
+ return this._tableviewDescriptor.viewEditor;
562
+ }
563
+ get editorForUpdate() {
564
+ return this._tableviewDescriptor.editEditor;
565
+ }
566
+ get fieldType() {
567
+ return this._fieldType;
568
+ }
569
+ get actions() {
570
+ return this._actions;
571
+ }
572
+ withActions(actions = []) {
573
+ this.actions.push(...actions);
574
+ return this;
575
+ }
576
+ copy() {
577
+ const field = new FieldManyEditorDescriptor(this._editor, this._property, this._modelType, this._tableviewDescriptor.copy());
578
+ this.copyFieldsTo(field);
579
+ field._fieldType = this._fieldType;
580
+ field._actions = this._actions.map(a => a);
581
+ return field;
582
+ }
583
+ }
584
+ (function (FieldManyEditorDescriptor) {
585
+ let TypeEnum;
586
+ (function (TypeEnum) {
587
+ TypeEnum[TypeEnum["DialogEditor"] = 0] = "DialogEditor";
588
+ })(TypeEnum = FieldManyEditorDescriptor.TypeEnum || (FieldManyEditorDescriptor.TypeEnum = {}));
589
+ let ActionEnum;
590
+ (function (ActionEnum) {
591
+ ActionEnum[ActionEnum["Add"] = 0] = "Add";
592
+ ActionEnum[ActionEnum["Edit"] = 1] = "Edit";
593
+ ActionEnum[ActionEnum["Delete"] = 2] = "Delete";
594
+ })(ActionEnum = FieldManyEditorDescriptor.ActionEnum || (FieldManyEditorDescriptor.ActionEnum = {}));
595
+ })(FieldManyEditorDescriptor || (FieldManyEditorDescriptor = {}));
596
+ export class AFieldGroupDescriptor extends AGenericFieldDescriptor {
597
+ constructor(editor, name) {
598
+ super(editor);
599
+ this._fields = [];
600
+ this._validators = [];
601
+ this._name = `${this.baseName}${name}`;
602
+ this._default = name === EditorDescriptor.defaultGroupName;
603
+ }
604
+ get baseName() {
605
+ return `${this.groupName()}_`;
606
+ }
607
+ get name() {
608
+ return this._name;
609
+ }
610
+ get default() {
611
+ return this._default;
612
+ }
613
+ get title() {
614
+ return this._title;
615
+ }
616
+ get validators() {
617
+ return this._validators;
618
+ }
619
+ withTitle(title) {
620
+ this._title = title;
621
+ return this;
622
+ }
623
+ withValidator(name, expression) {
624
+ this._validators.push(new FieldValidator(name, expression, undefined));
625
+ return this;
626
+ }
627
+ }
628
+ export class FieldTabGroupDescriptor extends AFieldGroupDescriptor {
629
+ constructor(editor, name) {
630
+ super(editor, name);
631
+ }
632
+ get fields() {
633
+ return this._fields;
634
+ }
635
+ groupName() {
636
+ return 'tab';
637
+ }
638
+ addField(field) {
639
+ this._fields.push(field);
640
+ return this;
641
+ }
642
+ copy() {
643
+ const tab = new FieldTabGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
644
+ tab._title = this._title;
645
+ tab._fields = this.fields.map(f => f.copy());
646
+ return tab;
647
+ }
648
+ }
649
+ export class FieldGroupDescriptor extends AFieldGroupDescriptor {
650
+ constructor(editor, name) {
651
+ super(editor, name);
652
+ }
653
+ get fields() {
654
+ return this._fields;
655
+ }
656
+ groupName() {
657
+ return 'group';
658
+ }
659
+ addField(field) {
660
+ this._fields.push(field);
661
+ return this;
662
+ }
663
+ copy() {
664
+ const group = new FieldGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
665
+ group._title = this._title;
666
+ group._fields = this.fields.map(f => f.copy());
667
+ return group;
668
+ }
669
+ }
670
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Rlc2NyaXB0b3JzL2VkaXRvci5kZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBYSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHcEMsT0FBTyxFQUEwQyxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3JILE9BQU8sRUFBQyxlQUFlLEVBQXdDLGNBQWMsRUFBb0IsTUFBTSxJQUFJLENBQUM7QUFHNUcsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFbkMsTUFBTSxPQUFPLGdCQUFnQjtJQWF6QixZQUFZLFNBQXVCLEVBQUUsVUFBbUIsRUFBRSxhQUFzQjtRQVIvRCxVQUFLLEdBQXNDLEVBQUUsQ0FBQztRQUM5QyxZQUFPLEdBQW1DLEVBQUUsQ0FBQztRQUM3QyxZQUFPLEdBQW9DLEVBQUUsQ0FBQztRQUl2RCxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUksU0FBUyxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFTSxjQUFjLENBQUMsSUFBWSxFQUFFLEtBQWM7UUFDOUMs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TyxHQUFHLENBQUM7SUFDZixDQUFDO0NBQ0o7QUFFRCxNQUFNLE9BQU8sb0JBQXlCLFNBQVEscUJBQXlCO0lBRW5FLFlBQVksTUFBNEIsRUFBRSxJQUFZO1FBQ2xELEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQTJDLENBQUM7SUFDNUQsQ0FBQztJQUVNLFNBQVM7UUFDWixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQWdDO1FBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxJQUFJO1FBQ1AsTUFBTSxLQUFLLEdBQUcsSUFBSSxvQkFBb0IsQ0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNwRyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VHlwZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtGb3JtbHlGaWVsZENvbmZpZ30gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5cbmltcG9ydCB7T2JzZXJ2YWJsZSwgb2Z9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0NsYXNzVHlwZSwgRW51bU1lbWJlclR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7SUxvb2t1cERhdGFQcm92aWRlciwgSVRhYmxlRGF0YVByb3ZpZGVyLCBMb29rdXBEYXRhUHJvdmlkZXIsIFRhYmxldmlld0RhdGFQcm92aWRlcn0gZnJvbSAnLi4vZGF0YS1wcm92aWRlcnMnO1xuaW1wb3J0IHtNb2RlbERlc2NyaXB0b3IsIFRhYmxlRGVzY3JpcHRvciwgVGFibGV2aWV3RGVzY3JpcHRvciwgRmllbGRWYWxpZGF0b3IsIElMb29rdXBEZXNjcmlwdG9yfSBmcm9tICcuLyc7XG5cbmltcG9ydCB7TWVkaXVzUXVlcnlQYXJhbSwgTWVkaXVzUXVlcnlSZXN1bHR9IGZyb20gJy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtPYmplY3RTZXJpYWxpemVyfSBmcm9tICcuLi9hcGkvdXRpbHMnO1xuaW1wb3J0IHtNb2RlbFV0aWx9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIEVkaXRvckRlc2NyaXB0b3I8VD4ge1xuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBkZWZhdWx0R3JvdXBOYW1lID0gJ19kZWZhdWx0JztcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21vZGVsOiBNb2RlbERlc2NyaXB0b3I8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiczogQXJyYXk8RmllbGRUYWJHcm91cERlc2NyaXB0b3I8VD4+ID0gW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZ3JvdXBzOiBBcnJheTxGaWVsZEdyb3VwRGVzY3JpcHRvcjxUPj4gPSBbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9maWVsZHM6IEFycmF5PEFGaWVsZERlc2NyaXB0b3I8YW55LCBUPj4gPSBbXTtcbiAgICBwcml2YXRlIF9jdXJyZW50VGFiR3JvdXA/OiBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxUPjtcbiAgICBwcml2YXRlIF9jdXJyZW50R3JvdXA/OiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxUPjtcblxuICAgIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbFR5cGU6IENsYXNzVHlwZTxUPiwgaWRQcm9wZXJ0eT86IHN0cmluZywgdGl0bGVQcm9wZXJ0eT86IHN0cmluZykge1xuICAgICAgICB0aGlzLl9tb2RlbCA9IG5ldyBNb2RlbERlc2NyaXB0b3I8VD4obW9kZWxUeXBlLCBpZFByb3BlcnR5LCB0aXRsZVByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YWJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFicztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZVRhYkdyb3VwKG5hbWU6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcpOiBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIGNvbnN0IHRhYkdyb3VwID0gbmV3IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPFQ+KHRoaXMsIG5hbWUpO1xuICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgIHRhYkdyb3VwLndpdGhUaXRsZSh0aXRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVUYWJHcm91cERlc2NyaXB0b3IodGFiR3JvdXApO1xuICAgICAgICByZXR1cm4gdGFiR3JvdXA7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUZpZWxkR3JvdXAobmFtZTogc3RyaW5nLCB0aXRsZT86IHN0cmluZyk6IEZpZWxkR3JvdXBEZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgY29uc3QgZmllbGRHcm91cCA9IG5ldyBGaWVsZEdyb3VwRGVzY3JpcHRvcjxUPih0aGlzLCBuYW1lKTtcbiAgICAgICAgaWYgKHRpdGxlKSB7XG4gICAgICAgICAgICBmaWVsZEdyb3VwLndpdGhUaXRsZSh0aXRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVGaWVsZEdyb3VwRGVzY3JpcHRvcihmaWVsZEdyb3VwKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkR3JvdXA7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkRGVzY3JpcHRvcjxGVD4oZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8RlQsIFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdEdyb3VwKCk7XG4gICAgICAgIHRoaXMuX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgdGhpcy5fY3VycmVudEdyb3VwPy5hZGRGaWVsZChmaWVsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZChwcm9wZXJ0eTogc3RyaW5nKTogRmllbGRJbnB1dERlc2NyaXB0b3I8VD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZElucHV0RGVzY3JpcHRvcjxUPih0aGlzLCBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVGaWVsZChwcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGZpZWxkSWR4ID0gdGhpcy5fZmllbGRzLmZpbmRJbmRleChmID0+IGYucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGZpZWxkSWR4IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWVsZCAke3Byb3BlcnR5fSBkb2VzIG5vdCBleGlzdC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2ZpZWxkc1tmaWVsZElkeF07XG4gICAgICAgIGlmIChmaWVsZC5ncm91cCkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBGaWVsZElkeCA9IGZpZWxkLmdyb3VwLmZpZWxkcy5maW5kSW5kZXgoZiA9PiBmIGluc3RhbmNlb2YgQUZpZWxkRGVzY3JpcHRvciAmJiBmLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoZ3JvdXBGaWVsZElkeCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuZ3JvdXAuZmllbGRzLnNwbGljZShncm91cEZpZWxkSWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9maWVsZHMuc3BsaWNlKGZpZWxkSWR4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpZWxkKHByb3BlcnR5OiBzdHJpbmcpOiBBRmllbGREZXNjcmlwdG9yPGFueSwgVD58bnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMuZmluZChmID0+IGYucHJvcGVydHkgPT09IHByb3BlcnR5KSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cDxGVD4ocHJvcGVydHk6IHN0cmluZywgbW9kZWxUeXBlOiBDbGFzc1R5cGU8RlQ+KTogRmllbGRMb29rdXBEZXNjcmlwdG9yPEZULCBUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRGVzY3JpcHRvcjxGVCwgVD4odGhpcywgcHJvcGVydHksIG1vZGVsVHlwZSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cEVudW0ocHJvcGVydHk6IHN0cmluZywgb3B0aW9uczogQXJyYXk8RW51bU1lbWJlclR5cGU+KTogRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIGNvbnN0IHByb3BEZWYgPSBPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRBdHRyaWJ1dGVEZWZpbml0aW9uQnlDbGFzc1R5cGUodGhpcy5tb2RlbC50eXBlLCBwcm9wZXJ0eSk7XG4gICAgICAgIGlmICghcHJvcERlZikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSAoYXR0cmlidXRlKSBkZWZpbml0aW9uIG5vdCBmb3VuZCBmb3IgcHJvcGVydHkgJHtwcm9wZXJ0eX0gb24gY2xhc3MgdHlwZSAke3RoaXMuX21vZGVsLnR5cGVOYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudW1EZWYgPSBPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRFbnVtKHByb3BEZWYudHlwZSk7XG4gICAgICAgIGlmICghZW51bURlZikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnVtIGRlZmluaXRpb24gJHtwcm9wRGVmLnR5cGV9IG5vdCBmb3VuZCBmb3IgcHJvcGVydHkgJHtwcm9wZXJ0eX0gb24gY2xhc3MgdHlwZSAke3RoaXMuX21vZGVsLnR5cGVOYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3IodGhpcywgcHJvcGVydHksIHByb3BEZWYudHlwZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZE1hbnlFZGl0b3I8RlQ+KHByb3BlcnR5OiBzdHJpbmcsIHR5cGU6IENsYXNzVHlwZTxGVD4sIHRhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3I8RlQ+KTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxGVCwgVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMsIHByb3BlcnR5LCB0eXBlLCB0YWJsZXZpZXdEZXNjcmlwdG9yKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTWFueVRvTWFueUVkaXRvcjxGVD4ocHJvcGVydHk6IHN0cmluZywgdHlwZTogQ2xhc3NUeXBlPEZUPiwgbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPEZUPiwgbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8RlQ+KTogRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxGVCwgVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMsIHByb3BlcnR5LCB0eXBlLCBtYWluVGFibGVEZXNjcmlwdG9yLCBsb29rdXBUYWJsZURlc2NyaXB0b3IpO1xuICAgICAgICB0aGlzLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERpc2FibGVkKGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkVmFsaWRhdG9yKG5hbWU6IHN0cmluZywgZXhwcmVzc2lvbjogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudEdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50R3JvdXAud2l0aFZhbGlkYXRvcihuYW1lLCBleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEVkaXRvckRlc2NyaXB0b3I8VD4ge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSBuZXcgRWRpdG9yRGVzY3JpcHRvcjxUPih0aGlzLm1vZGVsLnR5cGUsIHRoaXMubW9kZWwuaWRQcm9wZXJ0eU5hbWUsIHRoaXMubW9kZWwudGl0bGVQcm9wZXJ0eU5hbWUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYkdyb3VwIG9mIHRoaXMuX3RhYnMpIHtcbiAgICAgICAgICAgIGVkaXRvci5jcmVhdGVUYWJHcm91cERlc2NyaXB0b3IodGFiR3JvdXAuY29weSgpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHRhYkdyb3VwIG9mIGVkaXRvci5fdGFicykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZEdyb3VwIG9mIHRhYkdyb3VwLmZpZWxkcykge1xuICAgICAgICAgICAgICAgIGVkaXRvci5fZmllbGRzLnB1c2goLi4uZmllbGRHcm91cC5maWVsZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWRpdG9yLl9ncm91cHMucHVzaCguLi50YWJHcm91cC5maWVsZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRvci5fY3VycmVudFRhYkdyb3VwID0gZWRpdG9yLl90YWJzW2VkaXRvci5fdGFicy5sZW5ndGggLSAxXTtcbiAgICAgICAgZWRpdG9yLl9jdXJyZW50R3JvdXAgPSBlZGl0b3IuX2N1cnJlbnRUYWJHcm91cC5maWVsZHNbZWRpdG9yLl9jdXJyZW50VGFiR3JvdXAuZmllbGRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBlZGl0b3IuX2Rpc2FibGVkID0gdGhpcy5fZGlzYWJsZWQ7XG4gICAgICAgIHJldHVybiBlZGl0b3I7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUYWJHcm91cERlc2NyaXB0b3IodGFiR3JvdXA6IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYWJHcm91cCA9IHRhYkdyb3VwO1xuICAgICAgICB0aGlzLl90YWJzLnB1c2godGFiR3JvdXApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlRmllbGRHcm91cERlc2NyaXB0b3IoZmllbGRHcm91cDogRmllbGRHcm91cERlc2NyaXB0b3I8VD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0VGFiR3JvdXAoKTtcbiAgICAgICAgdGhpcy5fY3VycmVudEdyb3VwID0gZmllbGRHcm91cDtcbiAgICAgICAgdGhpcy5fZ3JvdXBzLnB1c2goZmllbGRHcm91cCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYWJHcm91cD8uYWRkRmllbGQoZmllbGRHcm91cCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGVmYXVsdEdyb3VwKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZURlZmF1bHRUYWJHcm91cCgpO1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRhYkdyb3VwPy5maWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZpZWxkR3JvdXAoRWRpdG9yRGVzY3JpcHRvci5kZWZhdWx0R3JvdXBOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGVmYXVsdFRhYkdyb3VwKCkge1xuICAgICAgICBpZiAodGhpcy5fdGFicy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFiR3JvdXAoRWRpdG9yRGVzY3JpcHRvci5kZWZhdWx0R3JvdXBOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9lZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+O1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4pIHtcbiAgICAgICAgdGhpcy5fZWRpdG9yID0gZWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+IGV4dGVuZHMgQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+IHtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfcHJvcGVydHk6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2dyb3VwPzogQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPjtcbiAgICBwcm90ZWN0ZWQgX2xhYmVsPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9yZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2NsYXNzTmFtZTogc3RyaW5nID0gJyc7XG4gICAgcHJvdGVjdGVkIF9nZXR0ZXI/OiAoaXRlbTogRVQpID0+IFQ7XG4gICAgcHJvdGVjdGVkIF9zZXR0ZXI/OiAoaXRlbTogRVQsIHZhbHVlOiBUKSA9PiB2b2lkO1xuICAgIHByb3RlY3RlZCBfdmFsaWRhdG9yczogQXJyYXk8RmllbGRWYWxpZGF0b3I+ID0gW107XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgcHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICBzdXBlcihlZGl0b3IpO1xuICAgICAgICB0aGlzLl9wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICB0aGlzLl9sYWJlbCA9IHRoaXMuX2VkaXRvci5tb2RlbC50eXBlTmFtZSArICcucHJvcGVydGllcy4nICsgcHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGFic3RyYWN0IGNvcHkoKTogQUZpZWxkRGVzY3JpcHRvcjxULCBFVD47XG5cbiAgICBwdWJsaWMgZ2V0IHByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBncm91cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXF1aXJlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGdldHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNldHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbGlkYXRvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3JzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTGFiZWwobGFiZWw6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sYWJlbCA9IGxhYmVsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBsYWNlaG9sZGVyKHBsYWNlaG9sZGVyOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSZXF1aXJlZChyZXF1aXJlZDogYm9vbGVhbiA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSByZXF1aXJlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbiA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEdldHRlcihnZXR0ZXI6IChpdGVtOiBFVCkgPT4gVCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9nZXR0ZXIgPSBnZXR0ZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU2V0dGVyKHNldHRlcjogKGl0ZW06IEVULCB2YWx1ZTogVCkgPT4gdm9pZCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zZXR0ZXIgPSBzZXR0ZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVmFsaWRhdG9yKG5hbWU6IHN0cmluZywgZXhwcmVzc2lvbjogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAoZXJyOiBhbnksIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4gc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMucHVzaChuZXcgRmllbGRWYWxpZGF0b3IobmFtZSwgZXhwcmVzc2lvbiwgbWVzc2FnZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29weUZpZWxkc1RvKG9iajogQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4pIHtcbiAgICAgICAgb2JqLl9sYWJlbCA9IHRoaXMuX2xhYmVsO1xuICAgICAgICBvYmouX3BsYWNlaG9sZGVyID0gdGhpcy5fcGxhY2Vob2xkZXI7XG4gICAgICAgIG9iai5fcmVxdWlyZWQgPSB0aGlzLl9yZXF1aXJlZDtcbiAgICAgICAgb2JqLl9kaXNhYmxlZCA9IHRoaXMuX2Rpc2FibGVkO1xuICAgICAgICBvYmouX2NsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcbiAgICAgICAgb2JqLl9nZXR0ZXIgPSB0aGlzLl9nZXR0ZXI7XG4gICAgICAgIG9iai5fc2V0dGVyID0gdGhpcy5fc2V0dGVyO1xuICAgICAgICBvYmouX3ZhbGlkYXRvcnMgPSB0aGlzLl92YWxpZGF0b3JzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkSW5wdXREZXNjcmlwdG9yPEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8c3RyaW5nfG51bWJlcnxib29sZWFufERhdGUsIEVUPiB7XG5cbiAgICBwcml2YXRlIF9maWVsZFR5cGU6IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uVGV4dDtcblxuICAgIC8vIHRleHRhcmVhIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9yb3dzPzogbnVtYmVyO1xuXG4gICAgLy8gbnVtYmVyIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9udW1iZXJNaW4/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWF4PzogbnVtYmVyO1xuICAgIHByaXZhdGUgX251bWJlclN0ZXA/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWluRnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG5cbiAgICAvLyByYWRpbyBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfcmFkaW9PcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICAvLyBkYXRlcGlja2VyIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyRm9ybWF0Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJNaW4/OiBEYXRlO1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJNYXg/OiBEYXRlO1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJTaG93VGltZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gaW5wdXQgc3BlY2lmaWNcbiAgICBwcml2YXRlIF9tYXhMZW5ndGg/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbWluTGVuZ3RoPzogbnVtYmVyO1xuICAgIHByaXZhdGUgX3BhdHRlcm4/OiBzdHJpbmcgfCBSZWdFeHA7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgcHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyU3RlcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlclN0ZXA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJNaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJNaW47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJNYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJNYXg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1pbkZyYWN0aW9uRGlnaXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyTWluRnJhY3Rpb25EaWdpdHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJNYXhGcmFjdGlvbkRpZ2l0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck1heEZyYWN0aW9uRGlnaXRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmFkaW9PcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmFkaW9PcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlckZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVQaWNrZXJGb3JtYXQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRlUGlja2VyTWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlck1pbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGVQaWNrZXJNYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlUGlja2VyTWF4O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlclNob3dUaW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlclNob3dUaW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWF4TGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4TGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWluTGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluTGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdHRlcm47XG4gICAgfVxuXG4gICAgcHVibGljIGFzVGV4dChtaW5MZW5ndGg/OiBudW1iZXIsIG1heExlbmd0aD86IG51bWJlciwgcGF0dGVybj86IHN0cmluZyB8IFJlZ0V4cCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5UZXh0O1xuICAgICAgICB0aGlzLl9taW5MZW5ndGggPSBtaW5MZW5ndGg7XG4gICAgICAgIHRoaXMuX21heExlbmd0aCA9IG1heExlbmd0aDtcbiAgICAgICAgdGhpcy5fcGF0dGVybiA9IHBhdHRlcm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1RleHRhcmVhKHJvd3M6IG51bWJlciA9IDMpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uVGV4dGFyZWE7XG4gICAgICAgIHRoaXMuX3Jvd3MgPSByb3dzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNOdW1iZXIoc3RlcD86IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIsIG1pbkZyYWN0aW9uRGlnaXRzPzogbnVtYmVyLCBtYXhGcmFjdGlvbkRpZ2l0cz86IG51bWJlcik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5OdW1iZXI7XG4gICAgICAgIHRoaXMuX251bWJlclN0ZXAgPSBzdGVwO1xuICAgICAgICB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cyA9IG1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLl9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cyA9IG1heEZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLl9udW1iZXJNaW4gPSBtaW4gPz8gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgIHRoaXMuX251bWJlck1heCA9IG1heCA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzU3dpdGNoKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5Td2l0Y2g7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1JhZGlvKG9wdGlvbnM6IEFycmF5PHN0cmluZz4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uUmFkaW87XG4gICAgICAgIHRoaXMuX3JhZGlvT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0RhdGVQaWNrZXIoZm9ybWF0Pzogc3RyaW5nLCBtaW4/OiBEYXRlLCBtYXg/OiBEYXRlLCBzaG93VGltZT86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uRGF0ZXBpY2tlcjtcbiAgICAgICAgdGhpcy5fZGF0ZVBpY2tlckZvcm1hdCA9IGZvcm1hdCA/IGZvcm1hdCA6ICdkZC5tbS55eSc7XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJNaW4gPSBtaW47XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJNYXggPSBtYXg7XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJTaG93VGltZSA9IHNob3dUaW1lID8/IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2ZpZWxkVHlwZSA9IHRoaXMuX2ZpZWxkVHlwZTtcbiAgICAgICAgZmllbGQuX3Jvd3MgPSB0aGlzLl9yb3dzO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWluID0gdGhpcy5fbnVtYmVyTWluO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWF4ID0gdGhpcy5fbnVtYmVyTWF4O1xuICAgICAgICBmaWVsZC5fbnVtYmVyU3RlcCA9IHRoaXMuX251bWJlclN0ZXA7XG4gICAgICAgIGZpZWxkLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cyA9IHRoaXMuX251bWJlck1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHMgPSB0aGlzLl9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cztcbiAgICAgICAgZmllbGQuX3JhZGlvT3B0aW9ucyA9IHRoaXMuX3JhZGlvT3B0aW9ucztcbiAgICAgICAgZmllbGQuX2RhdGVQaWNrZXJGb3JtYXQgPSB0aGlzLl9kYXRlUGlja2VyRm9ybWF0O1xuICAgICAgICBmaWVsZC5fZGF0ZVBpY2tlck1pbiA9IHRoaXMuX2RhdGVQaWNrZXJNaW47XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyTWF4ID0gdGhpcy5fZGF0ZVBpY2tlck1heDtcbiAgICAgICAgZmllbGQuX2RhdGVQaWNrZXJTaG93VGltZSA9IHRoaXMuX2RhdGVQaWNrZXJTaG93VGltZTtcbiAgICAgICAgZmllbGQuX21heExlbmd0aCA9IHRoaXMuX21heExlbmd0aDtcbiAgICAgICAgZmllbGQuX21pbkxlbmd0aCA9IHRoaXMuX21pbkxlbmd0aDtcbiAgICAgICAgZmllbGQuX3BhdHRlcm4gPSB0aGlzLl9wYXR0ZXJuO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZElucHV0RGVzY3JpcHRvciB7XG4gICAgZXhwb3J0IGVudW0gVHlwZUVudW0ge1xuICAgICAgICBUZXh0LFxuICAgICAgICBUZXh0YXJlYSxcbiAgICAgICAgTnVtYmVyLFxuICAgICAgICBTd2l0Y2gsXG4gICAgICAgIFJhZGlvLFxuICAgICAgICBEYXRlcGlja2VyXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRMb29rdXBEZXNjcmlwdG9yPFQsIEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+IGltcGxlbWVudHMgSUxvb2t1cERlc2NyaXB0b3I8VD4ge1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9tb2RlbFR5cGU6IENsYXNzVHlwZTxUPnxudWxsO1xuICAgIHByb3RlY3RlZCBfbG9va3VwVHlwZTogRmllbGRMb29rdXBEZXNjcmlwdG9yLkxvb2t1cFR5cGVFbnVtID0gRmllbGRMb29rdXBEZXNjcmlwdG9yLkxvb2t1cFR5cGVFbnVtLkRyb3Bkb3duO1xuICAgIHByb3RlY3RlZCBfaXRlbXNMYWJlbFByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfaXRlbXNWYWx1ZVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfZGF0YUtleVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfZGF0YVByb3ZpZGVyPzogSUxvb2t1cERhdGFQcm92aWRlcjxULCBhbnk+O1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgcHJvcGVydHk6IHN0cmluZywgbW9kZWxUeXBlOiBDbGFzc1R5cGU8VD58bnVsbCkge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fbW9kZWxUeXBlID0gbW9kZWxUeXBlO1xuICAgICAgICBNb2RlbFV0aWwudHJ5U2V0TG9va3VwSXRlbXNQcm9wZXJ0aWVzKHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbW9kZWxUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWxUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvb2t1cFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc0xhYmVsUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc0xhYmVsUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc1ZhbHVlUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhS2V5UHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJdGVtc0xhYmVsUHJvcGVydHkoaXRlbXNMYWJlbFByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5ID0gaXRlbXNMYWJlbFByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEl0ZW1zVmFsdWVQcm9wZXJ0eShpdGVtc1ZhbHVlUHJvcGVydHk6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSBpdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGF0YUtleVByb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGF0YUtleVByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwPFM+KGxvb2t1cDogKHF1ZXJ5UGFyYW0/OiBNZWRpdXNRdWVyeVBhcmFtLCBzZXJ2aWNlPzogUywgc2VhcmNoPzogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPEFycmF5PFQ+Piwgc2VydmljZVR5cGU/OiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBMb29rdXBEYXRhUHJvdmlkZXI8VCwgUz4odGhpcy5fbW9kZWxUeXBlKTtcbiAgICAgICAgaWYgKHNlcnZpY2VUeXBlKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aFNlcnZpY2VUeXBlKHNlcnZpY2VUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhUHJvdmlkZXIud2l0aExvb2t1cChsb29rdXApO1xuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSUxvb2t1cERhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzQXV0b2NvbXBsZXRlKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sb29rdXBUeXBlID0gRmllbGRMb29rdXBEZXNjcmlwdG9yLkxvb2t1cFR5cGVFbnVtLkF1dG9jb21wbGV0ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRMb29rdXBEZXNjcmlwdG9yPFQsIEVUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRGVzY3JpcHRvcih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5LCB0aGlzLl9tb2RlbFR5cGUpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9sb29rdXBUeXBlID0gdGhpcy5fbG9va3VwVHlwZTtcbiAgICAgICAgZmllbGQuX2l0ZW1zTGFiZWxQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zTGFiZWxQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2l0ZW1zVmFsdWVQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zVmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFLZXlQcm9wZXJ0eSA9IHRoaXMuX2RhdGFLZXlQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFQcm92aWRlciA9IHRoaXMuX2RhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZExvb2t1cERlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIExvb2t1cFR5cGVFbnVtIHtcbiAgICAgICAgRHJvcGRvd24sXG4gICAgICAgIEF1dG9jb21wbGV0ZVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgRmllbGRMb29rdXBEZXNjcmlwdG9yPEVudW1NZW1iZXJUeXBlLCBFVD4ge1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZW51bU5hbWU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIGVudW1OYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEFycmF5PEVudW1NZW1iZXJUeXBlPikge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5LCBudWxsKTtcblxuICAgICAgICB0aGlzLl9lbnVtTmFtZSA9IGVudW1OYW1lO1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSBuZXcgTG9va3VwRGF0YVByb3ZpZGVyPEVudW1NZW1iZXJUeXBlLCBhbnk+KG51bGwpXG4gICAgICAgICAgICAud2l0aEVudW1OYW1lKGVudW1OYW1lKVxuICAgICAgICAgICAgLndpdGhMb29rdXAoKCkgPT4gb2Yob3B0aW9ucykpO1xuICAgICAgICB0aGlzLndpdGhMb29rdXBEYXRhUHJvdmlkZXIoZGF0YVByb3ZpZGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVudW1OYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW51bU5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGNvcHkoKTogRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVUPih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5LCB0aGlzLl9lbnVtTmFtZSwgW10pO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9sb29rdXBUeXBlID0gdGhpcy5fbG9va3VwVHlwZTtcbiAgICAgICAgZmllbGQuX2l0ZW1zTGFiZWxQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zTGFiZWxQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2l0ZW1zVmFsdWVQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zVmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFLZXlQcm9wZXJ0eSA9IHRoaXMuX2RhdGFLZXlQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFQcm92aWRlciA9IHRoaXMuX2RhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3I8VCwgRVQ+IGV4dGVuZHMgQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4ge1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD47IC8vIHRhYmxlIGRlc2NyaXB0b3IgZm9yIG1haW4gdGFibGUgY29tcG9uZW50XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD47IC8vIHRhYmxlIGRlc2NyaXB0b3IgZm9yIHdoZXJlIHNlbGVjdCB3aWxsIGJlIGFwcGxpZWRcbiAgICBwcml2YXRlIF9maWVsZFR5cGU6IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuVHlwZUVudW0gPSBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLlR5cGVFbnVtLkRpYWxvZ1RhYmxlTXVsdGlzZWxlY3Q7XG4gICAgcHJpdmF0ZSBfbG9va3VwVGFibGVEYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+fG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2FjdGlvbnM6IEFycmF5PEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXTtcbiAgICBwcml2YXRlIF9oYXNMb29rdXBFeGNsdWRlVmFsdWVzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZUZpbHRlclByb3BlcnR5OiBzdHJpbmcgPSAnJztcbiAgICBwcml2YXRlIF9leGNsdWRlVmFsdWVQcm9wZXJ0eTogc3RyaW5nID0gJyc7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nLCBtb2RlbFR5cGU6IENsYXNzVHlwZTxUPiwgbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+LCBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBuZXcgTW9kZWxEZXNjcmlwdG9yPFQ+KG1vZGVsVHlwZSk7XG4gICAgICAgIHRoaXMuX21haW5UYWJsZURlc2NyaXB0b3IgPSBtYWluVGFibGVEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9sb29rdXBUYWJsZURlc2NyaXB0b3IgPSBsb29rdXBUYWJsZURlc2NyaXB0b3I7XG4gICAgICAgIHRoaXMuX2FjdGlvbnMucHVzaChGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0uQWRkLCBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0uRGVsZXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1haW5UYWJsZURlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWluVGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVGFibGVEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9va3VwVGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVGFibGVEYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzTG9va3VwRXhjbHVkZVZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlRmlsdGVyUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGNsdWRlRmlsdGVyUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlVmFsdWVQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwPFM+KGdldEFsbDogKHF1ZXJ5UGFyYW06IE1lZGl1c1F1ZXJ5UGFyYW0sIHNlcnZpY2U/OiBTKSA9PiBPYnNlcnZhYmxlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+Piwgc2VydmljZVR5cGU/OiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBUYWJsZXZpZXdEYXRhUHJvdmlkZXI8VCwgUz4odGhpcy5fbW9kZWwudHlwZSk7XG4gICAgICAgIGlmIChzZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhTZXJ2aWNlVHlwZShzZXJ2aWNlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhHZXRBbGwoZ2V0QWxsKTtcbiAgICAgICAgdGhpcy5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSVRhYmxlRGF0YVByb3ZpZGVyPFQsIGFueT4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQWN0aW9ucyhhY3Rpb25zOiBBcnJheTxGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0+ID0gW10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hY3Rpb25zLnB1c2goLi4uYWN0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwRXhjbHVkZShmaWx0ZXJQcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZVByb3BlcnR5OiBzdHJpbmcsIGhhc0xvb2t1cEV4Y2x1ZGU6IGJvb2xlYW4gPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXMgPSBoYXNMb29rdXBFeGNsdWRlO1xuICAgICAgICB0aGlzLl9leGNsdWRlRmlsdGVyUHJvcGVydHkgPSBmaWx0ZXJQcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5fZXhjbHVkZVZhbHVlUHJvcGVydHkgPSB2YWx1ZVByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yPFQsIEVUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IodGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSwgdGhpcy5fbW9kZWwudHlwZSwgdGhpcy5fbWFpblRhYmxlRGVzY3JpcHRvci5jb3B5KCksIHRoaXMuX2xvb2t1cFRhYmxlRGVzY3JpcHRvci5jb3B5KCkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9maWVsZFR5cGUgPSB0aGlzLl9maWVsZFR5cGU7XG4gICAgICAgIGZpZWxkLl9hY3Rpb25zID0gdGhpcy5fYWN0aW9ucy5tYXAoYSA9PiBhKTtcbiAgICAgICAgZmllbGQuX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyID0gdGhpcy5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXI7XG4gICAgICAgIGZpZWxkLl9oYXNMb29rdXBFeGNsdWRlVmFsdWVzID0gdGhpcy5faGFzTG9va3VwRXhjbHVkZVZhbHVlcztcbiAgICAgICAgZmllbGQuX2V4Y2x1ZGVGaWx0ZXJQcm9wZXJ0eSA9IHRoaXMuX2V4Y2x1ZGVGaWx0ZXJQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5ID0gdGhpcy5fZXhjbHVkZVZhbHVlUHJvcGVydHk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvciB7XG4gICAgZXhwb3J0IGVudW0gVHlwZUVudW0ge1xuICAgICAgICBEaWFsb2dUYWJsZU11bHRpc2VsZWN0XG4gICAgfVxuXG4gICAgZXhwb3J0IGVudW0gQWN0aW9uRW51bSB7XG4gICAgICAgIEFkZCxcbiAgICAgICAgRGVsZXRlXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiB7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tb2RlbFR5cGU6IENsYXNzVHlwZTxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9yPFQ+O1xuICAgIHByaXZhdGUgX2ZpZWxkVHlwZTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5UeXBlRW51bSA9IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuVHlwZUVudW0uRGlhbG9nRWRpdG9yO1xuICAgIHByaXZhdGUgX2FjdGlvbnM6IEFycmF5PEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIG1vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+LCB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9tb2RlbFR5cGUgPSBtb2RlbFR5cGU7XG4gICAgICAgIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IgPSB0YWJsZXZpZXdEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9hY3Rpb25zLnB1c2goRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLkFkZCwgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLkVkaXQsIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bS5EZWxldGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFibGV2aWV3RGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YWJsZURlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yLnRhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yRm9yQ3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci5hZGRFZGl0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JGb3JSZWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci52aWV3RWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yRm9yVXBkYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci5lZGl0RWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhBY3Rpb25zKGFjdGlvbnM6IEFycmF5PEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLmFjdGlvbnMucHVzaCguLi5hY3Rpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX21vZGVsVHlwZSwgdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci5jb3B5KCkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9maWVsZFR5cGUgPSB0aGlzLl9maWVsZFR5cGU7XG4gICAgICAgIGZpZWxkLl9hY3Rpb25zID0gdGhpcy5fYWN0aW9ucy5tYXAoYSA9PiBhKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yIHtcbiAgICBleHBvcnQgZW51bSBUeXBlRW51bSB7XG4gICAgICAgIERpYWxvZ0VkaXRvclxuICAgIH1cblxuICAgIGV4cG9ydCBlbnVtIEFjdGlvbkVudW0ge1xuICAgICAgICBBZGQsXG4gICAgICAgIEVkaXQsXG4gICAgICAgIERlbGV0ZVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4ge1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9uYW1lOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kZWZhdWx0OiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfdGl0bGU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9maWVsZHM6IEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPltdID0gW107XG4gICAgcHJvdGVjdGVkIF92YWxpZGF0b3JzOiBBcnJheTxGaWVsZFZhbGlkYXRvcj4gPSBbXTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yKTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IGAke3RoaXMuYmFzZU5hbWV9JHtuYW1lfWA7XG4gICAgICAgIHRoaXMuX2RlZmF1bHQgPSBuYW1lID09PSBFZGl0b3JEZXNjcmlwdG9yLmRlZmF1bHRHcm91cE5hbWU7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZ2V0IGZpZWxkcygpOiBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD5bXTtcblxuICAgIGFic3RyYWN0IGdyb3VwTmFtZSgpOiBzdHJpbmc7XG5cbiAgICBhYnN0cmFjdCBhZGRGaWVsZChmaWVsZDogQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+KTogdGhpcztcblxuICAgIGFic3RyYWN0IGNvcHkoKTogQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPjtcblxuICAgIHB1YmxpYyBnZXQgYmFzZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmdyb3VwTmFtZSgpfV9gO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2YWxpZGF0b3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGl0bGUgPSB0aXRsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhWYWxpZGF0b3IobmFtZTogc3RyaW5nLCBleHByZXNzaW9uOiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMucHVzaChuZXcgRmllbGRWYWxpZGF0b3IobmFtZSwgZXhwcmVzc2lvbiwgdW5kZWZpbmVkKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVUPiBleHRlbmRzIEFGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4ge1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8RmllbGRHcm91cERlc2NyaXB0b3I8RVQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMgYXMgQXJyYXk8RmllbGRHcm91cERlc2NyaXB0b3I8RVQ+PjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ3JvdXBOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAndGFiJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQoZmllbGQ6IEZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG4gICAgICAgIGNvbnN0IHRhYiA9IG5ldyBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMuYmFzZU5hbWUubGVuZ3RoKSk7XG4gICAgICAgIHRhYi5fdGl0bGUgPSB0aGlzLl90aXRsZTtcbiAgICAgICAgdGFiLl9maWVsZHMgPSB0aGlzLmZpZWxkcy5tYXAoZiA9PiBmLmNvcHkoKSk7XG4gICAgICAgIHJldHVybiB0YWI7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxBRmllbGREZXNjcmlwdG9yPGFueSwgRVQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMgYXMgQXJyYXk8QUZpZWxkRGVzY3JpcHRvcjxhbnksIEVUPj47XG4gICAgfVxuXG4gICAgcHVibGljIGdyb3VwTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2dyb3VwJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQoZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8YW55LCBFVD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBncm91cCA9IG5ldyBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMuYmFzZU5hbWUubGVuZ3RoKSk7XG4gICAgICAgIGdyb3VwLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICBncm91cC5fZmllbGRzID0gdGhpcy5maWVsZHMubWFwKGYgPT4gZi5jb3B5KCkpO1xuICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfVxufVxuIl19