@po-ui/ng-templates 18.23.1 → 19.0.0-rc.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 (205) hide show
  1. package/fesm2022/po-ui-ng-templates.mjs +139 -122
  2. package/fesm2022/po-ui-ng-templates.mjs.map +1 -1
  3. package/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.d.ts +1 -1
  4. package/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.d.ts +1 -1
  5. package/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.d.ts +1 -1
  6. package/lib/components/po-page-blocked-user/po-page-blocked-user.component.d.ts +1 -1
  7. package/lib/components/po-page-change-password/po-page-change-password-base.component.d.ts +1 -1
  8. package/lib/components/po-page-change-password/po-page-change-password.service.d.ts +1 -1
  9. package/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.d.ts +1 -1
  10. package/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.d.ts +1 -1
  11. package/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.d.ts +2 -2
  12. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.d.ts +1 -1
  13. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.d.ts +1 -1
  14. package/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.d.ts +2 -2
  15. package/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.d.ts +2 -2
  16. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.d.ts +1 -1
  17. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.d.ts +2 -2
  18. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/po-job-scheduler-parameters-template.directive.d.ts +1 -1
  19. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.d.ts +1 -1
  20. package/lib/components/po-page-login/po-page-login-base.component.d.ts +1 -1
  21. package/lib/components/po-page-login/po-page-login.service.d.ts +1 -1
  22. package/package.json +13 -15
  23. package/po-ui-ng-templates-19.0.0-rc.0.tgz +0 -0
  24. package/schematics/ng-add/index.js +2 -2
  25. package/schematics/ng-add/index.js.map +1 -1
  26. package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  27. package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  28. package/schematics/ng-generate/po-page-blocked-user/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  29. package/schematics/ng-generate/po-page-blocked-user/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  30. package/schematics/ng-generate/po-page-blocked-user/index.js +1 -1
  31. package/schematics/ng-generate/po-page-blocked-user/index.js.map +1 -1
  32. package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  33. package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  34. package/schematics/ng-generate/po-page-change-password/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  35. package/schematics/ng-generate/po-page-change-password/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  36. package/schematics/ng-generate/po-page-change-password/index.js +1 -1
  37. package/schematics/ng-generate/po-page-change-password/index.js.map +1 -1
  38. package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  39. package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  40. package/schematics/ng-generate/po-page-dynamic-detail/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  41. package/schematics/ng-generate/po-page-dynamic-detail/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  42. package/schematics/ng-generate/po-page-dynamic-detail/index.js +1 -1
  43. package/schematics/ng-generate/po-page-dynamic-detail/index.js.map +1 -1
  44. package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  45. package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  46. package/schematics/ng-generate/po-page-dynamic-edit/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  47. package/schematics/ng-generate/po-page-dynamic-edit/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  48. package/schematics/ng-generate/po-page-dynamic-edit/index.js +1 -1
  49. package/schematics/ng-generate/po-page-dynamic-edit/index.js.map +1 -1
  50. package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  51. package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  52. package/schematics/ng-generate/po-page-dynamic-search/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  53. package/schematics/ng-generate/po-page-dynamic-search/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  54. package/schematics/ng-generate/po-page-dynamic-search/index.js +1 -1
  55. package/schematics/ng-generate/po-page-dynamic-search/index.js.map +1 -1
  56. package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  57. package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  58. package/schematics/ng-generate/po-page-dynamic-table/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  59. package/schematics/ng-generate/po-page-dynamic-table/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  60. package/schematics/ng-generate/po-page-dynamic-table/index.js +1 -1
  61. package/schematics/ng-generate/po-page-dynamic-table/index.js.map +1 -1
  62. package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  63. package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  64. package/schematics/ng-generate/po-page-job-scheduler/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  65. package/schematics/ng-generate/po-page-job-scheduler/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  66. package/schematics/ng-generate/po-page-job-scheduler/index.js +1 -1
  67. package/schematics/ng-generate/po-page-job-scheduler/index.js.map +1 -1
  68. package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  69. package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  70. package/schematics/ng-generate/po-page-login/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  71. package/schematics/ng-generate/po-page-login/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  72. package/schematics/ng-generate/po-page-login/index.js +1 -1
  73. package/schematics/ng-generate/po-page-login/index.js.map +1 -1
  74. package/esm2022/lib/components/components.module.mjs +0 -84
  75. package/esm2022/lib/components/index.mjs +0 -12
  76. package/esm2022/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-modal-content.enum.mjs +0 -17
  77. package/esm2022/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-type.enum.mjs +0 -17
  78. package/esm2022/lib/components/po-modal-password-recovery/index.mjs +0 -8
  79. package/esm2022/lib/components/po-modal-password-recovery/interfaces/po-modal-password-recovery.interface.mjs +0 -2
  80. package/esm2022/lib/components/po-modal-password-recovery/literals/i18n/po-modal-password-recovery-literals.mjs +0 -119
  81. package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.mjs +0 -293
  82. package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery-error-message/po-modal-password-recovery-error-message.component.mjs +0 -34
  83. package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.component.mjs +0 -451
  84. package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.module.mjs +0 -29
  85. package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.mjs +0 -18
  86. package/esm2022/lib/components/po-page-background/index.mjs +0 -3
  87. package/esm2022/lib/components/po-page-background/po-page-background.component.mjs +0 -191
  88. package/esm2022/lib/components/po-page-background/po-page-background.module.mjs +0 -27
  89. package/esm2022/lib/components/po-page-blocked-user/enums/po-page-blocked-user-reason.enum.mjs +0 -17
  90. package/esm2022/lib/components/po-page-blocked-user/index.mjs +0 -8
  91. package/esm2022/lib/components/po-page-blocked-user/interfaces/po-page-blocked-user-reason-params.interface.mjs +0 -2
  92. package/esm2022/lib/components/po-page-blocked-user/literals/i18n/po-page-blocked-user-literals.mjs +0 -78
  93. package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.mjs +0 -197
  94. package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-contacts/po-page-blocked-user-contacts.component.mjs +0 -105
  95. package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-reason/po-page-blocked-user-reason.component.mjs +0 -107
  96. package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user.component.mjs +0 -108
  97. package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user.module.mjs +0 -29
  98. package/esm2022/lib/components/po-page-change-password/index.mjs +0 -7
  99. package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password-recovery.interface.mjs +0 -2
  100. package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password-requirement.interface.mjs +0 -2
  101. package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password.interface.mjs +0 -2
  102. package/esm2022/lib/components/po-page-change-password/literals/i18n/po-page-change-password-literals.mjs +0 -79
  103. package/esm2022/lib/components/po-page-change-password/po-page-change-password-base.component.mjs +0 -300
  104. package/esm2022/lib/components/po-page-change-password/po-page-change-password.component.mjs +0 -401
  105. package/esm2022/lib/components/po-page-change-password/po-page-change-password.module.mjs +0 -30
  106. package/esm2022/lib/components/po-page-change-password/po-page-change-password.service.mjs +0 -18
  107. package/esm2022/lib/components/po-page-dynamic-detail/index.mjs +0 -10
  108. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-actions.interface.mjs +0 -2
  109. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-back.interface.mjs +0 -2
  110. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-edit.interface.mjs +0 -2
  111. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-remove.interface.mjs +0 -2
  112. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-field.interface.mjs +0 -2
  113. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-metadata.interface.mjs +0 -2
  114. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-options.interface.mjs +0 -2
  115. package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail-actions.service.mjs +0 -44
  116. package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.component.mjs +0 -546
  117. package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.module.mjs +0 -54
  118. package/esm2022/lib/components/po-page-dynamic-edit/index.mjs +0 -11
  119. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-actions.interface.mjs +0 -2
  120. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-cancel.interface.mjs +0 -2
  121. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save-new.interface.mjs +0 -2
  122. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save.interface.mjs +0 -2
  123. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-field.interface.mjs +0 -2
  124. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-literals.interface.mjs +0 -2
  125. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-metadata.interface.mjs +0 -2
  126. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-options.interface.mjs +0 -2
  127. package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit-actions.service.mjs +0 -44
  128. package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.component.mjs +0 -889
  129. package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.module.mjs +0 -60
  130. package/esm2022/lib/components/po-page-dynamic-search/index.mjs +0 -7
  131. package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.mjs +0 -133
  132. package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-literals.interface.mjs +0 -2
  133. package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter.component.mjs +0 -76
  134. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.mjs +0 -365
  135. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-filters.interface.mjs +0 -2
  136. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-literals.interface.mjs +0 -2
  137. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-options.interface.mjs +0 -2
  138. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.mjs +0 -349
  139. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.interface.mjs +0 -2
  140. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.module.mjs +0 -52
  141. package/esm2022/lib/components/po-page-dynamic-table/index.mjs +0 -16
  142. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-actions.interface.mjs +0 -2
  143. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-detail.interface.mjs +0 -2
  144. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-duplicate.interface.mjs +0 -2
  145. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-edit.interface.mjs +0 -2
  146. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-new.interface.mjs +0 -2
  147. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove-all.interface.mjs +0 -2
  148. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove.interface.mjs +0 -2
  149. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.mjs +0 -2
  150. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.mjs +0 -2
  151. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-field.interface.mjs +0 -2
  152. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-filters.interface.mjs +0 -2
  153. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-metadata.interface.mjs +0 -2
  154. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-options.interface.mjs +0 -2
  155. package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.mjs +0 -271
  156. package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table-actions.service.mjs +0 -59
  157. package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table-literals.mjs +0 -63
  158. package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.mjs +0 -1257
  159. package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table.module.mjs +0 -50
  160. package/esm2022/lib/components/po-page-job-scheduler/index.mjs +0 -6
  161. package/esm2022/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler-internal.interface.mjs +0 -2
  162. package/esm2022/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler.interface.mjs +0 -2
  163. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.mjs +0 -302
  164. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.mjs +0 -393
  165. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-internal.mjs +0 -13
  166. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-literals.mjs +0 -195
  167. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-lookup.service.mjs +0 -22
  168. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/index.mjs +0 -2
  169. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/index.mjs +0 -2
  170. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/po-job-scheduler-parameters-template.directive.mjs +0 -92
  171. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-page-job-scheduler-parameters.component.mjs +0 -79
  172. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/index.mjs +0 -2
  173. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-job-scheduler-summary-template/index.mjs +0 -2
  174. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-job-scheduler-summary-template/po-job-scheduler-summary-template.directive.mjs +0 -44
  175. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.mjs +0 -211
  176. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.component.mjs +0 -418
  177. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.module.mjs +0 -85
  178. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.service.mjs +0 -224
  179. package/esm2022/lib/components/po-page-login/enums/po-page-login-authentication-type.enum.mjs +0 -15
  180. package/esm2022/lib/components/po-page-login/index.mjs +0 -8
  181. package/esm2022/lib/components/po-page-login/interfaces/po-page-login-custom-field.interface.mjs +0 -2
  182. package/esm2022/lib/components/po-page-login/interfaces/po-page-login-literals.interface.mjs +0 -2
  183. package/esm2022/lib/components/po-page-login/interfaces/po-page-login-recovery.interface.mjs +0 -2
  184. package/esm2022/lib/components/po-page-login/interfaces/po-page-login.interface.mjs +0 -2
  185. package/esm2022/lib/components/po-page-login/po-page-login-base.component.mjs +0 -1099
  186. package/esm2022/lib/components/po-page-login/po-page-login-popover/po-page-login-popover.component.mjs +0 -137
  187. package/esm2022/lib/components/po-page-login/po-page-login.component.mjs +0 -483
  188. package/esm2022/lib/components/po-page-login/po-page-login.module.mjs +0 -31
  189. package/esm2022/lib/components/po-page-login/po-page-login.service.mjs +0 -32
  190. package/esm2022/lib/index.mjs +0 -4
  191. package/esm2022/lib/po-templates.module.mjs +0 -18
  192. package/esm2022/lib/services/index.mjs +0 -4
  193. package/esm2022/lib/services/po-page-customization/index.mjs +0 -4
  194. package/esm2022/lib/services/po-page-customization/po-page-customization.module.mjs +0 -23
  195. package/esm2022/lib/services/po-page-customization/po-page-customization.service.mjs +0 -86
  196. package/esm2022/lib/services/po-page-customization/po-page-dynamic-options.interface.mjs +0 -2
  197. package/esm2022/lib/services/po-page-dynamic/index.mjs +0 -3
  198. package/esm2022/lib/services/po-page-dynamic/po-page-dynamic-literals.interface.mjs +0 -2
  199. package/esm2022/lib/services/po-page-dynamic/po-page-dynamic.module.mjs +0 -23
  200. package/esm2022/lib/services/po-page-dynamic/po-page-dynamic.service.mjs +0 -106
  201. package/esm2022/lib/services/services.module.mjs +0 -18
  202. package/esm2022/lib/utils/util.mjs +0 -428
  203. package/esm2022/po-ui-ng-templates.mjs +0 -5
  204. package/esm2022/public-api.mjs +0 -2
  205. package/po-ui-ng-templates-18.23.1.tgz +0 -0
