@koalarx/ui 12.7.19 → 13.0.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 (432) hide show
  1. package/alert/{esm2015/index.js → esm2020/index.mjs} +0 -0
  2. package/alert/{esm2015/koalarx-ui-alert.js → esm2020/koalarx-ui-alert.mjs} +0 -0
  3. package/alert/esm2020/lib/dialog-alert.component.mjs +48 -0
  4. package/alert/{esm2015/lib/koala.alert-config.interface.js → esm2020/lib/koala.alert-config.interface.mjs} +0 -0
  5. package/alert/{esm2015/lib/koala.alert.enum.js → esm2020/lib/koala.alert.enum.mjs} +0 -0
  6. package/alert/esm2020/lib/koala.alert.module.mjs +48 -0
  7. package/alert/esm2020/lib/koala.alert.service.mjs +19 -0
  8. package/alert/{esm2015/lib/koala.request-code-to-alert-enum.translate.js → esm2020/lib/koala.request-code-to-alert-enum.translate.mjs} +0 -0
  9. package/alert/fesm2015/koalarx-ui-alert.mjs +141 -0
  10. package/alert/fesm2015/koalarx-ui-alert.mjs.map +1 -0
  11. package/alert/fesm2020/koalarx-ui-alert.mjs +139 -0
  12. package/alert/fesm2020/koalarx-ui-alert.mjs.map +1 -0
  13. package/alert/koalarx-ui-alert.d.ts +1 -0
  14. package/alert/lib/dialog-alert.component.d.ts +3 -0
  15. package/alert/lib/koala.alert.module.d.ts +10 -0
  16. package/alert/lib/koala.alert.service.d.ts +3 -0
  17. package/alert/package.json +18 -6
  18. package/button/{esm2015/index.js → esm2020/index.mjs} +0 -0
  19. package/button/{esm2015/koalarx-ui-button.js → esm2020/koalarx-ui-button.mjs} +0 -0
  20. package/button/esm2020/lib/button.component.mjs +44 -0
  21. package/button/esm2020/lib/koala.button.module.mjs +42 -0
  22. package/button/fesm2015/koalarx-ui-button.mjs +90 -0
  23. package/button/fesm2015/koalarx-ui-button.mjs.map +1 -0
  24. package/button/fesm2020/koalarx-ui-button.mjs +90 -0
  25. package/button/fesm2020/koalarx-ui-button.mjs.map +1 -0
  26. package/button/koalarx-ui-button.d.ts +1 -0
  27. package/button/lib/button.component.d.ts +6 -1
  28. package/button/lib/koala.button.module.d.ts +10 -0
  29. package/button/package.json +18 -6
  30. package/common/{esm2015/index.js → esm2020/index.mjs} +0 -0
  31. package/common/{esm2015/koalarx-ui-common.js → esm2020/koalarx-ui-common.mjs} +0 -0
  32. package/common/{esm2015/lib/mask-options.js → esm2020/lib/mask-options.mjs} +0 -0
  33. package/common/esm2020/lib/services/csv/koala.csv.service.mjs +36 -0
  34. package/common/{esm2015/lib/services/xlsx/koala.xlsx-config.interface.js → esm2020/lib/services/xlsx/koala.xlsx-config.interface.mjs} +0 -0
  35. package/common/esm2020/lib/services/xlsx/koala.xlsx.service.mjs +73 -0
  36. package/common/fesm2015/{koalarx-ui-common.js → koalarx-ui-common.mjs} +14 -14
  37. package/common/fesm2015/koalarx-ui-common.mjs.map +1 -0
  38. package/common/fesm2020/koalarx-ui-common.mjs +118 -0
  39. package/common/fesm2020/koalarx-ui-common.mjs.map +1 -0
  40. package/common/koalarx-ui-common.d.ts +1 -0
  41. package/common/lib/services/csv/koala.csv.service.d.ts +3 -0
  42. package/common/lib/services/xlsx/koala.xlsx.service.d.ts +3 -0
  43. package/common/package.json +18 -6
  44. package/core/esm2020/index.mjs +35 -0
  45. package/core/esm2020/koalarx-ui-core.mjs +5 -0
  46. package/core/{esm2015/lib/environments/koalaEnvironment.js → esm2020/lib/environments/koalaEnvironment.mjs} +0 -0
  47. package/core/esm2020/lib/loader/loader-bar-page.component.mjs +24 -0
  48. package/core/{esm2015/lib/loader/loader-bar-page.interface.js → esm2020/lib/loader/loader-bar-page.interface.mjs} +0 -0
  49. package/core/{esm2015/lib/loader/loader-config.interface.js → esm2020/lib/loader/loader-config.interface.mjs} +0 -0
  50. package/core/esm2020/lib/ngx-koala.module.mjs +49 -0
  51. package/core/{esm2015/lib/page/koala-language.helper.js → esm2020/lib/page/koala-language.helper.mjs} +0 -0
  52. package/core/{esm2015/lib/page/koala-page-pallet-colors.interface.js → esm2020/lib/page/koala-page-pallet-colors.interface.mjs} +0 -0
  53. package/core/esm2020/lib/page/koala.page.module.mjs +78 -0
  54. package/core/{esm2015/lib/page/koala.user-menu-options.interface.js → esm2020/lib/page/koala.user-menu-options.interface.mjs} +0 -0
  55. package/core/{esm2015/lib/page/notifications/koala.notification.interface.js → esm2020/lib/page/notifications/koala.notification.interface.mjs} +0 -0
  56. package/core/esm2020/lib/page/notifications/notification.component.mjs +47 -0
  57. package/core/esm2020/lib/page/page.component.mjs +404 -0
  58. package/core/esm2020/lib/router/koala.parameter-hash-location-stategy.mjs +18 -0
  59. package/core/esm2020/lib/services/api-requester/factory/koala.response.factory.mjs +44 -0
  60. package/core/{esm2015/lib/services/api-requester/helpers/error/koala.client.error.js → esm2020/lib/services/api-requester/helpers/error/koala.client.error.mjs} +0 -0
  61. package/core/{esm2015/lib/services/api-requester/helpers/error/koala.errors.helper.js → esm2020/lib/services/api-requester/helpers/error/koala.errors.helper.mjs} +0 -0
  62. package/core/{esm2015/lib/services/api-requester/helpers/error/koala.not-found.error.js → esm2020/lib/services/api-requester/helpers/error/koala.not-found.error.mjs} +0 -0
  63. package/core/{esm2015/lib/services/api-requester/helpers/error/koala.success.error.js → esm2020/lib/services/api-requester/helpers/error/koala.success.error.mjs} +0 -0
  64. package/core/{esm2015/lib/services/api-requester/helpers/error/koala.unhautorized.error.js → esm2020/lib/services/api-requester/helpers/error/koala.unhautorized.error.mjs} +0 -0
  65. package/core/{esm2015/lib/services/api-requester/helpers/service/koala.request-header.helper.js → esm2020/lib/services/api-requester/helpers/service/koala.request-header.helper.mjs} +0 -0
  66. package/core/esm2020/lib/services/api-requester/koala.api-requester.base.mjs +63 -0
  67. package/core/esm2020/lib/services/api-requester/koala.api-requester.service.mjs +131 -0
  68. package/core/esm2020/lib/services/loader/koala.loader.service.mjs +34 -0
  69. package/core/{esm2015/lib/services/openid/koala-oauth2-config.interface.js → esm2020/lib/services/openid/koala-oauth2-config.interface.mjs} +0 -0
  70. package/core/esm2020/lib/services/openid/koala.oauth.config.mjs +30 -0
  71. package/core/esm2020/lib/services/openid/koala.oauth2.service.mjs +194 -0
  72. package/core/esm2020/lib/services/request/koala.request.service.mjs +52 -0
  73. package/core/{esm2015/lib/services/token/koala.token.service.js → esm2020/lib/services/token/koala.token.service.mjs} +7 -6
  74. package/core/esm2020/lib/services/token/token.factory.mjs +27 -0
  75. package/core/fesm2015/{koalarx-ui-core.js → koalarx-ui-core.mjs} +249 -191
  76. package/core/fesm2015/koalarx-ui-core.mjs.map +1 -0
  77. package/core/fesm2020/koalarx-ui-core.mjs +1367 -0
  78. package/core/fesm2020/koalarx-ui-core.mjs.map +1 -0
  79. package/core/index.d.ts +1 -0
  80. package/core/koalarx-ui-core.d.ts +1 -2
  81. package/core/lib/loader/loader-bar-page.component.d.ts +5 -1
  82. package/core/lib/ngx-koala.module.d.ts +7 -0
  83. package/core/lib/page/koala.page.module.d.ts +19 -0
  84. package/core/lib/page/notifications/notification.component.d.ts +3 -0
  85. package/core/lib/page/page.component.d.ts +3 -0
  86. package/core/lib/router/koala.parameter-hash-location-stategy.d.ts +3 -0
  87. package/core/lib/services/api-requester/koala.api-requester.service.d.ts +3 -0
  88. package/core/lib/services/loader/koala.loader.service.d.ts +3 -0
  89. package/core/lib/services/openid/koala.oauth2.service.d.ts +3 -0
  90. package/core/lib/services/request/koala.request.service.d.ts +3 -0
  91. package/core/lib/services/token/koala.token.service.d.ts +3 -0
  92. package/core/package.json +18 -6
  93. package/dialog/{esm2015/index.js → esm2020/index.mjs} +0 -0
  94. package/dialog/{esm2015/koalarx-ui-dialog.js → esm2020/koalarx-ui-dialog.mjs} +0 -0
  95. package/dialog/esm2020/lib/dialog.component.mjs +25 -0
  96. package/dialog/{esm2015/lib/koala.dialog-template.interface.js → esm2020/lib/koala.dialog-template.interface.mjs} +0 -0
  97. package/dialog/esm2020/lib/koala.dialog.module.mjs +38 -0
  98. package/dialog/esm2020/lib/koala.dialog.service.mjs +57 -0
  99. package/dialog/fesm2015/koalarx-ui-dialog.mjs +121 -0
  100. package/dialog/fesm2015/koalarx-ui-dialog.mjs.map +1 -0
  101. package/dialog/fesm2020/koalarx-ui-dialog.mjs +121 -0
  102. package/dialog/fesm2020/koalarx-ui-dialog.mjs.map +1 -0
  103. package/dialog/koalarx-ui-dialog.d.ts +1 -0
  104. package/dialog/lib/dialog.component.d.ts +3 -0
  105. package/dialog/lib/koala.dialog.module.d.ts +9 -0
  106. package/dialog/lib/koala.dialog.service.d.ts +3 -0
  107. package/dialog/package.json +18 -6
  108. package/dynamic-component/{esm2015/index.js → esm2020/index.mjs} +0 -0
  109. package/dynamic-component/{esm2015/koalarx-ui-dynamic-component.js → esm2020/koalarx-ui-dynamic-component.mjs} +0 -0
  110. package/dynamic-component/{esm2015/lib/koala-dynamic-component.component.js → esm2020/lib/koala-dynamic-component.component.mjs} +0 -0
  111. package/dynamic-component/esm2020/lib/koala-dynamic-component.directive.mjs +16 -0
  112. package/dynamic-component/esm2020/lib/koala-dynamic-component.factory.mjs +41 -0
  113. package/dynamic-component/{esm2015/lib/koala-dynamic-component.js → esm2020/lib/koala-dynamic-component.mjs} +0 -0
  114. package/dynamic-component/esm2020/lib/koala-dynamic-component.module.mjs +23 -0
  115. package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.mjs +87 -0
  116. package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.mjs.map +1 -0
  117. package/dynamic-component/fesm2020/koalarx-ui-dynamic-component.mjs +86 -0
  118. package/dynamic-component/fesm2020/koalarx-ui-dynamic-component.mjs.map +1 -0
  119. package/dynamic-component/koalarx-ui-dynamic-component.d.ts +1 -0
  120. package/dynamic-component/lib/koala-dynamic-component.directive.d.ts +3 -0
  121. package/dynamic-component/lib/koala-dynamic-component.factory.d.ts +3 -0
  122. package/dynamic-component/lib/koala-dynamic-component.module.d.ts +6 -0
  123. package/dynamic-component/package.json +18 -6
  124. package/file-button/{esm2015/index.js → esm2020/index.mjs} +0 -0
  125. package/file-button/{esm2015/koalarx-ui-file-button.js → esm2020/koalarx-ui-file-button.mjs} +0 -0
  126. package/file-button/esm2020/lib/file-button.component.mjs +125 -0
  127. package/file-button/esm2020/lib/koala.btn-file.service.mjs +25 -0
  128. package/file-button/esm2020/lib/koala.file-button.module.mjs +38 -0
  129. package/file-button/{esm2015/lib/koala.file.interface.js → esm2020/lib/koala.file.interface.mjs} +0 -0
  130. package/file-button/fesm2015/koalarx-ui-file-button.mjs +199 -0
  131. package/file-button/fesm2015/koalarx-ui-file-button.mjs.map +1 -0
  132. package/file-button/fesm2020/koalarx-ui-file-button.mjs +189 -0
  133. package/file-button/fesm2020/koalarx-ui-file-button.mjs.map +1 -0
  134. package/file-button/koalarx-ui-file-button.d.ts +1 -0
  135. package/file-button/lib/file-button.component.d.ts +4 -1
  136. package/file-button/lib/koala.btn-file.service.d.ts +3 -0
  137. package/file-button/lib/koala.file-button.module.d.ts +9 -0
  138. package/file-button/package.json +18 -6
  139. package/folder-page/{esm2015/index.js → esm2020/index.mjs} +0 -0
  140. package/folder-page/{esm2015/koalarx-ui-folder-page.js → esm2020/koalarx-ui-folder-page.mjs} +0 -0
  141. package/folder-page/esm2020/lib/folder.component.mjs +70 -0
  142. package/folder-page/{esm2015/lib/koala-navigate-history.interface.js → esm2020/lib/koala-navigate-history.interface.mjs} +0 -0
  143. package/folder-page/esm2020/lib/koala.folder-page.module.mjs +42 -0
  144. package/folder-page/fesm2015/koalarx-ui-folder-page.mjs +117 -0
  145. package/folder-page/fesm2015/koalarx-ui-folder-page.mjs.map +1 -0
  146. package/folder-page/fesm2020/koalarx-ui-folder-page.mjs +116 -0
  147. package/folder-page/fesm2020/koalarx-ui-folder-page.mjs.map +1 -0
  148. package/folder-page/koalarx-ui-folder-page.d.ts +1 -0
  149. package/folder-page/lib/folder.component.d.ts +6 -2
  150. package/folder-page/lib/koala.folder-page.module.d.ts +10 -0
  151. package/folder-page/package.json +18 -6
  152. package/form/{esm2015/index.js → esm2020/index.mjs} +0 -0
  153. package/form/{esm2015/koalarx-ui-form.js → esm2020/koalarx-ui-form.mjs} +0 -0
  154. package/form/esm2020/lib/btn-submit/btn-submit.component.mjs +49 -0
  155. package/form/esm2020/lib/directives/koala-autofocus.directive.mjs +25 -0
  156. package/form/esm2020/lib/dynamic-form/builder/dynamic-form.builder.mjs +138 -0
  157. package/form/{esm2015/lib/dynamic-form/builder/fields/autocomplete.builder.js → esm2020/lib/dynamic-form/builder/fields/autocomplete.builder.mjs} +0 -0
  158. package/form/esm2020/lib/dynamic-form/builder/fields/field.base.mjs +148 -0
  159. package/form/{esm2015/lib/dynamic-form/builder/fields/field.builder.js → esm2020/lib/dynamic-form/builder/fields/field.builder.mjs} +0 -0
  160. package/form/esm2020/lib/dynamic-form/builder/fields/more-items.builder.mjs +57 -0
  161. package/form/esm2020/lib/dynamic-form/dynamic-form.component.mjs +581 -0
  162. package/form/{esm2015/lib/dynamic-form/enums/dynamic-form-type-field.enum.js → esm2020/lib/dynamic-form/enums/dynamic-form-type-field.enum.mjs} +0 -0
  163. package/form/{esm2015/lib/dynamic-form/interfaces/koala-custom-validator-fn.interface.js → esm2020/lib/dynamic-form/interfaces/koala-custom-validator-fn.interface.mjs} +0 -0
  164. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-autocomplete-options.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-autocomplete-options.interface.mjs} +0 -0
  165. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-autocomplete-multiple-config.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-autocomplete-multiple-config.interface.mjs} +0 -0
  166. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-config.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-config.interface.mjs} +0 -0
  167. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-field.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-field.interface.mjs} +0 -0
  168. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-more-itens-show-field-config.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-more-itens-show-field-config.interface.mjs} +0 -0
  169. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-show-field.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-show-field.interface.mjs} +0 -0
  170. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-set-value.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-set-value.interface.mjs} +0 -0
  171. package/form/esm2020/lib/dynamic-form/koala.dynamic-form.service.mjs +199 -0
  172. package/form/{esm2015/lib/dynamic-form/validators/autocomplete-selected.validator.js → esm2020/lib/dynamic-form/validators/autocomplete-selected.validator.mjs} +0 -0
  173. package/form/{esm2015/lib/dynamic-form/validators/cnpj.validator.js → esm2020/lib/dynamic-form/validators/cnpj.validator.mjs} +0 -0
  174. package/form/{esm2015/lib/dynamic-form/validators/cpf.validator.js → esm2020/lib/dynamic-form/validators/cpf.validator.mjs} +0 -0
  175. package/form/{esm2015/lib/dynamic-form/validators/date-max.validator.js → esm2020/lib/dynamic-form/validators/date-max.validator.mjs} +0 -0
  176. package/form/{esm2015/lib/dynamic-form/validators/date-min.validator.js → esm2020/lib/dynamic-form/validators/date-min.validator.mjs} +0 -0
  177. package/form/{esm2015/lib/dynamic-form/validators/koala-dynamic-form-validator-result.helper.js → esm2020/lib/dynamic-form/validators/koala-dynamic-form-validator-result.helper.mjs} +0 -0
  178. package/form/{esm2015/lib/dynamic-form/validators/validation.helper.js → esm2020/lib/dynamic-form/validators/validation.helper.mjs} +0 -0
  179. package/form/{esm2015/lib/form.abstract.js → esm2020/lib/form.abstract.mjs} +0 -0
  180. package/form/esm2020/lib/koala.form.module.mjs +134 -0
  181. package/form/{esm2015/lib/show-invalid-fields/show-invalid-fields.js → esm2020/lib/show-invalid-fields/show-invalid-fields.mjs} +0 -0
  182. package/form/fesm2015/koalarx-ui-form.mjs +1575 -0
  183. package/form/fesm2015/koalarx-ui-form.mjs.map +1 -0
  184. package/form/fesm2020/koalarx-ui-form.mjs +1557 -0
  185. package/form/fesm2020/koalarx-ui-form.mjs.map +1 -0
  186. package/form/koalarx-ui-form.d.ts +1 -0
  187. package/form/lib/btn-submit/btn-submit.component.d.ts +3 -0
  188. package/form/lib/directives/koala-autofocus.directive.d.ts +3 -0
  189. package/form/lib/dynamic-form/dynamic-form.component.d.ts +7 -1
  190. package/form/lib/dynamic-form/koala.dynamic-form.service.d.ts +3 -0
  191. package/form/lib/koala.form.module.d.ts +23 -0
  192. package/form/package.json +18 -6
  193. package/icon/{esm2015/index.js → esm2020/index.mjs} +2 -1
  194. package/icon/{esm2015/koalarx-ui-icon.js → esm2020/koalarx-ui-icon.mjs} +0 -0
  195. package/icon/esm2020/lib/icon.component.mjs +46 -0
  196. package/icon/esm2020/lib/koala.icon.module.mjs +26 -0
  197. package/icon/esm2020/lib/koala.icon.type.mjs +2 -0
  198. package/icon/fesm2015/koalarx-ui-icon.mjs +77 -0
  199. package/icon/{esm2015/lib/icon.component.js → fesm2015/koalarx-ui-icon.mjs.map} +1 -45
  200. package/icon/fesm2020/koalarx-ui-icon.mjs +76 -0
  201. package/icon/{fesm2015/koalarx-ui-icon.js → fesm2020/koalarx-ui-icon.mjs.map} +1 -69
  202. package/icon/index.d.ts +1 -0
  203. package/icon/koalarx-ui-icon.d.ts +1 -0
  204. package/icon/lib/icon.component.d.ts +4 -1
  205. package/icon/lib/koala.icon.module.d.ts +6 -0
  206. package/icon/lib/koala.icon.type.d.ts +1 -0
  207. package/icon/package.json +18 -6
  208. package/icons-animated/{esm2015/index.js → esm2020/index.mjs} +0 -0
  209. package/icons-animated/esm2020/koalarx-ui-icons-animated.mjs +5 -0
  210. package/icons-animated/esm2020/lib/icons/downloading/downloading-icon-animated.component.mjs +23 -0
  211. package/icons-animated/esm2020/lib/icons/loading/loading-icon-animated.component.mjs +23 -0
  212. package/icons-animated/esm2020/lib/icons-animated.component.mjs +20 -0
  213. package/icons-animated/esm2020/lib/icons-animated.service.mjs +32 -0
  214. package/icons-animated/esm2020/lib/koala-icons-animated.module.mjs +32 -0
  215. package/icons-animated/fesm2015/koalarx-ui-icons-animated.mjs +122 -0
  216. package/icons-animated/fesm2015/koalarx-ui-icons-animated.mjs.map +1 -0
  217. package/icons-animated/fesm2020/koalarx-ui-icons-animated.mjs +120 -0
  218. package/icons-animated/fesm2020/koalarx-ui-icons-animated.mjs.map +1 -0
  219. package/icons-animated/koalarx-ui-icons-animated.d.ts +1 -1
  220. package/icons-animated/lib/icons/downloading/downloading-icon-animated.component.d.ts +5 -2
  221. package/icons-animated/lib/icons/loading/loading-icon-animated.component.d.ts +5 -2
  222. package/icons-animated/lib/icons-animated.component.d.ts +3 -0
  223. package/icons-animated/lib/icons-animated.service.d.ts +3 -0
  224. package/icons-animated/lib/koala-icons-animated.module.d.ts +8 -0
  225. package/icons-animated/package.json +18 -6
  226. package/list/{esm2015/index.js → esm2020/index.mjs} +0 -0
  227. package/list/{esm2015/koalarx-ui-list.js → esm2020/koalarx-ui-list.mjs} +0 -0
  228. package/list/{esm2015/lib/koala-list-btn-collapse-sub-list-config.interface.js → esm2020/lib/koala-list-btn-collapse-sub-list-config.interface.mjs} +0 -0
  229. package/list/{esm2015/lib/koala-list-filter.interface.js → esm2020/lib/koala-list-filter.interface.mjs} +0 -0
  230. package/list/{esm2015/lib/koala-list-form-filter.interface.js → esm2020/lib/koala-list-form-filter.interface.mjs} +0 -0
  231. package/list/{esm2015/lib/koala-list-item-menu-option.interface.js → esm2020/lib/koala-list-item-menu-option.interface.mjs} +0 -0
  232. package/list/{esm2015/lib/koala-list-item.interface.js → esm2020/lib/koala-list-item.interface.mjs} +0 -0
  233. package/list/{esm2015/lib/koala.list-config.interface.js → esm2020/lib/koala.list-config.interface.mjs} +0 -0
  234. package/list/esm2020/lib/koala.list.module.mjs +70 -0
  235. package/list/esm2020/lib/koala.list.service.mjs +15 -0
  236. package/list/esm2020/lib/list-builder/list.builder.mjs +97 -0
  237. package/list/esm2020/lib/list.abstract.mjs +157 -0
  238. package/list/esm2020/lib/list.component.mjs +171 -0
  239. package/list/esm2020/lib/providers/pagination/pagination.provider.mjs +32 -0
  240. package/list/fesm2015/koalarx-ui-list.mjs +559 -0
  241. package/list/fesm2015/koalarx-ui-list.mjs.map +1 -0
  242. package/list/fesm2020/koalarx-ui-list.mjs +529 -0
  243. package/list/fesm2020/koalarx-ui-list.mjs.map +1 -0
  244. package/list/koalarx-ui-list.d.ts +1 -0
  245. package/list/lib/koala.list.module.d.ts +15 -0
  246. package/list/lib/koala.list.service.d.ts +3 -0
  247. package/list/lib/list.component.d.ts +3 -0
  248. package/list/lib/providers/pagination/pagination.provider.d.ts +3 -0
  249. package/list/package.json +18 -6
  250. package/menu/{esm2015/index.js → esm2020/index.mjs} +0 -0
  251. package/menu/{esm2015/koalarx-ui-menu.js → esm2020/koalarx-ui-menu.mjs} +0 -0
  252. package/menu/{esm2015/lib/koala.menu-module.interface.js → esm2020/lib/koala.menu-module.interface.mjs} +0 -0
  253. package/menu/{esm2015/lib/koala.menu-tool.interface.js → esm2020/lib/koala.menu-tool.interface.mjs} +0 -0
  254. package/menu/esm2020/lib/koala.menu.module.mjs +38 -0
  255. package/menu/esm2020/lib/koala.menu.service.mjs +24 -0
  256. package/menu/esm2020/lib/menu.component.mjs +100 -0
  257. package/menu/fesm2015/koalarx-ui-menu.mjs +167 -0
  258. package/menu/fesm2015/koalarx-ui-menu.mjs.map +1 -0
  259. package/menu/fesm2020/koalarx-ui-menu.mjs +162 -0
  260. package/menu/fesm2020/koalarx-ui-menu.mjs.map +1 -0
  261. package/menu/koalarx-ui-menu.d.ts +1 -0
  262. package/menu/lib/koala.menu.module.d.ts +9 -0
  263. package/menu/lib/koala.menu.service.d.ts +3 -0
  264. package/menu/lib/menu.component.d.ts +6 -0
  265. package/menu/package.json +18 -6
  266. package/package.json +1 -1
  267. package/question/{esm2015/index.js → esm2020/index.mjs} +0 -0
  268. package/question/{esm2015/koalarx-ui-question.js → esm2020/koalarx-ui-question.mjs} +0 -0
  269. package/question/esm2020/lib/dialog-question.component.mjs +25 -0
  270. package/question/{esm2015/lib/koala-question-config.interface.js → esm2020/lib/koala-question-config.interface.mjs} +0 -0
  271. package/question/esm2020/lib/koala.question.module.mjs +42 -0
  272. package/question/esm2020/lib/koala.question.service.mjs +26 -0
  273. package/question/fesm2015/koalarx-ui-question.mjs +95 -0
  274. package/question/fesm2015/koalarx-ui-question.mjs.map +1 -0
  275. package/question/fesm2020/koalarx-ui-question.mjs +93 -0
  276. package/question/fesm2020/koalarx-ui-question.mjs.map +1 -0
  277. package/question/koalarx-ui-question.d.ts +1 -0
  278. package/question/lib/dialog-question.component.d.ts +3 -0
  279. package/question/lib/koala.question.module.d.ts +10 -0
  280. package/question/lib/koala.question.service.d.ts +3 -0
  281. package/question/package.json +18 -6
  282. package/snackbar/{esm2015/index.js → esm2020/index.mjs} +0 -0
  283. package/snackbar/{esm2015/koalarx-ui-snackbar.js → esm2020/koalarx-ui-snackbar.mjs} +0 -0
  284. package/snackbar/esm2020/lib/koala.snackbar.component.mjs +22 -0
  285. package/snackbar/{esm2015/lib/koala.snackbar.interface.js → esm2020/lib/koala.snackbar.interface.mjs} +0 -0
  286. package/snackbar/esm2020/lib/koala.snackbar.module.mjs +38 -0
  287. package/snackbar/esm2020/lib/koala.snackbar.service.mjs +35 -0
  288. package/snackbar/fesm2015/koalarx-ui-snackbar.mjs +95 -0
  289. package/snackbar/fesm2015/koalarx-ui-snackbar.mjs.map +1 -0
  290. package/snackbar/fesm2020/koalarx-ui-snackbar.mjs +93 -0
  291. package/snackbar/fesm2020/koalarx-ui-snackbar.mjs.map +1 -0
  292. package/snackbar/koalarx-ui-snackbar.d.ts +1 -0
  293. package/snackbar/lib/koala.snackbar.component.d.ts +3 -0
  294. package/snackbar/lib/koala.snackbar.module.d.ts +8 -0
  295. package/snackbar/lib/koala.snackbar.service.d.ts +3 -0
  296. package/snackbar/package.json +18 -6
  297. package/alert/bundles/koalarx-ui-alert.umd.js +0 -153
  298. package/alert/bundles/koalarx-ui-alert.umd.js.map +0 -1
  299. package/alert/esm2015/lib/dialog-alert.component.js +0 -43
  300. package/alert/esm2015/lib/koala.alert.module.js +0 -31
  301. package/alert/esm2015/lib/koala.alert.service.js +0 -21
  302. package/alert/fesm2015/koalarx-ui-alert.js +0 -121
  303. package/alert/fesm2015/koalarx-ui-alert.js.map +0 -1
  304. package/alert/koalarx-ui-alert.metadata.json +0 -1
  305. package/button/bundles/koalarx-ui-button.umd.js +0 -71
  306. package/button/bundles/koalarx-ui-button.umd.js.map +0 -1
  307. package/button/esm2015/lib/button.component.js +0 -31
  308. package/button/esm2015/lib/koala.button.module.js +0 -27
  309. package/button/fesm2015/koalarx-ui-button.js +0 -63
  310. package/button/fesm2015/koalarx-ui-button.js.map +0 -1
  311. package/button/koalarx-ui-button.metadata.json +0 -1
  312. package/common/bundles/koalarx-ui-common.umd.js +0 -481
  313. package/common/bundles/koalarx-ui-common.umd.js.map +0 -1
  314. package/common/esm2015/lib/services/csv/koala.csv.service.js +0 -38
  315. package/common/esm2015/lib/services/xlsx/koala.xlsx.service.js +0 -74
  316. package/common/fesm2015/koalarx-ui-common.js.map +0 -1
  317. package/common/koalarx-ui-common.metadata.json +0 -1
  318. package/core/bundles/koalarx-ui-core.umd.js +0 -1716
  319. package/core/bundles/koalarx-ui-core.umd.js.map +0 -1
  320. package/core/esm2015/index.js +0 -34
  321. package/core/esm2015/koalarx-ui-core.js +0 -7
  322. package/core/esm2015/lib/loader/loader-bar-page.component.js +0 -22
  323. package/core/esm2015/lib/ngx-koala.module.js +0 -35
  324. package/core/esm2015/lib/page/koala.page.module.js +0 -46
  325. package/core/esm2015/lib/page/notifications/notification.component.js +0 -43
  326. package/core/esm2015/lib/page/page.component.js +0 -396
  327. package/core/esm2015/lib/router/koala.parameter-hash-location-stategy.js +0 -16
  328. package/core/esm2015/lib/services/api-requester/factory/koala.response.factory.js +0 -48
  329. package/core/esm2015/lib/services/api-requester/koala.api-requester.base.js +0 -70
  330. package/core/esm2015/lib/services/api-requester/koala.api-requester.service.js +0 -134
  331. package/core/esm2015/lib/services/loader/koala.loader.service.js +0 -32
  332. package/core/esm2015/lib/services/openid/koala.oauth.config.js +0 -33
  333. package/core/esm2015/lib/services/openid/koala.oauth2.service.js +0 -201
  334. package/core/esm2015/lib/services/request/koala.request.service.js +0 -53
  335. package/core/esm2015/lib/services/token/token.factory.js +0 -31
  336. package/core/fesm2015/koalarx-ui-core.js.map +0 -1
  337. package/core/koalarx-ui-core.metadata.json +0 -1
  338. package/dialog/bundles/koalarx-ui-dialog.umd.js +0 -139
  339. package/dialog/bundles/koalarx-ui-dialog.umd.js.map +0 -1
  340. package/dialog/esm2015/lib/dialog.component.js +0 -18
  341. package/dialog/esm2015/lib/koala.dialog.module.js +0 -25
  342. package/dialog/esm2015/lib/koala.dialog.service.js +0 -61
  343. package/dialog/fesm2015/koalarx-ui-dialog.js +0 -107
  344. package/dialog/fesm2015/koalarx-ui-dialog.js.map +0 -1
  345. package/dialog/koalarx-ui-dialog.metadata.json +0 -1
  346. package/dynamic-component/bundles/koalarx-ui-dynamic-component.umd.js +0 -95
  347. package/dynamic-component/bundles/koalarx-ui-dynamic-component.umd.js.map +0 -1
  348. package/dynamic-component/esm2015/lib/koala-dynamic-component.directive.js +0 -15
  349. package/dynamic-component/esm2015/lib/koala-dynamic-component.factory.js +0 -38
  350. package/dynamic-component/esm2015/lib/koala-dynamic-component.module.js +0 -17
  351. package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.js +0 -79
  352. package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.js.map +0 -1
  353. package/dynamic-component/koalarx-ui-dynamic-component.metadata.json +0 -1
  354. package/file-button/bundles/koalarx-ui-file-button.umd.js +0 -553
  355. package/file-button/bundles/koalarx-ui-file-button.umd.js.map +0 -1
  356. package/file-button/esm2015/lib/file-button.component.js +0 -118
  357. package/file-button/esm2015/lib/koala.btn-file.service.js +0 -26
  358. package/file-button/esm2015/lib/koala.file-button.module.js +0 -25
  359. package/file-button/fesm2015/koalarx-ui-file-button.js +0 -171
  360. package/file-button/fesm2015/koalarx-ui-file-button.js.map +0 -1
  361. package/file-button/koalarx-ui-file-button.metadata.json +0 -1
  362. package/folder-page/bundles/koalarx-ui-folder-page.umd.js +0 -97
  363. package/folder-page/bundles/koalarx-ui-folder-page.umd.js.map +0 -1
  364. package/folder-page/esm2015/lib/folder.component.js +0 -56
  365. package/folder-page/esm2015/lib/koala.folder-page.module.js +0 -27
  366. package/folder-page/fesm2015/koalarx-ui-folder-page.js +0 -88
  367. package/folder-page/fesm2015/koalarx-ui-folder-page.js.map +0 -1
  368. package/folder-page/koalarx-ui-folder-page.metadata.json +0 -1
  369. package/form/bundles/koalarx-ui-form.umd.js +0 -1969
  370. package/form/bundles/koalarx-ui-form.umd.js.map +0 -1
  371. package/form/esm2015/lib/btn-submit/btn-submit.component.js +0 -39
  372. package/form/esm2015/lib/directives/koala-autofocus.directive.js +0 -25
  373. package/form/esm2015/lib/dynamic-form/builder/dynamic-form.builder.js +0 -141
  374. package/form/esm2015/lib/dynamic-form/builder/fields/field.base.js +0 -151
  375. package/form/esm2015/lib/dynamic-form/builder/fields/more-items.builder.js +0 -57
  376. package/form/esm2015/lib/dynamic-form/dynamic-form.component.js +0 -564
  377. package/form/esm2015/lib/dynamic-form/koala.dynamic-form.service.js +0 -204
  378. package/form/esm2015/lib/koala.form.module.js +0 -69
  379. package/form/fesm2015/koalarx-ui-form.js +0 -1487
  380. package/form/fesm2015/koalarx-ui-form.js.map +0 -1
  381. package/form/koalarx-ui-form.metadata.json +0 -1
  382. package/icon/bundles/koalarx-ui-icon.umd.js +0 -76
  383. package/icon/bundles/koalarx-ui-icon.umd.js.map +0 -1
  384. package/icon/esm2015/lib/koala.icon.module.js +0 -19
  385. package/icon/fesm2015/koalarx-ui-icon.js.map +0 -1
  386. package/icon/koalarx-ui-icon.metadata.json +0 -1
  387. package/icons-animated/bundles/koalarx-ui-icons-animated.umd.js +0 -138
  388. package/icons-animated/bundles/koalarx-ui-icons-animated.umd.js.map +0 -1
  389. package/icons-animated/esm2015/koalarx-ui-icons-animated.js +0 -6
  390. package/icons-animated/esm2015/lib/icons/downloading/downloading-icon-animated.component.js +0 -28
  391. package/icons-animated/esm2015/lib/icons/loading/loading-icon-animated.component.js +0 -28
  392. package/icons-animated/esm2015/lib/icons-animated.component.js +0 -15
  393. package/icons-animated/esm2015/lib/icons-animated.service.js +0 -29
  394. package/icons-animated/esm2015/lib/koala-icons-animated.module.js +0 -23
  395. package/icons-animated/fesm2015/koalarx-ui-icons-animated.js +0 -121
  396. package/icons-animated/fesm2015/koalarx-ui-icons-animated.js.map +0 -1
  397. package/icons-animated/koalarx-ui-icons-animated.metadata.json +0 -1
  398. package/list/bundles/koalarx-ui-list.umd.js +0 -914
  399. package/list/bundles/koalarx-ui-list.umd.js.map +0 -1
  400. package/list/esm2015/lib/koala.list.module.js +0 -42
  401. package/list/esm2015/lib/koala.list.service.js +0 -13
  402. package/list/esm2015/lib/list-builder/list.builder.js +0 -101
  403. package/list/esm2015/lib/list.abstract.js +0 -174
  404. package/list/esm2015/lib/list.component.js +0 -166
  405. package/list/esm2015/lib/providers/pagination/pagination.provider.js +0 -30
  406. package/list/fesm2015/koalarx-ui-list.js +0 -514
  407. package/list/fesm2015/koalarx-ui-list.js.map +0 -1
  408. package/list/koalarx-ui-list.metadata.json +0 -1
  409. package/menu/bundles/koalarx-ui-menu.umd.js +0 -511
  410. package/menu/bundles/koalarx-ui-menu.umd.js.map +0 -1
  411. package/menu/esm2015/lib/koala.menu.module.js +0 -25
  412. package/menu/esm2015/lib/koala.menu.service.js +0 -22
  413. package/menu/esm2015/lib/menu.component.js +0 -104
  414. package/menu/fesm2015/koalarx-ui-menu.js +0 -153
  415. package/menu/fesm2015/koalarx-ui-menu.js.map +0 -1
  416. package/menu/koalarx-ui-menu.metadata.json +0 -1
  417. package/question/bundles/koalarx-ui-question.umd.js +0 -104
  418. package/question/bundles/koalarx-ui-question.umd.js.map +0 -1
  419. package/question/esm2015/lib/dialog-question.component.js +0 -20
  420. package/question/esm2015/lib/koala.question.module.js +0 -27
  421. package/question/esm2015/lib/koala.question.service.js +0 -28
  422. package/question/fesm2015/koalarx-ui-question.js +0 -77
  423. package/question/fesm2015/koalarx-ui-question.js.map +0 -1
  424. package/question/koalarx-ui-question.metadata.json +0 -1
  425. package/snackbar/bundles/koalarx-ui-snackbar.umd.js +0 -93
  426. package/snackbar/bundles/koalarx-ui-snackbar.umd.js.map +0 -1
  427. package/snackbar/esm2015/lib/koala.snackbar.component.js +0 -20
  428. package/snackbar/esm2015/lib/koala.snackbar.module.js +0 -26
  429. package/snackbar/esm2015/lib/koala.snackbar.service.js +0 -35
  430. package/snackbar/fesm2015/koalarx-ui-snackbar.js +0 -81
  431. package/snackbar/fesm2015/koalarx-ui-snackbar.js.map +0 -1
  432. package/snackbar/koalarx-ui-snackbar.metadata.json +0 -1
