@lenne.tech/ng-base 15.0.0-beta-3 → 16.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/base-components/base-components.module.d.ts +1 -2
  2. package/base-components/components/checkbox/checkbox.component.d.ts +1 -1
  3. package/base-components/components/delete-account/delete-account.component.d.ts +1 -1
  4. package/base-components/components/fab-button/fab-button.component.d.ts +1 -1
  5. package/base-components/components/input/input.component.d.ts +1 -1
  6. package/base-components/components/loading-bar/loading-bar.component.d.ts +1 -1
  7. package/base-components/components/model-form/model-form-base.component.d.ts +1 -1
  8. package/base-components/components/model-form/model-form.component.d.ts +1 -1
  9. package/base-components/components/model-form-sub/model-form-sub.component.d.ts +1 -1
  10. package/base-components/components/model-table/model-table.component.d.ts +1 -1
  11. package/base-components/components/refence-input/refence-input.component.d.ts +1 -1
  12. package/base-components/components/select/select.component.d.ts +1 -1
  13. package/base-components/components/skeleton-loader/skeleton-loader.component.d.ts +1 -1
  14. package/base-components/components/tags/tags.component.d.ts +1 -1
  15. package/base-components/components/textarea/textarea.component.d.ts +1 -1
  16. package/base-components/components/toast/toast.component.d.ts +1 -1
  17. package/base-components/components/upload-image/upload-image.component.d.ts +1 -1
  18. package/base-components/directives/context-menu.directive.d.ts +1 -1
  19. package/base-components/directives/sort.directive.d.ts +1 -1
  20. package/base-prototype/pages/login/login.component.d.ts +1 -1
  21. package/base-prototype/pages/profile/profile.component.d.ts +1 -1
  22. package/base-prototype/pages/set-password/set-password.component.d.ts +1 -1
  23. package/esm2022/base-cms/base-cms-routing.module.mjs +33 -0
  24. package/esm2022/base-cms/base-cms.module.mjs +61 -0
  25. package/esm2022/base-cms/pages/base-cms/base-cms.component.mjs +233 -0
  26. package/esm2022/base-components/base-components.module.mjs +123 -0
  27. package/esm2022/base-components/components/breadcrumb/breadcrumb.component.mjs +21 -0
  28. package/esm2022/base-components/components/change-password/change-password.component.mjs +96 -0
  29. package/esm2022/base-components/components/checkbox/checkbox.component.mjs +35 -0
  30. package/esm2022/base-components/components/delete-account/delete-account.component.mjs +61 -0
  31. package/esm2022/base-components/components/fab-button/fab-button.component.mjs +21 -0
  32. package/esm2022/base-components/components/input/input.component.mjs +72 -0
  33. package/esm2022/base-components/components/loading-bar/loading-bar.component.mjs +39 -0
  34. package/esm2022/base-components/components/model-form/model-form-base.component.mjs +145 -0
  35. package/esm2022/base-components/components/model-form/model-form.component.mjs +585 -0
  36. package/esm2022/base-components/components/model-form-sub/model-form-sub.component.mjs +111 -0
  37. package/esm2022/base-components/components/model-table/model-table.component.mjs +470 -0
  38. package/esm2022/base-components/components/refence-input/refence-input.component.mjs +273 -0
  39. package/esm2022/base-components/components/select/select.component.mjs +59 -0
  40. package/esm2022/base-components/components/skeleton-loader/skeleton-loader.component.mjs +32 -0
  41. package/esm2022/base-components/components/tags/tags.component.mjs +224 -0
  42. package/esm2022/base-components/components/textarea/textarea.component.mjs +76 -0
  43. package/esm2022/base-components/components/toast/toast.component.mjs +70 -0
  44. package/esm2022/base-components/components/upload-image/upload-image.component.mjs +343 -0
  45. package/esm2022/base-components/directives/back-button.directive.mjs +25 -0
  46. package/esm2022/base-components/directives/context-menu.directive.mjs +112 -0
  47. package/esm2022/base-components/directives/sort.directive.mjs +61 -0
  48. package/esm2022/base-components/directives/stop-propagation.directive.mjs +24 -0
  49. package/esm2022/base-components/pipes/ellipses.pipe.mjs +23 -0
  50. package/esm2022/base-prototype/base-prototype.module.mjs +54 -0
  51. package/esm2022/base-prototype/pages/email-verification/email-verification.component.mjs +62 -0
  52. package/esm2022/base-prototype/pages/forgot-password/forgot-password.component.mjs +75 -0
  53. package/esm2022/base-prototype/pages/login/login.component.mjs +111 -0
  54. package/esm2022/base-prototype/pages/profile/profile.component.mjs +86 -0
  55. package/esm2022/base-prototype/pages/register/register.component.mjs +94 -0
  56. package/esm2022/base-prototype/pages/set-password/set-password.component.mjs +90 -0
  57. package/esm2022/shared/classes/auth.class.mjs +14 -0
  58. package/esm2022/shared/classes/basic-user.class.mjs +49 -0
  59. package/esm2022/shared/classes/graphql-enum.class.mjs +10 -0
  60. package/esm2022/shared/classes/graphql-meta.class.mjs +345 -0
  61. package/esm2022/shared/classes/graphql-type.class.mjs +14 -0
  62. package/esm2022/shared/classes/sort.class.mjs +38 -0
  63. package/esm2022/shared/services/auth.service.mjs +153 -0
  64. package/esm2022/shared/services/breadcrumb.service.mjs +70 -0
  65. package/{esm2020 → esm2022}/shared/services/cms.service.mjs +7 -5
  66. package/esm2022/shared/services/file.service.mjs +87 -0
  67. package/esm2022/shared/services/forms.service.mjs +62 -0
  68. package/esm2022/shared/services/graphql-meta.service.mjs +133 -0
  69. package/esm2022/shared/services/graphql-plus.service.mjs +94 -0
  70. package/esm2022/shared/services/graphql.service.mjs +511 -0
  71. package/esm2022/shared/services/image.service.mjs +103 -0
  72. package/esm2022/shared/services/loader.service.mjs +79 -0
  73. package/esm2022/shared/services/navigation.service.mjs +39 -0
  74. package/esm2022/shared/services/scroll.service.mjs +208 -0
  75. package/esm2022/shared/services/storage.service.mjs +142 -0
  76. package/esm2022/shared/services/toast.service.mjs +40 -0
  77. package/esm2022/shared/services/user.service.mjs +161 -0
  78. package/esm2022/shared/services/ws.service.mjs +18 -0
  79. package/esm2022/src/base.module.mjs +98 -0
  80. package/esm2022/src/directives/lazy-load.directive.mjs +48 -0
  81. package/esm2022/src/directives/match-height.directive.mjs +92 -0
  82. package/esm2022/src/directives/resizable.directive.mjs +92 -0
  83. package/esm2022/src/functions/extract-files.function.mjs +87 -0
  84. package/esm2022/src/guards/auth.guard.mjs +92 -0
  85. package/esm2022/src/guards/can-deactivate.guard.mjs +17 -0
  86. package/esm2022/src/guards/logout.guard.mjs +35 -0
  87. package/esm2022/src/pipes/date-ago.pipe.mjs +64 -0
  88. package/esm2022/src/pipes/safe-html.pipe.mjs +23 -0
  89. package/esm2022/src/services/fullscreen.service.mjs +52 -0
  90. package/esm2022/src/services/seo.service.mjs +100 -0
  91. package/esm2022/src/services/theme.service.mjs +45 -0
  92. package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-cms.mjs +41 -30
  93. package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-cms.mjs.map +1 -1
  94. package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-components.mjs +421 -300
  95. package/fesm2022/lenne.tech-ng-base-base-components.mjs.map +1 -0
  96. package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-prototype.mjs +127 -88
  97. package/fesm2022/lenne.tech-ng-base-base-prototype.mjs.map +1 -0
  98. package/{fesm2020 → fesm2022}/lenne.tech-ng-base-shared.mjs +164 -113
  99. package/{fesm2020 → fesm2022}/lenne.tech-ng-base-shared.mjs.map +1 -1
  100. package/{fesm2020 → fesm2022}/lenne.tech-ng-base.mjs +153 -126
  101. package/fesm2022/lenne.tech-ng-base.mjs.map +1 -0
  102. package/package.json +23 -38
  103. package/src/directives/lazy-load.directive.d.ts +1 -1
  104. package/src/directives/match-height.directive.d.ts +1 -1
  105. package/src/directives/resizable.directive.d.ts +1 -1
  106. package/src/guards/auth.guard.d.ts +4 -3
  107. package/src/guards/can-deactivate.guard.d.ts +1 -2
  108. package/src/guards/logout.guard.d.ts +2 -2
  109. package/esm2020/base-cms/base-cms-routing.module.mjs +0 -32
  110. package/esm2020/base-cms/base-cms.module.mjs +0 -59
  111. package/esm2020/base-cms/pages/base-cms/base-cms.component.mjs +0 -222
  112. package/esm2020/base-components/base-components.module.mjs +0 -123
  113. package/esm2020/base-components/components/breadcrumb/breadcrumb.component.mjs +0 -18
  114. package/esm2020/base-components/components/change-password/change-password.component.mjs +0 -90
  115. package/esm2020/base-components/components/checkbox/checkbox.component.mjs +0 -31
  116. package/esm2020/base-components/components/delete-account/delete-account.component.mjs +0 -56
  117. package/esm2020/base-components/components/fab-button/fab-button.component.mjs +0 -21
  118. package/esm2020/base-components/components/input/input.component.mjs +0 -67
  119. package/esm2020/base-components/components/loading-bar/loading-bar.component.mjs +0 -35
  120. package/esm2020/base-components/components/model-form/model-form-base.component.mjs +0 -136
  121. package/esm2020/base-components/components/model-form/model-form.component.mjs +0 -564
  122. package/esm2020/base-components/components/model-form-sub/model-form-sub.component.mjs +0 -102
  123. package/esm2020/base-components/components/model-table/model-table.component.mjs +0 -456
  124. package/esm2020/base-components/components/refence-input/refence-input.component.mjs +0 -261
  125. package/esm2020/base-components/components/select/select.component.mjs +0 -54
  126. package/esm2020/base-components/components/skeleton-loader/skeleton-loader.component.mjs +0 -32
  127. package/esm2020/base-components/components/tags/tags.component.mjs +0 -218
  128. package/esm2020/base-components/components/textarea/textarea.component.mjs +0 -72
  129. package/esm2020/base-components/components/toast/toast.component.mjs +0 -68
  130. package/esm2020/base-components/components/upload-image/upload-image.component.mjs +0 -324
  131. package/esm2020/base-components/directives/back-button.directive.mjs +0 -23
  132. package/esm2020/base-components/directives/context-menu.directive.mjs +0 -108
  133. package/esm2020/base-components/directives/sort.directive.mjs +0 -57
  134. package/esm2020/base-components/directives/stop-propagation.directive.mjs +0 -23
  135. package/esm2020/base-components/pipes/ellipses.pipe.mjs +0 -22
  136. package/esm2020/base-prototype/base-prototype.module.mjs +0 -53
  137. package/esm2020/base-prototype/pages/email-verification/email-verification.component.mjs +0 -55
  138. package/esm2020/base-prototype/pages/forgot-password/forgot-password.component.mjs +0 -67
  139. package/esm2020/base-prototype/pages/login/login.component.mjs +0 -102
  140. package/esm2020/base-prototype/pages/profile/profile.component.mjs +0 -81
  141. package/esm2020/base-prototype/pages/register/register.component.mjs +0 -86
  142. package/esm2020/base-prototype/pages/set-password/set-password.component.mjs +0 -82
  143. package/esm2020/shared/classes/auth.class.mjs +0 -17
  144. package/esm2020/shared/classes/basic-user.class.mjs +0 -52
  145. package/esm2020/shared/classes/graphql-enum.class.mjs +0 -9
  146. package/esm2020/shared/classes/graphql-meta.class.mjs +0 -344
  147. package/esm2020/shared/classes/graphql-type.class.mjs +0 -17
  148. package/esm2020/shared/classes/sort.class.mjs +0 -40
  149. package/esm2020/shared/services/auth.service.mjs +0 -148
  150. package/esm2020/shared/services/breadcrumb.service.mjs +0 -68
  151. package/esm2020/shared/services/file.service.mjs +0 -84
  152. package/esm2020/shared/services/forms.service.mjs +0 -59
  153. package/esm2020/shared/services/graphql-meta.service.mjs +0 -123
  154. package/esm2020/shared/services/graphql-plus.service.mjs +0 -89
  155. package/esm2020/shared/services/graphql.service.mjs +0 -507
  156. package/esm2020/shared/services/image.service.mjs +0 -102
  157. package/esm2020/shared/services/loader.service.mjs +0 -79
  158. package/esm2020/shared/services/navigation.service.mjs +0 -36
  159. package/esm2020/shared/services/scroll.service.mjs +0 -179
  160. package/esm2020/shared/services/storage.service.mjs +0 -140
  161. package/esm2020/shared/services/toast.service.mjs +0 -41
  162. package/esm2020/shared/services/user.service.mjs +0 -155
  163. package/esm2020/shared/services/ws.service.mjs +0 -16
  164. package/esm2020/src/base.module.mjs +0 -97
  165. package/esm2020/src/directives/lazy-load.directive.mjs +0 -45
  166. package/esm2020/src/directives/match-height.directive.mjs +0 -84
  167. package/esm2020/src/directives/resizable.directive.mjs +0 -90
  168. package/esm2020/src/functions/extract-files.function.mjs +0 -84
  169. package/esm2020/src/guards/auth.guard.mjs +0 -80
  170. package/esm2020/src/guards/can-deactivate.guard.mjs +0 -16
  171. package/esm2020/src/guards/logout.guard.mjs +0 -32
  172. package/esm2020/src/pipes/date-ago.pipe.mjs +0 -65
  173. package/esm2020/src/pipes/safe-html.pipe.mjs +0 -21
  174. package/esm2020/src/services/fullscreen.service.mjs +0 -51
  175. package/esm2020/src/services/seo.service.mjs +0 -97
  176. package/esm2020/src/services/theme.service.mjs +0 -43
  177. package/fesm2015/lenne.tech-ng-base-base-cms.mjs +0 -323
  178. package/fesm2015/lenne.tech-ng-base-base-cms.mjs.map +0 -1
  179. package/fesm2015/lenne.tech-ng-base-base-components.mjs +0 -2866
  180. package/fesm2015/lenne.tech-ng-base-base-components.mjs.map +0 -1
  181. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs +0 -496
  182. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs.map +0 -1
  183. package/fesm2015/lenne.tech-ng-base-shared.mjs +0 -2750
  184. package/fesm2015/lenne.tech-ng-base-shared.mjs.map +0 -1
  185. package/fesm2015/lenne.tech-ng-base.mjs +0 -905
  186. package/fesm2015/lenne.tech-ng-base.mjs.map +0 -1
  187. package/fesm2020/lenne.tech-ng-base-base-components.mjs.map +0 -1
  188. package/fesm2020/lenne.tech-ng-base-base-prototype.mjs.map +0 -1
  189. package/fesm2020/lenne.tech-ng-base.mjs.map +0 -1
  190. /package/{esm2020 → esm2022}/base-cms/interfaces/base-cms-module-config.interface.mjs +0 -0
  191. /package/{esm2020 → esm2022}/base-cms/lenne.tech-ng-base-base-cms.mjs +0 -0
  192. /package/{esm2020 → esm2022}/base-cms/public-api.mjs +0 -0
  193. /package/{esm2020 → esm2022}/base-components/lenne.tech-ng-base-base-components.mjs +0 -0
  194. /package/{esm2020 → esm2022}/base-components/public-api.mjs +0 -0
  195. /package/{esm2020 → esm2022}/base-prototype/lenne.tech-ng-base-base-prototype.mjs +0 -0
  196. /package/{esm2020 → esm2022}/base-prototype/public-api.mjs +0 -0
  197. /package/{esm2020 → esm2022}/lenne.tech-ng-base.mjs +0 -0
  198. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  199. /package/{esm2020 → esm2022}/shared/classes/helper.class.mjs +0 -0
  200. /package/{esm2020 → esm2022}/shared/classes/standard.class.mjs +0 -0
  201. /package/{esm2020 → esm2022}/shared/decorators/debounce.decorator.mjs +0 -0
  202. /package/{esm2020 → esm2022}/shared/enums/comparison-operator.enum.mjs +0 -0
  203. /package/{esm2020 → esm2022}/shared/enums/graphql-request-type.enum.mjs +0 -0
  204. /package/{esm2020 → esm2022}/shared/enums/logical-operator.enum.mjs +0 -0
  205. /package/{esm2020 → esm2022}/shared/enums/skeleton-type.enum.mjs +0 -0
  206. /package/{esm2020 → esm2022}/shared/enums/sort-order.enum.mjs +0 -0
  207. /package/{esm2020 → esm2022}/shared/enums/toast-type.enum.mjs +0 -0
  208. /package/{esm2020 → esm2022}/shared/functions/ws-client.function.mjs +0 -0
  209. /package/{esm2020 → esm2022}/shared/interfaces/base-module-config.interface.mjs +0 -0
  210. /package/{esm2020 → esm2022}/shared/interfaces/breadcrumb.interface.mjs +0 -0
  211. /package/{esm2020 → esm2022}/shared/interfaces/can-component-deactivate.interface.mjs +0 -0
  212. /package/{esm2020 → esm2022}/shared/interfaces/cms-enum-values.interface.mjs +0 -0
  213. /package/{esm2020 → esm2022}/shared/interfaces/cms-field-config.interface.mjs +0 -0
  214. /package/{esm2020 → esm2022}/shared/interfaces/cms-model-config.interface.mjs +0 -0
  215. /package/{esm2020 → esm2022}/shared/interfaces/cms-table-field.interface.mjs +0 -0
  216. /package/{esm2020 → esm2022}/shared/interfaces/combined-filter-input.interface.mjs +0 -0
  217. /package/{esm2020 → esm2022}/shared/interfaces/compress-options.interface.mjs +0 -0
  218. /package/{esm2020 → esm2022}/shared/interfaces/cropping-options.interface.mjs +0 -0
  219. /package/{esm2020 → esm2022}/shared/interfaces/field-object.interface.mjs +0 -0
  220. /package/{esm2020 → esm2022}/shared/interfaces/field.interface.mjs +0 -0
  221. /package/{esm2020 → esm2022}/shared/interfaces/filter-input.interface.mjs +0 -0
  222. /package/{esm2020 → esm2022}/shared/interfaces/find-args.interface.mjs +0 -0
  223. /package/{esm2020 → esm2022}/shared/interfaces/graphql-crud-type.interface.mjs +0 -0
  224. /package/{esm2020 → esm2022}/shared/interfaces/graphql-fields-object.interface.mjs +0 -0
  225. /package/{esm2020 → esm2022}/shared/interfaces/graphql-options.interface.mjs +0 -0
  226. /package/{esm2020 → esm2022}/shared/interfaces/graphql-plus-options.interfacen.mjs +0 -0
  227. /package/{esm2020 → esm2022}/shared/interfaces/graphql-type-collection.interface.mjs +0 -0
  228. /package/{esm2020 → esm2022}/shared/interfaces/login-config.interface.mjs +0 -0
  229. /package/{esm2020 → esm2022}/shared/interfaces/single-filter-input.interface.mjs +0 -0
  230. /package/{esm2020 → esm2022}/shared/interfaces/sort-input.interface.mjs +0 -0
  231. /package/{esm2020 → esm2022}/shared/interfaces/time-components.interface.mjs +0 -0
  232. /package/{esm2020 → esm2022}/shared/interfaces/toast.interface.mjs +0 -0
  233. /package/{esm2020 → esm2022}/shared/lenne.tech-ng-base-shared.mjs +0 -0
  234. /package/{esm2020 → esm2022}/shared/public-api.mjs +0 -0
  235. /package/{esm2020 → esm2022}/shared/types/graphql-fields.type.mjs +0 -0
  236. /package/{esm2020 → esm2022}/shared/types/storage.type.mjs +0 -0
  237. /package/{esm2020 → esm2022}/shared/validators/email.validator.mjs +0 -0
  238. /package/{esm2020 → esm2022}/shared/validators/match.validator.mjs +0 -0
  239. /package/{esm2020 → esm2022}/shared/validators/secure-password.validator.mjs +0 -0
  240. /package/{esm2020 → esm2022}/src/decorators/auto-unsubscribe.decorator.mjs +0 -0
  241. /package/{esm2020 → esm2022}/src/factories/apollo-options.factory.mjs +0 -0
