@tft/crispr-forms 12.2.21 → 13.0.2

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 (340) hide show
  1. package/README.md +9 -69
  2. package/esm2020/index.mjs +2 -0
  3. package/esm2020/lib/abstracts/autocomplete-field.abstract.mjs +30 -0
  4. package/esm2020/lib/abstracts/crispr-control.mixin.mjs +27 -0
  5. package/esm2020/lib/abstracts/crispr-field.abstract.mjs +17 -0
  6. package/esm2020/lib/abstracts/index.mjs +4 -0
  7. package/esm2020/lib/crispr-forms.module.mjs +66 -0
  8. package/esm2020/lib/field-component-map.const.mjs +25 -0
  9. package/esm2020/lib/field-container/field-container.component.mjs +85 -0
  10. package/esm2020/lib/field-container/index.mjs +2 -0
  11. package/esm2020/lib/field.directive.mjs +77 -0
  12. package/esm2020/lib/form/form.component.mjs +54 -0
  13. package/esm2020/lib/form-group-list/form-group-list.component.mjs +51 -0
  14. package/esm2020/lib/form-group-list/form-group-list.module.mjs +54 -0
  15. package/esm2020/lib/form-group-list/index.mjs +3 -0
  16. package/esm2020/lib/form.helpers.mjs +185 -0
  17. package/esm2020/lib/form.operators.mjs +24 -0
  18. package/esm2020/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.mjs +111 -0
  19. package/esm2020/lib/material/autocomplete-field/autocomplete-field.component.mjs +70 -0
  20. package/esm2020/lib/material/button/button.component.mjs +35 -0
  21. package/esm2020/lib/material/checkbox-field/checkbox-field.component.mjs +31 -0
  22. package/esm2020/lib/material/datepicker-field/datepicker-field.component.mjs +45 -0
  23. package/esm2020/lib/material/divider/divider.component.mjs +22 -0
  24. package/esm2020/lib/material/file-upload/file-dropzone.directive.mjs +39 -0
  25. package/esm2020/lib/material/file-upload/file-upload.component.mjs +145 -0
  26. package/esm2020/lib/material/file-upload/index.mjs +3 -0
  27. package/esm2020/lib/material/heading/heading.component.mjs +54 -0
  28. package/esm2020/lib/material/image-upload-field/image-compression.helpers.mjs +4 -0
  29. package/esm2020/lib/material/image-upload-field/image-upload-field.component.mjs +233 -0
  30. package/esm2020/lib/material/image-upload-field/index.mjs +2 -0
  31. package/esm2020/lib/material/index.mjs +18 -0
  32. package/esm2020/lib/material/info/info.component.mjs +46 -0
  33. package/esm2020/lib/material/input-field/input-field.component.mjs +27 -0
  34. package/esm2020/lib/material/material.module.mjs +200 -0
  35. package/esm2020/lib/material/option/index.mjs +2 -0
  36. package/esm2020/lib/material/option/option.component.mjs +14 -0
  37. package/esm2020/lib/material/radio-field/radio-field.component.mjs +29 -0
  38. package/esm2020/lib/material/select-field/select-field.component.mjs +58 -0
  39. package/esm2020/lib/material/selected-file/selected-file.component.mjs +47 -0
  40. package/esm2020/lib/material/slider-field/slider-field.component.mjs +30 -0
  41. package/esm2020/lib/material/textarea-field/textarea-field.component.mjs +28 -0
  42. package/esm2020/lib/material/unit-conversion-field/unit-conversion-field.component.mjs +69 -0
  43. package/esm2020/lib/models/autocomplete-chiplist-field.config.mjs +2 -0
  44. package/esm2020/lib/models/autocomplete-field.config.mjs +2 -0
  45. package/esm2020/lib/models/button.config.mjs +2 -0
  46. package/esm2020/lib/models/checkbox-field.config.mjs +2 -0
  47. package/esm2020/lib/models/crispr-field.config.mjs +23 -0
  48. package/esm2020/lib/models/datepicker-field.config.mjs +2 -0
  49. package/esm2020/lib/models/divider.config.mjs +2 -0
  50. package/esm2020/lib/models/file-upload-field.config.mjs +2 -0
  51. package/esm2020/lib/models/form-group-list.config.mjs +2 -0
  52. package/esm2020/lib/models/heading.config.mjs +3 -0
  53. package/esm2020/lib/models/image-upload-field.config.mjs +2 -0
  54. package/esm2020/lib/models/index.mjs +18 -0
  55. package/esm2020/lib/models/input-field.config.mjs +2 -0
  56. package/esm2020/lib/models/radio-field.config.mjs +2 -0
  57. package/esm2020/lib/models/select-field.config.mjs +2 -0
  58. package/esm2020/lib/models/slider-field.config.mjs +2 -0
  59. package/esm2020/lib/models/textarea-field.config.mjs +2 -0
  60. package/esm2020/lib/models/unit-conversion-field.config.mjs +2 -0
  61. package/esm2020/lib/pipes/crispr-pipes.module.mjs +26 -0
  62. package/esm2020/lib/pipes/initial-control-value.pipe.mjs +20 -0
  63. package/esm2020/lib/public_api.mjs +10 -0
  64. package/esm2020/lib/sub-group/index.mjs +3 -0
  65. package/esm2020/lib/sub-group/sub-group.component.mjs +20 -0
  66. package/esm2020/lib/sub-group/sub-group.module.mjs +45 -0
  67. package/esm2020/tft-crispr-forms.mjs +5 -0
  68. package/fesm2015/tft-crispr-forms.mjs +1904 -0
  69. package/fesm2015/tft-crispr-forms.mjs.map +1 -0
  70. package/fesm2020/tft-crispr-forms.mjs +1896 -0
  71. package/fesm2020/tft-crispr-forms.mjs.map +1 -0
  72. package/lib/abstracts/autocomplete-field.abstract.d.ts +4 -1
  73. package/lib/abstracts/crispr-control.mixin.d.ts +1 -1
  74. package/lib/abstracts/crispr-field.abstract.d.ts +4 -1
  75. package/lib/crispr-forms.module.d.ts +14 -0
  76. package/lib/field-component-map.const.d.ts +21 -20
  77. package/lib/field-container/field-container.component.d.ts +11 -1
  78. package/lib/field-container/index.d.ts +1 -0
  79. package/lib/field.directive.d.ts +14 -5
  80. package/lib/form/form.component.d.ts +6 -1
  81. package/lib/form-group-list/form-group-list.component.d.ts +4 -1
  82. package/lib/form-group-list/form-group-list.module.d.ts +15 -0
  83. package/lib/form-group-list/index.d.ts +2 -0
  84. package/lib/form.helpers.d.ts +1 -1
  85. package/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.d.ts +3 -0
  86. package/lib/material/autocomplete-field/autocomplete-field.component.d.ts +4 -1
  87. package/lib/material/button/button.component.d.ts +3 -0
  88. package/lib/material/checkbox-field/checkbox-field.component.d.ts +3 -0
  89. package/lib/material/datepicker-field/datepicker-field.component.d.ts +3 -0
  90. package/lib/material/divider/divider.component.d.ts +3 -0
  91. package/lib/material/file-upload/file-dropzone.directive.d.ts +3 -0
  92. package/lib/material/file-upload/file-upload.component.d.ts +20 -2
  93. package/lib/material/file-upload/index.d.ts +2 -0
  94. package/lib/material/heading/heading.component.d.ts +12 -1
  95. package/lib/material/image-upload-field/image-compression.helpers.d.ts +1 -0
  96. package/lib/material/image-upload-field/image-upload-field.component.d.ts +64 -0
  97. package/lib/material/image-upload-field/index.d.ts +1 -0
  98. package/lib/material/index.d.ts +4 -1
  99. package/lib/material/info/info.component.d.ts +12 -1
  100. package/lib/material/input-field/input-field.component.d.ts +3 -0
  101. package/lib/material/material.module.d.ts +42 -0
  102. package/lib/material/option/index.d.ts +1 -0
  103. package/lib/material/option/option.component.d.ts +3 -0
  104. package/lib/material/radio-field/radio-field.component.d.ts +3 -0
  105. package/lib/material/select-field/select-field.component.d.ts +3 -0
  106. package/lib/material/selected-file/selected-file.component.d.ts +10 -0
  107. package/lib/material/slider-field/slider-field.component.d.ts +3 -0
  108. package/lib/material/textarea-field/textarea-field.component.d.ts +3 -0
  109. package/lib/material/unit-conversion-field/unit-conversion-field.component.d.ts +3 -0
  110. package/lib/models/autocomplete-field.config.d.ts +2 -1
  111. package/lib/models/button.config.d.ts +3 -2
  112. package/lib/models/crispr-field.config.d.ts +8 -7
  113. package/lib/models/file-upload-field.config.d.ts +4 -3
  114. package/lib/models/image-upload-field.config.d.ts +47 -0
  115. package/lib/models/index.d.ts +2 -0
  116. package/lib/models/radio-field.config.d.ts +1 -1
  117. package/lib/pipes/crispr-pipes.module.d.ts +8 -0
  118. package/lib/pipes/initial-control-value.pipe.d.ts +3 -0
  119. package/lib/public_api.d.ts +1 -0
  120. package/lib/sub-group/index.d.ts +2 -0
  121. package/lib/sub-group/sub-group.component.d.ts +3 -0
  122. package/lib/sub-group/sub-group.module.d.ts +12 -0
  123. package/package.json +30 -15
  124. package/tft-crispr-forms-13.0.2.tgz +0 -0
  125. package/tft-crispr-forms.d.ts +1 -25
  126. package/bundles/tft-crispr-forms.umd.js +0 -1719
  127. package/bundles/tft-crispr-forms.umd.js.map +0 -1
  128. package/esm2015/index.js +0 -2
  129. package/esm2015/index.js.map +0 -1
  130. package/esm2015/index.metadata.json +0 -1
  131. package/esm2015/lib/abstracts/autocomplete-field.abstract.js +0 -27
  132. package/esm2015/lib/abstracts/autocomplete-field.abstract.js.map +0 -1
  133. package/esm2015/lib/abstracts/autocomplete-field.abstract.metadata.json +0 -1
  134. package/esm2015/lib/abstracts/crispr-control.mixin.js +0 -27
  135. package/esm2015/lib/abstracts/crispr-control.mixin.js.map +0 -1
  136. package/esm2015/lib/abstracts/crispr-control.mixin.metadata.json +0 -1
  137. package/esm2015/lib/abstracts/crispr-field.abstract.js +0 -14
  138. package/esm2015/lib/abstracts/crispr-field.abstract.js.map +0 -1
  139. package/esm2015/lib/abstracts/crispr-field.abstract.metadata.json +0 -1
  140. package/esm2015/lib/abstracts/index.js +0 -4
  141. package/esm2015/lib/abstracts/index.js.map +0 -1
  142. package/esm2015/lib/abstracts/index.metadata.json +0 -1
  143. package/esm2015/lib/crispr-forms.module.js +0 -41
  144. package/esm2015/lib/crispr-forms.module.js.map +0 -1
  145. package/esm2015/lib/crispr-forms.module.metadata.json +0 -1
  146. package/esm2015/lib/crispr-forms.module.ngfactory.js.map +0 -1
  147. package/esm2015/lib/field-component-map.const.js +0 -28
  148. package/esm2015/lib/field-component-map.const.js.map +0 -1
  149. package/esm2015/lib/field-component-map.const.metadata.json +0 -1
  150. package/esm2015/lib/field-container/field-container.component.js +0 -57
  151. package/esm2015/lib/field-container/field-container.component.js.map +0 -1
  152. package/esm2015/lib/field-container/field-container.component.metadata.json +0 -1
  153. package/esm2015/lib/field-container/field-container.component.ngfactory.js.map +0 -1
  154. package/esm2015/lib/field-container/field-container.component.scss.shim.ngstyle.js.map +0 -1
  155. package/esm2015/lib/field.directive.js +0 -55
  156. package/esm2015/lib/field.directive.js.map +0 -1
  157. package/esm2015/lib/field.directive.metadata.json +0 -1
  158. package/esm2015/lib/field.directive.ngfactory.js.map +0 -1
  159. package/esm2015/lib/form/form.component.js +0 -40
  160. package/esm2015/lib/form/form.component.js.map +0 -1
  161. package/esm2015/lib/form/form.component.metadata.json +0 -1
  162. package/esm2015/lib/form/form.component.ngfactory.js.map +0 -1
  163. package/esm2015/lib/form/form.component.scss.shim.ngstyle.js.map +0 -1
  164. package/esm2015/lib/form-group-list/form-group-list.component.js +0 -44
  165. package/esm2015/lib/form-group-list/form-group-list.component.js.map +0 -1
  166. package/esm2015/lib/form-group-list/form-group-list.component.metadata.json +0 -1
  167. package/esm2015/lib/form-group-list/form-group-list.component.ngfactory.js.map +0 -1
  168. package/esm2015/lib/form-group-list/form-group-list.component.scss.shim.ngstyle.js.map +0 -1
  169. package/esm2015/lib/form.helpers.js +0 -186
  170. package/esm2015/lib/form.helpers.js.map +0 -1
  171. package/esm2015/lib/form.helpers.metadata.json +0 -1
  172. package/esm2015/lib/form.operators.js +0 -24
  173. package/esm2015/lib/form.operators.js.map +0 -1
  174. package/esm2015/lib/form.operators.metadata.json +0 -1
  175. package/esm2015/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.js +0 -101
  176. package/esm2015/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.js.map +0 -1
  177. package/esm2015/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.metadata.json +0 -1
  178. package/esm2015/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.ngfactory.js.map +0 -1
  179. package/esm2015/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.scss.shim.ngstyle.js.map +0 -1
  180. package/esm2015/lib/material/autocomplete-field/autocomplete-field.component.js +0 -57
  181. package/esm2015/lib/material/autocomplete-field/autocomplete-field.component.js.map +0 -1
  182. package/esm2015/lib/material/autocomplete-field/autocomplete-field.component.metadata.json +0 -1
  183. package/esm2015/lib/material/autocomplete-field/autocomplete-field.component.ngfactory.js.map +0 -1
  184. package/esm2015/lib/material/autocomplete-field/autocomplete-field.component.scss.shim.ngstyle.js.map +0 -1
  185. package/esm2015/lib/material/button/button.component.js +0 -30
  186. package/esm2015/lib/material/button/button.component.js.map +0 -1
  187. package/esm2015/lib/material/button/button.component.metadata.json +0 -1
  188. package/esm2015/lib/material/button/button.component.ngfactory.js.map +0 -1
  189. package/esm2015/lib/material/button/button.component.scss.shim.ngstyle.js.map +0 -1
  190. package/esm2015/lib/material/checkbox-field/checkbox-field.component.js +0 -25
  191. package/esm2015/lib/material/checkbox-field/checkbox-field.component.js.map +0 -1
  192. package/esm2015/lib/material/checkbox-field/checkbox-field.component.metadata.json +0 -1
  193. package/esm2015/lib/material/checkbox-field/checkbox-field.component.ngfactory.js.map +0 -1
  194. package/esm2015/lib/material/checkbox-field/checkbox-field.component.scss.shim.ngstyle.js.map +0 -1
  195. package/esm2015/lib/material/datepicker-field/datepicker-field.component.js +0 -45
  196. package/esm2015/lib/material/datepicker-field/datepicker-field.component.js.map +0 -1
  197. package/esm2015/lib/material/datepicker-field/datepicker-field.component.metadata.json +0 -1
  198. package/esm2015/lib/material/datepicker-field/datepicker-field.component.ngfactory.js.map +0 -1
  199. package/esm2015/lib/material/datepicker-field/datepicker-field.component.scss.shim.ngstyle.js.map +0 -1
  200. package/esm2015/lib/material/divider/divider.component.js +0 -20
  201. package/esm2015/lib/material/divider/divider.component.js.map +0 -1
  202. package/esm2015/lib/material/divider/divider.component.metadata.json +0 -1
  203. package/esm2015/lib/material/divider/divider.component.ngfactory.js.map +0 -1
  204. package/esm2015/lib/material/divider/divider.component.scss.shim.ngstyle.js.map +0 -1
  205. package/esm2015/lib/material/file-upload/file-dropzone.directive.js +0 -31
  206. package/esm2015/lib/material/file-upload/file-dropzone.directive.js.map +0 -1
  207. package/esm2015/lib/material/file-upload/file-dropzone.directive.metadata.json +0 -1
  208. package/esm2015/lib/material/file-upload/file-dropzone.directive.ngfactory.js.map +0 -1
  209. package/esm2015/lib/material/file-upload/file-upload.component.js +0 -80
  210. package/esm2015/lib/material/file-upload/file-upload.component.js.map +0 -1
  211. package/esm2015/lib/material/file-upload/file-upload.component.metadata.json +0 -1
  212. package/esm2015/lib/material/file-upload/file-upload.component.ngfactory.js.map +0 -1
  213. package/esm2015/lib/material/file-upload/file-upload.component.scss.shim.ngstyle.js.map +0 -1
  214. package/esm2015/lib/material/heading/heading.component.js +0 -23
  215. package/esm2015/lib/material/heading/heading.component.js.map +0 -1
  216. package/esm2015/lib/material/heading/heading.component.metadata.json +0 -1
  217. package/esm2015/lib/material/heading/heading.component.ngfactory.js.map +0 -1
  218. package/esm2015/lib/material/heading/heading.component.scss.shim.ngstyle.js.map +0 -1
  219. package/esm2015/lib/material/index.js +0 -15
  220. package/esm2015/lib/material/index.js.map +0 -1
  221. package/esm2015/lib/material/index.metadata.json +0 -1
  222. package/esm2015/lib/material/info/info.component.js +0 -15
  223. package/esm2015/lib/material/info/info.component.js.map +0 -1
  224. package/esm2015/lib/material/info/info.component.metadata.json +0 -1
  225. package/esm2015/lib/material/info/info.component.ngfactory.js.map +0 -1
  226. package/esm2015/lib/material/info/info.component.scss.shim.ngstyle.js.map +0 -1
  227. package/esm2015/lib/material/input-field/input-field.component.js +0 -22
  228. package/esm2015/lib/material/input-field/input-field.component.js.map +0 -1
  229. package/esm2015/lib/material/input-field/input-field.component.metadata.json +0 -1
  230. package/esm2015/lib/material/input-field/input-field.component.ngfactory.js.map +0 -1
  231. package/esm2015/lib/material/input-field/input-field.component.scss.shim.ngstyle.js.map +0 -1
  232. package/esm2015/lib/material/material.module.js +0 -107
  233. package/esm2015/lib/material/material.module.js.map +0 -1
  234. package/esm2015/lib/material/material.module.metadata.json +0 -1
  235. package/esm2015/lib/material/material.module.ngfactory.js.map +0 -1
  236. package/esm2015/lib/material/option/option.component.js +0 -15
  237. package/esm2015/lib/material/option/option.component.js.map +0 -1
  238. package/esm2015/lib/material/option/option.component.metadata.json +0 -1
  239. package/esm2015/lib/material/option/option.component.ngfactory.js.map +0 -1
  240. package/esm2015/lib/material/option/option.component.scss.shim.ngstyle.js.map +0 -1
  241. package/esm2015/lib/material/radio-field/radio-field.component.js +0 -25
  242. package/esm2015/lib/material/radio-field/radio-field.component.js.map +0 -1
  243. package/esm2015/lib/material/radio-field/radio-field.component.metadata.json +0 -1
  244. package/esm2015/lib/material/radio-field/radio-field.component.ngfactory.js.map +0 -1
  245. package/esm2015/lib/material/radio-field/radio-field.component.scss.shim.ngstyle.js.map +0 -1
  246. package/esm2015/lib/material/select-field/select-field.component.js +0 -50
  247. package/esm2015/lib/material/select-field/select-field.component.js.map +0 -1
  248. package/esm2015/lib/material/select-field/select-field.component.metadata.json +0 -1
  249. package/esm2015/lib/material/select-field/select-field.component.ngfactory.js.map +0 -1
  250. package/esm2015/lib/material/select-field/select-field.component.scss.shim.ngstyle.js.map +0 -1
  251. package/esm2015/lib/material/selected-file/selected-file.component.js +0 -17
  252. package/esm2015/lib/material/selected-file/selected-file.component.js.map +0 -1
  253. package/esm2015/lib/material/selected-file/selected-file.component.metadata.json +0 -1
  254. package/esm2015/lib/material/selected-file/selected-file.component.ngfactory.js.map +0 -1
  255. package/esm2015/lib/material/selected-file/selected-file.component.scss.shim.ngstyle.js.map +0 -1
  256. package/esm2015/lib/material/slider-field/slider-field.component.js +0 -26
  257. package/esm2015/lib/material/slider-field/slider-field.component.js.map +0 -1
  258. package/esm2015/lib/material/slider-field/slider-field.component.metadata.json +0 -1
  259. package/esm2015/lib/material/slider-field/slider-field.component.ngfactory.js.map +0 -1
  260. package/esm2015/lib/material/slider-field/slider-field.component.scss.shim.ngstyle.js.map +0 -1
  261. package/esm2015/lib/material/textarea-field/textarea-field.component.js +0 -22
  262. package/esm2015/lib/material/textarea-field/textarea-field.component.js.map +0 -1
  263. package/esm2015/lib/material/textarea-field/textarea-field.component.metadata.json +0 -1
  264. package/esm2015/lib/material/textarea-field/textarea-field.component.ngfactory.js.map +0 -1
  265. package/esm2015/lib/material/textarea-field/textarea-field.component.scss.shim.ngstyle.js.map +0 -1
  266. package/esm2015/lib/material/unit-conversion-field/unit-conversion-field.component.js +0 -63
  267. package/esm2015/lib/material/unit-conversion-field/unit-conversion-field.component.js.map +0 -1
  268. package/esm2015/lib/material/unit-conversion-field/unit-conversion-field.component.metadata.json +0 -1
  269. package/esm2015/lib/material/unit-conversion-field/unit-conversion-field.component.ngfactory.js.map +0 -1
  270. package/esm2015/lib/material/unit-conversion-field/unit-conversion-field.component.scss.shim.ngstyle.js.map +0 -1
  271. package/esm2015/lib/models/autocomplete-chiplist-field.config.js +0 -2
  272. package/esm2015/lib/models/autocomplete-chiplist-field.config.js.map +0 -1
  273. package/esm2015/lib/models/autocomplete-chiplist-field.config.metadata.json +0 -1
  274. package/esm2015/lib/models/autocomplete-field.config.js +0 -2
  275. package/esm2015/lib/models/autocomplete-field.config.js.map +0 -1
  276. package/esm2015/lib/models/autocomplete-field.config.metadata.json +0 -1
  277. package/esm2015/lib/models/button.config.js +0 -2
  278. package/esm2015/lib/models/button.config.js.map +0 -1
  279. package/esm2015/lib/models/button.config.metadata.json +0 -1
  280. package/esm2015/lib/models/checkbox-field.config.js +0 -2
  281. package/esm2015/lib/models/checkbox-field.config.js.map +0 -1
  282. package/esm2015/lib/models/checkbox-field.config.metadata.json +0 -1
  283. package/esm2015/lib/models/crispr-field.config.js +0 -22
  284. package/esm2015/lib/models/crispr-field.config.js.map +0 -1
  285. package/esm2015/lib/models/crispr-field.config.metadata.json +0 -1
  286. package/esm2015/lib/models/datepicker-field.config.js +0 -2
  287. package/esm2015/lib/models/datepicker-field.config.js.map +0 -1
  288. package/esm2015/lib/models/datepicker-field.config.metadata.json +0 -1
  289. package/esm2015/lib/models/divider.config.js +0 -2
  290. package/esm2015/lib/models/divider.config.js.map +0 -1
  291. package/esm2015/lib/models/divider.config.metadata.json +0 -1
  292. package/esm2015/lib/models/file-upload-field.config.js +0 -2
  293. package/esm2015/lib/models/file-upload-field.config.js.map +0 -1
  294. package/esm2015/lib/models/file-upload-field.config.metadata.json +0 -1
  295. package/esm2015/lib/models/form-group-list.config.js +0 -2
  296. package/esm2015/lib/models/form-group-list.config.js.map +0 -1
  297. package/esm2015/lib/models/form-group-list.config.metadata.json +0 -1
  298. package/esm2015/lib/models/heading.config.js +0 -3
  299. package/esm2015/lib/models/heading.config.js.map +0 -1
  300. package/esm2015/lib/models/heading.config.metadata.json +0 -1
  301. package/esm2015/lib/models/index.js +0 -16
  302. package/esm2015/lib/models/index.js.map +0 -1
  303. package/esm2015/lib/models/index.metadata.json +0 -1
  304. package/esm2015/lib/models/input-field.config.js +0 -2
  305. package/esm2015/lib/models/input-field.config.js.map +0 -1
  306. package/esm2015/lib/models/input-field.config.metadata.json +0 -1
  307. package/esm2015/lib/models/radio-field.config.js +0 -2
  308. package/esm2015/lib/models/radio-field.config.js.map +0 -1
  309. package/esm2015/lib/models/radio-field.config.metadata.json +0 -1
  310. package/esm2015/lib/models/select-field.config.js +0 -2
  311. package/esm2015/lib/models/select-field.config.js.map +0 -1
  312. package/esm2015/lib/models/select-field.config.metadata.json +0 -1
  313. package/esm2015/lib/models/slider-field.config.js +0 -2
  314. package/esm2015/lib/models/slider-field.config.js.map +0 -1
  315. package/esm2015/lib/models/slider-field.config.metadata.json +0 -1
  316. package/esm2015/lib/models/textarea-field.config.js +0 -2
  317. package/esm2015/lib/models/textarea-field.config.js.map +0 -1
  318. package/esm2015/lib/models/textarea-field.config.metadata.json +0 -1
  319. package/esm2015/lib/models/unit-conversion-field.config.js +0 -2
  320. package/esm2015/lib/models/unit-conversion-field.config.js.map +0 -1
  321. package/esm2015/lib/models/unit-conversion-field.config.metadata.json +0 -1
  322. package/esm2015/lib/pipes/initial-control-value.pipe.js +0 -16
  323. package/esm2015/lib/pipes/initial-control-value.pipe.js.map +0 -1
  324. package/esm2015/lib/pipes/initial-control-value.pipe.metadata.json +0 -1
  325. package/esm2015/lib/pipes/initial-control-value.pipe.ngfactory.js.map +0 -1
  326. package/esm2015/lib/public_api.js +0 -9
  327. package/esm2015/lib/public_api.js.map +0 -1
  328. package/esm2015/lib/public_api.metadata.json +0 -1
  329. package/esm2015/lib/sub-group/sub-group.component.js +0 -17
  330. package/esm2015/lib/sub-group/sub-group.component.js.map +0 -1
  331. package/esm2015/lib/sub-group/sub-group.component.metadata.json +0 -1
  332. package/esm2015/lib/sub-group/sub-group.component.ngfactory.js.map +0 -1
  333. package/esm2015/lib/sub-group/sub-group.component.scss.shim.ngstyle.js.map +0 -1
  334. package/esm2015/tft-crispr-forms.js +0 -30
  335. package/esm2015/tft-crispr-forms.js.map +0 -1
  336. package/esm2015/tft-crispr-forms.metadata.json +0 -1
  337. package/fesm2015/tft-crispr-forms.js +0 -1263
  338. package/fesm2015/tft-crispr-forms.js.map +0 -1
  339. package/tft-crispr-forms-12.2.21.tgz +0 -0
  340. package/tft-crispr-forms.metadata.json +0 -1
