ngx-sp-infra 0.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 (200) hide show
  1. package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/2a/a3/eba6ea21e2e566c49202226aa3c1a4d439fa0a2c077374e48d864f20f5f804dbd931f042ddaa359fd35903a0bd3663a223e24dc11e1ec44501cc688a0a9c +1 -0
  2. package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/46/44/91b55887c08130e8014b3dbe56b69c0c29f4e127bceafcd610165f4c8e77fefa799ab68c415c1b45cc4fa114565650f3fc3c258e1dc7b792935cbee43fa7 +1 -0
  3. package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/7e/62/f8e6238b8f05aeaee2346bcaeda2226be7ab048d3b15e3dbbdf37170d9d7fade0fdfc6cc265d1ecc1b47509c962115d0d4b9a503907d6790c632e191001b +1 -0
  4. package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/8d/53/ad58764bc240411378ae1c47c0c20525da378a3b143795a11bc3fdbf6c9cde6fb2de6c3947d673d5872b9ce205d6274114b3b4dfd27609a636df7fd0b600 +1 -0
  5. package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/9e/70/9fc33090191a9df303901910a34f5d1cc7ea38ac92e21006bf923a814a4dffe9ad5b7357989f95d4e371cd00318c29339ec3e935832e84f3571ba0ed5f25 +1 -0
  6. package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/a1/3a/6a6f351adef4b7c8b7d643b092ca26e0ceeb2a285456285f866504493c9c7db8d420d3a4f282c699a11f2f9933c828c8f8388f28e96372408d7b456f32a1 +1 -0
  7. package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/d3/e3/2852d10551b620a4dfaabb1268bf0ac681e206bfb66451e18ac43a2e5c7cdc8a75291e3a1a4038129f3e40cc11317edffe8434d7110d9579585a25843e15 +1 -0
  8. package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/f2/ee/05ff4c2260f161b6295a8507440a1b86c0f666f313866e5bf1de6829ae5fe384d6612d732d09c815fe515bd3d6379ed5f8136cf4a4e228b322309840240e +1 -0
  9. package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/fe/15/fb0370939f075c14617e0d5fd8411f76edb53e439e19683e5c4554ae7cabd0387c922f6ec6893ced3321ed77df2c851b82eea6a70b38b7396f68493eea19 +1 -0
  10. package/.angular/cache/16.2.0/ng-packagr/index-v5/10/17/ae308ad3e0cad0afd27bf9eafe0177fdb23b463e70e0dd30d23c117517f6 +2 -0
  11. package/.angular/cache/16.2.0/ng-packagr/index-v5/14/18/88eabde022c32e7a38011f4ab6f7945e52f018be1abbe6a96864f8f9e22c +2 -0
  12. package/.angular/cache/16.2.0/ng-packagr/index-v5/1c/b7/dcd00bf2f1de70eab7d9e1d9601fbd87f49d46c7b49671d81ccd4b20b3f1 +2 -0
  13. package/.angular/cache/16.2.0/ng-packagr/index-v5/4b/31/217b5311dae6305f9b5dc82062276c77f272d61fc3e27c2df5eb0d6b1fb7 +2 -0
  14. package/.angular/cache/16.2.0/ng-packagr/index-v5/6a/b0/e5091f9ee02b3fcac9821e92cc5113d6b0593bd8bacfb5cbac7dfca306c3 +2 -0
  15. package/.angular/cache/16.2.0/ng-packagr/index-v5/9b/66/70a7c5990683795072c8b98eb25407b36f55f8efa8d2e0bdef67a8e989ab +2 -0
  16. package/.angular/cache/16.2.0/ng-packagr/index-v5/a6/8b/af2670adca8f5d06d3d9577ffad4449e4897eaf85de2f4e7f43f93934a16 +2 -0
  17. package/.angular/cache/16.2.0/ng-packagr/index-v5/da/da/502cfd37a0e9e7f413a569ccf28dc682f9e942ec5e460c93c1dd7c4e531f +3 -0
  18. package/.angular/cache/16.2.0/ng-packagr/index-v5/f3/8b/4e00bb8eddd473ae09b0b5dee39fa8416aee7b659a770d18c767e5027992 +2 -0
  19. package/.editorconfig +16 -0
  20. package/README.md +27 -0
  21. package/angular.json +41 -0
  22. package/dist/ngx-sp-infra/README.md +12 -0
  23. package/dist/ngx-sp-infra/esm2022/lib/infra.module.mjs +137 -0
  24. package/dist/ngx-sp-infra/esm2022/lib/message/alert/alert.component.mjs +32 -0
  25. package/dist/ngx-sp-infra/esm2022/lib/message/confirm/confirm.component.mjs +52 -0
  26. package/dist/ngx-sp-infra/esm2022/lib/message/confirm-modal/confirm-modal.component.mjs +72 -0
  27. package/dist/ngx-sp-infra/esm2022/lib/message/message-enum.mjs +23 -0
  28. package/dist/ngx-sp-infra/esm2022/lib/message/message.service.mjs +132 -0
  29. package/dist/ngx-sp-infra/esm2022/lib/message/save/save.component.mjs +46 -0
  30. package/dist/ngx-sp-infra/esm2022/lib/models/DownloadArquivos.mjs +3 -0
  31. package/dist/ngx-sp-infra/esm2022/lib/models/email-model.mjs +35 -0
  32. package/dist/ngx-sp-infra/esm2022/lib/models/ierror.mjs +2 -0
  33. package/dist/ngx-sp-infra/esm2022/lib/models/ipagination.mjs +2 -0
  34. package/dist/ngx-sp-infra/esm2022/lib/models/report-file.mjs +7 -0
  35. package/dist/ngx-sp-infra/esm2022/lib/models/ret-error.mjs +3 -0
  36. package/dist/ngx-sp-infra/esm2022/lib/models/ret-feedback-message.mjs +7 -0
  37. package/dist/ngx-sp-infra/esm2022/lib/models/ret-report-file.mjs +3 -0
  38. package/dist/ngx-sp-infra/esm2022/lib/pipes/cpf-cnpj.pipe.mjs +23 -0
  39. package/dist/ngx-sp-infra/esm2022/lib/pipes/currency.pipe.mjs +16 -0
  40. package/dist/ngx-sp-infra/esm2022/lib/pipes/to-url.pipe.mjs +32 -0
  41. package/dist/ngx-sp-infra/esm2022/lib/utils/check-url-and-method.service.mjs +70 -0
  42. package/dist/ngx-sp-infra/esm2022/lib/utils/form-utils.mjs +38 -0
  43. package/dist/ngx-sp-infra/esm2022/lib/utils/ip-service.service.mjs +22 -0
  44. package/dist/ngx-sp-infra/esm2022/lib/utils/settings.service.mjs +32 -0
  45. package/dist/ngx-sp-infra/esm2022/lib/utils/utils.mjs +335 -0
  46. package/dist/ngx-sp-infra/esm2022/lib/validators/cpf-cnpj.validator.directive.mjs +24 -0
  47. package/dist/ngx-sp-infra/esm2022/lib/validators/cpf-cnpj.validator.mjs +54 -0
  48. package/dist/ngx-sp-infra/esm2022/lib/widgets/breadcrumb/infra-breadcrumb/infra-breadcrumb.component.mjs +35 -0
  49. package/dist/ngx-sp-infra/esm2022/lib/widgets/breadcrumb/infra-breadcrumb-item/infra-breadcrumb-item.component.mjs +28 -0
  50. package/dist/ngx-sp-infra/esm2022/lib/widgets/breadcrumb/portalrh-breadcrumb/breadcrumb.component.mjs +21 -0
  51. package/dist/ngx-sp-infra/esm2022/lib/widgets/click-outside/clickoutside.directive.mjs +167 -0
  52. package/dist/ngx-sp-infra/esm2022/lib/widgets/combobox/combobox.component.mjs +545 -0
  53. package/dist/ngx-sp-infra/esm2022/lib/widgets/combobox/pipes/filter-by.pipe.mjs +44 -0
  54. package/dist/ngx-sp-infra/esm2022/lib/widgets/combobox/pipes/limit-to.pipe.mjs +19 -0
  55. package/dist/ngx-sp-infra/esm2022/lib/widgets/field-control-error/field-control-error.component.mjs +23 -0
  56. package/dist/ngx-sp-infra/esm2022/lib/widgets/field-error-message/field-error-message.component.mjs +33 -0
  57. package/dist/ngx-sp-infra/esm2022/lib/widgets/loading/loading.component.mjs +12 -0
  58. package/dist/ngx-sp-infra/esm2022/lib/widgets/loading-button/loading-button.component.mjs +15 -0
  59. package/dist/ngx-sp-infra/esm2022/lib/widgets/ordering/ordering.component.mjs +56 -0
  60. package/dist/ngx-sp-infra/esm2022/lib/widgets/svg-storage/svg-storage.component.mjs +94 -0
  61. package/dist/ngx-sp-infra/esm2022/lib/widgets/tree/models/ret-tree.mjs +3 -0
  62. package/dist/ngx-sp-infra/esm2022/lib/widgets/tree/models/tree-item.mjs +7 -0
  63. package/dist/ngx-sp-infra/esm2022/lib/widgets/tree/pipes/search-tree.pipe.mjs +17 -0
  64. package/dist/ngx-sp-infra/esm2022/lib/widgets/tree/tree.component.mjs +91 -0
  65. package/dist/ngx-sp-infra/esm2022/ngx-sp-infra.mjs +5 -0
  66. package/dist/ngx-sp-infra/esm2022/public-api.mjs +51 -0
  67. package/dist/ngx-sp-infra/fesm2022/ngx-sp-infra.mjs +2313 -0
  68. package/dist/ngx-sp-infra/fesm2022/ngx-sp-infra.mjs.map +1 -0
  69. package/dist/ngx-sp-infra/index.d.ts +5 -0
  70. package/dist/ngx-sp-infra/lib/infra.module.d.ts +32 -0
  71. package/dist/ngx-sp-infra/lib/message/alert/alert.component.d.ts +14 -0
  72. package/dist/ngx-sp-infra/lib/message/confirm/confirm.component.d.ts +22 -0
  73. package/dist/ngx-sp-infra/lib/message/confirm-modal/confirm-modal.component.d.ts +33 -0
  74. package/dist/ngx-sp-infra/lib/message/message-enum.d.ts +20 -0
  75. package/dist/ngx-sp-infra/lib/message/message.service.d.ts +31 -0
  76. package/dist/ngx-sp-infra/lib/message/save/save.component.d.ts +21 -0
  77. package/dist/ngx-sp-infra/lib/models/DownloadArquivos.d.ts +11 -0
  78. package/dist/ngx-sp-infra/lib/models/email-model.d.ts +30 -0
  79. package/dist/ngx-sp-infra/lib/models/ierror.d.ts +4 -0
  80. package/dist/ngx-sp-infra/lib/models/ipagination.d.ts +5 -0
  81. package/dist/ngx-sp-infra/lib/models/report-file.d.ts +4 -0
  82. package/dist/ngx-sp-infra/lib/models/ret-error.d.ts +5 -0
  83. package/dist/ngx-sp-infra/lib/models/ret-feedback-message.d.ts +7 -0
  84. package/dist/ngx-sp-infra/lib/models/ret-report-file.d.ts +7 -0
  85. package/dist/ngx-sp-infra/lib/pipes/cpf-cnpj.pipe.d.ts +7 -0
  86. package/dist/ngx-sp-infra/lib/pipes/currency.pipe.d.ts +7 -0
  87. package/dist/ngx-sp-infra/lib/pipes/to-url.pipe.d.ts +16 -0
  88. package/dist/ngx-sp-infra/lib/utils/check-url-and-method.service.d.ts +35 -0
  89. package/dist/ngx-sp-infra/lib/utils/form-utils.d.ts +7 -0
  90. package/dist/ngx-sp-infra/lib/utils/ip-service.service.d.ts +9 -0
  91. package/dist/ngx-sp-infra/lib/utils/settings.service.d.ts +9 -0
  92. package/dist/ngx-sp-infra/lib/utils/utils.d.ts +58 -0
  93. package/dist/ngx-sp-infra/lib/validators/cpf-cnpj.validator.d.ts +18 -0
  94. package/dist/ngx-sp-infra/lib/validators/cpf-cnpj.validator.directive.d.ts +7 -0
  95. package/dist/ngx-sp-infra/lib/widgets/breadcrumb/infra-breadcrumb/infra-breadcrumb.component.d.ts +29 -0
  96. package/dist/ngx-sp-infra/lib/widgets/breadcrumb/infra-breadcrumb-item/infra-breadcrumb-item.component.d.ts +14 -0
  97. package/dist/ngx-sp-infra/lib/widgets/breadcrumb/portalrh-breadcrumb/breadcrumb.component.d.ts +10 -0
  98. package/dist/ngx-sp-infra/lib/widgets/click-outside/clickoutside.directive.d.ts +40 -0
  99. package/dist/ngx-sp-infra/lib/widgets/combobox/combobox.component.d.ts +174 -0
  100. package/dist/ngx-sp-infra/lib/widgets/combobox/pipes/filter-by.pipe.d.ts +10 -0
  101. package/dist/ngx-sp-infra/lib/widgets/combobox/pipes/limit-to.pipe.d.ts +7 -0
  102. package/dist/ngx-sp-infra/lib/widgets/field-control-error/field-control-error.component.d.ts +12 -0
  103. package/dist/ngx-sp-infra/lib/widgets/field-error-message/field-error-message.component.d.ts +14 -0
  104. package/dist/ngx-sp-infra/lib/widgets/loading/loading.component.d.ts +6 -0
  105. package/dist/ngx-sp-infra/lib/widgets/loading-button/loading-button.component.d.ts +7 -0
  106. package/dist/ngx-sp-infra/lib/widgets/ordering/ordering.component.d.ts +18 -0
  107. package/dist/ngx-sp-infra/lib/widgets/svg-storage/svg-storage.component.d.ts +16 -0
  108. package/dist/ngx-sp-infra/lib/widgets/tree/models/ret-tree.d.ts +7 -0
  109. package/dist/ngx-sp-infra/lib/widgets/tree/models/tree-item.d.ts +11 -0
  110. package/dist/ngx-sp-infra/lib/widgets/tree/pipes/search-tree.pipe.d.ts +8 -0
  111. package/dist/ngx-sp-infra/lib/widgets/tree/tree.component.d.ts +20 -0
  112. package/dist/ngx-sp-infra/package.json +37 -0
  113. package/dist/ngx-sp-infra/public-api.d.ts +47 -0
  114. package/package.json +43 -0
  115. package/projects/ngx-sp-infra/README.md +12 -0
  116. package/projects/ngx-sp-infra/karma.conf.js +44 -0
  117. package/projects/ngx-sp-infra/ng-package.json +7 -0
  118. package/projects/ngx-sp-infra/package-lock.json +225 -0
  119. package/projects/ngx-sp-infra/package.json +18 -0
  120. package/projects/ngx-sp-infra/src/lib/infra.module.ts +85 -0
  121. package/projects/ngx-sp-infra/src/lib/message/alert/alert.component.html +6 -0
  122. package/projects/ngx-sp-infra/src/lib/message/alert/alert.component.scss +5 -0
  123. package/projects/ngx-sp-infra/src/lib/message/alert/alert.component.ts +39 -0
  124. package/projects/ngx-sp-infra/src/lib/message/confirm/confirm.component.html +15 -0
  125. package/projects/ngx-sp-infra/src/lib/message/confirm/confirm.component.scss +0 -0
  126. package/projects/ngx-sp-infra/src/lib/message/confirm/confirm.component.ts +52 -0
  127. package/projects/ngx-sp-infra/src/lib/message/confirm-modal/confirm-modal.component.html +39 -0
  128. package/projects/ngx-sp-infra/src/lib/message/confirm-modal/confirm-modal.component.scss +0 -0
  129. package/projects/ngx-sp-infra/src/lib/message/confirm-modal/confirm-modal.component.ts +73 -0
  130. package/projects/ngx-sp-infra/src/lib/message/message-enum.ts +21 -0
  131. package/projects/ngx-sp-infra/src/lib/message/message.service.ts +169 -0
  132. package/projects/ngx-sp-infra/src/lib/message/save/save.component.html +35 -0
  133. package/projects/ngx-sp-infra/src/lib/message/save/save.component.scss +110 -0
  134. package/projects/ngx-sp-infra/src/lib/message/save/save.component.ts +44 -0
  135. package/projects/ngx-sp-infra/src/lib/models/DownloadArquivos.ts +12 -0
  136. package/projects/ngx-sp-infra/src/lib/models/email-model.ts +33 -0
  137. package/projects/ngx-sp-infra/src/lib/models/ierror.ts +4 -0
  138. package/projects/ngx-sp-infra/src/lib/models/ipagination.ts +5 -0
  139. package/projects/ngx-sp-infra/src/lib/models/report-file.ts +4 -0
  140. package/projects/ngx-sp-infra/src/lib/models/ret-error.ts +6 -0
  141. package/projects/ngx-sp-infra/src/lib/models/ret-feedback-message.ts +8 -0
  142. package/projects/ngx-sp-infra/src/lib/models/ret-report-file.ts +8 -0
  143. package/projects/ngx-sp-infra/src/lib/pipes/cpf-cnpj.pipe.ts +21 -0
  144. package/projects/ngx-sp-infra/src/lib/pipes/currency.pipe.ts +13 -0
  145. package/projects/ngx-sp-infra/src/lib/pipes/to-url.pipe.ts +33 -0
  146. package/projects/ngx-sp-infra/src/lib/utils/check-url-and-method.service.ts +84 -0
  147. package/projects/ngx-sp-infra/src/lib/utils/form-utils.ts +50 -0
  148. package/projects/ngx-sp-infra/src/lib/utils/ip-service.service.ts +22 -0
  149. package/projects/ngx-sp-infra/src/lib/utils/settings.service.ts +32 -0
  150. package/projects/ngx-sp-infra/src/lib/utils/utils.ts +427 -0
  151. package/projects/ngx-sp-infra/src/lib/validators/cpf-cnpj.validator.directive.ts +14 -0
  152. package/projects/ngx-sp-infra/src/lib/validators/cpf-cnpj.validator.ts +74 -0
  153. package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/infra-breadcrumb/infra-breadcrumb.component.css +0 -0
  154. package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/infra-breadcrumb/infra-breadcrumb.component.html +3 -0
  155. package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/infra-breadcrumb/infra-breadcrumb.component.ts +34 -0
  156. package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/infra-breadcrumb-item/infra-breadcrumb-item.component.css +0 -0
  157. package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/infra-breadcrumb-item/infra-breadcrumb-item.component.html +1 -0
  158. package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/infra-breadcrumb-item/infra-breadcrumb-item.component.ts +29 -0
  159. package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/portalrh-breadcrumb/breadcrumb.component.css +0 -0
  160. package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/portalrh-breadcrumb/breadcrumb.component.html +5 -0
  161. package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/portalrh-breadcrumb/breadcrumb.component.ts +18 -0
  162. package/projects/ngx-sp-infra/src/lib/widgets/click-outside/clickoutside.directive.ts +183 -0
  163. package/projects/ngx-sp-infra/src/lib/widgets/combobox/combobox.component.html +40 -0
  164. package/projects/ngx-sp-infra/src/lib/widgets/combobox/combobox.component.scss +185 -0
  165. package/projects/ngx-sp-infra/src/lib/widgets/combobox/combobox.component.ts +637 -0
  166. package/projects/ngx-sp-infra/src/lib/widgets/combobox/combobox.service.ts +15 -0
  167. package/projects/ngx-sp-infra/src/lib/widgets/combobox/pipes/filter-by.pipe.ts +38 -0
  168. package/projects/ngx-sp-infra/src/lib/widgets/combobox/pipes/limit-to.pipe.ts +13 -0
  169. package/projects/ngx-sp-infra/src/lib/widgets/field-control-error/field-control-error.component.css +0 -0
  170. package/projects/ngx-sp-infra/src/lib/widgets/field-control-error/field-control-error.component.html +4 -0
  171. package/projects/ngx-sp-infra/src/lib/widgets/field-control-error/field-control-error.component.ts +18 -0
  172. package/projects/ngx-sp-infra/src/lib/widgets/field-error-message/field-error-message.component.css +0 -0
  173. package/projects/ngx-sp-infra/src/lib/widgets/field-error-message/field-error-message.component.html +4 -0
  174. package/projects/ngx-sp-infra/src/lib/widgets/field-error-message/field-error-message.component.ts +35 -0
  175. package/projects/ngx-sp-infra/src/lib/widgets/loading/loading.component.css +7 -0
  176. package/projects/ngx-sp-infra/src/lib/widgets/loading/loading.component.html +4 -0
  177. package/projects/ngx-sp-infra/src/lib/widgets/loading/loading.component.ts +12 -0
  178. package/projects/ngx-sp-infra/src/lib/widgets/loading-button/loading-button.component.css +3 -0
  179. package/projects/ngx-sp-infra/src/lib/widgets/loading-button/loading-button.component.html +2 -0
  180. package/projects/ngx-sp-infra/src/lib/widgets/loading-button/loading-button.component.ts +13 -0
  181. package/projects/ngx-sp-infra/src/lib/widgets/ordering/ordering.component.html +23 -0
  182. package/projects/ngx-sp-infra/src/lib/widgets/ordering/ordering.component.scss +0 -0
  183. package/projects/ngx-sp-infra/src/lib/widgets/ordering/ordering.component.ts +50 -0
  184. package/projects/ngx-sp-infra/src/lib/widgets/svg-storage/svg-storage.component.html +728 -0
  185. package/projects/ngx-sp-infra/src/lib/widgets/svg-storage/svg-storage.component.scss +0 -0
  186. package/projects/ngx-sp-infra/src/lib/widgets/svg-storage/svg-storage.component.ts +105 -0
  187. package/projects/ngx-sp-infra/src/lib/widgets/tree/README.md +33 -0
  188. package/projects/ngx-sp-infra/src/lib/widgets/tree/models/ret-tree.ts +8 -0
  189. package/projects/ngx-sp-infra/src/lib/widgets/tree/models/tree-item.ts +11 -0
  190. package/projects/ngx-sp-infra/src/lib/widgets/tree/pipes/search-tree.pipe.ts +15 -0
  191. package/projects/ngx-sp-infra/src/lib/widgets/tree/tree.component.html +51 -0
  192. package/projects/ngx-sp-infra/src/lib/widgets/tree/tree.component.scss +57 -0
  193. package/projects/ngx-sp-infra/src/lib/widgets/tree/tree.component.ts +88 -0
  194. package/projects/ngx-sp-infra/src/public-api.ts +58 -0
  195. package/projects/ngx-sp-infra/src/test.ts +15 -0
  196. package/projects/ngx-sp-infra/tsconfig.lib.json +15 -0
  197. package/projects/ngx-sp-infra/tsconfig.lib.prod.json +10 -0
  198. package/projects/ngx-sp-infra/tsconfig.spec.json +17 -0
  199. package/sp-ng-infra-0.0.0.tgz +0 -0
  200. package/tsconfig.json +42 -0