@@ -1,889 +0,0 @@
1
- import { Component, Input, ViewChild } from '@angular/core';
2
- import { Observable, concat, of, EMPTY, throwError } from 'rxjs';
3
- import { tap, catchError, map, switchMap } from 'rxjs/operators';
4
- import { poLocaleDefault } from '@po-ui/ng-components';
5
- import { convertToBoolean, mapObjectByProperties, valuesFromObject, removeKeysProperties } from './../../utils/util';
6
- import { PoPageDynamicService } from '../../services/po-page-dynamic/po-page-dynamic.service';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/router";
9
- import * as i2 from "@po-ui/ng-components";
10
- import * as i3 from "../../services/po-page-dynamic/po-page-dynamic.service";
11
- import * as i4 from "../../services/po-page-customization/po-page-customization.service";
12
- import * as i5 from "./po-page-dynamic-edit-actions.service";
13
- import * as i6 from "@angular/common";
14
- const _c0 = ["dynamicForm"];
15
- const _c1 = ["gridDetail"];
16
- function PoPageDynamicEditComponent_ng_container_1_Template(rf, ctx) { if (rf & 1) {
17
- i0.ɵɵelementContainer(0);
18
- } }
19
- function PoPageDynamicEditComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {
20
- i0.ɵɵelementStart(0, "po-widget");
21
- i0.ɵɵelement(1, "po-icon", 6);
22
- i0.ɵɵelementStart(2, "span", 7);
23
- i0.ɵɵtext(3);
24
- i0.ɵɵelementEnd()();
25
- } if (rf & 2) {
26
- const ctx_r0 = i0.ɵɵnextContext();
27
- i0.ɵɵadvance(3);
28
- i0.ɵɵtextInterpolate1(" ", ctx_r0.literals.registerNotFound, " ");
29
- } }
30
- function PoPageDynamicEditComponent_ng_template_4_div_2_Template(rf, ctx) { if (rf & 1) {
31
- const _r2 = i0.ɵɵgetCurrentView();
32
- i0.ɵɵelementStart(0, "div", 10);
33
- i0.ɵɵelement(1, "po-divider", 11);
34
- i0.ɵɵelementStart(2, "div", 12)(3, "po-button", 13);
35
- i0.ɵɵlistener("p-click", function PoPageDynamicEditComponent_ng_template_4_div_2_Template_po_button_p_click_3_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.detailActionNew()); });
36
- i0.ɵɵelementEnd()();
37
- i0.ɵɵelement(4, "po-grid", 14, 3);
38
- i0.ɵɵelementEnd();
39
- } if (rf & 2) {
40
- const ctx_r0 = i0.ɵɵnextContext(2);
41
- i0.ɵɵadvance();
42
- i0.ɵɵproperty("p-label", ctx_r0.detailFields[0].divider);
43
- i0.ɵɵadvance(2);
44
- i0.ɵɵproperty("p-label", ctx_r0.literals.detailActionNew);
45
- i0.ɵɵadvance();
46
- i0.ɵɵproperty("p-row-actions", ctx_r0.detailActions)("p-columns", ctx_r0.detailFields[0].detail.columns)("p-data", ctx_r0.model[ctx_r0.detailFields[0].property]);
47
- } }
48
- function PoPageDynamicEditComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {
49
- i0.ɵɵelement(0, "po-dynamic-form", 8, 2);
50
- i0.ɵɵtemplate(2, PoPageDynamicEditComponent_ng_template_4_div_2_Template, 6, 5, "div", 9);
51
- } if (rf & 2) {
52
- const ctx_r0 = i0.ɵɵnextContext();
53
- i0.ɵɵproperty("p-fields", ctx_r0.controlFields)("p-value", ctx_r0.model);
54
- i0.ɵɵadvance(2);
55
- i0.ɵɵproperty("ngIf", ctx_r0.detailFields.length > 0);
56
- } }
57
- export const poNotificationType = ['error', 'warning'];
58
- export const poNotificationTypeDefault = 'warning';
59
- export const poPageDynamicEditLiteralsDefault = {
60
- en: {
61
- cancelConfirmMessage: 'Are you sure you want to cancel this operation?',
62
- detailActionNew: 'New',
63
- pageActionCancel: 'Cancel',
64
- pageActionSave: 'Save',
65
- pageActionSaveNew: 'Save and new',
66
- registerNotFound: 'Register not found.',
67
- saveNotificationError: 'Mandatory field(s) not filled.',
68
- saveNotificationSuccessSave: 'Resource successfully saved.',
69
- saveNotificationSuccessUpdate: 'Resource successfully updated.',
70
- saveNotificationWarning: 'Form must be filled out correctly.'
71
- },
72
- es: {
73
- cancelConfirmMessage: 'Está seguro de que desea cancelar esta operación?',
74
- detailActionNew: 'Nuevo',
75
- pageActionCancel: 'Cancelar',
76
- pageActionSave: 'Guardar',
77
- pageActionSaveNew: 'Guardar y nuevo',
78
- registerNotFound: 'Registro no encontrado.',
79
- saveNotificationError: 'Campo(s) obligatorio(s) no completado(s).',
80
- saveNotificationSuccessSave: 'Recurso salvo con éxito.',
81
- saveNotificationSuccessUpdate: 'Recurso actualizado con éxito.',
82
- saveNotificationWarning: 'El formulario debe llenarse correctamente.'
83
- },
84
- pt: {
85
- cancelConfirmMessage: 'Tem certeza que deseja cancelar esta operação?',
86
- detailActionNew: 'Novo',
87
- pageActionCancel: 'Cancelar',
88
- pageActionSave: 'Salvar',
89
- pageActionSaveNew: 'Salvar e novo',
90
- registerNotFound: 'Registro não encontrado.',
91
- saveNotificationError: 'Campo(s) obrigatório(s) sem preenchimento.',
92
- saveNotificationSuccessSave: 'Recurso salvo com sucesso.',
93
- saveNotificationSuccessUpdate: 'Recurso atualizado com sucesso.',
94
- saveNotificationWarning: 'Formulário precisa ser preenchido corretamente.'
95
- },
96
- ru: {
97
- cancelConfirmMessage: 'Вы уверены, что хотите отменить эту операцию?',
98
- detailActionNew: 'Новый',
99
- pageActionCancel: 'Отменить',
100
- pageActionSave: 'Сохранить',
101
- pageActionSaveNew: 'Сохранить и создать',
102
- registerNotFound: 'Запись не найдена.',
103
- saveNotificationError: 'Обязательное поле(я) не заполнено.',
104
- saveNotificationSuccessSave: 'Ресурс успешно сохранен.',
105
- saveNotificationSuccessUpdate: 'Ресурс успешно обновлен.',
106
- saveNotificationWarning: 'Форма должна быть заполнена правильно.'
107
- }
108
- };
109
- /**
110
- * @description
111
- *
112
- * O `po-page-dynamic-edit` é uma página que pode servir para editar ou criar novos registros,
113
- * o mesmo também suporta metadados conforme especificado na documentação.
114
- *
115
- * ### Utilização via rota
116
- *
117
- * Ao utilizar as rotas para inicializar o template, o `page-dynamic-edit` disponibiliza propriedades que devem ser fornecidas no arquivo de configuração de rotas da aplicação, para
118
- * poder especificar o endpoint dos dados e dos metadados que serão carregados na inicialização.
119
- *
120
- * Exemplo de utilização:
121
- *
122
- * Arquivo de configuração de rotas da aplicação: `app-routing.module.ts`
123
- * ```
124
- * const routes: Routes = [
125
- * {
126
- * path: 'people',
127
- * component: PoPageDynamicEditComponent,
128
- * data: {
129
- * serviceApi: 'http://localhost:3000/v1/people', // endpoint dos dados
130
- * serviceMetadataApi: 'http://localhost:3000/v1/metadata', // endpoint dos metadados utilizando o método HTTP Get
131
- * serviceLoadApi: 'http://localhost:3000/load-metadata' // endpoint de customizações dos metadados utilizando o método HTTP Post
132
- * }
133
- * },
134
- * {
135
- * path: 'home',
136
- * component: HomeExampleComponent
137
- * }
138
- * ];
139
- *
140
- * ```
141
- * O componente primeiro irá carregar o metadado da rota definida na propriedade serviceMetadataApi
142
- * e depois irá buscar da rota definida na propriedade serviceLoadApi.
143
- *
144
- * A requisição dos metadados é feita na inicialização do template para buscar os metadados da página passando o
145
- * tipo do metadado esperado e a versão cacheada pelo browser.
146
- *
147
- * > Caso o servidor retornar um erro ao recuperar os metadados, serão repassados os metadados salvos em cache,
148
- * se o cache não existir será disparada uma notificação.
149
- *
150
- * Para carregar com um recurso já existente, deve-se ser incluído um parâmetro na rota chamado `id`:
151
- *
152
- * ```
153
- * {
154
- * path: 'people/:id',
155
- * component: PoPageDynamicEditComponent,
156
- * data: {
157
- * serviceApi: 'http://localhost:3000/v1/people', // endpoint dos dados
158
- * serviceMetadataApi: 'http://localhost:3000/v1/metadata', // endpoint dos metadados
159
- * serviceLoadApi: 'http://localhost:3000/load-metadata' // endpoint de customizações dos metadados
160
- * }
161
- * }
162
- * ```
163
- *
164
- * A requisição dos metadados é feita na inicialização do template para buscar os metadados da página passando o
165
- * tipo do metadado esperado e a versão cacheada pelo browser.
166
- *
167
- * O formato esperado na resposta da requisição está especificado na interface
168
- * [PoPageDynamicEditMetadata](/documentation/po-page-dynamic-edit#po-page-dynamic-edit-metadata). Por exemplo:
169
- *
170
- * ```
171
- * {
172
- * version: 1,
173
- * title: 'Person edit',
174
- * fields: [
175
- * { property: 'id', key: true, disabled: true },
176
- * { property: 'status' },
177
- * { property: 'name' },
178
- * { property: 'nickname' },
179
- * { property: 'birthdate', label: 'Birth date' },
180
- * { property: 'genre' },
181
- * { property: 'city' },
182
- * { property: 'country' }
183
- * ]
184
- * }
185
- * ```
186
- *
187
- * > Caso o endpoint dos metadados não seja especificado, será feito uma requisição utilizando o `serviceApi` da seguinte forma:
188
- * ```
189
- * GET {end-point}/metadata?type=edit&version={version}
190
- * ```
191
- *
192
- * @example
193
- *
194
- * <example name="po-page-dynamic-edit-basic" title="PO Page Dynamic Edit Basic">
195
- * <file name="sample-po-page-dynamic-edit-basic/sample-po-page-dynamic-edit-basic.component.html"> </file>
196
- * <file name="sample-po-page-dynamic-edit-basic/sample-po-page-dynamic-edit-basic.component.ts"> </file>
197
- * </example>
198
- *
199
- * <example name="po-page-dynamic-edit-user" title="PO Page Dynamic Edit - User">
200
- * <file name="sample-po-page-dynamic-edit-user/sample-po-page-dynamic-edit-user.component.html"> </file>
201
- * <file name="sample-po-page-dynamic-edit-user/sample-po-page-dynamic-edit-user.component.ts"> </file>
202
- * </example>
203
- */
204
- export class PoPageDynamicEditComponent {
205
- router;
206
- activatedRoute;
207
- poNotification;
208
- poDialogService;
209
- poPageDynamicService;
210
- poPageCustomizationService;
211
- poPageDynamicEditActionsService;
212
- dynamicForm;
213
- gridDetail;
214
- /** Objeto com propriedades do breadcrumb. */
215
- breadcrumb = { items: [] };
216
- /**
217
- * @description
218
- *
219
- * Endpoint usado pelo template para requisição do recurso que será exibido para edição.
220
- *
221
- * Para as ações de `save` e `saveNew`, será feito uma requisição de criação nesse mesmo endpoint passando os valores
222
- * preenchidos pelo usuário via payload.
223
- *
224
- * > `POST {end-point}`
225
- *
226
- * ```
227
- * <po-page-dynamic-edit
228
- * [p-actions]="{ save: '/', saveNew: 'new' }"
229
- * [p-fields]="[ { property: 'name' }, { property: 'city' } ]"
230
- * p-service="/api/po-samples/v1/people"
231
- * ...>
232
- * </po-page-dynamic-edit>
233
- * ```
234
- *
235
- * Resquisição disparada, onde a propriedade `name` e `city` foram preenchidas:
236
- *
237
- * ```
238
- * POST /api/po-samples/v1/people HTTP/1.1
239
- * Host: localhost:4000
240
- * Connection: keep-alive
241
- * Accept: application/json, text/plain
242
- * ...
243
- * ```
244
- *
245
- * Request payload:
246
- *
247
- * ```
248
- * { "name": "Fulano", "city": "Smallville" }
249
- * ```
250
- *
251
- * Caso queira que o template carregue um recurso já existente, deve-se ser incluído um parametro na rota chamado `id`.
252
- *
253
- * Exemplo de configuração de rota:
254
- *
255
- * ```
256
- * RouterModule.forRoot([
257
- * ...
258
- * { path: 'edit/:id', component: PersonEditComponent },
259
- * ...
260
- * ],
261
- * ```
262
- *
263
- * Baseado nisso, na inicialização do template, será disparado uma requisição para buscar o recurso que será editado.
264
- *
265
- * > `GET {end-point}/{id}`
266
- *
267
- * Nos métodos de `save` e `saveNew`, ao invés de um `POST`, será disparado um `PUT`.
268
- *
269
- * Resquisição disparada, onde a propriedade `name` e `city` foram preenchidas / atualizadas, e o `id` da url é 2:
270
- *
271
- * ```
272
- * PUT /api/po-samples/v1/people/2 HTTP/1.1
273
- * Host: localhost:4000
274
- * Connection: keep-alive
275
- * Accept: application/json, text/plain
276
- * ...
277
- * ```
278
- *
279
- * Request payload:
280
- *
281
- * ```
282
- * { "name": "Fulano", "city": "Metropolis" }
283
- * ```
284
- */
285
- serviceApi;
286
- /** Título da página. */
287
- title;
288
- /**
289
- * Função ou serviço que será executado na inicialização do componente.
290
- *
291
- * A propriedade aceita os seguintes tipos:
292
- * - `string`: *Endpoint* usado pelo componente para requisição via `POST`.
293
- * - `function`: Método que será executado.
294
- *
295
- * O retorno desta função deve ser do tipo `PoPageDynamicEditOptions`,
296
- * onde o usuário poderá customizar novos campos, breadcrumb, title e actions
297
- *
298
- * Por exemplo:
299
- *
300
- * ```
301
- * getPageOptions(): PoPageDynamicEditOptions {
302
- * return {
303
- * actions:
304
- * { cancel: false, save: 'save/:id', saveNew: 'saveNew' },
305
- * fields: [
306
- * { property: 'idCard', gridColumns: 6 }
307
- * ]
308
- * };
309
- * }
310
- *
311
- * ```
312
- * Para referenciar a sua função utilize a propriedade `bind`, por exemplo:
313
- * ```
314
- * [p-load]="onLoadOptions.bind(this)"
315
- * ```
316
- */
317
- onLoad;
318
- /**
319
- * @optional
320
- *
321
- * @description
322
- *
323
- * Função que será executada após ser realizada a busca dos dados.
324
- *
325
- * A propriedade aceita os seguintes tipos:
326
- * - `function`: Método que será executado.
327
- *
328
- * Esta função passa por parâmetro o model e deve recebê-lo de volta com as alterações.
329
- * Também aceita o retorno de um Observable com o novo model.
330
- *
331
- * Por exemplo:
332
- *
333
- * ```
334
- * onLoadCustom(model) {
335
- * return { ...model, customField: 'newValue' };
336
- * }
337
- *
338
- * ```
339
- * Para referenciar a sua função utilize a propriedade `bind`, por exemplo:
340
- * ```
341
- * [p-load-data]="onLoadCustom.bind(this)"
342
- * ```
343
- */
344
- onLoadData;
345
- model = {};
346
- // beforeSave: return boolean
347
- // afterSave
348
- // beforeRemove: return boolean
349
- // afterRemove
350
- // beforeInsert: : return boolean
351
- detailActions = {};
352
- indexFocus = 0;
353
- language;
354
- subscriptions = [];
355
- _actions = {};
356
- _literals;
357
- _autoRouter = false;
358
- _controlFields = [];
359
- _detailFields = [];
360
- _duplicates = [];
361
- _fields = [];
362
- _keys = [];
363
- _pageActions = [];
364
- _notificationType = poNotificationTypeDefault;
365
- /**
366
- * @optional
367
- *
368
- * @description
369
- *
370
- * Ações da página.
371
- */
372
- set actions(value) {
373
- this._actions = this.isObject(value) ? value : {};
374
- this._pageActions = this.getPageActions(this._actions);
375
- }
376
- get actions() {
377
- return { ...this._actions };
378
- }
379
- /**
380
- * @optional
381
- *
382
- * @description
383
- *
384
- * Objeto com as literais usadas no `po-page-dynamic-edit`.
385
- *
386
- * É possivel customizar passando um objeto com todas as literais disponíveis
387
- * ou passando apenas as literais que deseja customizar
388
- *
389
- * ```
390
- * const customLiterals: PoPageDynamicEditLiterals = {
391
- * detailActionNew: 'Incluir',
392
- * pageActionCancel: 'Descartar',
393
- * pageActionSave: 'Gravar',
394
- * pageActionSaveNew: 'Gravar e incluir',
395
- * registerNotFound: 'Nenhum registro encontrado.',
396
- * saveNotificationError: 'Campo(s) obrigatório(s) sem preenchimento.',
397
- * saveNotificationSuccessSave: 'Item salvo com sucesso.',
398
- * saveNotificationSuccessUpdate: 'Item atualizado com sucesso.',
399
- * saveNotificationWarning: 'Necessário preencher o formulário corretamente.'
400
- * };
401
- * ```
402
- *
403
- * E para carregar as literais customizadas, basta apenas passar o objeto para o componente.
404
- *
405
- * ```
406
- * <po-page-dynamic-edit
407
- * [p-literals]="customLiterals">
408
- * </po-page-dynamic-edit>
409
- * ```
410
- *
411
- * > O valor padrão será traduzido de acordo com o idioma configurado no [`PoI18nService`](/documentation/po-i18n) ou *browser*.
412
- */
413
- set literals(value) {
414
- if (value instanceof Object && !(value instanceof Array)) {
415
- this._literals = {
416
- ...poPageDynamicEditLiteralsDefault[poLocaleDefault],
417
- ...poPageDynamicEditLiteralsDefault[this.language],
418
- ...value
419
- };
420
- }
421
- else {
422
- this._literals = poPageDynamicEditLiteralsDefault[this.language];
423
- }
424
- this._pageActions = this.getPageActions(this._actions);
425
- }
426
- get literals() {
427
- return this._literals || poPageDynamicEditLiteralsDefault[this.language];
428
- }
429
- /**
430
- * @optional
431
- *
432
- * @description
433
- *
434
- * Tipo da notificação.
435
- *
436
- * É possivel definir o tipo de notificação que será exibido quando houver algum campo inválido no formulário.
437
- *
438
- * ```
439
- * <po-page-dynamic-edit
440
- * p-notification-type="warning">
441
- * </po-page-dynamic-edit>
442
- * ```
443
- *
444
- * > Os valores aceitos são 'warning' e 'error'.
445
- * @default warning
446
- */
447
- set notificationType(value) {
448
- this._notificationType = poNotificationType.includes(value) ? value : poNotificationTypeDefault;
449
- }
450
- get notificationType() {
451
- return this._notificationType;
452
- }
453
- /**
454
- * @todo Validar rotas na mão pois se existir uma rota '**' o catch do navigation não funciona.
455
- *
456
- * @optional
457
- *
458
- * @description
459
- *
460
- * Cria automaticamente as rotas de edição (novo/duplicate) e detalhes caso as ações
461
- * estejam definidas nas ações.
462
- *
463
- * > Para o correto funcionamento não pode haver nenhum rota coringa (`**`) especificada.
464
- *
465
- * @default false
466
- */
467
- set autoRouter(value) {
468
- this._autoRouter = convertToBoolean(value);
469
- }
470
- get autoRouter() {
471
- return this._autoRouter;
472
- }
473
- /** Lista dos campos usados na tabela e busca avançada. */
474
- set fields(value) {
475
- this._fields = Array.isArray(value) ? [...value] : [];
476
- this._keys = this.getKeysByFields(this._fields);
477
- this._duplicates = this.getDuplicatesByFields(this._fields);
478
- this._controlFields = this.getControlFields(this._fields);
479
- this._detailFields = this.getDetailFields(this._fields);
480
- }
481
- get fields() {
482
- return this._fields;
483
- }
484
- constructor(router, activatedRoute, poNotification, poDialogService, poPageDynamicService, poPageCustomizationService, poPageDynamicEditActionsService, languageService) {
485
- this.router = router;
486
- this.activatedRoute = activatedRoute;
487
- this.poNotification = poNotification;
488
- this.poDialogService = poDialogService;
489
- this.poPageDynamicService = poPageDynamicService;
490
- this.poPageCustomizationService = poPageCustomizationService;
491
- this.poPageDynamicEditActionsService = poPageDynamicEditActionsService;
492
- this.language = languageService.getShortLanguage();
493
- }
494
- ngOnInit() {
495
- this.loadDataFromAPI();
496
- }
497
- ngOnDestroy() {
498
- if (this.subscriptions) {
499
- this.subscriptions.forEach(subscription => {
500
- subscription.unsubscribe();
501
- });
502
- }
503
- }
504
- detailActionNew() {
505
- this.gridDetail.insertRow();
506
- }
507
- get duplicates() {
508
- return [...this._duplicates];
509
- }
510
- get keys() {
511
- return [...this._keys];
512
- }
513
- get pageActions() {
514
- return [...this._pageActions];
515
- }
516
- get controlFields() {
517
- return this._controlFields;
518
- }
519
- get detailFields() {
520
- return this._detailFields;
521
- }
522
- loadDataFromAPI() {
523
- const { serviceApi: serviceApiFromRoute, serviceMetadataApi, serviceLoadApi } = this.activatedRoute.snapshot.data;
524
- const { id } = this.activatedRoute.snapshot.params;
525
- const { duplicate } = this.activatedRoute.snapshot.queryParams;
526
- const onLoad = serviceLoadApi || this.onLoad;
527
- this.serviceApi = serviceApiFromRoute || this.serviceApi;
528
- this.poPageDynamicService.configServiceApi({ endpoint: this.serviceApi, metadata: serviceMetadataApi });
529
- const metadata$ = this.getMetadata(serviceApiFromRoute, id, onLoad);
530
- const data$ = this.loadData(id, duplicate);
531
- this.subscriptions.push(concat(metadata$, data$).subscribe());
532
- }
533
- cancel(actionCancel, actionBeforeCancel) {
534
- if (this.dynamicForm && this.dynamicForm.form.dirty) {
535
- this.poDialogService.confirm({
536
- message: this.literals.cancelConfirmMessage,
537
- title: this.literals.pageActionCancel,
538
- confirm: this.goBack.bind(this, actionCancel, actionBeforeCancel)
539
- });
540
- }
541
- else {
542
- this.goBack(actionCancel, actionBeforeCancel);
543
- }
544
- }
545
- formatUniqueKey(item) {
546
- const keys = mapObjectByProperties(item, this.keys);
547
- return valuesFromObject(keys).join('|');
548
- }
549
- goBack(actionCancel, actionBeforeCancel) {
550
- this.subscriptions.push(this.poPageDynamicEditActionsService
551
- .beforeCancel(actionBeforeCancel)
552
- .subscribe((beforeCancelResult) => {
553
- this.executeBackAction(actionCancel, beforeCancelResult?.allowAction, beforeCancelResult?.newUrl);
554
- }));
555
- }
556
- executeBackAction(actionCancel, allowAction, newUrl) {
557
- const isAllowedAction = typeof allowAction === 'boolean' ? allowAction : true;
558
- if (isAllowedAction) {
559
- if (actionCancel === undefined || typeof actionCancel === 'boolean') {
560
- return window.history.back();
561
- }
562
- if (typeof actionCancel === 'string' || newUrl) {
563
- return this.router.navigate([newUrl || actionCancel]);
564
- }
565
- return actionCancel();
566
- }
567
- }
568
- loadData(id, duplicate) {
569
- if (!id) {
570
- try {
571
- this.model = duplicate ? JSON.parse(duplicate) : {};
572
- }
573
- catch {
574
- this.model = {};
575
- }
576
- return EMPTY;
577
- }
578
- return this.poPageDynamicService.getResource(id).pipe(tap(response => {
579
- this.beforeSetModel(response);
580
- }), catchError(error => {
581
- this.model = undefined;
582
- this.actions = undefined;
583
- this._pageActions = [];
584
- return throwError(error);
585
- }));
586
- }
587
- beforeSetModel(response) {
588
- if (!this.onLoadData) {
589
- this.model = response;
590
- return;
591
- }
592
- const onLoadDataExecution = this.onLoadData(response);
593
- const onLoadData$ = onLoadDataExecution instanceof Observable ? onLoadDataExecution : of(onLoadDataExecution);
594
- onLoadData$.subscribe({
595
- next: customModel => {
596
- this.model = customModel;
597
- },
598
- error: () => {
599
- this.model = response;
600
- }
601
- });
602
- }
603
- loadOptionsOnInitialize(onLoad) {
604
- if (onLoad) {
605
- return this.getPoDynamicPageOptions(onLoad).pipe(tap(responsePoOption => this.poPageCustomizationService.changeOriginalOptionsToNewOptions(this, responsePoOption)));
606
- }
607
- return EMPTY;
608
- }
609
- focusCheckboxInput(control) {
610
- const checkboxGroup = document.querySelector(`po-checkbox-group[ng-reflect-name=${control}]`);
611
- if (checkboxGroup) {
612
- const checkBoxComponent = checkboxGroup.querySelector('po-checkbox[ng-reflect-disabled=false]');
613
- const labelInput = checkBoxComponent?.querySelector('.po-checkbox-outline');
614
- if (labelInput) {
615
- labelInput.focus();
616
- }
617
- else {
618
- this.indexFocus--;
619
- }
620
- }
621
- }
622
- focusControl(control) {
623
- const inputElement = document.querySelector(`[name=${control}]`);
624
- if (inputElement) {
625
- if (inputElement.tagName === 'INPUT') {
626
- inputElement.focus();
627
- }
628
- else {
629
- this.focusRadioInput(inputElement, control);
630
- }
631
- }
632
- else {
633
- this.focusCheckboxInput(control);
634
- }
635
- }
636
- focusRadioInput(inputElement, control) {
637
- const radioComponent = inputElement.querySelector(`po-radio[ng-reflect-name=${control}][ng-reflect-disabled=false]`);
638
- if (radioComponent) {
639
- const radioInput = radioComponent.querySelector('input');
640
- radioInput.focus();
641
- radioInput.parentElement.parentElement.classList.add('po-radio-focus');
642
- }
643
- else {
644
- this.indexFocus--;
645
- }
646
- }
647
- getPoDynamicPageOptions(onLoad) {
648
- const originalOption = {
649
- fields: this.fields,
650
- actions: this.actions,
651
- breadcrumb: this.breadcrumb,
652
- title: this.title
653
- };
654
- const pageOptionSchema = {
655
- schema: [
656
- {
657
- nameProp: 'fields',
658
- merge: true,
659
- keyForMerge: 'property'
660
- },
661
- {
662
- nameProp: 'actions',
663
- merge: true
664
- },
665
- {
666
- nameProp: 'breadcrumb'
667
- },
668
- {
669
- nameProp: 'title'
670
- }
671
- ]
672
- };
673
- return this.poPageCustomizationService.getCustomOptions(onLoad, originalOption, pageOptionSchema);
674
- }
675
- getMetadata(serviceApiFromRoute, paramId, onLoad) {
676
- const typeMetadata = paramId ? 'edit' : 'create';
677
- if (serviceApiFromRoute) {
678
- return this.poPageDynamicService.getMetadata(typeMetadata).pipe(tap(response => {
679
- this.autoRouter = response.autoRouter || this.autoRouter;
680
- this.actions = response.actions || this.actions;
681
- this.breadcrumb = response.breadcrumb || this.breadcrumb;
682
- this.fields = response.fields || this.fields;
683
- this.title = response.title || this.title;
684
- }), switchMap(() => this.loadOptionsOnInitialize(onLoad)));
685
- }
686
- return this.loadOptionsOnInitialize(onLoad);
687
- }
688
- markControlsAsDirtyAndFocusFirstInvalid() {
689
- this.indexFocus = 0;
690
- const controls = Object.keys(this.dynamicForm.form.controls);
691
- controls.forEach(control => {
692
- this.dynamicForm.form.controls[control].markAsDirty();
693
- if (this.dynamicForm.form.controls[control].hasError('required') && this.indexFocus === 0) {
694
- this.focusControl(control);
695
- this.indexFocus++;
696
- }
697
- });
698
- }
699
- navigateTo(path) {
700
- if (path) {
701
- const url = this.resolveUrl(this.model, path);
702
- this.router.navigate([url]);
703
- }
704
- else {
705
- window.history.back();
706
- }
707
- }
708
- resolveUniqueKey(item) {
709
- return this.activatedRoute.snapshot.params['id'] ? this.formatUniqueKey(item) : undefined;
710
- }
711
- resolveUrl(item, path) {
712
- const uniqueKey = this.formatUniqueKey(item);
713
- return path.replace(/:id/g, uniqueKey);
714
- }
715
- executeSave(saveRedirectPath) {
716
- const saveOperation$ = this.saveOperation();
717
- return saveOperation$.pipe(tap(message => {
718
- this.poNotification.success(message);
719
- this.navigateTo(saveRedirectPath);
720
- }));
721
- }
722
- updateModel(newResource = {}) {
723
- if (typeof newResource !== 'undefined' && Object.keys(newResource).length !== 0) {
724
- const dynamicNgForm = this.dynamicForm.form;
725
- removeKeysProperties(this.keys, newResource);
726
- this.model = { ...this.model, ...newResource };
727
- dynamicNgForm.form.patchValue(this.model);
728
- }
729
- }
730
- showNotification(type) {
731
- switch (type) {
732
- case 'warning':
733
- this.poNotification.warning(this.literals.saveNotificationWarning);
734
- break;
735
- case 'error':
736
- this.poNotification.error(this.literals.saveNotificationError);
737
- break;
738
- }
739
- }
740
- saveOperation() {
741
- if (this.dynamicForm.form.invalid) {
742
- this.markControlsAsDirtyAndFocusFirstInvalid();
743
- this.showNotification(this._notificationType);
744
- return EMPTY;
745
- }
746
- const paramId = this.activatedRoute.snapshot.params['id'];
747
- const successMsg = paramId
748
- ? this.literals.saveNotificationSuccessUpdate
749
- : this.literals.saveNotificationSuccessSave;
750
- const saveOperation$ = paramId
751
- ? this.poPageDynamicService.updateResource(paramId, this.model)
752
- : this.poPageDynamicService.createResource(this.model);
753
- return saveOperation$.pipe(map(() => successMsg));
754
- }
755
- save(action, before = 'beforeSave') {
756
- const executeOperation = {
757
- beforeSave: this.executeSave.bind(this),
758
- beforeSaveNew: this.executeSaveNew.bind(this)
759
- };
760
- const uniqueKey = this.resolveUniqueKey(this.model);
761
- this.subscriptions.push(this.poPageDynamicEditActionsService[before](this.actions[before], uniqueKey, { ...this.model })
762
- .pipe(switchMap(returnBefore => {
763
- const newAction = returnBefore?.newUrl ?? action;
764
- const allowAction = returnBefore?.allowAction ?? true;
765
- this.updateModel(returnBefore?.resource);
766
- if (!allowAction) {
767
- return of({});
768
- }
769
- if (typeof newAction === 'string') {
770
- return executeOperation[before](newAction);
771
- }
772
- else {
773
- newAction({ ...this.model }, uniqueKey);
774
- return EMPTY;
775
- }
776
- }))
777
- .subscribe());
778
- }
779
- executeSaveNew(path) {
780
- const paramId = this.activatedRoute.snapshot.params['id'];
781
- const saveOperation$ = this.saveOperation();
782
- return saveOperation$.pipe(tap(message => {
783
- if (paramId) {
784
- this.poNotification.success(message);
785
- this.navigateTo(path);
786
- }
787
- else {
788
- this.poNotification.success(message);
789
- this.model = {};
790
- this.dynamicForm.form.reset();
791
- }
792
- }));
793
- }
794
- getKeysByFields(fields = []) {
795
- return fields.filter(field => field.key === true).map(field => field.property);
796
- }
797
- getControlFields(fields = []) {
798
- return fields.filter(field => field.type !== 'detail');
799
- }
800
- getDetailFields(fields = []) {
801
- return fields.filter(field => field.type === 'detail');
802
- }
803
- getDuplicatesByFields(fields = []) {
804
- return fields.filter(field => field.duplicate === true).map(field => field.property);
805
- }
806
- getPageActions(actions = {}) {
807
- const pageActions = [
808
- { label: this.literals.pageActionSave, action: this.save.bind(this, actions.save) }
809
- ];
810
- if (actions.saveNew) {
811
- pageActions.push({
812
- label: this.literals.pageActionSaveNew,
813
- action: this.save.bind(this, actions.saveNew, 'beforeSaveNew')
814
- });
815
- }
816
- if (actions.cancel === undefined || actions.cancel) {
817
- pageActions.push({
818
- label: this.literals.pageActionCancel,
819
- action: this.cancel.bind(this, actions.cancel, this.actions.beforeCancel)
820
- });
821
- }
822
- return pageActions;
823
- }
824
- isObject(value) {
825
- return !!value && typeof value === 'object' && !Array.isArray(value);
826
- }
827
- static ɵfac = function PoPageDynamicEditComponent_Factory(t) { return new (t || PoPageDynamicEditComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i1.ActivatedRoute), i0.ɵɵdirectiveInject(i2.PoNotificationService), i0.ɵɵdirectiveInject(i2.PoDialogService), i0.ɵɵdirectiveInject(i3.PoPageDynamicService), i0.ɵɵdirectiveInject(i4.PoPageCustomizationService), i0.ɵɵdirectiveInject(i5.PoPageDynamicEditActionsService), i0.ɵɵdirectiveInject(i2.PoLanguageService)); };
828
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PoPageDynamicEditComponent, selectors: [["po-page-dynamic-edit"]], viewQuery: function PoPageDynamicEditComponent_Query(rf, ctx) { if (rf & 1) {
829
- i0.ɵɵviewQuery(_c0, 5);
830
- i0.ɵɵviewQuery(_c1, 5);
831
- } if (rf & 2) {
832
- let _t;
833
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dynamicForm = _t.first);
834
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.gridDetail = _t.first);
835
- } }, inputs: { breadcrumb: [0, "p-breadcrumb", "breadcrumb"], serviceApi: [0, "p-service-api", "serviceApi"], title: [0, "p-title", "title"], onLoad: [0, "p-load", "onLoad"], onLoadData: [0, "p-load-data", "onLoadData"], actions: [0, "p-actions", "actions"], literals: [0, "p-literals", "literals"], notificationType: [0, "p-notification-type", "notificationType"], autoRouter: [0, "p-auto-router", "autoRouter"], fields: [0, "p-fields", "fields"] }, features: [i0.ɵɵProvidersFeature([PoPageDynamicService])], decls: 6, vars: 6, consts: [["registerNotFoundTemplate", ""], ["formFieldsTemplate", ""], ["dynamicForm", ""], ["gridDetail", ""], [3, "p-actions", "p-breadcrumb", "p-title"], [4, "ngIf", "ngIfThen", "ngIfElse"], ["p-icon", "ICON_INFO"], [1, "po-font-text-large"], [3, "p-fields", "p-value"], ["class", "po-sm-12", 4, "ngIf"], [1, "po-sm-12"], [3, "p-label"], [1, "po-row", "po-mb-2"], [3, "p-click", "p-label"], [3, "p-row-actions", "p-columns", "p-data"]], template: function PoPageDynamicEditComponent_Template(rf, ctx) { if (rf & 1) {
836
- i0.ɵɵelementStart(0, "po-page-default", 4);
837
- i0.ɵɵtemplate(1, PoPageDynamicEditComponent_ng_container_1_Template, 1, 0, "ng-container", 5);
838
- i0.ɵɵelementEnd();
839
- i0.ɵɵtemplate(2, PoPageDynamicEditComponent_ng_template_2_Template, 4, 1, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor)(4, PoPageDynamicEditComponent_ng_template_4_Template, 3, 3, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
840
- } if (rf & 2) {
841
- const registerNotFoundTemplate_r3 = i0.ɵɵreference(3);
842
- const formFieldsTemplate_r4 = i0.ɵɵreference(5);
843
- i0.ɵɵproperty("p-actions", ctx.pageActions)("p-breadcrumb", ctx.breadcrumb)("p-title", ctx.title);
844
- i0.ɵɵadvance();
845
- i0.ɵɵproperty("ngIf", ctx.model)("ngIfThen", formFieldsTemplate_r4)("ngIfElse", registerNotFoundTemplate_r3);
846
- } }, dependencies: [i6.NgIf, i2.PoButtonComponent, i2.PoDividerComponent, i2.PoDynamicFormComponent, i2.PoGridComponent, i2.PoIconComponent, i2.PoPageDefaultComponent, i2.PoWidgetComponent], encapsulation: 2 });
847
- }
848
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoPageDynamicEditComponent, [{
849
- type: Component,
850
- args: [{ selector: 'po-page-dynamic-edit', providers: [PoPageDynamicService], template: "<po-page-default [p-actions]=\"pageActions\" [p-breadcrumb]=\"breadcrumb\" [p-title]=\"title\">\n <ng-container *ngIf=\"model; then formFieldsTemplate; else registerNotFoundTemplate\"> </ng-container>\n</po-page-default>\n\n<ng-template #registerNotFoundTemplate>\n <po-widget>\n <po-icon p-icon=\"ICON_INFO\"></po-icon>\n <span class=\"po-font-text-large\">\n {{ literals.registerNotFound }}\n </span>\n </po-widget>\n</ng-template>\n\n<ng-template #formFieldsTemplate>\n <po-dynamic-form #dynamicForm [p-fields]=\"controlFields\" [p-value]=\"model\"> </po-dynamic-form>\n\n <div *ngIf=\"detailFields.length > 0\" class=\"po-sm-12\">\n <po-divider [p-label]=\"detailFields[0].divider\"></po-divider>\n\n <div class=\"po-row po-mb-2\">\n <po-button [p-label]=\"literals.detailActionNew\" (p-click)=\"detailActionNew()\"></po-button>\n </div>\n\n <po-grid\n #gridDetail\n [p-row-actions]=\"detailActions\"\n [p-columns]=\"detailFields[0].detail.columns\"\n [p-data]=\"model[detailFields[0].property]\"\n >\n </po-grid>\n </div>\n</ng-template>\n" }]
851
- }], () => [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.PoNotificationService }, { type: i2.PoDialogService }, { type: i3.PoPageDynamicService }, { type: i4.PoPageCustomizationService }, { type: i5.PoPageDynamicEditActionsService }, { type: i2.PoLanguageService }], { dynamicForm: [{
852
- type: ViewChild,
853
- args: ['dynamicForm']
854
- }], gridDetail: [{
855
- type: ViewChild,
856
- args: ['gridDetail']
857
- }], breadcrumb: [{
858
- type: Input,
859
- args: ['p-breadcrumb']
860
- }], serviceApi: [{
861
- type: Input,
862
- args: ['p-service-api']
863
- }], title: [{
864
- type: Input,
865
- args: ['p-title']
866
- }], onLoad: [{
867
- type: Input,
868
- args: ['p-load']
869
- }], onLoadData: [{
870
- type: Input,
871
- args: ['p-load-data']
872
- }], actions: [{
873
- type: Input,
874
- args: ['p-actions']
875
- }], literals: [{
876
- type: Input,
877
- args: ['p-literals']
878
- }], notificationType: [{
879
- type: Input,
880
- args: ['p-notification-type']
881
- }], autoRouter: [{
882
- type: Input,
883
- args: ['p-auto-router']
884
- }], fields: [{
885
- type: Input,
886
- args: ['p-fields']
887
- }] }); })();
888
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PoPageDynamicEditComponent, { className: "PoPageDynamicEditComponent", filePath: "lib/components/po-page-dynamic-edit/po-page-dynamic-edit.component.ts", lineNumber: 189 }); })();
889
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcGFnZS1keW5hbWljLWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGVtcGxhdGVzL3NyYy9saWIvY29tcG9uZW50cy9wby1wYWdlLWR5bmFtaWMtZWRpdC9wby1wYWdlLWR5bmFtaWMtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZW1wbGF0ZXMvc3JjL2xpYi9jb21wb25lbnRzL3BvLXBhZ2UtZHluYW1pYy1lZGl0L3BvLXBhZ2UtZHluYW1pYy1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUcvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQWdCLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFTTCxlQUFlLEVBQ2hCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJckgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0RBQXdELENBQUM7Ozs7Ozs7Ozs7O0lDckI1Rix3QkFBb0c7OztJQUlwRyxpQ0FBVztJQUNULDZCQUFzQztJQUN0QywrQkFBaUM7SUFDL0IsWUFDRjtJQUNGLEFBREUsaUJBQU8sRUFDRzs7O0lBRlIsZUFDRjtJQURFLGlFQUNGOzs7O0lBT0YsK0JBQXNEO0lBQ3BELGlDQUE2RDtJQUczRCxBQURGLCtCQUE0QixvQkFDb0Q7SUFBOUIsNE1B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cG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjb25jYXQsIG9mLCBTdWJzY3JpcHRpb24sIEVNUFRZLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAsIGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBQb0JyZWFkY3J1bWIsXG4gIFBvRGlhbG9nU2VydmljZSxcbiAgUG9EeW5hbWljRm9ybUNvbXBvbmVudCxcbiAgUG9HcmlkQ29tcG9uZW50LFxuICBQb0dyaWRSb3dBY3Rpb25zLFxuICBQb0xhbmd1YWdlU2VydmljZSxcbiAgUG9Ob3RpZmljYXRpb25TZXJ2aWNlLFxuICBQb1BhZ2VBY3Rpb24sXG4gIHBvTG9jYWxlRGVmYXVsdFxufSBmcm9tICdAcG8tdWkvbmctY29tcG9uZW50cyc7XG5cbmltcG9ydCB7IGNvbnZlcnRUb0Jvb2xlYW4sIG1hcE9iamVjdEJ5UHJvcGVydGllcywgdmFsdWVzRnJvbU9iamVjdCwgcmVtb3ZlS2V5c1Byb3BlcnRpZXMgfSBmcm9tICcuLy4uLy4uL3V0aWxzL3V0aWwnO1xuXG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLWVkaXQtYWN0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY0VkaXRGaWVsZCB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtZWRpdC1maWVsZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wby1wYWdlLWR5bmFtaWMvcG8tcGFnZS1keW5hbWljLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY0VkaXRPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy1lZGl0LW9wdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvUGFnZUN1c3RvbWl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcG8tcGFnZS1jdXN0b21pemF0aW9uL3BvLXBhZ2UtY3VzdG9taXphdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNFZGl0TWV0YWRhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLWVkaXQtbWV0YWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNPcHRpb25zU2NoZW1hIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcG8tcGFnZS1jdXN0b21pemF0aW9uL3BvLXBhZ2UtZHluYW1pYy1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9wby1wYWdlLWR5bmFtaWMtZWRpdC1hY3Rpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY0VkaXRCZWZvcmVDYW5jZWwgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLWVkaXQtYmVmb3JlLWNhbmNlbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY0VkaXRMaXRlcmFscyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtZWRpdC1saXRlcmFscy5pbnRlcmZhY2UnO1xuXG50eXBlIFVybE9yUG9DdXN0b21pemF0aW9uRnVuY3Rpb24gPSBzdHJpbmcgfCAoKCkgPT4gUG9QYWdlRHluYW1pY0VkaXRPcHRpb25zKTtcbnR5cGUgU2F2ZUFjdGlvbiA9IFBvUGFnZUR5bmFtaWNFZGl0QWN0aW9uc1snc2F2ZSddIHwgUG9QYWdlRHluYW1pY0VkaXRBY3Rpb25zWydzYXZlTmV3J107XG5cbmV4cG9ydCBjb25zdCBwb05vdGlmaWNhdGlvblR5cGUgPSBbJ2Vycm9yJywgJ3dhcm5pbmcnXTtcbmV4cG9ydCBjb25zdCBwb05vdGlmaWNhdGlvblR5cGVEZWZhdWx0ID0gJ3dhcm5pbmcnO1xuXG5leHBvcnQgY29uc3QgcG9QYWdlRHluYW1pY0VkaXRMaXRlcmFsc0RlZmF1bHQgPSB7XG4gIGVuOiA8UG9QYWdlRHluYW1pY0VkaXRMaXRlcmFscz57XG4gICAgY2FuY2VsQ29uZmlybU1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2FuY2VsIHRoaXMgb3BlcmF0aW9uPycsXG4gICAgZGV0YWlsQWN0aW9uTmV3OiAnTmV3JyxcbiAgICBwYWdlQWN0aW9uQ2FuY2VsOiAnQ2FuY2VsJyxcbiAgICBwYWdlQWN0aW9uU2F2ZTogJ1NhdmUnLFxuICAgIHBhZ2VBY3Rpb25TYXZlTmV3OiAnU2F2ZSBhbmQgbmV3JyxcbiAgICByZWdpc3Rlck5vdEZvdW5kOiAnUmVnaXN0ZXIgbm90IGZvdW5kLicsXG4gICAgc2F2ZU5vdGlmaWNhdGlvbkVycm9yOiAnTWFuZGF0b3J5IGZpZWxkKHMpIG5vdCBmaWxsZWQuJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1NhdmU6ICdSZXNvdXJjZSBzdWNjZXNzZnVsbHkgc2F2ZWQuJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1VwZGF0ZTogJ1Jlc291cmNlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLicsXG4gICAgc2F2ZU5vdGlmaWNhdGlvbldhcm5pbmc6ICdGb3JtIG11c3QgYmUgZmlsbGVkIG91dCBjb3JyZWN0bHkuJ1xuICB9LFxuICBlczogPFBvUGFnZUR5bmFtaWNFZGl0TGl0ZXJhbHM+e1xuICAgIGNhbmNlbENvbmZpcm1NZXNzYWdlOiAnRXN0w6Egc2VndXJvIGRlIHF1ZSBkZXNlYSBjYW5jZWxhciBlc3RhIG9wZXJhY2nDs24/JyxcbiAgICBkZXRhaWxBY3Rpb25OZXc6ICdOdWV2bycsXG4gICAgcGFnZUFjdGlvbkNhbmNlbDogJ0NhbmNlbGFyJyxcbiAgICBwYWdlQWN0aW9uU2F2ZTogJ0d1YXJkYXInLFxuICAgIHBhZ2VBY3Rpb25TYXZlTmV3OiAnR3VhcmRhciB5IG51ZXZvJyxcbiAgICByZWdpc3Rlck5vdEZvdW5kOiAnUmVnaXN0cm8gbm8gZW5jb250cmFkby4nLFxuICAgIHNhdmVOb3RpZmljYXRpb25FcnJvcjogJ0NhbXBvKHMpIG9ibGlnYXRvcmlvKHMpIG5vIGNvbXBsZXRhZG8ocykuJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1NhdmU6ICdSZWN1cnNvIHNhbHZvIGNvbiDDqXhpdG8uJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1VwZGF0ZTogJ1JlY3Vyc28gYWN0dWFsaXphZG8gY29uIMOpeGl0by4nLFxuICAgIHNhdmVOb3RpZmljYXRpb25XYXJuaW5nOiAnRWwgZm9ybXVsYXJpbyBkZWJlIGxsZW5hcnNlIGNvcnJlY3RhbWVudGUuJ1xuICB9LFxuICBwdDogPFBvUGFnZUR5bmFtaWNFZGl0TGl0ZXJhbHM+e1xuICAgIGNhbmNlbENvbmZpcm1NZXNzYWdlOiAnVGVtIGNlcnRlemEgcXVlIGRlc2VqYSBjYW5jZWxhciBlc3RhIG9wZXJhw6fDo28/JyxcbiAgICBkZXRhaWxBY3Rpb25OZXc6ICdOb3ZvJyxcbiAgICBwYWdlQWN0aW9uQ2FuY2VsOiAnQ2FuY2VsYXInLFxuICAgIHBhZ2VBY3Rpb25TYXZlOiAnU2FsdmFyJyxcbiAgICBwYWdlQWN0aW9uU2F2ZU5ldzogJ1NhbHZhciBlIG5vdm8nLFxuICAgIHJlZ2lzdGVyTm90Rm91bmQ6ICdSZWdpc3RybyBuw6NvIGVuY29udHJhZG8uJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uRXJyb3I6ICdDYW1wbyhzKSBvYnJpZ2F0w7NyaW8ocykgc2VtIHByZWVuY2hpbWVudG8uJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1NhdmU6ICdSZWN1cnNvIHNhbHZvIGNvbSBzdWNlc3NvLicsXG4gICAgc2F2ZU5vdGlmaWNhdGlvblN1Y2Nlc3NVcGRhdGU6ICdSZWN1cnNvIGF0dWFsaXphZG8gY29tIHN1Y2Vzc28uJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uV2FybmluZzogJ0Zvcm11bMOhcmlvIHByZWNpc2Egc2VyIHByZWVuY2hpZG8gY29ycmV0YW1lbnRlLidcbiAgfSxcbiAgcnU6IDxQb1BhZ2VEeW5hbWljRWRpdExpdGVyYWxzPntcbiAgICBjYW5jZWxDb25maXJtTWVzc2FnZTogJ9CS0Ysg0YPQstC10YDQtdC90YssINGH0YLQviDRhdC+0YLQuNGC0LUg0L7RgtC80LXQvdC40YLRjCDRjdGC0YMg0L7Qv9C10YDQsNGG0LjRjj8nLFxuICAgIGRldGFpbEFjdGlvbk5ldzogJ9Cd0L7QstGL0LknLFxuICAgIHBhZ2VBY3Rpb25DYW5jZWw6ICfQntGC0LzQtdC90LjRgtGMJyxcbiAgICBwYWdlQWN0aW9uU2F2ZTogJ9Ch0L7RhdGA0LDQvdC40YLRjCcsXG4gICAgcGFnZUFjdGlvblNhdmVOZXc6ICfQodC+0YXRgNCw0L3QuNGC0Ywg0Lgg0YHQvtC30LTQsNGC0YwnLFxuICAgIHJlZ2lzdGVyTm90Rm91bmQ6ICfQl9Cw0L/QuNGB0Ywg0L3QtSDQvdCw0LnQtNC10L3QsC4nLFxuICAgIHNhdmVOb3RpZmljYXRpb25FcnJvcjogJ9Ce0LHRj9C30LDRgtC10LvRjNC90L7QtSDQv9C+0LvQtSjRjykg0L3QtSDQt9Cw0L/QvtC70L3QtdC90L4uJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1NhdmU6ICfQoNC10YHRg9GA0YEg0YPRgdC/0LXRiNC90L4g0YHQvtGF0YDQsNC90LXQvS4nLFxuICAgIHNhdmVOb3RpZmljYXRpb25TdWNjZXNzVXBkYXRlOiAn0KDQtdGB0YPRgNGBINGD0YHQv9C10YjQvdC+INC+0LHQvdC+0LLQu9C10L0uJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uV2FybmluZzogJ9Ck0L7RgNC80LAg0LTQvtC70LbQvdCwINCx0YvRgtGMINC30LDQv9C+0LvQvdC10L3QsCDQv9GA0LDQstC40LvRjNC90L4uJ1xuICB9XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIE8gYHBvLXBhZ2UtZHluYW1pYy1lZGl0YCDDqSB1bWEgcMOhZ2luYSBxdWUgcG9kZSBzZXJ2aXIgcGFyYSBlZGl0YXIgb3UgY3JpYXIgbm92b3MgcmVnaXN0cm9zLFxuICogbyBtZXNtbyB0YW1iw6ltIHN1cG9ydGEgbWV0YWRhZG9zIGNvbmZvcm1lIGVzcGVjaWZpY2FkbyBuYSBkb2N1bWVudGHDp8Ojby5cbiAqXG4gKiAjIyMgVXRpbGl6YcOnw6NvIHZpYSByb3RhXG4gKlxuICogQW8gdXRpbGl6YXIgYXMgcm90YXMgcGFyYSBpbmljaWFsaXphciBvIHRlbXBsYXRlLCBvIGBwYWdlLWR5bmFtaWMtZWRpdGAgZGlzcG9uaWJpbGl6YSBwcm9wcmllZGFkZXMgcXVlIGRldmVtIHNlciBmb3JuZWNpZGFzIG5vIGFycXVpdm8gZGUgY29uZmlndXJhw6fDo28gZGUgcm90YXMgZGEgYXBsaWNhw6fDo28sIHBhcmFcbiAqIHBvZGVyIGVzcGVjaWZpY2FyIG8gZW5kcG9pbnQgZG9zIGRhZG9zIGUgZG9zIG1ldGFkYWRvcyBxdWUgc2Vyw6NvIGNhcnJlZ2Fkb3MgbmEgaW5pY2lhbGl6YcOnw6NvLlxuICpcbiAqIEV4ZW1wbG8gZGUgdXRpbGl6YcOnw6NvOlxuICpcbiAqIEFycXVpdm8gZGUgY29uZmlndXJhw6fDo28gZGUgcm90YXMgZGEgYXBsaWNhw6fDo286IGBhcHAtcm91dGluZy5tb2R1bGUudHNgXG4gKiBgYGBcbiAqIGNvbnN0IHJvdXRlczogUm91dGVzID0gW1xuICoge1xuICogICBwYXRoOiAncGVvcGxlJyxcbiAqICAgY29tcG9uZW50OiBQb1BhZ2VEeW5hbWljRWRpdENvbXBvbmVudCxcbiAqICAgZGF0YToge1xuICogICAgIHNlcnZpY2VBcGk6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAvdjEvcGVvcGxlJywgLy8gZW5kcG9pbnQgZG9zIGRhZG9zXG4gKiAgICAgc2VydmljZU1ldGFkYXRhQXBpOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL3YxL21ldGFkYXRhJywgLy8gZW5kcG9pbnQgZG9zIG1ldGFkYWRvcyB1dGlsaXphbmRvIG8gbcOpdG9kbyBIVFRQIEdldFxuICogICAgIHNlcnZpY2VMb2FkQXBpOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL2xvYWQtbWV0YWRhdGEnIC8vIGVuZHBvaW50IGRlIGN1c3RvbWl6YcOnw7VlcyBkb3MgbWV0YWRhZG9zIHV0aWxpemFuZG8gbyBtw6l0b2RvIEhUVFAgUG9zdFxuICogICB9XG4gKiAgfSxcbiAqICB7XG4gKiAgIHBhdGg6ICdob21lJyxcbiAqICAgY29tcG9uZW50OiBIb21lRXhhbXBsZUNvbXBvbmVudFxuICogIH1cbiAqIF07XG4gKlxuICogYGBgXG4gKiBPIGNvbXBvbmVudGUgcHJpbWVpcm8gaXLDoSBjYXJyZWdhciBvIG1ldGFkYWRvIGRhIHJvdGEgZGVmaW5pZGEgbmEgcHJvcHJpZWRhZGUgc2VydmljZU1ldGFkYXRhQXBpXG4gKiBlIGRlcG9pcyBpcsOhIGJ1c2NhciBkYSByb3RhIGRlZmluaWRhIG5hIHByb3ByaWVkYWRlIHNlcnZpY2VMb2FkQXBpLlxuICpcbiAqIEEgcmVxdWlzacOnw6NvIGRvcyBtZXRhZGFkb3Mgw6kgZmVpdGEgbmEgaW5pY2lhbGl6YcOnw6NvIGRvIHRlbXBsYXRlIHBhcmEgYnVzY2FyIG9zIG1ldGFkYWRvcyBkYSBww6FnaW5hIHBhc3NhbmRvIG9cbiAqIHRpcG8gZG8gbWV0YWRhZG8gZXNwZXJhZG8gZSBhIHZlcnPDo28gY2FjaGVhZGEgcGVsbyBicm93c2VyLlxuICpcbiAqID4gQ2FzbyBvIHNlcnZpZG9yIHJldG9ybmFyIHVtIGVycm8gYW8gcmVjdXBlcmFyIG9zIG1ldGFkYWRvcywgc2Vyw6NvIHJlcGFzc2Fkb3Mgb3MgbWV0YWRhZG9zIHNhbHZvcyBlbSBjYWNoZSxcbiAqIHNlIG8gY2FjaGUgbsOjbyBleGlzdGlyIHNlcsOhIGRpc3BhcmFkYSB1bWEgbm90aWZpY2HDp8Ojby5cbiAqXG4gKiBQYXJhIGNhcnJlZ2FyIGNvbSB1bSByZWN1cnNvIGrDoSBleGlzdGVudGUsIGRldmUtc2Ugc2VyIGluY2x1w61kbyB1bSBwYXLDom1ldHJvIG5hIHJvdGEgY2hhbWFkbyBgaWRgOlxuICpcbiAqIGBgYFxuICoge1xuICogICBwYXRoOiAncGVvcGxlLzppZCcsXG4gKiAgIGNvbXBvbmVudDogUG9QYWdlRHluYW1pY0VkaXRDb21wb25lbnQsXG4gKiAgIGRhdGE6IHtcbiAqICAgICBzZXJ2aWNlQXBpOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL3YxL3Blb3BsZScsIC8vIGVuZHBvaW50IGRvcyBkYWRvc1xuICogICAgIHNlcnZpY2VNZXRhZGF0YUFwaTogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMC92MS9tZXRhZGF0YScsIC8vIGVuZHBvaW50IGRvcyBtZXRhZGFkb3NcbiAqICAgICBzZXJ2aWNlTG9hZEFwaTogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9sb2FkLW1ldGFkYXRhJyAvLyBlbmRwb2ludCBkZSBjdXN0b21pemHDp8O1ZXMgZG9zIG1ldGFkYWRvc1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBBIHJlcXVpc2nDp8OjbyBkb3MgbWV0YWRhZG9zIMOpIGZlaXRhIG5hIGluaWNpYWxpemHDp8OjbyBkbyB0ZW1wbGF0ZSBwYXJhIGJ1c2NhciBvcyBtZXRhZGFkb3MgZGEgcMOhZ2luYSBwYXNzYW5kbyBvXG4gKiB0aXBvIGRvIG1ldGFkYWRvIGVzcGVyYWRvIGUgYSB2ZXJzw6NvIGNhY2hlYWRhIHBlbG8gYnJvd3Nlci5cbiAqXG4gKiBPIGZvcm1hdG8gZXNwZXJhZG8gbmEgcmVzcG9zdGEgZGEgcmVxdWlzacOnw6NvIGVzdMOhIGVzcGVjaWZpY2FkbyBuYSBpbnRlcmZhY2VcbiAqIFtQb1BhZ2VEeW5hbWljRWRpdE1ldGFkYXRhXSgvZG9jdW1lbnRhdGlvbi9wby1wYWdlLWR5bmFtaWMtZWRpdCNwby1wYWdlLWR5bmFtaWMtZWRpdC1tZXRhZGF0YSkuIFBvciBleGVtcGxvOlxuICpcbiAqIGBgYFxuICogIHtcbiAqICAgdmVyc2lvbjogMSxcbiAqICAgdGl0bGU6ICdQZXJzb24gZWRpdCcsXG4gKiAgIGZpZWxkczogW1xuICogICAgIHsgcHJvcGVydHk6ICdpZCcsIGtleTogdHJ1ZSwgZGlzYWJsZWQ6IHRydWUgfSxcbiAqICAgICB7IHByb3BlcnR5OiAnc3RhdHVzJyB9LFxuICogICAgIHsgcHJvcGVydHk6ICduYW1lJyB9LFxuICogICAgIHsgcHJvcGVydHk6ICduaWNrbmFtZScgfSxcbiAqICAgICB7IHByb3BlcnR5OiAnYmlydGhkYXRlJywgbGFiZWw6ICdCaXJ0aCBkYXRlJyB9LFxuICogICAgIHsgcHJvcGVydHk6ICdnZW5yZScgfSxcbiAqICAgICB7IHByb3BlcnR5OiAnY2l0eScgfSxcbiAqICAgICB7IHByb3BlcnR5OiAnY291bnRyeScgfVxuICogICBdXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiA+IENhc28gbyBlbmRwb2ludCBkb3MgbWV0YWRhZG9zIG7Do28gc2VqYSBlc3BlY2lmaWNhZG8sIHNlcsOhIGZlaXRvIHVtYSByZXF1aXNpw6fDo28gdXRpbGl6YW5kbyBvIGBzZXJ2aWNlQXBpYCBkYSBzZWd1aW50ZSBmb3JtYTpcbiAqIGBgYFxuICogR0VUIHtlbmQtcG9pbnR9L21ldGFkYXRhP3R5cGU9ZWRpdCZ2ZXJzaW9uPXt2ZXJzaW9ufVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwicG8tcGFnZS1keW5hbWljLWVkaXQtYmFzaWNcIiB0aXRsZT1cIlBPIFBhZ2UgRHluYW1pYyBFZGl0IEJhc2ljXCI+XG4gKiAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1wYWdlLWR5bmFtaWMtZWRpdC1iYXNpYy9zYW1wbGUtcG8tcGFnZS1keW5hbWljLWVkaXQtYmFzaWMuY29tcG9uZW50Lmh0bWxcIj4gPC9maWxlPlxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLWVkaXQtYmFzaWMvc2FtcGxlLXBvLXBhZ2UtZHluYW1pYy1lZGl0LWJhc2ljLmNvbXBvbmVudC50c1wiPiA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICogPGV4YW1wbGUgbmFtZT1cInBvLXBhZ2UtZHluYW1pYy1lZGl0LXVzZXJcIiB0aXRsZT1cIlBPIFBhZ2UgRHluYW1pYyBFZGl0IC0gVXNlclwiPlxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLWVkaXQtdXNlci9zYW1wbGUtcG8tcGFnZS1keW5hbWljLWVkaXQtdXNlci5jb21wb25lbnQuaHRtbFwiPiA8L2ZpbGU+XG4gKiAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1wYWdlLWR5bmFtaWMtZWRpdC11c2VyL3NhbXBsZS1wby1wYWdlLWR5bmFtaWMtZWRpdC11c2VyLmNvbXBvbmVudC50c1wiPiA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BvLXBhZ2UtZHluYW1pYy1lZGl0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BvLXBhZ2UtZHluYW1pYy1lZGl0LmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbUG9QYWdlRHluYW1pY1NlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIFBvUGFnZUR5bmFtaWNFZGl0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdkeW5hbWljRm9ybScpIGR5bmFtaWNGb3JtOiBQb0R5bmFtaWNGb3JtQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdncmlkRGV0YWlsJykgZ3JpZERldGFpbDogUG9HcmlkQ29tcG9uZW50O1xuXG4gIC8qKiBPYmpldG8gY29tIHByb3ByaWVkYWRlcyBkbyBicmVhZGNydW1iLiAqL1xuICBASW5wdXQoJ3AtYnJlYWRjcnVtYicpIGJyZWFkY3J1bWI/OiBQb0JyZWFkY3J1bWIgPSB7IGl0ZW1zOiBbXSB9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRW5kcG9pbnQgdXNhZG8gcGVsbyB0ZW1wbGF0ZSBwYXJhIHJlcXVpc2nDp8OjbyBkbyByZWN1cnNvIHF1ZSBzZXLDoSBleGliaWRvIHBhcmEgZWRpw6fDo28uXG4gICAqXG4gICAqIFBhcmEgYXMgYcOnw7VlcyBkZSBgc2F2ZWAgZSBgc2F2ZU5ld2AsIHNlcsOhIGZlaXRvIHVtYSByZXF1aXNpw6fDo28gZGUgY3JpYcOnw6NvIG5lc3NlIG1lc21vIGVuZHBvaW50IHBhc3NhbmRvIG9zIHZhbG9yZXNcbiAgICogcHJlZW5jaGlkb3MgcGVsbyB1c3XDoXJpbyB2aWEgcGF5bG9hZC5cbiAgICpcbiAgICogPiBgUE9TVCB7ZW5kLXBvaW50fWBcbiAgICpcbiAgICogYGBgXG4gICAqICA8cG8tcGFnZS1keW5hbWljLWVkaXRcbiAgICogICAgW3AtYWN0aW9uc109XCJ7IHNhdmU6ICcvJywgc2F2ZU5ldzogJ25ldycgfVwiXG4gICAqICAgIFtwLWZpZWxkc109XCJbIHsgcHJvcGVydHk6ICduYW1lJyB9LCB7IHByb3BlcnR5OiAnY2l0eScgfSBdXCJcbiAgICogICAgcC1zZXJ2aWNlPVwiL2FwaS9wby1zYW1wbGVzL3YxL3Blb3BsZVwiXG4gICAqICAgIC4uLj5cbiAgICogIDwvcG8tcGFnZS1keW5hbWljLWVkaXQ+XG4gICAqIGBgYFxuICAgKlxuICAgKiBSZXNxdWlzacOnw6NvIGRpc3BhcmFkYSwgb25kZSBhIHByb3ByaWVkYWRlIGBuYW1lYCBlIGBjaXR5YCBmb3JhbSBwcmVlbmNoaWRhczpcbiAgICpcbiAgICogYGBgXG4gICAqICBQT1NUIC9hcGkvcG8tc2FtcGxlcy92MS9wZW9wbGUgSFRUUC8xLjFcbiAgICogIEhvc3Q6IGxvY2FsaG9zdDo0MDAwXG4gICAqICBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gICAqICBBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW5cbiAgICogIC4uLlxuICAgKiBgYGBcbiAgICpcbiAgICogUmVxdWVzdCBwYXlsb2FkOlxuICAgKlxuICAgKiBgYGBcbiAgICogeyBcIm5hbWVcIjogXCJGdWxhbm9cIiwgXCJjaXR5XCI6IFwiU21hbGx2aWxsZVwiIH1cbiAgICogYGBgXG4gICAqXG4gICAqIENhc28gcXVlaXJhIHF1ZSBvIHRlbXBsYXRlIGNhcnJlZ3VlIHVtIHJlY3Vyc28gasOhIGV4aXN0ZW50ZSwgZGV2ZS1zZSBzZXIgaW5jbHXDrWRvIHVtIHBhcmFtZXRybyBuYSByb3RhIGNoYW1hZG8gYGlkYC5cbiAgICpcbiAgICogRXhlbXBsbyBkZSBjb25maWd1cmHDp8OjbyBkZSByb3RhOlxuICAgKlxuICAgKiBgYGBcbiAgICogIFJvdXRlck1vZHVsZS5mb3JSb290KFtcbiAgICogICAgLi4uXG4gICAqICAgIHsgcGF0aDogJ2VkaXQvOmlkJywgY29tcG9uZW50OiBQZXJzb25FZGl0Q29tcG9uZW50IH0sXG4gICAqICAgIC4uLlxuICAgKiAgXSxcbiAgICogYGBgXG4gICAqXG4gICAqIEJhc2VhZG8gbmlzc28sIG5hIGluaWNpYWxpemHDp8OjbyBkbyB0ZW1wbGF0ZSwgc2Vyw6EgZGlzcGFyYWRvIHVtYSByZXF1aXNpw6fDo28gcGFyYSBidXNjYXIgbyByZWN1cnNvIHF1ZSBzZXLDoSBlZGl0YWRvLlxuICAgKlxuICAgKiA+IGBHRVQge2VuZC1wb2ludH0ve2lkfWBcbiAgICpcbiAgICogTm9zIG3DqXRvZG9zIGRlIGBzYXZlYCBlIGBzYXZlTmV3YCwgYW8gaW52w6lzIGRlIHVtIGBQT1NUYCwgc2Vyw6EgZGlzcGFyYWRvIHVtIGBQVVRgLlxuICAgKlxuICAgKiBSZXNxdWlzacOnw6NvIGRpc3BhcmFkYSwgb25kZSBhIHByb3ByaWVkYWRlIGBuYW1lYCBlIGBjaXR5YCBmb3JhbSBwcmVlbmNoaWRhcyAvIGF0dWFsaXphZGFzLCBlIG8gYGlkYCBkYSB1cmwgw6kgMjpcbiAgICpcbiAgICogYGBgXG4gICAqICBQVVQgL2FwaS9wby1zYW1wbGVzL3YxL3Blb3BsZS8yIEhUVFAvMS4xXG4gICAqICBIb3N0OiBsb2NhbGhvc3Q6NDAwMFxuICAgKiAgQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICAgKiAgQWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluXG4gICAqICAuLi5cbiAgICogYGBgXG4gICAqXG4gICAqIFJlcXVlc3QgcGF5bG9hZDpcbiAgICpcbiAgICogYGBgXG4gICAqIHsgXCJuYW1lXCI6IFwiRnVsYW5vXCIsIFwiY2l0eVwiOiBcIk1ldHJvcG9saXNcIiB9XG4gICAqIGBgYFxuICAgKi9cbiAgQElucHV0KCdwLXNlcnZpY2UtYXBpJykgc2VydmljZUFwaTogc3RyaW5nO1xuXG4gIC8qKiBUw610dWxvIGRhIHDDoWdpbmEuICovXG4gIEBJbnB1dCgncC10aXRsZScpIHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZ1bsOnw6NvIG91IHNlcnZpw6dvIHF1ZSBzZXLDoSBleGVjdXRhZG8gbmEgaW5pY2lhbGl6YcOnw6NvIGRvIGNvbXBvbmVudGUuXG4gICAqXG4gICAqIEEgcHJvcHJpZWRhZGUgYWNlaXRhIG9zIHNlZ3VpbnRlcyB0aXBvczpcbiAgICogLSBgc3RyaW5nYDogKkVuZHBvaW50KiB1c2FkbyBwZWxvIGNvbXBvbmVudGUgcGFyYSByZXF1aXNpw6fDo28gdmlhIGBQT1NUYC5cbiAgICogLSBgZnVuY3Rpb25gOiBNw6l0b2RvIHF1ZSBzZXLDoSBleGVjdXRhZG8uXG4gICAqXG4gICAqIE8gcmV0b3JubyBkZXN0YSBmdW7Dp8OjbyBkZXZlIHNlciBkbyB0aXBvIGBQb1BhZ2VEeW5hbWljRWRpdE9wdGlvbnNgLFxuICAgKiBvbmRlIG8gdXN1w6FyaW8gcG9kZXLDoSBjdXN0b21pemFyIG5vdm9zIGNhbXBvcywgYnJlYWRjcnVtYiwgdGl0bGUgZSBhY3Rpb25zXG4gICAqXG4gICAqIFBvciBleGVtcGxvOlxuICAgKlxuICAgKiBgYGBcbiAgICogZ2V0UGFnZU9wdGlvbnMoKTogUG9QYWdlRHluYW1pY0VkaXRPcHRpb25zIHtcbiAgICogcmV0dXJuIHtcbiAgICogICBhY3Rpb25zOlxuICAgKiAgICAgeyBjYW5jZWw6IGZhbHNlLCBzYXZlOiAnc2F2ZS86aWQnLCBzYXZlTmV3OiAnc2F2ZU5ldycgfSxcbiAgICogICBmaWVsZHM6IFtcbiAgICogICAgIHsgcHJvcGVydHk6ICdpZENhcmQnLCBncmlkQ29sdW1uczogNiB9XG4gICAqICAgXVxuICAgKiB9O1xuICAgKiB9XG4gICAqXG4gICAqIGBgYFxuICAgKiBQYXJhIHJlZmVyZW5jaWFyIGEgc3VhIGZ1bsOnw6NvIHV0aWxpemUgYSBwcm9wcmllZGFkZSBgYmluZGAsIHBvciBleGVtcGxvOlxuICAgKiBgYGBcbiAgICogIFtwLWxvYWRdPVwib25Mb2FkT3B0aW9ucy5iaW5kKHRoaXMpXCJcbiAgICogYGBgXG4gICAqL1xuICBASW5wdXQoJ3AtbG9hZCcpIG9uTG9hZDogc3RyaW5nIHwgKCgpID0+IFBvUGFnZUR5bmFtaWNFZGl0T3B0aW9ucyk7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRnVuw6fDo28gcXVlIHNlcsOhIGV4ZWN1dGFkYSBhcMOzcyBzZXIgcmVhbGl6YWRhIGEgYnVzY2EgZG9zIGRhZG9zLlxuICAgKlxuICAgKiBBIHByb3ByaWVkYWRlIGFjZWl0YSBvcyBzZWd1aW50ZXMgdGlwb3M6XG4gICAqIC0gYGZ1bmN0aW9uYDogTcOpdG9kbyBxdWUgc2Vyw6EgZXhlY3V0YWRvLlxuICAgKlxuICAgKiBFc3RhIGZ1bsOnw6NvIHBhc3NhIHBvciBwYXLDom1ldHJvIG8gbW9kZWwgZSBkZXZlIHJlY2Viw6otbG8gZGUgdm9sdGEgY29tIGFzIGFsdGVyYcOnw7Vlcy5cbiAgICogVGFtYsOpbSBhY2VpdGEgbyByZXRvcm5vIGRlIHVtIE9ic2VydmFibGUgY29tIG8gbm92byBtb2RlbC5cbiAgICpcbiAgICogUG9yIGV4ZW1wbG86XG4gICAqXG4gICAqIGBgYFxuICAgKiBvbkxvYWRDdXN0b20obW9kZWwpIHtcbiAgICogIHJldHVybiB7IC4uLm1vZGVsLCBjdXN0b21GaWVsZDogJ25ld1ZhbHVlJyB9O1xuICAgKiB9XG4gICAqXG4gICAqIGBgYFxuICAgKiBQYXJhIHJlZmVyZW5jaWFyIGEgc3VhIGZ1bsOnw6NvIHV0aWxpemUgYSBwcm9wcmllZGFkZSBgYmluZGAsIHBvciBleGVtcGxvOlxuICAgKiBgYGBcbiAgICogIFtwLWxvYWQtZGF0YV09XCJvbkxvYWRDdXN0b20uYmluZCh0aGlzKVwiXG4gICAqIGBgYFxuICAgKi9cbiAgQElucHV0KCdwLWxvYWQtZGF0YScpIG9uTG9hZERhdGE6ICgobW9kZWw6IGFueSkgPT4gYW55KSB8ICgobW9kZWw6IGFueSkgPT4gT2JzZXJ2YWJsZTxhbnk+KTtcblxuICBtb2RlbDogYW55ID0ge307XG5cbiAgLy8gYmVmb3JlU2F2ZTogcmV0dXJuIGJvb2xlYW5cbiAgLy8gYWZ0ZXJTYXZlXG4gIC8vIGJlZm9yZVJlbW92ZTogcmV0dXJuIGJvb2xlYW5cbiAgLy8gYWZ0ZXJSZW1vdmVcbiAgLy8gYmVmb3JlSW5zZXJ0OiA6IHJldHVybiBib29sZWFuXG4gIHJlYWRvbmx5IGRldGFpbEFjdGlvbnM6IFBvR3JpZFJvd0FjdGlvbnMgPSB7fTtcblxuICBwcml2YXRlIGluZGV4Rm9jdXMgPSAwO1xuICBwcml2YXRlIGxhbmd1YWdlOiBzdHJpbmc7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xuICBwcml2YXRlIF9hY3Rpb25zOiBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnMgPSB7fTtcbiAgcHJpdmF0ZSBfbGl0ZXJhbHM6IFBvUGFnZUR5bmFtaWNFZGl0TGl0ZXJhbHM7XG4gIHByaXZhdGUgX2F1dG9Sb3V0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY29udHJvbEZpZWxkczogQXJyYXk8YW55PiA9IFtdO1xuICBwcml2YXRlIF9kZXRhaWxGaWVsZHM6IEFycmF5PGFueT4gPSBbXTtcbiAgcHJpdmF0ZSBfZHVwbGljYXRlczogQXJyYXk8YW55PiA9IFtdO1xuICBwcml2YXRlIF9maWVsZHM6IEFycmF5PGFueT4gPSBbXTtcbiAgcHJpdmF0ZSBfa2V5czogQXJyYXk8YW55PiA9IFtdO1xuICBwcml2YXRlIF9wYWdlQWN0aW9uczogQXJyYXk8UG9QYWdlQWN0aW9uPiA9IFtdO1xuICBwcml2YXRlIF9ub3RpZmljYXRpb25UeXBlPzogc3RyaW5nID0gcG9Ob3RpZmljYXRpb25UeXBlRGVmYXVsdDtcbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQcOnw7VlcyBkYSBww6FnaW5hLlxuICAgKi9cbiAgQElucHV0KCdwLWFjdGlvbnMnKSBzZXQgYWN0aW9ucyh2YWx1ZTogUG9QYWdlRHluYW1pY0VkaXRBY3Rpb25zKSB7XG4gICAgdGhpcy5fYWN0aW9ucyA9IHRoaXMuaXNPYmplY3QodmFsdWUpID8gdmFsdWUgOiB7fTtcblxuICAgIHRoaXMuX3BhZ2VBY3Rpb25zID0gdGhpcy5nZXRQYWdlQWN0aW9ucyh0aGlzLl9hY3Rpb25zKTtcbiAgfVxuXG4gIGdldCBhY3Rpb25zKCkge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX2FjdGlvbnMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIE9iamV0byBjb20gYXMgbGl0ZXJhaXMgdXNhZGFzIG5vIGBwby1wYWdlLWR5bmFtaWMtZWRpdGAuXG4gICAqXG4gICAqIMOJIHBvc3NpdmVsIGN1c3RvbWl6YXIgcGFzc2FuZG8gdW0gb2JqZXRvIGNvbSB0b2RhcyBhcyBsaXRlcmFpcyBkaXNwb27DrXZlaXNcbiAgICogb3UgcGFzc2FuZG8gYXBlbmFzIGFzIGxpdGVyYWlzIHF1ZSBkZXNlamEgY3VzdG9taXphclxuICAgKlxuICAgKiBgYGBcbiAgICogIGNvbnN0IGN1c3RvbUxpdGVyYWxzOiBQb1BhZ2VEeW5hbWljRWRpdExpdGVyYWxzID0ge1xuICAgKiAgICBkZXRhaWxBY3Rpb25OZXc6ICdJbmNsdWlyJyxcbiAgICogICAgcGFnZUFjdGlvbkNhbmNlbDogJ0Rlc2NhcnRhcicsXG4gICAqICAgIHBhZ2VBY3Rpb25TYXZlOiAnR3JhdmFyJyxcbiAgICogICAgcGFnZUFjdGlvblNhdmVOZXc6ICdHcmF2YXIgZSBpbmNsdWlyJyxcbiAgICogICAgcmVnaXN0ZXJOb3RGb3VuZDogJ05lbmh1bSByZWdpc3RybyBlbmNvbnRyYWRvLicsXG4gICAqICAgIHNhdmVOb3RpZmljYXRpb25FcnJvcjogJ0NhbXBvKHMpIG9icmlnYXTDs3JpbyhzKSBzZW0gcHJlZW5jaGltZW50by4nLFxuICAgKiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1NhdmU6ICdJdGVtIHNhbHZvIGNvbSBzdWNlc3NvLicsXG4gICAqICAgIHNhdmVOb3RpZmljYXRpb25TdWNjZXNzVXBkYXRlOiAnSXRlbSBhdHVhbGl6YWRvIGNvbSBzdWNlc3NvLicsXG4gICAqICAgIHNhdmVOb3RpZmljYXRpb25XYXJuaW5nOiAnTmVjZXNzw6FyaW8gcHJlZW5jaGVyIG8gZm9ybXVsw6FyaW8gY29ycmV0YW1lbnRlLidcbiAgICogIH07XG4gICAqIGBgYFxuICAgKlxuICAgKiBFIHBhcmEgY2FycmVnYXIgYXMgbGl0ZXJhaXMgY3VzdG9taXphZGFzLCBiYXN0YSBhcGVuYXMgcGFzc2FyIG8gb2JqZXRvIHBhcmEgbyBjb21wb25lbnRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHBvLXBhZ2UtZHluYW1pYy1lZGl0XG4gICAqICAgW3AtbGl0ZXJhbHNdPVwiY3VzdG9tTGl0ZXJhbHNcIj5cbiAgICogPC9wby1wYWdlLWR5bmFtaWMtZWRpdD5cbiAgICogYGBgXG4gICAqXG4gICAqID4gTyB2YWxvciBwYWRyw6NvIHNlcsOhIHRyYWR1emlkbyBkZSBhY29yZG8gY29tIG8gaWRpb21hIGNvbmZpZ3VyYWRvIG5vIFtgUG9JMThuU2VydmljZWBdKC9kb2N1bWVudGF0aW9uL3BvLWkxOG4pIG91ICpicm93c2VyKi5cbiAgICovXG4gIEBJbnB1dCgncC1saXRlcmFscycpIHNldCBsaXRlcmFscyh2YWx1ZTogUG9QYWdlRHluYW1pY0VkaXRMaXRlcmFscykge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICB0aGlzLl9saXRlcmFscyA9IHtcbiAgICAgICAgLi4ucG9QYWdlRHluYW1pY0VkaXRMaXRlcmFsc0RlZmF1bHRbcG9Mb2NhbGVEZWZhdWx0XSxcbiAgICAgICAgLi4ucG9QYWdlRHluYW1pY0VkaXRMaXRlcmFsc0RlZmF1bHRbdGhpcy5sYW5ndWFnZV0sXG4gICAgICAgIC4uLnZhbHVlXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXRlcmFscyA9IHBvUGFnZUR5bmFtaWNFZGl0TGl0ZXJhbHNEZWZhdWx0W3RoaXMubGFuZ3VhZ2VdO1xuICAgIH1cblxuICAgIHRoaXMuX3BhZ2VBY3Rpb25zID0gdGhpcy5nZXRQYWdlQWN0aW9ucyh0aGlzLl9hY3Rpb25zKTtcbiAgfVxuXG4gIGdldCBsaXRlcmFscygpIHtcbiAgICByZXR1cm4gdGhpcy5fbGl0ZXJhbHMgfHwgcG9QYWdlRHluYW1pY0VkaXRMaXRlcmFsc0RlZmF1bHRbdGhpcy5sYW5ndWFnZV07XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBUaXBvIGRhIG5vdGlmaWNhw6fDo28uXG4gICAqXG4gICAqIMOJIHBvc3NpdmVsIGRlZmluaXIgbyB0aXBvIGRlIG5vdGlmaWNhw6fDo28gcXVlIHNlcsOhIGV4aWJpZG8gcXVhbmRvIGhvdXZlciBhbGd1bSBjYW1wbyBpbnbDoWxpZG8gbm8gZm9ybXVsw6FyaW8uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8cG8tcGFnZS1keW5hbWljLWVkaXRcbiAgICogICBwLW5vdGlmaWNhdGlvbi10eXBlPVwid2FybmluZ1wiPlxuICAgKiA8L3BvLXBhZ2UtZHluYW1pYy1lZGl0PlxuICAgKiBgYGBcbiAgICpcbiAgICogPiBPcyB2YWxvcmVzIGFjZWl0b3Mgc8OjbyAnd2FybmluZycgZSAnZXJyb3InLlxuICAgKiBAZGVmYXVsdCB3YXJuaW5nXG4gICAqL1xuICBASW5wdXQoJ3Atbm90aWZpY2F0aW9uLXR5cGUnKSBzZXQgbm90aWZpY2F0aW9uVHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uVHlwZSA9IHBvTm90aWZpY2F0aW9uVHlwZS5pbmNsdWRlcyh2YWx1ZSkgPyB2YWx1ZSA6IHBvTm90aWZpY2F0aW9uVHlwZURlZmF1bHQ7XG4gIH1cblxuICBnZXQgbm90aWZpY2F0aW9uVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbm90aWZpY2F0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdG9kbyBWYWxpZGFyIHJvdGFzIG5hIG3Do28gcG9pcyBzZSBleGlzdGlyIHVtYSByb3RhICcqKicgbyBjYXRjaCBkbyBuYXZpZ2F0aW9uIG7Do28gZnVuY2lvbmEuXG4gICAqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQ3JpYSBhdXRvbWF0aWNhbWVudGUgYXMgcm90YXMgZGUgZWRpw6fDo28gKG5vdm8vZHVwbGljYXRlKSBlIGRldGFsaGVzIGNhc28gYXMgYcOnw7Vlc1xuICAgKiBlc3RlamFtIGRlZmluaWRhcyBuYXMgYcOnw7Vlcy5cbiAgICpcbiAgICogPiBQYXJhIG8gY29ycmV0byBmdW5jaW9uYW1lbnRvIG7Do28gcG9kZSBoYXZlciBuZW5odW0gcm90YSBjb3JpbmdhIChgKipgKSBlc3BlY2lmaWNhZGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoJ3AtYXV0by1yb3V0ZXInKSBzZXQgYXV0b1JvdXRlcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2F1dG9Sb3V0ZXIgPSBjb252ZXJ0VG9Cb29sZWFuKHZhbHVlKTtcbiAgfVxuXG4gIGdldCBhdXRvUm91dGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hdXRvUm91dGVyO1xuICB9XG5cbiAgLyoqIExpc3RhIGRvcyBjYW1wb3MgdXNhZG9zIG5hIHRhYmVsYSBlIGJ1c2NhIGF2YW7Dp2FkYS4gKi9cbiAgQElucHV0KCdwLWZpZWxkcycpIHNldCBmaWVsZHModmFsdWU6IEFycmF5PFBvUGFnZUR5bmFtaWNFZGl0RmllbGQ+KSB7XG4gICAgdGhpcy5fZmllbGRzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogW107XG5cbiAgICB0aGlzLl9rZXlzID0gdGhpcy5nZXRLZXlzQnlGaWVsZHModGhpcy5fZmllbGRzKTtcbiAgICB0aGlzLl9kdXBsaWNhdGVzID0gdGhpcy5nZXREdXBsaWNhdGVzQnlGaWVsZHModGhpcy5fZmllbGRzKTtcblxuICAgIHRoaXMuX2NvbnRyb2xGaWVsZHMgPSB0aGlzLmdldENvbnRyb2xGaWVsZHModGhpcy5fZmllbGRzKTtcbiAgICB0aGlzLl9kZXRhaWxGaWVsZHMgPSB0aGlzLmdldERldGFpbEZpZWxkcyh0aGlzLl9maWVsZHMpO1xuICB9XG5cbiAgZ2V0IGZpZWxkcygpOiBBcnJheTxQb1BhZ2VEeW5hbWljRWRpdEZpZWxkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkcztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBwb05vdGlmaWNhdGlvbjogUG9Ob3RpZmljYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcG9EaWFsb2dTZXJ2aWNlOiBQb0RpYWxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1BhZ2VEeW5hbWljU2VydmljZTogUG9QYWdlRHluYW1pY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1BhZ2VDdXN0b21pemF0aW9uU2VydmljZTogUG9QYWdlQ3VzdG9taXphdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnNTZXJ2aWNlOiBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnNTZXJ2aWNlLFxuICAgIGxhbmd1YWdlU2VydmljZTogUG9MYW5ndWFnZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlU2VydmljZS5nZXRTaG9ydExhbmd1YWdlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWREYXRhRnJvbUFQSSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucykge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHtcbiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBkZXRhaWxBY3Rpb25OZXcoKSB7XG4gICAgdGhpcy5ncmlkRGV0YWlsLmluc2VydFJvdygpO1xuICB9XG5cbiAgZ2V0IGR1cGxpY2F0ZXMoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9kdXBsaWNhdGVzXTtcbiAgfVxuXG4gIGdldCBrZXlzKCkge1xuICAgIHJldHVybiBbLi4udGhpcy5fa2V5c107XG4gIH1cblxuICBnZXQgcGFnZUFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9wYWdlQWN0aW9uc107XG4gIH1cblxuICBnZXQgY29udHJvbEZpZWxkcygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbEZpZWxkcztcbiAgfVxuXG4gIGdldCBkZXRhaWxGaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RldGFpbEZpZWxkcztcbiAgfVxuXG4gIHByaXZhdGUgbG9hZERhdGFGcm9tQVBJKCkge1xuICAgIGNvbnN0IHsgc2VydmljZUFwaTogc2VydmljZUFwaUZyb21Sb3V0ZSwgc2VydmljZU1ldGFkYXRhQXBpLCBzZXJ2aWNlTG9hZEFwaSB9ID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5kYXRhO1xuICAgIGNvbnN0IHsgaWQgfSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucGFyYW1zO1xuICAgIGNvbnN0IHsgZHVwbGljYXRlIH0gPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zO1xuXG4gICAgY29uc3Qgb25Mb2FkID0gc2VydmljZUxvYWRBcGkgfHwgdGhpcy5vbkxvYWQ7XG4gICAgdGhpcy5zZXJ2aWNlQXBpID0gc2VydmljZUFwaUZyb21Sb3V0ZSB8fCB0aGlzLnNlcnZpY2VBcGk7XG5cbiAgICB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlLmNvbmZpZ1NlcnZpY2VBcGkoeyBlbmRwb2ludDogdGhpcy5zZXJ2aWNlQXBpLCBtZXRhZGF0YTogc2VydmljZU1ldGFkYXRhQXBpIH0pO1xuXG4gICAgY29uc3QgbWV0YWRhdGEkID0gdGhpcy5nZXRNZXRhZGF0YShzZXJ2aWNlQXBpRnJvbVJvdXRlLCBpZCwgb25Mb2FkKTtcbiAgICBjb25zdCBkYXRhJCA9IHRoaXMubG9hZERhdGEoaWQsIGR1cGxpY2F0ZSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChjb25jYXQobWV0YWRhdGEkLCBkYXRhJCkuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWwoXG4gICAgYWN0aW9uQ2FuY2VsOiBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnNbJ2NhbmNlbCddLFxuICAgIGFjdGlvbkJlZm9yZUNhbmNlbDogUG9QYWdlRHluYW1pY0VkaXRBY3Rpb25zWydiZWZvcmVDYW5jZWwnXVxuICApIHtcbiAgICBpZiAodGhpcy5keW5hbWljRm9ybSAmJiB0aGlzLmR5bmFtaWNGb3JtLmZvcm0uZGlydHkpIHtcbiAgICAgIHRoaXMucG9EaWFsb2dTZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLmxpdGVyYWxzLmNhbmNlbENvbmZpcm1NZXNzYWdlLFxuICAgICAgICB0aXRsZTogdGhpcy5saXRlcmFscy5wYWdlQWN0aW9uQ2FuY2VsLFxuICAgICAgICBjb25maXJtOiB0aGlzLmdvQmFjay5iaW5kKHRoaXMsIGFjdGlvbkNhbmNlbCwgYWN0aW9uQmVmb3JlQ2FuY2VsKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ29CYWNrKGFjdGlvbkNhbmNlbCwgYWN0aW9uQmVmb3JlQ2FuY2VsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFVuaXF1ZUtleShpdGVtKSB7XG4gICAgY29uc3Qga2V5cyA9IG1hcE9iamVjdEJ5UHJvcGVydGllcyhpdGVtLCB0aGlzLmtleXMpO1xuXG4gICAgcmV0dXJuIHZhbHVlc0Zyb21PYmplY3Qoa2V5cykuam9pbignfCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnb0JhY2soXG4gICAgYWN0aW9uQ2FuY2VsOiBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnNbJ2NhbmNlbCddLFxuICAgIGFjdGlvbkJlZm9yZUNhbmNlbDogUG9QYWdlRHluYW1pY0VkaXRBY3Rpb25zWydiZWZvcmVDYW5jZWwnXVxuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMucG9QYWdlRHluYW1pY0VkaXRBY3Rpb25zU2VydmljZVxuICAgICAgICAuYmVmb3JlQ2FuY2VsKGFjdGlvbkJlZm9yZUNhbmNlbClcbiAgICAgICAgLnN1YnNjcmliZSgoYmVmb3JlQ2FuY2VsUmVzdWx0OiBQb1BhZ2VEeW5hbWljRWRpdEJlZm9yZUNhbmNlbCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXhlY3V0ZUJhY2tBY3Rpb24oYWN0aW9uQ2FuY2VsLCBiZWZvcmVDYW5jZWxSZXN1bHQ/LmFsbG93QWN0aW9uLCBiZWZvcmVDYW5jZWxSZXN1bHQ/Lm5ld1VybCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZUJhY2tBY3Rpb24oXG4gICAgYWN0aW9uQ2FuY2VsOiBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnNbJ2NhbmNlbCddLFxuICAgIGFsbG93QWN0aW9uPzogUG9QYWdlRHluYW1pY0VkaXRCZWZvcmVDYW5jZWxbJ2FsbG93QWN0aW9uJ10sXG4gICAgbmV3VXJsPzogUG9QYWdlRHluYW1pY0VkaXRCZWZvcmVDYW5jZWxbJ25ld1VybCddXG4gICkge1xuICAgIGNvbnN0IGlzQWxsb3dlZEFjdGlvbiA9IHR5cGVvZiBhbGxvd0FjdGlvbiA9PT0gJ2Jvb2xlYW4nID8gYWxsb3dBY3Rpb24gOiB0cnVlO1xuXG4gICAgaWYgKGlzQWxsb3dlZEFjdGlvbikge1xuICAgICAgaWYgKGFjdGlvbkNhbmNlbCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBhY3Rpb25DYW5jZWwgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gd2luZG93Lmhpc3RvcnkuYmFjaygpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGFjdGlvbkNhbmNlbCA9PT0gJ3N0cmluZycgfHwgbmV3VXJsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbbmV3VXJsIHx8IGFjdGlvbkNhbmNlbF0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWN0aW9uQ2FuY2VsKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRGF0YShpZCwgZHVwbGljYXRlPykge1xuICAgIGlmICghaWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBkdXBsaWNhdGUgPyBKU09OLnBhcnNlKGR1cGxpY2F0ZSkgOiB7fTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aGlzLm1vZGVsID0ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wb1BhZ2VEeW5hbWljU2VydmljZS5nZXRSZXNvdXJjZShpZCkucGlwZShcbiAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgIHRoaXMuYmVmb3JlU2V0TW9kZWwocmVzcG9uc2UpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5hY3Rpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9wYWdlQWN0aW9ucyA9IFtdO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJlZm9yZVNldE1vZGVsKHJlc3BvbnNlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMub25Mb2FkRGF0YSkge1xuICAgICAgdGhpcy5tb2RlbCA9IHJlc3BvbnNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9uTG9hZERhdGFFeGVjdXRpb24gPSB0aGlzLm9uTG9hZERhdGEocmVzcG9uc2UpO1xuICAgIGNvbnN0IG9uTG9hZERhdGEkID0gb25Mb2FkRGF0YUV4ZWN1dGlvbiBpbnN0YW5jZW9mIE9ic2VydmFibGUgPyBvbkxvYWREYXRhRXhlY3V0aW9uIDogb2Yob25Mb2FkRGF0YUV4ZWN1dGlvbik7XG5cbiAgICBvbkxvYWREYXRhJC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogY3VzdG9tTW9kZWwgPT4ge1xuICAgICAgICB0aGlzLm1vZGVsID0gY3VzdG9tTW9kZWw7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHJlc3BvbnNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkT3B0aW9uc09uSW5pdGlhbGl6ZShvbkxvYWQ6IFVybE9yUG9DdXN0b21pemF0aW9uRnVuY3Rpb24pIHtcbiAgICBpZiAob25Mb2FkKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQb0R5bmFtaWNQYWdlT3B0aW9ucyhvbkxvYWQpLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZVBvT3B0aW9uID0+XG4gICAgICAgICAgdGhpcy5wb1BhZ2VDdXN0b21pemF0aW9uU2VydmljZS5jaGFuZ2VPcmlnaW5hbE9wdGlvbnNUb05ld09wdGlvbnModGhpcywgcmVzcG9uc2VQb09wdGlvbilcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gRU1QVFk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzQ2hlY2tib3hJbnB1dChjb250cm9sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjaGVja2JveEdyb3VwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgcG8tY2hlY2tib3gtZ3JvdXBbbmctcmVmbGVjdC1uYW1lPSR7Y29udHJvbH1dYCk7XG4gICAgaWYgKGNoZWNrYm94R3JvdXApIHtcbiAgICAgIGNvbnN0IGNoZWNrQm94Q29tcG9uZW50ID0gY2hlY2tib3hHcm91cC5xdWVyeVNlbGVjdG9yKCdwby1jaGVja2JveFtuZy1yZWZsZWN0LWRpc2FibGVkPWZhbHNlXScpO1xuICAgICAgY29uc3QgbGFiZWxJbnB1dDogSFRNTElucHV0RWxlbWVudCA9IGNoZWNrQm94Q29tcG9uZW50Py5xdWVyeVNlbGVjdG9yKCcucG8tY2hlY2tib3gtb3V0bGluZScpO1xuICAgICAgaWYgKGxhYmVsSW5wdXQpIHtcbiAgICAgICAgbGFiZWxJbnB1dC5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbmRleEZvY3VzLS07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0NvbnRyb2woY29udHJvbDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW25hbWU9JHtjb250cm9sfV1gKTtcbiAgICBpZiAoaW5wdXRFbGVtZW50KSB7XG4gICAgICBpZiAoaW5wdXRFbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcpIHtcbiAgICAgICAgaW5wdXRFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvY3VzUmFkaW9JbnB1dChpbnB1dEVsZW1lbnQsIGNvbnRyb2wpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzQ2hlY2tib3hJbnB1dChjb250cm9sKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzUmFkaW9JbnB1dChpbnB1dEVsZW1lbnQ6IEVsZW1lbnQsIGNvbnRyb2w6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJhZGlvQ29tcG9uZW50ID0gaW5wdXRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBgcG8tcmFkaW9bbmctcmVmbGVjdC1uYW1lPSR7Y29udHJvbH1dW25nLXJlZmxlY3QtZGlzYWJsZWQ9ZmFsc2VdYFxuICAgICk7XG4gICAgaWYgKHJhZGlvQ29tcG9uZW50KSB7XG4gICAgICBjb25zdCByYWRpb0lucHV0ID0gcmFkaW9Db21wb25lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICAgIHJhZGlvSW5wdXQuZm9jdXMoKTtcbiAgICAgIHJhZGlvSW5wdXQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3BvLXJhZGlvLWZvY3VzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5kZXhGb2N1cy0tO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9EeW5hbWljUGFnZU9wdGlvbnMob25Mb2FkOiBVcmxPclBvQ3VzdG9taXphdGlvbkZ1bmN0aW9uKTogT2JzZXJ2YWJsZTxQb1BhZ2VEeW5hbWljRWRpdE9wdGlvbnM+IHtcbiAgICBjb25zdCBvcmlnaW5hbE9wdGlvbjogUG9QYWdlRHluYW1pY0VkaXRPcHRpb25zID0ge1xuICAgICAgZmllbGRzOiB0aGlzLmZpZWxkcyxcbiAgICAgIGFjdGlvbnM6IHRoaXMuYWN0aW9ucyxcbiAgICAgIGJyZWFkY3J1bWI6IHRoaXMuYnJlYWRjcnVtYixcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlXG4gICAgfTtcblxuICAgIGNvbnN0IHBhZ2VPcHRpb25TY2hlbWE6IFBvUGFnZUR5bmFtaWNPcHRpb25zU2NoZW1hPFBvUGFnZUR5bmFtaWNFZGl0T3B0aW9ucz4gPSB7XG4gICAgICBzY2hlbWE6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWVQcm9wOiAnZmllbGRzJyxcbiAgICAgICAgICBtZXJnZTogdHJ1ZSxcbiAgICAgICAgICBrZXlGb3JNZXJnZTogJ3Byb3BlcnR5J1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZVByb3A6ICdhY3Rpb25zJyxcbiAgICAgICAgICBtZXJnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZVByb3A6ICdicmVhZGNydW1iJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZVByb3A6ICd0aXRsZSdcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wb1BhZ2VDdXN0b21pemF0aW9uU2VydmljZS5nZXRDdXN0b21PcHRpb25zKG9uTG9hZCwgb3JpZ2luYWxPcHRpb24sIHBhZ2VPcHRpb25TY2hlbWEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNZXRhZGF0YShzZXJ2aWNlQXBpRnJvbVJvdXRlOiBzdHJpbmcsIHBhcmFtSWQ6IHN0cmluZyB8IG51bWJlciwgb25Mb2FkOiBVcmxPclBvQ3VzdG9taXphdGlvbkZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdHlwZU1ldGFkYXRhID0gcGFyYW1JZCA/ICdlZGl0JyA6ICdjcmVhdGUnO1xuXG4gICAgaWYgKHNlcnZpY2VBcGlGcm9tUm91dGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlLmdldE1ldGFkYXRhPFBvUGFnZUR5bmFtaWNFZGl0TWV0YWRhdGE+KHR5cGVNZXRhZGF0YSkucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICB0aGlzLmF1dG9Sb3V0ZXIgPSByZXNwb25zZS5hdXRvUm91dGVyIHx8IHRoaXMuYXV0b1JvdXRlcjtcbiAgICAgICAgICB0aGlzLmFjdGlvbnMgPSByZXNwb25zZS5hY3Rpb25zIHx8IHRoaXMuYWN0aW9ucztcbiAgICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSByZXNwb25zZS5icmVhZGNydW1iIHx8IHRoaXMuYnJlYWRjcnVtYjtcbiAgICAgICAgICB0aGlzLmZpZWxkcyA9IHJlc3BvbnNlLmZpZWxkcyB8fCB0aGlzLmZpZWxkcztcbiAgICAgICAgICB0aGlzLnRpdGxlID0gcmVzcG9uc2UudGl0bGUgfHwgdGhpcy50aXRsZTtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmxvYWRPcHRpb25zT25Jbml0aWFsaXplKG9uTG9hZCkpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxvYWRPcHRpb25zT25Jbml0aWFsaXplKG9uTG9hZCk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtDb250cm9sc0FzRGlydHlBbmRGb2N1c0ZpcnN0SW52YWxpZCgpOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4Rm9jdXMgPSAwO1xuICAgIGNvbnN0IGNvbnRyb2xzID0gT2JqZWN0LmtleXModGhpcy5keW5hbWljRm9ybS5mb3JtLmNvbnRyb2xzKTtcblxuICAgIGNvbnRyb2xzLmZvckVhY2goY29udHJvbCA9PiB7XG4gICAgICB0aGlzLmR5bmFtaWNGb3JtLmZvcm0uY29udHJvbHNbY29udHJvbF0ubWFya0FzRGlydHkoKTtcbiAgICAgIGlmICh0aGlzLmR5bmFtaWNGb3JtLmZvcm0uY29udHJvbHNbY29udHJvbF0uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgdGhpcy5pbmRleEZvY3VzID09PSAwKSB7XG4gICAgICAgIHRoaXMuZm9jdXNDb250cm9sKGNvbnRyb2wpO1xuICAgICAgICB0aGlzLmluZGV4Rm9jdXMrKztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbmF2aWdhdGVUbyhwYXRoOiBzdHJpbmcpIHtcbiAgICBpZiAocGF0aCkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5yZXNvbHZlVXJsKHRoaXMubW9kZWwsIHBhdGgpO1xuXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVVbmlxdWVLZXkoaXRlbTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucGFyYW1zWydpZCddID8gdGhpcy5mb3JtYXRVbmlxdWVLZXkoaXRlbSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVVcmwoaXRlbTogYW55LCBwYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCB1bmlxdWVLZXkgPSB0aGlzLmZvcm1hdFVuaXF1ZUtleShpdGVtKTtcblxuICAgIHJldHVybiBwYXRoLnJlcGxhY2UoLzppZC9nLCB1bmlxdWVLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlU2F2ZShzYXZlUmVkaXJlY3RQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzYXZlT3BlcmF0aW9uJCA9IHRoaXMuc2F2ZU9wZXJhdGlvbigpO1xuXG4gICAgcmV0dXJuIHNhdmVPcGVyYXRpb24kLnBpcGUoXG4gICAgICB0YXAobWVzc2FnZSA9PiB7XG4gICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uc3VjY2VzcyhtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKHNhdmVSZWRpcmVjdFBhdGgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNb2RlbChuZXdSZXNvdXJjZTogYW55ID0ge30pIHtcbiAgICBpZiAodHlwZW9mIG5ld1Jlc291cmNlICE9PSAndW5kZWZpbmVkJyAmJiBPYmplY3Qua2V5cyhuZXdSZXNvdXJjZSkubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjb25zdCBkeW5hbWljTmdGb3JtID0gdGhpcy5keW5hbWljRm9ybS5mb3JtO1xuXG4gICAgICByZW1vdmVLZXlzUHJvcGVydGllcyh0aGlzLmtleXMsIG5ld1Jlc291cmNlKTtcblxuICAgICAgdGhpcy5tb2RlbCA9IHsgLi4udGhpcy5tb2RlbCwgLi4ubmV3UmVzb3VyY2UgfTtcblxuICAgICAgZHluYW1pY05nRm9ybS5mb3JtLnBhdGNoVmFsdWUodGhpcy5tb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93Tm90aWZpY2F0aW9uKHR5cGU6IHN0cmluZykge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24ud2FybmluZyh0aGlzLmxpdGVyYWxzLnNhdmVOb3RpZmljYXRpb25XYXJuaW5nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uZXJyb3IodGhpcy5saXRlcmFscy5zYXZlTm90aWZpY2F0aW9uRXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNhdmVPcGVyYXRpb24oKSB7XG4gICAgaWYgKHRoaXMuZHluYW1pY0Zvcm0uZm9ybS5pbnZhbGlkKSB7XG4gICAgICB0aGlzLm1hcmtDb250cm9sc0FzRGlydHlBbmRGb2N1c0ZpcnN0SW52YWxpZCgpO1xuICAgICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKHRoaXMuX25vdGlmaWNhdGlvblR5cGUpO1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtSWQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtc1snaWQnXTtcbiAgICBjb25zdCBzdWNjZXNzTXNnID0gcGFyYW1JZFxuICAgICAgPyB0aGlzLmxpdGVyYWxzLnNhdmVOb3RpZmljYXRpb25TdWNjZXNzVXBkYXRlXG4gICAgICA6IHRoaXMubGl0ZXJhbHMuc2F2ZU5vdGlmaWNhdGlvblN1Y2Nlc3NTYXZlO1xuXG4gICAgY29uc3Qgc2F2ZU9wZXJhdGlvbiQgPSBwYXJhbUlkXG4gICAgICA/IHRoaXMucG9QYWdlRHluYW1pY1NlcnZpY2UudXBkYXRlUmVzb3VyY2UocGFyYW1JZCwgdGhpcy5tb2RlbClcbiAgICAgIDogdGhpcy5wb1BhZ2VEeW5hbWljU2VydmljZS5jcmVhdGVSZXNvdXJjZSh0aGlzLm1vZGVsKTtcblxuICAgIHJldHVybiBzYXZlT3BlcmF0aW9uJC5waXBlKG1hcCgoKSA9PiBzdWNjZXNzTXNnKSk7XG4gIH1cblxuICBwcml2YXRlIHNhdmUoYWN0aW9uOiBTYXZlQWN0aW9uLCBiZWZvcmU6ICdiZWZvcmVTYXZlJyB8ICdiZWZvcmVTYXZlTmV3JyA9ICdiZWZvcmVTYXZlJykge1xuICAgIGNvbnN0IGV4ZWN1dGVPcGVyYXRpb24gPSB7XG4gICAgICBiZWZvcmVTYXZlOiB0aGlzLmV4ZWN1dGVTYXZlLmJpbmQodGhpcyksXG4gICAgICBiZWZvcmVTYXZlTmV3OiB0aGlzLmV4ZWN1dGVTYXZlTmV3LmJpbmQodGhpcylcbiAgICB9O1xuXG4gICAgY29uc3QgdW5pcXVlS2V5ID0gdGhpcy5yZXNvbHZlVW5pcXVlS2V5KHRoaXMubW9kZWwpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnBvUGFnZUR5bmFtaWNFZGl0QWN0aW9uc1NlcnZpY2VbYmVmb3JlXSh0aGlzLmFjdGlvbnNbYmVmb3JlXSwgdW5pcXVlS2V5LCB7IC4uLnRoaXMubW9kZWwgfSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKHJldHVybkJlZm9yZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdBY3Rpb24gPSByZXR1cm5CZWZvcmU/Lm5ld1VybCA/PyBhY3Rpb247XG4gICAgICAgICAgICBjb25zdCBhbGxvd0FjdGlvbiA9IHJldHVybkJlZm9yZT8uYWxsb3dBY3Rpb24gPz8gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlbChyZXR1cm5CZWZvcmU/LnJlc291cmNlKTtcblxuICAgICAgICAgICAgaWYgKCFhbGxvd0FjdGlvbikge1xuICAgICAgICAgICAgICByZXR1cm4gb2Yoe30pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG5ld0FjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVPcGVyYXRpb25bYmVmb3JlXShuZXdBY3Rpb24pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3QWN0aW9uKHsgLi4udGhpcy5tb2RlbCB9LCB1bmlxdWVLZXkpO1xuICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlU2F2ZU5ldyhwYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXJhbUlkID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2lkJ107XG4gICAgY29uc3Qgc2F2ZU9wZXJhdGlvbiQgPSB0aGlzLnNhdmVPcGVyYXRpb24oKTtcblxuICAgIHJldHVybiBzYXZlT3BlcmF0aW9uJC5waXBlKFxuICAgICAgdGFwKG1lc3NhZ2UgPT4ge1xuICAgICAgICBpZiAocGFyYW1JZCkge1xuICAgICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uc3VjY2VzcyhtZXNzYWdlKTtcblxuICAgICAgICAgIHRoaXMubmF2aWdhdGVUbyhwYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBvTm90aWZpY2F0aW9uLnN1Y2Nlc3MobWVzc2FnZSk7XG5cbiAgICAgICAgICB0aGlzLm1vZGVsID0ge307XG4gICAgICAgICAgdGhpcy5keW5hbWljRm9ybS5mb3JtLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0S2V5c0J5RmllbGRzKGZpZWxkczogQXJyYXk8YW55PiA9IFtdKSB7XG4gICAgcmV0dXJuIGZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQua2V5ID09PSB0cnVlKS5tYXAoZmllbGQgPT4gZmllbGQucHJvcGVydHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250cm9sRmllbGRzKGZpZWxkczogQXJyYXk8YW55PiA9IFtdKSB7XG4gICAgcmV0dXJuIGZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQudHlwZSAhPT0gJ2RldGFpbCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXRhaWxGaWVsZHMoZmllbGRzOiBBcnJheTxhbnk+ID0gW10pIHtcbiAgICByZXR1cm4gZmllbGRzLmZpbHRlcihmaWVsZCA9PiBmaWVsZC50eXBlID09PSAnZGV0YWlsJyk7XG4gIH1cblxuICBwcml2YXRlIGdldER1cGxpY2F0ZXNCeUZpZWxkcyhmaWVsZHM6IEFycmF5PGFueT4gPSBbXSkge1xuICAgIHJldHVybiBmaWVsZHMuZmlsdGVyKGZpZWxkID0+IGZpZWxkLmR1cGxpY2F0ZSA9PT0gdHJ1ZSkubWFwKGZpZWxkID0+IGZpZWxkLnByb3BlcnR5KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFnZUFjdGlvbnMoYWN0aW9uczogUG9QYWdlRHluYW1pY0VkaXRBY3Rpb25zID0ge30pOiBBcnJheTxQb1BhZ2VBY3Rpb24+IHtcbiAgICBjb25zdCBwYWdlQWN0aW9uczogQXJyYXk8UG9QYWdlQWN0aW9uPiA9IFtcbiAgICAgIHsgbGFiZWw6IHRoaXMubGl0ZXJhbHMucGFnZUFjdGlvblNhdmUsIGFjdGlvbjogdGhpcy5zYXZlLmJpbmQodGhpcywgYWN0aW9ucy5zYXZlKSB9XG4gICAgXTtcblxuICAgIGlmIChhY3Rpb25zLnNhdmVOZXcpIHtcbiAgICAgIHBhZ2VBY3Rpb25zLnB1c2goe1xuICAgICAgICBsYWJlbDogdGhpcy5saXRlcmFscy5wYWdlQWN0aW9uU2F2ZU5ldyxcbiAgICAgICAgYWN0aW9uOiB0aGlzLnNhdmUuYmluZCh0aGlzLCBhY3Rpb25zLnNhdmVOZXcsICdiZWZvcmVTYXZlTmV3JylcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb25zLmNhbmNlbCA9PT0gdW5kZWZpbmVkIHx8IGFjdGlvbnMuY2FuY2VsKSB7XG4gICAgICBwYWdlQWN0aW9ucy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IHRoaXMubGl0ZXJhbHMucGFnZUFjdGlvbkNhbmNlbCxcbiAgICAgICAgYWN0aW9uOiB0aGlzLmNhbmNlbC5iaW5kKHRoaXMsIGFjdGlvbnMuY2FuY2VsLCB0aGlzLmFjdGlvbnMuYmVmb3JlQ2FuY2VsKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhZ2VBY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09iamVjdCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG4gIH1cbn1cbiIsIjxwby1wYWdlLWRlZmF1bHQgW3AtYWN0aW9uc109XCJwYWdlQWN0aW9uc1wiIFtwLWJyZWFkY3J1bWJdPVwiYnJlYWRjcnVtYlwiIFtwLXRpdGxlXT1cInRpdGxlXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbDsgdGhlbiBmb3JtRmllbGRzVGVtcGxhdGU7IGVsc2UgcmVnaXN0ZXJOb3RGb3VuZFRlbXBsYXRlXCI+IDwvbmctY29udGFpbmVyPlxuPC9wby1wYWdlLWRlZmF1bHQ+XG5cbjxuZy10ZW1wbGF0ZSAjcmVnaXN0ZXJOb3RGb3VuZFRlbXBsYXRlPlxuICA8cG8td2lkZ2V0PlxuICAgIDxwby1pY29uIHAtaWNvbj1cIklDT05fSU5GT1wiPjwvcG8taWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cInBvLWZvbnQtdGV4dC1sYXJnZVwiPlxuICAgICAge3sgbGl0ZXJhbHMucmVnaXN0ZXJOb3RGb3VuZCB9fVxuICAgIDwvc3Bhbj5cbiAgPC9wby13aWRnZXQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2Zvcm1GaWVsZHNUZW1wbGF0ZT5cbiAgPHBvLWR5bmFtaWMtZm9ybSAjZHluYW1pY0Zvcm0gW3AtZmllbGRzXT1cImNvbnRyb2xGaWVsZHNcIiBbcC12YWx1ZV09XCJtb2RlbFwiPiA8L3BvLWR5bmFtaWMtZm9ybT5cblxuICA8ZGl2ICpuZ0lmPVwiZGV0YWlsRmllbGRzLmxlbmd0aCA+IDBcIiBjbGFzcz1cInBvLXNtLTEyXCI+XG4gICAgPHBvLWRpdmlkZXIgW3AtbGFiZWxdPVwiZGV0YWlsRmllbGRzWzBdLmRpdmlkZXJcIj48L3BvLWRpdmlkZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwicG8tcm93IHBvLW1iLTJcIj5cbiAgICAgIDxwby1idXR0b24gW3AtbGFiZWxdPVwibGl0ZXJhbHMuZGV0YWlsQWN0aW9uTmV3XCIgKHAtY2xpY2spPVwiZGV0YWlsQWN0aW9uTmV3KClcIj48L3BvLWJ1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxwby1ncmlkXG4gICAgICAjZ3JpZERldGFpbFxuICAgICAgW3Atcm93LWFjdGlvbnNdPVwiZGV0YWlsQWN0aW9uc1wiXG4gICAgICBbcC1jb2x1bW5zXT1cImRldGFpbEZpZWxkc1swXS5kZXRhaWwuY29sdW1uc1wiXG4gICAgICBbcC1kYXRhXT1cIm1vZGVsW2RldGFpbEZpZWxkc1swXS5wcm9wZXJ0eV1cIlxuICAgID5cbiAgICA8L3BvLWdyaWQ+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==