verben-ticketing-ui 0.6.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 (237) hide show
  1. package/README.md +25 -0
  2. package/esm2022/public-api.mjs +9 -0
  3. package/esm2022/src/lib/components/add-ticket/add-ticket.component.mjs +306 -0
  4. package/esm2022/src/lib/components/add-ticket/add-ticket.module.mjs +98 -0
  5. package/esm2022/src/lib/components/add-ticket/index.mjs +2 -0
  6. package/esm2022/src/lib/components/add-ticket/public-api.mjs +3 -0
  7. package/esm2022/src/lib/components/add-ticket/verben-ticketing-ui-src-lib-components-add-ticket.mjs +5 -0
  8. package/esm2022/src/lib/components/file-render/file-render.component.mjs +34 -0
  9. package/esm2022/src/lib/components/file-render/file-render.module.mjs +94 -0
  10. package/esm2022/src/lib/components/file-render/index.mjs +2 -0
  11. package/esm2022/src/lib/components/file-render/public-api.mjs +3 -0
  12. package/esm2022/src/lib/components/file-render/verben-ticketing-ui-src-lib-components-file-render.mjs +5 -0
  13. package/esm2022/src/lib/components/ticketing/base-table-style.mjs +56 -0
  14. package/esm2022/src/lib/components/ticketing/index.mjs +2 -0
  15. package/esm2022/src/lib/components/ticketing/public-api.mjs +4 -0
  16. package/esm2022/src/lib/components/ticketing/ticketing.component.mjs +813 -0
  17. package/esm2022/src/lib/components/ticketing/ticketing.module.mjs +96 -0
  18. package/esm2022/src/lib/components/ticketing/ticketing.service.mjs +220 -0
  19. package/esm2022/src/lib/components/ticketing/verben-ticketing-ui-src-lib-components-ticketing.mjs +5 -0
  20. package/esm2022/src/lib/components/ticketing-detail/chat-control/chat-control.component.mjs +240 -0
  21. package/esm2022/src/lib/components/ticketing-detail/chat-control/chat-control.module.mjs +98 -0
  22. package/esm2022/src/lib/components/ticketing-detail/index.mjs +2 -0
  23. package/esm2022/src/lib/components/ticketing-detail/public-api.mjs +3 -0
  24. package/esm2022/src/lib/components/ticketing-detail/ticketing-detail.component.mjs +592 -0
  25. package/esm2022/src/lib/components/ticketing-detail/ticketing-detail.module.mjs +109 -0
  26. package/esm2022/src/lib/components/ticketing-detail/verben-ticketing-ui-src-lib-components-ticketing-detail.mjs +5 -0
  27. package/esm2022/src/lib/constants/index.mjs +2 -0
  28. package/esm2022/src/lib/constants/keynames.mjs +2 -0
  29. package/esm2022/src/lib/constants/pagesize.mjs +3 -0
  30. package/esm2022/src/lib/constants/public-api.mjs +3 -0
  31. package/esm2022/src/lib/constants/verben-ticketing-ui-src-lib-constants.mjs +5 -0
  32. package/esm2022/src/lib/models/Application.mjs +2 -0
  33. package/esm2022/src/lib/models/ApplicationRoleAction.mjs +2 -0
  34. package/esm2022/src/lib/models/ApplicationRoleContext.mjs +2 -0
  35. package/esm2022/src/lib/models/BaseModel.mjs +2 -0
  36. package/esm2022/src/lib/models/CacheDataRequest.mjs +2 -0
  37. package/esm2022/src/lib/models/Company.mjs +2 -0
  38. package/esm2022/src/lib/models/ErrorResponse.mjs +11 -0
  39. package/esm2022/src/lib/models/File.mjs +2 -0
  40. package/esm2022/src/lib/models/FilterTypes.mjs +9 -0
  41. package/esm2022/src/lib/models/HttpRequestType.mjs +8 -0
  42. package/esm2022/src/lib/models/KeyValueParam.mjs +2 -0
  43. package/esm2022/src/lib/models/ModelRelationship.mjs +2 -0
  44. package/esm2022/src/lib/models/OAuthParam.mjs +2 -0
  45. package/esm2022/src/lib/models/OAuthType.mjs +9 -0
  46. package/esm2022/src/lib/models/PagedResult.mjs +2 -0
  47. package/esm2022/src/lib/models/PasswordRequestParam.mjs +2 -0
  48. package/esm2022/src/lib/models/PermissionConfig.mjs +2 -0
  49. package/esm2022/src/lib/models/ResponseKeyValue.mjs +2 -0
  50. package/esm2022/src/lib/models/Role.mjs +2 -0
  51. package/esm2022/src/lib/models/RoleAction.mjs +2 -0
  52. package/esm2022/src/lib/models/RoleContext.mjs +2 -0
  53. package/esm2022/src/lib/models/Schedule.mjs +2 -0
  54. package/esm2022/src/lib/models/ScheduleType.mjs +6 -0
  55. package/esm2022/src/lib/models/SearchDynamicWrapper.mjs +2 -0
  56. package/esm2022/src/lib/models/SearchOperator.mjs +6 -0
  57. package/esm2022/src/lib/models/SearchPropertySign.mjs +11 -0
  58. package/esm2022/src/lib/models/SearchPropertyValue.mjs +2 -0
  59. package/esm2022/src/lib/models/SearchPropertyValueType.mjs +11 -0
  60. package/esm2022/src/lib/models/SortDirection.mjs +7 -0
  61. package/esm2022/src/lib/models/TaskUser.mjs +2 -0
  62. package/esm2022/src/lib/models/Tenant.mjs +2 -0
  63. package/esm2022/src/lib/models/TenantConfig.mjs +2 -0
  64. package/esm2022/src/lib/models/TenantPriority.mjs +2 -0
  65. package/esm2022/src/lib/models/Ticket.mjs +2 -0
  66. package/esm2022/src/lib/models/TicketMessage.mjs +2 -0
  67. package/esm2022/src/lib/models/TicketStatus.mjs +8 -0
  68. package/esm2022/src/lib/models/UserRequest.mjs +2 -0
  69. package/esm2022/src/lib/models/auth-mechanism.mjs +8 -0
  70. package/esm2022/src/lib/models/base.mjs +2 -0
  71. package/esm2022/src/lib/models/conditions.mjs +13 -0
  72. package/esm2022/src/lib/models/index.mjs +2 -0
  73. package/esm2022/src/lib/models/log-in.mjs +2 -0
  74. package/esm2022/src/lib/models/mainUser.mjs +2 -0
  75. package/esm2022/src/lib/models/oauth-resp.mjs +2 -0
  76. package/esm2022/src/lib/models/oauth-response.mjs +2 -0
  77. package/esm2022/src/lib/models/object-state.mjs +8 -0
  78. package/esm2022/src/lib/models/otpValue.mjs +2 -0
  79. package/esm2022/src/lib/models/paged.mjs +2 -0
  80. package/esm2022/src/lib/models/public-api.mjs +57 -0
  81. package/esm2022/src/lib/models/query-params.mjs +2 -0
  82. package/esm2022/src/lib/models/request-status.mjs +5 -0
  83. package/esm2022/src/lib/models/resend-otp-data.mjs +2 -0
  84. package/esm2022/src/lib/models/sign-up.mjs +2 -0
  85. package/esm2022/src/lib/models/single-sign-on.mjs +2 -0
  86. package/esm2022/src/lib/models/status.mjs +6 -0
  87. package/esm2022/src/lib/models/user-access-request-status.mjs +7 -0
  88. package/esm2022/src/lib/models/user-access-request.mjs +2 -0
  89. package/esm2022/src/lib/models/user-management.mjs +2 -0
  90. package/esm2022/src/lib/models/user.mjs +2 -0
  91. package/esm2022/src/lib/models/verben-ticketing-ui-src-lib-models.mjs +5 -0
  92. package/esm2022/src/lib/pipes/async-label.pipe.mjs +26 -0
  93. package/esm2022/src/lib/pipes/company-date.pipe.mjs +30 -0
  94. package/esm2022/src/lib/pipes/ellipse-word.pipe.mjs +23 -0
  95. package/esm2022/src/lib/pipes/index.mjs +2 -0
  96. package/esm2022/src/lib/pipes/public-api.mjs +4 -0
  97. package/esm2022/src/lib/pipes/verben-ticketing-ui-src-lib-pipes.mjs +5 -0
  98. package/esm2022/src/lib/services/company-settings.service.mjs +23 -0
  99. package/esm2022/src/lib/services/environment.service.mjs +26 -0
  100. package/esm2022/src/lib/services/http-web-request.service.mjs +100 -0
  101. package/esm2022/src/lib/services/import.service.mjs +247 -0
  102. package/esm2022/src/lib/services/index.mjs +2 -0
  103. package/esm2022/src/lib/services/label.service.mjs +261 -0
  104. package/esm2022/src/lib/services/public-api.mjs +8 -0
  105. package/esm2022/src/lib/services/shared.service.mjs +58 -0
  106. package/esm2022/src/lib/services/util.service.mjs +72 -0
  107. package/esm2022/src/lib/services/verben-ticketing-ui-src-lib-services.mjs +5 -0
  108. package/esm2022/src/utils/components/base-data-view.component.mjs +111 -0
  109. package/esm2022/src/utils/index.mjs +2 -0
  110. package/esm2022/src/utils/models/DataViewConfig.mjs +2 -0
  111. package/esm2022/src/utils/public-api.mjs +3 -0
  112. package/esm2022/src/utils/verben-ticketing-ui-src-utils.mjs +5 -0
  113. package/esm2022/verben-ticketing-ui.mjs +5 -0
  114. package/fesm2022/verben-ticketing-ui-src-lib-components-add-ticket.mjs +403 -0
  115. package/fesm2022/verben-ticketing-ui-src-lib-components-add-ticket.mjs.map +1 -0
  116. package/fesm2022/verben-ticketing-ui-src-lib-components-file-render.mjs +130 -0
  117. package/fesm2022/verben-ticketing-ui-src-lib-components-file-render.mjs.map +1 -0
  118. package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing-detail.mjs +1018 -0
  119. package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing-detail.mjs.map +1 -0
  120. package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing.mjs +1166 -0
  121. package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing.mjs.map +1 -0
  122. package/fesm2022/verben-ticketing-ui-src-lib-constants.mjs +11 -0
  123. package/fesm2022/verben-ticketing-ui-src-lib-constants.mjs.map +1 -0
  124. package/fesm2022/verben-ticketing-ui-src-lib-models.mjs +138 -0
  125. package/fesm2022/verben-ticketing-ui-src-lib-models.mjs.map +1 -0
  126. package/fesm2022/verben-ticketing-ui-src-lib-pipes.mjs +81 -0
  127. package/fesm2022/verben-ticketing-ui-src-lib-pipes.mjs.map +1 -0
  128. package/fesm2022/verben-ticketing-ui-src-lib-services.mjs +770 -0
  129. package/fesm2022/verben-ticketing-ui-src-lib-services.mjs.map +1 -0
  130. package/fesm2022/verben-ticketing-ui-src-utils.mjs +118 -0
  131. package/fesm2022/verben-ticketing-ui-src-utils.mjs.map +1 -0
  132. package/fesm2022/verben-ticketing-ui.mjs +14 -0
  133. package/fesm2022/verben-ticketing-ui.mjs.map +1 -0
  134. package/index.d.ts +5 -0
  135. package/package.json +82 -0
  136. package/public-api.d.ts +4 -0
  137. package/src/lib/components/add-ticket/add-ticket.component.d.ts +44 -0
  138. package/src/lib/components/add-ticket/add-ticket.module.d.ts +15 -0
  139. package/src/lib/components/add-ticket/index.d.ts +1 -0
  140. package/src/lib/components/add-ticket/public-api.d.ts +2 -0
  141. package/src/lib/components/file-render/file-render.component.d.ts +14 -0
  142. package/src/lib/components/file-render/file-render.module.d.ts +14 -0
  143. package/src/lib/components/file-render/index.d.ts +1 -0
  144. package/src/lib/components/file-render/public-api.d.ts +2 -0
  145. package/src/lib/components/ticketing/base-table-style.d.ts +1 -0
  146. package/src/lib/components/ticketing/index.d.ts +1 -0
  147. package/src/lib/components/ticketing/public-api.d.ts +3 -0
  148. package/src/lib/components/ticketing/ticketing.component.d.ts +100 -0
  149. package/src/lib/components/ticketing/ticketing.module.d.ts +12 -0
  150. package/src/lib/components/ticketing/ticketing.service.d.ts +27 -0
  151. package/src/lib/components/ticketing-detail/chat-control/chat-control.component.d.ts +47 -0
  152. package/src/lib/components/ticketing-detail/chat-control/chat-control.module.d.ts +15 -0
  153. package/src/lib/components/ticketing-detail/index.d.ts +1 -0
  154. package/src/lib/components/ticketing-detail/public-api.d.ts +2 -0
  155. package/src/lib/components/ticketing-detail/ticketing-detail.component.d.ts +77 -0
  156. package/src/lib/components/ticketing-detail/ticketing-detail.module.d.ts +17 -0
  157. package/src/lib/constants/index.d.ts +1 -0
  158. package/src/lib/constants/keynames.d.ts +1 -0
  159. package/src/lib/constants/pagesize.d.ts +2 -0
  160. package/src/lib/constants/public-api.d.ts +2 -0
  161. package/src/lib/models/Application.d.ts +5 -0
  162. package/src/lib/models/ApplicationRoleAction.d.ts +9 -0
  163. package/src/lib/models/ApplicationRoleContext.d.ts +9 -0
  164. package/src/lib/models/BaseModel.d.ts +14 -0
  165. package/src/lib/models/CacheDataRequest.d.ts +7 -0
  166. package/src/lib/models/Company.d.ts +22 -0
  167. package/src/lib/models/ErrorResponse.d.ts +6 -0
  168. package/src/lib/models/File.d.ts +7 -0
  169. package/src/lib/models/FilterTypes.d.ts +6 -0
  170. package/src/lib/models/HttpRequestType.d.ts +6 -0
  171. package/src/lib/models/KeyValueParam.d.ts +5 -0
  172. package/src/lib/models/ModelRelationship.d.ts +7 -0
  173. package/src/lib/models/OAuthParam.d.ts +9 -0
  174. package/src/lib/models/OAuthType.d.ts +7 -0
  175. package/src/lib/models/PagedResult.d.ts +9 -0
  176. package/src/lib/models/PasswordRequestParam.d.ts +5 -0
  177. package/src/lib/models/PermissionConfig.d.ts +7 -0
  178. package/src/lib/models/ResponseKeyValue.d.ts +5 -0
  179. package/src/lib/models/Role.d.ts +9 -0
  180. package/src/lib/models/RoleAction.d.ts +10 -0
  181. package/src/lib/models/RoleContext.d.ts +10 -0
  182. package/src/lib/models/Schedule.d.ts +22 -0
  183. package/src/lib/models/ScheduleType.d.ts +4 -0
  184. package/src/lib/models/SearchDynamicWrapper.d.ts +7 -0
  185. package/src/lib/models/SearchOperator.d.ts +4 -0
  186. package/src/lib/models/SearchPropertySign.d.ts +9 -0
  187. package/src/lib/models/SearchPropertyValue.d.ts +14 -0
  188. package/src/lib/models/SearchPropertyValueType.d.ts +9 -0
  189. package/src/lib/models/SortDirection.d.ts +5 -0
  190. package/src/lib/models/TaskUser.d.ts +10 -0
  191. package/src/lib/models/Tenant.d.ts +22 -0
  192. package/src/lib/models/TenantConfig.d.ts +20 -0
  193. package/src/lib/models/TenantPriority.d.ts +10 -0
  194. package/src/lib/models/Ticket.d.ts +21 -0
  195. package/src/lib/models/TicketMessage.d.ts +11 -0
  196. package/src/lib/models/TicketStatus.d.ts +6 -0
  197. package/src/lib/models/UserRequest.d.ts +32 -0
  198. package/src/lib/models/auth-mechanism.d.ts +14 -0
  199. package/src/lib/models/base.d.ts +12 -0
  200. package/src/lib/models/conditions.d.ts +11 -0
  201. package/src/lib/models/index.d.ts +1 -0
  202. package/src/lib/models/log-in.d.ts +8 -0
  203. package/src/lib/models/mainUser.d.ts +19 -0
  204. package/src/lib/models/oauth-resp.d.ts +6 -0
  205. package/src/lib/models/oauth-response.d.ts +6 -0
  206. package/src/lib/models/object-state.d.ts +6 -0
  207. package/src/lib/models/otpValue.d.ts +9 -0
  208. package/src/lib/models/paged.d.ts +9 -0
  209. package/src/lib/models/public-api.d.ts +56 -0
  210. package/src/lib/models/query-params.d.ts +7 -0
  211. package/src/lib/models/request-status.d.ts +3 -0
  212. package/src/lib/models/resend-otp-data.d.ts +8 -0
  213. package/src/lib/models/sign-up.d.ts +9 -0
  214. package/src/lib/models/single-sign-on.d.ts +7 -0
  215. package/src/lib/models/status.d.ts +4 -0
  216. package/src/lib/models/user-access-request-status.d.ts +5 -0
  217. package/src/lib/models/user-access-request.d.ts +9 -0
  218. package/src/lib/models/user-management.d.ts +8 -0
  219. package/src/lib/models/user.d.ts +24 -0
  220. package/src/lib/pipes/async-label.pipe.d.ts +11 -0
  221. package/src/lib/pipes/company-date.pipe.d.ts +10 -0
  222. package/src/lib/pipes/ellipse-word.pipe.d.ts +8 -0
  223. package/src/lib/pipes/index.d.ts +1 -0
  224. package/src/lib/pipes/public-api.d.ts +3 -0
  225. package/src/lib/services/company-settings.service.d.ts +11 -0
  226. package/src/lib/services/environment.service.d.ts +22 -0
  227. package/src/lib/services/http-web-request.service.d.ts +24 -0
  228. package/src/lib/services/import.service.d.ts +14 -0
  229. package/src/lib/services/index.d.ts +1 -0
  230. package/src/lib/services/label.service.d.ts +24 -0
  231. package/src/lib/services/public-api.d.ts +7 -0
  232. package/src/lib/services/shared.service.d.ts +16 -0
  233. package/src/lib/services/util.service.d.ts +15 -0
  234. package/src/utils/components/base-data-view.component.d.ts +34 -0
  235. package/src/utils/index.d.ts +1 -0
  236. package/src/utils/models/DataViewConfig.d.ts +11 -0
  237. package/src/utils/public-api.d.ts +2 -0