@@ -0,0 +1,545 @@
1
+ import { Component, Input, EventEmitter, Output, HostListener, ViewChildren, forwardRef } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { FilterByPipe } from './pipes/filter-by.pipe';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "@angular/forms";
7
+ import * as i3 from "./pipes/filter-by.pipe";
8
+ import * as i4 from "./pipes/limit-to.pipe";
9
+ export class ComboboxComponent {
10
+ get value() {
11
+ return this._value;
12
+ }
13
+ set value(val) {
14
+ this._value = val;
15
+ this.onChange(val);
16
+ this.onTouched();
17
+ }
18
+ constructor(cdref, _elementRef) {
19
+ this.cdref = cdref;
20
+ this._elementRef = _elementRef;
21
+ /**
22
+ * Get the required inputs
23
+ */
24
+ this.options = [];
25
+ /**
26
+ * configuration options
27
+ */
28
+ this.config = {};
29
+ /**
30
+ * Whether multiple selection or single selection allowed
31
+ */
32
+ this.multiple = false;
33
+ /**
34
+ * change event when value changes to provide user to handle things in change event
35
+ */
36
+ this.change = new EventEmitter();
37
+ /**
38
+ * The search text change event emitter emitted when user type in the search input
39
+ */
40
+ this.searchChange = new EventEmitter();
41
+ /**
42
+ * Event emitted when dropdown is open.
43
+ */
44
+ this.open = new EventEmitter();
45
+ /**
46
+ * Event emitted when dropdown is open.
47
+ */
48
+ this.close = new EventEmitter();
49
+ /**
50
+ * Toogle the dropdown list
51
+ */
52
+ this.toggleDropdown = false;
53
+ /**
54
+ * Available items for selection
55
+ */
56
+ this.availableItems = [];
57
+ /**
58
+ * Selected Items
59
+ */
60
+ this.selectedItems = [];
61
+ /**
62
+ * Selection text to be Displayed
63
+ */
64
+ this.selectedDisplayText = '-';
65
+ /**
66
+ * variable to track if clicked inside or outside of component
67
+ */
68
+ this.clickedInside = false;
69
+ /**
70
+ * variable to track keypress event inside and outsid of component
71
+ */
72
+ this.insideKeyPress = false;
73
+ /**
74
+ * element to show not found text when not itmes match the search
75
+ */
76
+ this.showNotFound = false;
77
+ this.onChange = () => {
78
+ // empty
79
+ };
80
+ this.onTouched = () => {
81
+ // empty
82
+ };
83
+ this.multiple = false;
84
+ }
85
+ /**
86
+ * click listener for host inside this component i.e
87
+ * if many instances are there, this detects if clicked inside
88
+ * this instance
89
+ */
90
+ clickInsideComponent() {
91
+ this.clickedInside = true;
92
+ }
93
+ blur() {
94
+ this.toggleDropdown = false;
95
+ }
96
+ focus() {
97
+ /* istanbul ignore else */
98
+ if (!this.disabled) {
99
+ this.toggleSelectDropdown();
100
+ }
101
+ }
102
+ /**
103
+ * click handler on documnent to hide the open dropdown if clicked outside
104
+ */
105
+ clickOutsideComponent() {
106
+ /* istanbul ignore else */
107
+ if (!this.clickedInside) {
108
+ this.toggleDropdown = false;
109
+ this.resetArrowKeyActiveElement();
110
+ // clear searh on close
111
+ this.searchText = undefined;
112
+ this.close.emit();
113
+ }
114
+ this.clickedInside = false;
115
+ }
116
+ /**
117
+ * click handler on documnent to hide the open dropdown if clicked outside
118
+ */
119
+ KeyPressOutsideComponent() {
120
+ /* istanbul ignore else */
121
+ if (!this.insideKeyPress) {
122
+ this.toggleDropdown = false;
123
+ this.resetArrowKeyActiveElement();
124
+ }
125
+ this.insideKeyPress = false;
126
+ }
127
+ /**
128
+ * Event handler for key up and down event and enter press for selecting element
129
+ */
130
+ handleKeyboardEvent($event) {
131
+ this.insideKeyPress = true;
132
+ /* istanbul ignore else */
133
+ if ($event.keyCode === 27 || this.disabled) {
134
+ this.toggleDropdown = false;
135
+ this.insideKeyPress = false;
136
+ return;
137
+ }
138
+ const avaOpts = this.availableOptions.toArray();
139
+ /* istanbul ignore else */
140
+ if ($event.keyCode !== 9 && avaOpts.length === 0 && !this.toggleDropdown) {
141
+ this.toggleDropdown = true;
142
+ }
143
+ // Arrow Down
144
+ /* istanbul ignore else */
145
+ if ($event.keyCode === 40 && avaOpts.length > 0) {
146
+ this.onArrowKeyDown();
147
+ /* istanbul ignore else */
148
+ if (this.focusedItemIndex >= avaOpts.length) {
149
+ this.focusedItemIndex = 0;
150
+ }
151
+ avaOpts[this.focusedItemIndex].nativeElement.focus();
152
+ $event.preventDefault();
153
+ }
154
+ // Arrow Up
155
+ /* istanbul ignore else */
156
+ if ($event.keyCode === 38 && avaOpts.length) {
157
+ this.onArrowKeyUp();
158
+ /* istanbul ignore else */
159
+ if (this.focusedItemIndex >= avaOpts.length) {
160
+ this.focusedItemIndex = avaOpts.length - 1;
161
+ }
162
+ avaOpts[this.focusedItemIndex].nativeElement.focus();
163
+ $event.preventDefault();
164
+ }
165
+ // Enter
166
+ /* istanbul ignore else */
167
+ if ($event.keyCode === 13 && this.focusedItemIndex !== null) {
168
+ const filteredItems = new FilterByPipe().transform(this.availableItems, this.searchText, this.config.searchOnKey);
169
+ this.selectItem(filteredItems[this.focusedItemIndex], this.availableItems.indexOf(filteredItems[this.focusedItemIndex]));
170
+ return false;
171
+ }
172
+ return $event.key;
173
+ }
174
+ /**
175
+ * Component onInit
176
+ */
177
+ ngOnInit() {
178
+ /* istanbul ignore else */
179
+ if (typeof this.options !== 'undefined' && Array.isArray(this.options)) {
180
+ this.availableItems = [
181
+ ...this.options.sort(this.config.customComparator),
182
+ ];
183
+ this.initDropdownValuesAndOptions();
184
+ }
185
+ }
186
+ /**
187
+ * after view init to subscribe to available option changes
188
+ */
189
+ ngAfterViewInit() {
190
+ this.availableOptions.changes.subscribe(this.setNotFoundState.bind(this));
191
+ }
192
+ registerOnChange(fn) {
193
+ this.onChange = fn;
194
+ }
195
+ registerOnTouched(fn) {
196
+ this.onTouched = fn;
197
+ }
198
+ setDisabledState(isDisabled) {
199
+ this.disabled = isDisabled;
200
+ }
201
+ writeValue(value, internal) {
202
+ if (value) {
203
+ if (Array.isArray(value)) {
204
+ if (this.multiple) {
205
+ this.value = value;
206
+ }
207
+ else if (value.length > 0) {
208
+ this.value = value[0];
209
+ }
210
+ }
211
+ else {
212
+ this.value = value;
213
+ }
214
+ /* istanbul ignore else */
215
+ if (this.selectedItems.length === 0) {
216
+ if (Array.isArray(value)) {
217
+ this.selectedItems = value;
218
+ }
219
+ else {
220
+ this.selectedItems.push(value);
221
+ }
222
+ this.initDropdownValuesAndOptions();
223
+ }
224
+ }
225
+ else {
226
+ this.value = [];
227
+ /* istanbul ignore else */
228
+ if (!internal) {
229
+ this.reset();
230
+ }
231
+ }
232
+ /* istanbul ignore else */
233
+ if (!internal) {
234
+ this.reset();
235
+ }
236
+ }
237
+ reset() {
238
+ this.selectedItems = [];
239
+ this.availableItems = [...this.options.sort(this.config.customComparator)];
240
+ this.initDropdownValuesAndOptions();
241
+ }
242
+ /**
243
+ * function sets whether to show items not found text or not
244
+ */
245
+ setNotFoundState() {
246
+ if (this.availableOptions.length === 0) {
247
+ this.showNotFound = true;
248
+ }
249
+ else {
250
+ this.showNotFound = false;
251
+ }
252
+ this.cdref.detectChanges();
253
+ }
254
+ /**
255
+ * Component onchage i.e when any of the input properties change
256
+ */
257
+ ngOnChanges(changes) {
258
+ this.selectedItems = [];
259
+ // this.searchText = null;
260
+ this.options = this.options || [];
261
+ /* istanbul ignore else */
262
+ if (changes['options']) {
263
+ this.availableItems = [
264
+ ...this.options.sort(this.config.customComparator),
265
+ ];
266
+ }
267
+ /* istanbul ignore else */
268
+ if (changes['value']) {
269
+ /* istanbul ignore else */
270
+ if (JSON.stringify(changes['value'].currentValue) === JSON.stringify([]) ||
271
+ changes['value'].currentValue === '' ||
272
+ changes['value'].currentValue === null) {
273
+ this.availableItems = [
274
+ ...this.options.sort(this.config.customComparator),
275
+ ];
276
+ }
277
+ }
278
+ this.initDropdownValuesAndOptions();
279
+ }
280
+ /**
281
+ * Deselct a selected items
282
+ * @param item: item to be deselected
283
+ * @param index: index of the item
284
+ */
285
+ deselectItem(item, index) {
286
+ this.selectedItems.forEach((element, i) => {
287
+ /* istanbul ignore else */
288
+ if (item === element) {
289
+ this.selectedItems.splice(i, 1);
290
+ }
291
+ });
292
+ let sortedItems = [...this.availableItems];
293
+ /* istanbul ignore else */
294
+ if (!this.availableItems.includes(item)) {
295
+ this.availableItems.push(item);
296
+ sortedItems = this.availableItems.sort(this.config.customComparator);
297
+ }
298
+ this.selectedItems = [...this.selectedItems];
299
+ this.availableItems = [...sortedItems];
300
+ /* istanbul ignore else */
301
+ if (!Array.isArray(this.value)) {
302
+ this.value = [];
303
+ }
304
+ this.valueChanged();
305
+ this.resetArrowKeyActiveElement();
306
+ }
307
+ /**
308
+ * Select an item
309
+ * @param item: item to be selected
310
+ * @param index: index of the item
311
+ */
312
+ selectItem(item, index) {
313
+ /* istanbul ignore else */
314
+ if (!this.multiple) {
315
+ /* istanbul ignore else */
316
+ if (this.selectedItems.length > 0) {
317
+ this.availableItems.push(this.selectedItems[0]);
318
+ }
319
+ this.selectedItems = [];
320
+ this.toggleDropdown = false;
321
+ }
322
+ this.availableItems.forEach((element, i) => {
323
+ /* istanbul ignore else */
324
+ if (item === element) {
325
+ this.selectedItems.push(item);
326
+ this.availableItems.splice(i, 1);
327
+ }
328
+ });
329
+ /* istanbul ignore else */
330
+ if (this.config.clearOnSelection) {
331
+ this.searchText = undefined;
332
+ }
333
+ this.selectedItems = [...this.selectedItems];
334
+ this.availableItems = [...this.availableItems];
335
+ this.selectedItems.sort(this.config.customComparator);
336
+ this.availableItems.sort(this.config.customComparator);
337
+ // this.searchText = null;
338
+ this.valueChanged();
339
+ this.resetArrowKeyActiveElement();
340
+ }
341
+ /**
342
+ * When selected items changes trigger the chaange back to parent
343
+ */
344
+ valueChanged() {
345
+ this.writeValue(this.selectedItems, true);
346
+ // this.valueChange.emit(this.value);
347
+ this.change.emit({ value: this.value });
348
+ this.setSelectedDisplayText();
349
+ }
350
+ /**
351
+ * Toggle the dropdownlist on/off
352
+ */
353
+ toggleSelectDropdown() {
354
+ this.toggleDropdown = !this.toggleDropdown;
355
+ if (this.toggleDropdown) {
356
+ this.open.emit();
357
+ }
358
+ else {
359
+ this.searchText = undefined;
360
+ this.close.emit();
361
+ }
362
+ this.resetArrowKeyActiveElement();
363
+ }
364
+ /**
365
+ * The change handler for search text
366
+ */
367
+ searchTextChanged() {
368
+ this.searchChange.emit(this.searchText);
369
+ }
370
+ changeSearchText($event) {
371
+ $event.stopPropagation();
372
+ }
373
+ /**
374
+ * initialize the config and other properties
375
+ */
376
+ initDropdownValuesAndOptions() {
377
+ const config = {
378
+ displayKey: 'description',
379
+ height: 'auto',
380
+ search: false,
381
+ placeholder: '-',
382
+ searchPlaceholder: 'Pesquisar ',
383
+ limitTo: 0,
384
+ customComparator: undefined,
385
+ noResultsFound: 'Nada encontrado!',
386
+ moreText: 'Selecionados',
387
+ searchOnKey: null,
388
+ clearOnSelection: false,
389
+ inputDirection: 'ltr',
390
+ };
391
+ /* istanbul ignore else */
392
+ if (this.config === 'undefined' || Object.keys(this.config).length === 0) {
393
+ this.config = { ...config };
394
+ }
395
+ for (const key of Object.keys(config)) {
396
+ this.config[key] = this.config[key] ? this.config[key] : config[key];
397
+ }
398
+ this.config = { ...this.config };
399
+ // Adding placeholder in config as default param
400
+ this.selectedDisplayText = this.config['placeholder'];
401
+ /* istanbul ignore else */
402
+ if (this.value !== '' && typeof this.value !== 'undefined') {
403
+ if (Array.isArray(this.value)) {
404
+ this.selectedItems = this.value;
405
+ }
406
+ else if (this.value !== '' && this.value !== null) {
407
+ this.selectedItems[0] = this.value;
408
+ }
409
+ else {
410
+ this.selectedItems = [];
411
+ this.value = [];
412
+ }
413
+ this.selectedItems.forEach((item) => {
414
+ const ind = this.availableItems.findIndex((aItem) => JSON.stringify(item) === JSON.stringify(aItem));
415
+ if (ind !== -1) {
416
+ this.availableItems.splice(ind, 1);
417
+ }
418
+ });
419
+ }
420
+ this.setSelectedDisplayText();
421
+ }
422
+ /**
423
+ * set the text to be displayed
424
+ */
425
+ setSelectedDisplayText() {
426
+ let text = this.selectedItems[0];
427
+ /* istanbul ignore else */
428
+ if (typeof this.selectedItems[0] === 'object') {
429
+ text = this.config.displayFn
430
+ ? this.config.displayFn(this.selectedItems[0])
431
+ : this.selectedItems[0][this.config.displayKey];
432
+ }
433
+ if (this.multiple && this.selectedItems.length > 0) {
434
+ this.selectedDisplayText =
435
+ this.selectedItems.length === 1
436
+ ? text
437
+ : text +
438
+ ` + ${this.selectedItems.length - 1} ${this.config.moreText}`;
439
+ }
440
+ else {
441
+ this.selectedDisplayText =
442
+ this.selectedItems.length === 0 ? this.config.placeholder : text;
443
+ }
444
+ }
445
+ /**
446
+ * Event handler for arrow key up event thats focuses on a item
447
+ */
448
+ onArrowKeyUp() {
449
+ /* istanbul ignore else */
450
+ if (this.focusedItemIndex === 0) {
451
+ this.focusedItemIndex = this.availableItems.length - 1;
452
+ return;
453
+ }
454
+ /* istanbul ignore else */
455
+ if (this.onArrowKey()) {
456
+ this.focusedItemIndex;
457
+ }
458
+ }
459
+ /**
460
+ * Event handler for arrow key down event thats focuses on a item
461
+ */
462
+ onArrowKeyDown() {
463
+ /* istanbul ignore else */
464
+ if (this.focusedItemIndex === this.availableItems.length - 1) {
465
+ this.focusedItemIndex = 0;
466
+ return;
467
+ }
468
+ /* istanbul ignore else */
469
+ if (this.onArrowKey()) {
470
+ this.focusedItemIndex++;
471
+ }
472
+ }
473
+ onArrowKey() {
474
+ /* istanbul ignore else */
475
+ if (this.focusedItemIndex === null) {
476
+ this.focusedItemIndex = 0;
477
+ return false;
478
+ }
479
+ return true;
480
+ }
481
+ /**
482
+ * will reset the element that is marked active using arrow keys
483
+ */
484
+ resetArrowKeyActiveElement() {
485
+ this.focusedItemIndex = null;
486
+ }
487
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: ComboboxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
488
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: ComboboxComponent, selector: "app-combobox", inputs: { _value: "_value", options: "options", config: "config", multiple: "multiple", disabled: "disabled" }, outputs: { change: "change", searchChange: "searchChange", open: "open", close: "close" }, host: { listeners: { "click": "clickInsideComponent()", "blur": "blur()", "focus": "focus()", "document:click": "clickOutsideComponent()", "document:keydown": "KeyPressOutsideComponent()", "keydown": "handleKeyboardEvent($event)" } }, providers: [
489
+ {
490
+ provide: NG_VALUE_ACCESSOR,
491
+ useExisting: forwardRef(() => ComboboxComponent),
492
+ multi: true,
493
+ },
494
+ ], viewQueries: [{ propertyName: "availableOptions", predicate: ["availableOption"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ngx-dropdown-container\" tabindex=\"0\">\n <button type=\"button\" tabindex=\"-1\" class=\"ngx-dropdown-button\" [ngClass]=\"{ 'ngx-disabled': disabled }\"\n [disabled]=\"disabled\" (click)=\"toggleSelectDropdown()\">\n <span class=\"display-text\">{{ selectedDisplayText }} </span>\n <span class=\"nsdicon-angle-down\"></span>\n </button>\n <div class=\"ngx-dropdown-list-container scroll-y\" *ngIf=\"toggleDropdown\" [style.maxHeight]=\"config.height\">\n <div class=\"search-container d-flex justify-content-between\" *ngIf=\"config.search\">\n <input (change)=\"changeSearchText($event)\" [style.direction]=\"config.inputDirection\" name=\"search-text\"\n (input)=\"searchTextChanged()\" [(ngModel)]=\"searchText\" tabindex=\"-1\" autocomplete=\"off\" />\n <label [ngClass]=\"{ active: searchText }\">\n <span class=\"nsdicon-search\"></span>\n {{ config.searchPlaceholder }}</label>\n </div>\n <ul class=\"selected-items\">\n <li class=\"d-flex flex-row\" tabindex=\"-1\" *ngFor=\"let selected of selectedItems; let i = index\"\n (click)=\"deselectItem(selected, i)\">\n <input type=\"checkbox\" class=\"form-check nsdicon-close me-2\" checked=\"true\">\n <div style=\"margin-top: 2px;\">{{\n config.displayFn\n ? config.displayFn(selected)\n : selected[config.displayKey] || selected\n }}</div>\n </li>\n </ul>\n <hr *ngIf=\"selectedItems.length > 0 && availableItems.length > 0\" />\n <ul class=\"available-items\">\n <li class=\"d-flex flex-row\" #availableOption *ngFor=\"let item of availableItems | filterBy: searchText: config.searchOnKey\n\t\t\t| limitTo: config.limitTo; let i = index\" tabindex=\"-1\"\n [ngClass]=\"{ active: focusedItemIndex == i && !item.disabled, disabled: item.disabled }\"\n (click)=\"selectItem(item, i)\">\n <input type=\"checkbox\" class=\"form-check nsdicon-close me-2\">\n <div style=\"margin-top: 2px;\">\n {{ config.displayFn ? config.displayFn(item) : item[config.displayKey] || item }}\n </div>\n </li>\n <li *ngIf=\"showNotFound\">{{ config.noResultsFound }}</li>\n </ul>\n </div>\n</div>\n", styles: [".ngx-dropdown-container{width:100%;position:relative}.ngx-dropdown-container button{display:inline-block;margin-bottom:0;font-weight:400;line-height:1.42857143;vertical-align:middle;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;user-select:none;border:1px solid #ccc;border-radius:4px;color:#333;background-color:#fff;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;text-align:left}.ngx-dropdown-container button span{display:inline;vertical-align:middle}.ngx-dropdown-container button .nsdicon-angle-down{right:5px;position:relative;float:right}.ngx-dropdown-container button .nsdicon-angle-down:before{border-style:solid;border-width:.1em .1em 0 0;content:\"\";display:inline-block;height:10px;position:relative;vertical-align:text-top;width:10px;top:0;transform:rotate(135deg)}.ngx-dropdown-container .ngx-dropdown-button{width:100%;min-height:30px;padding:5px 10px;background-color:#fff}.ngx-dropdown-container .ngx-dropdown-button .display-text{display:inline-block;width:calc(100% - 20px)}.ngx-dropdown-container .ngx-dropdown-list-container{box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:4px;padding-left:10px;padding-right:10px;z-index:999999999;width:100%;background-clip:padding-box;background:white;position:absolute;box-shadow:5px 5px 5px #00000036;overflow-y:auto}.ngx-dropdown-container .ngx-dropdown-list-container .search-container{position:relative;padding-top:10px;margin-top:5px}.ngx-dropdown-container .ngx-dropdown-list-container .search-container input{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:2rem;width:100%;font-size:13px;margin:0;padding:0;box-shadow:none;box-sizing:content-box;transition:all .3s}.ngx-dropdown-container .ngx-dropdown-list-container .search-container input:focus{border-bottom:1px solid #007bff}.ngx-dropdown-container .ngx-dropdown-list-container .search-container input:focus+label{transform:translateY(-2px) scale(.8);transform-origin:0 0}.ngx-dropdown-container .ngx-dropdown-list-container .search-container label{color:#9e9e9e;position:absolute;top:0;left:0;height:100%;font-size:1rem;cursor:text;transition:transform .2s ease-out;transform-origin:0% 100%;text-align:initial;transform:translateY(12px);pointer-events:none}.ngx-dropdown-container .ngx-dropdown-list-container .search-container label.active{transform:translateY(-2px) scale(.8);transform-origin:0 0}.ngx-dropdown-container .ngx-dropdown-list-container ul{margin-top:1rem;margin-bottom:1rem;list-style-type:none;padding-left:0}.ngx-dropdown-container .ngx-dropdown-list-container ul.selected-items li{margin-bottom:2px}.ngx-dropdown-container .ngx-dropdown-list-container ul.selected-items li .nsdicon-close{accent-color:#007bff;font-weight:700;font-size:large}.ngx-dropdown-container .ngx-dropdown-list-container ul.available-items li.active{background-color:#337ab7;color:#fff}.ngx-dropdown-container .ngx-dropdown-list-container ul li{font-size:inherit;cursor:pointer;display:block;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:normal}.ngx-dropdown-container .ngx-disabled{pointer-events:none;background-color:#e9ecef;opacity:1;cursor:no-drop}.scroll-y{max-width:300px;overflow-y:scroll;overflow-x:hidden}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i3.FilterByPipe, name: "filterBy" }, { kind: "pipe", type: i4.LimitToPipe, name: "limitTo" }] }); }
495
+ }
496
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: ComboboxComponent, decorators: [{
497
+ type: Component,
498
+ args: [{ selector: 'app-combobox', providers: [
499
+ {
500
+ provide: NG_VALUE_ACCESSOR,
501
+ useExisting: forwardRef(() => ComboboxComponent),
502
+ multi: true,
503
+ },
504
+ ], template: "<div class=\"ngx-dropdown-container\" tabindex=\"0\">\n <button type=\"button\" tabindex=\"-1\" class=\"ngx-dropdown-button\" [ngClass]=\"{ 'ngx-disabled': disabled }\"\n [disabled]=\"disabled\" (click)=\"toggleSelectDropdown()\">\n <span class=\"display-text\">{{ selectedDisplayText }} </span>\n <span class=\"nsdicon-angle-down\"></span>\n </button>\n <div class=\"ngx-dropdown-list-container scroll-y\" *ngIf=\"toggleDropdown\" [style.maxHeight]=\"config.height\">\n <div class=\"search-container d-flex justify-content-between\" *ngIf=\"config.search\">\n <input (change)=\"changeSearchText($event)\" [style.direction]=\"config.inputDirection\" name=\"search-text\"\n (input)=\"searchTextChanged()\" [(ngModel)]=\"searchText\" tabindex=\"-1\" autocomplete=\"off\" />\n <label [ngClass]=\"{ active: searchText }\">\n <span class=\"nsdicon-search\"></span>\n {{ config.searchPlaceholder }}</label>\n </div>\n <ul class=\"selected-items\">\n <li class=\"d-flex flex-row\" tabindex=\"-1\" *ngFor=\"let selected of selectedItems; let i = index\"\n (click)=\"deselectItem(selected, i)\">\n <input type=\"checkbox\" class=\"form-check nsdicon-close me-2\" checked=\"true\">\n <div style=\"margin-top: 2px;\">{{\n config.displayFn\n ? config.displayFn(selected)\n : selected[config.displayKey] || selected\n }}</div>\n </li>\n </ul>\n <hr *ngIf=\"selectedItems.length > 0 && availableItems.length > 0\" />\n <ul class=\"available-items\">\n <li class=\"d-flex flex-row\" #availableOption *ngFor=\"let item of availableItems | filterBy: searchText: config.searchOnKey\n\t\t\t| limitTo: config.limitTo; let i = index\" tabindex=\"-1\"\n [ngClass]=\"{ active: focusedItemIndex == i && !item.disabled, disabled: item.disabled }\"\n (click)=\"selectItem(item, i)\">\n <input type=\"checkbox\" class=\"form-check nsdicon-close me-2\">\n <div style=\"margin-top: 2px;\">\n {{ config.displayFn ? config.displayFn(item) : item[config.displayKey] || item }}\n </div>\n </li>\n <li *ngIf=\"showNotFound\">{{ config.noResultsFound }}</li>\n </ul>\n </div>\n</div>\n", styles: [".ngx-dropdown-container{width:100%;position:relative}.ngx-dropdown-container button{display:inline-block;margin-bottom:0;font-weight:400;line-height:1.42857143;vertical-align:middle;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;user-select:none;border:1px solid #ccc;border-radius:4px;color:#333;background-color:#fff;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;text-align:left}.ngx-dropdown-container button span{display:inline;vertical-align:middle}.ngx-dropdown-container button .nsdicon-angle-down{right:5px;position:relative;float:right}.ngx-dropdown-container button .nsdicon-angle-down:before{border-style:solid;border-width:.1em .1em 0 0;content:\"\";display:inline-block;height:10px;position:relative;vertical-align:text-top;width:10px;top:0;transform:rotate(135deg)}.ngx-dropdown-container .ngx-dropdown-button{width:100%;min-height:30px;padding:5px 10px;background-color:#fff}.ngx-dropdown-container .ngx-dropdown-button .display-text{display:inline-block;width:calc(100% - 20px)}.ngx-dropdown-container .ngx-dropdown-list-container{box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:4px;padding-left:10px;padding-right:10px;z-index:999999999;width:100%;background-clip:padding-box;background:white;position:absolute;box-shadow:5px 5px 5px #00000036;overflow-y:auto}.ngx-dropdown-container .ngx-dropdown-list-container .search-container{position:relative;padding-top:10px;margin-top:5px}.ngx-dropdown-container .ngx-dropdown-list-container .search-container input{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:2rem;width:100%;font-size:13px;margin:0;padding:0;box-shadow:none;box-sizing:content-box;transition:all .3s}.ngx-dropdown-container .ngx-dropdown-list-container .search-container input:focus{border-bottom:1px solid #007bff}.ngx-dropdown-container .ngx-dropdown-list-container .search-container input:focus+label{transform:translateY(-2px) scale(.8);transform-origin:0 0}.ngx-dropdown-container .ngx-dropdown-list-container .search-container label{color:#9e9e9e;position:absolute;top:0;left:0;height:100%;font-size:1rem;cursor:text;transition:transform .2s ease-out;transform-origin:0% 100%;text-align:initial;transform:translateY(12px);pointer-events:none}.ngx-dropdown-container .ngx-dropdown-list-container .search-container label.active{transform:translateY(-2px) scale(.8);transform-origin:0 0}.ngx-dropdown-container .ngx-dropdown-list-container ul{margin-top:1rem;margin-bottom:1rem;list-style-type:none;padding-left:0}.ngx-dropdown-container .ngx-dropdown-list-container ul.selected-items li{margin-bottom:2px}.ngx-dropdown-container .ngx-dropdown-list-container ul.selected-items li .nsdicon-close{accent-color:#007bff;font-weight:700;font-size:large}.ngx-dropdown-container .ngx-dropdown-list-container ul.available-items li.active{background-color:#337ab7;color:#fff}.ngx-dropdown-container .ngx-dropdown-list-container ul li{font-size:inherit;cursor:pointer;display:block;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:normal}.ngx-dropdown-container .ngx-disabled{pointer-events:none;background-color:#e9ecef;opacity:1;cursor:no-drop}.scroll-y{max-width:300px;overflow-y:scroll;overflow-x:hidden}\n"] }]
505
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { _value: [{
506
+ type: Input
507
+ }], options: [{
508
+ type: Input
509
+ }], config: [{
510
+ type: Input
511
+ }], multiple: [{
512
+ type: Input
513
+ }], disabled: [{
514
+ type: Input
515
+ }], change: [{
516
+ type: Output
517
+ }], searchChange: [{
518
+ type: Output
519
+ }], open: [{
520
+ type: Output
521
+ }], close: [{
522
+ type: Output
523
+ }], availableOptions: [{
524
+ type: ViewChildren,
525
+ args: ['availableOption']
526
+ }], clickInsideComponent: [{
527
+ type: HostListener,
528
+ args: ['click']
529
+ }], blur: [{
530
+ type: HostListener,
531
+ args: ['blur']
532
+ }], focus: [{
533
+ type: HostListener,
534
+ args: ['focus']
535
+ }], clickOutsideComponent: [{
536
+ type: HostListener,
537
+ args: ['document:click']
538
+ }], KeyPressOutsideComponent: [{
539
+ type: HostListener,
540
+ args: ['document:keydown']
541
+ }], handleKeyboardEvent: [{
542
+ type: HostListener,
543
+ args: ['keydown', ['$event']]
544
+ }] } });
545
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNwLWluZnJhL3NyYy9saWIvd2lkZ2V0cy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3AtaW5mcmEvc3JjL2xpYi93aWRnZXRzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixTQUFTLEVBQVUsS0FBSyxFQUN4QixZQUFZLEVBQ1osTUFBTSxFQUNOLFlBQVksRUFHWixZQUFZLEVBS1osVUFBVSxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7O0FBZXRELE1BQU0sT0FBTyxpQkFBaUI7SUFnRzdCLElBQUksS0FBSztRQUNSLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUcsR0FBRztRQUNkLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUUsR0FBRyxDQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxZQUNTLEtBQXdCLEVBQ3pCLFdBQXVCO1FBRHRCLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ3pCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBdEcvQjs7V0FFRztRQUNhLFlBQU8sR0FBUSxFQUFFLENBQUM7UUFFbEM7O1dBRUc7UUFDYSxXQUFNLEdBQVEsRUFBRSxDQUFDO1FBRWpDOztXQUVHO1FBQ2EsYUFBUSxHQUFHLEtBQUssQ0FBQztRQU9qQzs7V0FFRztRQUNjLFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVoRTs7V0FFRztRQUNjLGlCQUFZLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFdEU7O1dBRUc7UUFDYyxTQUFJLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFOUQ7O1dBRUc7UUFDYyxVQUFLLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFL0Q7O1dBRUc7UUFDSSxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUU5Qjs7V0FFRztRQUNJLG1CQUFjLEdBQVEsRUFBRSxDQUFDO1FBRWhDOztXQUVHO1FBQ0ksa0JBQWEsR0FBUSxFQUFFLENBQUM7UUFFL0I7O1dBRUc7UUFDSSx3QkFBbUIsR0FBRyxHQUFHLENBQUM7UUFPakM7O1dBRUc7UUFDSSxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUU3Qjs7V0FFRztRQUNJLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBTzlCOztXQUVHO1FBRUksaUJBQVksR0FBRyxLQUFLLENBQUM7UUF1QnJCLGFBQVEsR0FBUSxHQUFHLEVBQUU7WUFDM0IsUUFBUTtRQUNULENBQUMsQ0FBQTtRQUNNLGNBQVMsR0FBUSxHQUFHLEVBQUU7WUFDNUIsUUFBUTtRQUNULENBQUMsQ0FBQTtRQVJBLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFTRDs7OztPQUlHO0lBRUksb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFOEIsSUFBSTtRQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBRStCLEtBQUs7UUFDcEMsMEJBQTBCO1FBQzFCLElBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUNuQjtZQUNDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1NBQzVCO0lBQ0YsQ0FBQztJQUNEOztPQUVHO0lBRUkscUJBQXFCO1FBQzNCLDBCQUEwQjtRQUMxQixJQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFDeEI7WUFDQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUM1QixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNsQyx1QkFBdUI7WUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNsQjtRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUVJLHdCQUF3QjtRQUM5QiwwQkFBMEI7UUFDMUIsSUFBSyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQ3pCO1lBQ0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDNUIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7U0FDbEM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBQ0Q7O09BRUc7SUFFSSxtQkFBbUIsQ0FBRyxNQUFxQjtRQUNqRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQiwwQkFBMEI7UUFDMUIsSUFBSyxNQUFNLENBQUMsT0FBTyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUMzQztZQUNDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzVCLE9BQU87U0FDUDtRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoRCwwQkFBMEI7UUFDMUIsSUFBSyxNQUFNLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQ3pFO1lBQ0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDM0I7UUFDRCxhQUFhO1FBQ2IsMEJBQTBCO1FBQzFCLElBQUssTUFBTSxDQUFDLE9BQU8sS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2hEO1lBQ0MsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLDBCQUEwQjtZQUMxQixJQUFLLElBQUksQ0FBQyxnQkFBaUIsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUM3QztnQkFDQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO2FBQzFCO1lBQ0QsT0FBTyxDQUFFLElBQUksQ0FBQyxnQkFBaUIsQ0FBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4RCxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDeEI7UUFDRCxXQUFXO1FBQ1gsMEJBQTBCO1FBQzFCLElBQUssTUFBTSxDQUFDLE9BQU8sS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sRUFDNUM7WUFDQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsMEJBQTBCO1lBQzFCLElBQUssSUFBSSxDQUFDLGdCQUFpQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQzdDO2dCQUNDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUMzQztZQUNELE9BQU8sQ0FBRSxJQUFJLENBQUMsZ0JBQWlCLENBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEQsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3hCO1FBQ0QsUUFBUTtRQUNSLDBCQUEwQjtRQUMxQixJQUFLLE1BQU0sQ0FBQyxPQUFPLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLEVBQzVEO1lBQ0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQ2pELElBQUksQ0FBQyxjQUFjLEVBQ25CLElBQUksQ0FBQyxVQUFXLEVBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUN2QixDQUFDO1lBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FDZCxhQUFhLENBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFFLEVBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFFLGFBQWEsQ0FBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUUsQ0FBRSxDQUNyRSxDQUFDO1lBQ0YsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQTtJQUVsQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRO1FBQ2QsMEJBQTBCO1FBQzFCLElBQUssT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFdBQVcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUUsRUFDekU7WUFDQyxJQUFJLENBQUMsY0FBYyxHQUFHO2dCQUNyQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUU7YUFDcEQsQ0FBQztZQUNGLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1NBQ3BDO0lBQ0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZTtRQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBRSxDQUFFLENBQUM7SUFDL0UsQ0FBQztJQUVNLGdCQUFnQixDQUFHLEVBQU87UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVNLGlCQUFpQixDQUFHLEVBQU87UUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVNLGdCQUFnQixDQUFHLFVBQW1CO1FBQzVDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzVCLENBQUM7SUFFTSxVQUFVLENBQUcsS0FBVSxFQUFFLFFBQWtCO1FBQ2pELElBQUssS0FBSyxFQUNWO1lBQ0MsSUFBSyxLQUFLLENBQUMsT0FBTyxDQUFFLEtBQUssQ0FBRSxFQUMzQjtnQkFDQyxJQUFLLElBQUksQ0FBQyxRQUFRLEVBQ2xCO29CQUNDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2lCQUNuQjtxQkFBTSxJQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM1QjtvQkFDQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBRSxDQUFDLENBQUUsQ0FBQztpQkFDeEI7YUFDRDtpQkFDRDtnQkFDQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzthQUNuQjtZQUNELDBCQUEwQjtZQUMxQixJQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDcEM7Z0JBQ0MsSUFBSyxLQUFLLENBQUMsT0FBTyxDQUFFLEtBQUssQ0FBRSxFQUMzQjtvQkFDQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztpQkFDM0I7cUJBQ0Q7b0JBQ0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUUsS0FBSyxDQUFFLENBQUM7aUJBQ2pDO2dCQUNELElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2FBQ3BDO1NBQ0Q7YUFDRDtZQUNDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLDBCQUEwQjtZQUMxQixJQUFLLENBQUMsUUFBUSxFQUNkO2dCQUNDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNiO1NBQ0Q7UUFDRCwwQkFBMEI7UUFDMUIsSUFBSyxDQUFDLFFBQVEsRUFDZDtZQUNDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNiO0lBQ0YsQ0FBQztJQUVNLEtBQUs7UUFDWCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFFLENBQUUsQ0FBQztRQUMvRSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBQ0Q7O09BRUc7SUFDSSxnQkFBZ0I7UUFDdEIsSUFBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDdkM7WUFDQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztTQUN6QjthQUNEO1lBQ0MsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDMUI7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDRDs7T0FFRztJQUNJLFdBQVcsQ0FBRyxPQUFzQjtRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QiwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNsQywwQkFBMEI7UUFDMUIsSUFBSyxPQUFPLENBQUUsU0FBUyxDQUFFLEVBQ3pCO1lBQ0MsSUFBSSxDQUFDLGNBQWMsR0FBRztnQkFDckIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFFO2FBQ3BELENBQUM7U0FDRjtRQUNELDBCQUEwQjtRQUMxQixJQUFLLE9BQU8sQ0FBRSxPQUFPLENBQUUsRUFDdkI7WUFDQywwQkFBMEI7WUFDMUIsSUFDQyxJQUFJLENBQUMsU0FBUyxDQUFFLE9BQU8sQ0FBRSxPQUFPLENBQUUsQ0FBQyxZQUFZLENBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFFLEVBQUUsQ0FBRTtnQkFDMUUsT0FBTyxDQUFFLE9BQU8sQ0FBRSxDQUFDLFlBQVksS0FBSyxFQUFFO2dCQUN0QyxPQUFPLENBQUUsT0FBTyxDQUFFLENBQUMsWUFBWSxLQUFLLElBQUksRUFFekM7Z0JBQ0MsSUFBSSxDQUFDLGNBQWMsR0FBRztvQkFDckIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFFO2lCQUNwRCxDQUFDO2FBQ0Y7U0FDRDtRQUNELElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksWUFBWSxDQUFHLElBQVMsRUFBRSxLQUFhO1FBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFFLENBQUUsT0FBWSxFQUFFLENBQVMsRUFBRyxFQUFFO1lBQ3pELDBCQUEwQjtZQUMxQixJQUFLLElBQUksS0FBSyxPQUFPLEVBQ3JCO2dCQUNDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFFLENBQUMsRUFBRSxDQUFDLENBQUUsQ0FBQzthQUNsQztRQUNGLENBQUMsQ0FBRSxDQUFDO1FBQ0osSUFBSSxXQUFXLEdBQUcsQ0FBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUUsQ0FBQztRQUM3QywwQkFBMEI7UUFDMUIsSUFBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFFLElBQUksQ0FBRSxFQUMxQztZQUNDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBRSxDQUFDO1lBQ2pDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFFLENBQUM7U0FDdkU7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFFLEdBQUcsV0FBVyxDQUFFLENBQUM7UUFDekMsMEJBQTBCO1FBQzFCLElBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBQyxLQUFLLENBQUUsRUFDakM7WUFDQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztTQUNoQjtRQUNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFVBQVUsQ0FBRyxJQUFZLEVBQUUsS0FBYztRQUMvQywwQkFBMEI7UUFDMUIsSUFBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQ25CO1lBQ0MsMEJBQTBCO1lBQzFCLElBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNsQztnQkFDQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsYUFBYSxDQUFFLENBQUMsQ0FBRSxDQUFFLENBQUM7YUFDcEQ7WUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztTQUM1QjtRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFFLENBQUUsT0FBWSxFQUFFLENBQVMsRUFBRyxFQUFFO1lBQzFELDBCQUEwQjtZQUMxQixJQUFLLElBQUksS0FBSyxPQUFPLEVBQ3JCO2dCQUNDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQUM7YUFDbkM7UUFDRixDQUFDLENBQUUsQ0FBQztRQUVKLDBCQUEwQjtRQUMxQixJQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQ2pDO1lBQ0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7U0FDNUI7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFFLENBQUM7UUFDekQsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZO1FBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUUsQ0FBQztRQUM1QyxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUssSUFBSSxDQUFDLGNBQWMsRUFDeEI7WUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2pCO2FBQ0Q7WUFDQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRU0sZ0JBQWdCLENBQUcsTUFBVztRQUNwQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssNEJBQTRCO1FBQ25DLE1BQU0sTUFBTSxHQUFRO1lBQ25CLFVBQVUsRUFBRSxhQUFhO1lBQ3pCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsTUFBTSxFQUFFLEtBQUs7WUFDYixXQUFXLEVBQUUsR0FBRztZQUNoQixpQkFBaUIsRUFBRSxZQUFZO1lBQy9CLE9BQU8sRUFBRSxDQUFDO1lBQ1YsZ0JBQWdCLEVBQUUsU0FBUztZQUMzQixjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLFFBQVEsRUFBRSxjQUFjO1lBQ3hCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLGdCQUFnQixFQUFFLEtBQUs7WUFDdkIsY0FBYyxFQUFFLEtBQUs7U0FDckIsQ0FBQztRQUNGLDBCQUEwQjtRQUMxQixJQUFLLElBQUksQ0FBQyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQzNFO1lBQ0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7U0FDNUI7UUFDRCxLQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUUsTUFBTSxDQUFFLEVBQ3hDO1lBQ0MsSUFBSSxDQUFDLE1BQU0sQ0FBRSxHQUFHLENBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFFLEdBQUcsQ0FBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFFLEdBQUcsQ0FBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUUsR0FBRyxDQUFFLENBQUM7U0FDN0U7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDakMsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFFLGFBQWEsQ0FBRSxDQUFDO1FBQ3hELDBCQUEwQjtRQUMxQixJQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRSxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQzNEO1lBQ0MsSUFBSyxLQUFLLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBQyxLQUFLLENBQUUsRUFDaEM7Z0JBQ0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ2hDO2lCQUFNLElBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQ3BEO2dCQUNDLElBQUksQ0FBQyxhQUFhLENBQUUsQ0FBQyxDQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNyQztpQkFDRDtnQkFDQyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7YUFDaEI7WUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBRSxDQUFFLElBQVMsRUFBRyxFQUFFO2dCQUMzQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FDeEMsQ0FBRSxLQUFVLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUUsSUFBSSxDQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBRSxLQUFLLENBQUUsQ0FDcEUsQ0FBQztnQkFDRixJQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFDZjtvQkFDQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFFLENBQUM7aUJBQ3JDO1lBQ0YsQ0FBQyxDQUFFLENBQUM7U0FDSjtRQUNELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQjtRQUM3QixJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsYUFBYSxDQUFFLENBQUMsQ0FBRSxDQUFDO1FBQzNDLDBCQUEwQjtRQUMxQixJQUFLLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBRSxDQUFDLENBQUUsS0FBSyxRQUFRLEVBQ2hEO1lBQ0MsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFFLElBQUksQ0FBQyxhQUFhLENBQUUsQ0FBQyxDQUFFLENBQUU7Z0JBQ2xELENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFFLENBQUMsQ0FBRSxDQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFFLENBQUM7U0FDckQ7UUFDRCxJQUFLLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNuRDtZQUNDLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQzlCLENBQUMsQ0FBQyxJQUFJO29CQUNOLENBQUMsQ0FBQyxJQUFJO3dCQUNOLE1BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBRSxJQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUyxFQUFFLENBQUM7U0FDcEU7YUFDRDtZQUNDLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUNsRTtJQUNGLENBQUM7SUFFRDs7T0FFRztJQUNLLFlBQVk7UUFDbkIsMEJBQTBCO1FBQzFCLElBQUssSUFBSSxDQUFDLGdCQUFnQixLQUFLLENBQUMsRUFDaEM7WUFDQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELE9BQU87U0FDUDtRQUNELDBCQUEwQjtRQUMxQixJQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFDdEI7WUFDQyxJQUFJLENBQUMsZ0JBQWlCLENBQUM7U0FDdkI7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjO1FBQ3JCLDBCQUEwQjtRQUMxQixJQUFLLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzdEO1lBQ0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUMxQixPQUFPO1NBQ1A7UUFDRCwwQkFBMEI7UUFDMUIsSUFBSyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQ3RCO1lBQ0MsSUFBSSxDQUFDLGdCQUFpQixFQUFFLENBQUM7U0FDekI7SUFDRixDQUFDO0lBRU8sVUFBVTtRQUNqQiwwQkFBMEI7UUFDMUIsSUFBSyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUNuQztZQUNDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssMEJBQTBCO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQzs4R0E3bEJXLGlCQUFpQjtrR0FBakIsaUJBQWlCLDZkQVJsQjtZQUNWO2dCQUNDLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUUsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUU7Z0JBQ2xELEtBQUssRUFBRSxJQUFJO2FBQ1g7U0FDRCx1SkM1QkYsbXNFQXdDQTs7MkZEVmEsaUJBQWlCO2tCQVo3QixTQUFTOytCQUNDLGNBQWMsYUFHYjt3QkFDVjs0QkFDQyxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFFLEdBQUcsRUFBRSxrQkFBa0IsQ0FBRTs0QkFDbEQsS0FBSyxFQUFFLElBQUk7eUJBQ1g7cUJBQ0Q7aUlBS2UsTUFBTTtzQkFBckIsS0FBSztnQkFLVSxPQUFPO3NCQUF0QixLQUFLO2dCQUtVLE1BQU07c0JBQXJCLEtBQUs7Z0JBS1UsUUFBUTtzQkFBdkIsS0FBSztnQkFLVSxRQUFRO3NCQUF2QixLQUFLO2dCQUtXLE1BQU07c0JBQXRCLE1BQU07Z0JBS1UsWUFBWTtzQkFBNUIsTUFBTTtnQkFLVSxJQUFJO3NCQUFwQixNQUFNO2dCQUtVLEtBQUs7c0JBQXJCLE1BQU07Z0JBbURBLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBRSxpQkFBaUI7Z0JBZ0N6QixvQkFBb0I7c0JBRDFCLFlBQVk7dUJBQUUsT0FBTztnQkFLUyxJQUFJO3NCQUFsQyxZQUFZO3VCQUFFLE1BQU07Z0JBSVcsS0FBSztzQkFBcEMsWUFBWTt1QkFBRSxPQUFPO2dCQVdmLHFCQUFxQjtzQkFEM0IsWUFBWTt1QkFBRSxnQkFBZ0I7Z0JBa0J4Qix3QkFBd0I7c0JBRDlCLFlBQVk7dUJBQUUsa0JBQWtCO2dCQWMxQixtQkFBbUI7c0JBRHpCLFlBQVk7dUJBQUUsU0FBUyxFQUFFLENBQUUsUUFBUSxDQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q29tcG9uZW50LCBPbkluaXQsIElucHV0LFxuXHRFdmVudEVtaXR0ZXIsXG5cdE91dHB1dCxcblx0SG9zdExpc3RlbmVyLFxuXHRPbkNoYW5nZXMsXG5cdFNpbXBsZUNoYW5nZXMsXG5cdFZpZXdDaGlsZHJlbixcblx0RWxlbWVudFJlZixcblx0UXVlcnlMaXN0LFxuXHRBZnRlclZpZXdJbml0LFxuXHRDaGFuZ2VEZXRlY3RvclJlZixcblx0Zm9yd2FyZFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmlsdGVyQnlQaXBlIH0gZnJvbSAnLi9waXBlcy9maWx0ZXItYnkucGlwZSc7XG5cblxuQENvbXBvbmVudCgge1xuXHRzZWxlY3RvcjogJ2FwcC1jb21ib2JveCcsXG5cdHRlbXBsYXRlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG5cdHN0eWxlVXJsczogWyAnLi9jb21ib2JveC5jb21wb25lbnQuc2NzcycgXSxcblx0cHJvdmlkZXJzOiBbXG5cdFx0e1xuXHRcdFx0cHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG5cdFx0XHR1c2VFeGlzdGluZzogZm9yd2FyZFJlZiggKCkgPT4gQ29tYm9ib3hDb21wb25lbnQgKSxcblx0XHRcdG11bHRpOiB0cnVlLFxuXHRcdH0sXG5cdF1cbn0gKVxuZXhwb3J0IGNsYXNzIENvbWJvYm94Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuXG5cdC8qKiB2YWx1ZSBvZiB0aGUgZHJvcGRvd24gKi9cblx0QElucHV0KCkgcHVibGljIF92YWx1ZTogYW55O1xuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHJlcXVpcmVkIGlucHV0c1xuXHQgKi9cblx0QElucHV0KCkgcHVibGljIG9wdGlvbnM6IGFueSA9IFtdO1xuXG5cdC8qKlxuXHQgKiBjb25maWd1cmF0aW9uIG9wdGlvbnNcblx0ICovXG5cdEBJbnB1dCgpIHB1YmxpYyBjb25maWc6IGFueSA9IHt9O1xuXG5cdC8qKlxuXHQgKiBXaGV0aGVyIG11bHRpcGxlIHNlbGVjdGlvbiBvciBzaW5nbGUgc2VsZWN0aW9uIGFsbG93ZWRcblx0ICovXG5cdEBJbnB1dCgpIHB1YmxpYyBtdWx0aXBsZSA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBWYWx1ZVxuXHQgKi9cblx0QElucHV0KCkgcHVibGljIGRpc2FibGVkOiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBjaGFuZ2UgZXZlbnQgd2hlbiB2YWx1ZSBjaGFuZ2VzIHRvIHByb3ZpZGUgdXNlciB0byBoYW5kbGUgdGhpbmdzIGluIGNoYW5nZSBldmVudFxuXHQgKi9cblx0QE91dHB1dCgpIHB1YmxpYyBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBUaGUgc2VhcmNoIHRleHQgY2hhbmdlIGV2ZW50IGVtaXR0ZXIgZW1pdHRlZCB3aGVuIHVzZXIgdHlwZSBpbiB0aGUgc2VhcmNoIGlucHV0XG5cdCAqL1xuXHRAT3V0cHV0KCkgcHVibGljIHNlYXJjaENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBkcm9wZG93biBpcyBvcGVuLlxuXHQgKi9cblx0QE91dHB1dCgpIHB1YmxpYyBvcGVuOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIGRyb3Bkb3duIGlzIG9wZW4uXG5cdCAqL1xuXHRAT3V0cHV0KCkgcHVibGljIGNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogVG9vZ2xlIHRoZSBkcm9wZG93biBsaXN0XG5cdCAqL1xuXHRwdWJsaWMgdG9nZ2xlRHJvcGRvd24gPSBmYWxzZTtcblxuXHQvKipcblx0ICogQXZhaWxhYmxlIGl0ZW1zIGZvciBzZWxlY3Rpb25cblx0ICovXG5cdHB1YmxpYyBhdmFpbGFibGVJdGVtczogYW55ID0gW107XG5cblx0LyoqXG5cdCAqIFNlbGVjdGVkIEl0ZW1zXG5cdCAqL1xuXHRwdWJsaWMgc2VsZWN0ZWRJdGVtczogYW55ID0gW107XG5cblx0LyoqXG5cdCAqIFNlbGVjdGlvbiB0ZXh0IHRvIGJlIERpc3BsYXllZFxuXHQgKi9cblx0cHVibGljIHNlbGVjdGVkRGlzcGxheVRleHQgPSAnLSc7XG5cblx0LyoqXG5cdCAqIFNlYXJjaCB0ZXh0XG5cdCAqL1xuXHRwdWJsaWMgc2VhcmNoVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiB2YXJpYWJsZSB0byB0cmFjayBpZiBjbGlja2VkIGluc2lkZSBvciBvdXRzaWRlIG9mIGNvbXBvbmVudFxuXHQgKi9cblx0cHVibGljIGNsaWNrZWRJbnNpZGUgPSBmYWxzZTtcblxuXHQvKipcblx0ICogdmFyaWFibGUgdG8gdHJhY2sga2V5cHJlc3MgZXZlbnQgaW5zaWRlIGFuZCBvdXRzaWQgb2YgY29tcG9uZW50XG5cdCAqL1xuXHRwdWJsaWMgaW5zaWRlS2V5UHJlc3MgPSBmYWxzZTtcblxuXHQvKipcblx0ICogdmFyaWFibGUgdG8gdHJhY2sgdGhlIGZvY3VzZWQgaXRlbSB3aGVudXNlciB1c2VzIGFycm93IGtleXMgdG8gc2VsZWN0IGl0ZW1cblx0ICovXG5cdHB1YmxpYyBmb2N1c2VkSXRlbUluZGV4OiBudW1iZXIgfCBudWxsO1xuXG5cdC8qKlxuXHQgKiBlbGVtZW50IHRvIHNob3cgbm90IGZvdW5kIHRleHQgd2hlbiBub3QgaXRtZXMgbWF0Y2ggdGhlIHNlYXJjaFxuXHQgKi9cblxuXHRwdWJsaWMgc2hvd05vdEZvdW5kID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBIb2xkIHRoZSByZWZlcmVuY2UgdG8gYXZhaWxhYmxlIGl0ZW1zIGluIHRoZSBsaXN0IHRvIGZvY3VzIG9uIHRoZSBpdGVtIHdoZW4gc2Nyb2xsaW5nXG5cdCAqL1xuXHRAVmlld0NoaWxkcmVuKCAnYXZhaWxhYmxlT3B0aW9uJyApXG5cdHB1YmxpYyBhdmFpbGFibGVPcHRpb25zOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cblx0Z2V0IHZhbHVlICgpIHtcblx0XHRyZXR1cm4gdGhpcy5fdmFsdWU7XG5cdH1cblx0c2V0IHZhbHVlICggdmFsICkge1xuXHRcdHRoaXMuX3ZhbHVlID0gdmFsO1xuXHRcdHRoaXMub25DaGFuZ2UoIHZhbCApO1xuXHRcdHRoaXMub25Ub3VjaGVkKCk7XG5cdH1cblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjZHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG5cdFx0cHVibGljIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmXG5cdCkge1xuXHRcdHRoaXMubXVsdGlwbGUgPSBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBvbkNoYW5nZTogYW55ID0gKCkgPT4ge1xuXHRcdC8vIGVtcHR5XG5cdH1cblx0cHVibGljIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge1xuXHRcdC8vIGVtcHR5XG5cdH1cblxuXHQvKipcblx0ICogY2xpY2sgbGlzdGVuZXIgZm9yIGhvc3QgaW5zaWRlIHRoaXMgY29tcG9uZW50IGkuZVxuXHQgKiBpZiBtYW55IGluc3RhbmNlcyBhcmUgdGhlcmUsIHRoaXMgZGV0ZWN0cyBpZiBjbGlja2VkIGluc2lkZVxuXHQgKiB0aGlzIGluc3RhbmNlXG5cdCAqL1xuXHRASG9zdExpc3RlbmVyKCAnY2xpY2snIClcblx0cHVibGljIGNsaWNrSW5zaWRlQ29tcG9uZW50ICgpIHtcblx0XHR0aGlzLmNsaWNrZWRJbnNpZGUgPSB0cnVlO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lciggJ2JsdXInICkgcHVibGljIGJsdXIgKCkge1xuXHRcdHRoaXMudG9nZ2xlRHJvcGRvd24gPSBmYWxzZTtcblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoICdmb2N1cycgKSBwdWJsaWMgZm9jdXMgKCkge1xuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCAhdGhpcy5kaXNhYmxlZCApXG5cdFx0e1xuXHRcdFx0dGhpcy50b2dnbGVTZWxlY3REcm9wZG93bigpO1xuXHRcdH1cblx0fVxuXHQvKipcblx0ICogY2xpY2sgaGFuZGxlciBvbiBkb2N1bW5lbnQgdG8gaGlkZSB0aGUgb3BlbiBkcm9wZG93biBpZiBjbGlja2VkIG91dHNpZGVcblx0ICovXG5cdEBIb3N0TGlzdGVuZXIoICdkb2N1bWVudDpjbGljaycgKVxuXHRwdWJsaWMgY2xpY2tPdXRzaWRlQ29tcG9uZW50ICgpIHtcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggIXRoaXMuY2xpY2tlZEluc2lkZSApXG5cdFx0e1xuXHRcdFx0dGhpcy50b2dnbGVEcm9wZG93biA9IGZhbHNlO1xuXHRcdFx0dGhpcy5yZXNldEFycm93S2V5QWN0aXZlRWxlbWVudCgpO1xuXHRcdFx0Ly8gY2xlYXIgc2Vhcmggb24gY2xvc2Vcblx0XHRcdHRoaXMuc2VhcmNoVGV4dCA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMuY2xvc2UuZW1pdCgpO1xuXHRcdH1cblx0XHR0aGlzLmNsaWNrZWRJbnNpZGUgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBjbGljayBoYW5kbGVyIG9uIGRvY3VtbmVudCB0byBoaWRlIHRoZSBvcGVuIGRyb3Bkb3duIGlmIGNsaWNrZWQgb3V0c2lkZVxuXHQgKi9cblx0QEhvc3RMaXN0ZW5lciggJ2RvY3VtZW50OmtleWRvd24nIClcblx0cHVibGljIEtleVByZXNzT3V0c2lkZUNvbXBvbmVudCAoKSB7XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoICF0aGlzLmluc2lkZUtleVByZXNzIClcblx0XHR7XG5cdFx0XHR0aGlzLnRvZ2dsZURyb3Bkb3duID0gZmFsc2U7XG5cdFx0XHR0aGlzLnJlc2V0QXJyb3dLZXlBY3RpdmVFbGVtZW50KCk7XG5cdFx0fVxuXHRcdHRoaXMuaW5zaWRlS2V5UHJlc3MgPSBmYWxzZTtcblx0fVxuXHQvKipcblx0ICogRXZlbnQgaGFuZGxlciBmb3Iga2V5IHVwIGFuZCBkb3duIGV2ZW50IGFuZCBlbnRlciBwcmVzcyBmb3Igc2VsZWN0aW5nIGVsZW1lbnRcblx0ICovXG5cdEBIb3N0TGlzdGVuZXIoICdrZXlkb3duJywgWyAnJGV2ZW50JyBdIClcblx0cHVibGljIGhhbmRsZUtleWJvYXJkRXZlbnQgKCAkZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcblx0XHR0aGlzLmluc2lkZUtleVByZXNzID0gdHJ1ZTtcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggJGV2ZW50LmtleUNvZGUgPT09IDI3IHx8IHRoaXMuZGlzYWJsZWQgKVxuXHRcdHtcblx0XHRcdHRoaXMudG9nZ2xlRHJvcGRvd24gPSBmYWxzZTtcblx0XHRcdHRoaXMuaW5zaWRlS2V5UHJlc3MgPSBmYWxzZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgYXZhT3B0cyA9IHRoaXMuYXZhaWxhYmxlT3B0aW9ucy50b0FycmF5KCk7XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoICRldmVudC5rZXlDb2RlICE9PSA5ICYmIGF2YU9wdHMubGVuZ3RoID09PSAwICYmICF0aGlzLnRvZ2dsZURyb3Bkb3duIClcblx0XHR7XG5cdFx0XHR0aGlzLnRvZ2dsZURyb3Bkb3duID0gdHJ1ZTtcblx0XHR9XG5cdFx0Ly8gQXJyb3cgRG93blxuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCAkZXZlbnQua2V5Q29kZSA9PT0gNDAgJiYgYXZhT3B0cy5sZW5ndGggPiAwIClcblx0XHR7XG5cdFx0XHR0aGlzLm9uQXJyb3dLZXlEb3duKCk7XG5cdFx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdFx0aWYgKCB0aGlzLmZvY3VzZWRJdGVtSW5kZXghID49IGF2YU9wdHMubGVuZ3RoIClcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5mb2N1c2VkSXRlbUluZGV4ID0gMDtcblx0XHRcdH1cblx0XHRcdGF2YU9wdHNbIHRoaXMuZm9jdXNlZEl0ZW1JbmRleCEgXS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG5cdFx0XHQkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdFx0Ly8gQXJyb3cgVXBcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggJGV2ZW50LmtleUNvZGUgPT09IDM4ICYmIGF2YU9wdHMubGVuZ3RoIClcblx0XHR7XG5cdFx0XHR0aGlzLm9uQXJyb3dLZXlVcCgpO1xuXHRcdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRcdGlmICggdGhpcy5mb2N1c2VkSXRlbUluZGV4ISA+PSBhdmFPcHRzLmxlbmd0aCApXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuZm9jdXNlZEl0ZW1JbmRleCA9IGF2YU9wdHMubGVuZ3RoIC0gMTtcblx0XHRcdH1cblx0XHRcdGF2YU9wdHNbIHRoaXMuZm9jdXNlZEl0ZW1JbmRleCEgXS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG5cdFx0XHQkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdFx0Ly8gRW50ZXJcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggJGV2ZW50LmtleUNvZGUgPT09IDEzICYmIHRoaXMuZm9jdXNlZEl0ZW1JbmRleCAhPT0gbnVsbCApXG5cdFx0e1xuXHRcdFx0Y29uc3QgZmlsdGVyZWRJdGVtcyA9IG5ldyBGaWx0ZXJCeVBpcGUoKS50cmFuc2Zvcm0oXG5cdFx0XHRcdHRoaXMuYXZhaWxhYmxlSXRlbXMsXG5cdFx0XHRcdHRoaXMuc2VhcmNoVGV4dCEsXG5cdFx0XHRcdHRoaXMuY29uZmlnLnNlYXJjaE9uS2V5XG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5zZWxlY3RJdGVtKFxuXHRcdFx0XHRmaWx0ZXJlZEl0ZW1zWyB0aGlzLmZvY3VzZWRJdGVtSW5kZXggXSxcblx0XHRcdFx0dGhpcy5hdmFpbGFibGVJdGVtcy5pbmRleE9mKCBmaWx0ZXJlZEl0ZW1zWyB0aGlzLmZvY3VzZWRJdGVtSW5kZXggXSApXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiAkZXZlbnQua2V5XG5cdFx0XG5cdH1cblxuXHQvKipcblx0ICogQ29tcG9uZW50IG9uSW5pdFxuXHQgKi9cblx0cHVibGljIG5nT25Jbml0ICgpIHtcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggdHlwZW9mIHRoaXMub3B0aW9ucyAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheSggdGhpcy5vcHRpb25zICkgKVxuXHRcdHtcblx0XHRcdHRoaXMuYXZhaWxhYmxlSXRlbXMgPSBbXG5cdFx0XHRcdC4uLnRoaXMub3B0aW9ucy5zb3J0KCB0aGlzLmNvbmZpZy5jdXN0b21Db21wYXJhdG9yICksXG5cdFx0XHRdO1xuXHRcdFx0dGhpcy5pbml0RHJvcGRvd25WYWx1ZXNBbmRPcHRpb25zKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIGFmdGVyIHZpZXcgaW5pdCB0byBzdWJzY3JpYmUgdG8gYXZhaWxhYmxlIG9wdGlvbiBjaGFuZ2VzXG5cdCAqL1xuXHRwdWJsaWMgbmdBZnRlclZpZXdJbml0ICgpIHtcblx0XHR0aGlzLmF2YWlsYWJsZU9wdGlvbnMuY2hhbmdlcy5zdWJzY3JpYmUoIHRoaXMuc2V0Tm90Rm91bmRTdGF0ZS5iaW5kKCB0aGlzICkgKTtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlICggZm46IGFueSApIHtcblx0XHR0aGlzLm9uQ2hhbmdlID0gZm47XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQgKCBmbjogYW55ICkge1xuXHRcdHRoaXMub25Ub3VjaGVkID0gZm47XG5cdH1cblxuXHRwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZSAoIGlzRGlzYWJsZWQ6IGJvb2xlYW4gKSB7XG5cdFx0dGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG5cdH1cblxuXHRwdWJsaWMgd3JpdGVWYWx1ZSAoIHZhbHVlOiBhbnksIGludGVybmFsPzogYm9vbGVhbiApIHtcblx0XHRpZiAoIHZhbHVlIClcblx0XHR7XG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoIHRoaXMubXVsdGlwbGUgKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCB2YWx1ZS5sZW5ndGggPiAwIClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRoaXMudmFsdWUgPSB2YWx1ZVsgMCBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRcdGlmICggdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMCApXG5cdFx0XHR7XG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbXMgPSB2YWx1ZTtcblx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbXMucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmluaXREcm9wZG93blZhbHVlc0FuZE9wdGlvbnMoKTtcblx0XHRcdH1cblx0XHR9IGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLnZhbHVlID0gW107XG5cdFx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdFx0aWYgKCAhaW50ZXJuYWwgKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnJlc2V0KCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCAhaW50ZXJuYWwgKVxuXHRcdHtcblx0XHRcdHRoaXMucmVzZXQoKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgcmVzZXQgKCkge1xuXHRcdHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xuXHRcdHRoaXMuYXZhaWxhYmxlSXRlbXMgPSBbIC4uLnRoaXMub3B0aW9ucy5zb3J0KCB0aGlzLmNvbmZpZy5jdXN0b21Db21wYXJhdG9yICkgXTtcblx0XHR0aGlzLmluaXREcm9wZG93blZhbHVlc0FuZE9wdGlvbnMoKTtcblx0fVxuXHQvKipcblx0ICogZnVuY3Rpb24gc2V0cyB3aGV0aGVyIHRvIHNob3cgaXRlbXMgbm90IGZvdW5kIHRleHQgb3Igbm90XG5cdCAqL1xuXHRwdWJsaWMgc2V0Tm90Rm91bmRTdGF0ZSAoKSB7XG5cdFx0aWYgKCB0aGlzLmF2YWlsYWJsZU9wdGlvbnMubGVuZ3RoID09PSAwIClcblx0XHR7XG5cdFx0XHR0aGlzLnNob3dOb3RGb3VuZCA9IHRydWU7XG5cdFx0fSBlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5zaG93Tm90Rm91bmQgPSBmYWxzZTtcblx0XHR9XG5cdFx0dGhpcy5jZHJlZi5kZXRlY3RDaGFuZ2VzKCk7XG5cdH1cblx0LyoqXG5cdCAqIENvbXBvbmVudCBvbmNoYWdlIGkuZSB3aGVuIGFueSBvZiB0aGUgaW5wdXQgcHJvcGVydGllcyBjaGFuZ2Vcblx0ICovXG5cdHB1YmxpYyBuZ09uQ2hhbmdlcyAoIGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgKSB7XG5cdFx0dGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG5cdFx0Ly8gdGhpcy5zZWFyY2hUZXh0ID0gbnVsbDtcblx0XHR0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgfHwgW107XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIGNoYW5nZXNbICdvcHRpb25zJyBdIClcblx0XHR7XG5cdFx0XHR0aGlzLmF2YWlsYWJsZUl0ZW1zID0gW1xuXHRcdFx0XHQuLi50aGlzLm9wdGlvbnMuc29ydCggdGhpcy5jb25maWcuY3VzdG9tQ29tcGFyYXRvciApLFxuXHRcdFx0XTtcblx0XHR9XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIGNoYW5nZXNbICd2YWx1ZScgXSApXG5cdFx0e1xuXHRcdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRcdGlmIChcblx0XHRcdFx0SlNPTi5zdHJpbmdpZnkoIGNoYW5nZXNbICd2YWx1ZScgXS5jdXJyZW50VmFsdWUgKSA9PT0gSlNPTi5zdHJpbmdpZnkoIFtdICkgfHxcblx0XHRcdFx0Y2hhbmdlc1sgJ3ZhbHVlJyBdLmN1cnJlbnRWYWx1ZSA9PT0gJycgfHxcblx0XHRcdFx0Y2hhbmdlc1sgJ3ZhbHVlJyBdLmN1cnJlbnRWYWx1ZSA9PT0gbnVsbFxuXHRcdFx0KVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLmF2YWlsYWJsZUl0ZW1zID0gW1xuXHRcdFx0XHRcdC4uLnRoaXMub3B0aW9ucy5zb3J0KCB0aGlzLmNvbmZpZy5jdXN0b21Db21wYXJhdG9yICksXG5cdFx0XHRcdF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuaW5pdERyb3Bkb3duVmFsdWVzQW5kT3B0aW9ucygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlc2VsY3QgYSBzZWxlY3RlZCBpdGVtc1xuXHQgKiBAcGFyYW0gaXRlbTogIGl0ZW0gdG8gYmUgZGVzZWxlY3RlZFxuXHQgKiBAcGFyYW0gaW5kZXg6ICBpbmRleCBvZiB0aGUgaXRlbVxuXHQgKi9cblx0cHVibGljIGRlc2VsZWN0SXRlbSAoIGl0ZW06IGFueSwgaW5kZXg6IG51bWJlciApIHtcblx0XHR0aGlzLnNlbGVjdGVkSXRlbXMuZm9yRWFjaCggKCBlbGVtZW50OiBhbnksIGk6IG51bWJlciApID0+IHtcblx0XHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0XHRpZiAoIGl0ZW0gPT09IGVsZW1lbnQgKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbXMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdGxldCBzb3J0ZWRJdGVtcyA9IFsgLi4udGhpcy5hdmFpbGFibGVJdGVtcyBdO1xuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCAhdGhpcy5hdmFpbGFibGVJdGVtcy5pbmNsdWRlcyggaXRlbSApIClcblx0XHR7XG5cdFx0XHR0aGlzLmF2YWlsYWJsZUl0ZW1zLnB1c2goIGl0ZW0gKTtcblx0XHRcdHNvcnRlZEl0ZW1zID0gdGhpcy5hdmFpbGFibGVJdGVtcy5zb3J0KCB0aGlzLmNvbmZpZy5jdXN0b21Db21wYXJhdG9yICk7XG5cdFx0fVxuXHRcdHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFsgLi4udGhpcy5zZWxlY3RlZEl0ZW1zIF07XG5cdFx0dGhpcy5hdmFpbGFibGVJdGVtcyA9IFsgLi4uc29ydGVkSXRlbXMgXTtcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggIUFycmF5LmlzQXJyYXkoIHRoaXMudmFsdWUgKSApXG5cdFx0e1xuXHRcdFx0dGhpcy52YWx1ZSA9IFtdO1xuXHRcdH1cblx0XHR0aGlzLnZhbHVlQ2hhbmdlZCgpO1xuXHRcdHRoaXMucmVzZXRBcnJvd0tleUFjdGl2ZUVsZW1lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZWxlY3QgYW4gaXRlbVxuXHQgKiBAcGFyYW0gaXRlbTogIGl0ZW0gdG8gYmUgc2VsZWN0ZWRcblx0ICogQHBhcmFtIGluZGV4OiAgaW5kZXggb2YgdGhlIGl0ZW1cblx0ICovXG5cdHB1YmxpYyBzZWxlY3RJdGVtICggaXRlbTogc3RyaW5nLCBpbmRleD86IG51bWJlciApIHtcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggIXRoaXMubXVsdGlwbGUgKVxuXHRcdHtcblx0XHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0XHRpZiAoIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwIClcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5hdmFpbGFibGVJdGVtcy5wdXNoKCB0aGlzLnNlbGVjdGVkSXRlbXNbIDAgXSApO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG5cdFx0XHR0aGlzLnRvZ2dsZURyb3Bkb3duID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5hdmFpbGFibGVJdGVtcy5mb3JFYWNoKCAoIGVsZW1lbnQ6IGFueSwgaTogbnVtYmVyICkgPT4ge1xuXHRcdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRcdGlmICggaXRlbSA9PT0gZWxlbWVudCApXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtcy5wdXNoKCBpdGVtICk7XG5cdFx0XHRcdHRoaXMuYXZhaWxhYmxlSXRlbXMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIHRoaXMuY29uZmlnLmNsZWFyT25TZWxlY3Rpb24gKVxuXHRcdHtcblx0XHRcdHRoaXMuc2VhcmNoVGV4dCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHR0aGlzLnNlbGVjdGVkSXRlbXMgPSBbIC4uLnRoaXMuc2VsZWN0ZWRJdGVtcyBdO1xuXHRcdHRoaXMuYXZhaWxhYmxlSXRlbXMgPSBbIC4uLnRoaXMuYXZhaWxhYmxlSXRlbXMgXTtcblx0XHR0aGlzLnNlbGVjdGVkSXRlbXMuc29ydCggdGhpcy5jb25maWcuY3VzdG9tQ29tcGFyYXRvciApO1xuXHRcdHRoaXMuYXZhaWxhYmxlSXRlbXMuc29ydCggdGhpcy5jb25maWcuY3VzdG9tQ29tcGFyYXRvciApO1xuXHRcdC8vIHRoaXMuc2VhcmNoVGV4dCA9IG51bGw7XG5cdFx0dGhpcy52YWx1ZUNoYW5nZWQoKTtcblx0XHR0aGlzLnJlc2V0QXJyb3dLZXlBY3RpdmVFbGVtZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogV2hlbiBzZWxlY3RlZCBpdGVtcyBjaGFuZ2VzIHRyaWdnZXIgdGhlIGNoYWFuZ2UgYmFjayB0byBwYXJlbnRcblx0ICovXG5cdHB1YmxpYyB2YWx1ZUNoYW5nZWQgKCkge1xuXHRcdHRoaXMud3JpdGVWYWx1ZSggdGhpcy5zZWxlY3RlZEl0ZW1zLCB0cnVlICk7XG5cdFx0Ly8gdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuXHRcdHRoaXMuY2hhbmdlLmVtaXQoIHsgdmFsdWU6IHRoaXMudmFsdWUgfSApO1xuXHRcdHRoaXMuc2V0U2VsZWN0ZWREaXNwbGF5VGV4dCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRvZ2dsZSB0aGUgZHJvcGRvd25saXN0IG9uL29mZlxuXHQgKi9cblx0cHVibGljIHRvZ2dsZVNlbGVjdERyb3Bkb3duICgpIHtcblx0XHR0aGlzLnRvZ2dsZURyb3Bkb3duID0gIXRoaXMudG9nZ2xlRHJvcGRvd247XG5cdFx0aWYgKCB0aGlzLnRvZ2dsZURyb3Bkb3duIClcblx0XHR7XG5cdFx0XHR0aGlzLm9wZW4uZW1pdCgpO1xuXHRcdH0gZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMuc2VhcmNoVGV4dCA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMuY2xvc2UuZW1pdCgpO1xuXHRcdH1cblx0XHR0aGlzLnJlc2V0QXJyb3dLZXlBY3RpdmVFbGVtZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGNoYW5nZSBoYW5kbGVyIGZvciBzZWFyY2ggdGV4dFxuXHQgKi9cblx0cHVibGljIHNlYXJjaFRleHRDaGFuZ2VkICgpIHtcblx0XHR0aGlzLnNlYXJjaENoYW5nZS5lbWl0KCB0aGlzLnNlYXJjaFRleHQgKTtcblx0fVxuXG5cdHB1YmxpYyBjaGFuZ2VTZWFyY2hUZXh0ICggJGV2ZW50OiBhbnkgKSB7XG5cdFx0JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGluaXRpYWxpemUgdGhlIGNvbmZpZyBhbmQgb3RoZXIgcHJvcGVydGllc1xuXHQgKi9cblx0cHJpdmF0ZSBpbml0RHJvcGRvd25WYWx1ZXNBbmRPcHRpb25zICgpIHtcblx0XHRjb25zdCBjb25maWc6IGFueSA9IHtcblx0XHRcdGRpc3BsYXlLZXk6ICdkZXNjcmlwdGlvbicsXG5cdFx0XHRoZWlnaHQ6ICdhdXRvJyxcblx0XHRcdHNlYXJjaDogZmFsc2UsXG5cdFx0XHRwbGFjZWhvbGRlcjogJy0nLFxuXHRcdFx0c2VhcmNoUGxhY2Vob2xkZXI6ICdQZXNxdWlzYXIgJyxcblx0XHRcdGxpbWl0VG86IDAsXG5cdFx0XHRjdXN0b21Db21wYXJhdG9yOiB1bmRlZmluZWQsXG5cdFx0XHRub1Jlc3VsdHNGb3VuZDogJ05hZGEgZW5jb250cmFkbyEnLFxuXHRcdFx0bW9yZVRleHQ6ICdTZWxlY2lvbmFkb3MnLFxuXHRcdFx0c2VhcmNoT25LZXk6IG51bGwsXG5cdFx0XHRjbGVhck9uU2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGlucHV0RGlyZWN0aW9uOiAnbHRyJyxcblx0XHR9O1xuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCB0aGlzLmNvbmZpZyA9PT0gJ3VuZGVmaW5lZCcgfHwgT2JqZWN0LmtleXMoIHRoaXMuY29uZmlnICkubGVuZ3RoID09PSAwIClcblx0XHR7XG5cdFx0XHR0aGlzLmNvbmZpZyA9IHsgLi4uY29uZmlnIH07XG5cdFx0fVxuXHRcdGZvciAoIGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyggY29uZmlnICkgKVxuXHRcdHtcblx0XHRcdHRoaXMuY29uZmlnWyBrZXkgXSA9IHRoaXMuY29uZmlnWyBrZXkgXSA/IHRoaXMuY29uZmlnWyBrZXkgXSA6IGNvbmZpZ1sga2V5IF07XG5cdFx0fVxuXHRcdHRoaXMuY29uZmlnID0geyAuLi50aGlzLmNvbmZpZyB9O1xuXHRcdC8vIEFkZGluZyBwbGFjZWhvbGRlciBpbiBjb25maWcgYXMgZGVmYXVsdCBwYXJhbVxuXHRcdHRoaXMuc2VsZWN0ZWREaXNwbGF5VGV4dCA9IHRoaXMuY29uZmlnWyAncGxhY2Vob2xkZXInIF07XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIHRoaXMudmFsdWUgIT09ICcnICYmIHR5cGVvZiB0aGlzLnZhbHVlICE9PSAndW5kZWZpbmVkJyApXG5cdFx0e1xuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB0aGlzLnZhbHVlICkgKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLnZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmICggdGhpcy52YWx1ZSAhPT0gJycgJiYgdGhpcy52YWx1ZSAhPT0gbnVsbCApXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtc1sgMCBdID0gdGhpcy52YWx1ZTtcblx0XHRcdH0gZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNlbGVjdGVkSXRlbXMuZm9yRWFjaCggKCBpdGVtOiBhbnkgKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGluZCA9IHRoaXMuYXZhaWxhYmxlSXRlbXMuZmluZEluZGV4KFxuXHRcdFx0XHRcdCggYUl0ZW06IGFueSApID0+IEpTT04uc3RyaW5naWZ5KCBpdGVtICkgPT09IEpTT04uc3RyaW5naWZ5KCBhSXRlbSApXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmICggaW5kICE9PSAtMSApXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLmF2YWlsYWJsZUl0ZW1zLnNwbGljZSggaW5kLCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cdFx0dGhpcy5zZXRTZWxlY3RlZERpc3BsYXlUZXh0KCk7XG5cdH1cblxuXHQvKipcblx0ICogc2V0IHRoZSB0ZXh0IHRvIGJlIGRpc3BsYXllZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXRTZWxlY3RlZERpc3BsYXlUZXh0ICgpIHtcblx0XHRsZXQgdGV4dDogc3RyaW5nID0gdGhpcy5zZWxlY3RlZEl0ZW1zWyAwIF07XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIHR5cGVvZiB0aGlzLnNlbGVjdGVkSXRlbXNbIDAgXSA9PT0gJ29iamVjdCcgKVxuXHRcdHtcblx0XHRcdHRleHQgPSB0aGlzLmNvbmZpZy5kaXNwbGF5Rm5cblx0XHRcdFx0PyB0aGlzLmNvbmZpZy5kaXNwbGF5Rm4oIHRoaXMuc2VsZWN0ZWRJdGVtc1sgMCBdIClcblx0XHRcdFx0OiB0aGlzLnNlbGVjdGVkSXRlbXNbIDAgXVsgdGhpcy5jb25maWcuZGlzcGxheUtleSBdO1xuXHRcdH1cblx0XHRpZiAoIHRoaXMubXVsdGlwbGUgJiYgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgKVxuXHRcdHtcblx0XHRcdHRoaXMuc2VsZWN0ZWREaXNwbGF5VGV4dCA9XG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDFcblx0XHRcdFx0XHQ/IHRleHRcblx0XHRcdFx0XHQ6IHRleHQgK1xuXHRcdFx0XHRcdGAgKyAkeyB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoIC0gMSB9ICR7IHRoaXMuY29uZmlnLm1vcmVUZXh0IH1gO1xuXHRcdH0gZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMuc2VsZWN0ZWREaXNwbGF5VGV4dCA9XG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDAgPyB0aGlzLmNvbmZpZy5wbGFjZWhvbGRlciA6IHRleHQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV2ZW50IGhhbmRsZXIgZm9yIGFycm93IGtleSB1cCBldmVudCB0aGF0cyBmb2N1c2VzIG9uIGEgaXRlbVxuXHQgKi9cblx0cHJpdmF0ZSBvbkFycm93S2V5VXAgKCkge1xuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCB0aGlzLmZvY3VzZWRJdGVtSW5kZXggPT09IDAgKVxuXHRcdHtcblx0XHRcdHRoaXMuZm9jdXNlZEl0ZW1JbmRleCA9IHRoaXMuYXZhaWxhYmxlSXRlbXMubGVuZ3RoIC0gMTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIHRoaXMub25BcnJvd0tleSgpIClcblx0XHR7XG5cdFx0XHR0aGlzLmZvY3VzZWRJdGVtSW5kZXghO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFdmVudCBoYW5kbGVyIGZvciBhcnJvdyBrZXkgZG93biBldmVudCB0aGF0cyBmb2N1c2VzIG9uIGEgaXRlbVxuXHQgKi9cblx0cHJpdmF0ZSBvbkFycm93S2V5RG93biAoKSB7XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIHRoaXMuZm9jdXNlZEl0ZW1JbmRleCA9PT0gdGhpcy5hdmFpbGFibGVJdGVtcy5sZW5ndGggLSAxIClcblx0XHR7XG5cdFx0XHR0aGlzLmZvY3VzZWRJdGVtSW5kZXggPSAwO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggdGhpcy5vbkFycm93S2V5KCkgKVxuXHRcdHtcblx0XHRcdHRoaXMuZm9jdXNlZEl0ZW1JbmRleCErKztcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIG9uQXJyb3dLZXkgKCkge1xuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCB0aGlzLmZvY3VzZWRJdGVtSW5kZXggPT09IG51bGwgKVxuXHRcdHtcblx0XHRcdHRoaXMuZm9jdXNlZEl0ZW1JbmRleCA9IDA7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIHdpbGwgcmVzZXQgdGhlIGVsZW1lbnQgdGhhdCBpcyBtYXJrZWQgYWN0aXZlIHVzaW5nIGFycm93IGtleXNcblx0ICovXG5cdHByaXZhdGUgcmVzZXRBcnJvd0tleUFjdGl2ZUVsZW1lbnQgKCkge1xuXHRcdHRoaXMuZm9jdXNlZEl0ZW1JbmRleCA9IG51bGw7XG5cdH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJuZ3gtZHJvcGRvd24tY29udGFpbmVyXCIgdGFiaW5kZXg9XCIwXCI+XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cIm5neC1kcm9wZG93bi1idXR0b25cIiBbbmdDbGFzc109XCJ7ICduZ3gtZGlzYWJsZWQnOiBkaXNhYmxlZCB9XCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0RHJvcGRvd24oKVwiPlxuICAgIDxzcGFuIGNsYXNzPVwiZGlzcGxheS10ZXh0XCI+e3sgc2VsZWN0ZWREaXNwbGF5VGV4dCB9fSA8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJuc2RpY29uLWFuZ2xlLWRvd25cIj48L3NwYW4+XG4gIDwvYnV0dG9uPlxuICA8ZGl2IGNsYXNzPVwibmd4LWRyb3Bkb3duLWxpc3QtY29udGFpbmVyIHNjcm9sbC15XCIgKm5nSWY9XCJ0b2dnbGVEcm9wZG93blwiIFtzdHlsZS5tYXhIZWlnaHRdPVwiY29uZmlnLmhlaWdodFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtY29udGFpbmVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiICpuZ0lmPVwiY29uZmlnLnNlYXJjaFwiPlxuICAgICAgPGlucHV0IChjaGFuZ2UpPVwiY2hhbmdlU2VhcmNoVGV4dCgkZXZlbnQpXCIgW3N0eWxlLmRpcmVjdGlvbl09XCJjb25maWcuaW5wdXREaXJlY3Rpb25cIiBuYW1lPVwic2VhcmNoLXRleHRcIlxuICAgICAgICAoaW5wdXQpPVwic2VhcmNoVGV4dENoYW5nZWQoKVwiIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIHRhYmluZGV4PVwiLTFcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxuICAgICAgPGxhYmVsIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWFyY2hUZXh0IH1cIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuc2RpY29uLXNlYXJjaFwiPjwvc3Bhbj5cbiAgICAgICAge3sgY29uZmlnLnNlYXJjaFBsYWNlaG9sZGVyIH19PC9sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8dWwgY2xhc3M9XCJzZWxlY3RlZC1pdGVtc1wiPlxuICAgICAgPGxpIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCIgdGFiaW5kZXg9XCItMVwiICpuZ0Zvcj1cImxldCBzZWxlY3RlZCBvZiBzZWxlY3RlZEl0ZW1zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgKGNsaWNrKT1cImRlc2VsZWN0SXRlbShzZWxlY3RlZCwgaSlcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjayBuc2RpY29uLWNsb3NlIG1lLTJcIiBjaGVja2VkPVwidHJ1ZVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnB4O1wiPnt7XG4gICAgICAgICAgY29uZmlnLmRpc3BsYXlGblxuICAgICAgICAgID8gY29uZmlnLmRpc3BsYXlGbihzZWxlY3RlZClcbiAgICAgICAgICA6IHNlbGVjdGVkW2NvbmZpZy5kaXNwbGF5S2V5XSB8fCBzZWxlY3RlZFxuICAgICAgICAgIH19PC9kaXY+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gICAgPGhyICpuZ0lmPVwic2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwICYmIGF2YWlsYWJsZUl0ZW1zLmxlbmd0aCA+IDBcIiAvPlxuICAgIDx1bCBjbGFzcz1cImF2YWlsYWJsZS1pdGVtc1wiPlxuICAgICAgPGxpIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCIgI2F2YWlsYWJsZU9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhdmFpbGFibGVJdGVtcyB8IGZpbHRlckJ5OiBzZWFyY2hUZXh0OiBjb25maWcuc2VhcmNoT25LZXlcblx0XHRcdHwgbGltaXRUbzogY29uZmlnLmxpbWl0VG87IGxldCBpID0gaW5kZXhcIiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IGZvY3VzZWRJdGVtSW5kZXggPT0gaSAmJiAhaXRlbS5kaXNhYmxlZCwgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZWQgfVwiXG4gICAgICAgIChjbGljayk9XCJzZWxlY3RJdGVtKGl0ZW0sIGkpXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2sgbnNkaWNvbi1jbG9zZSBtZS0yXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycHg7XCI+XG4gICAgICAgICAge3sgY29uZmlnLmRpc3BsYXlGbiA/IGNvbmZpZy5kaXNwbGF5Rm4oaXRlbSkgOiBpdGVtW2NvbmZpZy5kaXNwbGF5S2V5XSB8fCBpdGVtIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9saT5cbiAgICAgIDxsaSAqbmdJZj1cInNob3dOb3RGb3VuZFwiPnt7IGNvbmZpZy5ub1Jlc3VsdHNGb3VuZCB9fTwvbGk+XG4gICAgPC91bD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==