@vgip/meta-ui 1.7.0 → 1.7.3

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 (185) hide show
  1. package/{esm2020 → esm2022}/lib/common/metaAutofocus.directive.mjs +4 -4
  2. package/esm2022/lib/common/metaIcons.pipe.mjs +29 -0
  3. package/esm2022/lib/common/metaModel.pipe.mjs +23 -0
  4. package/esm2022/lib/common/metaNormalizer.mjs +341 -0
  5. package/{esm2020 → esm2022}/lib/common/metaStripHtml.pipe.mjs +4 -4
  6. package/esm2022/lib/common/utils/colorThemes.mjs +77 -0
  7. package/esm2022/lib/common/utils/indexedDbStore/index.mjs +218 -0
  8. package/{esm2020 → esm2022}/lib/common/utils/templateBuilder.mjs +3 -3
  9. package/esm2022/lib/fieldAbstract.mjs +291 -0
  10. package/{esm2020 → esm2022}/lib/fieldBoolean/index.mjs +4 -4
  11. package/{esm2020 → esm2022}/lib/fieldComposite/index.mjs +4 -4
  12. package/esm2022/lib/fieldDatetime/index.mjs +365 -0
  13. package/{esm2020 → esm2022}/lib/fieldHidden/index.mjs +4 -4
  14. package/{esm2020 → esm2022}/lib/fieldInput/index.mjs +5 -5
  15. package/esm2022/lib/fieldList/index.mjs +69 -0
  16. package/{esm2020 → esm2022}/lib/fieldRadio/index.mjs +5 -5
  17. package/esm2022/lib/fieldReference/index.mjs +829 -0
  18. package/esm2022/lib/fieldRichtext/index.mjs +95 -0
  19. package/esm2022/lib/fieldSelect/index.mjs +495 -0
  20. package/{esm2020 → esm2022}/lib/fieldText/index.mjs +5 -5
  21. package/esm2022/lib/fieldUnknown/index.mjs +19 -0
  22. package/esm2022/lib/index.mjs +163 -0
  23. package/esm2022/lib/layout/index.mjs +155 -0
  24. package/{esm2020 → esm2022}/lib/metaField/index.mjs +7 -7
  25. package/esm2022/lib/refDialog/index.mjs +135 -0
  26. package/esm2022/lib/resource/index.mjs +495 -0
  27. package/{esm2020 → esm2022}/lib/resourceCard/index.mjs +4 -4
  28. package/{esm2020 → esm2022}/lib/services/metaContext/index.mjs +4 -4
  29. package/esm2022/lib/services/metaMsg/index.mjs +84 -0
  30. package/esm2022/lib/services/metaReference/index.mjs +89 -0
  31. package/{esm2020 → esm2022}/lib/services/metaResource/index.mjs +7 -7
  32. package/{esm2020 → esm2022}/lib/services/metaResource/metaHttpClient.mjs +5 -5
  33. package/{esm2020 → esm2022}/lib/services/metaTracker/index.mjs +4 -4
  34. package/esm2022/lib/services/resourceDrafts/index.mjs +69 -0
  35. package/{fesm2020/vgip-meta-ui-fieldAbstract-f7d80db6.mjs → fesm2022/vgip-meta-ui-fieldAbstract-9955be39.mjs} +10 -8
  36. package/fesm2022/vgip-meta-ui-fieldAbstract-9955be39.mjs.map +1 -0
  37. package/{fesm2020/vgip-meta-ui-index-301b28cd.mjs → fesm2022/vgip-meta-ui-index-39011b04.mjs} +20 -20
  38. package/{fesm2020/vgip-meta-ui-index-301b28cd.mjs.map → fesm2022/vgip-meta-ui-index-39011b04.mjs.map} +1 -1
  39. package/{fesm2020/vgip-meta-ui-index-4fcefde0.mjs → fesm2022/vgip-meta-ui-index-3bc3d41b.mjs} +88 -56
  40. package/fesm2022/vgip-meta-ui-index-3bc3d41b.mjs.map +1 -0
  41. package/fesm2022/vgip-meta-ui-index-3fda8c0e.mjs +74 -0
  42. package/fesm2022/vgip-meta-ui-index-3fda8c0e.mjs.map +1 -0
  43. package/fesm2022/vgip-meta-ui-index-5871a6f2.mjs +95 -0
  44. package/fesm2022/vgip-meta-ui-index-5871a6f2.mjs.map +1 -0
  45. package/fesm2022/vgip-meta-ui-index-5891b8e7.mjs +24 -0
  46. package/fesm2022/vgip-meta-ui-index-5891b8e7.mjs.map +1 -0
  47. package/{fesm2020/vgip-meta-ui-index-87041aad.mjs → fesm2022/vgip-meta-ui-index-5d13f5e6.mjs} +5 -5
  48. package/{fesm2015/vgip-meta-ui-index-87041aad.mjs.map → fesm2022/vgip-meta-ui-index-5d13f5e6.mjs.map} +1 -1
  49. package/fesm2022/vgip-meta-ui-index-9e4137fe.mjs +68 -0
  50. package/fesm2022/vgip-meta-ui-index-9e4137fe.mjs.map +1 -0
  51. package/fesm2022/vgip-meta-ui-index-a2a973a6.mjs +862 -0
  52. package/fesm2022/vgip-meta-ui-index-a2a973a6.mjs.map +1 -0
  53. package/{fesm2015/vgip-meta-ui-index-81aa79dc.mjs → fesm2022/vgip-meta-ui-index-af4eda3c.mjs} +8 -8
  54. package/fesm2022/vgip-meta-ui-index-af4eda3c.mjs.map +1 -0
  55. package/fesm2022/vgip-meta-ui-index-b0a76073.mjs +97 -0
  56. package/fesm2022/vgip-meta-ui-index-b0a76073.mjs.map +1 -0
  57. package/fesm2022/vgip-meta-ui-index-b48e32ce.mjs +502 -0
  58. package/fesm2022/vgip-meta-ui-index-b48e32ce.mjs.map +1 -0
  59. package/{fesm2020/vgip-meta-ui-index-2b20afc8.mjs → fesm2022/vgip-meta-ui-index-b6fcc07d.mjs} +10 -8
  60. package/fesm2022/vgip-meta-ui-index-b6fcc07d.mjs.map +1 -0
  61. package/{fesm2015/vgip-meta-ui-index-bf5b6c0f.mjs → fesm2022/vgip-meta-ui-index-c39ea0ec.mjs} +6 -6
  62. package/{fesm2020/vgip-meta-ui-index-bf5b6c0f.mjs.map → fesm2022/vgip-meta-ui-index-c39ea0ec.mjs.map} +1 -1
  63. package/{fesm2020/vgip-meta-ui-index-6e77c362.mjs → fesm2022/vgip-meta-ui-index-ea5c2466.mjs} +6 -6
  64. package/fesm2022/vgip-meta-ui-index-ea5c2466.mjs.map +1 -0
  65. package/{fesm2020/vgip-meta-ui-index-b92a559b.mjs → fesm2022/vgip-meta-ui-index-fef499eb.mjs} +6 -6
  66. package/{fesm2020/vgip-meta-ui-index-b92a559b.mjs.map → fesm2022/vgip-meta-ui-index-fef499eb.mjs.map} +1 -1
  67. package/fesm2022/vgip-meta-ui-metaModel.pipe-6b803e66.mjs +26 -0
  68. package/fesm2022/vgip-meta-ui-metaModel.pipe-6b803e66.mjs.map +1 -0
  69. package/{fesm2015 → fesm2022}/vgip-meta-ui.mjs +108 -103
  70. package/fesm2022/vgip-meta-ui.mjs.map +1 -0
  71. package/lib/common/metaAutofocus.directive.d.ts +1 -1
  72. package/lib/common/metaIcons.pipe.d.ts +1 -1
  73. package/lib/common/metaModel.pipe.d.ts +1 -2
  74. package/lib/common/utils/indexedDbStore/index.d.ts +2 -2
  75. package/lib/fieldAbstract.d.ts +0 -4
  76. package/lib/fieldBoolean/index.d.ts +1 -1
  77. package/lib/fieldComposite/index.d.ts +1 -1
  78. package/lib/fieldRadio/index.d.ts +1 -1
  79. package/lib/fieldReference/index.d.ts +1 -1
  80. package/lib/fieldRichtext/index.d.ts +6 -8
  81. package/lib/fieldSelect/index.d.ts +1 -1
  82. package/lib/fieldText/index.d.ts +1 -1
  83. package/lib/layout/index.d.ts +5 -5
  84. package/lib/metaField/index.d.ts +1 -1
  85. package/lib/refDialog/index.d.ts +3 -3
  86. package/lib/resource/index.d.ts +2 -2
  87. package/lib/resourceCard/index.d.ts +1 -1
  88. package/package.json +8 -14
  89. package/esm2020/lib/common/metaIcons.pipe.mjs +0 -29
  90. package/esm2020/lib/common/metaModel.pipe.mjs +0 -25
  91. package/esm2020/lib/common/metaNormalizer.mjs +0 -327
  92. package/esm2020/lib/common/utils/colorThemes.mjs +0 -79
  93. package/esm2020/lib/common/utils/indexedDbStore/index.mjs +0 -218
  94. package/esm2020/lib/fieldAbstract.mjs +0 -287
  95. package/esm2020/lib/fieldDatetime/index.mjs +0 -363
  96. package/esm2020/lib/fieldList/index.mjs +0 -69
  97. package/esm2020/lib/fieldReference/index.mjs +0 -825
  98. package/esm2020/lib/fieldRichtext/index.mjs +0 -85
  99. package/esm2020/lib/fieldSelect/index.mjs +0 -490
  100. package/esm2020/lib/fieldUnknown/index.mjs +0 -19
  101. package/esm2020/lib/index.mjs +0 -158
  102. package/esm2020/lib/layout/index.mjs +0 -149
  103. package/esm2020/lib/refDialog/index.mjs +0 -127
  104. package/esm2020/lib/resource/index.mjs +0 -491
  105. package/esm2020/lib/services/metaMsg/index.mjs +0 -84
  106. package/esm2020/lib/services/metaReference/index.mjs +0 -89
  107. package/esm2020/lib/services/resourceDrafts/index.mjs +0 -68
  108. package/fesm2015/vgip-meta-ui-fieldAbstract-f7d80db6.mjs +0 -397
  109. package/fesm2015/vgip-meta-ui-fieldAbstract-f7d80db6.mjs.map +0 -1
  110. package/fesm2015/vgip-meta-ui-index-1d2b4c69.mjs +0 -68
  111. package/fesm2015/vgip-meta-ui-index-1d2b4c69.mjs.map +0 -1
  112. package/fesm2015/vgip-meta-ui-index-2737c81e.mjs +0 -1900
  113. package/fesm2015/vgip-meta-ui-index-2737c81e.mjs.map +0 -1
  114. package/fesm2015/vgip-meta-ui-index-2b20afc8.mjs +0 -368
  115. package/fesm2015/vgip-meta-ui-index-2b20afc8.mjs.map +0 -1
  116. package/fesm2015/vgip-meta-ui-index-3eefa50a.mjs +0 -75
  117. package/fesm2015/vgip-meta-ui-index-3eefa50a.mjs.map +0 -1
  118. package/fesm2015/vgip-meta-ui-index-476b6cb7.mjs +0 -24
  119. package/fesm2015/vgip-meta-ui-index-476b6cb7.mjs.map +0 -1
  120. package/fesm2015/vgip-meta-ui-index-4b8d731c.mjs +0 -151
  121. package/fesm2015/vgip-meta-ui-index-4b8d731c.mjs.map +0 -1
  122. package/fesm2015/vgip-meta-ui-index-4ecdd48a.mjs +0 -72
  123. package/fesm2015/vgip-meta-ui-index-4ecdd48a.mjs.map +0 -1
  124. package/fesm2015/vgip-meta-ui-index-62be0e3e.mjs +0 -858
  125. package/fesm2015/vgip-meta-ui-index-62be0e3e.mjs.map +0 -1
  126. package/fesm2015/vgip-meta-ui-index-640f8e62.mjs +0 -95
  127. package/fesm2015/vgip-meta-ui-index-640f8e62.mjs.map +0 -1
  128. package/fesm2015/vgip-meta-ui-index-695384af.mjs +0 -88
  129. package/fesm2015/vgip-meta-ui-index-695384af.mjs.map +0 -1
  130. package/fesm2015/vgip-meta-ui-index-6e77c362.mjs +0 -130
  131. package/fesm2015/vgip-meta-ui-index-6e77c362.mjs.map +0 -1
  132. package/fesm2015/vgip-meta-ui-index-81aa79dc.mjs.map +0 -1
  133. package/fesm2015/vgip-meta-ui-index-87041aad.mjs +0 -23
  134. package/fesm2015/vgip-meta-ui-index-a76ba482.mjs +0 -498
  135. package/fesm2015/vgip-meta-ui-index-a76ba482.mjs.map +0 -1
  136. package/fesm2015/vgip-meta-ui-index-bf5b6c0f.mjs.map +0 -1
  137. package/fesm2015/vgip-meta-ui-metaModel.pipe-4b068359.mjs +0 -28
  138. package/fesm2015/vgip-meta-ui-metaModel.pipe-4b068359.mjs.map +0 -1
  139. package/fesm2015/vgip-meta-ui.mjs.map +0 -1
  140. package/fesm2020/vgip-meta-ui-fieldAbstract-f7d80db6.mjs.map +0 -1
  141. package/fesm2020/vgip-meta-ui-index-1d2b4c69.mjs +0 -68
  142. package/fesm2020/vgip-meta-ui-index-1d2b4c69.mjs.map +0 -1
  143. package/fesm2020/vgip-meta-ui-index-2b20afc8.mjs.map +0 -1
  144. package/fesm2020/vgip-meta-ui-index-476b6cb7.mjs +0 -24
  145. package/fesm2020/vgip-meta-ui-index-476b6cb7.mjs.map +0 -1
  146. package/fesm2020/vgip-meta-ui-index-4c4a4daf.mjs +0 -858
  147. package/fesm2020/vgip-meta-ui-index-4c4a4daf.mjs.map +0 -1
  148. package/fesm2020/vgip-meta-ui-index-4fcefde0.mjs.map +0 -1
  149. package/fesm2020/vgip-meta-ui-index-640f8e62.mjs +0 -95
  150. package/fesm2020/vgip-meta-ui-index-640f8e62.mjs.map +0 -1
  151. package/fesm2020/vgip-meta-ui-index-695384af.mjs +0 -88
  152. package/fesm2020/vgip-meta-ui-index-695384af.mjs.map +0 -1
  153. package/fesm2020/vgip-meta-ui-index-6e77c362.mjs.map +0 -1
  154. package/fesm2020/vgip-meta-ui-index-81aa79dc.mjs +0 -460
  155. package/fesm2020/vgip-meta-ui-index-81aa79dc.mjs.map +0 -1
  156. package/fesm2020/vgip-meta-ui-index-87041aad.mjs.map +0 -1
  157. package/fesm2020/vgip-meta-ui-index-aee28354.mjs +0 -497
  158. package/fesm2020/vgip-meta-ui-index-aee28354.mjs.map +0 -1
  159. package/fesm2020/vgip-meta-ui-index-bf5b6c0f.mjs +0 -61
  160. package/fesm2020/vgip-meta-ui-index-f7370960.mjs +0 -74
  161. package/fesm2020/vgip-meta-ui-index-f7370960.mjs.map +0 -1
  162. package/fesm2020/vgip-meta-ui-metaModel.pipe-4b068359.mjs +0 -28
  163. package/fesm2020/vgip-meta-ui-metaModel.pipe-4b068359.mjs.map +0 -1
  164. package/fesm2020/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs +0 -51
  165. package/fesm2020/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs.map +0 -1
  166. package/fesm2020/vgip-meta-ui.mjs +0 -524
  167. package/fesm2020/vgip-meta-ui.mjs.map +0 -1
  168. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/boolean.mjs +0 -0
  169. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/datetime.mjs +0 -0
  170. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/index.mjs +0 -0
  171. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/number.mjs +0 -0
  172. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/options.mjs +0 -0
  173. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/radio.mjs +0 -0
  174. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/reference.mjs +0 -0
  175. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/richtext.mjs +0 -0
  176. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/string.mjs +0 -0
  177. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/text.mjs +0 -0
  178. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/uniqueNameFilter.mjs +0 -0
  179. /package/{esm2020 → esm2022}/lib/common/utils/relativeTimeBuilder.mjs +0 -0
  180. /package/{esm2020 → esm2022}/lib/common/utils/resourceCardLabel.mjs +0 -0
  181. /package/{esm2020 → esm2022}/lib/common/utils/smartProp.mjs +0 -0
  182. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  183. /package/{esm2020 → esm2022}/vgip-meta-ui.mjs +0 -0
  184. /package/{fesm2015 → fesm2022}/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs +0 -0
  185. /package/{fesm2015 → fesm2022}/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs.map +0 -0