package/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # VerbenNgUi
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.2.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project verben-ticketing-ui` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project verben-ticketing-ui`.
8
+
9
+ > Note: Don't forget to add `--project verben-ticketing-ui` or else it will be added to the default project in your `angular.json` file.
10
+
11
+ ## Build
12
+
13
+ Run `ng build verben-ticketing-ui` to build the project. The build artifacts will be stored in the `dist/` directory.
14
+
15
+ ## Publishing
16
+
17
+ After building your library with `ng build verben-ticketing-ui`, go to the dist folder `cd dist/verben-ticketing-ui` and run `npm publish`.
18
+
19
+ ## Running unit tests
20
+
21
+ Run `ng test verben-ticketing-ui` to execute the unit tests via [Karma](https://karma-runner.github.io).
22
+
23
+ ## Further help
24
+
25
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
@@ -0,0 +1,9 @@
1
+ /*
2
+ * Public API Surface of verben-ticketing-ui
3
+ */
4
+ // Exporting modules
5
+ export * from 'verben-ticketing-ui/src/lib/models';
6
+ export * from 'verben-ticketing-ui/src/lib/services';
7
+ export * from 'verben-ticketing-ui/src/lib/components/ticketing-detail';
8
+ export * from 'verben-ticketing-ui/src/lib/components/ticketing';
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxvQkFBb0I7QUFDcEIsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMseURBQXlELENBQUM7QUFDeEUsY0FBYyxrREFBa0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgdmVyYmVuLXRpY2tldGluZy11aVxuICovXG5cbi8vIEV4cG9ydGluZyBtb2R1bGVzXG5leHBvcnQgKiBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5leHBvcnQgKiBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy90aWNrZXRpbmctZGV0YWlsJztcbmV4cG9ydCAqIGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL3RpY2tldGluZyc7XG4iXX0=
@@ -0,0 +1,306 @@
1
+ import { Component, EventEmitter, Input, Output, } from '@angular/core';
2
+ import { FormControl, Validators, } from '@angular/forms';
3
+ import { ErrorResponse } from 'verben-ticketing-ui/src/lib/models';
4
+ import { ObjectState } from 'verben-ticketing-ui/src/lib/models';
5
+ import { TicketStatus } from 'verben-ticketing-ui/src/lib/models';
6
+ import { DEFAULT_MESSAGE_FOR_INITIAL_UPLOAD } from 'verben-ticketing-ui/src/lib/constants';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/forms";
9
+ import * as i2 from "verben-ticketing-ui/src/lib/services";
10
+ import * as i3 from "@angular/common";
11
+ import * as i4 from "verben-ng-ui";
12
+ import * as i5 from "verben-ticketing-ui/src/lib/components/file-render";
13
+ export class AddTicketComponent {
14
+ fb;
15
+ utilService;
16
+ server;
17
+ sharedService;
18
+ envSvc;
19
+ // test: string = '';
20
+ // logTest() {
21
+ // console.log({ Test: this.test });
22
+ // }
23
+ createTicketForm;
24
+ activeApp = null;
25
+ activeTenant = null;
26
+ selectedTicket = null;
27
+ isVisible = false;
28
+ onOpen = new EventEmitter();
29
+ onClose = new EventEmitter();
30
+ onSave = new EventEmitter();
31
+ priorityOptions = [];
32
+ statusOptions = Object.keys(TicketStatus);
33
+ fileData = [];
34
+ fileUrls = [];
35
+ //attachedMessage: TicketMessage | null = null;
36
+ maxFileSize = 15 * 1024 * 1024;
37
+ defaultCompany = '';
38
+ constructor(fb, utilService, server, sharedService, envSvc) {
39
+ this.fb = fb;
40
+ this.utilService = utilService;
41
+ this.server = server;
42
+ this.sharedService = sharedService;
43
+ this.envSvc = envSvc;
44
+ this.createTicketForm = this.fb.group({
45
+ Title: new FormControl(null, Validators.required),
46
+ Description: new FormControl(null, Validators.required),
47
+ CurrentHandler: new FormControl({
48
+ value: null,
49
+ disabled: true,
50
+ }),
51
+ LastHandler: new FormControl({
52
+ value: null,
53
+ disabled: true,
54
+ }),
55
+ Priority: new FormControl(null, Validators.required),
56
+ Status: new FormControl({ value: TicketStatus.Pending, disabled: true }, Validators.required),
57
+ });
58
+ // this.createTicketForm.controls['CurrentHandler'].disable();
59
+ // this.createTicketForm.controls['LastHandler'].disable();
60
+ }
61
+ ngOnInit() { }
62
+ async ngOnChanges(changes) {
63
+ if (changes['selectedTicket'] && this.selectedTicket) {
64
+ this.createTicketForm.patchValue({
65
+ Title: this.selectedTicket.Title,
66
+ Description: this.selectedTicket.Description,
67
+ CurrentHandler: this.selectedTicket.CurrentHandler,
68
+ LastHandler: this.selectedTicket.LastHandler,
69
+ Priority: this.selectedTicket.Priority,
70
+ Status: this.selectedTicket.Status,
71
+ });
72
+ this.fileUrls = [...this.selectedTicket.FileUrls];
73
+ this.fileData = [];
74
+ }
75
+ else {
76
+ this.createTicketForm.patchValue({
77
+ Title: null,
78
+ Description: null,
79
+ CurrentHandler: null,
80
+ LastHandler: null,
81
+ Priority: null,
82
+ Status: TicketStatus.Pending,
83
+ });
84
+ this.fileUrls = [];
85
+ this.fileData = [];
86
+ }
87
+ if (changes['activeTenant'] && this.activeTenant) {
88
+ const options = await this.sharedService.getAllPrioritiesForTenant(this.activeTenant);
89
+ if (options) {
90
+ this.priorityOptions = options.Result;
91
+ }
92
+ console.log({ Changed: this.priorityOptions });
93
+ }
94
+ else if (changes['activeTenant'] && !this.activeTenant) {
95
+ this.priorityOptions = [];
96
+ // console.log({ Tenant: this.activeTenant, Reset: this.priorityOptions });
97
+ }
98
+ }
99
+ checkForm() {
100
+ if (this.createTicketForm.valid == true) {
101
+ return true;
102
+ }
103
+ return false;
104
+ }
105
+ onModalOpen(event) {
106
+ this.onOpen.emit();
107
+ }
108
+ onModalClose(event) {
109
+ this.onClose.emit(event);
110
+ }
111
+ // filterMessage(message: TicketMessage): TicketMessage {
112
+ // return {
113
+ // ...message,
114
+ // AttachmentUrls: message.AttachmentUrls.filter(
115
+ // (x) => x.split('/').length > 1
116
+ // ),
117
+ // };
118
+ // }
119
+ async save() {
120
+ if (!this.activeApp) {
121
+ return;
122
+ }
123
+ if (!this.activeTenant) {
124
+ return;
125
+ }
126
+ // if (this.selectedTicket && this.attachedMessage) {
127
+ // if (idx > -1) {
128
+ // this.selectedTicket.Messages[idx] = this.filterMessage(
129
+ // this.attachedMessage
130
+ // );
131
+ // } else {
132
+ // if (this.attachedMessage.Attachments.length > 0) {
133
+ // this.selectedTicket.Messages.unshift(
134
+ // this.filterMessage(this.attachedMessage)
135
+ // );
136
+ // }
137
+ // }
138
+ // }
139
+ const item = {
140
+ Title: this.createTicketForm.controls['Title'].value,
141
+ Description: this.createTicketForm.controls['Description'].value,
142
+ CurrentHandler: this.selectedTicket
143
+ ? this.selectedTicket.CurrentHandler
144
+ : undefined,
145
+ LastHandler: this.selectedTicket
146
+ ? this.selectedTicket.LastHandler
147
+ : undefined,
148
+ Priority: this.createTicketForm.controls['Priority'].value,
149
+ App: this.activeApp,
150
+ id: '',
151
+ Status: this.createTicketForm.controls['Status'].value,
152
+ Company: this.defaultCompany,
153
+ Messages: this.selectedTicket ? this.selectedTicket.Messages : [],
154
+ FileData: this.fileData,
155
+ FileUrls: this.selectedTicket ? this.selectedTicket.FileUrls : [],
156
+ Id: '',
157
+ ExecutionTime: this.selectedTicket
158
+ ? this.selectedTicket.ExecutionTime
159
+ : undefined,
160
+ Code: this.selectedTicket ? this.selectedTicket.Code : '',
161
+ TenantId: this.selectedTicket
162
+ ? this.selectedTicket.TenantId
163
+ : this.activeTenant,
164
+ ServiceName: this.selectedTicket ? this.selectedTicket.ServiceName : '',
165
+ CreatedAt: this.selectedTicket
166
+ ? this.selectedTicket.CreatedAt
167
+ : new Date(),
168
+ UpdatedAt: new Date(),
169
+ DataState: this.selectedTicket ? ObjectState.Changed : ObjectState.New,
170
+ };
171
+ if (item.Description.trim().length == 0) {
172
+ this.utilService.showInfo('Description cannot be empty');
173
+ return;
174
+ }
175
+ this.utilService.sendBI(true);
176
+ const res = await this.server.post(`Ticket/SaveTicket`, [item], this.envSvc.environment.TicketingAPI);
177
+ this.utilService.sendBI(false);
178
+ if (res instanceof ErrorResponse) {
179
+ }
180
+ else {
181
+ this.utilService.showSuccess('Ticket saved successfully');
182
+ const result = res;
183
+ if (result.length > 0) {
184
+ var resultItem = result[0];
185
+ this.onSave.emit(resultItem);
186
+ }
187
+ }
188
+ this.onClose.emit();
189
+ }
190
+ generateSixDigitNumber() {
191
+ return Math.floor(100000 + Math.random() * 900000);
192
+ }
193
+ getTicketMessage() {
194
+ if (this.selectedTicket) {
195
+ const initialMessage = this.selectedTicket.Messages.find((x) => x.Subject == DEFAULT_MESSAGE_FOR_INITIAL_UPLOAD);
196
+ if (initialMessage) {
197
+ return { ...initialMessage, DataState: ObjectState.Changed };
198
+ }
199
+ else {
200
+ const newMessage = {
201
+ TicketCode: '',
202
+ Subject: DEFAULT_MESSAGE_FOR_INITIAL_UPLOAD,
203
+ Content: '',
204
+ Attachments: [],
205
+ AttachmentUrls: [],
206
+ Company: this.defaultCompany,
207
+ Id: '',
208
+ Code: '',
209
+ TenantId: '',
210
+ id: '',
211
+ ServiceName: '',
212
+ CreatedAt: new Date(),
213
+ UpdatedAt: new Date(),
214
+ DataState: ObjectState.New,
215
+ };
216
+ return newMessage;
217
+ }
218
+ }
219
+ else {
220
+ const newMessage = {
221
+ TicketCode: '',
222
+ Subject: DEFAULT_MESSAGE_FOR_INITIAL_UPLOAD,
223
+ Content: '',
224
+ Attachments: [],
225
+ AttachmentUrls: [],
226
+ Company: this.defaultCompany,
227
+ Id: '',
228
+ id: '',
229
+ Code: '',
230
+ TenantId: '',
231
+ ServiceName: '',
232
+ CreatedAt: new Date(),
233
+ UpdatedAt: new Date(),
234
+ DataState: ObjectState.New,
235
+ };
236
+ return newMessage;
237
+ }
238
+ }
239
+ triggerFileUpload() {
240
+ const fileInput = document.createElement('input');
241
+ fileInput.type = 'file';
242
+ fileInput.accept = '.png, .jpg, .jpeg, .pdf';
243
+ fileInput.style.display = 'none'; // Hidden file input
244
+ document.body.appendChild(fileInput); // Temporarily add to DOM
245
+ fileInput.addEventListener('change', () => {
246
+ const file = fileInput.files?.[0];
247
+ if (file) {
248
+ this.processFile(file);
249
+ }
250
+ document.body.removeChild(fileInput); // Clean up after use
251
+ });
252
+ fileInput.click(); // Programmatically trigger click
253
+ }
254
+ async processFile(selectedFile) {
255
+ // Check file size
256
+ if (selectedFile.size > this.maxFileSize) {
257
+ const limitInMB = this.maxFileSize / 1024 / 1024;
258
+ this.utilService.showInfo(`File size limit of ${limitInMB}mb exceeded`);
259
+ return;
260
+ }
261
+ // let fileToProcess: globalThis.File | null = selectedFile;
262
+ // const safeNumber: number = 1 * 1024 * 1024;
263
+ // if (fileToProcess.size > safeNumber) {
264
+ // fileToProcess = await this.utilService.compressImage(selectedFile);
265
+ // if (!fileToProcess) {
266
+ // this.utilService.showError('Error compressing image');
267
+ // return;
268
+ // }
269
+ // }
270
+ // Read file and convert to base64
271
+ const reader = new FileReader();
272
+ reader.readAsDataURL(selectedFile);
273
+ reader.onload = () => {
274
+ const base64data = reader.result;
275
+ const file = this.sharedService.createCustomFile(base64data, 0, selectedFile);
276
+ if (file) {
277
+ this.fileData.push(file);
278
+ this.fileUrls.push(`${file.Name}`);
279
+ // this.profileImage = base64data;
280
+ }
281
+ };
282
+ }
283
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddTicketComponent, deps: [{ token: i1.FormBuilder }, { token: i2.UtilService }, { token: i2.HttpWebRequestService }, { token: i2.SharedService }, { token: i2.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component });
284
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AddTicketComponent, selector: "app-add-ticket", inputs: { activeApp: "activeApp", activeTenant: "activeTenant", selectedTicket: "selectedTicket", isVisible: "isVisible", defaultCompany: "defaultCompany" }, outputs: { onOpen: "onOpen", onClose: "onClose", onSave: "onSave" }, usesOnChanges: true, ngImport: i0, template: "<verben-dialogue\n [showCloseIcon]=\"false\"\n [dismissOutsideClick]=\"false\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'ticket-dialog'\"\n [disableFooter]=\"true\"\n (openModal)=\"onModalOpen($event)\"\n [isVisible]=\"isVisible\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n>\n <ng-template #bodyTemplate>\n <div class=\"dialog-body p-[25px] flex flex-col gap-4\">\n <div class=\"dialog-header flex flex-col gap-1\">\n <div class=\"dialog-title font-bold text-xl\">\n {{ this.selectedTicket ? \"Edit Ticket\" : \"Create Ticket\" }}\n </div>\n <div class=\"dialog-subtitle\">\n {{\n this.selectedTicket\n ? \"Fill the form below to edit selected ticket\"\n : \"Fill the form below to create a ticket\"\n }}\n </div>\n </div>\n <!-- <verbena-textarea name=\"Test\" [(ngModel)]=\"test\" />\n <button (click)=\"logTest()\">Log</button> -->\n <div\n [formGroup]=\"createTicketForm\"\n class=\"add-app-form main-form-container flex flex-col gap-2\"\n >\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Title</div>\n <verbena-input\n name=\"Title\"\n placeHolder=\"Title\"\n formControlName=\"Title\"\n />\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Description</div>\n <verbena-input name=\"Description\" formControlName=\"Description\" />\n </div>\n <div\n *ngIf=\"this.selectedTicket\"\n class=\"form-input-container flex flex-col gap-1\"\n >\n <div class=\"font-medium\">Current Handler</div>\n <verbena-input\n name=\"CurrentHandler\"\n placeHolder=\"Current Handler\"\n formControlName=\"CurrentHandler\"\n />\n </div>\n <div\n *ngIf=\"this.selectedTicket\"\n class=\"form-input-container flex flex-col gap-1\"\n >\n <div class=\"font-medium\">Last Handler</div>\n <verbena-input\n name=\"LastHandler\"\n placeHolder=\"Last Handler\"\n formControlName=\"LastHandler\"\n />\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Priority</div>\n <verben-drop-down\n width=\"100%\"\n name=\"Priority\"\n placeholder=\"Select Priority\"\n [options]=\"priorityOptions\"\n optionLabel=\"Name\"\n optionValue=\"Code\"\n formControlName=\"Priority\"\n >\n </verben-drop-down>\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Status</div>\n <verben-drop-down\n width=\"100%\"\n name=\"Status\"\n [disabled]=\"true\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n formControlName=\"Status\"\n >\n </verben-drop-down>\n </div>\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div class=\"attachments-container grid grid-cols-3 gap-2\">\n <ng-container *ngFor=\"let file of this.fileUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n <div\n class=\"upload-section flex flex-col flex-1 items-center justify-center gap-2\"\n >\n <div class=\"flex justify-center\">\n <verbena-button\n [useIcon]=\"true\"\n [icon]=\"'upload'\"\n class=\"verben-secondary-button\"\n [text]=\"'Upload'\"\n (click)=\"triggerFileUpload()\"\n ></verbena-button>\n </div>\n <div class=\"upload-caption text-sm text-center\">\n Include Attachments\n </div>\n </div>\n </div>\n </div>\n <div class=\"dialog-button-container flex justify-end gap-2\">\n <verbena-button\n width=\"100%\"\n class=\"verben-secondary-button\"\n [text]=\"'Close'\"\n (click)=\"onModalClose($event)\"\n >\n </verbena-button>\n <verbena-button\n [disable]=\"!this.checkForm()\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Save'\"\n (click)=\"save()\"\n >\n </verbena-button>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [".attachment-section{border:1px solid #ccc6fbb2;border-radius:5px}::ng-deep .ticket-dialog{max-width:60vw}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: i4.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i4.VerbenDialogueComponent, selector: "verben-dialogue", inputs: ["dialogueWidth", "headerTemplate", "bodyTemplate", "footerTemplate", "showCloseIcon", "dismissOutsideClick", "closeOnEscape", "isVisible", "size", "backdropColor", "customClass", "disableFooter", "margin", "padding", "borderRadius", "dialogueBgColor", "width", "closeIconClass", "boxShadow", "enableTransition", "modalData", "mode", "position", "drawerWidth"], outputs: ["openModal", "closeModal"] }, { kind: "component", type: i4.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i5.FileRenderComponent, selector: "app-file-render", inputs: ["fileUrl"] }] });
285
+ }
286
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddTicketComponent, decorators: [{
287
+ type: Component,
288
+ args: [{ selector: 'app-add-ticket', template: "<verben-dialogue\n [showCloseIcon]=\"false\"\n [dismissOutsideClick]=\"false\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'ticket-dialog'\"\n [disableFooter]=\"true\"\n (openModal)=\"onModalOpen($event)\"\n [isVisible]=\"isVisible\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n>\n <ng-template #bodyTemplate>\n <div class=\"dialog-body p-[25px] flex flex-col gap-4\">\n <div class=\"dialog-header flex flex-col gap-1\">\n <div class=\"dialog-title font-bold text-xl\">\n {{ this.selectedTicket ? \"Edit Ticket\" : \"Create Ticket\" }}\n </div>\n <div class=\"dialog-subtitle\">\n {{\n this.selectedTicket\n ? \"Fill the form below to edit selected ticket\"\n : \"Fill the form below to create a ticket\"\n }}\n </div>\n </div>\n <!-- <verbena-textarea name=\"Test\" [(ngModel)]=\"test\" />\n <button (click)=\"logTest()\">Log</button> -->\n <div\n [formGroup]=\"createTicketForm\"\n class=\"add-app-form main-form-container flex flex-col gap-2\"\n >\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Title</div>\n <verbena-input\n name=\"Title\"\n placeHolder=\"Title\"\n formControlName=\"Title\"\n />\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Description</div>\n <verbena-input name=\"Description\" formControlName=\"Description\" />\n </div>\n <div\n *ngIf=\"this.selectedTicket\"\n class=\"form-input-container flex flex-col gap-1\"\n >\n <div class=\"font-medium\">Current Handler</div>\n <verbena-input\n name=\"CurrentHandler\"\n placeHolder=\"Current Handler\"\n formControlName=\"CurrentHandler\"\n />\n </div>\n <div\n *ngIf=\"this.selectedTicket\"\n class=\"form-input-container flex flex-col gap-1\"\n >\n <div class=\"font-medium\">Last Handler</div>\n <verbena-input\n name=\"LastHandler\"\n placeHolder=\"Last Handler\"\n formControlName=\"LastHandler\"\n />\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Priority</div>\n <verben-drop-down\n width=\"100%\"\n name=\"Priority\"\n placeholder=\"Select Priority\"\n [options]=\"priorityOptions\"\n optionLabel=\"Name\"\n optionValue=\"Code\"\n formControlName=\"Priority\"\n >\n </verben-drop-down>\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Status</div>\n <verben-drop-down\n width=\"100%\"\n name=\"Status\"\n [disabled]=\"true\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n formControlName=\"Status\"\n >\n </verben-drop-down>\n </div>\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div class=\"attachments-container grid grid-cols-3 gap-2\">\n <ng-container *ngFor=\"let file of this.fileUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n <div\n class=\"upload-section flex flex-col flex-1 items-center justify-center gap-2\"\n >\n <div class=\"flex justify-center\">\n <verbena-button\n [useIcon]=\"true\"\n [icon]=\"'upload'\"\n class=\"verben-secondary-button\"\n [text]=\"'Upload'\"\n (click)=\"triggerFileUpload()\"\n ></verbena-button>\n </div>\n <div class=\"upload-caption text-sm text-center\">\n Include Attachments\n </div>\n </div>\n </div>\n </div>\n <div class=\"dialog-button-container flex justify-end gap-2\">\n <verbena-button\n width=\"100%\"\n class=\"verben-secondary-button\"\n [text]=\"'Close'\"\n (click)=\"onModalClose($event)\"\n >\n </verbena-button>\n <verbena-button\n [disable]=\"!this.checkForm()\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Save'\"\n (click)=\"save()\"\n >\n </verbena-button>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [".attachment-section{border:1px solid #ccc6fbb2;border-radius:5px}::ng-deep .ticket-dialog{max-width:60vw}\n"] }]
289
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.UtilService }, { type: i2.HttpWebRequestService }, { type: i2.SharedService }, { type: i2.EnvironmentService }], propDecorators: { activeApp: [{
290
+ type: Input
291
+ }], activeTenant: [{
292
+ type: Input
293
+ }], selectedTicket: [{
294
+ type: Input
295
+ }], isVisible: [{
296
+ type: Input
297
+ }], onOpen: [{
298
+ type: Output
299
+ }], onClose: [{
300
+ type: Output
301
+ }], onSave: [{
302
+ type: Output
303
+ }], defaultCompany: [{
304
+ type: Input
305
+ }] } });
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXRpY2tldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9hZGQtdGlja2V0L2FkZC10aWNrZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbXBvbmVudHMvYWRkLXRpY2tldC9hZGQtdGlja2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLFdBQVcsRUFFWCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQVNsRSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7OztBQVMzRixNQUFNLE9BQU8sa0JBQWtCO0lBdUJuQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBMUJWLHFCQUFxQjtJQUNyQixjQUFjO0lBQ2Qsc0NBQXNDO0lBQ3RDLElBQUk7SUFDSixnQkFBZ0IsQ0FBWTtJQUNuQixTQUFTLEdBQWtCLElBQUksQ0FBQztJQUNoQyxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUNuQyxjQUFjLEdBQWtCLElBQUksQ0FBQztJQUNyQyxTQUFTLEdBQVksS0FBSyxDQUFDO0lBQzFCLE1BQU0sR0FBd0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUNqRCxPQUFPLEdBQXdCLElBQUksWUFBWSxF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OENBQThDO1FBQzlDLHlDQUF5QztRQUN6Qyx3RUFBd0U7UUFDeEUsMEJBQTBCO1FBQzFCLDZEQUE2RDtRQUM3RCxjQUFjO1FBQ2QsTUFBTTtRQUNOLElBQUk7UUFFSixrQ0FBa0M7UUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO1lBQ25CLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFnQixDQUFDO1lBQzNDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQzlDLFVBQVUsRUFDVixDQUFDLEVBQ0QsWUFBWSxDQUNiLENBQUM7WUFDRixJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNuQyxrQ0FBa0M7WUFDcEMsQ0FBQztRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7d0dBelNVLGtCQUFrQjs0RkFBbEIsa0JBQWtCLDhTQ3JDL0IsNnRKQXdJQTs7NEZEbkdhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxnQkFBZ0I7Mk1BVWpCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQVFFLGNBQWM7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1CdWlsZGVyLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbiB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBPYmplY3RTdGF0ZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgVGlja2V0IH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBUaWNrZXRTdGF0dXMgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7XG4gIFV0aWxTZXJ2aWNlIGFzIEFwcFV0aWxTZXJ2aWNlLFxuICBFbnZpcm9ubWVudFNlcnZpY2UsXG59IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBIdHRwV2ViUmVxdWVzdFNlcnZpY2UgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvc2VydmljZXMnO1xuXG5pbXBvcnQgeyBUZW5hbnRQcmlvcml0eSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgVGlja2V0TWVzc2FnZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgREVGQVVMVF9NRVNTQUdFX0ZPUl9JTklUSUFMX1VQTE9BRCB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRmlsZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hZGQtdGlja2V0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC10aWNrZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYWRkLXRpY2tldC5jb21wb25lbnQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQWRkVGlja2V0Q29tcG9uZW50IHtcbiAgLy8gdGVzdDogc3RyaW5nID0gJyc7XG4gIC8vIGxvZ1Rlc3QoKSB7XG4gIC8vICAgY29uc29sZS5sb2coeyBUZXN0OiB0aGlzLnRlc3QgfSk7XG4gIC8vIH1cbiAgY3JlYXRlVGlja2V0Rm9ybTogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBhY3RpdmVBcHA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBhY3RpdmVUZW5hbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBzZWxlY3RlZFRpY2tldDogVGlja2V0IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGlzVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgb25PcGVuOiBFdmVudEVtaXR0ZXI8RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25DbG9zZTogRXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uU2F2ZTogRXZlbnRFbWl0dGVyPFRpY2tldD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJpb3JpdHlPcHRpb25zOiBUZW5hbnRQcmlvcml0eVtdID0gW107XG4gIHN0YXR1c09wdGlvbnM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMoVGlja2V0U3RhdHVzKTtcbiAgZmlsZURhdGE6IEZpbGVbXSA9IFtdO1xuICBmaWxlVXJsczogc3RyaW5nW10gPSBbXTtcbiAgLy9hdHRhY2hlZE1lc3NhZ2U6IFRpY2tldE1lc3NhZ2UgfCBudWxsID0gbnVsbDtcbiAgbWF4RmlsZVNpemUgPSAxNSAqIDEwMjQgKiAxMDI0O1xuICBASW5wdXQoKSBkZWZhdWx0Q29tcGFueTogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSB1dGlsU2VydmljZTogQXBwVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZXJ2ZXI6IEh0dHBXZWJSZXF1ZXN0U2VydmljZSxcbiAgICBwcml2YXRlIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbnZTdmM6IEVudmlyb25tZW50U2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5jcmVhdGVUaWNrZXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBUaXRsZTogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgRGVzY3JpcHRpb246IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIEN1cnJlbnRIYW5kbGVyOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4oe1xuICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIExhc3RIYW5kbGVyOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4oe1xuICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIFByaW9yaXR5OiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBTdGF0dXM6IG5ldyBGb3JtQ29udHJvbDxUaWNrZXRTdGF0dXM+KFxuICAgICAgICB7IHZhbHVlOiBUaWNrZXRTdGF0dXMuUGVuZGluZywgZGlzYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLmNyZWF0ZVRpY2tldEZvcm0uY29udHJvbHNbJ0N1cnJlbnRIYW5kbGVyJ10uZGlzYWJsZSgpO1xuICAgIC8vIHRoaXMuY3JlYXRlVGlja2V0Rm9ybS5jb250cm9sc1snTGFzdEhhbmRsZXInXS5kaXNhYmxlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFRpY2tldCddICYmIHRoaXMuc2VsZWN0ZWRUaWNrZXQpIHtcbiAgICAgIHRoaXMuY3JlYXRlVGlja2V0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgVGl0bGU6IHRoaXMuc2VsZWN0ZWRUaWNrZXQuVGl0bGUsXG4gICAgICAgIERlc2NyaXB0aW9uOiB0aGlzLnNlbGVjdGVkVGlja2V0LkRlc2NyaXB0aW9uLFxuICAgICAgICBDdXJyZW50SGFuZGxlcjogdGhpcy5zZWxlY3RlZFRpY2tldC5DdXJyZW50SGFuZGxlcixcbiAgICAgICAgTGFzdEhhbmRsZXI6IHRoaXMuc2VsZWN0ZWRUaWNrZXQuTGFzdEhhbmRsZXIsXG4gICAgICAgIFByaW9yaXR5OiB0aGlzLnNlbGVjdGVkVGlja2V0LlByaW9yaXR5LFxuICAgICAgICBTdGF0dXM6IHRoaXMuc2VsZWN0ZWRUaWNrZXQuU3RhdHVzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmZpbGVVcmxzID0gWy4uLnRoaXMuc2VsZWN0ZWRUaWNrZXQuRmlsZVVybHNdO1xuICAgICAgdGhpcy5maWxlRGF0YSA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZVRpY2tldEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIFRpdGxlOiBudWxsLFxuICAgICAgICBEZXNjcmlwdGlvbjogbnVsbCxcbiAgICAgICAgQ3VycmVudEhhbmRsZXI6IG51bGwsXG4gICAgICAgIExhc3RIYW5kbGVyOiBudWxsLFxuICAgICAgICBQcmlvcml0eTogbnVsbCxcbiAgICAgICAgU3RhdHVzOiBUaWNrZXRTdGF0dXMuUGVuZGluZyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5maWxlVXJscyA9IFtdO1xuICAgICAgdGhpcy5maWxlRGF0YSA9IFtdO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydhY3RpdmVUZW5hbnQnXSAmJiB0aGlzLmFjdGl2ZVRlbmFudCkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMuc2hhcmVkU2VydmljZS5nZXRBbGxQcmlvcml0aWVzRm9yVGVuYW50KFxuICAgICAgICB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICk7XG4gICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICB0aGlzLnByaW9yaXR5T3B0aW9ucyA9IG9wdGlvbnMuUmVzdWx0O1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coeyBDaGFuZ2VkOiB0aGlzLnByaW9yaXR5T3B0aW9ucyB9KTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZXNbJ2FjdGl2ZVRlbmFudCddICYmICF0aGlzLmFjdGl2ZVRlbmFudCkge1xuICAgICAgdGhpcy5wcmlvcml0eU9wdGlvbnMgPSBbXTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKHsgVGVuYW50OiB0aGlzLmFjdGl2ZVRlbmFudCwgUmVzZXQ6IHRoaXMucHJpb3JpdHlPcHRpb25zIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrRm9ybSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jcmVhdGVUaWNrZXRGb3JtLnZhbGlkID09IHRydWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvbk1vZGFsT3BlbihldmVudDogYW55KSB7XG4gICAgdGhpcy5vbk9wZW4uZW1pdCgpO1xuICB9XG5cbiAgb25Nb2RhbENsb3NlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm9uQ2xvc2UuZW1pdChldmVudCk7XG4gIH1cblxuICAvLyBmaWx0ZXJNZXNzYWdlKG1lc3NhZ2U6IFRpY2tldE1lc3NhZ2UpOiBUaWNrZXRNZXNzYWdlIHtcbiAgLy8gICByZXR1cm4ge1xuICAvLyAgICAgLi4ubWVzc2FnZSxcbiAgLy8gICAgIEF0dGFjaG1lbnRVcmxzOiBtZXNzYWdlLkF0dGFjaG1lbnRVcmxzLmZpbHRlcihcbiAgLy8gICAgICAgKHgpID0+IHguc3BsaXQoJy8nKS5sZW5ndGggPiAxXG4gIC8vICAgICApLFxuICAvLyAgIH07XG4gIC8vIH1cblxuICBhc3luYyBzYXZlKCkge1xuICAgIGlmICghdGhpcy5hY3RpdmVBcHApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmFjdGl2ZVRlbmFudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBpZiAodGhpcy5zZWxlY3RlZFRpY2tldCAmJiB0aGlzLmF0dGFjaGVkTWVzc2FnZSkge1xuICAgIC8vICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgLy8gICAgIHRoaXMuc2VsZWN0ZWRUaWNrZXQuTWVzc2FnZXNbaWR4XSA9IHRoaXMuZmlsdGVyTWVzc2FnZShcbiAgICAvLyAgICAgICB0aGlzLmF0dGFjaGVkTWVzc2FnZVxuICAgIC8vICAgICApO1xuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgaWYgKHRoaXMuYXR0YWNoZWRNZXNzYWdlLkF0dGFjaG1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAvLyAgICAgICB0aGlzLnNlbGVjdGVkVGlja2V0Lk1lc3NhZ2VzLnVuc2hpZnQoXG4gICAgLy8gICAgICAgICB0aGlzLmZpbHRlck1lc3NhZ2UodGhpcy5hdHRhY2hlZE1lc3NhZ2UpXG4gICAgLy8gICAgICAgKTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIGNvbnN0IGl0ZW06IFRpY2tldCA9IHtcbiAgICAgIFRpdGxlOiB0aGlzLmNyZWF0ZVRpY2tldEZvcm0uY29udHJvbHNbJ1RpdGxlJ10udmFsdWUsXG4gICAgICBEZXNjcmlwdGlvbjogdGhpcy5jcmVhdGVUaWNrZXRGb3JtLmNvbnRyb2xzWydEZXNjcmlwdGlvbiddLnZhbHVlLFxuICAgICAgQ3VycmVudEhhbmRsZXI6IHRoaXMuc2VsZWN0ZWRUaWNrZXRcbiAgICAgICAgPyB0aGlzLnNlbGVjdGVkVGlja2V0LkN1cnJlbnRIYW5kbGVyXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgTGFzdEhhbmRsZXI6IHRoaXMuc2VsZWN0ZWRUaWNrZXRcbiAgICAgICAgPyB0aGlzLnNlbGVjdGVkVGlja2V0Lkxhc3RIYW5kbGVyXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgUHJpb3JpdHk6IHRoaXMuY3JlYXRlVGlja2V0Rm9ybS5jb250cm9sc1snUHJpb3JpdHknXS52YWx1ZSxcbiAgICAgIEFwcDogdGhpcy5hY3RpdmVBcHAsXG4gICAgICBpZDogJycsXG4gICAgICBTdGF0dXM6IHRoaXMuY3JlYXRlVGlja2V0Rm9ybS5jb250cm9sc1snU3RhdHVzJ10udmFsdWUsXG4gICAgICBDb21wYW55OiB0aGlzLmRlZmF1bHRDb21wYW55LFxuICAgICAgTWVzc2FnZXM6IHRoaXMuc2VsZWN0ZWRUaWNrZXQgPyB0aGlzLnNlbGVjdGVkVGlja2V0Lk1lc3NhZ2VzIDogW10sXG4gICAgICBGaWxlRGF0YTogdGhpcy5maWxlRGF0YSxcbiAgICAgIEZpbGVVcmxzOiB0aGlzLnNlbGVjdGVkVGlja2V0ID8gdGhpcy5zZWxlY3RlZFRpY2tldC5GaWxlVXJscyA6IFtdLFxuICAgICAgSWQ6ICcnLFxuICAgICAgRXhlY3V0aW9uVGltZTogdGhpcy5zZWxlY3RlZFRpY2tldFxuICAgICAgICA/IHRoaXMuc2VsZWN0ZWRUaWNrZXQuRXhlY3V0aW9uVGltZVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIENvZGU6IHRoaXMuc2VsZWN0ZWRUaWNrZXQgPyB0aGlzLnNlbGVjdGVkVGlja2V0LkNvZGUgOiAnJyxcbiAgICAgIFRlbmFudElkOiB0aGlzLnNlbGVjdGVkVGlja2V0XG4gICAgICAgID8gdGhpcy5zZWxlY3RlZFRpY2tldC5UZW5hbnRJZFxuICAgICAgICA6IHRoaXMuYWN0aXZlVGVuYW50LFxuICAgICAgU2VydmljZU5hbWU6IHRoaXMuc2VsZWN0ZWRUaWNrZXQgPyB0aGlzLnNlbGVjdGVkVGlja2V0LlNlcnZpY2VOYW1lIDogJycsXG4gICAgICBDcmVhdGVkQXQ6IHRoaXMuc2VsZWN0ZWRUaWNrZXRcbiAgICAgICAgPyB0aGlzLnNlbGVjdGVkVGlja2V0LkNyZWF0ZWRBdFxuICAgICAgICA6IG5ldyBEYXRlKCksXG4gICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICBEYXRhU3RhdGU6IHRoaXMuc2VsZWN0ZWRUaWNrZXQgPyBPYmplY3RTdGF0ZS5DaGFuZ2VkIDogT2JqZWN0U3RhdGUuTmV3LFxuICAgIH07XG5cbiAgICBpZiAoaXRlbS5EZXNjcmlwdGlvbi50cmltKCkubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oJ0Rlc2NyaXB0aW9uIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgYFRpY2tldC9TYXZlVGlja2V0YCxcbiAgICAgIFtpdGVtXSxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dTdWNjZXNzKCdUaWNrZXQgc2F2ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXMgYXMgVGlja2V0W107XG4gICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHJlc3VsdEl0ZW0gPSByZXN1bHRbMF07XG4gICAgICAgIHRoaXMub25TYXZlLmVtaXQocmVzdWx0SXRlbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vbkNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIGdlbmVyYXRlU2l4RGlnaXROdW1iZXIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcigxMDAwMDAgKyBNYXRoLnJhbmRvbSgpICogOTAwMDAwKTtcbiAgfVxuXG4gIGdldFRpY2tldE1lc3NhZ2UoKTogVGlja2V0TWVzc2FnZSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUaWNrZXQpIHtcbiAgICAgIGNvbnN0IGluaXRpYWxNZXNzYWdlID0gdGhpcy5zZWxlY3RlZFRpY2tldC5NZXNzYWdlcy5maW5kKFxuICAgICAgICAoeCkgPT4geC5TdWJqZWN0ID09IERFRkFVTFRfTUVTU0FHRV9GT1JfSU5JVElBTF9VUExPQUQsXG4gICAgICApO1xuICAgICAgaWYgKGluaXRpYWxNZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmluaXRpYWxNZXNzYWdlLCBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLkNoYW5nZWQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld01lc3NhZ2U6IFRpY2tldE1lc3NhZ2UgPSB7XG4gICAgICAgICAgVGlja2V0Q29kZTogJycsXG4gICAgICAgICAgU3ViamVjdDogREVGQVVMVF9NRVNTQUdFX0ZPUl9JTklUSUFMX1VQTE9BRCxcbiAgICAgICAgICBDb250ZW50OiAnJyxcbiAgICAgICAgICBBdHRhY2htZW50czogW10sXG4gICAgICAgICAgQXR0YWNobWVudFVybHM6IFtdLFxuICAgICAgICAgIENvbXBhbnk6IHRoaXMuZGVmYXVsdENvbXBhbnksXG4gICAgICAgICAgSWQ6ICcnLFxuICAgICAgICAgIENvZGU6ICcnLFxuICAgICAgICAgIFRlbmFudElkOiAnJyxcbiAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAgICAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXdNZXNzYWdlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXdNZXNzYWdlOiBUaWNrZXRNZXNzYWdlID0ge1xuICAgICAgICBUaWNrZXRDb2RlOiAnJyxcbiAgICAgICAgU3ViamVjdDogREVGQVVMVF9NRVNTQUdFX0ZPUl9JTklUSUFMX1VQTE9BRCxcbiAgICAgICAgQ29udGVudDogJycsXG4gICAgICAgIEF0dGFjaG1lbnRzOiBbXSxcbiAgICAgICAgQXR0YWNobWVudFVybHM6IFtdLFxuICAgICAgICBDb21wYW55OiB0aGlzLmRlZmF1bHRDb21wYW55LFxuICAgICAgICBJZDogJycsXG4gICAgICAgIGlkOiAnJyxcbiAgICAgICAgQ29kZTogJycsXG4gICAgICAgIFRlbmFudElkOiAnJyxcbiAgICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ld01lc3NhZ2U7XG4gICAgfVxuICB9XG5cbiAgdHJpZ2dlckZpbGVVcGxvYWQoKTogdm9pZCB7XG4gICAgY29uc3QgZmlsZUlucHV0OiBIVE1MSW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBmaWxlSW5wdXQudHlwZSA9ICdmaWxlJztcbiAgICBmaWxlSW5wdXQuYWNjZXB0ID0gJy5wbmcsIC5qcGcsIC5qcGVnLCAucGRmJztcbiAgICBmaWxlSW5wdXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgLy8gSGlkZGVuIGZpbGUgaW5wdXRcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZpbGVJbnB1dCk7IC8vIFRlbXBvcmFyaWx5IGFkZCB0byBET01cblxuICAgIGZpbGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlID0gZmlsZUlucHV0LmZpbGVzPy5bMF07XG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICB0aGlzLnByb2Nlc3NGaWxlKGZpbGUpO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmaWxlSW5wdXQpOyAvLyBDbGVhbiB1cCBhZnRlciB1c2VcbiAgICB9KTtcblxuICAgIGZpbGVJbnB1dC5jbGljaygpOyAvLyBQcm9ncmFtbWF0aWNhbGx5IHRyaWdnZXIgY2xpY2tcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0ZpbGUoc2VsZWN0ZWRGaWxlOiBnbG9iYWxUaGlzLkZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBmaWxlIHNpemVcbiAgICBpZiAoc2VsZWN0ZWRGaWxlLnNpemUgPiB0aGlzLm1heEZpbGVTaXplKSB7XG4gICAgICBjb25zdCBsaW1pdEluTUIgPSB0aGlzLm1heEZpbGVTaXplIC8gMTAyNCAvIDEwMjQ7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dJbmZvKGBGaWxlIHNpemUgbGltaXQgb2YgJHtsaW1pdEluTUJ9bWIgZXhjZWVkZWRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBsZXQgZmlsZVRvUHJvY2VzczogZ2xvYmFsVGhpcy5GaWxlIHwgbnVsbCA9IHNlbGVjdGVkRmlsZTtcbiAgICAvLyBjb25zdCBzYWZlTnVtYmVyOiBudW1iZXIgPSAxICogMTAyNCAqIDEwMjQ7XG4gICAgLy8gaWYgKGZpbGVUb1Byb2Nlc3Muc2l6ZSA+IHNhZmVOdW1iZXIpIHtcbiAgICAvLyAgIGZpbGVUb1Byb2Nlc3MgPSBhd2FpdCB0aGlzLnV0aWxTZXJ2aWNlLmNvbXByZXNzSW1hZ2Uoc2VsZWN0ZWRGaWxlKTtcbiAgICAvLyAgIGlmICghZmlsZVRvUHJvY2Vzcykge1xuICAgIC8vICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcignRXJyb3IgY29tcHJlc3NpbmcgaW1hZ2UnKTtcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIC8vIFJlYWQgZmlsZSBhbmQgY29udmVydCB0byBiYXNlNjRcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKHNlbGVjdGVkRmlsZSk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2U2NGRhdGEgPSByZWFkZXIucmVzdWx0IGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnNoYXJlZFNlcnZpY2UuY3JlYXRlQ3VzdG9tRmlsZShcbiAgICAgICAgYmFzZTY0ZGF0YSxcbiAgICAgICAgMCxcbiAgICAgICAgc2VsZWN0ZWRGaWxlLFxuICAgICAgKTtcbiAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgIHRoaXMuZmlsZURhdGEucHVzaChmaWxlKTtcbiAgICAgICAgdGhpcy5maWxlVXJscy5wdXNoKGAke2ZpbGUuTmFtZX1gKTtcbiAgICAgICAgLy8gdGhpcy5wcm9maWxlSW1hZ2UgPSBiYXNlNjRkYXRhO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiIsIjx2ZXJiZW4tZGlhbG9ndWVcbiAgW3Nob3dDbG9zZUljb25dPVwiZmFsc2VcIlxuICBbZGlzbWlzc091dHNpZGVDbGlja109XCJmYWxzZVwiXG4gIFtjbG9zZU9uRXNjYXBlXT1cInRydWVcIlxuICBbc2l6ZV09XCInbWVkaXVtJ1wiXG4gIFttb2RlXT1cIidkaWFsb2d1ZSdcIlxuICBbY3VzdG9tQ2xhc3NdPVwiJ3RpY2tldC1kaWFsb2cnXCJcbiAgW2Rpc2FibGVGb290ZXJdPVwidHJ1ZVwiXG4gIChvcGVuTW9kYWwpPVwib25Nb2RhbE9wZW4oJGV2ZW50KVwiXG4gIFtpc1Zpc2libGVdPVwiaXNWaXNpYmxlXCJcbiAgW2JvZHlUZW1wbGF0ZV09XCJib2R5VGVtcGxhdGVcIlxuICAoY2xvc2VNb2RhbCk9XCJvbk1vZGFsQ2xvc2UoJGV2ZW50KVwiXG4+XG4gIDxuZy10ZW1wbGF0ZSAjYm9keVRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYm9keSBwLVsyNXB4XSBmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWhlYWRlciBmbGV4IGZsZXgtY29sIGdhcC0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGUgZm9udC1ib2xkIHRleHQteGxcIj5cbiAgICAgICAgICB7eyB0aGlzLnNlbGVjdGVkVGlja2V0ID8gXCJFZGl0IFRpY2tldFwiIDogXCJDcmVhdGUgVGlja2V0XCIgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctc3VidGl0bGVcIj5cbiAgICAgICAgICB7e1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRpY2tldFxuICAgICAgICAgICAgICA/IFwiRmlsbCB0aGUgZm9ybSBiZWxvdyB0byBlZGl0IHNlbGVjdGVkIHRpY2tldFwiXG4gICAgICAgICAgICAgIDogXCJGaWxsIHRoZSBmb3JtIGJlbG93IHRvIGNyZWF0ZSBhIHRpY2tldFwiXG4gICAgICAgICAgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gPHZlcmJlbmEtdGV4dGFyZWEgbmFtZT1cIlRlc3RcIiBbKG5nTW9kZWwpXT1cInRlc3RcIiAvPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibG9nVGVzdCgpXCI+TG9nPC9idXR0b24+IC0tPlxuICAgICAgPGRpdlxuICAgICAgICBbZm9ybUdyb3VwXT1cImNyZWF0ZVRpY2tldEZvcm1cIlxuICAgICAgICBjbGFzcz1cImFkZC1hcHAtZm9ybSBtYWluLWZvcm0tY29udGFpbmVyIGZsZXggZmxleC1jb2wgZ2FwLTJcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbnB1dC1jb250YWluZXIgZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPlRpdGxlPC9kaXY+XG4gICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgIG5hbWU9XCJUaXRsZVwiXG4gICAgICAgICAgICBwbGFjZUhvbGRlcj1cIlRpdGxlXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIlRpdGxlXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taW5wdXQtY29udGFpbmVyIGZsZXggZmxleC1jb2wgZ2FwLTFcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1tZWRpdW1cIj5EZXNjcmlwdGlvbjwvZGl2PlxuICAgICAgICAgIDx2ZXJiZW5hLWlucHV0IG5hbWU9XCJEZXNjcmlwdGlvblwiIGZvcm1Db250cm9sTmFtZT1cIkRlc2NyaXB0aW9uXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInRoaXMuc2VsZWN0ZWRUaWNrZXRcIlxuICAgICAgICAgIGNsYXNzPVwiZm9ybS1pbnB1dC1jb250YWluZXIgZmxleCBmbGV4LWNvbCBnYXAtMVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1tZWRpdW1cIj5DdXJyZW50IEhhbmRsZXI8L2Rpdj5cbiAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgbmFtZT1cIkN1cnJlbnRIYW5kbGVyXCJcbiAgICAgICAgICAgIHBsYWNlSG9sZGVyPVwiQ3VycmVudCBIYW5kbGVyXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIkN1cnJlbnRIYW5kbGVyXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3RlZFRpY2tldFwiXG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWlucHV0LWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIGdhcC0xXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPkxhc3QgSGFuZGxlcjwvZGl2PlxuICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICBuYW1lPVwiTGFzdEhhbmRsZXJcIlxuICAgICAgICAgICAgcGxhY2VIb2xkZXI9XCJMYXN0IEhhbmRsZXJcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiTGFzdEhhbmRsZXJcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbnB1dC1jb250YWluZXIgZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPlByaW9yaXR5PC9kaXY+XG4gICAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICBuYW1lPVwiUHJpb3JpdHlcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgUHJpb3JpdHlcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwicHJpb3JpdHlPcHRpb25zXCJcbiAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwiTmFtZVwiXG4gICAgICAgICAgICBvcHRpb25WYWx1ZT1cIkNvZGVcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiUHJpb3JpdHlcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3ZlcmJlbi1kcm9wLWRvd24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbnB1dC1jb250YWluZXIgZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPlN0YXR1czwvZGl2PlxuICAgICAgICAgIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgbmFtZT1cIlN0YXR1c1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBTdGF0dXNcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwic3RhdHVzT3B0aW9uc1wiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJTdGF0dXNcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3ZlcmJlbi1kcm9wLWRvd24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0YWNobWVudC1zZWN0aW9uIHAtMiBmbGV4IGZsZXgtY29sIGdhcC0zXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGFjaG1lbnRzLWNvbnRhaW5lciBncmlkIGdyaWQtY29scy0zIGdhcC0yXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWxlIG9mIHRoaXMuZmlsZVVybHNcIj5cbiAgICAgICAgICAgICAgPGFwcC1maWxlLXJlbmRlciBbZmlsZVVybF09XCJmaWxlXCI+PC9hcHAtZmlsZS1yZW5kZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInVwbG9hZC1zZWN0aW9uIGZsZXggZmxleC1jb2wgZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMlwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICAgICAgICAgICAgW3VzZUljb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiJ3VwbG9hZCdcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidmVyYmVuLXNlY29uZGFyeS1idXR0b25cIlxuICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidVcGxvYWQnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlckZpbGVVcGxvYWQoKVwiXG4gICAgICAgICAgICAgID48L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkLWNhcHRpb24gdGV4dC1zbSB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICBJbmNsdWRlIEF0dGFjaG1lbnRzXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBmbGV4IGp1c3RpZnktZW5kIGdhcC0yXCI+XG4gICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgY2xhc3M9XCJ2ZXJiZW4tc2Vjb25kYXJ5LWJ1dHRvblwiXG4gICAgICAgICAgW3RleHRdPVwiJ0Nsb3NlJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uTW9kYWxDbG9zZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICBbZGlzYWJsZV09XCIhdGhpcy5jaGVja0Zvcm0oKVwiXG4gICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICBjbGFzcz1cInZlcmJlbi1wcmltYXJ5LWJ1dHRvblwiXG4gICAgICAgICAgW3RleHRdPVwiJ1NhdmUnXCJcbiAgICAgICAgICAoY2xpY2spPVwic2F2ZSgpXCJcbiAgICAgICAgPlxuICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3ZlcmJlbi1kaWFsb2d1ZT5cbiJdfQ==
@@ -0,0 +1,98 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { ReactiveFormsModule } from '@angular/forms';
5
+ import { CardDataViewModule, DataExportModule, DataTableModule, DataViewModule, DropDownModule, SortTableModule, SvgModule, TableFilterModule, TooltipModule, VerbenaButtonModule, VerbenaInputModule, VerbenaSwitchModule, VerbenDialogueModule, VerbenPopUpModule, VisibleColumnModule, DataImportModule, DataXportModule, } from 'verben-ng-ui';
6
+ import { RouterModule } from '@angular/router';
7
+ import { CompanyDatePipe } from 'verben-ticketing-ui/src/lib/pipes';
8
+ import { EllipseWordPipe } from 'verben-ticketing-ui/src/lib/pipes';
9
+ import { AddTicketComponent } from './add-ticket.component';
10
+ import { FileRenderLibModule } from 'verben-ticketing-ui/src/lib/components/file-render';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/router";
13
+ export const appRoutes = [];
14
+ export class AddTicketLibModule {
15
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddTicketLibModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
16
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: AddTicketLibModule, declarations: [AddTicketComponent], imports: [CommonModule,
17
+ FormsModule,
18
+ ReactiveFormsModule,
19
+ DataTableModule,
20
+ SvgModule,
21
+ VerbenPopUpModule,
22
+ DataViewModule,
23
+ VerbenaButtonModule,
24
+ CardDataViewModule,
25
+ DropDownModule,
26
+ VerbenaSwitchModule,
27
+ TableFilterModule,
28
+ VisibleColumnModule,
29
+ SortTableModule,
30
+ DataExportModule,
31
+ TooltipModule,
32
+ VerbenDialogueModule,
33
+ VerbenaInputModule,
34
+ DataImportModule,
35
+ DataExportModule,
36
+ DataXportModule,
37
+ EllipseWordPipe,
38
+ FileRenderLibModule,
39
+ CompanyDatePipe, i1.RouterModule], exports: [AddTicketComponent] });
40
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddTicketLibModule, imports: [CommonModule,
41
+ FormsModule,
42
+ ReactiveFormsModule,
43
+ DataTableModule,
44
+ SvgModule,
45
+ VerbenPopUpModule,
46
+ DataViewModule,
47
+ VerbenaButtonModule,
48
+ CardDataViewModule,
49
+ DropDownModule,
50
+ VerbenaSwitchModule,
51
+ TableFilterModule,
52
+ VisibleColumnModule,
53
+ SortTableModule,
54
+ DataExportModule,
55
+ TooltipModule,
56
+ VerbenDialogueModule,
57
+ VerbenaInputModule,
58
+ DataImportModule,
59
+ DataExportModule,
60
+ DataXportModule,
61
+ FileRenderLibModule,
62
+ RouterModule.forChild(appRoutes)] });
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddTicketLibModule, decorators: [{
65
+ type: NgModule,
66
+ args: [{
67
+ declarations: [AddTicketComponent],
68
+ imports: [
69
+ CommonModule,
70
+ FormsModule,
71
+ ReactiveFormsModule,
72
+ DataTableModule,
73
+ SvgModule,
74
+ VerbenPopUpModule,
75
+ DataViewModule,
76
+ VerbenaButtonModule,
77
+ CardDataViewModule,
78
+ DropDownModule,
79
+ VerbenaSwitchModule,
80
+ TableFilterModule,
81
+ VisibleColumnModule,
82
+ SortTableModule,
83
+ DataExportModule,
84
+ TooltipModule,
85
+ VerbenDialogueModule,
86
+ VerbenaInputModule,
87
+ DataImportModule,
88
+ DataExportModule,
89
+ DataXportModule,
90
+ EllipseWordPipe,
91
+ FileRenderLibModule,
92
+ CompanyDatePipe,
93
+ RouterModule.forChild(appRoutes),
94
+ ],
95
+ exports: [AddTicketComponent],
96
+ }]
97
+ }] });
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXRpY2tldC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9hZGQtdGlja2V0L2FkZC10aWNrZXQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsY0FBYyxFQUNkLGNBQWMsRUFDZCxlQUFlLEVBQ2YsU0FBUyxFQUNULGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBQ2hCLGVBQWUsR0FDaEIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLFlBQVksRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBRXZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7OztBQUN6RixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQVcsRUFBRSxDQUFDO0FBZ0NwQyxNQUFNLE9BQU8sa0JBQWtCO3dHQUFsQixrQkFBa0I7eUdBQWxCLGtCQUFrQixpQkE5QmQsa0JBQWtCLGFBRS9CLFlBQVk7WUFDWixXQUFXO1lBQ1gsbUJBQW1CO1lBQ25CLGVBQWU7WUFDZixTQUFTO1lBQ1QsaUJBQWlCO1lBQ2pCLGNBQWM7WUFDZCxtQkFBbUI7WUFDbkIsa0JBQWtCO1lBQ2xCLGNBQWM7WUFDZCxtQkFBbUI7WUFDbkIsaUJBQWlCO1lBQ2pCLG1CQUFtQjtZQUNuQixlQUFlO1lBQ2YsZ0JBQWdCO1lBQ2hCLGFBQWE7WUFDYixvQkFBb0I7WUFDcEIsa0JBQWtCO1lBQ2xCLGdCQUFnQjtZQUNoQixnQkFBZ0I7WUFDaEIsZUFBZTtZQUNmLGVBQWU7WUFDZixtQkFBbUI7WUFDbkIsZUFBZSw4QkFHUCxrQkFBa0I7eUdBRWpCLGtCQUFrQixZQTVCM0IsWUFBWTtZQUNaLFdBQVc7WUFDWCxtQkFBbUI7WUFDbkIsZUFBZTtZQUNmLFNBQVM7WUFDVCxpQkFBaUI7WUFDakIsY0FBYztZQUNkLG1CQUFtQjtZQUNuQixrQkFBa0I7WUFDbEIsY0FBYztZQUNkLG1CQUFtQjtZQUNuQixpQkFBaUI7WUFDakIsbUJBQW1CO1lBQ25CLGVBQWU7WUFDZixnQkFBZ0I7WUFDaEIsYUFBYTtZQUNiLG9CQUFvQjtZQUNwQixrQkFBa0I7WUFDbEIsZ0JBQWdCO1lBQ2hCLGdCQUFnQjtZQUNoQixlQUFlO1lBRWYsbUJBQW1CO1lBRW5CLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDOzs0RkFJdkIsa0JBQWtCO2tCQS9COUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztvQkFDbEMsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2YsU0FBUzt3QkFDVCxpQkFBaUI7d0JBQ2pCLGNBQWM7d0JBQ2QsbUJBQW1CO3dCQUNuQixrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsbUJBQW1CO3dCQUNuQixpQkFBaUI7d0JBQ2pCLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLGFBQWE7d0JBQ2Isb0JBQW9CO3dCQUNwQixrQkFBa0I7d0JBQ2xCLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO3FCQUNqQztvQkFDRCxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztpQkFDOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtcbiAgQ2FyZERhdGFWaWV3TW9kdWxlLFxuICBEYXRhRXhwb3J0TW9kdWxlLFxuICBEYXRhVGFibGVNb2R1bGUsXG4gIERhdGFWaWV3TW9kdWxlLFxuICBEcm9wRG93bk1vZHVsZSxcbiAgU29ydFRhYmxlTW9kdWxlLFxuICBTdmdNb2R1bGUsXG4gIFRhYmxlRmlsdGVyTW9kdWxlLFxuICBUb29sdGlwTW9kdWxlLFxuICBWZXJiZW5hQnV0dG9uTW9kdWxlLFxuICBWZXJiZW5hSW5wdXRNb2R1bGUsXG4gIFZlcmJlbmFTd2l0Y2hNb2R1bGUsXG4gIFZlcmJlbkRpYWxvZ3VlTW9kdWxlLFxuICBWZXJiZW5Qb3BVcE1vZHVsZSxcbiAgVmlzaWJsZUNvbHVtbk1vZHVsZSxcbiAgRGF0YUltcG9ydE1vZHVsZSxcbiAgRGF0YVhwb3J0TW9kdWxlLFxufSBmcm9tICd2ZXJiZW4tbmctdWknO1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlLCBSb3V0ZXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBDb21wYW55RGF0ZVBpcGUgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvcGlwZXMnO1xuaW1wb3J0IHsgRWxsaXBzZVdvcmRQaXBlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL3BpcGVzJztcbmltcG9ydCB7IEFkZFRpY2tldENvbXBvbmVudCB9IGZyb20gJy4vYWRkLXRpY2tldC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRmlsZVJlbmRlckxpYk1vZHVsZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2ZpbGUtcmVuZGVyJztcbmV4cG9ydCBjb25zdCBhcHBSb3V0ZXM6IFJvdXRlcyA9IFtdO1xuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbQWRkVGlja2V0Q29tcG9uZW50XSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIERhdGFUYWJsZU1vZHVsZSxcbiAgICBTdmdNb2R1bGUsXG4gICAgVmVyYmVuUG9wVXBNb2R1bGUsXG4gICAgRGF0YVZpZXdNb2R1bGUsXG4gICAgVmVyYmVuYUJ1dHRvbk1vZHVsZSxcbiAgICBDYXJkRGF0YVZpZXdNb2R1bGUsXG4gICAgRHJvcERvd25Nb2R1bGUsXG4gICAgVmVyYmVuYVN3aXRjaE1vZHVsZSxcbiAgICBUYWJsZUZpbHRlck1vZHVsZSxcbiAgICBWaXNpYmxlQ29sdW1uTW9kdWxlLFxuICAgIFNvcnRUYWJsZU1vZHVsZSxcbiAgICBEYXRhRXhwb3J0TW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgVmVyYmVuRGlhbG9ndWVNb2R1bGUsXG4gICAgVmVyYmVuYUlucHV0TW9kdWxlLFxuICAgIERhdGFJbXBvcnRNb2R1bGUsXG4gICAgRGF0YUV4cG9ydE1vZHVsZSxcbiAgICBEYXRhWHBvcnRNb2R1bGUsXG4gICAgRWxsaXBzZVdvcmRQaXBlLFxuICAgIEZpbGVSZW5kZXJMaWJNb2R1bGUsXG4gICAgQ29tcGFueURhdGVQaXBlLFxuICAgIFJvdXRlck1vZHVsZS5mb3JDaGlsZChhcHBSb3V0ZXMpLFxuICBdLFxuICBleHBvcnRzOiBbQWRkVGlja2V0Q29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgQWRkVGlja2V0TGliTW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './public-api';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9hZGQtdGlja2V0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,3 @@
1
+ export * from './add-ticket.component';
2
+ export * from './add-ticket.module';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2FkZC10aWNrZXQvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMscUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FkZC10aWNrZXQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vYWRkLXRpY2tldC5tb2R1bGUnO1xuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyYmVuLXRpY2tldGluZy11aS1zcmMtbGliLWNvbXBvbmVudHMtYWRkLXRpY2tldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2FkZC10aWNrZXQvdmVyYmVuLXRpY2tldGluZy11aS1zcmMtbGliLWNvbXBvbmVudHMtYWRkLXRpY2tldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,34 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "verben-ticketing-ui/src/lib/services";
4
+ import * as i2 from "verben-ng-ui";
5
+ export class FileRenderComponent {
6
+ utilService;
7
+ envSvc;
8
+ fileUrl = null;
9
+ fileName = null;
10
+ constructor(utilService, envSvc) {
11
+ this.utilService = utilService;
12
+ this.envSvc = envSvc;
13
+ }
14
+ ngOnInit() {
15
+ if (this.fileUrl) {
16
+ this.fileName = this.fileUrl.split('/').pop() || null;
17
+ }
18
+ }
19
+ openFile() {
20
+ if (!this.fileUrl) {
21
+ return;
22
+ }
23
+ this.utilService.openFullRouteInNewWindow(`${this.envSvc.environment.FILE_BASE_URL}${this.fileUrl}`);
24
+ }
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileRenderComponent, deps: [{ token: i1.UtilService }, { token: i1.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component });
26
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FileRenderComponent, selector: "app-file-render", inputs: { fileUrl: "fileUrl" }, ngImport: i0, template: "<div class=\"file-container p-2 flex items-center justify-between gap-3\">\n <div class=\"text-sm overflow-x-auto font-semibold\">{{ fileName }}</div>\n <span (click)=\"openFile()\" class=\"cursor-pointer\">\n <verben-svg\n [icon]=\"'download-icon'\"\n [width]=\"20\"\n [height]=\"20\"\n ></verben-svg>\n </span>\n</div>\n", styles: [".file-container{border:1px solid #ccc6fbb2;border-radius:5px}\n"], dependencies: [{ kind: "component", type: i2.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }] });
27
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileRenderComponent, decorators: [{
29
+ type: Component,
30
+ args: [{ selector: 'app-file-render', template: "<div class=\"file-container p-2 flex items-center justify-between gap-3\">\n <div class=\"text-sm overflow-x-auto font-semibold\">{{ fileName }}</div>\n <span (click)=\"openFile()\" class=\"cursor-pointer\">\n <verben-svg\n [icon]=\"'download-icon'\"\n [width]=\"20\"\n [height]=\"20\"\n ></verben-svg>\n </span>\n</div>\n", styles: [".file-container{border:1px solid #ccc6fbb2;border-radius:5px}\n"] }]
31
+ }], ctorParameters: () => [{ type: i1.UtilService }, { type: i1.EnvironmentService }], propDecorators: { fileUrl: [{
32
+ type: Input
33
+ }] } });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1yZW5kZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1yZW5kZXIvZmlsZS1yZW5kZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1yZW5kZXIvZmlsZS1yZW5kZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7Ozs7QUFRekQsTUFBTSxPQUFPLG1CQUFtQjtJQUlWO0lBQWtDO0lBSDdDLE9BQU8sR0FBa0IsSUFBSSxDQUFDO0lBQ3ZDLFFBQVEsR0FBa0IsSUFBSSxDQUFDO0lBRS9CLFlBQW9CLFdBQXVCLEVBQVcsTUFBeUI7UUFBM0QsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFBVyxXQUFNLEdBQU4sTUFBTSxDQUFtQjtJQUFHLENBQUM7SUFFbkYsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDO1FBQ3hELENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUN2QyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQzFELENBQUM7SUFDSixDQUFDO3dHQW5CVSxtQkFBbUI7NEZBQW5CLG1CQUFtQix1RkNSaEMsNFZBVUE7OzRGREZhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUI7aUhBS2xCLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVXRpbFNlcnZpY2UsIEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1maWxlLXJlbmRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlLXJlbmRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9maWxlLXJlbmRlci5jb21wb25lbnQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgRmlsZVJlbmRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGZpbGVVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBmaWxlTmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB1dGlsU2VydmljZTpVdGlsU2VydmljZSAsIHByaXZhdGUgZW52U3ZjOkVudmlyb25tZW50U2VydmljZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maWxlVXJsKSB7XG4gICAgICB0aGlzLmZpbGVOYW1lID0gdGhpcy5maWxlVXJsLnNwbGl0KCcvJykucG9wKCkgfHwgbnVsbDtcbiAgICB9XG4gIH1cblxuICBvcGVuRmlsZSgpIHtcbiAgICBpZiAoIXRoaXMuZmlsZVVybCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLm9wZW5GdWxsUm91dGVJbk5ld1dpbmRvdyhcbiAgICAgIGAke3RoaXMuZW52U3ZjLmVudmlyb25tZW50LkZJTEVfQkFTRV9VUkx9JHt0aGlzLmZpbGVVcmx9YFxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmaWxlLWNvbnRhaW5lciBwLTIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0zXCI+XG4gIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIG92ZXJmbG93LXgtYXV0byBmb250LXNlbWlib2xkXCI+e3sgZmlsZU5hbWUgfX08L2Rpdj5cbiAgPHNwYW4gKGNsaWNrKT1cIm9wZW5GaWxlKClcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+XG4gICAgPHZlcmJlbi1zdmdcbiAgICAgIFtpY29uXT1cIidkb3dubG9hZC1pY29uJ1wiXG4gICAgICBbd2lkdGhdPVwiMjBcIlxuICAgICAgW2hlaWdodF09XCIyMFwiXG4gICAgPjwvdmVyYmVuLXN2Zz5cbiAgPC9zcGFuPlxuPC9kaXY+XG4iXX0=