@@ -1,564 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { FormBuilder, Validators } from '@angular/forms';
3
- import { DynamicFormTypeFieldEnum } from './enums/dynamic-form-type-field.enum';
4
- import { CpfValidator } from './validators/cpf.validator';
5
- import { CnpjValidator } from './validators/cnpj.validator';
6
- import { ChangeDetectionStrategy, Component, Input, ViewChild } from '@angular/core';
7
- import { FormAbstract } from '../form.abstract';
8
- import { debounceTime } from 'rxjs/operators';
9
- import { BehaviorSubject } from 'rxjs';
10
- import { AutocompleteSelectedValidator } from './validators/autocomplete-selected.validator';
11
- import { KoalaDynamicFormService } from './koala.dynamic-form.service';
12
- import { delay } from "@koalarx/utils/operators/delay";
13
- import { koala } from "@koalarx/utils";
14
- import { DateMinValidator } from "./validators/date-min.validator";
15
- import { DateMaxValidator } from "./validators/date-max.validator";
16
- import { KoalaLanguageHelper } from "@koalarx/ui/core";
17
- export class DynamicFormComponent extends FormAbstract {
18
- constructor(fb, dynamicFormService) {
19
- super(() => this.form);
20
- this.fb = fb;
21
- this.dynamicFormService = dynamicFormService;
22
- this.tabIndexStart = 1;
23
- this.typeField = DynamicFormTypeFieldEnum;
24
- this.hoursAndMinutesMask = '00:000';
25
- this.errorMessage = KoalaLanguageHelper;
26
- }
27
- ngOnInit() {
28
- var _a;
29
- if (!this.form.get('formData')) {
30
- this.form.addControl('formData', this.fb.array([]));
31
- }
32
- this.controls = this.form.get('formData');
33
- (_a = this.formConfig) === null || _a === void 0 ? void 0 : _a.forEach((config, indexConfig) => {
34
- const newFormGroup = this.newControl(config);
35
- if (config.asyncValidators) {
36
- newFormGroup.get('value').setAsyncValidators(config.asyncValidators);
37
- }
38
- newFormGroup.get('value').updateValueAndValidity();
39
- if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
40
- const formGroupDynamicFormsSubject = newFormGroup.get('dynamicFormConfig').value;
41
- formGroupDynamicFormsSubject.subscribe(formGroupConfig => {
42
- if (formGroupConfig) {
43
- formGroupConfig.form.valueChanges.subscribe(() => {
44
- if (formGroupConfig.form.valid && (config.valueChanges || this.showFieldsMoreItensConfig)) {
45
- const value = this.dynamicFormService.emitData(formGroupConfig.form);
46
- newFormGroup.get('value').setValue(value);
47
- }
48
- });
49
- }
50
- });
51
- }
52
- if (config.valueChanges ||
53
- config.type === DynamicFormTypeFieldEnum.autocomplete ||
54
- config.type === DynamicFormTypeFieldEnum.dynamicForm ||
55
- this.showFieldsMoreItensConfig) {
56
- if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
57
- const autocompleteOptionsSubject = newFormGroup.get('autocompleteOptions').value;
58
- if (autocompleteOptionsSubject) {
59
- autocompleteOptionsSubject.subscribe(options => newFormGroup.get('autocompleteOptionsFiltered').value.next(options));
60
- }
61
- }
62
- newFormGroup.get('value')
63
- .valueChanges
64
- .pipe(debounceTime(300))
65
- .subscribe((value) => __awaiter(this, void 0, void 0, function* () {
66
- var _a, _b, _c, _d;
67
- yield this.setConfigDynamicForm(newFormGroup);
68
- if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
69
- if (value && (value.hasOwnProperty('value') &&
70
- value.hasOwnProperty('name') &&
71
- Object.keys(value).length === 2) || (Array.isArray(value) &&
72
- newFormGroup.get('multiple').value)) {
73
- if (newFormGroup.get('multiple').value) {
74
- if (Array.isArray(value)) {
75
- newFormGroup.get('autocompleteSelectedValue').setValue(value);
76
- newFormGroup.get('value').setValue(value[value.length - 1], { emitEvent: false });
77
- }
78
- else {
79
- if (this.validateAutocompleteSelect(newFormGroup.get('autocompleteSelectedValue').value, value)) {
80
- newFormGroup.get('autocompleteSelectedValue').value.push(value);
81
- }
82
- }
83
- if ((_a = this.autocompleteInput) === null || _a === void 0 ? void 0 : _a.nativeElement) {
84
- this.autocompleteInput.nativeElement.value = '';
85
- }
86
- }
87
- else {
88
- newFormGroup.get('autocompleteSelectedValue').setValue(value);
89
- }
90
- }
91
- else if (!newFormGroup.get('multiple').value) {
92
- newFormGroup.get('autocompleteSelectedValue').setValue((_c = (_b = koala(this.formConfig)
93
- .array()
94
- .filter(newFormGroup.get('name').value, 'name')
95
- .getValue()[0]) === null || _b === void 0 ? void 0 : _b.autocompleteDefaultValueOnClear) !== null && _c !== void 0 ? _c : null);
96
- }
97
- if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
98
- if (config.autocompleteType === 'all') {
99
- const autocompleteOptionsSubject = newFormGroup.get('autocompleteOptions').value;
100
- newFormGroup.get('autocompleteOptionsFiltered').value.next(this.autocompleteFilter(autocompleteOptionsSubject.value, value));
101
- }
102
- else if (config.autocompleteType === 'onDemand' && typeof value !== "object") {
103
- const loader = newFormGroup.get('autocompleteLoading').value;
104
- loader.next(true);
105
- config.autocompleteFilter(value).subscribe(options => {
106
- newFormGroup.get('autocompleteOptionsFiltered').value.next(options);
107
- loader.next(false);
108
- });
109
- }
110
- }
111
- }
112
- if (config.valueChanges) {
113
- if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
114
- config.valueChanges((newFormGroup.get('multiple').value ?
115
- newFormGroup.get('autocompleteSelectedValue').value.map(item => item.value) :
116
- (_d = newFormGroup.get('autocompleteSelectedValue').value) === null || _d === void 0 ? void 0 : _d.value));
117
- }
118
- else {
119
- config.valueChanges(value);
120
- }
121
- }
122
- }));
123
- }
124
- this.controls.push(newFormGroup);
125
- if (config.moreItemsConfig) {
126
- if (config.moreItemsMinItems > 0) {
127
- for (let min = 0; min < config.moreItemsMinItems; min++) {
128
- if (min <= config.moreItemsMaxItems) {
129
- this.addMoreItem(indexConfig);
130
- }
131
- }
132
- }
133
- if (config.moreItemsConfig.setValues) {
134
- config.moreItemsConfig
135
- .setValues
136
- .subscribe((values) => __awaiter(this, void 0, void 0, function* () {
137
- if (values.length > 0) {
138
- values.forEach((itemValue, indexValue) => {
139
- if (!this.controls.controls[indexConfig].get('moreItemsConfig').value[indexValue]) {
140
- this.addMoreItem(indexConfig);
141
- }
142
- setTimeout(() => {
143
- this.setValuesOnFields(itemValue, this.controls.controls[indexConfig].get('moreItemsConfig').value[indexValue].form);
144
- }, 300);
145
- });
146
- }
147
- }));
148
- }
149
- }
150
- });
151
- if (this.showFields) {
152
- this.changeVisibilityFields(this.showFields, this.form);
153
- }
154
- if (this.setValues) {
155
- this.setValuesOnFields(this.setValues, this.form);
156
- }
157
- }
158
- hoursAndMinutesApplyMask(index, event) {
159
- var _a;
160
- const control = (_a = this.controls) === null || _a === void 0 ? void 0 : _a.controls[index];
161
- const type = control === null || control === void 0 ? void 0 : control.get('type').value;
162
- if (type === DynamicFormTypeFieldEnum.hoursAndMinutes) {
163
- const value = control === null || control === void 0 ? void 0 : control.get('value').value;
164
- if (event.key == 'Backspace' && value.length < 6) {
165
- this.hoursAndMinutesMask = '00:000';
166
- }
167
- else if (event.key != 'Backspace' && value.length >= 6) {
168
- this.hoursAndMinutesMask = '000:00';
169
- }
170
- }
171
- }
172
- passwordView(index) {
173
- var _a;
174
- const control = (_a = this.controls) === null || _a === void 0 ? void 0 : _a.controls[index];
175
- const hidePassword = !(control === null || control === void 0 ? void 0 : control.get('hidePassword').value);
176
- control === null || control === void 0 ? void 0 : control.get('hidePassword').setValue(hidePassword);
177
- control === null || control === void 0 ? void 0 : control.get('type').setValue(hidePassword ?
178
- DynamicFormTypeFieldEnum.password :
179
- DynamicFormTypeFieldEnum.text);
180
- }
181
- addMoreItem(propIndex) {
182
- if (this.controls.controls[propIndex].get('moreItemsConfig').value.length < this.controls.controls[propIndex].get('moreItemsMaxItems').value) {
183
- const formGroup = this.fb.group({});
184
- this.controls.controls[propIndex].get('moreItemsConfig').value.push({
185
- form: formGroup,
186
- formConfig: this.formConfig[propIndex].moreItemsConfig.formConfig,
187
- showFields: new BehaviorSubject([]),
188
- showFieldsMoreItensConfig: this.formConfig[propIndex].moreItemsConfig.showFieldsConfig
189
- });
190
- this.controls.controls[propIndex].get('moreItemsExpanded').setValue(this.controls.controls[propIndex].get('moreItemsConfig').value.length - 1);
191
- const formArrayMoreItems = this.controls.controls[propIndex].get('moreItemsFormGroup');
192
- formArrayMoreItems.push(formGroup);
193
- }
194
- }
195
- removeMoreItem(propIndex, removeIndex) {
196
- const expandedItemIndex = removeIndex - 1;
197
- this.controls.controls[propIndex].get('moreItemsConfig').value.splice(removeIndex, 1);
198
- setTimeout(() => {
199
- this.controls.controls[propIndex].get('moreItemsExpanded').setValue((expandedItemIndex < 0) ? 0 : expandedItemIndex);
200
- }, 50);
201
- }
202
- clearAutocomplete(propIndex) {
203
- var _a, _b;
204
- if (this.controls.controls[propIndex].get('multiple').value) {
205
- this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue([]);
206
- this.controls.controls[propIndex].get('value').setValue(null);
207
- }
208
- else {
209
- this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue((_a = this.formConfig[propIndex].autocompleteDefaultValueOnClear) !== null && _a !== void 0 ? _a : null);
210
- this.controls.controls[propIndex].get('value').setValue((_b = this.formConfig[propIndex].autocompleteDefaultValueOnClear) !== null && _b !== void 0 ? _b : null);
211
- }
212
- }
213
- display(option) {
214
- return option ? option.name : undefined;
215
- }
216
- removeOptionOnAutocomplete(propIndex, option) {
217
- const value = this.controls.controls[propIndex].get('autocompleteSelectedValue').value.filter(item => item !== option);
218
- this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue(value);
219
- if (value.length === 0) {
220
- this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue([]);
221
- this.controls.controls[propIndex].get('value').setValue(null);
222
- }
223
- else if (this.formConfig[propIndex].valueChanges) {
224
- this.formConfig[propIndex].valueChanges(value.map(item => item.value));
225
- }
226
- }
227
- getColorChip(config) {
228
- return config.color;
229
- }
230
- newControl(config) {
231
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4;
232
- let validators = (_a = config.syncValidators) !== null && _a !== void 0 ? _a : [];
233
- let value = (_b = config.value) !== null && _b !== void 0 ? _b : '';
234
- let valueSelectedAutocomplete = (config.multiple ? [] : ((_c = config.autocompleteDefaultValueOnClear) !== null && _c !== void 0 ? _c : null));
235
- if (config.required === true)
236
- validators.push(Validators.required);
237
- if (config.min && typeof config.min === "number")
238
- validators.push(Validators.min(config.min));
239
- if (config.max && typeof config.max === "number")
240
- validators.push(Validators.max(config.max));
241
- if (config.type === DynamicFormTypeFieldEnum.date ||
242
- config.type === DynamicFormTypeFieldEnum.datetime ||
243
- config.type === DynamicFormTypeFieldEnum.time) {
244
- if (config.min && typeof config.min === "string") {
245
- validators.push(DateMinValidator(config.min));
246
- }
247
- if (config.max && typeof config.max === "string") {
248
- validators.push(DateMaxValidator(config.max));
249
- }
250
- }
251
- if (config.minLength)
252
- validators.push(Validators.minLength(config.minLength));
253
- if (config.maxLength)
254
- validators.push(Validators.maxLength(config.maxLength));
255
- if (config.type === DynamicFormTypeFieldEnum.cpf) {
256
- validators.push(CpfValidator);
257
- }
258
- else if (config.type === DynamicFormTypeFieldEnum.cnpj) {
259
- validators.push(CnpjValidator);
260
- }
261
- else if (config.type === DynamicFormTypeFieldEnum.email) {
262
- validators.push(Validators.email);
263
- }
264
- else if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
265
- if (value) {
266
- valueSelectedAutocomplete = value;
267
- value = (config.multiple ? valueSelectedAutocomplete[0] : value);
268
- }
269
- if (config.required === true) {
270
- validators.push(AutocompleteSelectedValidator);
271
- }
272
- }
273
- else if (config.type === DynamicFormTypeFieldEnum.checkbox) {
274
- value = (_d = config.value) !== null && _d !== void 0 ? _d : false;
275
- }
276
- if (config.type === DynamicFormTypeFieldEnum.hoursAndMinutes &&
277
- value.length >= 6) {
278
- this.hoursAndMinutesMask = '000:00';
279
- }
280
- if (config.dynamicFormConfig) {
281
- const cloneDynamicFormConfig = {};
282
- Object.assign(cloneDynamicFormConfig, config.dynamicFormConfig);
283
- cloneDynamicFormConfig.form = config.dynamicFormConfig.form;
284
- config.dynamicFormConfig = cloneDynamicFormConfig;
285
- }
286
- if (config.show === false) {
287
- validators = [];
288
- }
289
- const field = this.fb.group({
290
- show: [new BehaviorSubject((_e = config.show) !== null && _e !== void 0 ? _e : true)],
291
- label: [config.label],
292
- name: [config.name],
293
- type: [config.type],
294
- fileButtonConfig: [{
295
- icon: (_g = (_f = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _f === void 0 ? void 0 : _f.icon) !== null && _g !== void 0 ? _g : 'attach_file',
296
- text: (_j = (_h = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _h === void 0 ? void 0 : _h.text) !== null && _j !== void 0 ? _j : 'Clique para anexar arquivos',
297
- backgroundColor: (_l = (_k = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _k === void 0 ? void 0 : _k.backgroundColor) !== null && _l !== void 0 ? _l : 'white',
298
- color: (_o = (_m = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _m === void 0 ? void 0 : _m.color) !== null && _o !== void 0 ? _o : 'blue',
299
- accept: (_q = (_p = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _p === void 0 ? void 0 : _p.accept) !== null && _q !== void 0 ? _q : '*'
300
- }],
301
- dynamicFormConfig: [new BehaviorSubject(config.dynamicFormConfig)],
302
- dynamicFormGroup: this.fb.array([]),
303
- appearance: [config.appearance],
304
- floatLabel: [config.floatLabel],
305
- placeholder: [config.placeholder],
306
- class: [config.class],
307
- fieldClass: [config.fieldClass],
308
- textHint: [config.textHint],
309
- required: [(_r = config.required) !== null && _r !== void 0 ? _r : false],
310
- min: [(_s = config.min) !== null && _s !== void 0 ? _s : 0],
311
- max: [(_t = config.max) !== null && _t !== void 0 ? _t : 99999999999],
312
- minLength: [(_u = config.minLength) !== null && _u !== void 0 ? _u : 0],
313
- maxLength: [(_v = config.maxLength) !== null && _v !== void 0 ? _v : 255],
314
- disabled: [(_w = config.disabled) !== null && _w !== void 0 ? _w : false],
315
- focus: [(_x = config.focus) !== null && _x !== void 0 ? _x : false],
316
- multiple: [(_y = config.multiple) !== null && _y !== void 0 ? _y : false],
317
- opcoesSelect: [(_z = config.opcoesSelect) !== null && _z !== void 0 ? _z : []],
318
- hidePassword: config.type === DynamicFormTypeFieldEnum.password ? true : null,
319
- moreItemsButtonIconAddlabel: [config.moreItemsButtonIconAddlabel],
320
- moreItemsMinItems: [(_0 = config.moreItemsMinItems) !== null && _0 !== void 0 ? _0 : 0],
321
- moreItemsMaxItems: [(_1 = config.moreItemsMaxItems) !== null && _1 !== void 0 ? _1 : 100],
322
- moreItemsIcon: [config.moreItemsIcon],
323
- moreItemsIconFontColor: [config.moreItemsIconFontColor],
324
- moreItemsIconBackgroundColor: [config.moreItemsIconBackgroundColor],
325
- moreItemsExpanded: [''],
326
- moreItemsConfig: [[]],
327
- moreItemsFormGroup: this.fb.array([]),
328
- autocompleteLoading: [new BehaviorSubject(false)],
329
- autocompleteOptions: [config.autocompleteOptions],
330
- autocompleteMultipleConfig: [config.autocompleteMultipleConfig],
331
- autocompleteOptionsFiltered: [new BehaviorSubject([])],
332
- autocompleteSelectedValue: [valueSelectedAutocomplete],
333
- textLogs: [config === null || config === void 0 ? void 0 : config.textObs],
334
- customMasc: [config === null || config === void 0 ? void 0 : config.customMasc],
335
- customMascThousandSeparator: [(_2 = config === null || config === void 0 ? void 0 : config.customMascThousandSeparator) !== null && _2 !== void 0 ? _2 : ''],
336
- customMascSuffix: [(_3 = config === null || config === void 0 ? void 0 : config.customMascSuffix) !== null && _3 !== void 0 ? _3 : ''],
337
- customMascPrefix: [(_4 = config === null || config === void 0 ? void 0 : config.customMascPrefix) !== null && _4 !== void 0 ? _4 : ''],
338
- value: [{ value, disabled: config.disabled }, validators, config.asyncValidators]
339
- });
340
- if (config.autocompleteType === "onDemand") {
341
- const loader = field.get('autocompleteLoading').value;
342
- loader.next(true);
343
- config.autocompleteFilter('').subscribe(options => {
344
- field.get('autocompleteOptionsFiltered').value.next(options);
345
- loader.next(false);
346
- });
347
- }
348
- return field;
349
- }
350
- setValuesOnFields(subject, form) {
351
- subject.subscribe(item => {
352
- if (item) {
353
- const formArray = form.get('formData');
354
- for (const prop of item.values()) {
355
- this.setValueByProp(formArray, prop);
356
- }
357
- }
358
- });
359
- }
360
- changeVisibilityFields(subject, form) {
361
- subject.pipe(debounceTime(5)).subscribe(item => {
362
- var _a, _b, _c;
363
- if (item) {
364
- const formArray = form.get('formData');
365
- for (const prop of item.values()) {
366
- for (const [indexControl, control] of formArray.controls.entries()) {
367
- if (control.get('name').value === prop.name) {
368
- control.get('show').value.next(prop.show);
369
- const config = (_a = this.formConfig[indexControl]) !== null && _a !== void 0 ? _a : null;
370
- if (prop.show) {
371
- let validators = [];
372
- if (config) {
373
- if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
374
- const formArrayMoreItems = control.get('dynamicFormGroup');
375
- formArrayMoreItems.push((_b = config === null || config === void 0 ? void 0 : config.dynamicFormConfig) === null || _b === void 0 ? void 0 : _b.form);
376
- }
377
- else {
378
- validators = (_c = config.syncValidators) !== null && _c !== void 0 ? _c : [];
379
- if (config.required === true) {
380
- validators.push(Validators.required);
381
- }
382
- if (config.type === DynamicFormTypeFieldEnum.cpf) {
383
- validators.push(CpfValidator);
384
- }
385
- else if (config.type === DynamicFormTypeFieldEnum.cnpj) {
386
- validators.push(CnpjValidator);
387
- }
388
- else if (config.type === DynamicFormTypeFieldEnum.email) {
389
- validators.push(Validators.email);
390
- }
391
- else if (config.required === true &&
392
- config.type === DynamicFormTypeFieldEnum.autocomplete) {
393
- validators.push(AutocompleteSelectedValidator);
394
- }
395
- if (config.min && typeof config.min === "number")
396
- validators.push(Validators.min(config.min));
397
- if (config.max && typeof config.max === "number")
398
- validators.push(Validators.max(config.max));
399
- if (config.type === DynamicFormTypeFieldEnum.date ||
400
- config.type === DynamicFormTypeFieldEnum.datetime ||
401
- config.type === DynamicFormTypeFieldEnum.time) {
402
- if (config.min && typeof config.min === "string") {
403
- validators.push(DateMinValidator(config.min));
404
- }
405
- if (config.max && typeof config.max === "string") {
406
- validators.push(DateMaxValidator(config.max));
407
- }
408
- }
409
- if (config.minLength)
410
- validators.push(Validators.minLength(config.minLength));
411
- if (config.maxLength)
412
- validators.push(Validators.maxLength(config.maxLength));
413
- control.get('value').setValidators(validators);
414
- if (config.asyncValidators) {
415
- control.get('value').setAsyncValidators(config.asyncValidators);
416
- }
417
- }
418
- control.get('value').updateValueAndValidity();
419
- if (prop.clearCurrentValue) {
420
- control.get('value').setValue(null);
421
- }
422
- }
423
- }
424
- else {
425
- control.get('value').clearValidators();
426
- control.get('value').clearAsyncValidators();
427
- control.setErrors(null);
428
- control.get('value').setValue(null);
429
- control.get('value').updateValueAndValidity();
430
- if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
431
- const formGroup = control;
432
- formGroup.removeControl('dynamicFormGroup');
433
- formGroup.addControl('dynamicFormGroup', this.fb.array([]));
434
- }
435
- }
436
- break;
437
- }
438
- }
439
- }
440
- }
441
- });
442
- }
443
- autocompleteFilter(arr, value) {
444
- return arr.filter(filter => {
445
- if (typeof value === 'string') {
446
- if (filter) {
447
- let find = true;
448
- value.toLowerCase()
449
- .split(' ')
450
- .forEach(part => {
451
- if (filter.name.toLowerCase().indexOf(part) < 0) {
452
- find = false;
453
- return false;
454
- }
455
- });
456
- return find;
457
- }
458
- }
459
- else {
460
- return true;
461
- }
462
- });
463
- }
464
- setValueByProp(formArray, prop) {
465
- if (formArray) {
466
- if (prop.name.indexOf(' > ') >= 0) {
467
- let dynamicFormSubject;
468
- const arrPropName = prop.name.split(' > ');
469
- let indexPropName = 0;
470
- do {
471
- const control = formArray.controls.find(control => control.get('name').value === arrPropName[indexPropName]);
472
- if (indexPropName === arrPropName.length - 2) {
473
- dynamicFormSubject = control.get('dynamicFormConfig').value;
474
- const dynamicForm = dynamicFormSubject.getValue();
475
- if (dynamicForm.formConfig.find(fc => fc.name === arrPropName[arrPropName.length - 1])) {
476
- if (dynamicForm.setValues) {
477
- dynamicForm.setValues.next(koala(dynamicForm.setValues.getValue()).array().merge([{
478
- name: arrPropName[arrPropName.length - 1],
479
- value: prop.value
480
- }]).getValue());
481
- }
482
- else {
483
- dynamicForm.setValues = new BehaviorSubject([{
484
- name: arrPropName[arrPropName.length - 1],
485
- value: prop.value
486
- }]);
487
- }
488
- }
489
- }
490
- indexPropName++;
491
- } while (indexPropName < arrPropName.length - 1);
492
- }
493
- else {
494
- for (const control of formArray.controls.values()) {
495
- if (control.get('name').value === prop.name) {
496
- control.get('value').setValue(prop.value);
497
- break;
498
- }
499
- }
500
- }
501
- }
502
- }
503
- setConfigDynamicForm(newFormGroup) {
504
- return __awaiter(this, void 0, void 0, function* () {
505
- if (this.showFieldsMoreItensConfig) {
506
- const value = newFormGroup.get('value').value;
507
- const configs = this.showFieldsMoreItensConfig
508
- .filter(config => config.nameField === newFormGroup.get('name').value)
509
- .sort(config => {
510
- if (config.fnShow(value)) {
511
- return 1;
512
- }
513
- return -1;
514
- });
515
- for (const config of configs) {
516
- if (config) {
517
- if (config.dynamicFormConfig && config.fnShow(value)) {
518
- const controlDynamicFormConfig = this.controls
519
- .controls
520
- .find(control => config.fieldsToShow.indexOf(control.get('name').value) >= 0);
521
- const dynamicFormConfigSubject = controlDynamicFormConfig.get('dynamicFormConfig').value;
522
- dynamicFormConfigSubject.next(null);
523
- yield delay(1);
524
- dynamicFormConfigSubject.next(config.dynamicFormConfig(value));
525
- }
526
- this.dynamicFormService.showFields(this.showFields, config.fieldsToShow, config.fnShow(value), config.clearCurrentValue);
527
- }
528
- }
529
- }
530
- });
531
- }
532
- validateAutocompleteSelect(selectedValues, value) {
533
- let isValid = true;
534
- for (const selectedItem of selectedValues.values()) {
535
- if (selectedItem.name === value.name) {
536
- isValid = false;
537
- break;
538
- }
539
- }
540
- return isValid;
541
- }
542
- }
543
- DynamicFormComponent.decorators = [
544
- { type: Component, args: [{
545
- selector: 'koala-dynamic-form',
546
- template: "<div [formGroup]=\"form\" class=\"p-relative w-100\">\n <div *ngFor=\"let propriedade of controls?.controls; let i = index;\"\n [ngClass]=\"(propriedade.get('show').value | async) ? propriedade.get('class').value : 'd-none'\"\n formArrayName=\"formData\">\n\t <div *ngIf=\"propriedade.get('show').value | async\">\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.text ||\n\t propriedade.get('type').value == typeField.password ||\n\t propriedade.get('type').value == typeField.cpf ||\n\t propriedade.get('type').value == typeField.cnpj ||\n\t propriedade.get('type').value == typeField.datetime ||\n\t propriedade.get('type').value == typeField.email ||\n\t propriedade.get('type').value == typeField.number ||\n\t propriedade.get('type').value == typeField.stringNumber ||\n\t propriedade.get('type').value == typeField.time ||\n\t propriedade.get('type').value == typeField.date ||\n\t propriedade.get('type').value == typeField.hoursAndMinutes ||\n\t propriedade.get('type').value == typeField.phone ||\n\t propriedade.get('type').value == typeField.percent ||\n\t propriedade.get('type').value == typeField.color ||\n\t propriedade.get('type').value == typeField.month ||\n\t propriedade.get('type').value == typeField.competenceDate ||\n propriedade.get('type').value == typeField.stringWithCustomMasc\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [dropSpecialCharacters]=\"false\"\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t (keyup)=\"hoursAndMinutesApplyMask(i, $event)\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [tabIndex]=\"tabIndexStart + i\"\n\t\t [mask]=\"((propriedade.get('type').value == typeField.competenceDate) ? '00/0000' : null) ||\n\t\t ((propriedade.get('type').value == typeField.phone) ? '(00)0000-0000?0' : null) ||\n\t\t ((propriedade.get('type').value == typeField.stringNumber) ? '0{'+propriedade.get('maxLength').value+'}' : null) ||\n ((propriedade.get('type').value == typeField.cpf) ? '000.000.000-00' : null) ||\n ((propriedade.get('type').value == typeField.cnpj) ? '00.000.000/0000-00' : null) ||\n ((propriedade.get('type').value == typeField.percent) ? 'percent' : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.hoursAndMinutes) ? hoursAndMinutesMask : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.stringWithCustomMasc) ? propriedade.get('customMasc').value : null)\"\n\t\t [validation]=\"\n\t (propriedade.get('type').value == typeField.cpf && propriedade.get('value').errors?.cpfInvalid) ||\n\t (propriedade.get('type').value == typeField.cnpj && propriedade.get('value').errors?.cnpjInvalid)\"\n\t\t [type]=\"((propriedade.get('type').value == typeField.cpf ||\n propriedade.get('type').value == typeField.cnpj ||\n propriedade.get('type').value == typeField.phone ||\n propriedade.get('type').value == typeField.percent\n )) ? 'tel' : (\n propriedade.get('type').value == typeField.month ?\n 'month' : (\n propriedade.get('type').value == typeField.date ?\n 'date' : (\n propriedade.get('type').value == typeField.datetime ?\n 'datetime-local' : (\n propriedade.get('type').value == typeField.email ?\n 'email' : (\n propriedade.get('type').value == typeField.number ?\n 'number' : (\n propriedade.get('type').value == typeField.time ?\n 'time' : (\n propriedade.get('type').value == typeField.password ?\n 'password' : (\n propriedade.get('type').value == typeField.color ?\n 'color' : 'text'))))))))\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [thousandSeparator]=\"propriedade.get('customMascThousandSeparator').value\"\n [suffix]=\"propriedade.get('customMascSuffix').value\"\n [prefix]=\"propriedade.get('customMascPrefix').value\"\n separatorLimit=\"0\"\n autocomplete=\"off\"\n\t\t formControlName=\"value\"\n\t\t matInput/>\n\t <button\n\t\t (click)=\"passwordView(i)\"\n\t\t *ngIf=\"propriedade.get('hidePassword').value !== null\"\n\t\t [attr.aria-label]=\"'Hide password'\"\n\t\t [attr.aria-pressed]=\"propriedade.get('hidePassword').value\"\n\t\t mat-icon-button matSuffix tabindex=\"-1\" type=\"button\">\n\t <mat-icon>{{propriedade.get('hidePassword').value ? 'visibility_off' : 'visibility'}}</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cpfInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cnpjInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.email\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMin\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMinMessage()}}\n {{propriedade.get('min').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMax\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMaxMessage()}}\n {{propriedade.get('max').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.coin\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n autocomplete=\"off\"\n\t\t currencyMask\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"tel\"/>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n *ngIf=\"propriedade.get('type').value == typeField.float\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <input\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n autocomplete=\"off\"\n currencyMask\n [options]=\"{prefix: ''}\"\n formControlName=\"value\"\n matInput\n type=\"tel\"/>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.valueList ||\n\t propriedade.get('type').value == typeField.textarea\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [mat-autosize]=\"true\"\n\t\t [matAutosizeMaxRows]=\"8\"\n\t\t [matAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.textLogs\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <div [innerHTML]=\"propriedade.get('textLogs').value\" class=\"text-obs\"></div>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [mat-autosize]=\"true\"\n\t\t [matAutosizeMaxRows]=\"8\"\n\t\t [matAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n\t </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.select\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <mat-select [multiple]=\"propriedade.get('multiple').value\" [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\" formControlName=\"value\">\n\t <mat-option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n\t {{options.name}}\n\t </mat-option>\n\t </mat-select>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n class=\"select-multiple-native\"\n *ngIf=\"propriedade.get('type').value == typeField.selectMultipleNative\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <select\n matNativeControl\n formControlName=\"value\"\n multiple\n [tabIndex]=\"tabIndexStart + i\"\n [required]=\"propriedade.get('required').value\">\n <option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n {{options.name}}\n </option>\n </select>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <div\n\t\t *ngIf=\"propriedade.get('type').value == typeField.checkbox\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-checkbox\n [tabIndex]=\"tabIndexStart + i\"\n\t\t formControlName=\"value\"\n\t\t value=\"true\">\n\t {{propriedade.get('label').value}}\n\t </mat-checkbox>\n\t </div>\n\t\t <div\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.moreItems\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\"\n\t\t\t class=\"more-items-content\">\n\t\t\t <fieldset>\n\t\t\t\t <legend>\n\t\t\t\t\t <koala-button\n\t\t\t\t\t\t (click)=\"addMoreItem(i)\"\n\t\t\t\t\t\t [disabled]=\"propriedade.get('moreItemsConfig').value.length === propriedade.get('moreItemsMaxItems').value\"\n\t\t\t\t\t\t [tooltip]=\"propriedade.get('moreItemsButtonIconAddlabel').value\"\n\t\t\t\t\t\t [backgroundColor]=\"propriedade.get('moreItemsIconBackgroundColor').value\"\n [color]=\"propriedade.get('moreItemsIconFontColor').value\"\n\t\t\t\t\t\t class=\"btn-add-more-items\"\n\t\t\t\t\t\t icon=\"add\">\n\t\t\t\t\t </koala-button>\n\t\t\t\t\t {{propriedade.get('label').value}} (Min.: {{propriedade.get('moreItemsMinItems').value}}\n\t\t\t\t\t | M\u00E1x.: {{propriedade.get('moreItemsMaxItems').value}})\n\t\t\t\t </legend>\n\t\t\t\t <mat-accordion class=\"items\" multi>\n\t\t\t\t\t <mat-expansion-panel\n\t\t\t\t\t\t *ngFor=\"let item of propriedade.get('moreItemsConfig').value.slice().reverse(); index as indexMoreItems\"\n\t\t\t\t\t\t expanded>\n\t\t\t\t\t\t <mat-expansion-panel-header>\n\t\t\t\t\t\t\t\t<mat-panel-title class=\"titleForm\">#\n\t\t\t\t\t\t\t\t\t{{propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems + 1}}</mat-panel-title>\n\t\t\t\t\t\t\t\t<mat-panel-description class=\"titleForm\">\n\t\t\t\t\t\t\t\t\t{{propriedade.get('label').value}}\n\t\t\t\t\t\t\t\t\t<mat-icon>{{propriedade.get('moreItemsIcon').value}}</mat-icon>\n\t\t\t\t\t\t\t\t</mat-panel-description>\n\t\t\t\t\t\t\t</mat-expansion-panel-header>\n\t\t\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t\t\t [showFieldsMoreItensConfig]=\"item.showFieldsMoreItensConfig\"\n\t\t\t\t\t\t\t [showFields]=\"item.showFields\"\n\t\t\t\t\t\t\t [formConfig]=\"item.formConfig\"\n\t\t\t\t\t\t\t [form]=\"item.form\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t\t\t </koala-dynamic-form>\n\t\t\t\t\t <mat-action-row\n\t\t\t\t\t\t *ngIf=\"propriedade.get('moreItemsConfig').value.length > propriedade.get('moreItemsMinItems').value\">\n\t\t\t\t\t <button\n\t\t\t\t\t\t (click)=\"removeMoreItem(i, propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems)\"\n\t\t\t\t\t\t mat-icon-button>\n\t\t\t\t\t\t <mat-icon>delete</mat-icon>\n\t\t\t\t\t </button>\n\t\t\t\t\t </mat-action-row>\n\t\t\t\t\t </mat-expansion-panel>\n\t\t\t\t </mat-accordion>\n\t\t\t </fieldset>\n\t\t </div>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.autocomplete\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}} {{propriedade.get('multiple').value &&\n\t propriedade.get('required').value ? '*' : ''}}</mat-label>\n\t\t\t <div *ngIf=\"propriedade.get('multiple').value else single\">\n\t <mat-chip-list #chipList>\n\t <mat-chip\n\t\t (removed)=\"removeOptionOnAutocomplete(i, option)\"\n\t\t *ngFor=\"let option of propriedade.get('autocompleteSelectedValue').value\"\n\t\t [color]=\"getColorChip(propriedade.get('autocompleteMultipleConfig').value | async)\"\n\t\t [removable]=\"true\"\n\t\t [selectable]=\"true\">\n\t {{display(option)}}\n\t\t <mat-icon matChipRemove>cancel</mat-icon>\n\t </mat-chip>\n\t <input\n\t\t #autocompleteInput\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [matAutocomplete]=\"auto\"\n\t\t [matChipInputFor]=\"chipList\"\n [tabIndex]=\"tabIndexStart + i\"\n autocomplete=\"off\"\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"text\"\n\t\t placeholder=\"Selecione um ou mais op\u00E7\u00F5es...\">\n\t </mat-chip-list>\n\t </div>\n\t <ng-template #single>\n\t\t <input\n\t\t\t [matAutocomplete]=\"auto\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n autocomplete=\"off\"\n\t\t\t formControlName=\"value\"\n\t\t\t matInput\n\t\t\t placeholder=\"Selecione uma op\u00E7\u00E3o...\"\n\t\t\t type=\"text\">\n\t </ng-template>\n\t <mat-spinner *ngIf=\"propriedade.get('autocompleteLoading').value | async\" color=\"primary\"\n\t matSuffix></mat-spinner>\n\t <button\n\t\t (click)=\"clearAutocomplete(i)\"\n\t\t *ngIf=\"\n\t !(propriedade.get('autocompleteLoading').value | async) &&\n\t !propriedade.get('disabled').value\"\n\t\t color=\"warn\"\n\t\t mat-icon-button\n\t\t matSuffix\n\t\t type=\"button\">\n\t <mat-icon>close</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required || propriedade.get('value').errors?.autocompleteSelected\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getAutocompleteMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t <mat-autocomplete\n\t\t #auto=\"matAutocomplete\"\n\t\t [displayWith]=\"display\" autoActiveFirstOption>\n\t\t <div *ngIf=\"(propriedade.get('autocompleteOptionsFiltered').value | async) as options\">\n\t\t <mat-option *ngFor=\"let option of options\" [value]=\"option\">\n\t\t {{option.name}}\n\t\t </mat-option>\n\t\t </div>\n\t </mat-autocomplete>\n\t </mat-form-field>\n\t\t <div *ngIf=\"propriedade.get('type').value == typeField.file\">\n\t\t\t <koala-file-button\n\t\t\t\t (getFiles)=\"propriedade.get('value').setValue($event)\"\n\t\t\t\t [accept]=\"propriedade.get('fileButtonConfig').value.accept\"\n\t\t\t\t [backgroundColor]=\"propriedade.get('fileButtonConfig').value.backgroundColor\"\n\t\t\t\t [color]=\"propriedade.get('fileButtonConfig').value.color\"\n\t\t\t\t [disabled]=\"propriedade.get('disabled').value\"\n\t\t\t\t [icon]=\"propriedade.get('fileButtonConfig').value.icon\"\n\t\t\t\t [multiple]=\"propriedade.get('multiple').value\"\n\t\t\t\t [text]=\"propriedade.get('fileButtonConfig').value.text\">\n\t\t\t </koala-file-button>\n\t\t </div>\n\t\t <div *ngIf=\"\n\t\t propriedade.get('type').value == typeField.dynamicForm &&\n\t\t\t\t(propriedade.get('dynamicFormConfig').value | async) as dynamicFormConfig\">\n\t\t\t <fieldset *ngIf=\"propriedade.get('label').value else dynamicFormWithoutLabel\">\n\t\t\t\t <legend>{{propriedade.get('label').value}}</legend>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </fieldset>\n\t\t\t <ng-template #dynamicFormWithoutLabel>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </ng-template>\n\t\t </div>\n <div\n class=\"radio-btn-group\"\n *ngIf=\"propriedade.get('type').value == typeField.radio\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-radio-group formControlName=\"value\">\n <label *ngIf=\"propriedade.get('label').value\">{{propriedade.get('label').value}}</label>\n <mat-radio-button\n [tabIndex]=\"tabIndexStart + i\"\n *ngFor=\"let options of propriedade.get('opcoesSelect').value\"\n [value]=\"options.value\">\n {{options.name}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\t </div>\n </div>\n <ng-content select=\"[btn-submit]\"></ng-content>\n</div>\n",
547
- changeDetection: ChangeDetectionStrategy.OnPush,
548
- styles: [".more-items-content fieldset{border:1px solid #cccccc;padding:16px}.more-items-content fieldset legend{font-family:\"Josefin Sans\",sans-serif;font-size:11px;font-weight:bold;padding:0 8px}.more-items-content .items .titleForm{color:#616161}.more-items-content .items .mat-expansion-panel-header-title,.more-items-content .items .mat-expansion-panel-header-description{flex-basis:0}.more-items-content .items .mat-expansion-panel-header-description{align-items:center;justify-content:space-between}.more-items-content .items .mat-form-field+.mat-form-field{margin-left:8px}.radio-btn-group label{position:relative;display:block;padding:10px 0}.text-obs{background:#eeeeee;border-radius:5px;color:#212121;font-family:OpenSansLight,sans-serif;height:150px;margin:0 auto 10px;overflow-y:auto;padding:10px;position:relative;width:calc(100% - 27px)}.select-multiple-native{margin-bottom:15px}.select-multiple-native select{width:100%;height:150px;background:transparent;border:none}.select-multiple-native select:focus,.select-multiple-native select:active{outline:none}.select-multiple-native select option{padding:5px 10px;font-family:JosefinSans,sans-serif}.select-multiple-native select option:checked{background:#f1f1f1!important}\n"]
549
- },] }
550
- ];
551
- DynamicFormComponent.ctorParameters = () => [
552
- { type: FormBuilder },
553
- { type: KoalaDynamicFormService }
554
- ];
555
- DynamicFormComponent.propDecorators = {
556
- form: [{ type: Input }],
557
- formConfig: [{ type: Input }],
558
- showFields: [{ type: Input }],
559
- showFieldsMoreItensConfig: [{ type: Input }],
560
- setValues: [{ type: Input }],
561
- tabIndexStart: [{ type: Input }],
562
- autocompleteInput: [{ type: ViewChild, args: ['autocompleteInput',] }]
563
- };
564
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFhLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFHN0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLdkUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVF2RCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsWUFBWTtJQWNwRCxZQUNVLEVBQWUsRUFDZixrQkFBMkM7UUFFbkQsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUhmLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXlCO1FBVjVDLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBRTVCLGNBQVMsR0FBRyx3QkFBd0IsQ0FBQztRQUNyQyx3QkFBbUIsR0FBRyxRQUFRLENBQUM7UUFDL0IsaUJBQVksR0FBRyxtQkFBbUIsQ0FBQztJQVMxQyxDQUFDO0lBRUQsUUFBUTs7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDckQ7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBYyxDQUFDO1FBQ3ZELE1BQUEsSUFBSSxDQUFDLFVBQVUsMENBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFO1lBQy9DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFO2dCQUMxQixZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUN0RTtZQUNELFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNuRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsV0FBVyxFQUFFO2dCQUN4RCxNQUFNLDRCQUE0QixHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxLQUF5RCxDQUFDO2dCQUNySSw0QkFBNEIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEVBQUU7b0JBQ3ZELElBQUksZUFBZSxFQUFFO3dCQUNuQixlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFOzRCQUMvQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsRUFBRTtnQ0FDekYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQ3JFLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDOzZCQUMzQzt3QkFDSCxDQUFDLENBQUMsQ0FBQztxQkFDSjtnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFDRSxNQUFNLENBQUMsWUFBWTtnQkFDbkIsTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxZQUFZO2dCQUNyRCxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFdBQVc7Z0JBQ3BELElBQUksQ0FBQyx5QkFBeUIsRUFDOUI7Z0JBQ0EsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFlBQVksRUFBRTtvQkFDekQsTUFBTSwwQkFBMEIsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBb0UsQ0FBQztvQkFDaEosSUFBSSwwQkFBMEIsRUFBRTt3QkFDOUIsMEJBQTBCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztxQkFDdEg7aUJBQ0Y7Z0JBQ0QsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7cUJBQ1osWUFBWTtxQkFDWixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUN2QixTQUFTLENBQUMsQ0FBTSxLQUFLLEVBQUMsRUFBRTs7b0JBQ3ZCLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUM5QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsWUFBWSxFQUFFO3dCQUN6RCxJQUNFLEtBQUssSUFBSSxDQUNQLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDOzRCQUM3QixLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQzs0QkFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUNoQyxJQUFJLENBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7NEJBQ3BCLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUNuQyxFQUFFOzRCQUNILElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0NBQ3RDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtvQ0FDeEIsWUFBWSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQ0FDOUQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztpQ0FDakY7cUNBQU07b0NBQ0wsSUFBSSxJQUFJLENBQUMsMEJBQTBCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTt3Q0FDL0YsWUFBWSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7cUNBQ2pFO2lDQUNGO2dDQUNELElBQUksTUFBQSxJQUFJLENBQUMsaUJBQWlCLDBDQUFFLGFBQWEsRUFBRTtvQ0FDekMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO2lDQUNqRDs2QkFDRjtpQ0FBTTtnQ0FDTCxZQUFZLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDOzZCQUMvRDt5QkFDRjs2QkFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUU7NEJBQzlDLFlBQVksQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBQSxNQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2lDQUMxRSxLQUFLLEVBQWtDO2lDQUN2QyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO2lDQUM5QyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsMENBQUUsK0JBQStCLG1DQUFJLElBQUksQ0FBQyxDQUFDO3lCQUM1RDt3QkFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsWUFBWSxFQUFFOzRCQUN6RCxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLLEVBQUU7Z0NBQ3JDLE1BQU0sMEJBQTBCLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEtBQW9FLENBQUM7Z0NBQ2hKLFlBQVksQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FDaEYsMEJBQTBCLENBQUMsS0FBSyxFQUNoQyxLQUFLLENBQ04sQ0FBQyxDQUFDOzZCQUNKO2lDQUFNLElBQUksTUFBTSxDQUFDLGdCQUFnQixLQUFLLFVBQVUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0NBQzlFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFpQyxDQUFDO2dDQUN6RixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUNsQixNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29DQUNuRCxZQUFZLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQ0FDcEUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDckIsQ0FBQyxDQUFDLENBQUM7NkJBQ0o7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO3dCQUN2QixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsWUFBWSxFQUFFOzRCQUN6RCxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDcEMsWUFBWSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQ0FDN0UsTUFBQSxZQUFZLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUMsS0FBSywwQ0FBRSxLQUFLLENBQzlFLENBQUMsQ0FBQzt5QkFDSjs2QkFBTTs0QkFDTCxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUM1QjtxQkFDRjtnQkFDSCxDQUFDLENBQUEsQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDakMsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFO2dCQUMxQixJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEVBQUU7b0JBQ2hDLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0JBQ3ZELElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTs0QkFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQzt5QkFDL0I7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRTtvQkFDcEMsTUFBTSxDQUFDLGVBQWU7eUJBQ2YsU0FBUzt5QkFDVCxTQUFTLENBQUMsQ0FBTSxNQUFNLEVBQUMsRUFBRTt3QkFDeEIsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDckIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBRTtnQ0FDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtvQ0FDakYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQ0FDL0I7Z0NBQ0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQ0FDZCxJQUFJLENBQUMsaUJBQWlCLENBQ3BCLFNBQVMsRUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUNsRixDQUFDO2dDQUNKLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFDVixDQUFDLENBQUMsQ0FBQzt5QkFDSjtvQkFDSCxDQUFDLENBQUEsQ0FBQyxDQUFDO2lCQUNWO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekQ7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQUVNLHdCQUF3QixDQUFDLEtBQWEsRUFBRSxLQUFvQjs7UUFDakUsTUFBTSxPQUFPLEdBQUcsTUFBQSxJQUFJLENBQUMsUUFBUSwwQ0FBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBaUMsQ0FBQztRQUNwRSxJQUFJLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxlQUFlLEVBQUU7WUFDckQsTUFBTSxLQUFLLEdBQUcsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO1lBQzFDLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxXQUFXLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxRQUFRLENBQUM7YUFDckM7aUJBQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLFdBQVcsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtnQkFDeEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFFBQVEsQ0FBQzthQUNyQztTQUNGO0lBQ0gsQ0FBQztJQUVNLFlBQVksQ0FBQyxLQUFhOztRQUMvQixNQUFNLE9BQU8sR0FBRyxNQUFBLElBQUksQ0FBQyxRQUFRLDBDQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFBLENBQUM7UUFDekQsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BELE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNkLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLHdCQUF3QixDQUFDLElBQUksQ0FDMUQsQ0FBQztJQUNKLENBQUM7SUFFTSxXQUFXLENBQUMsU0FBaUI7UUFDbEMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEtBQUssRUFBRTtZQUM1SSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUNsRSxJQUFJLEVBQUUsU0FBUztnQkFDZixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxlQUFlLENBQUMsVUFBVTtnQkFDakUsVUFBVSxFQUFFLElBQUksZUFBZSxDQUFxRCxFQUFFLENBQUM7Z0JBQ3ZGLHlCQUF5QixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxDQUFDLGdCQUFnQjthQUN2RixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxRQUFRLENBQ2pFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUMxRSxDQUFDO1lBQ0YsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQWMsQ0FBQztZQUNwRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBRU0sY0FBYyxDQUFDLFNBQWlCLEVBQUUsV0FBVztRQUNsRCxNQUFNLGlCQUFpQixHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEYsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdkgsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVNLGlCQUFpQixDQUFDLFNBQWlCOztRQUN4QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0Q7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsK0JBQStCLG1DQUFJLElBQUksQ0FBQyxDQUFDO1lBQ2hKLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLCtCQUErQixtQ0FBSSxJQUFJLENBQUMsQ0FBQztTQUM3SDtJQUNILENBQUM7SUFFTSxPQUFPLENBQUMsTUFBaUQ7UUFDOUQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMxQyxDQUFDO0lBRU0sMEJBQTBCLENBQUMsU0FBaUIsRUFBRSxNQUFnRDtRQUNuRyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBK0MsQ0FBQztRQUNySyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkYsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvRDthQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxZQUFZLEVBQUU7WUFDbEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3hFO0lBQ0gsQ0FBQztJQUVNLFlBQVksQ0FBQyxNQUEyRDtRQUM3RSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVPLFVBQVUsQ0FBQyxNQUFzQzs7UUFDdkQsSUFBSSxVQUFVLEdBQUcsTUFBQSxNQUFNLENBQUMsY0FBYyxtQ0FBSSxFQUFFLENBQUM7UUFDN0MsSUFBSSxLQUFLLEdBQVEsTUFBQSxNQUFNLENBQUMsS0FBSyxtQ0FBSSxFQUFFLENBQUM7UUFDcEMsSUFBSSx5QkFBeUIsR0FBMEYsQ0FDckgsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQUEsTUFBTSxDQUFDLCtCQUErQixtQ0FBSSxJQUFJLENBQUMsQ0FDeEUsQ0FBQztRQUVGLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJO1lBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkUsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRO1lBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlGLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUTtZQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RixJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsSUFBSTtZQUM3QyxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFFBQVE7WUFDakQsTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxJQUFJLEVBQzdDO1lBQ0EsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUU7Z0JBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUFFO1lBQ3BHLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFO2dCQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFBRTtTQUNyRztRQUNELElBQUksTUFBTSxDQUFDLFNBQVM7WUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsSUFBSSxNQUFNLENBQUMsU0FBUztZQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUU5RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsR0FBRyxFQUFFO1lBQ2hELFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDL0I7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsSUFBSSxFQUFFO1lBQ3hELFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDaEM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsS0FBSyxFQUFFO1lBQ3pELFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25DO2FBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFlBQVksRUFBRTtZQUNoRSxJQUFJLEtBQUssRUFBRTtnQkFDVCx5QkFBeUIsR0FBRyxLQUFLLENBQUM7Z0JBQ2xDLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsRTtZQUNELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7Z0JBQzVCLFVBQVUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQzthQUNoRDtTQUNGO2FBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFFBQVEsRUFBRTtZQUM1RCxLQUFLLEdBQUcsTUFBQSxNQUFNLENBQUMsS0FBSyxtQ0FBSSxLQUFLLENBQUM7U0FDL0I7UUFFRCxJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsZUFBZTtZQUN4RCxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFDakI7WUFDQSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsUUFBUSxDQUFDO1NBQ3JDO1FBRUQsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUU7WUFDNUIsTUFBTSxzQkFBc0IsR0FBRyxFQUFxQyxDQUFDO1lBQ3JFLE1BQU0sQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDaEUsc0JBQXNCLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDNUQsTUFBTSxDQUFDLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO1NBQ25EO1FBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRTtZQUN6QixVQUFVLEdBQUcsRUFBRSxDQUFDO1NBQ2pCO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDMUIsSUFBSSxFQUFFLENBQUMsSUFBSSxlQUFlLENBQVUsTUFBQSxNQUFNLENBQUMsSUFBSSxtQ0FBSSxJQUFJLENBQUMsQ0FBQztZQUN6RCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3JCLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbkIsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNuQixnQkFBZ0IsRUFBRSxDQUFDO29CQUNqQixJQUFJLEVBQUUsTUFBQSxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxnQkFBZ0IsMENBQUUsSUFBSSxtQ0FBSSxhQUFhO29CQUNyRCxJQUFJLEVBQUUsTUFBQSxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxnQkFBZ0IsMENBQUUsSUFBSSxtQ0FBSSw2QkFBNkI7b0JBQ3JFLGVBQWUsRUFBRSxNQUFBLE1BQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLGdCQUFnQiwwQ0FBRSxlQUFlLG1DQUFJLE9BQU87b0JBQ3JFLEtBQUssRUFBRSxNQUFBLE1BQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLGdCQUFnQiwwQ0FBRSxLQUFLLG1DQUFJLE1BQU07b0JBQ2hELE1BQU0sRUFBRSxNQUFBLE1BQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLGdCQUFnQiwwQ0FBRSxNQUFNLG1DQUFJLEdBQUc7aUJBQ2hELENBQUM7WUFDRixpQkFBaUIsRUFBRSxDQUFDLElBQUksZUFBZSxDQUFrQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNuRyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUMvQixVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQy9CLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDakMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNyQixVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQy9CLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDM0IsUUFBUSxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsUUFBUSxtQ0FBSSxLQUFLLENBQUM7WUFDcEMsR0FBRyxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsR0FBRyxtQ0FBSSxDQUFDLENBQUM7WUFDdEIsR0FBRyxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsR0FBRyxtQ0FBSSxXQUFXLENBQUM7WUFDaEMsU0FBUyxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsU0FBUyxtQ0FBSSxDQUFDLENBQUM7WUFDbEMsU0FBUyxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsU0FBUyxtQ0FBSSxHQUFHLENBQUM7WUFDcEMsUUFBUSxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsUUFBUSxtQ0FBSSxLQUFLLENBQUM7WUFDcEMsS0FBSyxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsS0FBSyxtQ0FBSSxLQUFLLENBQUM7WUFDOUIsUUFBUSxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsUUFBUSxtQ0FBSSxLQUFLLENBQUM7WUFDcEMsWUFBWSxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsWUFBWSxtQ0FBSSxFQUFFLENBQUM7WUFDekMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDN0UsMkJBQTJCLEVBQUUsQ0FBQyxNQUFNLENBQUMsMkJBQTJCLENBQUM7WUFDakUsaUJBQWlCLEVBQUUsQ0FBQyxNQUFBLE1BQU0sQ0FBQyxpQkFBaUIsbUNBQUksQ0FBQyxDQUFDO1lBQ2xELGlCQUFpQixFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsaUJBQWlCLG1DQUFJLEdBQUcsQ0FBQztZQUNwRCxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1lBQ3JDLHNCQUFzQixFQUFFLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1lBQ3ZELDRCQUE0QixFQUFFLENBQUMsTUFBTSxDQUFDLDRCQUE0QixDQUFDO1lBQ25FLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNyQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztZQUMxRCxtQkFBbUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztZQUNqRCwwQkFBMEIsRUFBRSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQztZQUMvRCwyQkFBMkIsRUFBRSxDQUFDLElBQUksZUFBZSxDQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzNELHlCQUF5QixFQUFFLENBQUMseUJBQXlCLENBQUM7WUFDdEQsUUFBUSxFQUFFLENBQUMsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLE9BQU8sQ0FBQztZQUMzQixVQUFVLEVBQUUsQ0FBQyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsVUFBVSxDQUFDO1lBQ2hDLDJCQUEyQixFQUFFLENBQUMsTUFBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsMkJBQTJCLG1DQUFJLEVBQUUsQ0FBQztZQUN4RSxnQkFBZ0IsRUFBRSxDQUFDLE1BQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLGdCQUFnQixtQ0FBSSxFQUFFLENBQUM7WUFDbEQsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxnQkFBZ0IsbUNBQUksRUFBRSxDQUFDO1lBQ2xELEtBQUssRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxlQUFlLENBQUM7U0FDaEYsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEtBQUssVUFBVSxFQUFFO1lBQzFDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFpQyxDQUFDO1lBQ2xGLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEIsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDaEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGlCQUFpQixDQUFDLE9BQXlELEVBQUUsSUFBZTtRQUNsRyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLElBQUksSUFBSSxFQUFFO2dCQUNSLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFjLENBQUM7Z0JBQ3BELEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDdEM7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQThELEVBQUUsSUFBZTtRQUM1RyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTs7WUFDN0MsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQWMsQ0FBQztnQkFDcEQsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ2hDLEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFO3dCQUNsRSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7NEJBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQzFDLE1BQU0sTUFBTSxHQUFtQyxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLG1DQUFJLElBQUksQ0FBQzs0QkFDckYsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO2dDQUNiLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztnQ0FDcEIsSUFBSSxNQUFNLEVBQUU7b0NBQ1YsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFdBQVcsRUFBRTt3Q0FDeEQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFjLENBQUM7d0NBQ3hFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxpQkFBaUIsMENBQUUsSUFBSSxDQUFDLENBQUM7cUNBQzFEO3lDQUFNO3dDQUNMLFVBQVUsR0FBRyxNQUFBLE1BQU0sQ0FBQyxjQUFjLG1DQUFJLEVBQUUsQ0FBQzt3Q0FDekMsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRTs0Q0FDNUIsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7eUNBQ3RDO3dDQUNELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxHQUFHLEVBQUU7NENBQ2hELFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7eUNBQy9COzZDQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUU7NENBQ3hELFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7eUNBQ2hDOzZDQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUU7NENBQ3pELFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO3lDQUNuQzs2Q0FBTSxJQUNMLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSTs0Q0FDeEIsTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxZQUFZLEVBQ3JEOzRDQUNBLFVBQVUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQzt5Q0FDaEQ7d0NBRUQsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFROzRDQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt3Q0FDOUYsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFROzRDQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt3Q0FDOUYsSUFDRSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLElBQUk7NENBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsUUFBUTs0Q0FDakQsTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxJQUFJLEVBQzdDOzRDQUNBLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFO2dEQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7NkNBQUU7NENBQ3BHLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFO2dEQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7NkNBQUU7eUNBQ3JHO3dDQUNELElBQUksTUFBTSxDQUFDLFNBQVM7NENBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3dDQUM5RSxJQUFJLE1BQU0sQ0FBQyxTQUFTOzRDQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzt3Q0FFOUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7d0NBQy9DLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRTs0Q0FDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7eUNBQ2pFO3FDQUNGO29DQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztvQ0FDOUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7d0NBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO3FDQUNyQztpQ0FDRjs2QkFDRjtpQ0FBTTtnQ0FDTCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dDQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0NBQzVDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0NBRTlDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUU7b0NBQ3hELE1BQU0sU0FBUyxHQUFHLE9BQW9CLENBQUM7b0NBQ3ZDLFNBQVMsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQ0FDNUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lDQUM3RDs2QkFDRjs0QkFDRCxNQUFNO3lCQUNQO3FCQUNGO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxHQUErQyxFQUFFLEtBQWE7UUFDdkYsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3pCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUM3QixJQUFJLE1BQU0sRUFBRTtvQkFDVixJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7b0JBQ2hCLEtBQUssQ0FBQyxXQUFXLEVBQUU7eUJBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQzt5QkFDVixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ2QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7NEJBQy9DLElBQUksR0FBRyxLQUFLLENBQUM7NEJBQ2IsT0FBTyxLQUFLLENBQUM7eUJBQ2Q7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBRVIsT0FBTyxJQUFJLENBQUM7aUJBQ2I7YUFDRjtpQkFBTTtnQkFDTCxPQUFPLElBQUksQ0FBQzthQUNiO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sY0FBYyxDQUFDLFNBQW9CLEVBQUUsSUFBbUM7UUFDOUUsSUFBSSxTQUFTLEVBQUU7WUFDYixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDakMsSUFBSSxrQkFBb0UsQ0FBQztnQkFDekUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNDLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztnQkFDdEIsR0FBRztvQkFDRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO29CQUM3RyxJQUFJLGFBQWEsS0FBSyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDNUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEtBQUssQ0FBQzt3QkFDNUQsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ2xELElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7NEJBQ3RGLElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRTtnQ0FDekIsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzt3Q0FDckYsSUFBSSxFQUFFLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzt3Q0FDekMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO3FDQUNsQixDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDOzZCQUNqQjtpQ0FBTTtnQ0FDTCxXQUFXLENBQUMsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFrQyxDQUFDO3dDQUM1RSxJQUFJLEVBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3dDQUN6QyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7cUNBQ2xCLENBQUMsQ0FBQyxDQUFDOzZCQUNMO3lCQUNGO3FCQUNGO29CQUNELGFBQWEsRUFBRSxDQUFDO2lCQUNqQixRQUFRLGFBQWEsR0FBRyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTthQUNsRDtpQkFBTTtnQkFDTCxLQUFLLE1BQU0sT0FBTyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ2pELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRTt3QkFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUMxQyxNQUFNO3FCQUNQO2lCQUNGO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFYSxvQkFBb0IsQ0FBQyxZQUF1Qjs7WUFDeEQsSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUU7Z0JBQ2xDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMseUJBQXlCO3FCQUN6QixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDO3FCQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQ2IsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUN4QixPQUFPLENBQUMsQ0FBQztxQkFDVjtvQkFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNaLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtvQkFDNUIsSUFBSSxNQUFNLEVBQUU7d0JBQ1YsSUFBSSxNQUFNLENBQUMsaUJBQWlCLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTs0QkFDcEQsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsUUFBUTtpQ0FDUixRQUFRO2lDQUNSLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUNkLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUM1RCxDQUFDOzRCQUN2QyxNQUFNLHdCQUF3QixHQUFHLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEtBQXlELENBQUM7NEJBQzdJLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDcEMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ2Ysd0JBQXdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3lCQUNoRTt3QkFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUNoQyxJQUFJLENBQUMsVUFBVSxFQUNmLE1BQU0sQ0FBQyxZQUFZLEVBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQ3BCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FDekIsQ0FBQztxQkFDSDtpQkFDRjthQUNGO1FBQ0gsQ0FBQztLQUFBO0lBRU8sMEJBQTBCLENBQUMsY0FBMEQsRUFBRSxLQUErQztRQUM1SSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFbkIsS0FBSyxNQUFNLFlBQVksSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbEQsSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ3BDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ2hCLE1BQU07YUFDUDtTQUNGO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs7O1lBaGpCRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsd3A1QkFBMEM7Z0JBRTFDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOzthQUNoRDs7O1lBN0JtQixXQUFXO1lBYXRCLHVCQUF1Qjs7O21CQWtCN0IsS0FBSzt5QkFDTCxLQUFLO3lCQUNMLEtBQUs7d0NBQ0wsS0FBSzt3QkFDTCxLQUFLOzRCQUNMLEtBQUs7Z0NBTUwsU0FBUyxTQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY0Zvcm1GaWVsZEludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWZvcm0tZmllbGQuaW50ZXJmYWNlJztcbmltcG9ydCB7IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bSB9IGZyb20gJy4vZW51bXMvZHluYW1pYy1mb3JtLXR5cGUtZmllbGQuZW51bSc7XG5pbXBvcnQgeyBDcGZWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMvY3BmLnZhbGlkYXRvcic7XG5pbXBvcnQgeyBDbnBqVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3JzL2NucGoudmFsaWRhdG9yJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFic3RyYWN0IH0gZnJvbSAnLi4vZm9ybS5hYnN0cmFjdCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtc2V0LXZhbHVlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBBdXRvY29tcGxldGVTZWxlY3RlZFZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdG9ycy9hdXRvY29tcGxldGUtc2VsZWN0ZWQudmFsaWRhdG9yJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1hdXRvY29tcGxldGUtb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybVNob3dGaWVsZEludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWZvcm0tc2hvdy1maWVsZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybVNlcnZpY2UgfSBmcm9tICcuL2tvYWxhLmR5bmFtaWMtZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY0Zvcm1Nb3JlSXRlbnNTaG93RmllbGRDb25maWdJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1mb3JtLW1vcmUtaXRlbnMtc2hvdy1maWVsZC1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRoZW1lUGFsZXR0ZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybUF1dG9jb21wbGV0ZU11bHRpcGxlQ29uZmlnSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1hdXRvY29tcGxldGUtbXVsdGlwbGUtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtQ29uZmlnSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcIkBrb2FsYXJ4L3V0aWxzL29wZXJhdG9ycy9kZWxheVwiO1xuaW1wb3J0IHsga29hbGEgfSBmcm9tIFwiQGtvYWxhcngvdXRpbHNcIjtcbmltcG9ydCB7IERhdGVNaW5WYWxpZGF0b3IgfSBmcm9tIFwiLi92YWxpZGF0b3JzL2RhdGUtbWluLnZhbGlkYXRvclwiO1xuaW1wb3J0IHsgRGF0ZU1heFZhbGlkYXRvciB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvZGF0ZS1tYXgudmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBLb2FsYUxhbmd1YWdlSGVscGVyIH0gZnJvbSBcIkBrb2FsYXJ4L3VpL2NvcmVcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAna29hbGEtZHluYW1pYy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICdkeW5hbWljLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnZHluYW1pYy1mb3JtLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1Db21wb25lbnQgZXh0ZW5kcyBGb3JtQWJzdHJhY3QgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBmb3JtOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIGZvcm1Db25maWc6IEtvYWxhRHluYW1pY0Zvcm1GaWVsZEludGVyZmFjZVtdO1xuICBASW5wdXQoKSBzaG93RmllbGRzOiBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybVNob3dGaWVsZEludGVyZmFjZVtdPjtcbiAgQElucHV0KCkgc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZzogS29hbGFEeW5hbWljRm9ybU1vcmVJdGVuc1Nob3dGaWVsZENvbmZpZ0ludGVyZmFjZVtdO1xuICBASW5wdXQoKSBzZXRWYWx1ZXM6IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNTZXRWYWx1ZUludGVyZmFjZVtdPjtcbiAgQElucHV0KCkgdGFiSW5kZXhTdGFydDogbnVtYmVyID0gMTtcbiAgcHVibGljIGNvbnRyb2xzOiBGb3JtQXJyYXk7XG4gIHB1YmxpYyB0eXBlRmllbGQgPSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW07XG4gIHB1YmxpYyBob3Vyc0FuZE1pbnV0ZXNNYXNrID0gJzAwOjAwMCc7XG4gIHB1YmxpYyBlcnJvck1lc3NhZ2UgPSBLb2FsYUxhbmd1YWdlSGVscGVyO1xuXG4gIEBWaWV3Q2hpbGQoJ2F1dG9jb21wbGV0ZUlucHV0JykgYXV0b2NvbXBsZXRlSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBkeW5hbWljRm9ybVNlcnZpY2U6IEtvYWxhRHluYW1pY0Zvcm1TZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCgpID0+IHRoaXMuZm9ybSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuZm9ybS5nZXQoJ2Zvcm1EYXRhJykpIHtcbiAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKCdmb3JtRGF0YScsIHRoaXMuZmIuYXJyYXkoW10pKTtcbiAgICB9XG4gICAgdGhpcy5jb250cm9scyA9IHRoaXMuZm9ybS5nZXQoJ2Zvcm1EYXRhJykgYXMgRm9ybUFycmF5O1xuICAgIHRoaXMuZm9ybUNvbmZpZz8uZm9yRWFjaCgoY29uZmlnLCBpbmRleENvbmZpZykgPT4ge1xuICAgICAgY29uc3QgbmV3Rm9ybUdyb3VwID0gdGhpcy5uZXdDb250cm9sKGNvbmZpZyk7XG4gICAgICBpZiAoY29uZmlnLmFzeW5jVmFsaWRhdG9ycykge1xuICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCd2YWx1ZScpLnNldEFzeW5jVmFsaWRhdG9ycyhjb25maWcuYXN5bmNWYWxpZGF0b3JzKTtcbiAgICAgIH1cbiAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZHluYW1pY0Zvcm0pIHtcbiAgICAgICAgY29uc3QgZm9ybUdyb3VwRHluYW1pY0Zvcm1zU3ViamVjdCA9IG5ld0Zvcm1Hcm91cC5nZXQoJ2R5bmFtaWNGb3JtQ29uZmlnJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+O1xuICAgICAgICBmb3JtR3JvdXBEeW5hbWljRm9ybXNTdWJqZWN0LnN1YnNjcmliZShmb3JtR3JvdXBDb25maWcgPT4ge1xuICAgICAgICAgIGlmIChmb3JtR3JvdXBDb25maWcpIHtcbiAgICAgICAgICAgIGZvcm1Hcm91cENvbmZpZy5mb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZm9ybUdyb3VwQ29uZmlnLmZvcm0udmFsaWQgJiYgKGNvbmZpZy52YWx1ZUNoYW5nZXMgfHwgdGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5keW5hbWljRm9ybVNlcnZpY2UuZW1pdERhdGEoZm9ybUdyb3VwQ29uZmlnLmZvcm0pO1xuICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcudmFsdWVDaGFuZ2VzIHx8XG4gICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlIHx8XG4gICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZHluYW1pY0Zvcm0gfHxcbiAgICAgICAgdGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgY29uc3QgYXV0b2NvbXBsZXRlT3B0aW9uc1N1YmplY3QgPSBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXT47XG4gICAgICAgICAgaWYgKGF1dG9jb21wbGV0ZU9wdGlvbnNTdWJqZWN0KSB7XG4gICAgICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zU3ViamVjdC5zdWJzY3JpYmUob3B0aW9ucyA9PiBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQnKS52YWx1ZS5uZXh0KG9wdGlvbnMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKVxuICAgICAgICAgICAgICAgICAgICAudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgzMDApKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGFzeW5jIHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldENvbmZpZ0R5bmFtaWNGb3JtKG5ld0Zvcm1Hcm91cCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KCduYW1lJykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnbXVsdGlwbGUnKS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdGb3JtR3JvdXAuZ2V0KCdtdWx0aXBsZScpLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVBdXRvY29tcGxldGVTZWxlY3QobmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRvY29tcGxldGVJbnB1dD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5ld0Zvcm1Hcm91cC5nZXQoJ211bHRpcGxlJykudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnNldFZhbHVlKGtvYWxhKHRoaXMuZm9ybUNvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXJyYXk8S29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlPigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihuZXdGb3JtR3JvdXAuZ2V0KCduYW1lJykudmFsdWUsICduYW1lJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKVswXT8uYXV0b2NvbXBsZXRlRGVmYXVsdFZhbHVlT25DbGVhciA/PyBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuYXV0b2NvbXBsZXRlVHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvY29tcGxldGVPcHRpb25zU3ViamVjdCA9IG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnMnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdPjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQnKS52YWx1ZS5uZXh0KHRoaXMuYXV0b2NvbXBsZXRlRmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlT3B0aW9uc1N1YmplY3QudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5hdXRvY29tcGxldGVUeXBlID09PSAnb25EZW1hbmQnICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlciA9IG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZUxvYWRpbmcnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmF1dG9jb21wbGV0ZUZpbHRlcih2YWx1ZSkuc3Vic2NyaWJlKG9wdGlvbnMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlT3B0aW9uc0ZpbHRlcmVkJykudmFsdWUubmV4dChvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnZhbHVlQ2hhbmdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy52YWx1ZUNoYW5nZXMoKG5ld0Zvcm1Hcm91cC5nZXQoJ211bHRpcGxlJykudmFsdWUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykudmFsdWUubWFwKGl0ZW0gPT4gaXRlbS52YWx1ZSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykudmFsdWU/LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnZhbHVlQ2hhbmdlcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udHJvbHMucHVzaChuZXdGb3JtR3JvdXApO1xuICAgICAgaWYgKGNvbmZpZy5tb3JlSXRlbXNDb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5tb3JlSXRlbXNNaW5JdGVtcyA+IDApIHtcbiAgICAgICAgICBmb3IgKGxldCBtaW4gPSAwOyBtaW4gPCBjb25maWcubW9yZUl0ZW1zTWluSXRlbXM7IG1pbisrKSB7XG4gICAgICAgICAgICBpZiAobWluIDw9IGNvbmZpZy5tb3JlSXRlbXNNYXhJdGVtcykge1xuICAgICAgICAgICAgICB0aGlzLmFkZE1vcmVJdGVtKGluZGV4Q29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5tb3JlSXRlbXNDb25maWcuc2V0VmFsdWVzKSB7XG4gICAgICAgICAgY29uZmlnLm1vcmVJdGVtc0NvbmZpZ1xuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZXNcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGFzeW5jIHZhbHVlcyA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmZvckVhY2goKGl0ZW1WYWx1ZSwgaW5kZXhWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250cm9scy5jb250cm9sc1tpbmRleENvbmZpZ10uZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZVtpbmRleFZhbHVlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNb3JlSXRlbShpbmRleENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZXNPbkZpZWxkcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW2luZGV4Q29uZmlnXS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlW2luZGV4VmFsdWVdLmZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGhpcy5zaG93RmllbGRzKSB7XG4gICAgICB0aGlzLmNoYW5nZVZpc2liaWxpdHlGaWVsZHModGhpcy5zaG93RmllbGRzLCB0aGlzLmZvcm0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZXRWYWx1ZXMpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWVzT25GaWVsZHModGhpcy5zZXRWYWx1ZXMsIHRoaXMuZm9ybSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhvdXJzQW5kTWludXRlc0FwcGx5TWFzayhpbmRleDogbnVtYmVyLCBldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2xzPy5jb250cm9sc1tpbmRleF07XG4gICAgY29uc3QgdHlwZSA9IGNvbnRyb2w/LmdldCgndHlwZScpLnZhbHVlIGFzIER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bTtcbiAgICBpZiAodHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmhvdXJzQW5kTWludXRlcykge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb250cm9sPy5nZXQoJ3ZhbHVlJykudmFsdWU7XG4gICAgICBpZiAoZXZlbnQua2V5ID09ICdCYWNrc3BhY2UnICYmIHZhbHVlLmxlbmd0aCA8IDYpIHtcbiAgICAgICAgdGhpcy5ob3Vyc0FuZE1pbnV0ZXNNYXNrID0gJzAwOjAwMCc7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSAhPSAnQmFja3NwYWNlJyAmJiB2YWx1ZS5sZW5ndGggPj0gNikge1xuICAgICAgICB0aGlzLmhvdXJzQW5kTWludXRlc01hc2sgPSAnMDAwOjAwJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFzc3dvcmRWaWV3KGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5jb250cm9scz8uY29udHJvbHNbaW5kZXhdO1xuICAgIGNvbnN0IGhpZGVQYXNzd29yZCA9ICFjb250cm9sPy5nZXQoJ2hpZGVQYXNzd29yZCcpLnZhbHVlO1xuICAgIGNvbnRyb2w/LmdldCgnaGlkZVBhc3N3b3JkJykuc2V0VmFsdWUoaGlkZVBhc3N3b3JkKTtcbiAgICBjb250cm9sPy5nZXQoJ3R5cGUnKS5zZXRWYWx1ZShoaWRlUGFzc3dvcmQgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5wYXNzd29yZCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnRleHRcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFkZE1vcmVJdGVtKHByb3BJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlLmxlbmd0aCA8IHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc01heEl0ZW1zJykudmFsdWUpIHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUucHVzaCh7XG4gICAgICAgIGZvcm06IGZvcm1Hcm91cCxcbiAgICAgICAgZm9ybUNvbmZpZzogdGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0ubW9yZUl0ZW1zQ29uZmlnLmZvcm1Db25maWcsXG4gICAgICAgIHNob3dGaWVsZHM6IG5ldyBCZWhhdmlvclN1YmplY3Q8QmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+W10+KFtdKSxcbiAgICAgICAgc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZzogdGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0ubW9yZUl0ZW1zQ29uZmlnLnNob3dGaWVsZHNDb25maWdcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zRXhwYW5kZWQnKS5zZXRWYWx1ZShcbiAgICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoIC0gMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGZvcm1BcnJheU1vcmVJdGVtcyA9IHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0Zvcm1Hcm91cCcpIGFzIEZvcm1BcnJheTtcbiAgICAgIGZvcm1BcnJheU1vcmVJdGVtcy5wdXNoKGZvcm1Hcm91cCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbW92ZU1vcmVJdGVtKHByb3BJbmRleDogbnVtYmVyLCByZW1vdmVJbmRleCkge1xuICAgIGNvbnN0IGV4cGFuZGVkSXRlbUluZGV4ID0gcmVtb3ZlSW5kZXggLSAxO1xuICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlLnNwbGljZShyZW1vdmVJbmRleCwgMSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNFeHBhbmRlZCcpLnNldFZhbHVlKChleHBhbmRlZEl0ZW1JbmRleCA8IDApID8gMCA6IGV4cGFuZGVkSXRlbUluZGV4KTtcbiAgICB9LCA1MCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJBdXRvY29tcGxldGUocHJvcEluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbXVsdGlwbGUnKS52YWx1ZSkge1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnNldFZhbHVlKFtdKTtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZSh0aGlzLmZvcm1Db25maWdbcHJvcEluZGV4XS5hdXRvY29tcGxldGVEZWZhdWx0VmFsdWVPbkNsZWFyID8/IG51bGwpO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgndmFsdWUnKS5zZXRWYWx1ZSh0aGlzLmZvcm1Db25maWdbcHJvcEluZGV4XS5hdXRvY29tcGxldGVEZWZhdWx0VmFsdWVPbkNsZWFyID8/IG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwbGF5KG9wdGlvbj86IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb24ubmFtZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVPcHRpb25PbkF1dG9jb21wbGV0ZShwcm9wSW5kZXg6IG51bWJlciwgb3B0aW9uOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykudmFsdWUuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gb3B0aW9uKSBhcyBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW107XG4gICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnNldFZhbHVlKHZhbHVlKTtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUoW10pO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgndmFsdWUnKS5zZXRWYWx1ZShudWxsKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybUNvbmZpZ1twcm9wSW5kZXhdLnZhbHVlQ2hhbmdlcykge1xuICAgICAgdGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0udmFsdWVDaGFuZ2VzKHZhbHVlLm1hcChpdGVtID0+IGl0ZW0udmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sb3JDaGlwKGNvbmZpZzogS29hbGFEeW5hbWljRm9ybUF1dG9jb21wbGV0ZU11bHRpcGxlQ29uZmlnSW50ZXJmYWNlKTogVGhlbWVQYWxldHRlIHtcbiAgICByZXR1cm4gY29uZmlnLmNvbG9yO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXdDb250cm9sKGNvbmZpZzogS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlKTogRm9ybUdyb3VwIHtcbiAgICBsZXQgdmFsaWRhdG9ycyA9IGNvbmZpZy5zeW5jVmFsaWRhdG9ycyA/PyBbXTtcbiAgICBsZXQgdmFsdWU6IGFueSA9IGNvbmZpZy52YWx1ZSA/PyAnJztcbiAgICBsZXQgdmFsdWVTZWxlY3RlZEF1dG9jb21wbGV0ZTogS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZSB8IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXSA9IChcbiAgICAgIGNvbmZpZy5tdWx0aXBsZSA/IFtdIDogKGNvbmZpZy5hdXRvY29tcGxldGVEZWZhdWx0VmFsdWVPbkNsZWFyID8/IG51bGwpXG4gICAgKTtcblxuICAgIGlmIChjb25maWcucmVxdWlyZWQgPT09IHRydWUpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICBpZiAoY29uZmlnLm1pbiAmJiB0eXBlb2YgY29uZmlnLm1pbiA9PT0gXCJudW1iZXJcIikgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluKGNvbmZpZy5taW4pKTtcbiAgICBpZiAoY29uZmlnLm1heCAmJiB0eXBlb2YgY29uZmlnLm1heCA9PT0gXCJudW1iZXJcIikgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4KGNvbmZpZy5tYXgpKTtcbiAgICBpZiAoXG4gICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmRhdGUgfHxcbiAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZGF0ZXRpbWUgfHxcbiAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0udGltZVxuICAgICkge1xuICAgICAgaWYgKGNvbmZpZy5taW4gJiYgdHlwZW9mIGNvbmZpZy5taW4gPT09IFwic3RyaW5nXCIpIHsgdmFsaWRhdG9ycy5wdXNoKERhdGVNaW5WYWxpZGF0b3IoY29uZmlnLm1pbikpOyB9XG4gICAgICBpZiAoY29uZmlnLm1heCAmJiB0eXBlb2YgY29uZmlnLm1heCA9PT0gXCJzdHJpbmdcIikgeyB2YWxpZGF0b3JzLnB1c2goRGF0ZU1heFZhbGlkYXRvcihjb25maWcubWF4KSk7IH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5taW5MZW5ndGgpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aChjb25maWcubWluTGVuZ3RoKSk7XG4gICAgaWYgKGNvbmZpZy5tYXhMZW5ndGgpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aChjb25maWcubWF4TGVuZ3RoKSk7XG5cbiAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5jcGYpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChDcGZWYWxpZGF0b3IpO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5jbnBqKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goQ25walZhbGlkYXRvcik7XG4gICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmVtYWlsKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmF1dG9jb21wbGV0ZSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHZhbHVlU2VsZWN0ZWRBdXRvY29tcGxldGUgPSB2YWx1ZTtcbiAgICAgICAgdmFsdWUgPSAoY29uZmlnLm11bHRpcGxlID8gdmFsdWVTZWxlY3RlZEF1dG9jb21wbGV0ZVswXSA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcucmVxdWlyZWQgPT09IHRydWUpIHtcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsaWRhdG9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY2hlY2tib3gpIHtcbiAgICAgIHZhbHVlID0gY29uZmlnLnZhbHVlID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uaG91cnNBbmRNaW51dGVzICYmXG4gICAgICB2YWx1ZS5sZW5ndGggPj0gNlxuICAgICkge1xuICAgICAgdGhpcy5ob3Vyc0FuZE1pbnV0ZXNNYXNrID0gJzAwMDowMCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZykge1xuICAgICAgY29uc3QgY2xvbmVEeW5hbWljRm9ybUNvbmZpZyA9IHt9IGFzIEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U7XG4gICAgICBPYmplY3QuYXNzaWduKGNsb25lRHluYW1pY0Zvcm1Db25maWcsIGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyk7XG4gICAgICBjbG9uZUR5bmFtaWNGb3JtQ29uZmlnLmZvcm0gPSBjb25maWcuZHluYW1pY0Zvcm1Db25maWcuZm9ybTtcbiAgICAgIGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyA9IGNsb25lRHluYW1pY0Zvcm1Db25maWc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5zaG93ID09PSBmYWxzZSkge1xuICAgICAgdmFsaWRhdG9ycyA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBzaG93OiBbbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihjb25maWcuc2hvdyA/PyB0cnVlKV0sXG4gICAgICBsYWJlbDogW2NvbmZpZy5sYWJlbF0sXG4gICAgICBuYW1lOiBbY29uZmlnLm5hbWVdLFxuICAgICAgdHlwZTogW2NvbmZpZy50eXBlXSxcbiAgICAgIGZpbGVCdXR0b25Db25maWc6IFt7XG4gICAgICAgIGljb246IGNvbmZpZz8uZmlsZUJ1dHRvbkNvbmZpZz8uaWNvbiA/PyAnYXR0YWNoX2ZpbGUnLFxuICAgICAgICB0ZXh0OiBjb25maWc/LmZpbGVCdXR0b25Db25maWc/LnRleHQgPz8gJ0NsaXF1ZSBwYXJhIGFuZXhhciBhcnF1aXZvcycsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogY29uZmlnPy5maWxlQnV0dG9uQ29uZmlnPy5iYWNrZ3JvdW5kQ29sb3IgPz8gJ3doaXRlJyxcbiAgICAgICAgY29sb3I6IGNvbmZpZz8uZmlsZUJ1dHRvbkNvbmZpZz8uY29sb3IgPz8gJ2JsdWUnLFxuICAgICAgICBhY2NlcHQ6IGNvbmZpZz8uZmlsZUJ1dHRvbkNvbmZpZz8uYWNjZXB0ID8/ICcqJ1xuICAgICAgfV0sXG4gICAgICBkeW5hbWljRm9ybUNvbmZpZzogW25ldyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZT4oY29uZmlnLmR5bmFtaWNGb3JtQ29uZmlnKV0sXG4gICAgICBkeW5hbWljRm9ybUdyb3VwOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICAgIGFwcGVhcmFuY2U6IFtjb25maWcuYXBwZWFyYW5jZV0sXG4gICAgICBmbG9hdExhYmVsOiBbY29uZmlnLmZsb2F0TGFiZWxdLFxuICAgICAgcGxhY2Vob2xkZXI6IFtjb25maWcucGxhY2Vob2xkZXJdLFxuICAgICAgY2xhc3M6IFtjb25maWcuY2xhc3NdLFxuICAgICAgZmllbGRDbGFzczogW2NvbmZpZy5maWVsZENsYXNzXSxcbiAgICAgIHRleHRIaW50OiBbY29uZmlnLnRleHRIaW50XSxcbiAgICAgIHJlcXVpcmVkOiBbY29uZmlnLnJlcXVpcmVkID8/IGZhbHNlXSxcbiAgICAgIG1pbjogW2NvbmZpZy5taW4gPz8gMF0sXG4gICAgICBtYXg6IFtjb25maWcubWF4ID8/IDk5OTk5OTk5OTk5XSxcbiAgICAgIG1pbkxlbmd0aDogW2NvbmZpZy5taW5MZW5ndGggPz8gMF0sXG4gICAgICBtYXhMZW5ndGg6IFtjb25maWcubWF4TGVuZ3RoID8/IDI1NV0sXG4gICAgICBkaXNhYmxlZDogW2NvbmZpZy5kaXNhYmxlZCA/PyBmYWxzZV0sXG4gICAgICBmb2N1czogW2NvbmZpZy5mb2N1cyA/PyBmYWxzZV0sXG4gICAgICBtdWx0aXBsZTogW2NvbmZpZy5tdWx0aXBsZSA/PyBmYWxzZV0sXG4gICAgICBvcGNvZXNTZWxlY3Q6IFtjb25maWcub3Bjb2VzU2VsZWN0ID8/IFtdXSxcbiAgICAgIGhpZGVQYXNzd29yZDogY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5wYXNzd29yZCA/IHRydWUgOiBudWxsLFxuICAgICAgbW9yZUl0ZW1zQnV0dG9uSWNvbkFkZGxhYmVsOiBbY29uZmlnLm1vcmVJdGVtc0J1dHRvbkljb25BZGRsYWJlbF0sXG4gICAgICBtb3JlSXRlbXNNaW5JdGVtczogW2NvbmZpZy5tb3JlSXRlbXNNaW5JdGVtcyA/PyAwXSxcbiAgICAgIG1vcmVJdGVtc01heEl0ZW1zOiBbY29uZmlnLm1vcmVJdGVtc01heEl0ZW1zID8/IDEwMF0sXG4gICAgICBtb3JlSXRlbXNJY29uOiBbY29uZmlnLm1vcmVJdGVtc0ljb25dLFxuICAgICAgbW9yZUl0ZW1zSWNvbkZvbnRDb2xvcjogW2NvbmZpZy5tb3JlSXRlbXNJY29uRm9udENvbG9yXSxcbiAgICAgIG1vcmVJdGVtc0ljb25CYWNrZ3JvdW5kQ29sb3I6IFtjb25maWcubW9yZUl0ZW1zSWNvbkJhY2tncm91bmRDb2xvcl0sXG4gICAgICBtb3JlSXRlbXNFeHBhbmRlZDogWycnXSxcbiAgICAgIG1vcmVJdGVtc0NvbmZpZzogW1tdXSxcbiAgICAgIG1vcmVJdGVtc0Zvcm1Hcm91cDogdGhpcy5mYi5hcnJheShbXSksXG4gICAgICBhdXRvY29tcGxldGVMb2FkaW5nOiBbbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSldLFxuICAgICAgYXV0b2NvbXBsZXRlT3B0aW9uczogW2NvbmZpZy5hdXRvY29tcGxldGVPcHRpb25zXSxcbiAgICAgIGF1dG9jb21wbGV0ZU11bHRpcGxlQ29uZmlnOiBbY29uZmlnLmF1dG9jb21wbGV0ZU11bHRpcGxlQ29uZmlnXSxcbiAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZDogW25ldyBCZWhhdmlvclN1YmplY3Q8YW55PihbXSldLFxuICAgICAgYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZTogW3ZhbHVlU2VsZWN0ZWRBdXRvY29tcGxldGVdLFxuICAgICAgdGV4dExvZ3M6IFtjb25maWc/LnRleHRPYnNdLFxuICAgICAgY3VzdG9tTWFzYzogW2NvbmZpZz8uY3VzdG9tTWFzY10sXG4gICAgICBjdXN0b21NYXNjVGhvdXNhbmRTZXBhcmF0b3I6IFtjb25maWc/LmN1c3RvbU1hc2NUaG91c2FuZFNlcGFyYXRvciA/PyAnJ10sXG4gICAgICBjdXN0b21NYXNjU3VmZml4OiBbY29uZmlnPy5jdXN0b21NYXNjU3VmZml4ID8/ICcnXSxcbiAgICAgIGN1c3RvbU1hc2NQcmVmaXg6IFtjb25maWc/LmN1c3RvbU1hc2NQcmVmaXggPz8gJyddLFxuICAgICAgdmFsdWU6IFt7dmFsdWUsIGRpc2FibGVkOiBjb25maWcuZGlzYWJsZWR9LCB2YWxpZGF0b3JzLCBjb25maWcuYXN5bmNWYWxpZGF0b3JzXVxuICAgIH0pO1xuXG4gICAgaWYgKGNvbmZpZy5hdXRvY29tcGxldGVUeXBlID09PSBcIm9uRGVtYW5kXCIpIHtcbiAgICAgIGNvbnN0IGxvYWRlciA9IGZpZWxkLmdldCgnYXV0b2NvbXBsZXRlTG9hZGluZycpLnZhbHVlIGFzIEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgICAgIGxvYWRlci5uZXh0KHRydWUpO1xuICAgICAgY29uZmlnLmF1dG9jb21wbGV0ZUZpbHRlcignJykuc3Vic2NyaWJlKG9wdGlvbnMgPT4ge1xuICAgICAgICBmaWVsZC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZCcpLnZhbHVlLm5leHQob3B0aW9ucyk7XG4gICAgICAgIGxvYWRlci5uZXh0KGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VmFsdWVzT25GaWVsZHMoc3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+LCBmb3JtOiBGb3JtR3JvdXApIHtcbiAgICBzdWJqZWN0LnN1YnNjcmliZShpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IGZvcm0uZ2V0KCdmb3JtRGF0YScpIGFzIEZvcm1BcnJheTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGl0ZW0udmFsdWVzKCkpIHtcbiAgICAgICAgICB0aGlzLnNldFZhbHVlQnlQcm9wKGZvcm1BcnJheSwgcHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hhbmdlVmlzaWJpbGl0eUZpZWxkcyhzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybVNob3dGaWVsZEludGVyZmFjZVtdPiwgZm9ybTogRm9ybUdyb3VwKSB7XG4gICAgc3ViamVjdC5waXBlKGRlYm91bmNlVGltZSg1KSkuc3Vic2NyaWJlKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgY29uc3QgZm9ybUFycmF5ID0gZm9ybS5nZXQoJ2Zvcm1EYXRhJykgYXMgRm9ybUFycmF5O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgaXRlbS52YWx1ZXMoKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4Q29udHJvbCwgY29udHJvbF0gb2YgZm9ybUFycmF5LmNvbnRyb2xzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wuZ2V0KCduYW1lJykudmFsdWUgPT09IHByb3AubmFtZSkge1xuICAgICAgICAgICAgICBjb250cm9sLmdldCgnc2hvdycpLnZhbHVlLm5leHQocHJvcC5zaG93KTtcbiAgICAgICAgICAgICAgY29uc3QgY29uZmlnOiBLb2FsYUR5bmFtaWNGb3JtRmllbGRJbnRlcmZhY2UgPSB0aGlzLmZvcm1Db25maWdbaW5kZXhDb250cm9sXSA/PyBudWxsO1xuICAgICAgICAgICAgICBpZiAocHJvcC5zaG93KSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbGlkYXRvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5keW5hbWljRm9ybSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtQXJyYXlNb3JlSXRlbXMgPSBjb250cm9sLmdldCgnZHluYW1pY0Zvcm1Hcm91cCcpIGFzIEZvcm1BcnJheTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUFycmF5TW9yZUl0ZW1zLnB1c2goY29uZmlnPy5keW5hbWljRm9ybUNvbmZpZz8uZm9ybSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzID0gY29uZmlnLnN5bmNWYWxpZGF0b3JzID8/IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnJlcXVpcmVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmNwZikge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChDcGZWYWxpZGF0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY25waikge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChDbnBqVmFsaWRhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmVtYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMuZW1haWwpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5yZXF1aXJlZCA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChBdXRvY29tcGxldGVTZWxlY3RlZFZhbGlkYXRvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm1pbiAmJiB0eXBlb2YgY29uZmlnLm1pbiA9PT0gXCJudW1iZXJcIikgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluKGNvbmZpZy5taW4pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5tYXggJiYgdHlwZW9mIGNvbmZpZy5tYXggPT09IFwibnVtYmVyXCIpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heChjb25maWcubWF4KSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmRhdGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmRhdGV0aW1lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS50aW1lXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWluICYmIHR5cGVvZiBjb25maWcubWluID09PSBcInN0cmluZ1wiKSB7IHZhbGlkYXRvcnMucHVzaChEYXRlTWluVmFsaWRhdG9yKGNvbmZpZy5taW4pKTsgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWF4ICYmIHR5cGVvZiBjb25maWcubWF4ID09PSBcInN0cmluZ1wiKSB7IHZhbGlkYXRvcnMucHVzaChEYXRlTWF4VmFsaWRhdG9yKGNvbmZpZy5tYXgpKTsgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWluTGVuZ3RoKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgoY29uZmlnLm1pbkxlbmd0aCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm1heExlbmd0aCkgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKGNvbmZpZy5tYXhMZW5ndGgpKTtcblxuICAgICAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmFzeW5jVmFsaWRhdG9ycykge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldEFzeW5jVmFsaWRhdG9ycyhjb25maWcuYXN5bmNWYWxpZGF0b3JzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICAgICAgICBpZiAocHJvcC5jbGVhckN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuY2xlYXJBc3luY1ZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLnNldEVycm9ycyhudWxsKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5keW5hbWljRm9ybSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XG4gICAgICAgICAgICAgICAgICBmb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgnZHluYW1pY0Zvcm1Hcm91cCcpO1xuICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwLmFkZENvbnRyb2woJ2R5bmFtaWNGb3JtR3JvdXAnLCB0aGlzLmZiLmFycmF5KFtdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvY29tcGxldGVGaWx0ZXIoYXJyOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10sIHZhbHVlOiBzdHJpbmcpOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10ge1xuICAgIHJldHVybiBhcnIuZmlsdGVyKGZpbHRlciA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgbGV0IGZpbmQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgIC5zcGxpdCgnICcpXG4gICAgICAgICAgICAgICAuZm9yRWFjaChwYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihwYXJ0KSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICBmaW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBmaW5kO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VmFsdWVCeVByb3AoZm9ybUFycmF5OiBGb3JtQXJyYXksIHByb3A6IEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlKSB7XG4gICAgaWYgKGZvcm1BcnJheSkge1xuICAgICAgaWYgKHByb3AubmFtZS5pbmRleE9mKCcgPiAnKSA+PSAwKSB7XG4gICAgICAgIGxldCBkeW5hbWljRm9ybVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtQ29uZmlnSW50ZXJmYWNlPjtcbiAgICAgICAgY29uc3QgYXJyUHJvcE5hbWUgPSBwcm9wLm5hbWUuc3BsaXQoJyA+ICcpO1xuICAgICAgICBsZXQgaW5kZXhQcm9wTmFtZSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUFycmF5LmNvbnRyb2xzLmZpbmQoY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpLnZhbHVlID09PSBhcnJQcm9wTmFtZVtpbmRleFByb3BOYW1lXSk7XG4gICAgICAgICAgaWYgKGluZGV4UHJvcE5hbWUgPT09IGFyclByb3BOYW1lLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAgIGR5bmFtaWNGb3JtU3ViamVjdCA9IGNvbnRyb2wuZ2V0KCdkeW5hbWljRm9ybUNvbmZpZycpLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgZHluYW1pY0Zvcm0gPSBkeW5hbWljRm9ybVN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGlmIChkeW5hbWljRm9ybS5mb3JtQ29uZmlnLmZpbmQoZmMgPT4gZmMubmFtZSA9PT0gYXJyUHJvcE5hbWVbYXJyUHJvcE5hbWUubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgICAgICAgIGlmIChkeW5hbWljRm9ybS5zZXRWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljRm9ybS5zZXRWYWx1ZXMubmV4dChrb2FsYShkeW5hbWljRm9ybS5zZXRWYWx1ZXMuZ2V0VmFsdWUoKSkuYXJyYXk8YW55PigpLm1lcmdlKFt7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBhcnJQcm9wTmFtZVthcnJQcm9wTmFtZS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wLnZhbHVlXG4gICAgICAgICAgICAgICAgfV0pLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtLnNldFZhbHVlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2VbXT4oW3tcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGFyclByb3BOYW1lW2FyclByb3BOYW1lLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHByb3AudmFsdWVcbiAgICAgICAgICAgICAgICB9XSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaW5kZXhQcm9wTmFtZSsrO1xuICAgICAgICB9IHdoaWxlIChpbmRleFByb3BOYW1lIDwgYXJyUHJvcE5hbWUubGVuZ3RoIC0gMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgZm9ybUFycmF5LmNvbnRyb2xzLnZhbHVlcygpKSB7XG4gICAgICAgICAgaWYgKGNvbnRyb2wuZ2V0KCduYW1lJykudmFsdWUgPT09IHByb3AubmFtZSkge1xuICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUocHJvcC52YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldENvbmZpZ0R5bmFtaWNGb3JtKG5ld0Zvcm1Hcm91cDogRm9ybUdyb3VwKSB7XG4gICAgaWYgKHRoaXMuc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZykge1xuICAgICAgY29uc3QgdmFsdWUgPSBuZXdGb3JtR3JvdXAuZ2V0KCd2YWx1ZScpLnZhbHVlO1xuICAgICAgY29uc3QgY29uZmlncyA9IHRoaXMuc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbmZpZyA9PiBjb25maWcubmFtZUZpZWxkID09PSBuZXdGb3JtR3JvdXAuZ2V0KCduYW1lJykudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KGNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5mblNob3codmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGNvbmZpZ3MpIHtcbiAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgIGlmIChjb25maWcuZHluYW1pY0Zvcm1Db25maWcgJiYgY29uZmlnLmZuU2hvdyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xEeW5hbWljRm9ybUNvbmZpZyA9IHRoaXMuY29udHJvbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udHJvbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZChjb250cm9sID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZmllbGRzVG9TaG93LmluZGV4T2YoY29udHJvbC5nZXQoJ25hbWUnKS52YWx1ZSkgPj0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBkeW5hbWljRm9ybUNvbmZpZ1N1YmplY3QgPSBjb250cm9sRHluYW1pY0Zvcm1Db25maWcuZ2V0KCdkeW5hbWljRm9ybUNvbmZpZycpLnZhbHVlIGFzIEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtQ29uZmlnSW50ZXJmYWNlPjtcbiAgICAgICAgICAgIGR5bmFtaWNGb3JtQ29uZmlnU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICAgICAgYXdhaXQgZGVsYXkoMSk7XG4gICAgICAgICAgICBkeW5hbWljRm9ybUNvbmZpZ1N1YmplY3QubmV4dChjb25maWcuZHluYW1pY0Zvcm1Db25maWcodmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5keW5hbWljRm9ybVNlcnZpY2Uuc2hvd0ZpZWxkcyhcbiAgICAgICAgICAgIHRoaXMuc2hvd0ZpZWxkcyxcbiAgICAgICAgICAgIGNvbmZpZy5maWVsZHNUb1Nob3csXG4gICAgICAgICAgICBjb25maWcuZm5TaG93KHZhbHVlKSxcbiAgICAgICAgICAgIGNvbmZpZy5jbGVhckN1cnJlbnRWYWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQXV0b2NvbXBsZXRlU2VsZWN0KHNlbGVjdGVkVmFsdWVzOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10sIHZhbHVlOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlKSB7XG4gICAgbGV0IGlzVmFsaWQgPSB0cnVlO1xuXG4gICAgZm9yIChjb25zdCBzZWxlY3RlZEl0ZW0gb2Ygc2VsZWN0ZWRWYWx1ZXMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChzZWxlY3RlZEl0ZW0ubmFtZSA9PT0gdmFsdWUubmFtZSkge1xuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG59XG4iXX0=