@@ -1,564 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { BasicUser, fullEmail, GraphQLRequestType, ToastType, } from '@lenne.tech/ng-base/shared';
3
- import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@lenne.tech/ng-base/shared";
6
- import * as i2 from "@angular/router";
7
- import * as i3 from "@angular/forms";
8
- import * as i4 from "@angular/common";
9
- import * as i5 from "../model-form-sub/model-form-sub.component";
10
- import * as i6 from "../fab-button/fab-button.component";
11
- /**
12
- * ModelFormComponent
13
- *
14
- * Hint for handling extensions of this component in project:
15
- * If you want to use complete custom services and methods, extend ModelFormBaseComponent instead of ModelFormComponent
16
- */
17
- export class ModelFormComponent {
18
- set loading(value) {
19
- if (!value) {
20
- setTimeout(() => {
21
- this._loading = value;
22
- }, 400);
23
- }
24
- else {
25
- this._loading = value;
26
- }
27
- }
28
- constructor(graphQLMetaService, graphQLService, formsService, authService, router, route, cmsService, toastService, fileService) {
29
- this.graphQLMetaService = graphQLMetaService;
30
- this.graphQLService = graphQLService;
31
- this.formsService = formsService;
32
- this.authService = authService;
33
- this.router = router;
34
- this.route = route;
35
- this.cmsService = cmsService;
36
- this.toastService = toastService;
37
- this.fileService = fileService;
38
- this.delete = true;
39
- this.onlyUpdateMode = false;
40
- this.duplicate = false;
41
- this.logging = false;
42
- this.showFavButton = true;
43
- this.finished = new EventEmitter();
44
- this._loading = false;
45
- this.keys = [];
46
- this.fabButtons = [];
47
- }
48
- ngOnInit() {
49
- // Set user for roles check
50
- this.user = BasicUser.map(this.authService.currentUser);
51
- this.graphQLMetaService.getMeta().subscribe((meta) => {
52
- this.meta = meta;
53
- if (this.modelName) {
54
- this.init();
55
- }
56
- });
57
- this.initFabActions();
58
- }
59
- ngOnChanges(changes) {
60
- // Reinit form for new model or load and patch form with new id
61
- if (changes['modelName'] || changes['id']) {
62
- this.init();
63
- }
64
- }
65
- /**
66
- * > If the model name and metadata are present, set the operation to update or create, get the fields from the
67
- * metadata, create the form, and if the value is present, patch the form with the value
68
- */
69
- init(id) {
70
- if (id) {
71
- this.id = id;
72
- }
73
- if (!this.id && this.onlyUpdateMode) {
74
- return;
75
- }
76
- if (this.modelName && this.meta) {
77
- this.operation = this.id ? 'update' : 'create';
78
- if (this.logging) {
79
- console.log('ModelFormComponent::init->operation', this.operation);
80
- console.log('ModelFormComponent::init->meta.getArgs', this.operation + this.capitalizeFirstLetter(this.modelName));
81
- }
82
- this.fields = this.meta.getArgs(this.operation + this.capitalizeFirstLetter(this.modelName), {
83
- type: GraphQLRequestType.MUTATION,
84
- }).fields;
85
- this.fields = this.fields['input'].fields;
86
- this.keys = Object.keys(this.fields);
87
- if (this.logging) {
88
- console.log('ModelFormComponent::init->id', this.id);
89
- console.log('ModelFormComponent::init->fields', this.fields);
90
- console.log('ModelFormComponent::init->keys', this.keys);
91
- }
92
- this.form = this.createForm(this.fields);
93
- if (this.id) {
94
- this.getObjectById(this.id);
95
- }
96
- }
97
- }
98
- /**
99
- * It takes a key as an argument, and returns an array of keys from the sub-object
100
- */
101
- getKeysFromSubObject(key) {
102
- return Object.keys(this.fields[key]);
103
- }
104
- /**
105
- * It takes an id, and then calls the graphQLService to get the object from the database
106
- *
107
- * @param id - The id of the object to be loaded
108
- */
109
- getObjectById(id) {
110
- if (!id) {
111
- return;
112
- }
113
- if (this.logging) {
114
- console.log('ModelFormComponent::getObjectById->id', id);
115
- console.log('ModelFormComponent::getObjectById->requestFields', this.createRequestObject(this.fields));
116
- }
117
- this.graphQLService
118
- .graphQl('get' + this.capitalizeFirstLetter(this.modelName), {
119
- arguments: { id },
120
- fields: this.createRequestObject(this.fields),
121
- type: GraphQLRequestType.QUERY,
122
- })
123
- .subscribe({
124
- next: (response) => {
125
- if (this.logging) {
126
- console.log('ModelFormComponent::get->value', response);
127
- }
128
- this.object = response;
129
- this.form.patchValue({ ...{}, ...response });
130
- // Process patchFields for reference input
131
- for (const [key, value] of Object.entries(this.fields)) {
132
- if (this.nestedObject(key, this.fields)?.type === 'DateTime' ||
133
- this.nestedObject(key, this.config)?.type === 'DateTime') {
134
- this.form.get(key).patchValue(this.formatDate(this.nestedObject(key, response)));
135
- }
136
- // If it not an array
137
- if (this.nestedObject(key, this.config)?.type === 'Reference' &&
138
- !this.nestedObject(key, this.fields)?.isList) {
139
- if (this.form.get(key)) {
140
- this.form
141
- .get(key)
142
- .patchValue(response[this.nestedObject(key, this.config)?.patchField
143
- ? this.nestedObject(key, this.config)?.patchField
144
- : key]?.id);
145
- }
146
- }
147
- // If value is an array
148
- if (this.nestedObject(key, this.config)?.type === 'Reference' &&
149
- this.nestedObject(key, this.fields)?.isList) {
150
- if (this.form.get(key)) {
151
- this.form
152
- .get(key)
153
- .patchValue(response[this.nestedObject(key, this.config)?.patchField
154
- ? this.nestedObject(key, this.config)?.patchField
155
- : key]?.map((e) => e?.id));
156
- }
157
- }
158
- }
159
- if (this.logging) {
160
- console.log('ModelFormComponent::getObjectById->patchedForm', this.form);
161
- }
162
- },
163
- error: (err) => {
164
- console.error('Error on load object', err);
165
- this.finished.emit(null);
166
- },
167
- });
168
- }
169
- /**
170
- * It takes a GraphQL type collection and returns an array of strings and objects
171
- *
172
- * @param fields - IGraphQLTypeCollection - This is the object that is returned from the
173
- * introspection query.
174
- * @returns An array of strings and objects.
175
- */
176
- createRequestObject(fields) {
177
- const requestFields = [];
178
- for (const [key, value] of Object.entries(fields)) {
179
- if (this.config[key]?.exclude !== undefined && this.config[key]?.exclude) {
180
- continue;
181
- }
182
- if (Object.keys(fields[key]?.fields)?.length === 0) {
183
- if (this.config[key]?.type !== 'Reference') {
184
- requestFields.push(key);
185
- }
186
- else {
187
- requestFields.push({ [this.config[key]?.patchField ? this.config[key]?.patchField : key]: ['id'] });
188
- }
189
- }
190
- else {
191
- const subkeys = this.createRequestObject(fields[key].fields);
192
- const resultObject = {};
193
- resultObject[key] = subkeys;
194
- requestFields.push(resultObject);
195
- }
196
- }
197
- if (this.logging) {
198
- console.log('ModelFormComponent::createRequestObject->requestFields', requestFields);
199
- }
200
- return requestFields;
201
- }
202
- /**
203
- * It takes a collection of GraphQL types and creates a form group with a form control for each type
204
- *
205
- * @param fields - IGraphQLTypeCollection
206
- * @param parents
207
- */
208
- createForm(fields, parents = []) {
209
- const group = {};
210
- let internParents = [...[], ...parents];
211
- for (const [key, value] of Object.entries(fields)) {
212
- if (Object.keys(value?.fields)?.length === 0) {
213
- group[key] = new UntypedFormControl(null, this.processValidators(this.nestedObject(internParents.length ? internParents.join('.') + '.' + key : key, this.config), value));
214
- }
215
- else {
216
- internParents.push(key);
217
- group[key] = this.createForm(fields[key].fields, internParents);
218
- internParents = [];
219
- }
220
- }
221
- if (this.logging) {
222
- console.log('ModelFormComponent::createForm->group', group);
223
- }
224
- return new UntypedFormGroup(group);
225
- }
226
- /**
227
- * Process form validators for control
228
- */
229
- processValidators(config, value) {
230
- const validators = [];
231
- if (config) {
232
- if (config?.required !== undefined ? config?.required : value.isRequired) {
233
- validators.push(Validators.required);
234
- }
235
- if (config?.type === 'Email') {
236
- validators.push(fullEmail());
237
- }
238
- if (config?.type === 'Password') {
239
- validators.push(Validators.minLength(6));
240
- }
241
- if (typeof config?.min === 'number') {
242
- validators.push(Validators.min(config.min));
243
- }
244
- if (typeof config?.max === 'number') {
245
- validators.push(Validators.max(config.max));
246
- }
247
- if (Array.isArray(config?.validators)) {
248
- validators.push(...config?.validators);
249
- }
250
- }
251
- return validators;
252
- }
253
- /**
254
- * It calls the graphQLService to delete the object with the id of the object that is currently being edited
255
- */
256
- deleteObject() {
257
- this.cmsService.deleteObject(this.id, this.modelName).then(() => {
258
- this.toastService.show({
259
- id: this.modelName + '-success',
260
- type: ToastType.SUCCESS,
261
- title: 'Erfolgreich',
262
- description: this.label + ' wurde erfolgreich gelöscht.',
263
- });
264
- this.finished.emit(null);
265
- });
266
- }
267
- /**
268
- * It sends a GraphQL mutation to the server to duplicate the object
269
- */
270
- async duplicateObject() {
271
- this.cmsService.duplicateObject(this.id, this.modelName).then(async (value) => {
272
- if (value?.id) {
273
- await this.router.navigate(['../'], { relativeTo: this.route });
274
- this.toastService.show({
275
- id: this.modelName + '-success',
276
- type: ToastType.SUCCESS,
277
- title: 'Erfolgreich',
278
- description: this.label + ' wurde erfolgreich dupliziert.',
279
- });
280
- }
281
- else {
282
- this.finished.emit(null);
283
- }
284
- });
285
- }
286
- /**
287
- * It takes a string, capitalizes the first letter, and returns the modified string
288
- *
289
- * @param value - The string to capitalize.
290
- * @returns The first letter of the string is being capitalized and the rest of the string is being returned.
291
- */
292
- capitalizeFirstLetter(value) {
293
- return this.cmsService.capitalizeFirstLetter(value);
294
- }
295
- /**
296
- * It takes an AbstractControl and returns a FormControl
297
- *
298
- * @param control - AbstractControl | null | undefined
299
- * @returns A FormControl
300
- */
301
- transformToControl(control) {
302
- return control;
303
- }
304
- /**
305
- * It takes the key of the form control that has changed, gets the value of that form control, creates an object with the
306
- * key and value, and then sends that object to the GraphQL server to update the database
307
- */
308
- imageChanged(key) {
309
- const data = {};
310
- data[key] = this.form.get(key).value;
311
- if (this.logging) {
312
- console.log('ModelFormComponent::imageChanged->body', data);
313
- }
314
- if (this.id) {
315
- try {
316
- this.graphQLService
317
- .graphQl('update' + this.capitalizeFirstLetter(this.modelName), {
318
- arguments: { id: this.id, input: data },
319
- fields: ['id'],
320
- type: GraphQLRequestType.MUTATION,
321
- })
322
- .subscribe({
323
- next: (value) => {
324
- if (this.logging) {
325
- console.log('ModelFormComponent::imageChanged->success', value);
326
- }
327
- },
328
- });
329
- }
330
- catch (e) {
331
- if (this.logging) {
332
- console.log('ModelFormComponent::imageChanged->error', e);
333
- }
334
- }
335
- }
336
- }
337
- /**
338
- * It takes the form, validates it, and then sends it to the GraphQL server
339
- *
340
- * @returns The id of the newly created or updated object.
341
- */
342
- submit(secret = false) {
343
- return new Promise(async (resolve, reject) => {
344
- if (!secret) {
345
- this.loading = true;
346
- }
347
- if (this.form.invalid && !secret) {
348
- this.formsService.validateAllFormFields(this.form);
349
- this.formsService.scrollToInvalidControl(this.form);
350
- this.loading = false;
351
- resolve(null);
352
- return;
353
- }
354
- if (this.operation === 'update' && !this.id) {
355
- console.error('ID is missing for update!');
356
- this.loading = false;
357
- resolve(null);
358
- return;
359
- }
360
- if (this.logging) {
361
- console.log('ModelFormComponent::submit->formValue', this.form.value);
362
- }
363
- // Prepare data for server request
364
- let data = Object.assign({}, this.form.value);
365
- data = this.prepareDataForRequest(this.config, this.fields, data);
366
- if (this.logging) {
367
- console.log('ModelFormComponent::submit->valueToGraphql', data);
368
- console.log('ModelFormComponent::submit->fileChanges', this.fileChanges);
369
- }
370
- if (this.fileChanges?.length) {
371
- for (const fileChange of this.fileChanges) {
372
- const key = fileChange.field;
373
- const config = this.nestedObject(key, this.config);
374
- if (fileChange.file) {
375
- // Upload
376
- const value = this.form.get(key).value;
377
- // Check if file is an ID or a base64 string
378
- if (typeof value === 'string') {
379
- // Delete if ID
380
- if (!this.form.get(key).value?.startsWith('data:')) {
381
- const deleteResult = await this.fileService.delete(this.nestedObject(key, this.config)?.url, this.nestedObject(key, this.config)?.deletePath || '/files/', this.nestedObject(key, this.object));
382
- if (deleteResult) {
383
- this.nestedObject(key, data, '');
384
- }
385
- }
386
- const uploadResult = await this.fileService.upload(this.nestedObject(key, this.config)?.url, this.nestedObject(key, this.config)?.uploadPath || '/files/upload', fileChange.file);
387
- if (uploadResult?.id) {
388
- this.nestedObject(key, data, uploadResult.id);
389
- }
390
- }
391
- else if (config?.imageMode && config?.imageMode !== 'file') {
392
- // Delete
393
- const result = await this.fileService.delete(config?.url, this.nestedObject(key, this.config)?.deletePath || '/files/', this.nestedObject(key, this.object));
394
- if (result) {
395
- this.nestedObject(key, data, '');
396
- }
397
- }
398
- }
399
- }
400
- }
401
- this.graphQLService
402
- .graphQl(this.operation + this.capitalizeFirstLetter(this.modelName), {
403
- arguments: this.operation === 'update' ? { id: this.id, input: data } : { input: data },
404
- fields: ['id'],
405
- type: GraphQLRequestType.MUTATION,
406
- })
407
- .subscribe({
408
- next: (value) => {
409
- if (!secret) {
410
- this.loading = false;
411
- this.finished.emit(null);
412
- this.toastService.show({
413
- id: this.modelName + '-success',
414
- type: ToastType.SUCCESS,
415
- title: 'Erfolgreich',
416
- description: this.label + ' wurde erfolgreich ' + (this.operation === 'create' ? 'erstellt.' : 'aktualisiert.'),
417
- });
418
- }
419
- resolve(value);
420
- },
421
- error: (err) => {
422
- if (!secret) {
423
- console.error('Failed on ' + this.operation, err);
424
- this.loading = false;
425
- this.toastService.show({
426
- id: this.modelName + '-success',
427
- type: ToastType.ERROR,
428
- description: 'Beim ' +
429
- (this.operation === 'create' ? 'erstellen' : 'aktualisieren') +
430
- ' von ' +
431
- this.label +
432
- ' ist etwas schiefgelaufen.',
433
- });
434
- }
435
- reject();
436
- },
437
- });
438
- });
439
- }
440
- /**
441
- * Prepare data for server
442
- */
443
- prepareDataForRequest(config, fieldsConfig, data) {
444
- if (!data) {
445
- return data;
446
- }
447
- for (const [key, value] of Object.entries(data)) {
448
- if ((this.fields[key]?.type === 'DateTime' || this.config[key]?.type === 'DateTime') && value === '') {
449
- data[key] = null;
450
- continue;
451
- }
452
- if ((config[key]?.roles ? !this.user.hasAllRoles(config[key]?.roles) : false) || config[key]?.exclude) {
453
- delete data[key];
454
- continue;
455
- }
456
- if (value && typeof value === 'object' && !Array.isArray(value) && this.fields[key]?.type !== 'Upload') {
457
- data[key] = Object.keys(data[key])
458
- .filter((k) => data[key][k] != null)
459
- .reduce((a, k) => ({ ...a, [k]: data[key][k] }), {});
460
- if (Object.keys(data[key])?.length === 0) {
461
- if (this.logging) {
462
- console.log('Object is empty from result');
463
- }
464
- data[key] = null;
465
- }
466
- }
467
- // Set type for graphql method
468
- if (fieldsConfig[key]?.type === 'Float') {
469
- if (value) {
470
- data[key] = Number(value);
471
- }
472
- else {
473
- data[key] = null;
474
- }
475
- }
476
- if (fieldsConfig[key]?.fields && Object.keys(fieldsConfig[key]?.fields).length > 0) {
477
- data[key] = this.prepareDataForRequest(config[key]?.fields, fieldsConfig[key]?.fields, data[key]);
478
- }
479
- }
480
- return data;
481
- }
482
- /**
483
- * Init fab buttons for mobile devices
484
- */
485
- initFabActions() {
486
- const saveEvent = new EventEmitter();
487
- this.fabButtons.push({ icon: 'bi-check-lg', color: 'var(--bs-success)', event: saveEvent });
488
- saveEvent.subscribe(() => this.submit(false));
489
- if (this.duplicate && this.operation === 'update') {
490
- const event = new EventEmitter();
491
- this.fabButtons.push({ icon: 'bi-back', color: 'var(--bs-info)', event });
492
- event.subscribe(() => this.duplicateObject());
493
- }
494
- if (this.operation === 'update' && this.delete) {
495
- const event = new EventEmitter();
496
- this.fabButtons.push({ icon: 'bi-trash3', color: 'var(--bs-danger)', event });
497
- event.subscribe(() => this.deleteObject());
498
- }
499
- }
500
- /**
501
- * Set file changes for process
502
- */
503
- processFileChanges(event) {
504
- const index = this.fileChanges?.findIndex((e) => e.field === event.field);
505
- if (index !== undefined && index !== -1) {
506
- this.fileChanges[index] = event;
507
- }
508
- else if (this.fileChanges) {
509
- this.fileChanges.push(event);
510
- }
511
- else {
512
- this.fileChanges = [event];
513
- }
514
- }
515
- formatDate(date) {
516
- if (!date) {
517
- return null;
518
- }
519
- const newDate = new Date(date);
520
- return newDate.toISOString().substring(0, 16);
521
- }
522
- nestedObject(key, nestedObject, value) {
523
- const props = key.split('.');
524
- let result = nestedObject;
525
- for (let i = 0; i < props.length; i++) {
526
- if (value && i === props.length - 1) {
527
- result[props[i]] = value;
528
- return result[props[i]];
529
- }
530
- result =
531
- result[props[i]]?.fields && Object.keys(result[props[i]]?.fields)?.length > 0
532
- ? result[props[i]]?.fields
533
- : result[props[i]];
534
- }
535
- return result;
536
- }
537
- }
538
- ModelFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ModelFormComponent, deps: [{ token: i1.GraphQLMetaService }, { token: i1.GraphQLService }, { token: i1.FormsService }, { token: i1.AuthService }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i1.CmsService }, { token: i1.ToastService }, { token: i1.FileService }], target: i0.ɵɵFactoryTarget.Component });
539
- ModelFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ModelFormComponent, selector: "base-model-form", inputs: { modelName: "modelName", label: "label", id: "id", delete: "delete", onlyUpdateMode: "onlyUpdateMode", duplicate: "duplicate", logging: "logging", config: "config", showFavButton: "showFavButton" }, outputs: { finished: "finished" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"w-100\" *ngIf=\"form\">\n <div class=\"d-flex flex-row justify-content-between mt-3\">\n <div class=\"responsive-back d-flex d-lg-none\">\n <i class=\"bi bi-arrow-left\" routerLink=\"../\"></i>\n </div>\n <h2 class=\"mb-0\">\n {{ label ? label : capitalizeFirstLetter(modelName) }} {{ operation === 'update' ? 'bearbeiten' : 'erstellen' }}\n </h2>\n\n <div class=\"d-none d-lg-flex flex-row align-items-center justify-content-end\">\n <button class=\"btn btn-outline-primary me-2\" *ngIf=\"id && duplicate && !_loading\" (click)=\"duplicateObject()\">\n Duplizieren\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!form.touched && !form.dirty\"\n (click)=\"submit(false)\"\n *ngIf=\"!_loading\"\n >\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"_loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n\n <form [formGroup]=\"form\">\n <base-model-form-sub\n [id]=\"id\"\n [fields]=\"fields\"\n [config]=\"config\"\n [form]=\"form\"\n (imageChanged)=\"imageChanged($event)\"\n (fileChanged)=\"processFileChanges($event)\"\n ></base-model-form-sub>\n\n <div class=\"d-none d-lg-flex mt-4\" [ngClass]=\"id && delete ? 'justify-content-between' : 'justify-content-end'\">\n <div *ngIf=\"id && delete\">\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteObject()\">L\u00F6schen</button>\n </div>\n <div>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!form.touched && !form.dirty\"\n (click)=\"submit(false)\"\n *ngIf=\"!_loading\"\n >\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"_loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n </form>\n</div>\n\n<div class=\"d-block d-lg-none responsive-action-button\" *ngIf=\"showFavButton\">\n <base-fab-button [buttons]=\"fabButtons\"></base-fab-button>\n</div>\n", styles: [".responsive-back{display:flex;align-items:center;margin-right:6px}.responsive-back .bi-arrow-left{font-size:28px}h2{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.responsive-action-button{position:fixed;bottom:15px;right:15px;z-index:100}\n"], dependencies: [{ kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i5.ModelFormSubComponent, selector: "base-model-form-sub", inputs: ["id", "parentKey", "fields", "form", "config"], outputs: ["imageChanged", "fileChanged"] }, { kind: "component", type: i6.FabButtonComponent, selector: "base-fab-button", inputs: ["fabIcon", "buttons"] }] });
540
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ModelFormComponent, decorators: [{
541
- type: Component,
542
- args: [{ selector: 'base-model-form', template: "<div class=\"w-100\" *ngIf=\"form\">\n <div class=\"d-flex flex-row justify-content-between mt-3\">\n <div class=\"responsive-back d-flex d-lg-none\">\n <i class=\"bi bi-arrow-left\" routerLink=\"../\"></i>\n </div>\n <h2 class=\"mb-0\">\n {{ label ? label : capitalizeFirstLetter(modelName) }} {{ operation === 'update' ? 'bearbeiten' : 'erstellen' }}\n </h2>\n\n <div class=\"d-none d-lg-flex flex-row align-items-center justify-content-end\">\n <button class=\"btn btn-outline-primary me-2\" *ngIf=\"id && duplicate && !_loading\" (click)=\"duplicateObject()\">\n Duplizieren\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!form.touched && !form.dirty\"\n (click)=\"submit(false)\"\n *ngIf=\"!_loading\"\n >\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"_loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n\n <form [formGroup]=\"form\">\n <base-model-form-sub\n [id]=\"id\"\n [fields]=\"fields\"\n [config]=\"config\"\n [form]=\"form\"\n (imageChanged)=\"imageChanged($event)\"\n (fileChanged)=\"processFileChanges($event)\"\n ></base-model-form-sub>\n\n <div class=\"d-none d-lg-flex mt-4\" [ngClass]=\"id && delete ? 'justify-content-between' : 'justify-content-end'\">\n <div *ngIf=\"id && delete\">\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteObject()\">L\u00F6schen</button>\n </div>\n <div>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!form.touched && !form.dirty\"\n (click)=\"submit(false)\"\n *ngIf=\"!_loading\"\n >\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"_loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n </form>\n</div>\n\n<div class=\"d-block d-lg-none responsive-action-button\" *ngIf=\"showFavButton\">\n <base-fab-button [buttons]=\"fabButtons\"></base-fab-button>\n</div>\n", styles: [".responsive-back{display:flex;align-items:center;margin-right:6px}.responsive-back .bi-arrow-left{font-size:28px}h2{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.responsive-action-button{position:fixed;bottom:15px;right:15px;z-index:100}\n"] }]
543
- }], ctorParameters: function () { return [{ type: i1.GraphQLMetaService }, { type: i1.GraphQLService }, { type: i1.FormsService }, { type: i1.AuthService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i1.CmsService }, { type: i1.ToastService }, { type: i1.FileService }]; }, propDecorators: { modelName: [{
544
- type: Input
545
- }], label: [{
546
- type: Input
547
- }], id: [{
548
- type: Input
549
- }], delete: [{
550
- type: Input
551
- }], onlyUpdateMode: [{
552
- type: Input
553
- }], duplicate: [{
554
- type: Input
555
- }], logging: [{
556
- type: Input
557
- }], config: [{
558
- type: Input
559
- }], showFavButton: [{
560
- type: Input
561
- }], finished: [{
562
- type: Output
563
- }] } });
564
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY29tcG9uZW50cy9jb21wb25lbnRzL21vZGVsLWZvcm0vbW9kZWwtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY29tcG9uZW50cy9jb21wb25lbnRzL21vZGVsLWZvcm0vbW9kZWwtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUVMLFNBQVMsRUFLVCxTQUFTLEVBR1Qsa0JBQWtCLEVBS2xCLFNBQVMsR0FDVixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBbUIsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBSW5HOzs7OztHQUtHO0FBTUgsTUFBTSxPQUFPLGtCQUFrQjtJQXdCN0IsSUFBSSxPQUFPLENBQUMsS0FBYztRQUN4QixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN4QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDVDthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBRUQsWUFDVSxrQkFBc0MsRUFDdEMsY0FBOEIsRUFDOUIsWUFBMEIsRUFDMUIsV0FBd0IsRUFDeEIsTUFBYyxFQUNkLEtBQXFCLEVBQ3JCLFVBQXNCLEVBQ3RCLFlBQTBCLEVBQzFCLFdBQXdCO1FBUnhCLHVCQUFrQixHQUFsQixrQkFBa0Is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RSxDQUFDLEVBQUUsRUFBRTtZQUNyQyxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3pCO1lBRUQsTUFBTTtnQkFDSixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDO29CQUMzRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU07b0JBQzFCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEI7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzsrR0Fsb0JVLGtCQUFrQjttR0FBbEIsa0JBQWtCLCtUQ2pDL0IsdWhGQWlFQTsyRkRoQ2Esa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGlCQUFpQjsyVEFLbEIsU0FBUztzQkFBakIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEF1dGhTZXJ2aWNlLFxuICBCYXNpY1VzZXIsXG4gIENNU0ZpZWxkQ29uZmlnLFxuICBDbXNTZXJ2aWNlLFxuICBGaWxlU2VydmljZSxcbiAgRm9ybXNTZXJ2aWNlLFxuICBmdWxsRW1haWwsXG4gIEdyYXBoUUxNZXRhLFxuICBHcmFwaFFMTWV0YVNlcnZpY2UsXG4gIEdyYXBoUUxSZXF1ZXN0VHlwZSxcbiAgR3JhcGhRTFNlcnZpY2UsXG4gIEdyYXBoUUxUeXBlLFxuICBJR3JhcGhRTFR5cGVDb2xsZWN0aW9uLFxuICBUb2FzdFNlcnZpY2UsXG4gIFRvYXN0VHlwZSxcbn0gZnJvbSAnQGxlbm5lLnRlY2gvbmctYmFzZS9zaGFyZWQnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4uL2ZhYi1idXR0b24vZmFiLWJ1dHRvbi5jb21wb25lbnQnO1xuXG4vKipcbiAqIE1vZGVsRm9ybUNvbXBvbmVudFxuICpcbiAqIEhpbnQgZm9yIGhhbmRsaW5nIGV4dGVuc2lvbnMgb2YgdGhpcyBjb21wb25lbnQgaW4gcHJvamVjdDpcbiAqIElmIHlvdSB3YW50IHRvIHVzZSBjb21wbGV0ZSBjdXN0b20gc2VydmljZXMgYW5kIG1ldGhvZHMsIGV4dGVuZCBNb2RlbEZvcm1CYXNlQ29tcG9uZW50IGluc3RlYWQgb2YgTW9kZWxGb3JtQ29tcG9uZW50XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Jhc2UtbW9kZWwtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RlbC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbW9kZWwtZm9ybS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RlbEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIG1vZGVsTmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xuICBASW5wdXQoKSBpZDogc3RyaW5nIHwgbnVsbDtcbiAgQElucHV0KCkgZGVsZXRlID0gdHJ1ZTtcbiAgQElucHV0KCkgb25seVVwZGF0ZU1vZGUgPSBmYWxzZTtcbiAgQElucHV0KCkgZHVwbGljYXRlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxvZ2dpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgY29uZmlnOiB7IFtrZXk6IHN0cmluZ106IENNU0ZpZWxkQ29uZmlnIH07XG4gIEBJbnB1dCgpIHNob3dGYXZCdXR0b24gPSB0cnVlO1xuXG4gIEBPdXRwdXQoKSBmaW5pc2hlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBtZXRhOiBHcmFwaFFMTWV0YTtcbiAgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgX2xvYWRpbmcgPSBmYWxzZTtcbiAgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBHcmFwaFFMVHlwZT47XG4gIG9wZXJhdGlvbjogc3RyaW5nO1xuICBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICB1c2VyOiBCYXNpY1VzZXI7XG4gIG9iamVjdDogYW55O1xuICBmYWJCdXR0b25zOiBCdXR0b25bXSA9IFtdO1xuICBmaWxlQ2hhbmdlczogW3sgZmllbGQ6IHN0cmluZzsgZmlsZTogRmlsZSB8IG51bGwgfV07XG5cbiAgc2V0IGxvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fbG9hZGluZyA9IHZhbHVlO1xuICAgICAgfSwgNDAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbG9hZGluZyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZ3JhcGhRTE1ldGFTZXJ2aWNlOiBHcmFwaFFMTWV0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBncmFwaFFMU2VydmljZTogR3JhcGhRTFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3Jtc1NlcnZpY2U6IEZvcm1zU2VydmljZSxcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgY21zU2VydmljZTogQ21zU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlsZVNlcnZpY2U6IEZpbGVTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBTZXQgdXNlciBmb3Igcm9sZXMgY2hlY2tcbiAgICB0aGlzLnVzZXIgPSBCYXNpY1VzZXIubWFwKHRoaXMuYXV0aFNlcnZpY2UuY3VycmVudFVzZXIpO1xuXG4gICAgdGhpcy5ncmFwaFFMTWV0YVNlcnZpY2UuZ2V0TWV0YSgpLnN1YnNjcmliZSgobWV0YSkgPT4ge1xuICAgICAgdGhpcy5tZXRhID0gbWV0YTtcblxuICAgICAgaWYgKHRoaXMubW9kZWxOYW1lKSB7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5pbml0RmFiQWN0aW9ucygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIC8vIFJlaW5pdCBmb3JtIGZvciBuZXcgbW9kZWwgb3IgbG9hZCBhbmQgcGF0Y2ggZm9ybSB3aXRoIG5ldyBpZFxuICAgIGlmIChjaGFuZ2VzWydtb2RlbE5hbWUnXSB8fCBjaGFuZ2VzWydpZCddKSB7XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogPiBJZiB0aGUgbW9kZWwgbmFtZSBhbmQgbWV0YWRhdGEgYXJlIHByZXNlbnQsIHNldCB0aGUgb3BlcmF0aW9uIHRvIHVwZGF0ZSBvciBjcmVhdGUsIGdldCB0aGUgZmllbGRzIGZyb20gdGhlXG4gICAqIG1ldGFkYXRhLCBjcmVhdGUgdGhlIGZvcm0sIGFuZCBpZiB0aGUgdmFsdWUgaXMgcHJlc2VudCwgcGF0Y2ggdGhlIGZvcm0gd2l0aCB0aGUgdmFsdWVcbiAgICovXG4gIGluaXQoaWQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoaWQpIHtcbiAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaWQgJiYgdGhpcy5vbmx5VXBkYXRlTW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1vZGVsTmFtZSAmJiB0aGlzLm1ldGEpIHtcbiAgICAgIHRoaXMub3BlcmF0aW9uID0gdGhpcy5pZCA/ICd1cGRhdGUnIDogJ2NyZWF0ZSc7XG5cbiAgICAgIGlmICh0aGlzLmxvZ2dpbmcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ01vZGVsRm9ybUNvbXBvbmVudDo6aW5pdC0+b3BlcmF0aW9uJywgdGhpcy5vcGVyYXRpb24pO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAnTW9kZWxGb3JtQ29tcG9uZW50Ojppbml0LT5tZXRhLmdldEFyZ3MnLFxuICAgICAgICAgIHRoaXMub3BlcmF0aW9uICsgdGhpcy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIodGhpcy5tb2RlbE5hbWUpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmllbGRzID0gdGhpcy5tZXRhLmdldEFyZ3ModGhpcy5vcGVyYXRpb24gKyB0aGlzLmNhcGl0YWxpemVGaXJzdExldHRlcih0aGlzLm1vZGVsTmFtZSksIHtcbiAgICAgICAgdHlwZTogR3JhcGhRTFJlcXVlc3RUeXBlLk1VVEFUSU9OLFxuICAgICAgfSkuZmllbGRzO1xuICAgICAgdGhpcy5maWVsZHMgPSB0aGlzLmZpZWxkc1snaW5wdXQnXS5maWVsZHMgYXMgYW55O1xuICAgICAgdGhpcy5rZXlzID0gT2JqZWN0LmtleXModGhpcy5maWVsZHMpO1xuXG4gICAgICBpZiAodGhpcy5sb2dnaW5nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OmluaXQtPmlkJywgdGhpcy5pZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OmluaXQtPmZpZWxkcycsIHRoaXMuZmllbGRzKTtcbiAgICAgICAgY29uc29sZS5sb2coJ01vZGVsRm9ybUNvbXBvbmVudDo6aW5pdC0+a2V5cycsIHRoaXMua2V5cyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZm9ybSA9IHRoaXMuY3JlYXRlRm9ybSh0aGlzLmZpZWxkcyk7XG5cbiAgICAgIGlmICh0aGlzLmlkKSB7XG4gICAgICAgIHRoaXMuZ2V0T2JqZWN0QnlJZCh0aGlzLmlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXQgdGFrZXMgYSBrZXkgYXMgYW4gYXJndW1lbnQsIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIGtleXMgZnJvbSB0aGUgc3ViLW9iamVjdFxuICAgKi9cbiAgZ2V0S2V5c0Zyb21TdWJPYmplY3Qoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5maWVsZHNba2V5XSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgdGFrZXMgYW4gaWQsIGFuZCB0aGVuIGNhbGxzIHRoZSBncmFwaFFMU2VydmljZSB0byBnZXQgdGhlIG9iamVjdCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIG9iamVjdCB0byBiZSBsb2FkZWRcbiAgICovXG4gIGdldE9iamVjdEJ5SWQoaWQ6IHN0cmluZykge1xuICAgIGlmICghaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sb2dnaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZygnTW9kZWxGb3JtQ29tcG9uZW50OjpnZXRPYmplY3RCeUlkLT5pZCcsIGlkKTtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OmdldE9iamVjdEJ5SWQtPnJlcXVlc3RGaWVsZHMnLCB0aGlzLmNyZWF0ZVJlcXVlc3RPYmplY3QodGhpcy5maWVsZHMpKTtcbiAgICB9XG5cbiAgICB0aGlzLmdyYXBoUUxTZXJ2aWNlXG4gICAgICAuZ3JhcGhRbCgnZ2V0JyArIHRoaXMuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRoaXMubW9kZWxOYW1lKSwge1xuICAgICAgICBhcmd1bWVudHM6IHsgaWQgfSxcbiAgICAgICAgZmllbGRzOiB0aGlzLmNyZWF0ZVJlcXVlc3RPYmplY3QodGhpcy5maWVsZHMpLFxuICAgICAgICB0eXBlOiBHcmFwaFFMUmVxdWVzdFR5cGUuUVVFUlksXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmxvZ2dpbmcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OmdldC0+dmFsdWUnLCByZXNwb25zZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5vYmplY3QgPSByZXNwb25zZTtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IC4uLnt9LCAuLi5yZXNwb25zZSB9KTtcblxuICAgICAgICAgIC8vIFByb2Nlc3MgcGF0Y2hGaWVsZHMgZm9yIHJlZmVyZW5jZSBpbnB1dFxuICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZmllbGRzKSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLm5lc3RlZE9iamVjdChrZXksIHRoaXMuZmllbGRzKT8udHlwZSA9PT0gJ0RhdGVUaW1lJyB8fFxuICAgICAgICAgICAgICB0aGlzLm5lc3RlZE9iamVjdChrZXksIHRoaXMuY29uZmlnKT8udHlwZSA9PT0gJ0RhdGVUaW1lJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoa2V5KS5wYXRjaFZhbHVlKHRoaXMuZm9ybWF0RGF0ZSh0aGlzLm5lc3RlZE9iamVjdChrZXksIHJlc3BvbnNlKSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBpdCBub3QgYW4gYXJyYXlcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCB0aGlzLmNvbmZpZyk/LnR5cGUgPT09ICdSZWZlcmVuY2UnICYmXG4gICAgICAgICAgICAgICF0aGlzLm5lc3RlZE9iamVjdChrZXksIHRoaXMuZmllbGRzKT8uaXNMaXN0XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybS5nZXQoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybVxuICAgICAgICAgICAgICAgICAgLmdldChrZXkpXG4gICAgICAgICAgICAgICAgICAucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VbXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCB0aGlzLmNvbmZpZyk/LnBhdGNoRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCB0aGlzLmNvbmZpZyk/LnBhdGNoRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIDoga2V5XG4gICAgICAgICAgICAgICAgICAgIF0/LmlkXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHZhbHVlIGlzIGFuIGFycmF5XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMubmVzdGVkT2JqZWN0KGtleSwgdGhpcy5jb25maWcpPy50eXBlID09PSAnUmVmZXJlbmNlJyAmJlxuICAgICAgICAgICAgICB0aGlzLm5lc3RlZE9iamVjdChrZXksIHRoaXMuZmllbGRzKT8uaXNMaXN0XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybS5nZXQoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybVxuICAgICAgICAgICAgICAgICAgLmdldChrZXkpXG4gICAgICAgICAgICAgICAgICAucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VbXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCB0aGlzLmNvbmZpZyk/LnBhdGNoRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCB0aGlzLmNvbmZpZyk/LnBhdGNoRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIDoga2V5XG4gICAgICAgICAgICAgICAgICAgIF0/Lm1hcCgoZSkgPT4gZT8uaWQpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZGVsRm9ybUNvbXBvbmVudDo6Z2V0T2JqZWN0QnlJZC0+cGF0Y2hlZEZvcm0nLCB0aGlzLmZvcm0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvbiBsb2FkIG9iamVjdCcsIGVycik7XG4gICAgICAgICAgdGhpcy5maW5pc2hlZC5lbWl0KG51bGwpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgdGFrZXMgYSBHcmFwaFFMIHR5cGUgY29sbGVjdGlvbiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIGFuZCBvYmplY3RzXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZHMgLSBJR3JhcGhRTFR5cGVDb2xsZWN0aW9uIC0gVGhpcyBpcyB0aGUgb2JqZWN0IHRoYXQgaXMgcmV0dXJuZWQgZnJvbSB0aGVcbiAgICogaW50cm9zcGVjdGlvbiBxdWVyeS5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2Ygc3RyaW5ncyBhbmQgb2JqZWN0cy5cbiAgICovXG4gIGNyZWF0ZVJlcXVlc3RPYmplY3QoZmllbGRzOiBJR3JhcGhRTFR5cGVDb2xsZWN0aW9uKSB7XG4gICAgY29uc3QgcmVxdWVzdEZpZWxkczogYW55ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWVsZHMpKSB7XG4gICAgICBpZiAodGhpcy5jb25maWdba2V5XT8uZXhjbHVkZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY29uZmlnW2tleV0/LmV4Y2x1ZGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChPYmplY3Qua2V5cyhmaWVsZHNba2V5XT8uZmllbGRzKT8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ1trZXldPy50eXBlICE9PSAnUmVmZXJlbmNlJykge1xuICAgICAgICAgIHJlcXVlc3RGaWVsZHMucHVzaChrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcXVlc3RGaWVsZHMucHVzaCh7IFt0aGlzLmNvbmZpZ1trZXldPy5wYXRjaEZpZWxkID8gdGhpcy5jb25maWdba2V5XT8ucGF0Y2hGaWVsZCA6IGtleV06IFsnaWQnXSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3Via2V5cyA9IHRoaXMuY3JlYXRlUmVxdWVzdE9iamVjdChmaWVsZHNba2V5XS5maWVsZHMgYXMgSUdyYXBoUUxUeXBlQ29sbGVjdGlvbik7XG4gICAgICAgIGNvbnN0IHJlc3VsdE9iamVjdCA9IHt9O1xuICAgICAgICByZXN1bHRPYmplY3Rba2V5XSA9IHN1YmtleXM7XG4gICAgICAgIHJlcXVlc3RGaWVsZHMucHVzaChyZXN1bHRPYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmxvZ2dpbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OmNyZWF0ZVJlcXVlc3RPYmplY3QtPnJlcXVlc3RGaWVsZHMnLCByZXF1ZXN0RmllbGRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdEZpZWxkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCB0YWtlcyBhIGNvbGxlY3Rpb24gb2YgR3JhcGhRTCB0eXBlcyBhbmQgY3JlYXRlcyBhIGZvcm0gZ3JvdXAgd2l0aCBhIGZvcm0gY29udHJvbCBmb3IgZWFjaCB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZHMgLSBJR3JhcGhRTFR5cGVDb2xsZWN0aW9uXG4gICAqIEBwYXJhbSBwYXJlbnRzXG4gICAqL1xuICBjcmVhdGVGb3JtKGZpZWxkczogSUdyYXBoUUxUeXBlQ29sbGVjdGlvbiwgcGFyZW50czogYW55W10gPSBbXSkge1xuICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICBsZXQgaW50ZXJuUGFyZW50cyA9IFsuLi5bXSwgLi4ucGFyZW50c107XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWVsZHMpKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXModmFsdWU/LmZpZWxkcyk/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBncm91cFtrZXldID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHRoaXMucHJvY2Vzc1ZhbGlkYXRvcnMoXG4gICAgICAgICAgICB0aGlzLm5lc3RlZE9iamVjdChpbnRlcm5QYXJlbnRzLmxlbmd0aCA/IGludGVyblBhcmVudHMuam9pbignLicpICsgJy4nICsga2V5IDoga2V5LCB0aGlzLmNvbmZpZyksXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludGVyblBhcmVudHMucHVzaChrZXkpO1xuICAgICAgICBncm91cFtrZXldID0gdGhpcy5jcmVhdGVGb3JtKGZpZWxkc1trZXldLmZpZWxkcyBhcyBJR3JhcGhRTFR5cGVDb2xsZWN0aW9uLCBpbnRlcm5QYXJlbnRzKTtcbiAgICAgICAgaW50ZXJuUGFyZW50cyA9IFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmxvZ2dpbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OmNyZWF0ZUZvcm0tPmdyb3VwJywgZ3JvdXApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVW50eXBlZEZvcm1Hcm91cChncm91cCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBmb3JtIHZhbGlkYXRvcnMgZm9yIGNvbnRyb2xcbiAgICovXG4gIHByb2Nlc3NWYWxpZGF0b3JzKGNvbmZpZzogYW55LCB2YWx1ZTogSUdyYXBoUUxUeXBlQ29sbGVjdGlvbiB8IEdyYXBoUUxUeXBlKSB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xuXG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgaWYgKGNvbmZpZz8ucmVxdWlyZWQgIT09IHVuZGVmaW5lZCA/IGNvbmZpZz8ucmVxdWlyZWQgOiB2YWx1ZS5pc1JlcXVpcmVkKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZz8udHlwZSA9PT0gJ0VtYWlsJykge1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goZnVsbEVtYWlsKCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnPy50eXBlID09PSAnUGFzc3dvcmQnKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCg2KSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnPy5taW4gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbihjb25maWcubWluKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnPy5tYXggPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heChjb25maWcubWF4KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZz8udmFsaWRhdG9ycykpIHtcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKC4uLmNvbmZpZz8udmFsaWRhdG9ycyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XG4gIH1cblxuICAvKipcbiAgICogSXQgY2FsbHMgdGhlIGdyYXBoUUxTZXJ2aWNlIHRvIGRlbGV0ZSB0aGUgb2JqZWN0IHdpdGggdGhlIGlkIG9mIHRoZSBvYmplY3QgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgZWRpdGVkXG4gICAqL1xuICBkZWxldGVPYmplY3QoKSB7XG4gICAgdGhpcy5jbXNTZXJ2aWNlLmRlbGV0ZU9iamVjdCh0aGlzLmlkLCB0aGlzLm1vZGVsTmFtZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KHtcbiAgICAgICAgaWQ6IHRoaXMubW9kZWxOYW1lICsgJy1zdWNjZXNzJyxcbiAgICAgICAgdHlwZTogVG9hc3RUeXBlLlNVQ0NFU1MsXG4gICAgICAgIHRpdGxlOiAnRXJmb2xncmVpY2gnLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5sYWJlbCArICcgd3VyZGUgZXJmb2xncmVpY2ggZ2Vsw7ZzY2h0LicsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZmluaXNoZWQuZW1pdChudWxsKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCBzZW5kcyBhIEdyYXBoUUwgbXV0YXRpb24gdG8gdGhlIHNlcnZlciB0byBkdXBsaWNhdGUgdGhlIG9iamVjdFxuICAgKi9cbiAgYXN5bmMgZHVwbGljYXRlT2JqZWN0KCkge1xuICAgIHRoaXMuY21zU2VydmljZS5kdXBsaWNhdGVPYmplY3QodGhpcy5pZCwgdGhpcy5tb2RlbE5hbWUpLnRoZW4oYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWU/LmlkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLi4vJ10sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgaWQ6IHRoaXMubW9kZWxOYW1lICsgJy1zdWNjZXNzJyxcbiAgICAgICAgICB0eXBlOiBUb2FzdFR5cGUuU1VDQ0VTUyxcbiAgICAgICAgICB0aXRsZTogJ0VyZm9sZ3JlaWNoJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5sYWJlbCArICcgd3VyZGUgZXJmb2xncmVpY2ggZHVwbGl6aWVydC4nLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmluaXNoZWQuZW1pdChudWxsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCB0YWtlcyBhIHN0cmluZywgY2FwaXRhbGl6ZXMgdGhlIGZpcnN0IGxldHRlciwgYW5kIHJldHVybnMgdGhlIG1vZGlmaWVkIHN0cmluZ1xuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgc3RyaW5nIHRvIGNhcGl0YWxpemUuXG4gICAqIEByZXR1cm5zIFRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIHN0cmluZyBpcyBiZWluZyBjYXBpdGFsaXplZCBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyBpcyBiZWluZyByZXR1cm5lZC5cbiAgICovXG4gIGNhcGl0YWxpemVGaXJzdExldHRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY21zU2VydmljZS5jYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IHRha2VzIGFuIEFic3RyYWN0Q29udHJvbCBhbmQgcmV0dXJucyBhIEZvcm1Db250cm9sXG4gICAqXG4gICAqIEBwYXJhbSBjb250cm9sIC0gQWJzdHJhY3RDb250cm9sIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgKiBAcmV0dXJucyBBIEZvcm1Db250cm9sXG4gICAqL1xuICB0cmFuc2Zvcm1Ub0NvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjb250cm9sIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCB0YWtlcyB0aGUga2V5IG9mIHRoZSBmb3JtIGNvbnRyb2wgdGhhdCBoYXMgY2hhbmdlZCwgZ2V0cyB0aGUgdmFsdWUgb2YgdGhhdCBmb3JtIGNvbnRyb2wsIGNyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlXG4gICAqIGtleSBhbmQgdmFsdWUsIGFuZCB0aGVuIHNlbmRzIHRoYXQgb2JqZWN0IHRvIHRoZSBHcmFwaFFMIHNlcnZlciB0byB1cGRhdGUgdGhlIGRhdGFiYXNlXG4gICAqL1xuICBpbWFnZUNoYW5nZWQoa2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYXRhID0ge307XG4gICAgZGF0YVtrZXldID0gdGhpcy5mb3JtLmdldChrZXkpLnZhbHVlO1xuXG4gICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgY29uc29sZS5sb2coJ01vZGVsRm9ybUNvbXBvbmVudDo6aW1hZ2VDaGFuZ2VkLT5ib2R5JywgZGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZ3JhcGhRTFNlcnZpY2VcbiAgICAgICAgICAuZ3JhcGhRbCgndXBkYXRlJyArIHRoaXMuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRoaXMubW9kZWxOYW1lKSwge1xuICAgICAgICAgICAgYXJndW1lbnRzOiB7IGlkOiB0aGlzLmlkLCBpbnB1dDogZGF0YSB9LFxuICAgICAgICAgICAgZmllbGRzOiBbJ2lkJ10sXG4gICAgICAgICAgICB0eXBlOiBHcmFwaFFMUmVxdWVzdFR5cGUuTVVUQVRJT04sXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAodGhpcy5sb2dnaW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZGVsRm9ybUNvbXBvbmVudDo6aW1hZ2VDaGFuZ2VkLT5zdWNjZXNzJywgdmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAodGhpcy5sb2dnaW5nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ01vZGVsRm9ybUNvbXBvbmVudDo6aW1hZ2VDaGFuZ2VkLT5lcnJvcicsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0IHRha2VzIHRoZSBmb3JtLCB2YWxpZGF0ZXMgaXQsIGFuZCB0aGVuIHNlbmRzIGl0IHRvIHRoZSBHcmFwaFFMIHNlcnZlclxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgaWQgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgb3IgdXBkYXRlZCBvYmplY3QuXG4gICAqL1xuICBzdWJtaXQoc2VjcmV0ID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFzZWNyZXQpIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkICYmICFzZWNyZXQpIHtcbiAgICAgICAgdGhpcy5mb3Jtc1NlcnZpY2UudmFsaWRhdGVBbGxGb3JtRmllbGRzKHRoaXMuZm9ybSBhcyBhbnkpO1xuICAgICAgICB0aGlzLmZvcm1zU2VydmljZS5zY3JvbGxUb0ludmFsaWRDb250cm9sKHRoaXMuZm9ybSk7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wZXJhdGlvbiA9PT0gJ3VwZGF0ZScgJiYgIXRoaXMuaWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignSUQgaXMgbWlzc2luZyBmb3IgdXBkYXRlIScpO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5sb2dnaW5nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OnN1Ym1pdC0+Zm9ybVZhbHVlJywgdGhpcy5mb3JtLnZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJlcGFyZSBkYXRhIGZvciBzZXJ2ZXIgcmVxdWVzdFxuICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmZvcm0udmFsdWUpO1xuICAgICAgZGF0YSA9IHRoaXMucHJlcGFyZURhdGFGb3JSZXF1ZXN0KHRoaXMuY29uZmlnLCB0aGlzLmZpZWxkcywgZGF0YSk7XG5cbiAgICAgIGlmICh0aGlzLmxvZ2dpbmcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ01vZGVsRm9ybUNvbXBvbmVudDo6c3VibWl0LT52YWx1ZVRvR3JhcGhxbCcsIGRhdGEpO1xuICAgICAgICBjb25zb2xlLmxvZygnTW9kZWxGb3JtQ29tcG9uZW50OjpzdWJtaXQtPmZpbGVDaGFuZ2VzJywgdGhpcy5maWxlQ2hhbmdlcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmZpbGVDaGFuZ2VzPy5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlQ2hhbmdlIG9mIHRoaXMuZmlsZUNoYW5nZXMpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBmaWxlQ2hhbmdlLmZpZWxkO1xuICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMubmVzdGVkT2JqZWN0KGtleSwgdGhpcy5jb25maWcpO1xuXG4gICAgICAgICAgaWYgKGZpbGVDaGFuZ2UuZmlsZSkge1xuICAgICAgICAgICAgLy8gVXBsb2FkXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZm9ybS5nZXQoa2V5KS52YWx1ZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBpcyBhbiBJRCBvciBhIGJhc2U2NCBzdHJpbmdcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIC8vIERlbGV0ZSBpZiBJRFxuICAgICAgICAgICAgICBpZiAoIXRoaXMuZm9ybS5nZXQoa2V5KS52YWx1ZT8uc3RhcnRzV2l0aCgnZGF0YTonKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZVJlc3VsdCA9IGF3YWl0IHRoaXMuZmlsZVNlcnZpY2UuZGVsZXRlKFxuICAgICAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCB0aGlzLmNvbmZpZyk/LnVybCxcbiAgICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkT2JqZWN0KGtleSwgdGhpcy5jb25maWcpPy5kZWxldGVQYXRoIHx8ICcvZmlsZXMvJyxcbiAgICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkT2JqZWN0KGtleSwgdGhpcy5vYmplY3QpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChkZWxldGVSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkT2JqZWN0KGtleSwgZGF0YSwgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHVwbG9hZFJlc3VsdCA9IGF3YWl0IHRoaXMuZmlsZVNlcnZpY2UudXBsb2FkKFxuICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkT2JqZWN0KGtleSwgdGhpcy5jb25maWcpPy51cmwsXG4gICAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCB0aGlzLmNvbmZpZyk/LnVwbG9hZFBhdGggfHwgJy9maWxlcy91cGxvYWQnLFxuICAgICAgICAgICAgICAgIGZpbGVDaGFuZ2UuZmlsZVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICh1cGxvYWRSZXN1bHQ/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCBkYXRhLCB1cGxvYWRSZXN1bHQuaWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZz8uaW1hZ2VNb2RlICYmIGNvbmZpZz8uaW1hZ2VNb2RlICE9PSAnZmlsZScpIHtcbiAgICAgICAgICAgICAgLy8gRGVsZXRlXG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZmlsZVNlcnZpY2UuZGVsZXRlKFxuICAgICAgICAgICAgICAgIGNvbmZpZz8udXJsLFxuICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkT2JqZWN0KGtleSwgdGhpcy5jb25maWcpPy5kZWxldGVQYXRoIHx8ICcvZmlsZXMvJyxcbiAgICAgICAgICAgICAgICB0aGlzLm5lc3RlZE9iamVjdChrZXksIHRoaXMub2JqZWN0KVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5lc3RlZE9iamVjdChrZXksIGRhdGEsICcnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmdyYXBoUUxTZXJ2aWNlXG4gICAgICAgIC5ncmFwaFFsKHRoaXMub3BlcmF0aW9uICsgdGhpcy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIodGhpcy5tb2RlbE5hbWUpLCB7XG4gICAgICAgICAgYXJndW1lbnRzOiB0aGlzLm9wZXJhdGlvbiA9PT0gJ3VwZGF0ZScgPyB7IGlkOiB0aGlzLmlkLCBpbnB1dDogZGF0YSB9IDogeyBpbnB1dDogZGF0YSB9LFxuICAgICAgICAgIGZpZWxkczogWydpZCddLFxuICAgICAgICAgIHR5cGU6IEdyYXBoUUxSZXF1ZXN0VHlwZS5NVVRBVElPTixcbiAgICAgICAgfSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNlY3JldCkge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy5maW5pc2hlZC5lbWl0KG51bGwpO1xuICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5tb2RlbE5hbWUgKyAnLXN1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgIHR5cGU6IFRvYXN0VHlwZS5TVUNDRVNTLFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnRXJmb2xncmVpY2gnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCArICcgd3VyZGUgZXJmb2xncmVpY2ggJyArICh0aGlzLm9wZXJhdGlvbiA9PT0gJ2NyZWF0ZScgPyAnZXJzdGVsbHQuJyA6ICdha3R1YWxpc2llcnQuJyksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNlY3JldCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgb24gJyArIHRoaXMub3BlcmF0aW9uLCBlcnIpO1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5tb2RlbE5hbWUgKyAnLXN1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgIHR5cGU6IFRvYXN0VHlwZS5FUlJPUixcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICAgICdCZWltICcgK1xuICAgICAgICAgICAgICAgICAgKHRoaXMub3BlcmF0aW9uID09PSAnY3JlYXRlJyA/ICdlcnN0ZWxsZW4nIDogJ2FrdHVhbGlzaWVyZW4nKSArXG4gICAgICAgICAgICAgICAgICAnIHZvbiAnICtcbiAgICAgICAgICAgICAgICAgIHRoaXMubGFiZWwgK1xuICAgICAgICAgICAgICAgICAgJyBpc3QgZXR3YXMgc2NoaWVmZ2VsYXVmZW4uJyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZGF0YSBmb3Igc2VydmVyXG4gICAqL1xuICBwcmVwYXJlRGF0YUZvclJlcXVlc3QoY29uZmlnLCBmaWVsZHNDb25maWcsIGRhdGEpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICBpZiAoKHRoaXMuZmllbGRzW2tleV0/LnR5cGUgPT09ICdEYXRlVGltZScgfHwgdGhpcy5jb25maWdba2V5XT8udHlwZSA9PT0gJ0RhdGVUaW1lJykgJiYgdmFsdWUgPT09ICcnKSB7XG4gICAgICAgIGRhdGFba2V5XSA9IG51bGw7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGNvbmZpZ1trZXldPy5yb2xlcyA/ICF0aGlzLnVzZXIuaGFzQWxsUm9sZXMoY29uZmlnW2tleV0/LnJvbGVzKSA6IGZhbHNlKSB8fCBjb25maWdba2V5XT8uZXhjbHVkZSkge1xuICAgICAgICBkZWxldGUgZGF0YVtrZXldO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHRoaXMuZmllbGRzW2tleV0/LnR5cGUgIT09ICdVcGxvYWQnKSB7XG4gICAgICAgIGRhdGFba2V5XSA9IE9iamVjdC5rZXlzKGRhdGFba2V5XSlcbiAgICAgICAgICAuZmlsdGVyKChrKSA9PiBkYXRhW2tleV1ba10gIT0gbnVsbClcbiAgICAgICAgICAucmVkdWNlKChhLCBrKSA9PiAoeyAuLi5hLCBba106IGRhdGFba2V5XVtrXSB9KSwge30pO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhW2tleV0pPy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnaW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnT2JqZWN0IGlzIGVtcHR5IGZyb20gcmVzdWx0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRhdGFba2V5XSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHR5cGUgZm9yIGdyYXBocWwgbWV0aG9kXG4gICAgICBpZiAoZmllbGRzQ29uZmlnW2tleV0/LnR5cGUgPT09ICdGbG9hdCcpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgZGF0YVtrZXldID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRhW2tleV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZHNDb25maWdba2V5XT8uZmllbGRzICYmIE9iamVjdC5rZXlzKGZpZWxkc0NvbmZpZ1trZXldPy5maWVsZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGF0YVtrZXldID0gdGhpcy5wcmVwYXJlRGF0YUZvclJlcXVlc3QoY29uZmlnW2tleV0/LmZpZWxkcywgZmllbGRzQ29uZmlnW2tleV0/LmZpZWxkcywgZGF0YVtrZXldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0IGZhYiBidXR0b25zIGZvciBtb2JpbGUgZGV2aWNlc1xuICAgKi9cbiAgaW5pdEZhYkFjdGlvbnMoKSB7XG4gICAgY29uc3Qgc2F2ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgIHRoaXMuZmFiQnV0dG9ucy5wdXNoKHsgaWNvbjogJ2JpLWNoZWNrLWxnJywgY29sb3I6ICd2YXIoLS1icy1zdWNjZXNzKScsIGV2ZW50OiBzYXZlRXZlbnQgfSk7XG4gICAgc2F2ZUV2ZW50LnN1YnNjcmliZSgoKSA9PiB0aGlzLnN1Ym1pdChmYWxzZSkpO1xuXG4gICAgaWYgKHRoaXMuZHVwbGljYXRlICYmIHRoaXMub3BlcmF0aW9uID09PSAndXBkYXRlJykge1xuICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgICB0aGlzLmZhYkJ1dHRvbnMucHVzaCh7IGljb246ICdiaS1iYWNrJywgY29sb3I6ICd2YXIoLS1icy1pbmZvKScsIGV2ZW50IH0pO1xuICAgICAgZXZlbnQuc3Vic2NyaWJlKCgpID0+IHRoaXMuZHVwbGljYXRlT2JqZWN0KCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wZXJhdGlvbiA9PT0gJ3VwZGF0ZScgJiYgdGhpcy5kZWxldGUpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgICAgdGhpcy5mYWJCdXR0b25zLnB1c2goeyBpY29uOiAnYmktdHJhc2gzJywgY29sb3I6ICd2YXIoLS1icy1kYW5nZXIpJywgZXZlbnQgfSk7XG4gICAgICBldmVudC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kZWxldGVPYmplY3QoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBmaWxlIGNoYW5nZXMgZm9yIHByb2Nlc3NcbiAgICovXG4gIHByb2Nlc3NGaWxlQ2hhbmdlcyhldmVudDogeyBmaWVsZDogc3RyaW5nOyBmaWxlOiBGaWxlIHwgbnVsbDsgYmFzZTY0OiBzdHJpbmcgfCBudWxsIH0pIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZmlsZUNoYW5nZXM/LmZpbmRJbmRleCgoZSkgPT4gZS5maWVsZCA9PT0gZXZlbnQuZmllbGQpO1xuXG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZpbGVDaGFuZ2VzW2luZGV4XSA9IGV2ZW50O1xuICAgIH0gZWxzZSBpZiAodGhpcy5maWxlQ2hhbmdlcykge1xuICAgICAgdGhpcy5maWxlQ2hhbmdlcy5wdXNoKGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWxlQ2hhbmdlcyA9IFtldmVudF07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGRhdGUpIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgcmV0dXJuIG5ld0RhdGUudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwgMTYpO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXN0ZWRPYmplY3Qoa2V5OiBzdHJpbmcsIG5lc3RlZE9iamVjdDogYW55LCB2YWx1ZT86IGFueSkge1xuICAgIGNvbnN0IHByb3BzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgbGV0IHJlc3VsdDogYW55ID0gbmVzdGVkT2JqZWN0O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlICYmIGkgPT09IHByb3BzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgcmVzdWx0W3Byb3BzW2ldXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0W3Byb3BzW2ldXTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0ID1cbiAgICAgICAgcmVzdWx0W3Byb3BzW2ldXT8uZmllbGRzICYmIE9iamVjdC5rZXlzKHJlc3VsdFtwcm9wc1tpXV0/LmZpZWxkcyk/Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHJlc3VsdFtwcm9wc1tpXV0/LmZpZWxkc1xuICAgICAgICAgIDogcmVzdWx0W3Byb3BzW2ldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidy0xMDBcIiAqbmdJZj1cImZvcm1cIj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtdC0zXCI+XG4gICAgPGRpdiBjbGFzcz1cInJlc3BvbnNpdmUtYmFjayBkLWZsZXggZC1sZy1ub25lXCI+XG4gICAgICA8aSBjbGFzcz1cImJpIGJpLWFycm93LWxlZnRcIiByb3V0ZXJMaW5rPVwiLi4vXCI+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxoMiBjbGFzcz1cIm1iLTBcIj5cbiAgICAgIHt7IGxhYmVsID8gbGFiZWwgOiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIobW9kZWxOYW1lKSB9fSB7eyBvcGVyYXRpb24gPT09ICd1cGRhdGUnID8gJ2JlYXJiZWl0ZW4nIDogJ2Vyc3RlbGxlbicgfX1cbiAgICA8L2gyPlxuXG4gICAgPGRpdiBjbGFzcz1cImQtbm9uZSBkLWxnLWZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBtZS0yXCIgKm5nSWY9XCJpZCAmJiBkdXBsaWNhdGUgJiYgIV9sb2FkaW5nXCIgKGNsaWNrKT1cImR1cGxpY2F0ZU9iamVjdCgpXCI+XG4gICAgICAgIER1cGxpemllcmVuXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFmb3JtLnRvdWNoZWQgJiYgIWZvcm0uZGlydHlcIlxuICAgICAgICAoY2xpY2spPVwic3VibWl0KGZhbHNlKVwiXG4gICAgICAgICpuZ0lmPVwiIV9sb2FkaW5nXCJcbiAgICAgID5cbiAgICAgICAge3sgb3BlcmF0aW9uID09PSAnY3JlYXRlJyA/ICdFcnN0ZWxsZW4nIDogJ1NwZWljaGVybicgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBkaXNhYmxlZCAqbmdJZj1cIl9sb2FkaW5nXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc21cIiByb2xlPVwic3RhdHVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICB7eyBvcGVyYXRpb24gPT09ICdjcmVhdGUnID8gJ0Vyc3RlbGxlbicgOiAnU3BlaWNoZXJuJyB9fS4uLlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDxiYXNlLW1vZGVsLWZvcm0tc3ViXG4gICAgICBbaWRdPVwiaWRcIlxuICAgICAgW2ZpZWxkc109XCJmaWVsZHNcIlxuICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICAoaW1hZ2VDaGFuZ2VkKT1cImltYWdlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgIChmaWxlQ2hhbmdlZCk9XCJwcm9jZXNzRmlsZUNoYW5nZXMoJGV2ZW50KVwiXG4gICAgPjwvYmFzZS1tb2RlbC1mb3JtLXN1Yj5cblxuICAgIDxkaXYgY2xhc3M9XCJkLW5vbmUgZC1sZy1mbGV4IG10LTRcIiBbbmdDbGFzc109XCJpZCAmJiBkZWxldGUgPyAnanVzdGlmeS1jb250ZW50LWJldHdlZW4nIDogJ2p1c3RpZnktY29udGVudC1lbmQnXCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaWQgJiYgZGVsZXRlXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZGVsZXRlT2JqZWN0KClcIj5Mw7ZzY2hlbjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhZm9ybS50b3VjaGVkICYmICFmb3JtLmRpcnR5XCJcbiAgICAgICAgICAoY2xpY2spPVwic3VibWl0KGZhbHNlKVwiXG4gICAgICAgICAgKm5nSWY9XCIhX2xvYWRpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgb3BlcmF0aW9uID09PSAnY3JlYXRlJyA/ICdFcnN0ZWxsZW4nIDogJ1NwZWljaGVybicgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgZGlzYWJsZWQgKm5nSWY9XCJfbG9hZGluZ1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc21cIiByb2xlPVwic3RhdHVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgIHt7IG9wZXJhdGlvbiA9PT0gJ2NyZWF0ZScgPyAnRXJzdGVsbGVuJyA6ICdTcGVpY2hlcm4nIH19Li4uXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiZC1ibG9jayBkLWxnLW5vbmUgcmVzcG9uc2l2ZS1hY3Rpb24tYnV0dG9uXCIgKm5nSWY9XCJzaG93RmF2QnV0dG9uXCI+XG4gIDxiYXNlLWZhYi1idXR0b24gW2J1dHRvbnNdPVwiZmFiQnV0dG9uc1wiPjwvYmFzZS1mYWItYnV0dG9uPlxuPC9kaXY+XG4iXX0=