@@ -0,0 +1,51 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { createControlForType } from '../form.helpers';
3
+ import { CrisprFieldComponent, crisprControlMixin } from '../abstracts';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../field-container/field-container.component";
6
+ import * as i2 from "@angular/material/button";
7
+ import * as i3 from "@angular/material/icon";
8
+ import * as i4 from "@angular/forms";
9
+ import * as i5 from "@tft/form-validation-handler";
10
+ import * as i6 from "@angular/common";
11
+ import * as i7 from "../field.directive";
12
+ import * as i8 from "../pipes/initial-control-value.pipe";
13
+ const defaultConfig = {
14
+ addButtonLabel: 'ADD ITEM',
15
+ minListLength: 1,
16
+ };
17
+ const FormGroupListMixin = crisprControlMixin(CrisprFieldComponent);
18
+ export class FormGroupListComponent extends FormGroupListMixin {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.defaultConfig = defaultConfig;
22
+ }
23
+ ngOnInit() {
24
+ super.ngOnInit();
25
+ // TODO: this is required to ngFor of controls in template, must be a better way
26
+ this.formArray = this.control;
27
+ }
28
+ setControlValue(values) {
29
+ if (this.control) {
30
+ if (values?.length > 0) {
31
+ values.forEach(value => this.addGroup(value));
32
+ }
33
+ else if (this.config.displayInitialItem) {
34
+ this.addGroup();
35
+ }
36
+ }
37
+ }
38
+ addGroup(value = null) {
39
+ this.control.push(createControlForType(this.config.itemConfig, value));
40
+ }
41
+ deleteGroup(index) {
42
+ this.control.removeAt(index);
43
+ }
44
+ }
45
+ FormGroupListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: FormGroupListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
46
+ FormGroupListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: FormGroupListComponent, selector: "crispr-form-group-list", usesInheritance: true, ngImport: i0, template: "\n<crispr-field-container\n [config]=\"config\"\n [group]=\"group\"\n [formGroup]=\"group\">\n\n <div [formArrayName]=\"config.controlName\">\n <!-- TODO: add sortBy function -->\n <div *ngFor=\"let control of formArray?.controls; let i = index;\">\n <!-- TODO: use content projection to allow custom item label component -->\n <div class=\"item-header\">\n <span class=\"mat-h2\" *ngIf=\"config.itemLabelBuilder\"> {{ config.itemLabelBuilder(i) }} </span>\n <button\n mat-icon-button\n *ngIf=\"i + 1 > config.minListLength\">\n <mat-icon (click)=\"deleteGroup(i)\">delete</mat-icon>\n </button>\n </div>\n <div\n [formGroupName]=\"i\">\n <ng-container\n *ngFor=\"let field of config.itemConfig.fields;\"\n crisprField\n [config]=\"field\"\n [value]=\"value && value[i] | initialControlValue : field\"\n [group]=\"control\">\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"group-footer\">\n <button\n type=\"button\"\n class=\"add\"\n mat-raised-button\n [color]=\"config.addButtonColor\"\n (click)=\"addGroup()\">\n {{config.addItemLabel || config.addButtonLabel}}\n </button>\n </div>\n\n</crispr-field-container>\n", styles: [".item-header{display:flex;justify-content:space-between}.group-footer{display:flex;justify-content:flex-end}.group-footer button.add{margin-bottom:16px}\n"], components: [{ type: i1.FieldContainerComponent, selector: "crispr-field-container", inputs: ["config", "group", "inlineField"] }, { type: i2.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.ControlErrorContainerDirective, selector: "[controlErrorContainer], [formGroup]" }, { type: i4.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i7.CrisprFieldDirective, selector: "[crisprField]", inputs: ["config", "group", "value"] }], pipes: { "initialControlValue": i8.InitialControlValuePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
47
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: FormGroupListComponent, decorators: [{
48
+ type: Component,
49
+ args: [{ selector: 'crispr-form-group-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "\n<crispr-field-container\n [config]=\"config\"\n [group]=\"group\"\n [formGroup]=\"group\">\n\n <div [formArrayName]=\"config.controlName\">\n <!-- TODO: add sortBy function -->\n <div *ngFor=\"let control of formArray?.controls; let i = index;\">\n <!-- TODO: use content projection to allow custom item label component -->\n <div class=\"item-header\">\n <span class=\"mat-h2\" *ngIf=\"config.itemLabelBuilder\"> {{ config.itemLabelBuilder(i) }} </span>\n <button\n mat-icon-button\n *ngIf=\"i + 1 > config.minListLength\">\n <mat-icon (click)=\"deleteGroup(i)\">delete</mat-icon>\n </button>\n </div>\n <div\n [formGroupName]=\"i\">\n <ng-container\n *ngFor=\"let field of config.itemConfig.fields;\"\n crisprField\n [config]=\"field\"\n [value]=\"value && value[i] | initialControlValue : field\"\n [group]=\"control\">\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"group-footer\">\n <button\n type=\"button\"\n class=\"add\"\n mat-raised-button\n [color]=\"config.addButtonColor\"\n (click)=\"addGroup()\">\n {{config.addItemLabel || config.addButtonLabel}}\n </button>\n </div>\n\n</crispr-field-container>\n", styles: [".item-header{display:flex;justify-content:space-between}.group-footer{display:flex;justify-content:flex-end}.group-footer button.add{margin-bottom:16px}\n"] }]
50
+ }] });
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1ncm91cC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3Jpc3ByLWZvcm1zL3NyYy9saWIvZm9ybS1ncm91cC1saXN0L2Zvcm0tZ3JvdXAtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NyaXNwci1mb3Jtcy9zcmMvbGliL2Zvcm0tZ3JvdXAtbGlzdC9mb3JtLWdyb3VwLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7Ozs7QUFFeEUsTUFBTSxhQUFhLEdBQWlDO0lBQ2xELGNBQWMsRUFBRSxVQUFVO0lBQzFCLGFBQWEsRUFBRSxDQUFDO0NBQ2pCLENBQUM7QUFFRixNQUFNLGtCQUFrQixHQUFHLGtCQUFrQixDQUFzQixvQkFBb0IsQ0FBQyxDQUFDO0FBT3pGLE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxrQkFBa0I7SUFOOUQ7O1FBT0Usa0JBQWEsR0FBRyxhQUFhLENBQUE7S0E4QjlCO0lBdkJDLFFBQVE7UUFDTixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakIsZ0ZBQWdGO1FBQ2hGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQW9CLENBQUM7SUFDN0MsQ0FBQztJQUVELGVBQWUsQ0FBQyxNQUFhO1FBQzNCLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNmLElBQUcsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDL0M7aUJBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFO2dCQUN6QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7YUFDaEI7U0FDRjtJQUNILENBQUM7SUFFRCxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUk7UUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQzs7bUhBOUJVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLHFGQ25CbkMsMnlDQTBDQTsyRkR2QmEsc0JBQXNCO2tCQU5sQyxTQUFTOytCQUNFLHdCQUF3QixtQkFHakIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQXJyYXkgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB0eXBlIHsgRm9ybUdyb3VwTGlzdENvbmZpZyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBjcmVhdGVDb250cm9sRm9yVHlwZSB9IGZyb20gJy4uL2Zvcm0uaGVscGVycyc7XG5pbXBvcnQgeyBDcmlzcHJGaWVsZENvbXBvbmVudCwgY3Jpc3ByQ29udHJvbE1peGluIH0gZnJvbSAnLi4vYWJzdHJhY3RzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZzogUGFydGlhbDxGb3JtR3JvdXBMaXN0Q29uZmlnPiA9IHtcbiAgYWRkQnV0dG9uTGFiZWw6ICdBREQgSVRFTScsXG4gIG1pbkxpc3RMZW5ndGg6IDEsXG59O1xuXG5jb25zdCBGb3JtR3JvdXBMaXN0TWl4aW4gPSBjcmlzcHJDb250cm9sTWl4aW48Rm9ybUdyb3VwTGlzdENvbmZpZz4oQ3Jpc3ByRmllbGRDb21wb25lbnQpO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3Jpc3ByLWZvcm0tZ3JvdXAtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWdyb3VwLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLWdyb3VwLWxpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUdyb3VwTGlzdENvbXBvbmVudCBleHRlbmRzIEZvcm1Hcm91cExpc3RNaXhpbiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGRlZmF1bHRDb25maWcgPSBkZWZhdWx0Q29uZmlnXG4gIGdyb3VwOiBGb3JtR3JvdXA7XG4gIGNvbnRyb2w6IEZvcm1BcnJheTtcbiAgX3ZhbHVlOiBhbnlbXVxuICAvLyB2YWx1ZTogYW55W107IC8vIFRPRE86IG5vdCBzdXJlIGhvdyB0byBzdHJvbmdseSB0eXBlIHRoaXMgeWV0XG4gIGZvcm1BcnJheTogRm9ybUFycmF5O1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgLy8gVE9ETzogdGhpcyBpcyByZXF1aXJlZCB0byBuZ0ZvciBvZiBjb250cm9scyBpbiB0ZW1wbGF0ZSwgbXVzdCBiZSBhIGJldHRlciB3YXlcbiAgICB0aGlzLmZvcm1BcnJheSA9IHRoaXMuY29udHJvbCBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBzZXRDb250cm9sVmFsdWUodmFsdWVzOiBhbnlbXSkge1xuICAgIGlmKHRoaXMuY29udHJvbCkge1xuICAgICAgaWYodmFsdWVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhbHVlcy5mb3JFYWNoKHZhbHVlID0+IHRoaXMuYWRkR3JvdXAodmFsdWUpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcuZGlzcGxheUluaXRpYWxJdGVtKSB7XG4gICAgICAgIHRoaXMuYWRkR3JvdXAoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZEdyb3VwKHZhbHVlID0gbnVsbCkge1xuICAgIHRoaXMuY29udHJvbC5wdXNoKGNyZWF0ZUNvbnRyb2xGb3JUeXBlKHRoaXMuY29uZmlnLml0ZW1Db25maWcsIHZhbHVlKSk7XG4gIH1cblxuICBkZWxldGVHcm91cChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5jb250cm9sLnJlbW92ZUF0KGluZGV4KTtcbiAgfVxufVxuIiwiXG48Y3Jpc3ByLWZpZWxkLWNvbnRhaW5lclxuICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gIFtncm91cF09XCJncm91cFwiXG4gIFtmb3JtR3JvdXBdPVwiZ3JvdXBcIj5cblxuICA8ZGl2IFtmb3JtQXJyYXlOYW1lXT1cImNvbmZpZy5jb250cm9sTmFtZVwiPlxuICAgIDwhLS0gVE9ETzogYWRkIHNvcnRCeSBmdW5jdGlvbiAtLT5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb250cm9sIG9mIGZvcm1BcnJheT8uY29udHJvbHM7IGxldCBpID0gaW5kZXg7XCI+XG4gICAgICA8IS0tIFRPRE86IHVzZSBjb250ZW50IHByb2plY3Rpb24gdG8gYWxsb3cgY3VzdG9tIGl0ZW0gbGFiZWwgY29tcG9uZW50IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIml0ZW0taGVhZGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWgyXCIgKm5nSWY9XCJjb25maWcuaXRlbUxhYmVsQnVpbGRlclwiPiB7eyAgY29uZmlnLml0ZW1MYWJlbEJ1aWxkZXIoaSkgfX0gPC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJpICsgMSA+IGNvbmZpZy5taW5MaXN0TGVuZ3RoXCI+XG4gICAgICAgICAgPG1hdC1pY29uIChjbGljayk9XCJkZWxldGVHcm91cChpKVwiPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBjb25maWcuaXRlbUNvbmZpZy5maWVsZHM7XCJcbiAgICAgICAgICBjcmlzcHJGaWVsZFxuICAgICAgICAgIFtjb25maWddPVwiZmllbGRcIlxuICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZSAmJiB2YWx1ZVtpXSB8IGluaXRpYWxDb250cm9sVmFsdWUgOiBmaWVsZFwiXG4gICAgICAgICAgW2dyb3VwXT1cImNvbnRyb2xcIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJncm91cC1mb290ZXJcIj5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiYWRkXCJcbiAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICBbY29sb3JdPVwiY29uZmlnLmFkZEJ1dHRvbkNvbG9yXCJcbiAgICAgIChjbGljayk9XCJhZGRHcm91cCgpXCI+XG4gICAgICB7e2NvbmZpZy5hZGRJdGVtTGFiZWwgfHwgY29uZmlnLmFkZEJ1dHRvbkxhYmVsfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbjwvY3Jpc3ByLWZpZWxkLWNvbnRhaW5lcj5cbiJdfQ==
@@ -0,0 +1,54 @@
1
+ import { MatButtonModule } from '@angular/material/button';
2
+ import { FieldContainerModule } from '../field-container';
3
+ import { MatIconModule } from '@angular/material/icon';
4
+ import { CrisprFieldModule } from '../field.directive';
5
+ import { CrisprPipesModule } from '../pipes/crispr-pipes.module';
6
+ import { NgModule } from '@angular/core';
7
+ import { ReactiveFormsModule } from '@angular/forms';
8
+ import { FormGroupListComponent } from './form-group-list.component';
9
+ import { CommonModule } from '@angular/common';
10
+ import { FormValidationHandlerModule } from '@tft/form-validation-handler';
11
+ import * as i0 from "@angular/core";
12
+ export class FormGroupListModule {
13
+ }
14
+ FormGroupListModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: FormGroupListModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
15
+ FormGroupListModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: FormGroupListModule, declarations: [FormGroupListComponent], imports: [CommonModule,
16
+ MatButtonModule,
17
+ MatIconModule,
18
+ FieldContainerModule,
19
+ ReactiveFormsModule,
20
+ CrisprFieldModule,
21
+ CrisprPipesModule,
22
+ FormValidationHandlerModule], exports: [FormGroupListComponent] });
23
+ FormGroupListModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: FormGroupListModule, imports: [[
24
+ CommonModule,
25
+ MatButtonModule,
26
+ MatIconModule,
27
+ FieldContainerModule,
28
+ ReactiveFormsModule,
29
+ CrisprFieldModule,
30
+ CrisprPipesModule,
31
+ FormValidationHandlerModule
32
+ ]] });
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: FormGroupListModule, decorators: [{
34
+ type: NgModule,
35
+ args: [{
36
+ imports: [
37
+ CommonModule,
38
+ MatButtonModule,
39
+ MatIconModule,
40
+ FieldContainerModule,
41
+ ReactiveFormsModule,
42
+ CrisprFieldModule,
43
+ CrisprPipesModule,
44
+ FormValidationHandlerModule
45
+ ],
46
+ exports: [
47
+ FormGroupListComponent
48
+ ],
49
+ declarations: [
50
+ FormGroupListComponent
51
+ ]
52
+ }]
53
+ }] });
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1ncm91cC1saXN0Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3Jpc3ByLWZvcm1zL3NyYy9saWIvZm9ybS1ncm91cC1saXN0L2Zvcm0tZ3JvdXAtbGlzdC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7QUFxQjNFLE1BQU0sT0FBTyxtQkFBbUI7O2dIQUFuQixtQkFBbUI7aUhBQW5CLG1CQUFtQixpQkFKNUIsc0JBQXNCLGFBYnRCLFlBQVk7UUFDWixlQUFlO1FBQ2YsYUFBYTtRQUNiLG9CQUFvQjtRQUNwQixtQkFBbUI7UUFDbkIsaUJBQWlCO1FBQ2pCLGlCQUFpQjtRQUNqQiwyQkFBMkIsYUFHM0Isc0JBQXNCO2lIQU9iLG1CQUFtQixZQWxCckI7WUFDUCxZQUFZO1lBQ1osZUFBZTtZQUNmLGFBQWE7WUFDYixvQkFBb0I7WUFDcEIsbUJBQW1CO1lBQ25CLGlCQUFpQjtZQUNqQixpQkFBaUI7WUFDakIsMkJBQTJCO1NBQzVCOzJGQVNVLG1CQUFtQjtrQkFuQi9CLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixhQUFhO3dCQUNiLG9CQUFvQjt3QkFDcEIsbUJBQW1CO3dCQUNuQixpQkFBaUI7d0JBQ2pCLGlCQUFpQjt3QkFDakIsMkJBQTJCO3FCQUM1QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1Asc0JBQXNCO3FCQUN2QjtvQkFDRCxZQUFZLEVBQUU7d0JBQ1osc0JBQXNCO3FCQUN2QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBGaWVsZENvbnRhaW5lck1vZHVsZSB9IGZyb20gJy4uL2ZpZWxkLWNvbnRhaW5lcic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBDcmlzcHJGaWVsZE1vZHVsZSB9IGZyb20gJy4uL2ZpZWxkLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDcmlzcHJQaXBlc01vZHVsZSB9IGZyb20gJy4uL3BpcGVzL2NyaXNwci1waXBlcy5tb2R1bGUnO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtR3JvdXBMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi9mb3JtLWdyb3VwLWxpc3QuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3JtVmFsaWRhdGlvbkhhbmRsZXJNb2R1bGUgfSBmcm9tICdAdGZ0L2Zvcm0tdmFsaWRhdGlvbi1oYW5kbGVyJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBGaWVsZENvbnRhaW5lck1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIENyaXNwckZpZWxkTW9kdWxlLFxuICAgIENyaXNwclBpcGVzTW9kdWxlLFxuICAgIEZvcm1WYWxpZGF0aW9uSGFuZGxlck1vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgRm9ybUdyb3VwTGlzdENvbXBvbmVudFxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBGb3JtR3JvdXBMaXN0Q29tcG9uZW50XG4gIF1cbn0pXG5cbmV4cG9ydCBjbGFzcyBGb3JtR3JvdXBMaXN0TW9kdWxlIHtcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export * from './form-group-list.component';
2
+ export * from './form-group-list.module';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NyaXNwci1mb3Jtcy9zcmMvbGliL2Zvcm0tZ3JvdXAtbGlzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Zvcm0tZ3JvdXAtbGlzdC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtLWdyb3VwLWxpc3QubW9kdWxlJztcbiJdfQ==
@@ -0,0 +1,185 @@
1
+ import { ControlType, } from './models/crispr-field.config';
2
+ import { from, of, isObservable, combineLatest } from 'rxjs';
3
+ import { FormGroup, FormArray, FormControl } from '@angular/forms';
4
+ import { valueIn } from './form.operators';
5
+ import { map, startWith } from 'rxjs/operators';
6
+ /**
7
+ * Watches a single control for a list of values, returns true when field value matches any value in list
8
+ * unless an evaluate method is found on config, in which case that method is run on the returned boolean value
9
+ * @param group the direct parent of the field we want to watch
10
+ * @param config
11
+ */
12
+ export function checkControlForValues(group, config) {
13
+ // check that all the pieces we need are available
14
+ if (config && config.controlName && Array.isArray(config.values)) {
15
+ return getValueChanges(group, config.controlName).pipe(
16
+ // return a boolean, true if value is in the values being watch for, otherwise false
17
+ valueIn(config.values), map((isValueInValues) => {
18
+ // since we can only check if the value is in the list of watched values, the evaluate function gives us
19
+ // a chance to make other decisions based on if the boolean returned, e.g. return true if value not in watched values
20
+ if (config.evaluate && config.evaluate instanceof Function) {
21
+ return config.evaluate(isValueInValues);
22
+ }
23
+ else {
24
+ return isValueInValues;
25
+ }
26
+ }));
27
+ }
28
+ else {
29
+ //
30
+ return of(true);
31
+ }
32
+ }
33
+ /**
34
+ * Watches a list of fields for individual lists of values returning true when any field contains one
35
+ * of the values being watched for, or optionally running a function on the array of resolved booleans
36
+ * from the listed fields and returning a boolean
37
+ * @param group the form group that has the fields to watch as direct descendants
38
+ * @param config the configuration to use when calling the function
39
+ */
40
+ export function checkControlsForValues(group, config) {
41
+ // if no config is passed we just want to show the field, so we return an observable of true
42
+ if (!config || !config.watchConfigs) {
43
+ return of(true);
44
+ }
45
+ // we run checkControlForValues on every control in the list of WatchConfigs creating
46
+ // an array of Observable watching fields for values
47
+ const fieldTriggers = config.watchConfigs.map(watchConfig => {
48
+ // resolves a boolean, true when field value matches a watched value, otherwise false
49
+ return checkControlForValues(group, watchConfig);
50
+ });
51
+ return combineLatest(fieldTriggers).pipe(startWith([true]), map((booleans) => {
52
+ // if the user passed an evaluate function use it
53
+ if (config.evaluate && config.evaluate instanceof Function) {
54
+ return config.evaluate(booleans);
55
+ }
56
+ else { // otherwise we return true if any of the watched fields resolve to true
57
+ return booleans.some(bool => bool);
58
+ }
59
+ }));
60
+ }
61
+ /**
62
+ * Watches values on an array of fields, computing their values as they change
63
+ * @param group the group to get the fields from, for now it can only be the parent of the computed field
64
+ * @param computeFieldsConfig the configuration that drives the computation, holds the names to watch and the
65
+ * computation function that get called against the array of values
66
+ */
67
+ export function computeValueFromFields(group, computeFieldsConfig) {
68
+ // TODO: better checking
69
+ const { controlNamesToWatch } = computeFieldsConfig;
70
+ //creates an observable listener for each control in the controlNamesToWatch array
71
+ return combineLatest(controlNamesToWatch.map(controlNameToWatch => getValueChanges(group, controlNameToWatch))).pipe(
72
+ // each time a watched field values changes a new array of the latest field values is pipe through to the
73
+ // compute callback. Which runs the users logic on the values to compute this fields value
74
+ map(valuesArray => computeFieldsConfig.computeCallback(valuesArray)));
75
+ }
76
+ /**
77
+ * A simple wrapper for doing error checking around getting the valueChanges observable from a control on a form group
78
+ * @param group the form group we want to pull the observable from
79
+ * @param controlName the name of the control who's value we want to subscribe to
80
+ */
81
+ function getValueChanges(group, controlName) {
82
+ const control = group.get(controlName);
83
+ if (!control) {
84
+ throw new Error(`No control with controlName ${controlName}`);
85
+ }
86
+ return control.valueChanges;
87
+ }
88
+ /**
89
+ * TODO: move to utils library after library is built
90
+ * Allows developer to pass an array of operators into the pipe of an Observable.
91
+ * Useful for creating function with a variable amount of operators to be run
92
+ * @param observable the observable to pass the operators to
93
+ * @param operators array of operators to pipe
94
+ */
95
+ function pipeOperatorsIntoObservable(observable, operators) {
96
+ try {
97
+ return operators.reduce((obs, op) => {
98
+ return obs.pipe(op);
99
+ }, observable);
100
+ }
101
+ catch {
102
+ console.error('Unable to pipe operators into observable');
103
+ return of(null);
104
+ }
105
+ }
106
+ export function callOptionsIfFunction(options, parentGroup, searchString) {
107
+ return options instanceof Function ? options(parentGroup, searchString) : options;
108
+ }
109
+ /**
110
+ * The user can give us select options as an array, a function that resolves to a promise,
111
+ * or an observable. This functions consumes any of those and returns an observable that
112
+ * resolves an array of options
113
+ *
114
+ * @param options the options passed in from the config
115
+ * @param emptyMessageOption the message to display when the array is empty
116
+ */
117
+ export function observablifyOptions(options, parentGroup, searchString) {
118
+ const calledOptions = callOptionsIfFunction(options, parentGroup, searchString);
119
+ // if options are a promise
120
+ return calledOptions instanceof Promise
121
+ // convert to observable
122
+ ? from(calledOptions)
123
+ // if array that isn't empty
124
+ : Array.isArray(calledOptions) && calledOptions.length
125
+ // convert to observable
126
+ ? of(calledOptions)
127
+ // if observable
128
+ : isObservable(calledOptions)
129
+ // return it
130
+ ? calledOptions
131
+ // else an empty array
132
+ : of([]);
133
+ }
134
+ /**
135
+ * Determines if the field config is for a form control (not a divider, heading or other non-control field)
136
+ * */
137
+ export function isControlConfig(fieldConfig) {
138
+ return 'controlName' in fieldConfig;
139
+ }
140
+ /**
141
+ * builds out form group based on config
142
+ * @param config a configuration for a form group
143
+ * @param value an object of initial values to pass in
144
+ * @param group the form group to modify and build out
145
+ */
146
+ export function buildFormGroupFromConfig(config, value = null, group = new FormGroup({})) {
147
+ config.fields.forEach((controlConfig) => {
148
+ if (isControlConfig(controlConfig)) {
149
+ // then add a control to the group using the controlName from configuration
150
+ const { controlName } = controlConfig;
151
+ // if there's a value object and it has a non-null/undefined value for this field use it.
152
+ // Otherwise, default to null
153
+ const controlValue = (value && value[controlName]) ?? null;
154
+ group.addControl(controlName, createControlForType(controlConfig, controlValue));
155
+ }
156
+ });
157
+ group.setValidators(config.validators);
158
+ return group;
159
+ }
160
+ /**
161
+ * Analyze the config and build a form control to spec. Notice we don't use FormBuilder here
162
+ * as we want to keep this function pure.
163
+ * @param controlConfig the configuration object for the control to build
164
+ * @param value an initial value to use if passed in
165
+ */
166
+ export function createControlForType(controlConfig, value = null) {
167
+ // build form control out based on the control type
168
+ const control = controlConfig.controlType === ControlType.SUB_GROUP
169
+ ? buildFormGroupFromConfig(controlConfig, value)
170
+ : controlConfig.controlType === ControlType.GROUP_LIST
171
+ ? new FormArray([], controlConfig.validators)
172
+ : new FormControl(value || null, controlConfig.validators);
173
+ return control;
174
+ }
175
+ /**
176
+ * A basic filter function that filters the search string against the label of the options object
177
+ * @param options the array of options to filter
178
+ * @param searchString the string from the input
179
+ */
180
+ export function filterOptionsByLabel(options, searchString) {
181
+ return options.filter(option => {
182
+ return option.label && option.label.toLowerCase().includes(searchString.toLowerCase());
183
+ });
184
+ }
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jcmlzcHItZm9ybXMvc3JjL2xpYi9mb3JtLmhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsT0FBTyxFQUNMLFdBQVcsR0FDWixNQUFNLDhCQUE4QixDQUFBO0FBQ3JDLE9BQU8sRUFDTCxJQUFJLEVBRUosRUFBRSxFQUNGLFlBQVksRUFDWixhQUFhLEVBRWQsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQXNCaEQ7Ozs7O0VBS0U7QUFDRixNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBZ0IsRUFBRSxNQUEwQjtJQUNoRixrREFBa0Q7SUFDbEQsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNoRSxPQUFPLGVBQWUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUk7UUFDcEQsb0ZBQW9GO1FBQ3BGLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQ3RCLEdBQUcsQ0FBQyxDQUFDLGVBQXdCLEVBQUUsRUFBRTtZQUMvQix3R0FBd0c7WUFDeEcscUhBQXFIO1lBQ3JILElBQUssTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxZQUFZLFFBQVEsRUFBRztnQkFDNUQsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2FBQ3pDO2lCQUFNO2dCQUFFLE9BQU8sZUFBZSxDQUFDO2FBQUU7UUFD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Q0FBQyxDQUFDO0lBQ3pGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgU2VsZWN0T3B0aW9uLFxuICBBbnlGaWVsZENvbmZpZyxcbiAgRm9ybUNvbmZpZyxcbiAgRm9ybUdyb3VwTGlzdENvbmZpZyxcbiAgQ3Jpc3ByQ29udHJvbENvbmZpZyxcbiAgT3B0aW9uc1R5cGUsXG4gIEF1dG9jb21wbGV0ZU9wdGlvbnNDYWxsYmFjayxcbiAgQ3Jpc3ByRmllbGRDb25maWcsXG4gIENvbnRyb2xWYWx1ZVxufSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQge1xuICBDb250cm9sVHlwZSxcbn0gZnJvbSAnLi9tb2RlbHMvY3Jpc3ByLWZpZWxkLmNvbmZpZydcbmltcG9ydCB7XG4gIGZyb20sXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBpc09ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIE9wZXJhdG9yRnVuY3Rpb25cbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1BcnJheSwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB2YWx1ZUluIH0gZnJvbSAnLi9mb3JtLm9wZXJhdG9ycyc7XG5pbXBvcnQgeyBtYXAsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBEWU5BTUlDIEZPUk0gVVRJTFM6IGEgY29sbGVjdGlvbiBvZiBwdXJlL21vc3RseSBwdXJlIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VmdWwgYm90aCBpbnRlcm5hbGx5IGFuZCBmb3JcbiAqIGRldmVsb3BpbmcgdGhlIGNvbnN1bWluZyBhcHAuXG4gKlxuICogVGhleSBhcmUgc29ydGVkIGJ5IHVzZSBjYXNlOiBidWlsZGluZyBvdXQgdGhlIGZvcm0gb2JqZWN0OyBoZWxwZXIgZnVuY3Rpb25zIHRvIHVzZSB3aXRoIHRoZSBkaXNhYmxlZCQgZnVuY3Rpb247XG4gKiBoZWxwZXIgZnVuY3Rpb25zIHRvIHVzZSB3aXRoIHRoZSBjb21wdXRlIGZpZWxkIGZ1bmN0aW9uOyBhbmQgb3RoZXIgbG9naWMgc2hhcmVkIGJldHdlZW4gY29tcG9uZW50c1xuICovXG5cbi8qKlxuICogUmVxdWlyZWQgY29uZmlndXJhdGlvbiB0byB1c2Ugd2l0aCBjaGVja0NvbnRyb2xGb3JWYWx1ZXMgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja0NvbnRyb2xDb25maWcge1xuICAvLyB0aGUgY29udHJvbCBuYW1lIHRvIHdhdGNoXG4gIGNvbnRyb2xOYW1lOiBzdHJpbmc7XG4gIC8vIHRoZSB2YWx1ZXMgdG8gd2F0Y2ggZm9yXG4gIHZhbHVlczogc3RyaW5nW107XG4gIC8vIHRoZSBmdW5jdGlvbiB0byBydW4gb24gdGhlIGJvb2xlYW4gcmV0dXJuZWQgYnkgdGhlIHdhdGNoZXJcbiAgZXZhbHVhdGU/OiAoaXNWYWx1ZUluVmFsdWVzOiBib29sZWFuKSA9PiBib29sZWFuO1xufVxuXG4vKipcbiogV2F0Y2hlcyBhIHNpbmdsZSBjb250cm9sIGZvciBhIGxpc3Qgb2YgdmFsdWVzLCByZXR1cm5zIHRydWUgd2hlbiBmaWVsZCB2YWx1ZSBtYXRjaGVzIGFueSB2YWx1ZSBpbiBsaXN0XG4qIHVubGVzcyBhbiBldmFsdWF0ZSBtZXRob2QgaXMgZm91bmQgb24gY29uZmlnLCBpbiB3aGljaCBjYXNlIHRoYXQgbWV0aG9kIGlzIHJ1biBvbiB0aGUgcmV0dXJuZWQgYm9vbGVhbiB2YWx1ZVxuKiBAcGFyYW0gZ3JvdXAgdGhlIGRpcmVjdCBwYXJlbnQgb2YgdGhlIGZpZWxkIHdlIHdhbnQgdG8gd2F0Y2hcbiogQHBhcmFtIGNvbmZpZ1xuKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0NvbnRyb2xGb3JWYWx1ZXMoZ3JvdXA6IEZvcm1Hcm91cCwgY29uZmlnOiBDaGVja0NvbnRyb2xDb25maWcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgLy8gY2hlY2sgdGhhdCBhbGwgdGhlIHBpZWNlcyB3ZSBuZWVkIGFyZSBhdmFpbGFibGVcbiAgaWYgKGNvbmZpZyAmJiBjb25maWcuY29udHJvbE5hbWUgJiYgQXJyYXkuaXNBcnJheShjb25maWcudmFsdWVzKSkge1xuICAgIHJldHVybiBnZXRWYWx1ZUNoYW5nZXMoZ3JvdXAsIGNvbmZpZy5jb250cm9sTmFtZSkucGlwZShcbiAgICAgIC8vIHJldHVybiBhIGJvb2xlYW4sIHRydWUgaWYgdmFsdWUgaXMgaW4gdGhlIHZhbHVlcyBiZWluZyB3YXRjaCBmb3IsIG90aGVyd2lzZSBmYWxzZVxuICAgICAgdmFsdWVJbihjb25maWcudmFsdWVzKSxcbiAgICAgIG1hcCgoaXNWYWx1ZUluVmFsdWVzOiBib29sZWFuKSA9PiB7XG4gICAgICAgIC8vIHNpbmNlIHdlIGNhbiBvbmx5IGNoZWNrIGlmIHRoZSB2YWx1ZSBpcyBpbiB0aGUgbGlzdCBvZiB3YXRjaGVkIHZhbHVlcywgdGhlIGV2YWx1YXRlIGZ1bmN0aW9uIGdpdmVzIHVzXG4gICAgICAgIC8vIGEgY2hhbmNlIHRvIG1ha2Ugb3RoZXIgZGVjaXNpb25zIGJhc2VkIG9uIGlmIHRoZSBib29sZWFuIHJldHVybmVkLCBlLmcuIHJldHVybiB0cnVlIGlmIHZhbHVlIG5vdCBpbiB3YXRjaGVkIHZhbHVlc1xuICAgICAgICBpZiAoIGNvbmZpZy5ldmFsdWF0ZSAmJiBjb25maWcuZXZhbHVhdGUgaW5zdGFuY2VvZiBGdW5jdGlvbiApIHtcbiAgICAgICAgICByZXR1cm4gY29uZmlnLmV2YWx1YXRlKGlzVmFsdWVJblZhbHVlcyk7XG4gICAgICAgIH0gZWxzZSB7IHJldHVybiBpc1ZhbHVlSW5WYWx1ZXM7IH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIHJldHVybiBvZih0cnVlKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9uIGZvciBydW5uaW5nIHRoZSBjaGVja0NvbnRyb2xzRm9yVmFsdWVzIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrQ29udHJvbHNDb25maWcge1xuICAvLyBhbiBhcnJheSBvZiBjb250cm9scyB0byB3YXRjaCBhbmQgdGhlIHZhbHVlcyB0byBjaGVjayBmb3JcbiAgd2F0Y2hDb25maWdzOiBDaGVja0NvbnRyb2xDb25maWdbXTtcbiAgLy8gdGhlIGZ1bmN0aW9uIHRvIHJ1biBhZ2FpbnN0IHRoZSBhcnJheSBvZiBjdXJyZW50IGZpZWxkIHZhbHVlSW4gcmVzcG9uc2VzXG4gIGV2YWx1YXRlPzogKCBib29sczogYm9vbGVhbltdICkgPT4gYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBXYXRjaGVzIGEgbGlzdCBvZiBmaWVsZHMgZm9yIGluZGl2aWR1YWwgbGlzdHMgb2YgdmFsdWVzIHJldHVybmluZyB0cnVlIHdoZW4gYW55IGZpZWxkIGNvbnRhaW5zIG9uZVxuICogb2YgdGhlIHZhbHVlcyBiZWluZyB3YXRjaGVkIGZvciwgb3Igb3B0aW9uYWxseSBydW5uaW5nIGEgZnVuY3Rpb24gb24gdGhlIGFycmF5IG9mIHJlc29sdmVkIGJvb2xlYW5zXG4gKiBmcm9tIHRoZSBsaXN0ZWQgZmllbGRzIGFuZCByZXR1cm5pbmcgYSBib29sZWFuXG4gKiBAcGFyYW0gZ3JvdXAgdGhlIGZvcm0gZ3JvdXAgdGhhdCBoYXMgdGhlIGZpZWxkcyB0byB3YXRjaCBhcyBkaXJlY3QgZGVzY2VuZGFudHNcbiAqIEBwYXJhbSBjb25maWcgdGhlIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ29udHJvbHNGb3JWYWx1ZXMoZ3JvdXA6IEZvcm1Hcm91cCwgY29uZmlnOiBDaGVja0NvbnRyb2xzQ29uZmlnKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgLy8gaWYgbm8gY29uZmlnIGlzIHBhc3NlZCB3ZSBqdXN0IHdhbnQgdG8gc2hvdyB0aGUgZmllbGQsIHNvIHdlIHJldHVybiBhbiBvYnNlcnZhYmxlIG9mIHRydWVcbiAgaWYgKCFjb25maWcgfHwgIWNvbmZpZy53YXRjaENvbmZpZ3MpIHsgcmV0dXJuIG9mKHRydWUpOyB9XG4gIC8vIHdlIHJ1biBjaGVja0NvbnRyb2xGb3JWYWx1ZXMgb24gZXZlcnkgY29udHJvbCBpbiB0aGUgbGlzdCBvZiBXYXRjaENvbmZpZ3MgY3JlYXRpbmdcbiAgLy8gYW4gYXJyYXkgb2YgT2JzZXJ2YWJsZSB3YXRjaGluZyBmaWVsZHMgZm9yIHZhbHVlc1xuICBjb25zdCBmaWVsZFRyaWdnZXJzID0gY29uZmlnLndhdGNoQ29uZmlncy5tYXAod2F0Y2hDb25maWcgPT4ge1xuICAgIC8vIHJlc29sdmVzIGEgYm9vbGVhbiwgdHJ1ZSB3aGVuIGZpZWxkIHZhbHVlIG1hdGNoZXMgYSB3YXRjaGVkIHZhbHVlLCBvdGhlcndpc2UgZmFsc2VcbiAgICByZXR1cm4gY2hlY2tDb250cm9sRm9yVmFsdWVzKGdyb3VwLCB3YXRjaENvbmZpZyk7XG4gIH0pO1xuXG4gIHJldHVybiBjb21iaW5lTGF0ZXN0KFxuICAgIGZpZWxkVHJpZ2dlcnNcbiAgKS5waXBlKFxuICAgIHN0YXJ0V2l0aChbdHJ1ZV0pLFxuICAgIG1hcCgoYm9vbGVhbnM6IGJvb2xlYW5bXSkgPT4ge1xuICAgICAgLy8gaWYgdGhlIHVzZXIgcGFzc2VkIGFuIGV2YWx1YXRlIGZ1bmN0aW9uIHVzZSBpdFxuICAgICAgaWYgKGNvbmZpZy5ldmFsdWF0ZSAmJiBjb25maWcuZXZhbHVhdGUgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICByZXR1cm4gY29uZmlnLmV2YWx1YXRlKGJvb2xlYW5zKTtcbiAgICAgIH0gZWxzZSB7IC8vIG90aGVyd2lzZSB3ZSByZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgdGhlIHdhdGNoZWQgZmllbGRzIHJlc29sdmUgdG8gdHJ1ZVxuICAgICAgICByZXR1cm4gYm9vbGVhbnMuc29tZShib29sID0+IGJvb2wpO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogVGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIHRoZSBjb21wdXRlVmFsdWUgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlRmllbGRDb25maWc8VCA9IGFueSwgUlQgPSBhbnk+IHtcbiAgLy8gYXJyYXkgb2YgY29udHJvbCBuYW1lcyB3aG8ncyB2YWx1ZXMgd2Ugd2FudCB0byB3YXRjaFxuICBjb250cm9sTmFtZXNUb1dhdGNoOiBzdHJpbmdbXTtcbiAgLy8gdGhlIGZ1bmN0aW9uIHdlIHdhbnQgdG8gY2FsbCBvbiB0aGUgYXJyYXkgb2Ygd2F0Y2hlZCB2YWx1ZXMgdG8gY29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgd2VcbiAgY29tcHV0ZUNhbGxiYWNrOiAoXG4gICAgdmFsdWVzOiAoVClbXVxuICApID0+IFJUO1xufVxuXG4vKipcbiAqIFdhdGNoZXMgdmFsdWVzIG9uIGFuIGFycmF5IG9mIGZpZWxkcywgY29tcHV0aW5nIHRoZWlyIHZhbHVlcyBhcyB0aGV5IGNoYW5nZVxuICogQHBhcmFtIGdyb3VwIHRoZSBncm91cCB0byBnZXQgdGhlIGZpZWxkcyBmcm9tLCBmb3Igbm93IGl0IGNhbiBvbmx5IGJlIHRoZSBwYXJlbnQgb2YgdGhlIGNvbXB1dGVkIGZpZWxkXG4gKiBAcGFyYW0gY29tcHV0ZUZpZWxkc0NvbmZpZyB0aGUgY29uZmlndXJhdGlvbiB0aGF0IGRyaXZlcyB0aGUgY29tcHV0YXRpb24sIGhvbGRzIHRoZSBuYW1lcyB0byB3YXRjaCBhbmQgdGhlXG4gKiBjb21wdXRhdGlvbiBmdW5jdGlvbiB0aGF0IGdldCBjYWxsZWQgYWdhaW5zdCB0aGUgYXJyYXkgb2YgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlVmFsdWVGcm9tRmllbGRzKGdyb3VwOiBGb3JtR3JvdXAsIGNvbXB1dGVGaWVsZHNDb25maWc6IENvbXB1dGVGaWVsZENvbmZpZyk6IE9ic2VydmFibGU8YW55PiB7XG4gIC8vIFRPRE86IGJldHRlciBjaGVja2luZ1xuICBjb25zdCB7IGNvbnRyb2xOYW1lc1RvV2F0Y2ggfSA9IGNvbXB1dGVGaWVsZHNDb25maWc7XG4gIC8vY3JlYXRlcyBhbiBvYnNlcnZhYmxlIGxpc3RlbmVyIGZvciBlYWNoIGNvbnRyb2wgaW4gdGhlIGNvbnRyb2xOYW1lc1RvV2F0Y2ggYXJyYXlcbiAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoXG4gICAgY29udHJvbE5hbWVzVG9XYXRjaC5tYXAoY29udHJvbE5hbWVUb1dhdGNoID0+IGdldFZhbHVlQ2hhbmdlcyhncm91cCwgY29udHJvbE5hbWVUb1dhdGNoKSlcbiAgKS5waXBlKFxuICAgIC8vIGVhY2ggdGltZSBhIHdhdGNoZWQgZmllbGQgdmFsdWVzIGNoYW5nZXMgYSBuZXcgYXJyYXkgb2YgdGhlIGxhdGVzdCBmaWVsZCB2YWx1ZXMgaXMgcGlwZSB0aHJvdWdoIHRvIHRoZVxuICAgIC8vIGNvbXB1dGUgY2FsbGJhY2suIFdoaWNoIHJ1bnMgdGhlIHVzZXJzIGxvZ2ljIG9uIHRoZSB2YWx1ZXMgdG8gY29tcHV0ZSB0aGlzIGZpZWxkcyB2YWx1ZVxuICAgIG1hcCh2YWx1ZXNBcnJheSA9PiBjb21wdXRlRmllbGRzQ29uZmlnLmNvbXB1dGVDYWxsYmFjayh2YWx1ZXNBcnJheSkpLFxuICApO1xufVxuXG4vKipcbiAqIEEgc2ltcGxlIHdyYXBwZXIgZm9yIGRvaW5nIGVycm9yIGNoZWNraW5nIGFyb3VuZCBnZXR0aW5nIHRoZSB2YWx1ZUNoYW5nZXMgb2JzZXJ2YWJsZSBmcm9tIGEgY29udHJvbCBvbiBhIGZvcm0gZ3JvdXBcbiAqIEBwYXJhbSBncm91cCB0aGUgZm9ybSBncm91cCB3ZSB3YW50IHRvIHB1bGwgdGhlIG9ic2VydmFibGUgZnJvbVxuICogQHBhcmFtIGNvbnRyb2xOYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250cm9sIHdobydzIHZhbHVlIHdlIHdhbnQgdG8gc3Vic2NyaWJlIHRvXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlQ2hhbmdlcyhncm91cDogRm9ybUdyb3VwLCBjb250cm9sTmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnRyb2wgPSBncm91cC5nZXQoY29udHJvbE5hbWUpO1xuICBpZiAoIWNvbnRyb2wpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbnRyb2wgd2l0aCBjb250cm9sTmFtZSAke2NvbnRyb2xOYW1lfWAsICk7XG4gIH1cbiAgcmV0dXJuIGNvbnRyb2wudmFsdWVDaGFuZ2VzO1xufVxuLyoqXG4gKiAgVE9ETzogbW92ZSB0byB1dGlscyBsaWJyYXJ5IGFmdGVyIGxpYnJhcnkgaXMgYnVpbHRcbiAqICBBbGxvd3MgZGV2ZWxvcGVyIHRvIHBhc3MgYW4gYXJyYXkgb2Ygb3BlcmF0b3JzIGludG8gdGhlIHBpcGUgb2YgYW4gT2JzZXJ2YWJsZS5cbiAqICBVc2VmdWwgZm9yIGNyZWF0aW5nIGZ1bmN0aW9uIHdpdGggYSB2YXJpYWJsZSBhbW91bnQgb2Ygb3BlcmF0b3JzIHRvIGJlIHJ1blxuICogQHBhcmFtIG9ic2VydmFibGUgdGhlIG9ic2VydmFibGUgdG8gcGFzcyB0aGUgb3BlcmF0b3JzIHRvXG4gKiBAcGFyYW0gb3BlcmF0b3JzIGFycmF5IG9mIG9wZXJhdG9ycyB0byBwaXBlXG4gKi9cbmZ1bmN0aW9uIHBpcGVPcGVyYXRvcnNJbnRvT2JzZXJ2YWJsZShvYnNlcnZhYmxlOiBPYnNlcnZhYmxlPGFueT4sIG9wZXJhdG9yczogT3BlcmF0b3JGdW5jdGlvbjxhbnksIGFueT5bXSkge1xuICB0cnkge1xuICAgIHJldHVybiBvcGVyYXRvcnMucmVkdWNlKChvYnM6IE9ic2VydmFibGU8e30+LCBvcDogT3BlcmF0b3JGdW5jdGlvbjx7fSwge30+KSA9PiB7XG4gICAgICByZXR1cm4gb2JzLnBpcGUob3ApO1xuICAgIH0sIG9ic2VydmFibGUpO1xuICB9IGNhdGNoIHtcbiAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gcGlwZSBvcGVyYXRvcnMgaW50byBvYnNlcnZhYmxlJyk7XG4gICAgcmV0dXJuIG9mKG51bGwpO1xuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGxPcHRpb25zSWZGdW5jdGlvbihcbiAgb3B0aW9uczogT3B0aW9uc1R5cGUgfCBBdXRvY29tcGxldGVPcHRpb25zQ2FsbGJhY2ssXG4gIHBhcmVudEdyb3VwPzogRm9ybUdyb3VwLFxuICBzZWFyY2hTdHJpbmc/OiBzdHJpbmdcbik6IE9wdGlvbnNUeXBlIHtcbiAgcmV0dXJuIG9wdGlvbnMgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IG9wdGlvbnMocGFyZW50R3JvdXAsIHNlYXJjaFN0cmluZykgOiBvcHRpb25zO1xufVxuLyoqXG4gKiBUaGUgdXNlciBjYW4gZ2l2ZSB1cyBzZWxlY3Qgb3B0aW9ucyBhcyBhbiBhcnJheSwgYSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRvIGEgcHJvbWlzZSxcbiAqIG9yIGFuIG9ic2VydmFibGUuIFRoaXMgZnVuY3Rpb25zIGNvbnN1bWVzIGFueSBvZiB0aG9zZSBhbmQgcmV0dXJucyBhbiBvYnNlcnZhYmxlIHRoYXRcbiAqIHJlc29sdmVzIGFuIGFycmF5IG9mIG9wdGlvbnNcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgb3B0aW9ucyBwYXNzZWQgaW4gZnJvbSB0aGUgY29uZmlnXG4gKiBAcGFyYW0gZW1wdHlNZXNzYWdlT3B0aW9uIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB0aGUgYXJyYXkgaXMgZW1wdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmFibGlmeU9wdGlvbnMoXG4gIG9wdGlvbnM6IE9wdGlvbnNUeXBlLFxuICBwYXJlbnRHcm91cDogRm9ybUdyb3VwLFxuICBzZWFyY2hTdHJpbmc/OiBzdHJpbmcsXG4pOiBPYnNlcnZhYmxlPFNlbGVjdE9wdGlvbltdPiB7XG4gIGNvbnN0IGNhbGxlZE9wdGlvbnMgPSBjYWxsT3B0aW9uc0lmRnVuY3Rpb24ob3B0aW9ucywgcGFyZW50R3JvdXAsIHNlYXJjaFN0cmluZyk7XG4gIC8vIGlmIG9wdGlvbnMgYXJlIGEgcHJvbWlzZVxuICByZXR1cm4gY2FsbGVkT3B0aW9ucyBpbnN0YW5jZW9mIFByb21pc2VcbiAgLy8gY29udmVydCB0byBvYnNlcnZhYmxlXG4gID8gZnJvbShjYWxsZWRPcHRpb25zKVxuICAvLyBpZiBhcnJheSB0aGF0IGlzbid0IGVtcHR5XG4gIDogQXJyYXkuaXNBcnJheShjYWxsZWRPcHRpb25zKSAmJiBjYWxsZWRPcHRpb25zLmxlbmd0aFxuICAvLyBjb252ZXJ0IHRvIG9ic2VydmFibGVcbiAgPyBvZihjYWxsZWRPcHRpb25zKVxuICAvLyBpZiBvYnNlcnZhYmxlXG4gIDogaXNPYnNlcnZhYmxlKGNhbGxlZE9wdGlvbnMpXG4gIC8vIHJldHVybiBpdFxuICA/IGNhbGxlZE9wdGlvbnNcbiAgLy8gZWxzZSBhbiBlbXB0eSBhcnJheVxuICA6IG9mKFtdKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBjb25maWcgaXMgZm9yIGEgZm9ybSBjb250cm9sIChub3QgYSBkaXZpZGVyLCBoZWFkaW5nIG9yIG90aGVyIG5vbi1jb250cm9sIGZpZWxkKVxuICogICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb250cm9sQ29uZmlnKGZpZWxkQ29uZmlnOiBDcmlzcHJGaWVsZENvbmZpZyk6IGZpZWxkQ29uZmlnIGlzIENyaXNwckNvbnRyb2xDb25maWcge1xuICByZXR1cm4gJ2NvbnRyb2xOYW1lJyBpbiBmaWVsZENvbmZpZztcbn1cbi8qKlxuICogYnVpbGRzIG91dCBmb3JtIGdyb3VwIGJhc2VkIG9uIGNvbmZpZ1xuICogQHBhcmFtIGNvbmZpZyBhIGNvbmZpZ3VyYXRpb24gZm9yIGEgZm9ybSBncm91cFxuICogQHBhcmFtIHZhbHVlIGFuIG9iamVjdCBvZiBpbml0aWFsIHZhbHVlcyB0byBwYXNzIGluXG4gKiBAcGFyYW0gZ3JvdXAgdGhlIGZvcm0gZ3JvdXAgdG8gbW9kaWZ5IGFuZCBidWlsZCBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRm9ybUdyb3VwRnJvbUNvbmZpZyhjb25maWc6IEZvcm1Db25maWcsIHZhbHVlID0gbnVsbCwgZ3JvdXA6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pICkge1xuICBjb25maWcuZmllbGRzLmZvckVhY2goIChjb250cm9sQ29uZmlnOiBBbnlGaWVsZENvbmZpZykgPT4ge1xuICAgIGlmIChpc0NvbnRyb2xDb25maWcoY29udHJvbENvbmZpZykpIHtcbiAgICAgIC8vIHRoZW4gYWRkIGEgY29udHJvbCB0byB0aGUgZ3JvdXAgdXNpbmcgdGhlIGNvbnRyb2xOYW1lIGZyb20gY29uZmlndXJhdGlvblxuICAgICAgY29uc3Qge2NvbnRyb2xOYW1lfSA9IGNvbnRyb2xDb25maWc7XG4gICAgICAvLyBpZiB0aGVyZSdzIGEgdmFsdWUgb2JqZWN0IGFuZCBpdCBoYXMgYSBub24tbnVsbC91bmRlZmluZWQgdmFsdWUgZm9yIHRoaXMgZmllbGQgdXNlIGl0LlxuICAgICAgLy8gT3RoZXJ3aXNlLCBkZWZhdWx0IHRvIG51bGxcbiAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9ICh2YWx1ZSAmJiB2YWx1ZVtjb250cm9sTmFtZV0pID8/IG51bGw7XG4gICAgICBncm91cC5hZGRDb250cm9sKGNvbnRyb2xOYW1lLCBjcmVhdGVDb250cm9sRm9yVHlwZShjb250cm9sQ29uZmlnLCBjb250cm9sVmFsdWUpKTtcbiAgICB9XG4gIH0pO1xuICBncm91cC5zZXRWYWxpZGF0b3JzKGNvbmZpZy52YWxpZGF0b3JzKTtcbiAgcmV0dXJuIGdyb3VwO1xufVxuXG4vKipcbiAqIEFuYWx5emUgdGhlIGNvbmZpZyBhbmQgYnVpbGQgYSBmb3JtIGNvbnRyb2wgdG8gc3BlYy4gTm90aWNlIHdlIGRvbid0IHVzZSBGb3JtQnVpbGRlciBoZXJlXG4gKiBhcyB3ZSB3YW50IHRvIGtlZXAgdGhpcyBmdW5jdGlvbiBwdXJlLlxuICogQHBhcmFtIGNvbnRyb2xDb25maWcgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgY29udHJvbCB0byBidWlsZFxuICogQHBhcmFtIHZhbHVlIGFuIGluaXRpYWwgdmFsdWUgdG8gdXNlIGlmIHBhc3NlZCBpblxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udHJvbEZvclR5cGUoY29udHJvbENvbmZpZzogQW55RmllbGRDb25maWcsIHZhbHVlOiBDb250cm9sVmFsdWUgPSBudWxsKSAge1xuICAvLyBidWlsZCBmb3JtIGNvbnRyb2wgb3V0IGJhc2VkIG9uIHRoZSBjb250cm9sIHR5cGVcbiAgY29uc3QgY29udHJvbCA9IGNvbnRyb2xDb25maWcuY29udHJvbFR5cGUgPT09IENvbnRyb2xUeXBlLlNVQl9HUk9VUFxuICAgID8gYnVpbGRGb3JtR3JvdXBGcm9tQ29uZmlnKGNvbnRyb2xDb25maWcgYXMgRm9ybUNvbmZpZywgdmFsdWUpXG4gICAgOiBjb250cm9sQ29uZmlnLmNvbnRyb2xUeXBlID09PSBDb250cm9sVHlwZS5HUk9VUF9MSVNUXG4gICAgPyBuZXcgRm9ybUFycmF5KFtdLCAoY29udHJvbENvbmZpZyBhcyBGb3JtR3JvdXBMaXN0Q29uZmlnKS52YWxpZGF0b3JzKVxuICAgIDogbmV3IEZvcm1Db250cm9sKFxuICAgICAgdmFsdWUgfHwgbnVsbCxcbiAgICAgIChjb250cm9sQ29uZmlnIGFzIENyaXNwckNvbnRyb2xDb25maWcpLnZhbGlkYXRvcnNcbiAgICApO1xuXG4gIHJldHVybiBjb250cm9sO1xufVxuXG4vKipcbiAqIEEgYmFzaWMgZmlsdGVyIGZ1bmN0aW9uIHRoYXQgZmlsdGVycyB0aGUgc2VhcmNoIHN0cmluZyBhZ2FpbnN0IHRoZSBsYWJlbCBvZiB0aGUgb3B0aW9ucyBvYmplY3RcbiAqIEBwYXJhbSBvcHRpb25zIHRoZSBhcnJheSBvZiBvcHRpb25zIHRvIGZpbHRlclxuICogQHBhcmFtIHNlYXJjaFN0cmluZyB0aGUgc3RyaW5nIGZyb20gdGhlIGlucHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJPcHRpb25zQnlMYWJlbChvcHRpb25zOiBTZWxlY3RPcHRpb25bXSwgc2VhcmNoU3RyaW5nOiBzdHJpbmcpICB7XG4gIHJldHVybiBvcHRpb25zLmZpbHRlcihvcHRpb24gPT4ge1xuICAgIHJldHVybiBvcHRpb24ubGFiZWwgJiYgb3B0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpO1xuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,24 @@
1
+ import { map } from 'rxjs/operators';
2
+ export function valueIn(values) {
3
+ return map((value) => {
4
+ if (value) {
5
+ return values.some(v => {
6
+ if (isRegex(v)) {
7
+ const trimmedStringForRegex = v.substr(1, v.length - 2);
8
+ const regex = new RegExp(trimmedStringForRegex);
9
+ return regex.test(value);
10
+ }
11
+ else {
12
+ return v === value;
13
+ }
14
+ });
15
+ }
16
+ else {
17
+ return false;
18
+ }
19
+ });
20
+ }
21
+ function isRegex(string) {
22
+ return string.startsWith('/') && string.endsWith('/');
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5vcGVyYXRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NyaXNwci1mb3Jtcy9zcmMvbGliL2Zvcm0ub3BlcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxNQUFNLFVBQVUsT0FBTyxDQUFFLE1BQWdCO0lBQ3ZDLE9BQU8sR0FBRyxDQUFFLENBQUMsS0FBYSxFQUFFLEVBQUU7UUFDNUIsSUFBSSxLQUFLLEVBQUU7WUFDVCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3JCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNkLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDeEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQkFDaEQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMxQjtxQkFBTTtvQkFDTCxPQUFPLENBQUMsS0FBSyxLQUFLLENBQUM7aUJBQ3BCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFDLE1BQWM7SUFDN0IsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlSW4gKHZhbHVlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIG1hcCggKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZXMuc29tZSh2ID0+IHtcbiAgICAgICAgaWYgKGlzUmVnZXgodikpIHtcbiAgICAgICAgICBjb25zdCB0cmltbWVkU3RyaW5nRm9yUmVnZXggPSB2LnN1YnN0cigxLCB2Lmxlbmd0aCAtIDIpO1xuICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCh0cmltbWVkU3RyaW5nRm9yUmVnZXgpO1xuICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdiA9PT0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNSZWdleChzdHJpbmc6IHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnN0YXJ0c1dpdGgoJy8nKSAmJiBzdHJpbmcuZW5kc1dpdGgoJy8nKTtcbn1cbiJdfQ==
@@ -0,0 +1,111 @@
1
+ import { Component, ChangeDetectionStrategy, ViewChild, ElementRef } from '@angular/core';
2
+ import { map, tap } from 'rxjs/operators';
3
+ import { MatAutocompleteTrigger } from '@angular/material/autocomplete';
4
+ import { BehaviorSubject, combineLatest } from 'rxjs';
5
+ import { ENTER } from '@angular/cdk/keycodes';
6
+ import { DEFAULT_EMPTY_OPTIONS_MESSAGE } from '../../models';
7
+ import { AbstractAutocompleteComponent } from '../../abstracts';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "../../field-container/field-container.component";
10
+ import * as i2 from "@angular/material/form-field";
11
+ import * as i3 from "@angular/material/chips";
12
+ import * as i4 from "@angular/material/icon";
13
+ import * as i5 from "../info/info.component";
14
+ import * as i6 from "@angular/material/autocomplete";
15
+ import * as i7 from "@angular/material/core";
16
+ import * as i8 from "../option/option.component";
17
+ import * as i9 from "@angular/common";
18
+ import * as i10 from "@angular/material/input";
19
+ import * as i11 from "@angular/forms";
20
+ import * as i12 from "@tft/form-validation-handler";
21
+ const defaultConfig = {
22
+ chipsSelectable: true,
23
+ areChipsRemovable: true,
24
+ tabToSelect: true,
25
+ autoActiveFirstOption: true,
26
+ imageUrlParam: 'image',
27
+ typeDebounceTime: 500,
28
+ allowDuplicates: false,
29
+ duplicateCompareFunction: (chip, option) => chip.value === option.value,
30
+ separatorKeyCodes: [ENTER],
31
+ emptyOptionsMessage: DEFAULT_EMPTY_OPTIONS_MESSAGE,
32
+ };
33
+ export class AutocompleteChiplistFieldComponent extends AbstractAutocompleteComponent {
34
+ constructor() {
35
+ super(...arguments);
36
+ this.defaultConfig = defaultConfig;
37
+ this.chips$ = new BehaviorSubject([]);
38
+ this.controlValue$ = this.chips$.pipe(tap(chips => {
39
+ this.control.setValue(chips.map(chip => chip.value));
40
+ }));
41
+ }
42
+ ngOnInit() {
43
+ super.ngOnInit();
44
+ this.remainingOptions$ = combineLatest([
45
+ this.chips$,
46
+ this.options$
47
+ ]).pipe(map(([chips, options]) => {
48
+ return this.config.allowDuplicates
49
+ ? options
50
+ : options?.filter(option => {
51
+ return !chips.some(chip => this.config.duplicateCompareFunction(chip, option));
52
+ });
53
+ }));
54
+ }
55
+ setControlValue(value) {
56
+ if (value) {
57
+ this.chips$.next(value);
58
+ }
59
+ }
60
+ // handles mat selecting
61
+ handleSelect(event) {
62
+ const selectedOption = event.option.value;
63
+ this.chips$.next([...this.chips$.value, selectedOption]);
64
+ this.chipInputRef.nativeElement.value = '';
65
+ this.autocompleteInputControl.setValue('');
66
+ // setTimeout needed because the panel thinks it's still open at this point
67
+ setTimeout(() => this.chipInput.openPanel());
68
+ }
69
+ /**
70
+ * To follow ARIA standards we want to select the active option on blur.
71
+ * matChipInputAddOnBlur should do this but it causes buggy behaviour
72
+ * @param event blur event that triggers the handle blur
73
+ */
74
+ handleTab(_event) {
75
+ if (this.chipInput.activeOption && (this.config.tabToSelect || this.config.addChipOnBlur)) {
76
+ const chip = this.chipInput.activeOption.value;
77
+ this.chips$.next([...this.chips$.value, chip]);
78
+ }
79
+ }
80
+ /**
81
+ * Handles selection via key tokens passed through separatorKeyCodes propert
82
+ * NOTE: If TAB is used focus does not move on to next component
83
+ * @param event
84
+ */
85
+ handleTokenEnd(event) {
86
+ if (this.chipInput.activeOption) {
87
+ this.chipInput.activeOption.select();
88
+ }
89
+ event.chipInput?.clear();
90
+ }
91
+ mapToLabel(option) {
92
+ return option ? option.label : '';
93
+ }
94
+ removeChip(removedChip) {
95
+ const remainingChips = this.chips$.value.filter(chip => chip !== removedChip);
96
+ this.chips$.next(remainingChips);
97
+ }
98
+ }
99
+ AutocompleteChiplistFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: AutocompleteChiplistFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
100
+ AutocompleteChiplistFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: AutocompleteChiplistFieldComponent, selector: "crispr-autocomplete-chiplist-field", viewQueries: [{ propertyName: "chipInput", first: true, predicate: ["autoInput"], descendants: true, read: MatAutocompleteTrigger }, { propertyName: "chipInputRef", first: true, predicate: ["autoInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field\n [color]=\"config.color\"\n [appearance]=\"config.appearance\">\n <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </mat-label>\n\n <mat-chip-list\n #chipList>\n <mat-chip\n class=\"refinement-chip\"\n *ngFor=\"let chip of controlValue$ | async\"\n [selectable]=\"config.chipsSelectable\"\n [removable]=\"config.areChipsRemovable\"\n (removed)=\"removeChip(chip)\">\n <span *ngIf=\"chip.imageUrl as imageUrl\" class=\"image-container\">\n <img [src]=\"imageUrl\" alt=\"image of {{chip.label}}\">\n </span>\n {{chip.label}}\n <mat-icon\n matChipRemove\n *ngIf=\"config.areChipsRemovable\">\n cancel\n </mat-icon>\n </mat-chip>\n\n <input\n matInput\n [formControl]=\"autocompleteInputControl\"\n [placeholder]=\"config.placeholder\"\n [matChipInputFor]=\"chipList\"\n [matAutocomplete]=\"auto\"\n (keydown.tab)=\"handleTab($event)\"\n [matChipInputSeparatorKeyCodes]=\"config.separatorKeyCodes\"\n (matChipInputTokenEnd)=\"handleTokenEnd($event)\"\n role=\"searchbox\"\n type=\"text\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n #autoInput/>\n <span *ngIf=\"config.fieldSuffix\" matSuffix>{{config.fieldSuffix}}</span>\n <crispr-info\n *ngIf=\"config.info\"\n matSuffix\n [info]=\"config.info \">\n </crispr-info>\n\n </mat-chip-list>\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"this.config.autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"mapToLabel\">\n <ng-container *ngIf=\"remainingOptions$ | async as remainingOptions; else emptyOption\">\n <ng-container *ngIf=\"remainingOptions.length > 0; else emptyOption\">\n <mat-option\n *ngFor=\"let option of remainingOptions$ | async\"\n [value]=\"option\">\n <crispr-option [option]=\"option\"></crispr-option>\n </mat-option>\n </ng-container>\n\n </ng-container>\n <ng-template #emptyOption>\n <mat-option disabled=\"true\">\n {{config.emptyOptionsMessage}}\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n\n\n </mat-form-field>\n</crispr-field-container>\n", styles: [".refinement-chip .image-container{width:26px;height:26px;border-radius:50%;overflow:hidden;margin:-2px 4px -2px -8px}.refinement-chip .image-container img{width:100%;height:100%;object-fit:cover}\n"], components: [{ type: i1.FieldContainerComponent, selector: "crispr-field-container", inputs: ["config", "group", "inlineField"] }, { type: i2.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i3.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i5.InfoComponent, selector: "crispr-info", inputs: ["info"] }, { type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i8.OptionComponent, selector: "crispr-option", inputs: ["option"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatLabel, selector: "mat-label" }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i3.MatChipRemove, selector: "[matChipRemove]" }, { type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i11.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i11.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i12.ControlErrorsDirective, selector: "[formControl], [formControlName]" }, { type: i2.MatSuffix, selector: "[matSuffix]" }], pipes: { "async": i9.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: AutocompleteChiplistFieldComponent, decorators: [{
102
+ type: Component,
103
+ args: [{ selector: 'crispr-autocomplete-chiplist-field', changeDetection: ChangeDetectionStrategy.OnPush, template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field\n [color]=\"config.color\"\n [appearance]=\"config.appearance\">\n <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </mat-label>\n\n <mat-chip-list\n #chipList>\n <mat-chip\n class=\"refinement-chip\"\n *ngFor=\"let chip of controlValue$ | async\"\n [selectable]=\"config.chipsSelectable\"\n [removable]=\"config.areChipsRemovable\"\n (removed)=\"removeChip(chip)\">\n <span *ngIf=\"chip.imageUrl as imageUrl\" class=\"image-container\">\n <img [src]=\"imageUrl\" alt=\"image of {{chip.label}}\">\n </span>\n {{chip.label}}\n <mat-icon\n matChipRemove\n *ngIf=\"config.areChipsRemovable\">\n cancel\n </mat-icon>\n </mat-chip>\n\n <input\n matInput\n [formControl]=\"autocompleteInputControl\"\n [placeholder]=\"config.placeholder\"\n [matChipInputFor]=\"chipList\"\n [matAutocomplete]=\"auto\"\n (keydown.tab)=\"handleTab($event)\"\n [matChipInputSeparatorKeyCodes]=\"config.separatorKeyCodes\"\n (matChipInputTokenEnd)=\"handleTokenEnd($event)\"\n role=\"searchbox\"\n type=\"text\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n #autoInput/>\n <span *ngIf=\"config.fieldSuffix\" matSuffix>{{config.fieldSuffix}}</span>\n <crispr-info\n *ngIf=\"config.info\"\n matSuffix\n [info]=\"config.info \">\n </crispr-info>\n\n </mat-chip-list>\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"this.config.autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"mapToLabel\">\n <ng-container *ngIf=\"remainingOptions$ | async as remainingOptions; else emptyOption\">\n <ng-container *ngIf=\"remainingOptions.length > 0; else emptyOption\">\n <mat-option\n *ngFor=\"let option of remainingOptions$ | async\"\n [value]=\"option\">\n <crispr-option [option]=\"option\"></crispr-option>\n </mat-option>\n </ng-container>\n\n </ng-container>\n <ng-template #emptyOption>\n <mat-option disabled=\"true\">\n {{config.emptyOptionsMessage}}\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n\n\n </mat-form-field>\n</crispr-field-container>\n", styles: [".refinement-chip .image-container{width:26px;height:26px;border-radius:50%;overflow:hidden;margin:-2px 4px -2px -8px}.refinement-chip .image-container img{width:100%;height:100%;object-fit:cover}\n"] }]
104
+ }], propDecorators: { chipInput: [{
105
+ type: ViewChild,
106
+ args: ['autoInput', { read: MatAutocompleteTrigger }]
107
+ }], chipInputRef: [{
108
+ type: ViewChild,
109
+ args: ['autoInput']
110
+ }] } });
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLWNoaXBsaXN0LWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3Jpc3ByLWZvcm1zL3NyYy9saWIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlLWNoaXBsaXN0LWZpZWxkL2F1dG9jb21wbGV0ZS1jaGlwbGlzdC1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NyaXNwci1mb3Jtcy9zcmMvbGliL21hdGVyaWFsL2F1dG9jb21wbGV0ZS1jaGlwbGlzdC1maWVsZC9hdXRvY29tcGxldGUtY2hpcGxpc3QtZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFnQyxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RHLE9BQU8sRUFBYyxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU5QyxPQUFPLEVBQW1DLDZCQUE2QixFQUFnQixNQUFNLGNBQWMsQ0FBQztBQUM1RyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFHaEUsTUFBTSxhQUFhLEdBQTZDO0lBQzlELGVBQWUsRUFBRSxJQUFJO0lBQ3JCLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsV0FBVyxFQUFFLElBQUk7SUFDakIscUJBQXFCLEVBQUUsSUFBSTtJQUMzQixhQUFhLEVBQUUsT0FBTztJQUN0QixnQkFBZ0IsRUFBRSxHQUFHO0lBQ3JCLGVB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QUNILGNBQWMsQ0FBQyxLQUF3QjtRQUNyQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ3RDO1FBQ0QsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsVUFBVSxDQUFDLE1BQW9CO1FBQzdCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxXQUF5QjtRQUNsQyxNQUFNLGNBQWMsR0FBbUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7OytIQW5GVSxrQ0FBa0M7bUhBQWxDLGtDQUFrQyw2SkFnQmIsc0JBQXNCLGdKQzdDeEQsbytFQThFQTsyRkRqRGEsa0NBQWtDO2tCQU45QyxTQUFTOytCQUNFLG9DQUFvQyxtQkFHN0IsdUJBQXVCLENBQUMsTUFBTTs4QkFrQlcsU0FBUztzQkFBbEUsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUU7Z0JBQ2hDLFlBQVk7c0JBQW5DLFNBQVM7dUJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgVmlld0NoaWxkLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQsIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFTlRFUiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5cbmltcG9ydCB7IEF1dG9jb21wbGV0ZUNoaXBsaXN0RmllbGRDb25maWcsIERFRkFVTFRfRU1QVFlfT1BUSU9OU19NRVNTQUdFLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgQWJzdHJhY3RBdXRvY29tcGxldGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hYnN0cmFjdHMnO1xuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWc6IFBhcnRpYWw8QXV0b2NvbXBsZXRlQ2hpcGxpc3RGaWVsZENvbmZpZz4gPSB7XG4gIGNoaXBzU2VsZWN0YWJsZTogdHJ1ZSxcbiAgYXJlQ2hpcHNSZW1vdmFibGU6IHRydWUsXG4gIHRhYlRvU2VsZWN0OiB0cnVlLFxuICBhdXRvQWN0aXZlRmlyc3RPcHRpb246IHRydWUsXG4gIGltYWdlVXJsUGFyYW06ICdpbWFnZScsXG4gIHR5cGVEZWJvdW5jZVRpbWU6IDUwMCxcbiAgYWxsb3dEdXBsaWNhdGVzOiBmYWxzZSxcbiAgZHVwbGljYXRlQ29tcGFyZUZ1bmN0aW9uOiAoY2hpcCwgb3B0aW9uKSA9PiBjaGlwLnZhbHVlID09PSBvcHRpb24udmFsdWUsXG4gIHNlcGFyYXRvcktleUNvZGVzOiBbRU5URVJdLFxuICBlbXB0eU9wdGlvbnNNZXNzYWdlOiBERUZBVUxUX0VNUFRZX09QVElPTlNfTUVTU0FHRSxcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3Jpc3ByLWF1dG9jb21wbGV0ZS1jaGlwbGlzdC1maWVsZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRvY29tcGxldGUtY2hpcGxpc3QtZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hdXRvY29tcGxldGUtY2hpcGxpc3QtZmllbGQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQXV0b2NvbXBsZXRlQ2hpcGxpc3RGaWVsZENvbXBvbmVudFxuICBleHRlbmRzIEFic3RyYWN0QXV0b2NvbXBsZXRlQ29tcG9uZW50PEF1dG9jb21wbGV0ZUNoaXBsaXN0RmllbGRDb25maWc+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgZGVmYXVsdENvbmZpZyA9IGRlZmF1bHRDb25maWc7XG4gIGNoaXBzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VsZWN0T3B0aW9uW10+KFtdKTtcbiAgcmVtYWluaW5nT3B0aW9ucyQ6IE9ic2VydmFibGU8U2VsZWN0T3B0aW9uW10+O1xuXG4gIGNvbnRyb2xWYWx1ZSQgPSB0aGlzLmNoaXBzJC5waXBlKFxuICAgIHRhcChjaGlwcyA9PiB7XG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoY2hpcHMubWFwKGNoaXAgPT4gY2hpcC52YWx1ZSkpXG4gICAgfSlcbiAgKTtcblxuXG4gIC8vIFdlIG5lZWQgdXNlIFZpZXdDaGlsZCB0d2ljZSBvbiB0aGUgc2FtZSB0ZW1wbGF0ZSByZWYgdG8gYWNjZXNzIGFzIGRpZmZlcmVudCB0eXBlc1xuICAvLyAtIHRoZSBNYXRBdXRvY29tcGxldGVUcmlnZ2VyIGlzIHVzZWQgdG8gZm9yIHNlbGVjdGluZyB2YWx1ZSBvbiB0YWJcbiAgLy8gLSB0aGUgRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PiBpcyB1c2VkIHRvIGNsZWFyIHRoZSB2YWx1ZSBmcm9tIGlucHV0IGVsZW1lbnQgb24gc2VsZWN0aW9uXG4gIEBWaWV3Q2hpbGQoJ2F1dG9JbnB1dCcsIHsgcmVhZDogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciB9KSBjaGlwSW5wdXQ6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXI7XG4gIEBWaWV3Q2hpbGQoJ2F1dG9JbnB1dCcpIGNoaXBJbnB1dFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgdGhpcy5yZW1haW5pbmdPcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5jaGlwcyQsXG4gICAgICB0aGlzLm9wdGlvbnMkXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2NoaXBzLCBvcHRpb25zXSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuYWxsb3dEdXBsaWNhdGVzXG4gICAgICAgICAgPyBvcHRpb25zXG4gICAgICAgICAgOiBvcHRpb25zPy5maWx0ZXIob3B0aW9uID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhY2hpcHMuc29tZShjaGlwID0+IHRoaXMuY29uZmlnLmR1cGxpY2F0ZUNvbXBhcmVGdW5jdGlvbihjaGlwLCBvcHRpb24pKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgc2V0Q29udHJvbFZhbHVlKHZhbHVlOiBTZWxlY3RPcHRpb25bXSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5jaGlwcyQubmV4dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gaGFuZGxlcyBtYXQgc2VsZWN0aW5nXG4gIGhhbmRsZVNlbGVjdChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCkge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uOiBTZWxlY3RPcHRpb24gPSBldmVudC5vcHRpb24udmFsdWUgYXMgU2VsZWN0T3B0aW9uO1xuICAgIHRoaXMuY2hpcHMkLm5leHQoWy4uLnRoaXMuY2hpcHMkLnZhbHVlLCAgc2VsZWN0ZWRPcHRpb25dKTtcbiAgICB0aGlzLmNoaXBJbnB1dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgdGhpcy5hdXRvY29tcGxldGVJbnB1dENvbnRyb2wuc2V0VmFsdWUoJycpO1xuICAgIC8vIHNldFRpbWVvdXQgbmVlZGVkIGJlY2F1c2UgdGhlIHBhbmVsIHRoaW5rcyBpdCdzIHN0aWxsIG9wZW4gYXQgdGhpcyBwb2ludFxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jaGlwSW5wdXQub3BlblBhbmVsKCkpXG4gIH1cblxuICAvKipcbiAgICogVG8gZm9sbG93IEFSSUEgc3RhbmRhcmRzIHdlIHdhbnQgdG8gc2VsZWN0IHRoZSBhY3RpdmUgb3B0aW9uIG9uIGJsdXIuXG4gICAqIG1hdENoaXBJbnB1dEFkZE9uQmx1ciBzaG91bGQgZG8gdGhpcyBidXQgaXQgY2F1c2VzIGJ1Z2d5IGJlaGF2aW91clxuICAgKiBAcGFyYW0gZXZlbnQgYmx1ciBldmVudCB0aGF0IHRyaWdnZXJzIHRoZSBoYW5kbGUgYmx1clxuICAgKi9cbiAgaGFuZGxlVGFiKF9ldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICh0aGlzLmNoaXBJbnB1dC5hY3RpdmVPcHRpb24gJiYgKHRoaXMuY29uZmlnLnRhYlRvU2VsZWN0IHx8IHRoaXMuY29uZmlnLmFkZENoaXBPbkJsdXIpKSB7XG4gICAgICBjb25zdCBjaGlwID0gdGhpcy5jaGlwSW5wdXQuYWN0aXZlT3B0aW9uLnZhbHVlO1xuICAgICAgdGhpcy5jaGlwcyQubmV4dChbLi4udGhpcy5jaGlwcyQudmFsdWUsICBjaGlwXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgc2VsZWN0aW9uIHZpYSBrZXkgdG9rZW5zIHBhc3NlZCB0aHJvdWdoIHNlcGFyYXRvcktleUNvZGVzIHByb3BlcnRcbiAgICogTk9URTogSWYgVEFCIGlzIHVzZWQgZm9jdXMgZG9lcyBub3QgbW92ZSBvbiB0byBuZXh0IGNvbXBvbmVudFxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIGhhbmRsZVRva2VuRW5kKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCkge1xuICAgIGlmICh0aGlzLmNoaXBJbnB1dC5hY3RpdmVPcHRpb24pIHtcbiAgICAgIHRoaXMuY2hpcElucHV0LmFjdGl2ZU9wdGlvbi5zZWxlY3QoKTtcbiAgICB9XG4gICAgZXZlbnQuY2hpcElucHV0Py5jbGVhcigpO1xuICB9XG5cbiAgbWFwVG9MYWJlbChvcHRpb246IFNlbGVjdE9wdGlvbikge1xuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb24ubGFiZWwgOiAnJztcbiAgfVxuXG4gIHJlbW92ZUNoaXAocmVtb3ZlZENoaXA6IFNlbGVjdE9wdGlvbikge1xuICAgIGNvbnN0IHJlbWFpbmluZ0NoaXBzOiBTZWxlY3RPcHRpb25bXSA9IHRoaXMuY2hpcHMkLnZhbHVlLmZpbHRlcihjaGlwID0+IGNoaXAgIT09IHJlbW92ZWRDaGlwKTtcbiAgICB0aGlzLmNoaXBzJC5uZXh0KHJlbWFpbmluZ0NoaXBzKTtcbiAgfVxufVxuIiwiPGNyaXNwci1maWVsZC1jb250YWluZXJcbiAgW2NvbmZpZ109XCJjb25maWdcIlxuICBbZ3JvdXBdPVwiZ3JvdXBcIj5cblxuICA8bWF0LWZvcm0tZmllbGRcbiAgICBbY29sb3JdPVwiY29uZmlnLmNvbG9yXCJcbiAgICBbYXBwZWFyYW5jZV09XCJjb25maWcuYXBwZWFyYW5jZVwiPlxuICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJjb25maWcubGFiZWxcIj5cbiAgICAgIHt7Y29uZmlnLmxhYmVsfX1cbiAgICA8L21hdC1sYWJlbD5cblxuICAgIDxtYXQtY2hpcC1saXN0XG4gICAgICAjY2hpcExpc3Q+XG4gICAgICA8bWF0LWNoaXBcbiAgICAgICAgY2xhc3M9XCJyZWZpbmVtZW50LWNoaXBcIlxuICAgICAgICAqbmdGb3I9XCJsZXQgY2hpcCBvZiBjb250cm9sVmFsdWUkIHwgYXN5bmNcIlxuICAgICAgICBbc2VsZWN0YWJsZV09XCJjb25maWcuY2hpcHNTZWxlY3RhYmxlXCJcbiAgICAgICAgW3JlbW92YWJsZV09XCJjb25maWcuYXJlQ2hpcHNSZW1vdmFibGVcIlxuICAgICAgICAocmVtb3ZlZCk9XCJyZW1vdmVDaGlwKGNoaXApXCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY2hpcC5pbWFnZVVybCBhcyBpbWFnZVVybFwiIGNsYXNzPVwiaW1hZ2UtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlVXJsXCIgYWx0PVwiaW1hZ2Ugb2Yge3tjaGlwLmxhYmVsfX1cIj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICB7e2NoaXAubGFiZWx9fVxuICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICBtYXRDaGlwUmVtb3ZlXG4gICAgICAgICAgKm5nSWY9XCJjb25maWcuYXJlQ2hpcHNSZW1vdmFibGVcIj5cbiAgICAgICAgICBjYW5jZWxcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgIDwvbWF0LWNoaXA+XG5cbiAgICAgIDxpbnB1dFxuICAgICAgICBtYXRJbnB1dFxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwiYXV0b2NvbXBsZXRlSW5wdXRDb250cm9sXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy5wbGFjZWhvbGRlclwiXG4gICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3RcIlxuICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgICAoa2V5ZG93bi50YWIpPVwiaGFuZGxlVGFiKCRldmVudClcIlxuICAgICAgICBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwiY29uZmlnLnNlcGFyYXRvcktleUNvZGVzXCJcbiAgICAgICAgKG1hdENoaXBJbnB1dFRva2VuRW5kKT1cImhhbmRsZVRva2VuRW5kKCRldmVudClcIlxuICAgICAgICByb2xlPVwic2VhcmNoYm94XCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiXG4gICAgICAgIGF1dG9jb3JyZWN0PVwib2ZmXCJcbiAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgI2F1dG9JbnB1dC8+XG4gICAgICA8c3BhbiAqbmdJZj1cImNvbmZpZy5maWVsZFN1ZmZpeFwiIG1hdFN1ZmZpeD57e2NvbmZpZy5maWVsZFN1ZmZpeH19PC9zcGFuPlxuICAgICAgPGNyaXNwci1pbmZvXG4gICAgICAgICpuZ0lmPVwiY29uZmlnLmluZm9cIlxuICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgW2luZm9dPVwiY29uZmlnLmluZm8gXCI+XG4gICAgICA8L2NyaXNwci1pbmZvPlxuXG4gICAgPC9tYXQtY2hpcC1saXN0PlxuICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICBbYXV0b0FjdGl2ZUZpcnN0T3B0aW9uXT1cInRoaXMuY29uZmlnLmF1dG9BY3RpdmVGaXJzdE9wdGlvblwiXG4gICAgICAob3B0aW9uU2VsZWN0ZWQpPVwiaGFuZGxlU2VsZWN0KCRldmVudClcIlxuICAgICAgW2Rpc3BsYXlXaXRoXT1cIm1hcFRvTGFiZWxcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZW1haW5pbmdPcHRpb25zJCB8IGFzeW5jIGFzIHJlbWFpbmluZ09wdGlvbnM7IGVsc2UgZW1wdHlPcHRpb25cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlbWFpbmluZ09wdGlvbnMubGVuZ3RoID4gMDsgZWxzZSBlbXB0eU9wdGlvblwiPlxuICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiByZW1haW5pbmdPcHRpb25zJCB8IGFzeW5jXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgIDxjcmlzcHItb3B0aW9uIFtvcHRpb25dPVwib3B0aW9uXCI+PC9jcmlzcHItb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eU9wdGlvbj5cbiAgICAgICAgPG1hdC1vcHRpb24gZGlzYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICAgICAge3tjb25maWcuZW1wdHlPcHRpb25zTWVzc2FnZX19XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuXG5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvY3Jpc3ByLWZpZWxkLWNvbnRhaW5lcj5cbiJdfQ==