@@ -1,491 +0,0 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
- import { metaDark, metaLight } from '../common/utils/colorThemes';
3
- import { metaNormalizer } from '../common/metaNormalizer';
4
- import { templateBuilder } from '../common/utils/templateBuilder';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../services/metaResource";
7
- import * as i2 from "../services/metaContext";
8
- import * as i3 from "../services/metaMsg";
9
- import * as i4 from "@angular/common";
10
- import * as i5 from "@angular/forms";
11
- import * as i6 from "../layout/index";
12
- import * as i7 from "../common/metaAutofocus.directive";
13
- export class MetaResource {
14
- constructor(ref, el, metaResourceService, metaContext, metaMsgService) {
15
- this.ref = ref;
16
- this.el = el;
17
- this.metaResourceService = metaResourceService;
18
- this.metaContext = metaContext;
19
- this.metaMsgService = metaMsgService;
20
- this.editMode = true;
21
- this.done = new EventEmitter();
22
- this.edit = true;
23
- this.contactsSuggestionsDone = false;
24
- this.onMenuClickout = () => {
25
- delete this.resourceMenuVisible;
26
- document.removeEventListener('click', this.onMenuClickout);
27
- };
28
- }
29
- get niceFields() {
30
- if (!this.resource.niceFields
31
- && this.resource.meta
32
- && this.resource.meta.layout
33
- && this.resource.meta.layout.sections) {
34
- const extractSectionFields = (s) => {
35
- for (const f of s.fields) {
36
- if (f.name) {
37
- this.resource.niceFields[f.name] = f;
38
- }
39
- if (f.fields && f.fields.length) {
40
- extractSectionFields(f);
41
- }
42
- }
43
- };
44
- this.resource.niceFields = {};
45
- for (const s of this.resource.meta.layout.sections) {
46
- extractSectionFields(s);
47
- }
48
- }
49
- return this.resource.niceFields;
50
- }
51
- get fieldNames() {
52
- const names = Object.keys(this.niceFields);
53
- if (this.resource.meta.layout.children) {
54
- for (const child of this.resource.meta.layout.children) {
55
- names.push(child.name);
56
- }
57
- }
58
- return names;
59
- }
60
- ngOnInit() {
61
- this.integrationCode = (this.resource.integrationCode || '').toUpperCase();
62
- this.resourceType = this.resource.resourceType;
63
- this.service = (this.metaResourceServiceDelegated || this.metaResourceService).new(this.resource);
64
- if (!this.model) {
65
- this.model = {};
66
- }
67
- if (this.resource.activity && this.resource.ref.editable === false && !this.resource.externalId) {
68
- this.resource.externalId = 'MISSING_EXTERNAL_ID';
69
- }
70
- this.isPersistent = this.resource && this.resource.externalId;
71
- if (!this.resource.meta) {
72
- this.loadMetadata(this.resource.layoutId);
73
- }
74
- else {
75
- // if (this.isPersistent && (!this.isEditable || this.resources[ref.name].meta.layout.children)) {
76
- // this.edit = false;
77
- // }
78
- this.meta = this.resource.meta;
79
- this.currentLayoutId = this.meta.layout.id;
80
- this.getDetails();
81
- this.getFieldsMap();
82
- }
83
- if (this.theme !== 'inherit') {
84
- this.applyTheme();
85
- }
86
- }
87
- ngOnChanges(changes) {
88
- if (changes.theme) {
89
- this.theme = changes.theme.currentValue;
90
- if (this.theme !== 'inherit') {
91
- this.applyTheme();
92
- }
93
- }
94
- }
95
- setEditMode() {
96
- this.edit = true;
97
- }
98
- loadMetadata(layoutId, refresh = false) {
99
- const layoutStoreKey = `vgis.layout_${this.metaContext.vgipUserId}_${this.integrationCode}_${this.resource.resourceType}`;
100
- if (!layoutId) {
101
- layoutId = localStorage.getItem(layoutStoreKey);
102
- }
103
- this.busy = true;
104
- setTimeout(() => {
105
- this.metaLoading = true;
106
- }, 0);
107
- delete this.resource.niceFields;
108
- this.service.getMetadata(layoutId, refresh).subscribe({
109
- next: (meta) => {
110
- this.currentLayoutId = meta.layout.id;
111
- if (layoutId !== meta.layout.id && !this.isPersistent) {
112
- localStorage.removeItem(layoutStoreKey);
113
- }
114
- this.meta = metaNormalizer(meta, this.integrationCode, this.resource.resourceType);
115
- this.isEditable = this.meta.layout && this.meta.layout.editable !== false;
116
- this.resource.meta = this.meta;
117
- if (this.isPersistent && (!this.isEditable || this.editMode === false || this.meta.layout.children)) {
118
- this.edit = false;
119
- }
120
- delete this.busy;
121
- this.getDetails();
122
- this.getFieldsMap();
123
- },
124
- error: (metaError) => {
125
- delete this.busy;
126
- this.generalError = `Error loading resource metadata (${metaError.statusText})`;
127
- localStorage.removeItem(layoutStoreKey);
128
- },
129
- complete: () => {
130
- delete this.metaLoading;
131
- this.forceUiUpdate();
132
- }
133
- });
134
- }
135
- changeLayout() {
136
- localStorage.setItem(`vgis.layout_${this.metaContext.vgipUserId}_${this.integrationCode}_${this.resource.resourceType}`, this.currentLayoutId);
137
- this.loadMetadata(this.currentLayoutId);
138
- }
139
- getDetails() {
140
- if (this.resource && (this.resource.externalId || this.resource.id)) {
141
- if (this.resource.parent && this.resource.activity // skip fetch
142
- && this.meta.layout.editable === false && !this.meta.layout.children) {
143
- for (const p in this.resource.activity) {
144
- if (this.resource.activity[p] && this.fieldNames.indexOf(p) !== -1) {
145
- this.model[p] = this.resource.activity[p];
146
- }
147
- }
148
- }
149
- else {
150
- this.busy = true;
151
- this.service.getDetails((this.resource.externalId || this.resource.id), {
152
- eventId: this.resource.eventId !== 'NO_EVENT' ? this.resource.eventId : null, layoutId: this.resource.layoutId
153
- }).subscribe({
154
- next: (resource) => {
155
- /* eslint-disable no-underscore-dangle */
156
- if (resource._vgis) {
157
- if (resource._vgis.eventId) {
158
- this.metaContext.vgipEventId = resource._vgis.eventId;
159
- }
160
- if (resource.layoutId && resource._vgis.layoutId !== this.currentLayoutId) {
161
- this.loadMetadata(resource._vgis.layoutId);
162
- }
163
- }
164
- /* eslint-enable no-underscore-dangle */
165
- for (const p in resource) {
166
- if (typeof (resource[p] !== 'undefined') && (this.fieldNames.indexOf(p) !== -1 || p === '_vgis')) {
167
- this.model[p] = resource[p];
168
- }
169
- }
170
- delete this.busy;
171
- },
172
- error: (resourceError) => {
173
- this.generalError = resourceError.error ? resourceError.error.message || resourceError.message : resourceError.message;
174
- delete this.busy;
175
- },
176
- complete: () => {
177
- this.forceUiUpdate();
178
- }
179
- });
180
- }
181
- }
182
- else {
183
- if (this.resource.ref && this.resource.ref.activity) { // reuse failed autoactivities data
184
- for (const p in this.resource.ref.activity) {
185
- if (this.resource.ref.activity && this.fieldNames.indexOf(p) !== -1) {
186
- this.model[p] = this.resource.ref.activity[p]; // VGIS-7215 (copy only valid fields)
187
- }
188
- }
189
- }
190
- this.performAutoFill();
191
- }
192
- }
193
- performAutoFill() {
194
- this.metaMsgService.sendMessage(this.integrationCode, {
195
- action: 'autoFill',
196
- integration: this.integrationCode,
197
- resourceType: this.resourceType,
198
- resource: JSON.parse(JSON.stringify(this.model)),
199
- fields: this.niceFields,
200
- event: this.metaContext.context,
201
- profile: this.metaContext.profiles[this.integrationCode]
202
- }, (response) => {
203
- if (!response.error) {
204
- for (const afp in response.autoFill) {
205
- if (!this.model[afp]) {
206
- this.model[afp] = response.autoFill[afp];
207
- }
208
- }
209
- }
210
- });
211
- }
212
- getFieldsMap() {
213
- if (this.meta.fieldsMap) {
214
- this.fieldsMap = this.meta.fieldsMap;
215
- this.markContactables();
216
- this.buildContactsSuggestions();
217
- if (!this.resource.externalId) {
218
- this.buildSubjectTemplate();
219
- this.execTransformer();
220
- }
221
- }
222
- else {
223
- this.metaMsgService.sendMessage(this.integrationCode, { action: 'fieldsMap', integration: this.integrationCode, resourceType: this.resourceType }, (response) => {
224
- if (!response.error) {
225
- this.fieldsMap = response.fieldsMap;
226
- this.markContactables();
227
- this.buildContactsSuggestions();
228
- if (!this.resource.externalId) {
229
- this.buildSubjectTemplate();
230
- this.execTransformer();
231
- }
232
- }
233
- else {
234
- console.log('No fields map', this.integrationCode, this.resourceType, response.error);
235
- }
236
- });
237
- }
238
- }
239
- openResourceMenu() {
240
- this.resourceMenuVisible = true;
241
- setTimeout(() => {
242
- document.addEventListener('click', this.onMenuClickout);
243
- }, 10);
244
- }
245
- close(result) {
246
- this.done.emit(result);
247
- }
248
- showParsedError(resourceForm, parsedError) {
249
- this.formErrors = parsedError.message || 'There is a problem with one or more fields';
250
- if (parsedError.errors && parsedError.errors.length) {
251
- this.formErrors += ` (${parsedError.errors.map(e => e.message).join(', ')})`;
252
- for (const pe of parsedError.errors) {
253
- if (resourceForm.controls[pe.field]) {
254
- resourceForm.controls[pe.field].setErrors({ invalid: true, custom: pe.message });
255
- }
256
- }
257
- setTimeout(() => {
258
- const firstInvalid = this.el.nativeElement.querySelector('.Vlt-form__element--error .main:not(.standalone)');
259
- if (firstInvalid) {
260
- firstInvalid.focus();
261
- }
262
- });
263
- }
264
- }
265
- submit(resourceForm) {
266
- delete this.formErrors;
267
- resourceForm.form.submitted = true;
268
- if (resourceForm.valid) {
269
- this.busy = true;
270
- if (this.metaContext.vgipEventId) {
271
- /* eslint-disable no-underscore-dangle */
272
- if (!this.model._vgis) {
273
- this.model._vgis = {
274
- connector: this.integrationCode,
275
- resourceType: this.resourceType
276
- };
277
- }
278
- this.model._vgis.layoutId = this.currentLayoutId;
279
- // eslint-disable-next-line max-len
280
- // this.model._vgis.timeZoneOffsetInMinutes = 0; // we are not providing timezone anymore (as V3), instead the 'time' and 'date' objects are converted so the UTC time/date is correct
281
- this.model._vgis.eventId = this.metaContext.vgipEventId;
282
- /* eslint-enable no-underscore-dangle */
283
- }
284
- this.service.save(this.model).subscribe((result) => {
285
- this.model = result;
286
- this.resource.externalId = result._vgis.externalId; // eslint-disable-line no-underscore-dangle
287
- this.isPersistent = true;
288
- this.close(result);
289
- this.edit = false;
290
- delete this.busy;
291
- }, (errorResult) => {
292
- if ((errorResult.status === 422 && errorResult.error && !errorResult.error.errors && errorResult.error.integrationError)
293
- || (errorResult.error && errorResult.error.errors && errorResult.error.errors.length && !errorResult.error.errors[0].field)
294
- // backend implemented error parsing but broken VGIS-7366
295
- ) {
296
- this.formErrors = 'There is a problem with one or more fields';
297
- try {
298
- this.metaMsgService.sendMessage(this.integrationCode, {
299
- action: 'parseErrorMessage',
300
- integrationCode: this.integrationCode,
301
- resourceType: errorResult.error.resourceType,
302
- rawError: errorResult.error.integrationError,
303
- profile: this.metaContext.profiles[this.integrationCode.toUpperCase()]
304
- }, (response) => {
305
- if (response.parsedError) {
306
- this.showParsedError(resourceForm, response.parsedError);
307
- }
308
- else {
309
- // eslint-disable-next-line no-underscore-dangle
310
- console.error('No error parser for', this.integrationCode, errorResult.error.integrationError);
311
- this.formErrors = errorResult.error;
312
- }
313
- });
314
- }
315
- catch (err) {
316
- console.log('....', err);
317
- }
318
- ;
319
- }
320
- else if (errorResult.status === 422) {
321
- this.showParsedError(resourceForm, errorResult.error);
322
- }
323
- else {
324
- this.formErrors = errorResult.error;
325
- }
326
- delete this.busy;
327
- });
328
- }
329
- else {
330
- this.formErrors = Object.keys(resourceForm.controls)
331
- .filter((c) => resourceForm.controls[c].invalid)
332
- .map((f) => (this.niceFields[f] ? (this.niceFields[f].label || f) : f)).join(', ');
333
- setTimeout(() => {
334
- const selector = `form[name="${this.resourceType}"] .Vlt-form__element--error .main:not(.standalone)`;
335
- const firstInvalid = this.el.nativeElement.querySelector(selector);
336
- if (firstInvalid) {
337
- firstInvalid.focus();
338
- }
339
- });
340
- }
341
- }
342
- clearFormErrors() {
343
- delete this.formErrors;
344
- }
345
- suggestFieldProperty(key, value) {
346
- if (key && value) {
347
- const fieldNames = this.fieldNames;
348
- if (this.model) {
349
- const nestMatch = key.match(/(\S+)\[\d\]\.(\S+)/);
350
- if (nestMatch && fieldNames.indexOf(nestMatch[1]) !== -1) {
351
- this.model[nestMatch[1]] = [];
352
- const nestKeys = {};
353
- nestKeys[nestMatch[2]] = value;
354
- this.model[nestMatch[1]].push(nestKeys);
355
- }
356
- else if (fieldNames.indexOf(key) !== -1) {
357
- this.model[key] = value;
358
- }
359
- }
360
- }
361
- }
362
- execTransformer() {
363
- if (this.metaContext && this.fieldsMap) {
364
- setTimeout(() => {
365
- this.suggestFieldProperty(this.fieldsMap.phoneNumber, this.metaContext.phoneNumber);
366
- if (this.fieldsMap.firstName || this.fieldsMap.lastName) {
367
- const names = (this.metaContext.displayName || '').split(' ');
368
- this.suggestFieldProperty(this.fieldsMap.firstName, names[0]);
369
- this.suggestFieldProperty(this.fieldsMap.lastName, names[1]);
370
- }
371
- else if (this.fieldsMap.displayName) {
372
- this.suggestFieldProperty(this.fieldsMap.displayName, this.metaContext.displayName);
373
- }
374
- }, 100);
375
- }
376
- }
377
- markContactables() {
378
- if (this.fieldsMap.contactables && this.fieldsMap.contactables.length) {
379
- for (const c of this.fieldsMap.contactables) {
380
- const field = this.niceFields[c];
381
- if (field) {
382
- Object.defineProperty(field, '$isContactable', {
383
- value: true,
384
- configurable: true,
385
- enumerable: false
386
- });
387
- }
388
- }
389
- }
390
- }
391
- buildSubjectTemplate() {
392
- if (!this.model[this.fieldsMap.subject] && this.fieldsMap.subject && this.niceFields[this.fieldsMap.subject]) {
393
- let subjectTemplate;
394
- if (this.niceFields[this.fieldsMap.subject].default) {
395
- subjectTemplate = this.niceFields[this.fieldsMap.subject].default.id || this.niceFields[this.fieldsMap.subject].default;
396
- }
397
- else if (this.metaContext.profiles[this.integrationCode]) {
398
- const profile = this.metaContext.profiles[this.integrationCode] || {};
399
- subjectTemplate = profile.defaultSubject ?
400
- profile.defaultSubject[((this.metaContext.context || 'CALL').type || '').toUpperCase()] :
401
- profile.activityDefaultSubjectTemplate;
402
- }
403
- if (subjectTemplate) {
404
- this.model[this.fieldsMap.subject] = templateBuilder(this.metaContext, subjectTemplate);
405
- }
406
- }
407
- }
408
- buildContactsSuggestions() {
409
- // let hasDefaultContact = false;
410
- if (this.metaContext.contactables[this.integrationCode] && this.meta.layout && this.meta.layout.sections) {
411
- for (const s of this.meta.layout.sections) {
412
- for (const f of (s.fields || [])) {
413
- if (f.type === 'reference') {
414
- const refTypes = (f.reference.length ? f.reference : [f.reference]).map(r => r.name);
415
- for (const c of this.metaContext.contactables[this.integrationCode]) {
416
- if (refTypes.indexOf(c.resourceType || c.type) !== -1) {
417
- if (!f.suggestions) {
418
- f.suggestions = [];
419
- }
420
- else {
421
- f.suggestions = f.suggestions.filter(sg => !sg.auto);
422
- }
423
- let tLabel = c.displayName || c.name;
424
- if (c.phoneNumbers) {
425
- tLabel += (' ✆' + c.phoneNumbers.map(p => p.phoneNumber).join(','));
426
- }
427
- f.suggestions.push({
428
- id: c.externalId || c.identifier || c.id,
429
- label: tLabel,
430
- type: c.resourceType || c.type,
431
- auto: true
432
- });
433
- }
434
- }
435
- if ((this.fieldsMap.contactables || []).indexOf(f.name) !== -1) { // evaluate usability?
436
- f.alwaysVisible = true;
437
- }
438
- // if (
439
- // !hasDefaultContact && this.metaContext.defaultContactables[this.integrationCode]
440
- // && refTypes.indexOf(this.metaContext.defaultContactables[this.integrationCode].type) !== -1
441
- // ) {
442
- // this.resource[f.name] = this.metaContext.defaultContactables[this.integrationCode];
443
- // hasDefaultContact = true;
444
- // } else if (!hasDefaultContact && this.fieldsMap.contactables && f.suggestions && f.suggestions.length === 1) {
445
- // if (this.fieldsMap.contactables.indexOf(f.name) !== -1 && !f.default) {
446
- // f.default = f.suggestions[0];
447
- // hasDefaultContact = true;
448
- // }
449
- // }
450
- }
451
- }
452
- }
453
- this.contactsSuggestionsDone = true;
454
- }
455
- }
456
- applyTheme() {
457
- const metaTheme = this.theme === 'dark' ? metaDark : metaLight;
458
- console.log('resource apply theme', this.theme);
459
- for (const key of Object.keys(metaTheme.properties)) {
460
- this.el.nativeElement.style.setProperty(key, metaTheme.properties[key]);
461
- }
462
- }
463
- forceUiUpdate() {
464
- // this.ref.detectChanges();
465
- const e = document.createEvent('Events');
466
- e.initEvent('click', true, false);
467
- this.el.nativeElement.dispatchEvent(e);
468
- }
469
- }
470
- MetaResource.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: MetaResource, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.MetaResourceService }, { token: i2.MetaContextService }, { token: i3.MetaMsgService }], target: i0.ɵɵFactoryTarget.Component });
471
- MetaResource.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: MetaResource, selector: "vgip-meta-resource", inputs: { resource: "resource", model: "model", metaResourceServiceDelegated: "metaResourceServiceDelegated", theme: "theme", editMode: "editMode" }, outputs: { done: "done" }, viewQueries: [{ propertyName: "resourceForm", first: true, predicate: ["resourceForm"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf='generalError' class=\"Vlt-callout Vlt-callout--critical\" style='overflow: auto; margin: 20px;'>\n\t<i></i>\n\t<div class=\"Vlt-callout__content\">\n\t\t<p>{{generalError}}</p>\n\t</div>\n</div>\n<div *ngIf='!meta' class=\"Vlt-progress\">\n\t<div class=\"Vlt-progress__bar\" [ngClass]=\"{ loading: metaLoading }\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuetext=\"Loading Metadata\" aria-valuemax=\"100\"></div>\n</div>\n<form [vgipMetaFormAutofocus]='!resource || !resource.externalId' *ngIf='meta && !generalError' #resourceForm=\"ngForm\" [name]='resource.resourceType' (ngSubmit)='submit(resourceForm)' novalidate>\n\t<div class='form-content' style='overflow: hidden;'>\n\t\t<div [ngClass]=\"{ 'Vlt-callout--dismissed': !formErrors }\" class=\"Vlt-callout Vlt-callout--banner Vlt-callout--critical\">\n\t\t\t<i></i>\n\t\t\t<div class=\"Vlt-callout__content\" style=\"margin-top: auto;\">\n\t\t\t\t<p>There is a problem with one or more fields</p>\n\t\t\t\t<small style='font-weight: 600; font-size: 1.0em;' *ngIf='formErrors'>{{ formErrors.message || formErrors }}</small>\n\t\t\t</div>\n\t\t\t<button type='button' class=\"Vlt-callout__dismiss\" (click)='clearFormErrors()' aria-label=\"Dismiss\"></button>\n\t\t</div>\n\t\t<div class=\"Vlt-card__content\" style='min-height: 40px;'>\n\t\t\t<vgip-meta-layout *ngIf='edit' [meta]='meta.layout' [resource]='model' [preview]='false' [integration]='meta.integration' [type]='resource.resourceType' theme='inherit'></vgip-meta-layout>\n\t\t\t<vgip-meta-layout *ngIf='!edit' [meta]='meta.layout' [resource]='model' [preview]='true' [integration]='meta.integration' [type]='resource.resourceType' theme='inherit'></vgip-meta-layout>\n\t\t</div>\n\t</div>\n\t<div class=\"Vlt-card__footer\">\n\t\t<button class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--outline\" type='button' aria-label='Cancel' (click)='close()'>\n\t\t\t{{ edit ? 'Cancel' : 'Close' }}\n\t\t</button>\n\t\t<button *ngIf='edit' class=\"Vlt-btn Vlt-btn--app\" [ngClass]=\"{ 'Vlt-btn--primary': isPersistent, 'Vlt-btn--secondary': !isPersistent }\" type='submit'>\n\t\t\t{{ (resource && resource.externalId) ? 'Update' : 'Create' }}\n\t\t</button>\n\t\t<button (click)='setEditMode()' *ngIf='!edit && isEditable' [disabled]='!isEditable' class=\"Vlt-btn Vlt-btn--app Vlt-btn--primary\" type='button' aria-label='Edit'>\n\t\t\tEdit\n\t\t</button>\n\t\t<div style='margin-right: 8px; flex: 1;'>\n\t\t\t<div *ngIf='meta.availableLayouts && meta.availableLayouts.length' class=\"Vlt-form__element Vlt-form__element--big\" style='padding: 0; margin: -8px -18px -8px 0;'>\n\t\t\t\t<div class=\"Vlt-select\">\n\t\t\t\t\t<label style='all: inherit;'>\n\t\t\t\t\t\t<select style='border: 0; margin-top: 3px; background: transparent;' (change)='changeLayout()' [(ngModel)]='currentLayoutId' [ngModelOptions]='{ standalone: true }' [disabled]='isPersistent'>\n\t\t\t\t\t\t\t<option selected disabled>Select layout</option>\n\t\t\t\t\t\t\t<option *ngFor='let layout of meta.availableLayouts' [ngValue]='layout.id'>{{layout.name}}</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t\t<label>Layout</label>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"Vlt-dropdown resource-menu\" [ngClass]=\"{ 'Vlt-dropdown--expanded': resourceMenuVisible }\" style='margin-left: 2px;'>\n\t\t\t<div class=\"Vlt-dropdown__panel\" style='bottom: 40px; right: -4px; top: initial;'>\n\t\t\t\t<div class=\"Vlt-dropdown__panel__content\">\n\t\t\t\t\t<a class=\"Vlt-dropdown__link\" (click)='loadMetadata(currentLayoutId, true)'>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<svg class='Vlt-icon Vlt-icon--smaller'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-refresh\"/></svg>&nbsp;&nbsp;Refresh metadata\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"Vlt-dropdown__trigger\">\n\t\t\t\t<button type='button' (click)='openResourceMenu()' class=\"Vlt-btn Vlt-btn--link\" aria-label='Resource menu'>\n\t\t\t\t\t<svg class='Vlt-icon Vlt-icon--small' style='margin: 0;'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-more-v-negative\"/></svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</form>\n<div class='busy-mask' [ngClass]=\"{ active: busy }\">\n\t<div style='height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center;'>\n\t\t<div class=\"Vlt-spinner\"></div>\n\t</div>\n</div>\n", styles: [":host{flex:1;display:flex;flex-direction:column;min-height:0;color:var(--vgip-meta-resource-color)}.Vlt-callout--banner{justify-content:initial;text-align:initial;overflow-y:auto}.Vlt-callout--banner.Vlt-callout--dismissed{padding:0}.Vlt-callout--banner:not(.Vlt-callout--dismissed){min-height:78px}.Vlt-spinner:before,.Vlt-spinner:after{border:6px solid #616266;border-color:#616266 transparent transparent}.Vlt-card__content{padding:8px 8px 8px 16px;display:flex;flex-direction:column;min-height:0;flex:1;overflow-y:scroll;overflow-x:hidden;background-color:var(--vgip-meta-resource-bg-color)}@media (hover: none){.Vlt-card__content{padding-right:16px}}.Vlt-card__content::-webkit-scrollbar{width:8px}.Vlt-card__content::-webkit-scrollbar-thumb{background-color:var(--vgip-meta-scrollbar-color);border:2px solid transparent;border-radius:6px;background-clip:content-box}.Vlt-card__footer{background:var(--vgip-meta-resource-bar-color);border-top:1px solid var(--vgip-meta-separator-color);display:flex;flex-direction:row;margin:16px -24px -24px;padding:8px 8px 8px 16px;box-shadow:0 0 4px #00000040;z-index:1}.Vlt-card__footer .Vlt-select select{color:var(--vgip-meta-input-color)}.Vlt-card__footer .Vlt-select select:disabled{background:initial;cursor:not-allowed}.Vlt-card__footer .Vlt-select:after{background-image:var(--vgip-meta-dropdown-icon)}.Vlt-card__footer .resource-menu .Vlt-icon:not(:hover){fill:var(--vgip-meta-input-label-color)}.Vlt-card__footer button.Vlt-btn--secondary{border:none;box-shadow:inset 0 0 0 1px var(--vgip-meta-button-border-color)}.Vlt-card__footer button.Vlt-btn--secondary:not([type=submit]){color:var(--vgip-meta-input-color)}.Vlt-card__footer button.Vlt-btn--secondary:hover{box-shadow:inset 0 0 0 1px var(--vgip-meta-input-accent-color)}.Vlt-card__footer button.Vlt-btn--secondary:hover[type=submit]{background-color:var(--vgip-meta-submit-hover-bg-color)}.Vlt-progress{margin:0;position:sticky}.Vlt-progress .Vlt-progress__bar{width:0;transition:width 5s}.Vlt-progress .Vlt-progress__bar.loading{width:100%}form{border-radius:6px;padding:24px;display:flex;flex-direction:column;min-height:0;flex:1}form .form-content{margin:-24px -24px -16px;padding-bottom:0;flex:1;display:flex;flex-direction:column}.busy-mask{position:absolute;inset:0;background:rgba(0,0,0,.32);opacity:1;z-index:898;display:none;border-bottom-left-radius:6px;border-bottom-right-radius:6px;margin:1px;cursor:progress}.busy-mask.active{display:block}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MetaLayout, selector: "vgip-meta-layout", inputs: ["meta", "resource", "integration", "type", "preview", "theme"] }, { kind: "directive", type: i7.MetaAutofocusDirective, selector: "[vgipMetaFormAutofocus]", inputs: ["vgipMetaFormAutofocus"] }] });
472
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: MetaResource, decorators: [{
473
- type: Component,
474
- args: [{ selector: 'vgip-meta-resource', template: "<div *ngIf='generalError' class=\"Vlt-callout Vlt-callout--critical\" style='overflow: auto; margin: 20px;'>\n\t<i></i>\n\t<div class=\"Vlt-callout__content\">\n\t\t<p>{{generalError}}</p>\n\t</div>\n</div>\n<div *ngIf='!meta' class=\"Vlt-progress\">\n\t<div class=\"Vlt-progress__bar\" [ngClass]=\"{ loading: metaLoading }\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuetext=\"Loading Metadata\" aria-valuemax=\"100\"></div>\n</div>\n<form [vgipMetaFormAutofocus]='!resource || !resource.externalId' *ngIf='meta && !generalError' #resourceForm=\"ngForm\" [name]='resource.resourceType' (ngSubmit)='submit(resourceForm)' novalidate>\n\t<div class='form-content' style='overflow: hidden;'>\n\t\t<div [ngClass]=\"{ 'Vlt-callout--dismissed': !formErrors }\" class=\"Vlt-callout Vlt-callout--banner Vlt-callout--critical\">\n\t\t\t<i></i>\n\t\t\t<div class=\"Vlt-callout__content\" style=\"margin-top: auto;\">\n\t\t\t\t<p>There is a problem with one or more fields</p>\n\t\t\t\t<small style='font-weight: 600; font-size: 1.0em;' *ngIf='formErrors'>{{ formErrors.message || formErrors }}</small>\n\t\t\t</div>\n\t\t\t<button type='button' class=\"Vlt-callout__dismiss\" (click)='clearFormErrors()' aria-label=\"Dismiss\"></button>\n\t\t</div>\n\t\t<div class=\"Vlt-card__content\" style='min-height: 40px;'>\n\t\t\t<vgip-meta-layout *ngIf='edit' [meta]='meta.layout' [resource]='model' [preview]='false' [integration]='meta.integration' [type]='resource.resourceType' theme='inherit'></vgip-meta-layout>\n\t\t\t<vgip-meta-layout *ngIf='!edit' [meta]='meta.layout' [resource]='model' [preview]='true' [integration]='meta.integration' [type]='resource.resourceType' theme='inherit'></vgip-meta-layout>\n\t\t</div>\n\t</div>\n\t<div class=\"Vlt-card__footer\">\n\t\t<button class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--outline\" type='button' aria-label='Cancel' (click)='close()'>\n\t\t\t{{ edit ? 'Cancel' : 'Close' }}\n\t\t</button>\n\t\t<button *ngIf='edit' class=\"Vlt-btn Vlt-btn--app\" [ngClass]=\"{ 'Vlt-btn--primary': isPersistent, 'Vlt-btn--secondary': !isPersistent }\" type='submit'>\n\t\t\t{{ (resource && resource.externalId) ? 'Update' : 'Create' }}\n\t\t</button>\n\t\t<button (click)='setEditMode()' *ngIf='!edit && isEditable' [disabled]='!isEditable' class=\"Vlt-btn Vlt-btn--app Vlt-btn--primary\" type='button' aria-label='Edit'>\n\t\t\tEdit\n\t\t</button>\n\t\t<div style='margin-right: 8px; flex: 1;'>\n\t\t\t<div *ngIf='meta.availableLayouts && meta.availableLayouts.length' class=\"Vlt-form__element Vlt-form__element--big\" style='padding: 0; margin: -8px -18px -8px 0;'>\n\t\t\t\t<div class=\"Vlt-select\">\n\t\t\t\t\t<label style='all: inherit;'>\n\t\t\t\t\t\t<select style='border: 0; margin-top: 3px; background: transparent;' (change)='changeLayout()' [(ngModel)]='currentLayoutId' [ngModelOptions]='{ standalone: true }' [disabled]='isPersistent'>\n\t\t\t\t\t\t\t<option selected disabled>Select layout</option>\n\t\t\t\t\t\t\t<option *ngFor='let layout of meta.availableLayouts' [ngValue]='layout.id'>{{layout.name}}</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t\t<label>Layout</label>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"Vlt-dropdown resource-menu\" [ngClass]=\"{ 'Vlt-dropdown--expanded': resourceMenuVisible }\" style='margin-left: 2px;'>\n\t\t\t<div class=\"Vlt-dropdown__panel\" style='bottom: 40px; right: -4px; top: initial;'>\n\t\t\t\t<div class=\"Vlt-dropdown__panel__content\">\n\t\t\t\t\t<a class=\"Vlt-dropdown__link\" (click)='loadMetadata(currentLayoutId, true)'>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<svg class='Vlt-icon Vlt-icon--smaller'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-refresh\"/></svg>&nbsp;&nbsp;Refresh metadata\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"Vlt-dropdown__trigger\">\n\t\t\t\t<button type='button' (click)='openResourceMenu()' class=\"Vlt-btn Vlt-btn--link\" aria-label='Resource menu'>\n\t\t\t\t\t<svg class='Vlt-icon Vlt-icon--small' style='margin: 0;'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-more-v-negative\"/></svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</form>\n<div class='busy-mask' [ngClass]=\"{ active: busy }\">\n\t<div style='height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center;'>\n\t\t<div class=\"Vlt-spinner\"></div>\n\t</div>\n</div>\n", styles: [":host{flex:1;display:flex;flex-direction:column;min-height:0;color:var(--vgip-meta-resource-color)}.Vlt-callout--banner{justify-content:initial;text-align:initial;overflow-y:auto}.Vlt-callout--banner.Vlt-callout--dismissed{padding:0}.Vlt-callout--banner:not(.Vlt-callout--dismissed){min-height:78px}.Vlt-spinner:before,.Vlt-spinner:after{border:6px solid #616266;border-color:#616266 transparent transparent}.Vlt-card__content{padding:8px 8px 8px 16px;display:flex;flex-direction:column;min-height:0;flex:1;overflow-y:scroll;overflow-x:hidden;background-color:var(--vgip-meta-resource-bg-color)}@media (hover: none){.Vlt-card__content{padding-right:16px}}.Vlt-card__content::-webkit-scrollbar{width:8px}.Vlt-card__content::-webkit-scrollbar-thumb{background-color:var(--vgip-meta-scrollbar-color);border:2px solid transparent;border-radius:6px;background-clip:content-box}.Vlt-card__footer{background:var(--vgip-meta-resource-bar-color);border-top:1px solid var(--vgip-meta-separator-color);display:flex;flex-direction:row;margin:16px -24px -24px;padding:8px 8px 8px 16px;box-shadow:0 0 4px #00000040;z-index:1}.Vlt-card__footer .Vlt-select select{color:var(--vgip-meta-input-color)}.Vlt-card__footer .Vlt-select select:disabled{background:initial;cursor:not-allowed}.Vlt-card__footer .Vlt-select:after{background-image:var(--vgip-meta-dropdown-icon)}.Vlt-card__footer .resource-menu .Vlt-icon:not(:hover){fill:var(--vgip-meta-input-label-color)}.Vlt-card__footer button.Vlt-btn--secondary{border:none;box-shadow:inset 0 0 0 1px var(--vgip-meta-button-border-color)}.Vlt-card__footer button.Vlt-btn--secondary:not([type=submit]){color:var(--vgip-meta-input-color)}.Vlt-card__footer button.Vlt-btn--secondary:hover{box-shadow:inset 0 0 0 1px var(--vgip-meta-input-accent-color)}.Vlt-card__footer button.Vlt-btn--secondary:hover[type=submit]{background-color:var(--vgip-meta-submit-hover-bg-color)}.Vlt-progress{margin:0;position:sticky}.Vlt-progress .Vlt-progress__bar{width:0;transition:width 5s}.Vlt-progress .Vlt-progress__bar.loading{width:100%}form{border-radius:6px;padding:24px;display:flex;flex-direction:column;min-height:0;flex:1}form .form-content{margin:-24px -24px -16px;padding-bottom:0;flex:1;display:flex;flex-direction:column}.busy-mask{position:absolute;inset:0;background:rgba(0,0,0,.32);opacity:1;z-index:898;display:none;border-bottom-left-radius:6px;border-bottom-right-radius:6px;margin:1px;cursor:progress}.busy-mask.active{display:block}\n"] }]
475
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.MetaResourceService }, { type: i2.MetaContextService }, { type: i3.MetaMsgService }]; }, propDecorators: { resource: [{
476
- type: Input
477
- }], model: [{
478
- type: Input
479
- }], metaResourceServiceDelegated: [{
480
- type: Input
481
- }], theme: [{
482
- type: Input
483
- }], editMode: [{
484
- type: Input
485
- }], done: [{
486
- type: Output
487
- }], resourceForm: [{
488
- type: ViewChild,
489
- args: ['resourceForm']
490
- }] } });
491
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvcmVzb3VyY2UvaW5kZXgudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvcmVzb3VyY2Uvdmlldy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHcEksT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7QUFPbEUsTUFBTSxPQUFPLFlBQVk7SUEwQnZCLFlBQ1UsR0FBc0IsRUFDdEIsRUFBYyxFQUNkLG1CQUF3QyxFQUN4QyxXQUErQixFQUMvQixjQUE4QjtRQUo5QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2Qsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDL0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBMUIvQixhQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ1IsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFXM0MsU0FBSSxHQUFHLElBQUksQ0FBQztRQUtaLDRCQUF1QixHQUFHLEtBQUssQ0FBQztRQWtXeEIsbUJBQWMsR0FBRyxHQUFHLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDaEMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFD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QkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDVyxJQUFJO3NCQUFwQixNQUFNO2dCQUUyQixZQUFZO3NCQUE3QyxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1ldGFSZXNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tZXRhUmVzb3VyY2UnO1xuaW1wb3J0IHsgbWV0YURhcmssIG1ldGFMaWdodCB9IGZyb20gJy4uL2NvbW1vbi91dGlscy9jb2xvclRoZW1lcyc7XG5pbXBvcnQgeyBNZXRhQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tZXRhQ29udGV4dCc7XG5pbXBvcnQgeyBNZXRhTXNnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL21ldGFNc2cnO1xuaW1wb3J0IHsgbWV0YU5vcm1hbGl6ZXIgfSBmcm9tICcuLi9jb21tb24vbWV0YU5vcm1hbGl6ZXInO1xuaW1wb3J0IHsgdGVtcGxhdGVCdWlsZGVyIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzL3RlbXBsYXRlQnVpbGRlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZnaXAtbWV0YS1yZXNvdXJjZScsXG4gIHRlbXBsYXRlVXJsOiAnLi92aWV3Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdHlsZS5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTWV0YVJlc291cmNlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSByZXNvdXJjZTogYW55O1xuICBASW5wdXQoKSBtb2RlbDogYW55O1xuICBASW5wdXQoKSBtZXRhUmVzb3VyY2VTZXJ2aWNlRGVsZWdhdGVkOiBNZXRhUmVzb3VyY2VTZXJ2aWNlOyAvLyBjYXJ5IGl0IGZyb20gdGhlIHBhcmVudCB0byBrZWVwIHRoZSBpbnRlcmNlcHRvcnNcbiAgQElucHV0KCkgdGhlbWU6IHN0cmluZztcbiAgQElucHV0KCkgZWRpdE1vZGUgPSB0cnVlO1xuICBAT3V0cHV0KCkgcHVibGljIGRvbmUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgncmVzb3VyY2VGb3JtJykgcHVibGljIHJlc291cmNlRm9ybTogTmdGb3JtO1xuXG4gIGludGVncmF0aW9uQ29kZTogc3RyaW5nO1xuICByZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgbWV0YTogYW55O1xuICBzZXJ2aWNlOiBNZXRhUmVzb3VyY2VTZXJ2aWNlO1xuICBjdXJyZW50TGF5b3V0SWQ6IGFueTtcbiAgZm9ybUVycm9yczogYW55O1xuICBmaWVsZHNNYXA6IGFueTtcbiAgZWRpdCA9IHRydWU7XG4gIGJ1c3k6IGJvb2xlYW47XG4gIG1ldGFMb2FkaW5nOiBib29sZWFuO1xuICBnZW5lcmFsRXJyb3I6IHN0cmluZztcbiAgcmVzb3VyY2VNZW51VmlzaWJsZTogYm9vbGVhbjtcbiAgY29udGFjdHNTdWdnZXN0aW9uc0RvbmUgPSBmYWxzZTtcbiAgaXNFZGl0YWJsZTogYm9vbGVhbjtcbiAgaXNQZXJzaXN0ZW50OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgbWV0YVJlc291cmNlU2VydmljZTogTWV0YVJlc291cmNlU2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFDb250ZXh0OiBNZXRhQ29udGV4dFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXRhTXNnU2VydmljZTogTWV0YU1zZ1NlcnZpY2VcbiAgKSB7XG5cbiAgfVxuXG4gIGdldCBuaWNlRmllbGRzKCkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnJlc291cmNlLm5pY2VGaWVsZHNcbiAgICAgICYmIHRoaXMucmVzb3VyY2UubWV0YVxuICAgICAgJiYgdGhpcy5yZXNvdXJjZS5tZXRhLmxheW91dFxuICAgICAgJiYgdGhpcy5yZXNvdXJjZS5tZXRhLmxheW91dC5zZWN0aW9uc1xuICAgICkge1xuICAgICAgY29uc3QgZXh0cmFjdFNlY3Rpb25GaWVsZHMgPSAocykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGYgb2Ygcy5maWVsZHMpIHtcbiAgICAgICAgICBpZiAoZi5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlLm5pY2VGaWVsZHNbZi5uYW1lXSA9IGY7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmLmZpZWxkcyAmJiBmLmZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV4dHJhY3RTZWN0aW9uRmllbGRzKGYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMucmVzb3VyY2UubmljZUZpZWxkcyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBzIG9mIHRoaXMucmVzb3VyY2UubWV0YS5sYXlvdXQuc2VjdGlvbnMpIHtcbiAgICAgICAgZXh0cmFjdFNlY3Rpb25GaWVsZHMocyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc291cmNlLm5pY2VGaWVsZHM7XG4gIH1cblxuICBnZXQgZmllbGROYW1lcygpIHtcbiAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMubmljZUZpZWxkcyk7XG4gICAgaWYgKHRoaXMucmVzb3VyY2UubWV0YS5sYXlvdXQuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5yZXNvdXJjZS5tZXRhLmxheW91dC5jaGlsZHJlbikge1xuICAgICAgICBuYW1lcy5wdXNoKGNoaWxkLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmludGVncmF0aW9uQ29kZSA9ICh0aGlzLnJlc291cmNlLmludGVncmF0aW9uQ29kZSB8fCAnJykudG9VcHBlckNhc2UoKTtcbiAgICB0aGlzLnJlc291cmNlVHlwZSA9IHRoaXMucmVzb3VyY2UucmVzb3VyY2VUeXBlO1xuICAgIHRoaXMuc2VydmljZSA9ICh0aGlzLm1ldGFSZXNvdXJjZVNlcnZpY2VEZWxlZ2F0ZWQgfHwgdGhpcy5tZXRhUmVzb3VyY2VTZXJ2aWNlKS5uZXcodGhpcy5yZXNvdXJjZSk7XG4gICAgaWYgKCF0aGlzLm1vZGVsKSB7XG4gICAgICB0aGlzLm1vZGVsID0ge307XG4gICAgfVxuICAgIGlmICh0aGlzLnJlc291cmNlLmFjdGl2aXR5ICYmIHRoaXMucmVzb3VyY2UucmVmLmVkaXRhYmxlID09PSBmYWxzZSAmJiAhdGhpcy5yZXNvdXJjZS5leHRlcm5hbElkKSB7XG4gICAgICB0aGlzLnJlc291cmNlLmV4dGVybmFsSWQgPSAnTUlTU0lOR19FWFRFUk5BTF9JRCc7XG4gICAgfVxuICAgIHRoaXMuaXNQZXJzaXN0ZW50ID0gdGhpcy5yZXNvdXJjZSAmJiB0aGlzLnJlc291cmNlLmV4dGVybmFsSWQ7XG4gICAgaWYgKCF0aGlzLnJlc291cmNlLm1ldGEpIHtcbiAgICAgIHRoaXMubG9hZE1ldGFkYXRhKHRoaXMucmVzb3VyY2UubGF5b3V0SWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyAgIGlmICh0aGlzLmlzUGVyc2lzdGVudCAmJiAoIXRoaXMuaXNFZGl0YWJsZSB8fCB0aGlzLnJlc291cmNlc1tyZWYubmFtZV0ubWV0YS5sYXlvdXQuY2hpbGRyZW4pKSB7XG4gICAgICAvLyAgICAgdGhpcy5lZGl0ID0gZmFsc2U7XG4gICAgICAvLyAgIH1cbiAgICAgIHRoaXMubWV0YSA9IHRoaXMucmVzb3VyY2UubWV0YTtcbiAgICAgIHRoaXMuY3VycmVudExheW91dElkID0gdGhpcy5tZXRhLmxheW91dC5pZDtcbiAgICAgIHRoaXMuZ2V0RGV0YWlscygpO1xuICAgICAgdGhpcy5nZXRGaWVsZHNNYXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGhlbWUgIT09ICdpbmhlcml0Jykge1xuICAgICAgdGhpcy5hcHBseVRoZW1lKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogYW55KSB7XG4gICAgaWYgKGNoYW5nZXMudGhlbWUpIHtcbiAgICAgIHRoaXMudGhlbWUgPSBjaGFuZ2VzLnRoZW1lLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmICh0aGlzLnRoZW1lICE9PSAnaW5oZXJpdCcpIHtcbiAgICAgICAgdGhpcy5hcHBseVRoZW1lKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0RWRpdE1vZGUoKSB7XG4gICAgdGhpcy5lZGl0ID0gdHJ1ZTtcbiAgfVxuXG4gIGxvYWRNZXRhZGF0YShsYXlvdXRJZD8sIHJlZnJlc2ggPSBmYWxzZSkge1xuICAgIGNvbnN0IGxheW91dFN0b3JlS2V5ID0gYHZnaXMubGF5b3V0XyR7dGhpcy5tZXRhQ29udGV4dC52Z2lwVXNlcklkfV8ke3RoaXMuaW50ZWdyYXRpb25Db2RlfV8ke3RoaXMucmVzb3VyY2UucmVzb3VyY2VUeXBlfWA7XG4gICAgaWYgKCFsYXlvdXRJZCkge1xuICAgICAgbGF5b3V0SWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsYXlvdXRTdG9yZUtleSk7XG4gICAgfVxuICAgIHRoaXMuYnVzeSA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm1ldGFMb2FkaW5nID0gdHJ1ZTtcbiAgICB9LCAwKTtcbiAgICBkZWxldGUgdGhpcy5yZXNvdXJjZS5uaWNlRmllbGRzO1xuICAgIHRoaXMuc2VydmljZS5nZXRNZXRhZGF0YShsYXlvdXRJZCwgcmVmcmVzaCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChtZXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50TGF5b3V0SWQgPSBtZXRhLmxheW91dC5pZDtcbiAgICAgICAgaWYgKGxheW91dElkICE9PSBtZXRhLmxheW91dC5pZCAmJiAhdGhpcy5pc1BlcnNpc3RlbnQpIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShsYXlvdXRTdG9yZUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXRhID0gbWV0YU5vcm1hbGl6ZXIobWV0YSwgdGhpcy5pbnRlZ3JhdGlvbkNvZGUsIHRoaXMucmVzb3VyY2UucmVzb3VyY2VUeXBlKTtcbiAgICAgICAgdGhpcy5pc0VkaXRhYmxlID0gdGhpcy5tZXRhLmxheW91dCAmJiB0aGlzLm1ldGEubGF5b3V0LmVkaXRhYmxlICE9PSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZS5tZXRhID0gdGhpcy5tZXRhO1xuICAgICAgICBpZiAodGhpcy5pc1BlcnNpc3RlbnQgJiYgKCF0aGlzLmlzRWRpdGFibGUgfHwgdGhpcy5lZGl0TW9kZSA9PT0gZmFsc2UgfHwgdGhpcy5tZXRhLmxheW91dC5jaGlsZHJlbikpIHtcbiAgICAgICAgICB0aGlzLmVkaXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5idXN5O1xuICAgICAgICB0aGlzLmdldERldGFpbHMoKTtcbiAgICAgICAgdGhpcy5nZXRGaWVsZHNNYXAoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKG1ldGFFcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmJ1c3k7XG4gICAgICAgIHRoaXMuZ2VuZXJhbEVycm9yID0gYEVycm9yIGxvYWRpbmcgcmVzb3VyY2UgbWV0YWRhdGEgKCR7bWV0YUVycm9yLnN0YXR1c1RleHR9KWA7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGxheW91dFN0b3JlS2V5KTtcbiAgICAgIH0sXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5tZXRhTG9hZGluZztcbiAgICAgICAgdGhpcy5mb3JjZVVpVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjaGFuZ2VMYXlvdXQoKSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICBgdmdpcy5sYXlvdXRfJHt0aGlzLm1ldGFDb250ZXh0LnZnaXBVc2VySWR9XyR7dGhpcy5pbnRlZ3JhdGlvbkNvZGV9XyR7dGhpcy5yZXNvdXJjZS5yZXNvdXJjZVR5cGV9YCxcbiAgICAgIHRoaXMuY3VycmVudExheW91dElkXG4gICAgKTtcbiAgICB0aGlzLmxvYWRNZXRhZGF0YSh0aGlzLmN1cnJlbnRMYXlvdXRJZCk7XG4gIH1cblxuICBnZXREZXRhaWxzKCkge1xuICAgIGlmICh0aGlzLnJlc291cmNlICYmICh0aGlzLnJlc291cmNlLmV4dGVybmFsSWQgfHwgdGhpcy5yZXNvdXJjZS5pZCkpIHtcbiAgICAgIGlmICh0aGlzLnJlc291cmNlLnBhcmVudCAmJiB0aGlzLnJlc291cmNlLmFjdGl2aXR5IC8vIHNraXAgZmV0Y2hcbiAgICAgICAgJiYgdGhpcy5tZXRhLmxheW91dC5lZGl0YWJsZSA9PT0gZmFsc2UgJiYgIXRoaXMubWV0YS5sYXlvdXQuY2hpbGRyZW5cbiAgICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IHAgaW4gdGhpcy5yZXNvdXJjZS5hY3Rpdml0eSkge1xuICAgICAgICAgIGlmICh0aGlzLnJlc291cmNlLmFjdGl2aXR5W3BdICYmIHRoaXMuZmllbGROYW1lcy5pbmRleE9mKHApICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbFtwXSA9IHRoaXMucmVzb3VyY2UuYWN0aXZpdHlbcF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ1c3kgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlcnZpY2UuZ2V0RGV0YWlscyhcbiAgICAgICAgICAodGhpcy5yZXNvdXJjZS5leHRlcm5hbElkIHx8IHRoaXMucmVzb3VyY2UuaWQpLCB7XG4gICAgICAgICAgZXZlbnRJZDogdGhpcy5yZXNvdXJjZS5ldmVudElkICE9PSAnTk9fRVZFTlQnID8gdGhpcy5yZXNvdXJjZS5ldmVudElkIDogbnVsbCwgbGF5b3V0SWQ6IHRoaXMucmVzb3VyY2UubGF5b3V0SWRcbiAgICAgICAgfVxuICAgICAgICApLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc291cmNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG4gICAgICAgICAgICBpZiAocmVzb3VyY2UuX3ZnaXMpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc291cmNlLl92Z2lzLmV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1ldGFDb250ZXh0LnZnaXBFdmVudElkID0gcmVzb3VyY2UuX3ZnaXMuZXZlbnRJZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzb3VyY2UubGF5b3V0SWQgJiYgcmVzb3VyY2UuX3ZnaXMubGF5b3V0SWQgIT09IHRoaXMuY3VycmVudExheW91dElkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkTWV0YWRhdGEocmVzb3VyY2UuX3ZnaXMubGF5b3V0SWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgaW4gcmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocmVzb3VyY2VbcF0gIT09ICd1bmRlZmluZWQnKSAmJiAodGhpcy5maWVsZE5hbWVzLmluZGV4T2YocCkgIT09IC0xIHx8IHAgPT09ICdfdmdpcycpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbFtwXSA9IHJlc291cmNlW3BdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5idXN5O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChyZXNvdXJjZUVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYWxFcnJvciA9IHJlc291cmNlRXJyb3IuZXJyb3IgPyByZXNvdXJjZUVycm9yLmVycm9yLm1lc3NhZ2UgfHwgcmVzb3VyY2VFcnJvci5tZXNzYWdlIDogcmVzb3VyY2VFcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYnVzeTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcmNlVWlVcGRhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5yZXNvdXJjZS5yZWYgJiYgdGhpcy5yZXNvdXJjZS5yZWYuYWN0aXZpdHkpIHsgLy8gcmV1c2UgZmFpbGVkIGF1dG9hY3Rpdml0aWVzIGRhdGFcbiAgICAgICAgZm9yIChjb25zdCBwIGluIHRoaXMucmVzb3VyY2UucmVmLmFjdGl2aXR5KSB7XG4gICAgICAgICAgaWYgKHRoaXMucmVzb3VyY2UucmVmLmFjdGl2aXR5ICYmIHRoaXMuZmllbGROYW1lcy5pbmRleE9mKHApICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbFtwXSA9IHRoaXMucmVzb3VyY2UucmVmLmFjdGl2aXR5W3BdOyAvLyBWR0lTLTcyMTUgKGNvcHkgb25seSB2YWxpZCBmaWVsZHMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnBlcmZvcm1BdXRvRmlsbCgpO1xuICAgIH1cbiAgfVxuXG4gIHBlcmZvcm1BdXRvRmlsbCgpIHtcbiAgICB0aGlzLm1ldGFNc2dTZXJ2aWNlLnNlbmRNZXNzYWdlKFxuICAgICAgdGhpcy5pbnRlZ3JhdGlvbkNvZGUsXG4gICAgICB7XG4gICAgICAgIGFjdGlvbjogJ2F1dG9GaWxsJyxcbiAgICAgICAgaW50ZWdyYXRpb246IHRoaXMuaW50ZWdyYXRpb25Db2RlLFxuICAgICAgICByZXNvdXJjZVR5cGU6IHRoaXMucmVzb3VyY2VUeXBlLFxuICAgICAgICByZXNvdXJjZTogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm1vZGVsKSksXG4gICAgICAgIGZpZWxkczogdGhpcy5uaWNlRmllbGRzLFxuICAgICAgICBldmVudDogdGhpcy5tZXRhQ29udGV4dC5jb250ZXh0LFxuICAgICAgICBwcm9maWxlOiB0aGlzLm1ldGFDb250ZXh0LnByb2ZpbGVzW3RoaXMuaW50ZWdyYXRpb25Db2RlXVxuICAgICAgfSxcbiAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoIXJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBhZnAgaW4gcmVzcG9uc2UuYXV0b0ZpbGwpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5tb2RlbFthZnBdKSB7XG4gICAgICAgICAgICAgIHRoaXMubW9kZWxbYWZwXSA9IHJlc3BvbnNlLmF1dG9GaWxsW2FmcF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGdldEZpZWxkc01hcCgpIHtcbiAgICBpZiAodGhpcy5tZXRhLmZpZWxkc01hcCkge1xuICAgICAgdGhpcy5maWVsZHNNYXAgPSB0aGlzLm1ldGEuZmllbGRzTWFwO1xuICAgICAgdGhpcy5tYXJrQ29udGFjdGFibGVzKCk7XG4gICAgICB0aGlzLmJ1aWxkQ29udGFjdHNTdWdnZXN0aW9ucygpO1xuICAgICAgaWYgKCF0aGlzLnJlc291cmNlLmV4dGVybmFsSWQpIHtcbiAgICAgICAgdGhpcy5idWlsZFN1YmplY3RUZW1wbGF0ZSgpO1xuICAgICAgICB0aGlzLmV4ZWNUcmFuc2Zvcm1lcigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGFNc2dTZXJ2aWNlLnNlbmRNZXNzYWdlKFxuICAgICAgICB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgeyBhY3Rpb246ICdmaWVsZHNNYXAnLCBpbnRlZ3JhdGlvbjogdGhpcy5pbnRlZ3JhdGlvbkNvZGUsIHJlc291cmNlVHlwZTogdGhpcy5yZXNvdXJjZVR5cGUgfSxcbiAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKCFyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maWVsZHNNYXAgPSByZXNwb25zZS5maWVsZHNNYXA7XG4gICAgICAgICAgICB0aGlzLm1hcmtDb250YWN0YWJsZXMoKTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRDb250YWN0c1N1Z2dlc3Rpb25zKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzb3VyY2UuZXh0ZXJuYWxJZCkge1xuICAgICAgICAgICAgICB0aGlzLmJ1aWxkU3ViamVjdFRlbXBsYXRlKCk7XG4gICAgICAgICAgICAgIHRoaXMuZXhlY1RyYW5zZm9ybWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBmaWVsZHMgbWFwJywgdGhpcy5pbnRlZ3JhdGlvbkNvZGUsIHRoaXMucmVzb3VyY2VUeXBlLCByZXNwb25zZS5lcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5SZXNvdXJjZU1lbnUoKSB7XG4gICAgdGhpcy5yZXNvdXJjZU1lbnVWaXNpYmxlID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbk1lbnVDbGlja291dCk7XG4gICAgfSwgMTApO1xuICB9XG5cbiAgY2xvc2UocmVzdWx0Pykge1xuICAgIHRoaXMuZG9uZS5lbWl0KHJlc3VsdCk7XG4gIH1cblxuICBzaG93UGFyc2VkRXJyb3IocmVzb3VyY2VGb3JtLCBwYXJzZWRFcnJvcikge1xuICAgIHRoaXMuZm9ybUVycm9ycyA9IHBhcnNlZEVycm9yLm1lc3NhZ2UgfHwgJ1RoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIG9uZSBvciBtb3JlIGZpZWxkcyc7XG4gICAgaWYgKHBhcnNlZEVycm9yLmVycm9ycyAmJiBwYXJzZWRFcnJvci5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZvcm1FcnJvcnMgKz0gYCAoJHtwYXJzZWRFcnJvci5lcnJvcnMubWFwKGUgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpfSlgO1xuICAgICAgZm9yIChjb25zdCBwZSBvZiBwYXJzZWRFcnJvci5lcnJvcnMpIHtcbiAgICAgICAgaWYgKHJlc291cmNlRm9ybS5jb250cm9sc1twZS5maWVsZF0pIHtcbiAgICAgICAgICByZXNvdXJjZUZvcm0uY29udHJvbHNbcGUuZmllbGRdLnNldEVycm9ycyh7IGludmFsaWQ6IHRydWUsIGN1c3RvbTogcGUubWVzc2FnZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpcnN0SW52YWxpZDogSFRNTElucHV0RWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuVmx0LWZvcm1fX2VsZW1lbnQtLWVycm9yIC5tYWluOm5vdCguc3RhbmRhbG9uZSknKTtcbiAgICAgICAgaWYgKGZpcnN0SW52YWxpZCkge1xuICAgICAgICAgIGZpcnN0SW52YWxpZC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdWJtaXQocmVzb3VyY2VGb3JtKSB7XG4gICAgZGVsZXRlIHRoaXMuZm9ybUVycm9ycztcbiAgICByZXNvdXJjZUZvcm0uZm9ybS5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgIGlmIChyZXNvdXJjZUZvcm0udmFsaWQpIHtcbiAgICAgIHRoaXMuYnVzeSA9IHRydWU7XG4gICAgICBpZiAodGhpcy5tZXRhQ29udGV4dC52Z2lwRXZlbnRJZCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuICAgICAgICBpZiAoIXRoaXMubW9kZWwuX3ZnaXMpIHtcbiAgICAgICAgICB0aGlzLm1vZGVsLl92Z2lzID0ge1xuICAgICAgICAgICAgY29ubmVjdG9yOiB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgICAgIHJlc291cmNlVHlwZTogdGhpcy5yZXNvdXJjZVR5cGVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kZWwuX3ZnaXMubGF5b3V0SWQgPSB0aGlzLmN1cnJlbnRMYXlvdXRJZDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgLy8gdGhpcy5tb2RlbC5fdmdpcy50aW1lWm9uZU9mZnNldEluTWludXRlcyA9IDA7IC8vIHdlIGFyZSBub3QgcHJvdmlkaW5nIHRpbWV6b25lIGFueW1vcmUgKGFzIFYzKSwgaW5zdGVhZCB0aGUgJ3RpbWUnIGFuZCAnZGF0ZScgb2JqZWN0cyBhcmUgY29udmVydGVkIHNvIHRoZSBVVEMgdGltZS9kYXRlIGlzIGNvcnJlY3RcbiAgICAgICAgdGhpcy5tb2RlbC5fdmdpcy5ldmVudElkID0gdGhpcy5tZXRhQ29udGV4dC52Z2lwRXZlbnRJZDtcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuICAgICAgfVxuICAgICAgdGhpcy5zZXJ2aWNlLnNhdmUodGhpcy5tb2RlbCkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm1vZGVsID0gcmVzdWx0O1xuICAgICAgICB0aGlzLnJlc291cmNlLmV4dGVybmFsSWQgPSByZXN1bHQuX3ZnaXMuZXh0ZXJuYWxJZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuICAgICAgICB0aGlzLmlzUGVyc2lzdGVudCA9IHRydWU7XG4gICAgICAgIHRoaXMuY2xvc2UocmVzdWx0KTtcbiAgICAgICAgdGhpcy5lZGl0ID0gZmFsc2U7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmJ1c3k7XG4gICAgICB9LCAoZXJyb3JSZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKChlcnJvclJlc3VsdC5zdGF0dXMgPT09IDQyMiAmJiBlcnJvclJlc3VsdC5lcnJvciAmJiAhZXJyb3JSZXN1bHQuZXJyb3IuZXJyb3JzICYmIGVycm9yUmVzdWx0LmVycm9yLmludGVncmF0aW9uRXJyb3IpXG4gICAgICAgICAgfHwgKGVycm9yUmVzdWx0LmVycm9yICYmIGVycm9yUmVzdWx0LmVycm9yLmVycm9ycyAmJiBlcnJvclJlc3VsdC5lcnJvci5lcnJvcnMubGVuZ3RoICYmICFlcnJvclJlc3VsdC5lcnJvci5lcnJvcnNbMF0uZmllbGQpXG4gICAgICAgICAgLy8gYmFja2VuZCBpbXBsZW1lbnRlZCBlcnJvciBwYXJzaW5nIGJ1dCBicm9rZW4gVkdJUy03MzY2XG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuZm9ybUVycm9ycyA9ICdUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCBvbmUgb3IgbW9yZSBmaWVsZHMnO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLm1ldGFNc2dTZXJ2aWNlLnNlbmRNZXNzYWdlKFxuICAgICAgICAgICAgICB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3BhcnNlRXJyb3JNZXNzYWdlJyxcbiAgICAgICAgICAgICAgICBpbnRlZ3JhdGlvbkNvZGU6IHRoaXMuaW50ZWdyYXRpb25Db2RlLFxuICAgICAgICAgICAgICAgIHJlc291cmNlVHlwZTogZXJyb3JSZXN1bHQuZXJyb3IucmVzb3VyY2VUeXBlLFxuICAgICAgICAgICAgICAgIHJhd0Vycm9yOiBlcnJvclJlc3VsdC5lcnJvci5pbnRlZ3JhdGlvbkVycm9yLFxuICAgICAgICAgICAgICAgIHByb2ZpbGU6IHRoaXMubWV0YUNvbnRleHQucHJvZmlsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGUudG9VcHBlckNhc2UoKV1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnBhcnNlZEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNob3dQYXJzZWRFcnJvcihyZXNvdXJjZUZvcm0sIHJlc3BvbnNlLnBhcnNlZEVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVyc2NvcmUtZGFuZ2xlXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyBlcnJvciBwYXJzZXIgZm9yJywgdGhpcy5pbnRlZ3JhdGlvbkNvZGUsIGVycm9yUmVzdWx0LmVycm9yLmludGVncmF0aW9uRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtRXJyb3JzID0gZXJyb3JSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJy4uLi4nLCBlcnIpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3JSZXN1bHQuc3RhdHVzID09PSA0MjIpIHtcbiAgICAgICAgICB0aGlzLnNob3dQYXJzZWRFcnJvcihyZXNvdXJjZUZvcm0sIGVycm9yUmVzdWx0LmVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvcm1FcnJvcnMgPSBlcnJvclJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5idXN5O1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUVycm9ycyA9IE9iamVjdC5rZXlzKHJlc291cmNlRm9ybS5jb250cm9scylcbiAgICAgICAgLmZpbHRlcigoYykgPT4gcmVzb3VyY2VGb3JtLmNvbnRyb2xzW2NdLmludmFsaWQpXG4gICAgICAgIC5tYXAoKGYpID0+ICh0aGlzLm5pY2VGaWVsZHNbZl0gPyAodGhpcy5uaWNlRmllbGRzW2ZdLmxhYmVsIHx8IGYpIDogZikpLmpvaW4oJywgJyk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBgZm9ybVtuYW1lPVwiJHt0aGlzLnJlc291cmNlVHlwZX1cIl0gLlZsdC1mb3JtX19lbGVtZW50LS1lcnJvciAubWFpbjpub3QoLnN0YW5kYWxvbmUpYDtcbiAgICAgICAgY29uc3QgZmlyc3RJbnZhbGlkOiBIVE1MSW5wdXRFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICBpZiAoZmlyc3RJbnZhbGlkKSB7XG4gICAgICAgICAgZmlyc3RJbnZhbGlkLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRm9ybUVycm9ycygpIHtcbiAgICBkZWxldGUgdGhpcy5mb3JtRXJyb3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk1lbnVDbGlja291dCA9ICgpID0+IHtcbiAgICBkZWxldGUgdGhpcy5yZXNvdXJjZU1lbnVWaXNpYmxlO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbk1lbnVDbGlja291dCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBzdWdnZXN0RmllbGRQcm9wZXJ0eShrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSAmJiB2YWx1ZSkge1xuICAgICAgY29uc3QgZmllbGROYW1lcyA9IHRoaXMuZmllbGROYW1lcztcbiAgICAgIGlmICh0aGlzLm1vZGVsKSB7XG4gICAgICAgIGNvbnN0IG5lc3RNYXRjaCA9IGtleS5tYXRjaCgvKFxcUyspXFxbXFxkXFxdXFwuKFxcUyspLyk7XG4gICAgICAgIGlmIChuZXN0TWF0Y2ggJiYgZmllbGROYW1lcy5pbmRleE9mKG5lc3RNYXRjaFsxXSkgIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbFtuZXN0TWF0Y2hbMV1dID0gW107XG4gICAgICAgICAgY29uc3QgbmVzdEtleXM6IGFueSA9IHt9O1xuICAgICAgICAgIG5lc3RLZXlzW25lc3RNYXRjaFsyXV0gPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLm1vZGVsW25lc3RNYXRjaFsxXV0ucHVzaChuZXN0S2V5cyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGROYW1lcy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4ZWNUcmFuc2Zvcm1lcigpIHtcbiAgICBpZiAodGhpcy5tZXRhQ29udGV4dCAmJiB0aGlzLmZpZWxkc01hcCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3VnZ2VzdEZpZWxkUHJvcGVydHkodGhpcy5maWVsZHNNYXAucGhvbmVOdW1iZXIsIHRoaXMubWV0YUNvbnRleHQucGhvbmVOdW1iZXIpO1xuICAgICAgICBpZiAodGhpcy5maWVsZHNNYXAuZmlyc3ROYW1lIHx8IHRoaXMuZmllbGRzTWFwLmxhc3ROYW1lKSB7XG4gICAgICAgICAgY29uc3QgbmFtZXMgPSAodGhpcy5tZXRhQ29udGV4dC5kaXNwbGF5TmFtZSB8fCAnJykuc3BsaXQoJyAnKTtcbiAgICAgICAgICB0aGlzLnN1Z2dlc3RGaWVsZFByb3BlcnR5KHRoaXMuZmllbGRzTWFwLmZpcnN0TmFtZSwgbmFtZXNbMF0pO1xuICAgICAgICAgIHRoaXMuc3VnZ2VzdEZpZWxkUHJvcGVydHkodGhpcy5maWVsZHNNYXAubGFzdE5hbWUsIG5hbWVzWzFdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZpZWxkc01hcC5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHRoaXMuc3VnZ2VzdEZpZWxkUHJvcGVydHkodGhpcy5maWVsZHNNYXAuZGlzcGxheU5hbWUsIHRoaXMubWV0YUNvbnRleHQuZGlzcGxheU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWFya0NvbnRhY3RhYmxlcygpIHtcbiAgICBpZiAodGhpcy5maWVsZHNNYXAuY29udGFjdGFibGVzICYmIHRoaXMuZmllbGRzTWFwLmNvbnRhY3RhYmxlcy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmZpZWxkc01hcC5jb250YWN0YWJsZXMpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLm5pY2VGaWVsZHNbY107XG4gICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWVsZCwgJyRpc0NvbnRhY3RhYmxlJywge1xuICAgICAgICAgICAgdmFsdWU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFN1YmplY3RUZW1wbGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMubW9kZWxbdGhpcy5maWVsZHNNYXAuc3ViamVjdF0gJiYgdGhpcy5maWVsZHNNYXAuc3ViamVjdCAmJiB0aGlzLm5pY2VGaWVsZHNbdGhpcy5maWVsZHNNYXAuc3ViamVjdF0pIHtcbiAgICAgIGxldCBzdWJqZWN0VGVtcGxhdGU6IHN0cmluZztcbiAgICAgIGlmICh0aGlzLm5pY2VGaWVsZHNbdGhpcy5maWVsZHNNYXAuc3ViamVjdF0uZGVmYXVsdCkge1xuICAgICAgICBzdWJqZWN0VGVtcGxhdGUgPSB0aGlzLm5pY2VGaWVsZHNbdGhpcy5maWVsZHNNYXAuc3ViamVjdF0uZGVmYXVsdC5pZCB8fCB0aGlzLm5pY2VGaWVsZHNbdGhpcy5maWVsZHNNYXAuc3ViamVjdF0uZGVmYXVsdDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tZXRhQ29udGV4dC5wcm9maWxlc1t0aGlzLmludGVncmF0aW9uQ29kZV0pIHtcbiAgICAgICAgY29uc3QgcHJvZmlsZSA9IHRoaXMubWV0YUNvbnRleHQucHJvZmlsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGVdIHx8IHt9O1xuICAgICAgICBzdWJqZWN0VGVtcGxhdGUgPSBwcm9maWxlLmRlZmF1bHRTdWJqZWN0ID9cbiAgICAgICAgICBwcm9maWxlLmRlZmF1bHRTdWJqZWN0WygodGhpcy5tZXRhQ29udGV4dC5jb250ZXh0IHx8ICdDQUxMJykudHlwZSB8fCAnJykudG9VcHBlckNhc2UoKV0gOlxuICAgICAgICAgIHByb2ZpbGUuYWN0aXZpdHlEZWZhdWx0U3ViamVjdFRlbXBsYXRlO1xuICAgICAgfVxuICAgICAgaWYgKHN1YmplY3RUZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLm1vZGVsW3RoaXMuZmllbGRzTWFwLnN1YmplY3RdID0gdGVtcGxhdGVCdWlsZGVyKHRoaXMubWV0YUNvbnRleHQsIHN1YmplY3RUZW1wbGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENvbnRhY3RzU3VnZ2VzdGlvbnMoKSB7XG4gICAgLy8gbGV0IGhhc0RlZmF1bHRDb250YWN0ID0gZmFsc2U7XG4gICAgaWYgKHRoaXMubWV0YUNvbnRleHQuY29udGFjdGFibGVzW3RoaXMuaW50ZWdyYXRpb25Db2RlXSAmJiB0aGlzLm1ldGEubGF5b3V0ICYmIHRoaXMubWV0YS5sYXlvdXQuc2VjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLm1ldGEubGF5b3V0LnNlY3Rpb25zKSB7XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiAocy5maWVsZHMgfHwgW10pKSB7XG4gICAgICAgICAgaWYgKGYudHlwZSA9PT0gJ3JlZmVyZW5jZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZlR5cGVzID0gKGYucmVmZXJlbmNlLmxlbmd0aCA/IGYucmVmZXJlbmNlIDogW2YucmVmZXJlbmNlXSkubWFwKHIgPT4gci5uYW1lKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLm1ldGFDb250ZXh0LmNvbnRhY3RhYmxlc1t0aGlzLmludGVncmF0aW9uQ29kZV0pIHtcbiAgICAgICAgICAgICAgaWYgKHJlZlR5cGVzLmluZGV4T2YoYy5yZXNvdXJjZVR5cGUgfHwgYy50eXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWYuc3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgIGYuc3VnZ2VzdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZi5zdWdnZXN0aW9ucyA9IGYuc3VnZ2VzdGlvbnMuZmlsdGVyKHNnID0+ICFzZy5hdXRvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHRMYWJlbCA9IGMuZGlzcGxheU5hbWUgfHwgYy5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChjLnBob25lTnVtYmVycykge1xuICAgICAgICAgICAgICAgICAgdExhYmVsICs9ICgnIOKchicgKyBjLnBob25lTnVtYmVycy5tYXAocCA9PiBwLnBob25lTnVtYmVyKS5qb2luKCcsJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmLnN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgaWQ6IGMuZXh0ZXJuYWxJZCB8fCBjLmlkZW50aWZpZXIgfHwgYy5pZCxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB0TGFiZWwsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBjLnJlc291cmNlVHlwZSB8fCBjLnR5cGUsXG4gICAgICAgICAgICAgICAgICBhdXRvOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGhpcy5maWVsZHNNYXAuY29udGFjdGFibGVzIHx8IFtdKS5pbmRleE9mKGYubmFtZSkgIT09IC0xKSB7IC8vIGV2YWx1YXRlIHVzYWJpbGl0eT9cbiAgICAgICAgICAgICAgZi5hbHdheXNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIChcbiAgICAgICAgICAgIC8vICAgIWhhc0RlZmF1bHRDb250YWN0ICYmIHRoaXMubWV0YUNvbnRleHQuZGVmYXVsdENvbnRhY3RhYmxlc1t0aGlzLmludGVncmF0aW9uQ29kZV1cbiAgICAgICAgICAgIC8vICAgJiYgcmVmVHlwZXMuaW5kZXhPZih0aGlzLm1ldGFDb250ZXh0LmRlZmF1bHRDb250YWN0YWJsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGVdLnR5cGUpICE9PSAtMVxuICAgICAgICAgICAgLy8gKSB7XG4gICAgICAgICAgICAvLyAgIHRoaXMucmVzb3VyY2VbZi5uYW1lXSA9IHRoaXMubWV0YUNvbnRleHQuZGVmYXVsdENvbnRhY3RhYmxlc1t0aGlzLmludGVncmF0aW9uQ29kZV07XG4gICAgICAgICAgICAvLyAgIGhhc0RlZmF1bHRDb250YWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAoIWhhc0RlZmF1bHRDb250YWN0ICYmIHRoaXMuZmllbGRzTWFwLmNvbnRhY3RhYmxlcyAmJiBmLnN1Z2dlc3Rpb25zICYmIGYuc3VnZ2VzdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAvLyAgIGlmICh0aGlzLmZpZWxkc01hcC5jb250YWN0YWJsZXMuaW5kZXhPZihmLm5hbWUpICE9PSAtMSAmJiAhZi5kZWZhdWx0KSB7XG4gICAgICAgICAgICAvLyAgICAgZi5kZWZhdWx0ID0gZi5zdWdnZXN0aW9uc1swXTtcbiAgICAgICAgICAgIC8vICAgICBoYXNEZWZhdWx0Q29udGFjdCA9IHRydWU7XG4gICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGFjdHNTdWdnZXN0aW9uc0RvbmUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlUaGVtZSgpIHtcbiAgICBjb25zdCBtZXRhVGhlbWUgPSB0aGlzLnRoZW1lID09PSAnZGFyaycgPyBtZXRhRGFyayA6IG1ldGFMaWdodDtcbiAgICBjb25zb2xlLmxvZygncmVzb3VyY2UgYXBwbHkgdGhlbWUnLCB0aGlzLnRoZW1lKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtZXRhVGhlbWUucHJvcGVydGllcykpIHtcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShrZXksIG1ldGFUaGVtZS5wcm9wZXJ0aWVzW2tleV0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9yY2VVaVVwZGF0ZSgpIHsgLy8gaU9TIHdlYnZpZXcgZG9lcyBub3QgdXBkYXRlIHRoZSBVSSBhZnRlciBhc3ljIGNoYW5nZXMuIFRlbXAgZml4IDooXG4gICAgLy8gdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnRzJyk7XG4gICAgZS5pbml0RXZlbnQoJ2NsaWNrJywgdHJ1ZSwgZmFsc2UpO1xuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KGUpO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPSdnZW5lcmFsRXJyb3InIGNsYXNzPVwiVmx0LWNhbGxvdXQgVmx0LWNhbGxvdXQtLWNyaXRpY2FsXCIgc3R5bGU9J292ZXJmbG93OiBhdXRvOyBtYXJnaW46IDIwcHg7Jz5cblx0PGk+PC9pPlxuXHQ8ZGl2IGNsYXNzPVwiVmx0LWNhbGxvdXRfX2NvbnRlbnRcIj5cblx0XHQ8cD57e2dlbmVyYWxFcnJvcn19PC9wPlxuXHQ8L2Rpdj5cbjwvZGl2PlxuPGRpdiAqbmdJZj0nIW1ldGEnIGNsYXNzPVwiVmx0LXByb2dyZXNzXCI+XG5cdDxkaXYgY2xhc3M9XCJWbHQtcHJvZ3Jlc3NfX2JhclwiIFtuZ0NsYXNzXT1cInsgbG9hZGluZzogbWV0YUxvYWRpbmcgfVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZXRleHQ9XCJMb2FkaW5nIE1ldGFkYXRhXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiPjwvZGl2PlxuPC9kaXY+XG48Zm9ybSBbdmdpcE1ldGFGb3JtQXV0b2ZvY3VzXT0nIXJlc291cmNlIHx8ICFyZXNvdXJjZS5leHRlcm5hbElkJyAqbmdJZj0nbWV0YSAmJiAhZ2VuZXJhbEVycm9yJyAjcmVzb3VyY2VGb3JtPVwibmdGb3JtXCIgW25hbWVdPSdyZXNvdXJjZS5yZXNvdXJjZVR5cGUnIChuZ1N1Ym1pdCk9J3N1Ym1pdChyZXNvdXJjZUZvcm0pJyBub3ZhbGlkYXRlPlxuXHQ8ZGl2IGNsYXNzPSdmb3JtLWNvbnRlbnQnIHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuOyc+XG5cdFx0PGRpdiBbbmdDbGFzc109XCJ7ICdWbHQtY2FsbG91dC0tZGlzbWlzc2VkJzogIWZvcm1FcnJvcnMgfVwiIGNsYXNzPVwiVmx0LWNhbGxvdXQgVmx0LWNhbGxvdXQtLWJhbm5lciBWbHQtY2FsbG91dC0tY3JpdGljYWxcIj5cblx0XHRcdDxpPjwvaT5cblx0XHRcdDxkaXYgY2xhc3M9XCJWbHQtY2FsbG91dF9fY29udGVudFwiIHN0eWxlPVwibWFyZ2luLXRvcDogYXV0bztcIj5cblx0XHRcdFx0PHA+VGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggb25lIG9yIG1vcmUgZmllbGRzPC9wPlxuXHRcdFx0XHQ8c21hbGwgc3R5bGU9J2ZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMS4wZW07JyAqbmdJZj0nZm9ybUVycm9ycyc+e3sgZm9ybUVycm9ycy5tZXNzYWdlIHx8IGZvcm1FcnJvcnMgfX08L3NtYWxsPlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9XCJWbHQtY2FsbG91dF9fZGlzbWlzc1wiIChjbGljayk9J2NsZWFyRm9ybUVycm9ycygpJyBhcmlhLWxhYmVsPVwiRGlzbWlzc1wiPjwvYnV0dG9uPlxuXHRcdDwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJWbHQtY2FyZF9fY29udGVudFwiIHN0eWxlPSdtaW4taGVpZ2h0OiA0MHB4Oyc+XG5cdFx0XHQ8dmdpcC1tZXRhLWxheW91dCAqbmdJZj0nZWRpdCcgW21ldGFdPSdtZXRhLmxheW91dCcgW3Jlc291cmNlXT0nbW9kZWwnIFtwcmV2aWV3XT0nZmFsc2UnIFtpbnRlZ3JhdGlvbl09J21ldGEuaW50ZWdyYXRpb24nIFt0eXBlXT0ncmVzb3VyY2UucmVzb3VyY2VUeXBlJyB0aGVtZT0naW5oZXJpdCc+PC92Z2lwLW1ldGEtbGF5b3V0PlxuXHRcdFx0PHZnaXAtbWV0YS1sYXlvdXQgKm5nSWY9JyFlZGl0JyBbbWV0YV09J21ldGEubGF5b3V0JyBbcmVzb3VyY2VdPSdtb2RlbCcgW3ByZXZpZXddPSd0cnVlJyBbaW50ZWdyYXRpb25dPSdtZXRhLmludGVncmF0aW9uJyBbdHlwZV09J3Jlc291cmNlLnJlc291cmNlVHlwZScgdGhlbWU9J2luaGVyaXQnPjwvdmdpcC1tZXRhLWxheW91dD5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJWbHQtY2FyZF9fZm9vdGVyXCI+XG5cdFx0PGJ1dHRvbiBjbGFzcz1cIlZsdC1idG4gVmx0LWJ0bi0tc2Vjb25kYXJ5IFZsdC1idG4tLWFwcCBWbHQtYnRuLS1vdXRsaW5lXCIgdHlwZT0nYnV0dG9uJyBhcmlhLWxhYmVsPSdDYW5jZWwnIChjbGljayk9J2Nsb3NlKCknPlxuXHRcdFx0e3sgZWRpdCA/ICdDYW5jZWwnIDogJ0Nsb3NlJyB9fVxuXHRcdDwvYnV0dG9uPlxuXHRcdDxidXR0b24gKm5nSWY9J2VkaXQnIGNsYXNzPVwiVmx0LWJ0biBWbHQtYnRuLS1hcHBcIiBbbmdDbGFzc109XCJ7ICdWbHQtYnRuLS1wcmltYXJ5JzogaXNQZXJzaXN0ZW50LCAnVmx0LWJ0bi0tc2Vjb25kYXJ5JzogIWlzUGVyc2lzdGVudCB9XCIgdHlwZT0nc3VibWl0Jz5cblx0XHRcdHt7IChyZXNvdXJjZSAmJiByZXNvdXJjZS5leHRlcm5hbElkKSA/ICdVcGRhdGUnIDogJ0NyZWF0ZScgfX1cblx0XHQ8L2J1dHRvbj5cblx0XHQ8YnV0dG9uIChjbGljayk9J3NldEVkaXRNb2RlKCknICpuZ0lmPSchZWRpdCAmJiBpc0VkaXRhYmxlJyBbZGlzYWJsZWRdPSchaXNFZGl0YWJsZScgY2xhc3M9XCJWbHQtYnRuIFZsdC1idG4tLWFwcCBWbHQtYnRuLS1wcmltYXJ5XCIgdHlwZT0nYnV0dG9uJyBhcmlhLWxhYmVsPSdFZGl0Jz5cblx0XHRcdEVkaXRcblx0XHQ8L2J1dHRvbj5cblx0XHQ8ZGl2IHN0eWxlPSdtYXJnaW4tcmlnaHQ6IDhweDsgZmxleDogMTsnPlxuXHRcdFx0PGRpdiAqbmdJZj0nbWV0YS5hdmFpbGFibGVMYXlvdXRzICYmIG1ldGEuYXZhaWxhYmxlTGF5b3V0cy5sZW5ndGgnIGNsYXNzPVwiVmx0LWZvcm1fX2VsZW1lbnQgVmx0LWZvcm1fX2VsZW1lbnQtLWJpZ1wiIHN0eWxlPSdwYWRkaW5nOiAwOyBtYXJnaW46IC04cHggLTE4cHggLThweCAwOyc+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJWbHQtc2VsZWN0XCI+XG5cdFx0XHRcdFx0PGxhYmVsIHN0eWxlPSdhbGw6IGluaGVyaXQ7Jz5cblx0XHRcdFx0XHRcdDxzZWxlY3Qgc3R5bGU9J2JvcmRlcjogMDsgbWFyZ2luLXRvcDogM3B4OyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsnIChjaGFuZ2UpPSdjaGFuZ2VMYXlvdXQoKScgWyhuZ01vZGVsKV09J2N1cnJlbnRMYXlvdXRJZCcgW25nTW9kZWxPcHRpb25zXT0neyBzdGFuZGFsb25lOiB0cnVlIH0nIFtkaXNhYmxlZF09J2lzUGVyc2lzdGVudCc+XG5cdFx0XHRcdFx0XHRcdDxvcHRpb24gc2VsZWN0ZWQgZGlzYWJsZWQ+U2VsZWN0IGxheW91dDwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHQ8b3B0aW9uICpuZ0Zvcj0nbGV0IGxheW91dCBvZiBtZXRhLmF2YWlsYWJsZUxheW91dHMnIFtuZ1ZhbHVlXT0nbGF5b3V0LmlkJz57e2xheW91dC5uYW1lfX08L29wdGlvbj5cblx0XHRcdFx0XHRcdDwvc2VsZWN0PlxuXHRcdFx0XHRcdFx0PGxhYmVsPkxheW91dDwvbGFiZWw+XG5cdFx0XHRcdFx0PC9sYWJlbD5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0XHQ8ZGl2IGNsYXNzPVwiVmx0LWRyb3Bkb3duIHJlc291cmNlLW1lbnVcIiBbbmdDbGFzc109XCJ7ICdWbHQtZHJvcGRvd24tLWV4cGFuZGVkJzogcmVzb3VyY2VNZW51VmlzaWJsZSB9XCIgc3R5bGU9J21hcmdpbi1sZWZ0OiAycHg7Jz5cblx0XHRcdDxkaXYgY2xhc3M9XCJWbHQtZHJvcGRvd25fX3BhbmVsXCIgc3R5bGU9J2JvdHRvbTogNDBweDsgcmlnaHQ6IC00cHg7IHRvcDogaW5pdGlhbDsnPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiVmx0LWRyb3Bkb3duX19wYW5lbF9fY29udGVudFwiPlxuXHRcdFx0XHRcdDxhIGNsYXNzPVwiVmx0LWRyb3Bkb3duX19saW5rXCIgKGNsaWNrKT0nbG9hZE1ldGFkYXRhKGN1cnJlbnRMYXlvdXRJZCwgdHJ1ZSknPlxuXHRcdFx0XHRcdFx0PGRpdj5cblx0XHRcdFx0XHRcdFx0PHN2ZyBjbGFzcz0nVmx0LWljb24gVmx0LWljb24tLXNtYWxsZXInPjx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1yZWZyZXNoXCIvPjwvc3ZnPiZuYnNwOyZuYnNwO1JlZnJlc2ggbWV0YWRhdGFcblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvYT5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJWbHQtZHJvcGRvd25fX3RyaWdnZXJcIj5cblx0XHRcdFx0PGJ1dHRvbiB0eXBlPSdidXR0b24nIChjbGljayk9J29wZW5SZXNvdXJjZU1lbnUoKScgY2xhc3M9XCJWbHQtYnRuIFZsdC1idG4tLWxpbmtcIiBhcmlhLWxhYmVsPSdSZXNvdXJjZSBtZW51Jz5cblx0XHRcdFx0XHQ8c3ZnIGNsYXNzPSdWbHQtaWNvbiBWbHQtaWNvbi0tc21hbGwnIHN0eWxlPSdtYXJnaW46IDA7Jz48dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tbW9yZS12LW5lZ2F0aXZlXCIvPjwvc3ZnPlxuXHRcdFx0XHQ8L2J1dHRvbj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cbjwvZm9ybT5cbjxkaXYgY2xhc3M9J2J1c3ktbWFzaycgW25nQ2xhc3NdPVwieyBhY3RpdmU6IGJ1c3kgfVwiPlxuXHQ8ZGl2IHN0eWxlPSdoZWlnaHQ6IDEwMCU7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyc+XG5cdFx0PGRpdiBjbGFzcz1cIlZsdC1zcGlubmVyXCI+PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+XG4iXX0=