@bravura/ui 3.8.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/CHANGELOG.md +585 -565
  2. package/LICENSE +6 -6
  3. package/README.md +3 -1
  4. package/alert/alert-container.component.d.ts +1 -1
  5. package/alert/alert-message.component.d.ts +1 -1
  6. package/behavior/await.directive.d.ts +1 -1
  7. package/behavior/observe-content-class.directive.d.ts +1 -1
  8. package/behavior/sizing.directive.d.ts +1 -1
  9. package/clip-note/clip-note.directive.d.ts +1 -1
  10. package/currency-input/currency-input.directive.d.ts +1 -1
  11. package/decimal-input/decimal-input.directive.d.ts +1 -1
  12. package/discrete-input/discrete-input.component.d.ts +1 -1
  13. package/esm2022/alert/alert-container.component.mjs +207 -0
  14. package/esm2022/alert/alert-message.component.mjs +101 -0
  15. package/esm2022/alert/alert.module.mjs +22 -0
  16. package/{esm2020 → esm2022}/alert/public-api.mjs +1 -1
  17. package/esm2022/alert/testing/test-api.mjs +44 -0
  18. package/esm2022/behavior/await.directive.mjs +133 -0
  19. package/esm2022/behavior/behavior.module.mjs +37 -0
  20. package/esm2022/behavior/observe-content-class.directive.mjs +63 -0
  21. package/{esm2020 → esm2022}/behavior/public-api.mjs +1 -1
  22. package/esm2022/behavior/sizing-monitor.directive.mjs +31 -0
  23. package/esm2022/behavior/sizing.directive.mjs +256 -0
  24. package/esm2022/clip-note/clip-note.component.mjs +216 -0
  25. package/esm2022/clip-note/clip-note.directive.mjs +141 -0
  26. package/esm2022/clip-note/clip-note.module.mjs +32 -0
  27. package/{esm2020 → esm2022}/clip-note/public-api.mjs +1 -1
  28. package/{esm2020 → esm2022}/common/common-utils.mjs +1 -1
  29. package/esm2022/common/common.module.mjs +53 -0
  30. package/{esm2020 → esm2022}/common/public-api.mjs +1 -1
  31. package/esm2022/currency-input/currency-input.directive.mjs +276 -0
  32. package/esm2022/currency-input/currency-input.module.mjs +19 -0
  33. package/{esm2020 → esm2022}/currency-input/public-api.mjs +1 -1
  34. package/esm2022/decimal-input/decimal-input.directive.mjs +122 -0
  35. package/{esm2020 → esm2022}/decimal-input/decimal-input.module.mjs +5 -5
  36. package/esm2022/discrete-input/discrete-input.component.mjs +337 -0
  37. package/esm2022/discrete-input/discrete-input.module.mjs +21 -0
  38. package/{esm2020 → esm2022}/discrete-input/public-api.mjs +1 -1
  39. package/esm2022/file-upload/file-upload.component.mjs +400 -0
  40. package/esm2022/file-upload/file-upload.module.mjs +44 -0
  41. package/esm2022/file-upload/file-upload.service.mjs +29 -0
  42. package/{esm2020 → esm2022}/file-upload/public-api.mjs +1 -1
  43. package/esm2022/form-field/form-field.component.mjs +82 -0
  44. package/esm2022/form-field/form-field.module.mjs +33 -0
  45. package/{esm2020 → esm2022}/form-field/public-api.mjs +1 -1
  46. package/esm2022/icon-font/icon-font.module.mjs +22 -0
  47. package/esm2022/icon-font/icon.directive.mjs +102 -0
  48. package/{esm2020 → esm2022}/icon-font/public-api.mjs +1 -1
  49. package/esm2022/icon-font/utilities.mjs +51 -0
  50. package/esm2022/panel/panel-section.component.mjs +41 -0
  51. package/esm2022/panel/panel.component.mjs +87 -0
  52. package/esm2022/panel/panel.module.mjs +23 -0
  53. package/{esm2020 → esm2022}/panel/public-api.mjs +1 -1
  54. package/esm2022/panel/tinted.directive.mjs +60 -0
  55. package/esm2022/phone-number/phone-number.directive.mjs +188 -0
  56. package/{esm2020 → esm2022}/phone-number/phone-number.module.mjs +5 -5
  57. package/esm2022/phone-number/phone-number.pipe.mjs +47 -0
  58. package/esm2022/phone-number/phone-number.validator.mjs +64 -0
  59. package/{esm2020 → esm2022}/phone-number/public-api.mjs +1 -1
  60. package/{esm2020 → esm2022}/public-api.mjs +1 -1
  61. package/esm2022/radio-panel/radio-panel-item.component.mjs +93 -0
  62. package/esm2022/radio-panel/radio-panel.component.mjs +81 -0
  63. package/{esm2020 → esm2022}/radio-panel/radio-panel.module.mjs +5 -5
  64. package/esm2022/radio-panel/testing/test-api.mjs +46 -0
  65. package/{esm2020 → esm2022}/selection-panel/public-api.mjs +1 -1
  66. package/esm2022/selection-panel/selection-panel-item.component.mjs +166 -0
  67. package/esm2022/selection-panel/selection-panel.directive.mjs +119 -0
  68. package/esm2022/selection-panel/selection-panel.module.mjs +23 -0
  69. package/{esm2020 → esm2022}/skeletons/public-api.mjs +1 -1
  70. package/esm2022/skeletons/skeleton-loader-presets.directive.mjs +83 -0
  71. package/esm2022/skeletons/skeleton-loader.component.mjs +76 -0
  72. package/esm2022/skeletons/skeletons.module.mjs +35 -0
  73. package/{esm2020 → esm2022}/stepper/public-api.mjs +1 -1
  74. package/{esm2020 → esm2022}/stepper/stepper-animation.mjs +1 -1
  75. package/esm2022/stepper/stepper.component.mjs +176 -0
  76. package/esm2022/stepper/stepper.module.mjs +52 -0
  77. package/{esm2020 → esm2022}/tooltip/public-api.mjs +1 -1
  78. package/esm2022/tooltip/tooltip.component.mjs +63 -0
  79. package/esm2022/tooltip/tooltip.directive.mjs +148 -0
  80. package/esm2022/tooltip/tooltip.module.mjs +25 -0
  81. package/{fesm2020 → fesm2022}/bravura-ui-alert-testing.mjs +2 -2
  82. package/fesm2022/bravura-ui-alert-testing.mjs.map +1 -0
  83. package/fesm2022/bravura-ui-alert.mjs +327 -0
  84. package/fesm2022/bravura-ui-alert.mjs.map +1 -0
  85. package/{fesm2020 → fesm2022}/bravura-ui-behavior.mjs +45 -45
  86. package/fesm2022/bravura-ui-behavior.mjs.map +1 -0
  87. package/{fesm2020 → fesm2022}/bravura-ui-clip-note.mjs +70 -70
  88. package/fesm2022/bravura-ui-clip-note.mjs.map +1 -0
  89. package/{fesm2020 → fesm2022}/bravura-ui-common.mjs +6 -6
  90. package/fesm2022/bravura-ui-common.mjs.map +1 -0
  91. package/{fesm2020 → fesm2022}/bravura-ui-currency-input.mjs +11 -11
  92. package/fesm2022/bravura-ui-currency-input.mjs.map +1 -0
  93. package/{fesm2020 → fesm2022}/bravura-ui-decimal-input.mjs +12 -12
  94. package/fesm2022/bravura-ui-decimal-input.mjs.map +1 -0
  95. package/{fesm2020 → fesm2022}/bravura-ui-discrete-input.mjs +48 -48
  96. package/fesm2022/bravura-ui-discrete-input.mjs.map +1 -0
  97. package/fesm2022/bravura-ui-file-upload.mjs +474 -0
  98. package/fesm2022/bravura-ui-file-upload.mjs.map +1 -0
  99. package/{fesm2020 → fesm2022}/bravura-ui-form-field.mjs +19 -19
  100. package/fesm2022/bravura-ui-form-field.mjs.map +1 -0
  101. package/{fesm2020 → fesm2022}/bravura-ui-icon-font.mjs +8 -8
  102. package/fesm2022/bravura-ui-icon-font.mjs.map +1 -0
  103. package/fesm2022/bravura-ui-panel.mjs +206 -0
  104. package/fesm2022/bravura-ui-panel.mjs.map +1 -0
  105. package/{fesm2020 → fesm2022}/bravura-ui-phone-number.mjs +30 -30
  106. package/fesm2022/bravura-ui-phone-number.mjs.map +1 -0
  107. package/{fesm2020 → fesm2022}/bravura-ui-radio-panel-testing.mjs +5 -6
  108. package/fesm2022/bravura-ui-radio-panel-testing.mjs.map +1 -0
  109. package/{fesm2020 → fesm2022}/bravura-ui-radio-panel.mjs +32 -32
  110. package/fesm2022/bravura-ui-radio-panel.mjs.map +1 -0
  111. package/fesm2022/bravura-ui-selection-panel.mjs +306 -0
  112. package/fesm2022/bravura-ui-selection-panel.mjs.map +1 -0
  113. package/{fesm2020 → fesm2022}/bravura-ui-skeletons.mjs +43 -43
  114. package/fesm2022/bravura-ui-skeletons.mjs.map +1 -0
  115. package/fesm2022/bravura-ui-stepper.mjs +251 -0
  116. package/fesm2022/bravura-ui-stepper.mjs.map +1 -0
  117. package/{fesm2020 → fesm2022}/bravura-ui-tooltip.mjs +32 -24
  118. package/fesm2022/bravura-ui-tooltip.mjs.map +1 -0
  119. package/fesm2022/bravura-ui.mjs.map +1 -0
  120. package/file-upload/file-upload.component.d.ts +1 -1
  121. package/form-field/form-field.component.d.ts +1 -1
  122. package/icon-font/icon.directive.d.ts +1 -1
  123. package/package.json +88 -132
  124. package/panel/panel.component.d.ts +1 -1
  125. package/panel/tinted.directive.d.ts +1 -1
  126. package/phone-number/phone-number.directive.d.ts +1 -1
  127. package/phone-number/phone-number.validator.d.ts +2 -2
  128. package/radio-panel/radio-panel-item.component.d.ts +1 -1
  129. package/radio-panel/radio-panel.component.d.ts +1 -1
  130. package/radio-panel/testing/test-api.d.ts +2 -3
  131. package/selection-panel/selection-panel-item.component.d.ts +1 -1
  132. package/selection-panel/selection-panel.directive.d.ts +1 -1
  133. package/skeletons/skeleton-loader-presets.directive.d.ts +3 -3
  134. package/stepper/stepper.component.d.ts +1 -1
  135. package/theme/_bui-card.scss +56 -56
  136. package/theme/_ui-theme.scss +3 -3
  137. package/theme/global-style-by-bootstrap.scss +3 -3
  138. package/theme/global-style-by-tailwind.scss +3 -3
  139. package/theme/scrollbar.scss +40 -40
  140. package/tooltip/tooltip.component.d.ts +2 -0
  141. package/tooltip/tooltip.directive.d.ts +3 -5
  142. package/esm2020/alert/alert-container.component.mjs +0 -207
  143. package/esm2020/alert/alert-message.component.mjs +0 -102
  144. package/esm2020/alert/alert.module.mjs +0 -22
  145. package/esm2020/alert/testing/test-api.mjs +0 -44
  146. package/esm2020/behavior/await.directive.mjs +0 -133
  147. package/esm2020/behavior/behavior.module.mjs +0 -37
  148. package/esm2020/behavior/observe-content-class.directive.mjs +0 -63
  149. package/esm2020/behavior/sizing-monitor.directive.mjs +0 -31
  150. package/esm2020/behavior/sizing.directive.mjs +0 -256
  151. package/esm2020/clip-note/clip-note.component.mjs +0 -216
  152. package/esm2020/clip-note/clip-note.directive.mjs +0 -141
  153. package/esm2020/clip-note/clip-note.module.mjs +0 -32
  154. package/esm2020/common/common.module.mjs +0 -53
  155. package/esm2020/currency-input/currency-input.directive.mjs +0 -276
  156. package/esm2020/currency-input/currency-input.module.mjs +0 -19
  157. package/esm2020/decimal-input/decimal-input.directive.mjs +0 -122
  158. package/esm2020/discrete-input/discrete-input.component.mjs +0 -337
  159. package/esm2020/discrete-input/discrete-input.module.mjs +0 -21
  160. package/esm2020/file-upload/file-upload.component.mjs +0 -400
  161. package/esm2020/file-upload/file-upload.module.mjs +0 -44
  162. package/esm2020/file-upload/file-upload.service.mjs +0 -29
  163. package/esm2020/form-field/form-field.component.mjs +0 -82
  164. package/esm2020/form-field/form-field.module.mjs +0 -33
  165. package/esm2020/icon-font/icon-font.module.mjs +0 -22
  166. package/esm2020/icon-font/icon.directive.mjs +0 -102
  167. package/esm2020/icon-font/utilities.mjs +0 -51
  168. package/esm2020/panel/panel-section.component.mjs +0 -41
  169. package/esm2020/panel/panel.component.mjs +0 -87
  170. package/esm2020/panel/panel.module.mjs +0 -23
  171. package/esm2020/panel/tinted.directive.mjs +0 -60
  172. package/esm2020/phone-number/phone-number.directive.mjs +0 -188
  173. package/esm2020/phone-number/phone-number.pipe.mjs +0 -47
  174. package/esm2020/phone-number/phone-number.validator.mjs +0 -64
  175. package/esm2020/radio-panel/radio-panel-item.component.mjs +0 -93
  176. package/esm2020/radio-panel/radio-panel.component.mjs +0 -81
  177. package/esm2020/radio-panel/testing/test-api.mjs +0 -47
  178. package/esm2020/selection-panel/selection-panel-item.component.mjs +0 -166
  179. package/esm2020/selection-panel/selection-panel.directive.mjs +0 -119
  180. package/esm2020/selection-panel/selection-panel.module.mjs +0 -23
  181. package/esm2020/skeletons/skeleton-loader-presets.directive.mjs +0 -83
  182. package/esm2020/skeletons/skeleton-loader.component.mjs +0 -76
  183. package/esm2020/skeletons/skeletons.module.mjs +0 -35
  184. package/esm2020/stepper/stepper.component.mjs +0 -176
  185. package/esm2020/stepper/stepper.module.mjs +0 -52
  186. package/esm2020/tooltip/tooltip.component.mjs +0 -54
  187. package/esm2020/tooltip/tooltip.directive.mjs +0 -149
  188. package/esm2020/tooltip/tooltip.module.mjs +0 -25
  189. package/fesm2015/bravura-ui-alert-testing.mjs +0 -64
  190. package/fesm2015/bravura-ui-alert-testing.mjs.map +0 -1
  191. package/fesm2015/bravura-ui-alert.mjs +0 -340
  192. package/fesm2015/bravura-ui-alert.mjs.map +0 -1
  193. package/fesm2015/bravura-ui-behavior.mjs +0 -515
  194. package/fesm2015/bravura-ui-behavior.mjs.map +0 -1
  195. package/fesm2015/bravura-ui-clip-note.mjs +0 -393
  196. package/fesm2015/bravura-ui-clip-note.mjs.map +0 -1
  197. package/fesm2015/bravura-ui-common.mjs +0 -96
  198. package/fesm2015/bravura-ui-common.mjs.map +0 -1
  199. package/fesm2015/bravura-ui-currency-input.mjs +0 -300
  200. package/fesm2015/bravura-ui-currency-input.mjs.map +0 -1
  201. package/fesm2015/bravura-ui-decimal-input.mjs +0 -145
  202. package/fesm2015/bravura-ui-decimal-input.mjs.map +0 -1
  203. package/fesm2015/bravura-ui-discrete-input.mjs +0 -365
  204. package/fesm2015/bravura-ui-discrete-input.mjs.map +0 -1
  205. package/fesm2015/bravura-ui-file-upload.mjs +0 -478
  206. package/fesm2015/bravura-ui-file-upload.mjs.map +0 -1
  207. package/fesm2015/bravura-ui-form-field.mjs +0 -120
  208. package/fesm2015/bravura-ui-form-field.mjs.map +0 -1
  209. package/fesm2015/bravura-ui-icon-font.mjs +0 -178
  210. package/fesm2015/bravura-ui-icon-font.mjs.map +0 -1
  211. package/fesm2015/bravura-ui-panel.mjs +0 -210
  212. package/fesm2015/bravura-ui-panel.mjs.map +0 -1
  213. package/fesm2015/bravura-ui-phone-number.mjs +0 -327
  214. package/fesm2015/bravura-ui-phone-number.mjs.map +0 -1
  215. package/fesm2015/bravura-ui-radio-panel-testing.mjs +0 -63
  216. package/fesm2015/bravura-ui-radio-panel-testing.mjs.map +0 -1
  217. package/fesm2015/bravura-ui-radio-panel.mjs +0 -200
  218. package/fesm2015/bravura-ui-radio-panel.mjs.map +0 -1
  219. package/fesm2015/bravura-ui-selection-panel.mjs +0 -311
  220. package/fesm2015/bravura-ui-selection-panel.mjs.map +0 -1
  221. package/fesm2015/bravura-ui-skeletons.mjs +0 -195
  222. package/fesm2015/bravura-ui-skeletons.mjs.map +0 -1
  223. package/fesm2015/bravura-ui-stepper.mjs +0 -253
  224. package/fesm2015/bravura-ui-stepper.mjs.map +0 -1
  225. package/fesm2015/bravura-ui-tooltip.mjs +0 -229
  226. package/fesm2015/bravura-ui-tooltip.mjs.map +0 -1
  227. package/fesm2015/bravura-ui.mjs.map +0 -1
  228. package/fesm2020/bravura-ui-alert-testing.mjs.map +0 -1
  229. package/fesm2020/bravura-ui-alert.mjs +0 -328
  230. package/fesm2020/bravura-ui-alert.mjs.map +0 -1
  231. package/fesm2020/bravura-ui-behavior.mjs.map +0 -1
  232. package/fesm2020/bravura-ui-clip-note.mjs.map +0 -1
  233. package/fesm2020/bravura-ui-common.mjs.map +0 -1
  234. package/fesm2020/bravura-ui-currency-input.mjs.map +0 -1
  235. package/fesm2020/bravura-ui-decimal-input.mjs.map +0 -1
  236. package/fesm2020/bravura-ui-discrete-input.mjs.map +0 -1
  237. package/fesm2020/bravura-ui-file-upload.mjs +0 -474
  238. package/fesm2020/bravura-ui-file-upload.mjs.map +0 -1
  239. package/fesm2020/bravura-ui-form-field.mjs.map +0 -1
  240. package/fesm2020/bravura-ui-icon-font.mjs.map +0 -1
  241. package/fesm2020/bravura-ui-panel.mjs +0 -206
  242. package/fesm2020/bravura-ui-panel.mjs.map +0 -1
  243. package/fesm2020/bravura-ui-phone-number.mjs.map +0 -1
  244. package/fesm2020/bravura-ui-radio-panel-testing.mjs.map +0 -1
  245. package/fesm2020/bravura-ui-radio-panel.mjs.map +0 -1
  246. package/fesm2020/bravura-ui-selection-panel.mjs +0 -306
  247. package/fesm2020/bravura-ui-selection-panel.mjs.map +0 -1
  248. package/fesm2020/bravura-ui-skeletons.mjs.map +0 -1
  249. package/fesm2020/bravura-ui-stepper.mjs +0 -251
  250. package/fesm2020/bravura-ui-stepper.mjs.map +0 -1
  251. package/fesm2020/bravura-ui-tooltip.mjs.map +0 -1
  252. package/fesm2020/bravura-ui.mjs +0 -8
  253. package/fesm2020/bravura-ui.mjs.map +0 -1
  254. /package/{esm2020 → esm2022}/alert/bravura-ui-alert.mjs +0 -0
  255. /package/{esm2020 → esm2022}/alert/testing/bravura-ui-alert-testing.mjs +0 -0
  256. /package/{esm2020 → esm2022}/behavior/bravura-ui-behavior.mjs +0 -0
  257. /package/{esm2020 → esm2022}/bravura-ui.mjs +0 -0
  258. /package/{esm2020 → esm2022}/clip-note/bravura-ui-clip-note.mjs +0 -0
  259. /package/{esm2020 → esm2022}/common/bravura-ui-common.mjs +0 -0
  260. /package/{esm2020 → esm2022}/currency-input/bravura-ui-currency-input.mjs +0 -0
  261. /package/{esm2020 → esm2022}/decimal-input/bravura-ui-decimal-input.mjs +0 -0
  262. /package/{esm2020 → esm2022}/decimal-input/public-api.mjs +0 -0
  263. /package/{esm2020 → esm2022}/discrete-input/bravura-ui-discrete-input.mjs +0 -0
  264. /package/{esm2020 → esm2022}/file-upload/bravura-ui-file-upload.mjs +0 -0
  265. /package/{esm2020 → esm2022}/form-field/bravura-ui-form-field.mjs +0 -0
  266. /package/{esm2020 → esm2022}/icon-font/bravura-ui-icon-font.mjs +0 -0
  267. /package/{esm2020 → esm2022}/panel/bravura-ui-panel.mjs +0 -0
  268. /package/{esm2020 → esm2022}/phone-number/bravura-ui-phone-number.mjs +0 -0
  269. /package/{esm2020 → esm2022}/radio-panel/bravura-ui-radio-panel.mjs +0 -0
  270. /package/{esm2020 → esm2022}/radio-panel/public-api.mjs +0 -0
  271. /package/{esm2020 → esm2022}/radio-panel/testing/bravura-ui-radio-panel-testing.mjs +0 -0
  272. /package/{esm2020 → esm2022}/selection-panel/bravura-ui-selection-panel.mjs +0 -0
  273. /package/{esm2020 → esm2022}/skeletons/bravura-ui-skeletons.mjs +0 -0
  274. /package/{esm2020 → esm2022}/stepper/bravura-ui-stepper.mjs +0 -0
  275. /package/{esm2020 → esm2022}/tooltip/bravura-ui-tooltip.mjs +0 -0
  276. /package/{fesm2015 → fesm2022}/bravura-ui.mjs +0 -0
@@ -1,133 +0,0 @@
1
- import { DOCUMENT } from '@angular/common';
2
- import { Directive, Inject, Input, Optional } from '@angular/core';
3
- import { MatProgressSpinner } from '@angular/material/progress-spinner';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/material/button";
6
- /**
7
- * Use this directive on a `MatButton` element to provide an alternative view when an async operation is in progress.
8
- *
9
- * For example:
10
- *
11
- * ```
12
- * <button (click)="submit();" [buiAwait]="submitSubscription" buiAwaitAriaLabel="submitting">Submit</button>
13
- * ```
14
- *
15
- * Please refer to [Material Design](https://material.io/components/progress-indicators#circular-progress-indicators)
16
- * for more details of integrating circular spinner component with action buttons.
17
- *
18
- * The operation is considered 'in progress' when the bound property `buiAwait` evaluates to
19
- *
20
- * - `true`; or
21
- * - a `number` within 0 - 100; or
22
- * - an instance of `rxjs/Subscription` and `buiAwait.closed` is falsy
23
- *
24
- * When in progress
25
- *
26
- * - the button's caption will be hidden;
27
- * - a `<mat-progress-spinner>` will be displayed in place of the caption;
28
- * - the button will be disabled by setting the property `disabled` of the `MatButton` instance.
29
- */
30
- export class AwaitDirective {
31
- constructor(_eRef, _button, _iconButton, _iconAnchor, _fab, _fabAnchor, _miniFab, _miniFabAnchor, doc, _viewCont) {
32
- this._eRef = _eRef;
33
- this._button = _button;
34
- this._iconButton = _iconButton;
35
- this._iconAnchor = _iconAnchor;
36
- this._fab = _fab;
37
- this._fabAnchor = _fabAnchor;
38
- this._miniFab = _miniFab;
39
- this._miniFabAnchor = _miniFabAnchor;
40
- this.doc = doc;
41
- this._viewCont = _viewCont;
42
- /** The ARIA label to be put on the spinner. The default value is `"In progress"`. */
43
- this.buiAwaitAriaLabel = 'In progress';
44
- /** The diameter of the in-progress spinner. The default value is `20`. */
45
- this.buiAwaitDiameter = 20;
46
- this._processing = false;
47
- this.button = _button || _iconButton || _iconAnchor || _fab || _fabAnchor || _miniFab || _miniFabAnchor;
48
- if (!this.button) {
49
- console.error('[buiAwait] can only be used on a Material button.');
50
- return;
51
- }
52
- }
53
- /** @ignore */
54
- ngAfterViewInit() {
55
- if (this.button) {
56
- this._overlayEl = this.doc.createElement('div');
57
- this._eRef.nativeElement.appendChild(this._overlayEl);
58
- this._overlayEl.classList.add('bui-await-overlay');
59
- this._overlayEl.style.cssText =
60
- 'display:flex; position:absolute; top:0; right:0; bottom:0; left:0; align-items: center; justify-content: center';
61
- this._captionWrapper = this._eRef.nativeElement.querySelector('.mdc-button__label,.mat-icon');
62
- }
63
- }
64
- /** @ignore */
65
- ngDoCheck() {
66
- const inProgress = this.buiAwait === true || (typeof this.buiAwait === 'object' && !this.buiAwait.closed) || this._isDeterminate;
67
- if (inProgress !== this._processing) {
68
- this._processing = inProgress;
69
- this._statusChanged(this._isDeterminate ? 'determinate' : 'indeterminate');
70
- }
71
- if (this._isDeterminate && this._spinnerRef) {
72
- this._spinnerRef.setInput('value', this.buiAwait);
73
- }
74
- }
75
- /** @ignore */
76
- get _isDeterminate() {
77
- return typeof this.buiAwait === 'number' && this.buiAwait >= 0 && this.buiAwait < 100;
78
- }
79
- _statusChanged(mode) {
80
- if (this.button) {
81
- this.button.disabled = this._processing;
82
- if (this._processing) {
83
- this._spinnerRef = this._viewCont.createComponent(MatProgressSpinner);
84
- const c = this._spinnerRef.instance;
85
- c.diameter = this.buiAwaitDiameter;
86
- c.mode = mode;
87
- c.color = this.button.color;
88
- const e = this._spinnerRef.location.nativeElement;
89
- e.setAttribute('aria-label', this.buiAwaitAriaLabel);
90
- this._overlayEl.appendChild(e);
91
- this._captionWrapper.style.visibility = 'hidden';
92
- }
93
- else {
94
- this._captionWrapper.style.visibility = '';
95
- this._spinnerRef.destroy();
96
- this._spinnerRef = undefined;
97
- this._overlayEl.innerHTML = '';
98
- }
99
- }
100
- }
101
- }
102
- AwaitDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: AwaitDirective, deps: [{ token: i0.ElementRef }, { token: i1.MatButton, optional: true }, { token: i1.MatIconButton, optional: true }, { token: i1.MatIconAnchor, optional: true }, { token: i1.MatFabButton, optional: true }, { token: i1.MatFabAnchor, optional: true }, { token: i1.MatMiniFabButton, optional: true }, { token: i1.MatMiniFabAnchor, optional: true }, { token: DOCUMENT }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
103
- AwaitDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: AwaitDirective, selector: "[buiAwait]", inputs: { buiAwait: "buiAwait", buiAwaitAriaLabel: "buiAwaitAriaLabel", buiAwaitDiameter: "buiAwaitDiameter" }, ngImport: i0 });
104
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: AwaitDirective, decorators: [{
105
- type: Directive,
106
- args: [{
107
- selector: '[buiAwait]'
108
- }]
109
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.MatButton, decorators: [{
110
- type: Optional
111
- }] }, { type: i1.MatIconButton, decorators: [{
112
- type: Optional
113
- }] }, { type: i1.MatIconAnchor, decorators: [{
114
- type: Optional
115
- }] }, { type: i1.MatFabButton, decorators: [{
116
- type: Optional
117
- }] }, { type: i1.MatFabAnchor, decorators: [{
118
- type: Optional
119
- }] }, { type: i1.MatMiniFabButton, decorators: [{
120
- type: Optional
121
- }] }, { type: i1.MatMiniFabAnchor, decorators: [{
122
- type: Optional
123
- }] }, { type: Document, decorators: [{
124
- type: Inject,
125
- args: [DOCUMENT]
126
- }] }, { type: i0.ViewContainerRef }]; }, propDecorators: { buiAwait: [{
127
- type: Input
128
- }], buiAwaitAriaLabel: [{
129
- type: Input
130
- }], buiAwaitDiameter: [{
131
- type: Input
132
- }] } });
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdhaXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvYmVoYXZpb3IvYXdhaXQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBR04sU0FBUyxFQUdULE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUVSLE1BQU0sZUFBZSxDQUFDO0FBVXZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBdUIsTUFBTSxvQ0FBb0MsQ0FBQzs7O0FBRzdGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUlILE1BQU0sT0FBTyxjQUFjO0lBcUMxQixZQUNrQixLQUE4QixFQUMxQixPQUFrQixFQUNsQixXQUEwQixFQUMxQixXQUEwQixFQUMxQixJQUFrQixFQUNsQixVQUF3QixFQUN4QixRQUEwQixFQUMxQixjQUFnQyxFQUNsQixHQUFhLEVBQ3hDLFNBQTJCO1FBVGxCLFVBQUssR0FBTCxLQUFLLENBQXlCO1FBQzFCLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFDbEIsZ0JBQVcsR0FBWCxXQUFXLENBQWU7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWU7UUFDMUIsU0FBSSxHQUFKLElBQUksQ0FBYztRQUNsQixlQUFVLEdBQVYsVUFBVSxDQUFjO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQWtCO1FBQzFCLG1CQUFjLEdBQWQsY0FBYyxDQUFrQjtRQUNsQixRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQ3hDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBaENwQyxxRkFBcUY7UUFFckYsc0JBQWlCLEdBQUcsYUFBYSxDQUFDO1FBRWxDLDBFQUEwRTtRQUUxRSxxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFHZCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQXlCM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLElBQUks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LENBQUMsZUFBZ0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQzthQUNsRDtpQkFBTTtnQkFDTixJQUFJLENBQUMsZUFBZ0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLFdBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxVQUFXLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQzthQUNoQztTQUNEO0lBQ0YsQ0FBQzs7MkdBM0dXLGNBQWMsdVdBOENqQixRQUFROytGQTlDTCxjQUFjOzJGQUFkLGNBQWM7a0JBSDFCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLFlBQVk7aUJBQ3RCOzswQkF3Q0UsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxRQUFROzJFQWpDakIsUUFBUTtzQkFEUCxLQUFLO2dCQUtOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFLTixnQkFBZ0I7c0JBRGYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG5cdEFmdGVyVmlld0luaXQsXG5cdENvbXBvbmVudFJlZixcblx0RGlyZWN0aXZlLFxuXHREb0NoZWNrLFxuXHRFbGVtZW50UmVmLFxuXHRJbmplY3QsXG5cdElucHV0LFxuXHRPcHRpb25hbCxcblx0Vmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG5cdE1hdEJ1dHRvbixcblx0TWF0RmFiQW5jaG9yLFxuXHRNYXRGYWJCdXR0b24sXG5cdE1hdEljb25BbmNob3IsXG5cdE1hdEljb25CdXR0b24sXG5cdE1hdE1pbmlGYWJBbmNob3IsXG5cdE1hdE1pbmlGYWJCdXR0b25cbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lciwgUHJvZ3Jlc3NTcGlubmVyTW9kZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogVXNlIHRoaXMgZGlyZWN0aXZlIG9uIGEgYE1hdEJ1dHRvbmAgZWxlbWVudCB0byBwcm92aWRlIGFuIGFsdGVybmF0aXZlIHZpZXcgd2hlbiBhbiBhc3luYyBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuXG4gKlxuICogRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgXG4gKiA8YnV0dG9uIChjbGljayk9XCJzdWJtaXQoKTtcIiBbYnVpQXdhaXRdPVwic3VibWl0U3Vic2NyaXB0aW9uXCIgYnVpQXdhaXRBcmlhTGFiZWw9XCJzdWJtaXR0aW5nXCI+U3VibWl0PC9idXR0b24+XG4gKiBgYGBcbiAqXG4gKiBQbGVhc2UgcmVmZXIgdG8gW01hdGVyaWFsIERlc2lnbl0oaHR0cHM6Ly9tYXRlcmlhbC5pby9jb21wb25lbnRzL3Byb2dyZXNzLWluZGljYXRvcnMjY2lyY3VsYXItcHJvZ3Jlc3MtaW5kaWNhdG9ycylcbiAqIGZvciBtb3JlIGRldGFpbHMgb2YgaW50ZWdyYXRpbmcgY2lyY3VsYXIgc3Bpbm5lciBjb21wb25lbnQgd2l0aCBhY3Rpb24gYnV0dG9ucy5cbiAqXG4gKiBUaGUgb3BlcmF0aW9uIGlzIGNvbnNpZGVyZWQgJ2luIHByb2dyZXNzJyB3aGVuIHRoZSBib3VuZCBwcm9wZXJ0eSBgYnVpQXdhaXRgIGV2YWx1YXRlcyB0b1xuICpcbiAqIC0gYHRydWVgOyBvclxuICogLSBhIGBudW1iZXJgIHdpdGhpbiAwIC0gMTAwOyBvclxuICogLSBhbiBpbnN0YW5jZSBvZiBgcnhqcy9TdWJzY3JpcHRpb25gIGFuZCBgYnVpQXdhaXQuY2xvc2VkYCBpcyBmYWxzeVxuICpcbiAqIFdoZW4gaW4gcHJvZ3Jlc3NcbiAqXG4gKiAtIHRoZSBidXR0b24ncyBjYXB0aW9uIHdpbGwgYmUgaGlkZGVuO1xuICogLSBhIGA8bWF0LXByb2dyZXNzLXNwaW5uZXI+YCB3aWxsIGJlIGRpc3BsYXllZCBpbiBwbGFjZSBvZiB0aGUgY2FwdGlvbjtcbiAqIC0gdGhlIGJ1dHRvbiB3aWxsIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhlIHByb3BlcnR5IGBkaXNhYmxlZGAgb2YgdGhlIGBNYXRCdXR0b25gIGluc3RhbmNlLlxuICovXG5ARGlyZWN0aXZlKHtcblx0c2VsZWN0b3I6ICdbYnVpQXdhaXRdJ1xufSlcbmV4cG9ydCBjbGFzcyBBd2FpdERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIERvQ2hlY2sge1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoZSBgaW4gcHJvZ3Jlc3NgIHN0YXR1cyBvZiBhbiBhc3luYyBvcGVyYXRpb24uXG5cdCAqXG5cdCAqIFRoZSBvcGVyYXRpb24gaXMgY29uc2lkZXJlZCAnaW4gcHJvZ3Jlc3MnIHdoZW4gdGhlIHByb3BlcnR5IGV2YWx1YXRlcyB0b1xuXHQgKlxuXHQgKiAtIGB0cnVlYDsgb3Jcblx0ICogLSBhIGBudW1iZXJgIHdpdGhpbiAwIC0gMTAwOyBvclxuXHQgKiAtIGFuIGluc3RhbmNlIG9mIGByeGpzL1N1YnNjcmlwdGlvbmAgYW5kIGBidWlBd2FpdC5jbG9zZWRgIGlzIGZhbHN5XG5cdCAqXG5cdCAqIFdoZW4gaXQgaXMgYSBudW1iZXIsIGl0IHJlcHJlc2V0cyB0aGUgcHJvZ3Jlc3MgaW4gcGVyY2VudGFnZSB0ZXJtLlxuXHQgKi9cblx0QElucHV0KClcblx0YnVpQXdhaXQ6IG51bGwgfCB1bmRlZmluZWQgfCBib29sZWFuIHwgU3Vic2NyaXB0aW9uIHwgbnVtYmVyO1xuXG5cdC8qKiBUaGUgQVJJQSBsYWJlbCB0byBiZSBwdXQgb24gdGhlIHNwaW5uZXIuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBcIkluIHByb2dyZXNzXCJgLiAqL1xuXHRASW5wdXQoKVxuXHRidWlBd2FpdEFyaWFMYWJlbCA9ICdJbiBwcm9ncmVzcyc7XG5cblx0LyoqIFRoZSBkaWFtZXRlciBvZiB0aGUgaW4tcHJvZ3Jlc3Mgc3Bpbm5lci4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYDIwYC4gKi9cblx0QElucHV0KClcblx0YnVpQXdhaXREaWFtZXRlciA9IDIwO1xuXG5cdHByaXZhdGUgX292ZXJsYXlFbDogSFRNTERpdkVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgX3Byb2Nlc3NpbmcgPSBmYWxzZTtcblx0cHJpdmF0ZSBfc3Bpbm5lclJlZjogQ29tcG9uZW50UmVmPE1hdFByb2dyZXNzU3Bpbm5lcj4gfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgX2NhcHRpb25XcmFwcGVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBidXR0b246XG5cdFx0fCBNYXRCdXR0b25cblx0XHR8IE1hdEljb25CdXR0b25cblx0XHR8IE1hdEljb25BbmNob3Jcblx0XHR8IE1hdEZhYkJ1dHRvblxuXHRcdHwgTWF0RmFiQW5jaG9yXG5cdFx0fCBNYXRNaW5pRmFiQnV0dG9uXG5cdFx0fCBNYXRNaW5pRmFiQW5jaG9yXG5cdFx0fCB1bmRlZmluZWQ7XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSByZWFkb25seSBfZVJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG5cdFx0QE9wdGlvbmFsKCkgcmVhZG9ubHkgX2J1dHRvbjogTWF0QnV0dG9uLFxuXHRcdEBPcHRpb25hbCgpIHJlYWRvbmx5IF9pY29uQnV0dG9uOiBNYXRJY29uQnV0dG9uLFxuXHRcdEBPcHRpb25hbCgpIHJlYWRvbmx5IF9pY29uQW5jaG9yOiBNYXRJY29uQW5jaG9yLFxuXHRcdEBPcHRpb25hbCgpIHJlYWRvbmx5IF9mYWI6IE1hdEZhYkJ1dHRvbixcblx0XHRAT3B0aW9uYWwoKSByZWFkb25seSBfZmFiQW5jaG9yOiBNYXRGYWJBbmNob3IsXG5cdFx0QE9wdGlvbmFsKCkgcmVhZG9ubHkgX21pbmlGYWI6IE1hdE1pbmlGYWJCdXR0b24sXG5cdFx0QE9wdGlvbmFsKCkgcmVhZG9ubHkgX21pbmlGYWJBbmNob3I6IE1hdE1pbmlGYWJBbmNob3IsXG5cdFx0QEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSByZWFkb25seSBkb2M6IERvY3VtZW50LFxuXHRcdHByaXZhdGUgX3ZpZXdDb250OiBWaWV3Q29udGFpbmVyUmVmXG5cdCkge1xuXHRcdHRoaXMuYnV0dG9uID0gX2J1dHRvbiB8fCBfaWNvbkJ1dHRvbiB8fCBfaWNvbkFuY2hvciB8fCBfZmFiIHx8IF9mYWJBbmNob3IgfHwgX21pbmlGYWIgfHwgX21pbmlGYWJBbmNob3I7XG5cdFx0aWYgKCF0aGlzLmJ1dHRvbikge1xuXHRcdFx0Y29uc29sZS5lcnJvcignW2J1aUF3YWl0XSBjYW4gb25seSBiZSB1c2VkIG9uIGEgTWF0ZXJpYWwgYnV0dG9uLicpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBAaWdub3JlICovXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5idXR0b24pIHtcblx0XHRcdHRoaXMuX292ZXJsYXlFbCA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0dGhpcy5fZVJlZi5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX292ZXJsYXlFbCk7XG5cdFx0XHR0aGlzLl9vdmVybGF5RWwuY2xhc3NMaXN0LmFkZCgnYnVpLWF3YWl0LW92ZXJsYXknKTtcblx0XHRcdHRoaXMuX292ZXJsYXlFbC5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdFx0J2Rpc3BsYXk6ZmxleDsgcG9zaXRpb246YWJzb2x1dGU7IHRvcDowOyByaWdodDowOyBib3R0b206MDsgbGVmdDowOyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcic7XG5cdFx0XHR0aGlzLl9jYXB0aW9uV3JhcHBlciA9IHRoaXMuX2VSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubWRjLWJ1dHRvbl9fbGFiZWwsLm1hdC1pY29uJykgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqIEBpZ25vcmUgKi9cblx0bmdEb0NoZWNrKCk6IHZvaWQge1xuXHRcdGNvbnN0IGluUHJvZ3Jlc3MgPVxuXHRcdFx0dGhpcy5idWlBd2FpdCA9PT0gdHJ1ZSB8fCAodHlwZW9mIHRoaXMuYnVpQXdhaXQgPT09ICdvYmplY3QnICYmICF0aGlzLmJ1aUF3YWl0IS5jbG9zZWQpIHx8IHRoaXMuX2lzRGV0ZXJtaW5hdGU7XG5cdFx0aWYgKGluUHJvZ3Jlc3MgIT09IHRoaXMuX3Byb2Nlc3NpbmcpIHtcblx0XHRcdHRoaXMuX3Byb2Nlc3NpbmcgPSBpblByb2dyZXNzO1xuXHRcdFx0dGhpcy5fc3RhdHVzQ2hhbmdlZCh0aGlzLl9pc0RldGVybWluYXRlID8gJ2RldGVybWluYXRlJyA6ICdpbmRldGVybWluYXRlJyk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLl9pc0RldGVybWluYXRlICYmIHRoaXMuX3NwaW5uZXJSZWYpIHtcblx0XHRcdHRoaXMuX3NwaW5uZXJSZWYuc2V0SW5wdXQoJ3ZhbHVlJywgdGhpcy5idWlBd2FpdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIEBpZ25vcmUgKi9cblx0cHJpdmF0ZSBnZXQgX2lzRGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHR5cGVvZiB0aGlzLmJ1aUF3YWl0ID09PSAnbnVtYmVyJyAmJiB0aGlzLmJ1aUF3YWl0ID49IDAgJiYgdGhpcy5idWlBd2FpdCA8IDEwMDtcblx0fVxuXG5cdHByaXZhdGUgX3N0YXR1c0NoYW5nZWQobW9kZTogUHJvZ3Jlc3NTcGlubmVyTW9kZSkge1xuXHRcdGlmICh0aGlzLmJ1dHRvbikge1xuXHRcdFx0dGhpcy5idXR0b24uZGlzYWJsZWQgPSB0aGlzLl9wcm9jZXNzaW5nO1xuXG5cdFx0XHRpZiAodGhpcy5fcHJvY2Vzc2luZykge1xuXHRcdFx0XHR0aGlzLl9zcGlubmVyUmVmID0gdGhpcy5fdmlld0NvbnQuY3JlYXRlQ29tcG9uZW50KE1hdFByb2dyZXNzU3Bpbm5lcik7XG5cdFx0XHRcdGNvbnN0IGMgPSB0aGlzLl9zcGlubmVyUmVmLmluc3RhbmNlO1xuXHRcdFx0XHRjLmRpYW1ldGVyID0gdGhpcy5idWlBd2FpdERpYW1ldGVyO1xuXHRcdFx0XHRjLm1vZGUgPSBtb2RlO1xuXHRcdFx0XHRjLmNvbG9yID0gdGhpcy5idXR0b24uY29sb3I7XG5cdFx0XHRcdGNvbnN0IGU6IEhUTUxFbGVtZW50ID0gdGhpcy5fc3Bpbm5lclJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50O1xuXHRcdFx0XHRlLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHRoaXMuYnVpQXdhaXRBcmlhTGFiZWwpO1xuXHRcdFx0XHR0aGlzLl9vdmVybGF5RWwhLmFwcGVuZENoaWxkKGUpO1xuXHRcdFx0XHR0aGlzLl9jYXB0aW9uV3JhcHBlciEuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fY2FwdGlvbldyYXBwZXIhLnN0eWxlLnZpc2liaWxpdHkgPSAnJztcblx0XHRcdFx0dGhpcy5fc3Bpbm5lclJlZiEuZGVzdHJveSgpO1xuXHRcdFx0XHR0aGlzLl9zcGlubmVyUmVmID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR0aGlzLl9vdmVybGF5RWwhLmlubmVySFRNTCA9ICcnO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuIl19
@@ -1,37 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { SizingDirective } from './sizing.directive';
4
- import { SizingMonitorDirective } from './sizing-monitor.directive';
5
- import { AwaitDirective } from './await.directive';
6
- import { MatButtonModule } from '@angular/material/button';
7
- import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
8
- import { ObserveContentClassDirective } from './observe-content-class.directive';
9
- import { ObserversModule } from '@angular/cdk/observers';
10
- import * as i0 from "@angular/core";
11
- /**
12
- * For functionality that cannot be easily achieved via CSS.
13
- */
14
- export class BehaviorModule {
15
- }
16
- BehaviorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: BehaviorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
17
- BehaviorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.6", ngImport: i0, type: BehaviorModule, declarations: [SizingDirective, SizingMonitorDirective, AwaitDirective, ObserveContentClassDirective], imports: [CommonModule, MatButtonModule, MatProgressSpinnerModule, ObserversModule], exports: [SizingDirective,
18
- SizingMonitorDirective,
19
- AwaitDirective,
20
- MatProgressSpinnerModule,
21
- ObserveContentClassDirective] });
22
- BehaviorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: BehaviorModule, imports: [CommonModule, MatButtonModule, MatProgressSpinnerModule, ObserversModule, MatProgressSpinnerModule] });
23
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: BehaviorModule, decorators: [{
24
- type: NgModule,
25
- args: [{
26
- declarations: [SizingDirective, SizingMonitorDirective, AwaitDirective, ObserveContentClassDirective],
27
- imports: [CommonModule, MatButtonModule, MatProgressSpinnerModule, ObserversModule],
28
- exports: [
29
- SizingDirective,
30
- SizingMonitorDirective,
31
- AwaitDirective,
32
- MatProgressSpinnerModule,
33
- ObserveContentClassDirective
34
- ]
35
- }]
36
- }] });
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVoYXZpb3IubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvYmVoYXZpb3IvYmVoYXZpb3IubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFekQ7O0dBRUc7QUFZSCxNQUFNLE9BQU8sY0FBYzs7MkdBQWQsY0FBYzs0R0FBZCxjQUFjLGlCQVZYLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsNEJBQTRCLGFBQzFGLFlBQVksRUFBRSxlQUFlLEVBQUUsd0JBQXdCLEVBQUUsZUFBZSxhQUVqRixlQUFlO1FBQ2Ysc0JBQXNCO1FBQ3RCLGNBQWM7UUFDZCx3QkFBd0I7UUFDeEIsNEJBQTRCOzRHQUdqQixjQUFjLFlBVGhCLFlBQVksRUFBRSxlQUFlLEVBQUUsd0JBQXdCLEVBQUUsZUFBZSxFQUtqRix3QkFBd0I7MkZBSWIsY0FBYztrQkFYMUIsUUFBUTttQkFBQztvQkFDVCxZQUFZLEVBQUUsQ0FBQyxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLDRCQUE0QixDQUFDO29CQUNyRyxPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLHdCQUF3QixFQUFFLGVBQWUsQ0FBQztvQkFDbkYsT0FBTyxFQUFFO3dCQUNSLGVBQWU7d0JBQ2Ysc0JBQXNCO3dCQUN0QixjQUFjO3dCQUNkLHdCQUF3Qjt3QkFDeEIsNEJBQTRCO3FCQUM1QjtpQkFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU2l6aW5nRGlyZWN0aXZlIH0gZnJvbSAnLi9zaXppbmcuZGlyZWN0aXZlJztcbmltcG9ydCB7IFNpemluZ01vbml0b3JEaXJlY3RpdmUgfSBmcm9tICcuL3NpemluZy1tb25pdG9yLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBBd2FpdERpcmVjdGl2ZSB9IGZyb20gJy4vYXdhaXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IE9ic2VydmVDb250ZW50Q2xhc3NEaXJlY3RpdmUgfSBmcm9tICcuL29ic2VydmUtY29udGVudC1jbGFzcy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgT2JzZXJ2ZXJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL29ic2VydmVycyc7XG5cbi8qKlxuICogIEZvciBmdW5jdGlvbmFsaXR5IHRoYXQgY2Fubm90IGJlIGVhc2lseSBhY2hpZXZlZCB2aWEgQ1NTLlxuICovXG5ATmdNb2R1bGUoe1xuXHRkZWNsYXJhdGlvbnM6IFtTaXppbmdEaXJlY3RpdmUsIFNpemluZ01vbml0b3JEaXJlY3RpdmUsIEF3YWl0RGlyZWN0aXZlLCBPYnNlcnZlQ29udGVudENsYXNzRGlyZWN0aXZlXSxcblx0aW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsIE9ic2VydmVyc01vZHVsZV0sXG5cdGV4cG9ydHM6IFtcblx0XHRTaXppbmdEaXJlY3RpdmUsXG5cdFx0U2l6aW5nTW9uaXRvckRpcmVjdGl2ZSxcblx0XHRBd2FpdERpcmVjdGl2ZSxcblx0XHRNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsXG5cdFx0T2JzZXJ2ZUNvbnRlbnRDbGFzc0RpcmVjdGl2ZVxuXHRdXG59KVxuZXhwb3J0IGNsYXNzIEJlaGF2aW9yTW9kdWxlIHt9XG4iXX0=
@@ -1,63 +0,0 @@
1
- import { Directive, Input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/cdk/observers";
4
- /**
5
- * Use `[bui-class.not-empty]` to specify a style class activated only when the host element has DOM children;
6
- *
7
- * use `[bui-class.empty]` for a style class activated when it has no DOM children.
8
- *
9
- * Use `[bui-class.no-text]` to specify a style class activated only when the host element has text content;
10
- *
11
- * use `[bui-class.has-text]` for a style class activated when it has no text content.
12
- */
13
- export class ObserveContentClassDirective {
14
- constructor(observer, elementRef) {
15
- this.classToRemove = [];
16
- this.element = elementRef.nativeElement;
17
- this.subscription = observer.observe(elementRef).subscribe(() => this.checkClass());
18
- }
19
- ngOnInit() {
20
- this.checkClass.bind(this);
21
- }
22
- ngOnDestroy() {
23
- this.subscription.unsubscribe();
24
- }
25
- checkClass() {
26
- this.element.classList.remove(...this.classToRemove);
27
- this.classToRemove = [];
28
- this.checkClassWith(this.classEmpty, this.classNotEmpty, () => this.element.childElementCount === 0 && !this.element.textContent?.trim());
29
- this.checkClassWith(this.classNoText, this.classHasText, () => !this.element.textContent?.trim());
30
- }
31
- checkClassWith(withoutClass, withClass, isWithout) {
32
- const without = isWithout();
33
- this.addClass(without ? withoutClass : withClass);
34
- }
35
- addClass(cls) {
36
- if (cls?.trim()) {
37
- const classes = cls.trim().split(/\s+/);
38
- this.element.classList.add(...classes);
39
- this.classToRemove.push(...classes);
40
- }
41
- }
42
- }
43
- ObserveContentClassDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: ObserveContentClassDirective, deps: [{ token: i1.ContentObserver }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
44
- ObserveContentClassDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: ObserveContentClassDirective, selector: "[bui-class.empty],[bui-class.not-empty],[bui-class.no-text],[bui-class.has-text]", inputs: { classEmpty: ["bui-class.empty", "classEmpty"], classNotEmpty: ["bui-class.not-empty", "classNotEmpty"], classNoText: ["bui-class.no-text", "classNoText"], classHasText: ["bui-class.has-text", "classHasText"] }, ngImport: i0 });
45
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: ObserveContentClassDirective, decorators: [{
46
- type: Directive,
47
- args: [{
48
- selector: '[bui-class.empty],[bui-class.not-empty],[bui-class.no-text],[bui-class.has-text]'
49
- }]
50
- }], ctorParameters: function () { return [{ type: i1.ContentObserver }, { type: i0.ElementRef }]; }, propDecorators: { classEmpty: [{
51
- type: Input,
52
- args: ['bui-class.empty']
53
- }], classNotEmpty: [{
54
- type: Input,
55
- args: ['bui-class.not-empty']
56
- }], classNoText: [{
57
- type: Input,
58
- args: ['bui-class.no-text']
59
- }], classHasText: [{
60
- type: Input,
61
- args: ['bui-class.has-text']
62
- }] } });
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2ZS1jb250ZW50LWNsYXNzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL2JlaGF2aW9yL29ic2VydmUtY29udGVudC1jbGFzcy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDOzs7QUFHaEY7Ozs7Ozs7O0dBUUc7QUFJSCxNQUFNLE9BQU8sNEJBQTRCO0lBaUJ4QyxZQUFZLFFBQXlCLEVBQUUsVUFBbUM7UUFkbEUsa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFlcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELFFBQVE7UUFDUCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsV0FBVztRQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVPLFVBQVU7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLENBQ2xCLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLGFBQWEsRUFDbEIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FDL0UsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRU8sY0FBYyxDQUNyQixZQUF1QyxFQUN2QyxTQUFvQyxFQUNwQyxTQUF3QjtRQUV4QixNQUFNLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBRSxTQUFpQixDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVPLFFBQVEsQ0FBQyxHQUFrQjtRQUNsQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNoQixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7U0FDcEM7SUFDRixDQUFDOzt5SEF4RFcsNEJBQTRCOzZHQUE1Qiw0QkFBNEI7MkZBQTVCLDRCQUE0QjtrQkFIeEMsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsa0ZBQWtGO2lCQUM1RjsrSEFPUSxVQUFVO3NCQURqQixLQUFLO3VCQUFDLGlCQUFpQjtnQkFJaEIsYUFBYTtzQkFEcEIsS0FBSzt1QkFBQyxxQkFBcUI7Z0JBSXBCLFdBQVc7c0JBRGxCLEtBQUs7dUJBQUMsbUJBQW1CO2dCQUlsQixZQUFZO3NCQURuQixLQUFLO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnRlbnRPYnNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vYnNlcnZlcnMnO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFVzZSBgW2J1aS1jbGFzcy5ub3QtZW1wdHldYCB0byBzcGVjaWZ5IGEgc3R5bGUgY2xhc3MgYWN0aXZhdGVkIG9ubHkgd2hlbiB0aGUgaG9zdCBlbGVtZW50IGhhcyBET00gY2hpbGRyZW47XG4gKlxuICogdXNlIGBbYnVpLWNsYXNzLmVtcHR5XWAgZm9yIGEgc3R5bGUgY2xhc3MgYWN0aXZhdGVkIHdoZW4gaXQgaGFzIG5vIERPTSBjaGlsZHJlbi5cbiAqXG4gKiBVc2UgYFtidWktY2xhc3Mubm8tdGV4dF1gIHRvIHNwZWNpZnkgYSBzdHlsZSBjbGFzcyBhY3RpdmF0ZWQgb25seSB3aGVuIHRoZSBob3N0IGVsZW1lbnQgaGFzIHRleHQgY29udGVudDtcbiAqXG4gKiB1c2UgYFtidWktY2xhc3MuaGFzLXRleHRdYCBmb3IgYSBzdHlsZSBjbGFzcyBhY3RpdmF0ZWQgd2hlbiBpdCBoYXMgbm8gdGV4dCBjb250ZW50LlxuICovXG5ARGlyZWN0aXZlKHtcblx0c2VsZWN0b3I6ICdbYnVpLWNsYXNzLmVtcHR5XSxbYnVpLWNsYXNzLm5vdC1lbXB0eV0sW2J1aS1jbGFzcy5uby10ZXh0XSxbYnVpLWNsYXNzLmhhcy10ZXh0XSdcbn0pXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZUNvbnRlbnRDbGFzc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25Jbml0IHtcblx0cHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblx0cHJpdmF0ZSByZWFkb25seSBlbGVtZW50OiBIVE1MRWxlbWVudDtcblx0cHJpdmF0ZSBjbGFzc1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xuXG5cdEBJbnB1dCgnYnVpLWNsYXNzLmVtcHR5Jylcblx0cHJpdmF0ZSBjbGFzc0VtcHR5Pzogc3RyaW5nO1xuXG5cdEBJbnB1dCgnYnVpLWNsYXNzLm5vdC1lbXB0eScpXG5cdHByaXZhdGUgY2xhc3NOb3RFbXB0eT86IHN0cmluZztcblxuXHRASW5wdXQoJ2J1aS1jbGFzcy5uby10ZXh0Jylcblx0cHJpdmF0ZSBjbGFzc05vVGV4dD86IHN0cmluZztcblxuXHRASW5wdXQoJ2J1aS1jbGFzcy5oYXMtdGV4dCcpXG5cdHByaXZhdGUgY2xhc3NIYXNUZXh0Pzogc3RyaW5nO1xuXG5cdGNvbnN0cnVjdG9yKG9ic2VydmVyOiBDb250ZW50T2JzZXJ2ZXIsIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7XG5cdFx0dGhpcy5lbGVtZW50ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXHRcdHRoaXMuc3Vic2NyaXB0aW9uID0gb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50UmVmKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jaGVja0NsYXNzKCkpO1xuXHR9XG5cblx0bmdPbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5jaGVja0NsYXNzLmJpbmQodGhpcyk7XG5cdH1cblxuXHRuZ09uRGVzdHJveSgpOiB2b2lkIHtcblx0XHR0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBjaGVja0NsYXNzKCk6IHZvaWQge1xuXHRcdHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLnRoaXMuY2xhc3NUb1JlbW92ZSk7XG5cdFx0dGhpcy5jbGFzc1RvUmVtb3ZlID0gW107XG5cdFx0dGhpcy5jaGVja0NsYXNzV2l0aChcblx0XHRcdHRoaXMuY2xhc3NFbXB0eSxcblx0XHRcdHRoaXMuY2xhc3NOb3RFbXB0eSxcblx0XHRcdCgpID0+IHRoaXMuZWxlbWVudC5jaGlsZEVsZW1lbnRDb3VudCA9PT0gMCAmJiAhdGhpcy5lbGVtZW50LnRleHRDb250ZW50Py50cmltKClcblx0XHQpO1xuXHRcdHRoaXMuY2hlY2tDbGFzc1dpdGgodGhpcy5jbGFzc05vVGV4dCwgdGhpcy5jbGFzc0hhc1RleHQsICgpID0+ICF0aGlzLmVsZW1lbnQudGV4dENvbnRlbnQ/LnRyaW0oKSk7XG5cdH1cblxuXHRwcml2YXRlIGNoZWNrQ2xhc3NXaXRoKFxuXHRcdHdpdGhvdXRDbGFzczogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0XHR3aXRoQ2xhc3M6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0aXNXaXRob3V0OiAoKSA9PiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHdpdGhvdXQgPSBpc1dpdGhvdXQoKTtcblx0XHR0aGlzLmFkZENsYXNzKHdpdGhvdXQgPyB3aXRob3V0Q2xhc3MgOiAod2l0aENsYXNzIGFzIGFueSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBhZGRDbGFzcyhjbHM6IHN0cmluZyB8IG51bGwpIHtcblx0XHRpZiAoY2xzPy50cmltKCkpIHtcblx0XHRcdGNvbnN0IGNsYXNzZXMgPSBjbHMudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG5cdFx0XHR0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcblx0XHRcdHRoaXMuY2xhc3NUb1JlbW92ZS5wdXNoKC4uLmNsYXNzZXMpO1xuXHRcdH1cblx0fVxufVxuIl19
@@ -1,31 +0,0 @@
1
- import { Directive } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- /**
4
- * Use this directive to designate a target HTML element, based on which the child elements'
5
- * `[buiSizing]` directives will calculate the sizes.
6
- *
7
- * ```html
8
- * <div [buiSizingMonitor]>
9
- * <div [buiSizing]="...">
10
- * </div>
11
- * <div>
12
- * <div [buiSizing]="...">
13
- * </div>
14
- * </div>
15
- * <div>
16
- * ```
17
- */
18
- export class SizingMonitorDirective {
19
- constructor(element) {
20
- this.element = element;
21
- }
22
- }
23
- SizingMonitorDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: SizingMonitorDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
24
- SizingMonitorDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: SizingMonitorDirective, selector: "[buiSizingMonitor]", ngImport: i0 });
25
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: SizingMonitorDirective, decorators: [{
26
- type: Directive,
27
- args: [{
28
- selector: '[buiSizingMonitor]'
29
- }]
30
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; } });
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2l6aW5nLW1vbml0b3IuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvYmVoYXZpb3Ivc2l6aW5nLW1vbml0b3IuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7O0FBRXREOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBSUgsTUFBTSxPQUFPLHNCQUFzQjtJQUNsQyxZQUE0QixPQUFnQztRQUFoQyxZQUFPLEdBQVAsT0FBTyxDQUF5QjtJQUFHLENBQUM7O21IQURwRCxzQkFBc0I7dUdBQXRCLHNCQUFzQjsyRkFBdEIsc0JBQXNCO2tCQUhsQyxTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxvQkFBb0I7aUJBQzlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogVXNlIHRoaXMgZGlyZWN0aXZlIHRvIGRlc2lnbmF0ZSBhIHRhcmdldCBIVE1MIGVsZW1lbnQsIGJhc2VkIG9uIHdoaWNoIHRoZSBjaGlsZCBlbGVtZW50cydcbiAqIGBbYnVpU2l6aW5nXWAgZGlyZWN0aXZlcyB3aWxsIGNhbGN1bGF0ZSB0aGUgc2l6ZXMuXG4gKlxuICogYGBgaHRtbFxuICogPGRpdiBbYnVpU2l6aW5nTW9uaXRvcl0+XG4gKiAgICA8ZGl2IFtidWlTaXppbmddPVwiLi4uXCI+XG4gKiAgICA8L2Rpdj5cbiAqICAgIDxkaXY+XG4gKiAgICAgICA8ZGl2IFtidWlTaXppbmddPVwiLi4uXCI+XG4gKiAgICAgICA8L2Rpdj5cbiAqICAgIDwvZGl2PlxuICogPGRpdj5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcblx0c2VsZWN0b3I6ICdbYnVpU2l6aW5nTW9uaXRvcl0nXG59KVxuZXhwb3J0IGNsYXNzIFNpemluZ01vbml0b3JEaXJlY3RpdmUge1xuXHRjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHt9XG59XG4iXX0=
@@ -1,256 +0,0 @@
1
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
- import { DOCUMENT } from '@angular/common';
3
- import { Directive, EventEmitter, Inject, Input, Optional, Output } from '@angular/core';
4
- import { debounceTime, take } from 'rxjs/operators';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./sizing-monitor.directive";
7
- /**
8
- * This directive monitors the changes in the width of the `sizingBy` target, and apply specified style
9
- * classes and/or inline styles to the current element dynamically.
10
- *
11
- * In order for the layout engine to efficiently calculate and stabilize the dimensions, the effective style property
12
- * `box-sizing` of the `sizingBy` target element must be set to `border-box`.
13
- *
14
- * The directive uses [ResizeObserver API](https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API)
15
- * to capture the events of element resizing. Please use a polyfill if you want to support older browsers
16
- * that do not implement ResizeObserver API.
17
- *
18
- * Examples:
19
- *
20
- * ```html
21
- * <div #parentElement>
22
- * <div [buiSizing]="{'400': 'small', '800': 'medium', '~': 'large'}" [buiSizingBy]="parentElement"></div>
23
- * <div [buiSizing]="['small', 'medium', 'large']" [buiSizingBy]="'root'"></div>
24
- * <div [buiSizing]="{'650': 'border-color: #28569', '~': 'bg-muted; border-style: dotted'}" [buiSizingBy]="parentElement"></div>
25
- * </div>
26
- * ```
27
- */
28
- export class SizingDirective {
29
- constructor(_doc, _defaultTarget, elemRef, _zone) {
30
- this._doc = _doc;
31
- this._defaultTarget = _defaultTarget;
32
- this._zone = _zone;
33
- /**
34
- * Specifies the breakpoint widths and the style classes.
35
- *
36
- * The sizing spec `{"400": "small", "800": "medium", "~": "large"}` tells the directive to apply
37
- * a style class `small` when the width of the monitored target is smaller than 400 pixels,
38
- * `medium` when the width is between 400 and 800 pixels, and `large` when above.
39
- *
40
- * @example {'400': 'small', '800': 'medium', '~': 'large'}
41
- */
42
- this.buiSizing = {};
43
- /**
44
- * The alias of `buiSizingBy`.
45
- * @default 'root'
46
- * @deprecated
47
- * @ignore
48
- */
49
- this.sizingBy = 'root';
50
- /**
51
- * Emits `{width, height}` when the monitor target element resizes.
52
- *
53
- * Note that the dimensions emitted are of the [sizingBy] target, but not the current element.
54
- */
55
- this.buiResized = new EventEmitter();
56
- /**
57
- * Recalculate the height of this element according to the height of the monitored target.
58
- */
59
- this.buiFixedHeight = false;
60
- this._sizingSpec = {};
61
- this._width = 0;
62
- this._height = 0;
63
- this._reflowFrameCount = 0;
64
- this._frameHandlerId = 0;
65
- this._element = elemRef.nativeElement;
66
- this._monitorTarget = this._element;
67
- }
68
- /**
69
- * Designate an element to be monitored for recalculating the style classes of the current element.
70
- *
71
- * - `root` specifies the document root or the enclosing shadow host. This is the default value.
72
- * - `parent` specifies the parent element.
73
- *
74
- * @default 'root'
75
- * @alias sizingBy
76
- */
77
- get buiSizingBy() {
78
- return this.sizingBy;
79
- }
80
- set buiSizingBy(target) {
81
- this.sizingBy = target;
82
- }
83
- ngOnChanges(_) {
84
- const disconnected = this._element.getRootNode() instanceof HTMLElement;
85
- if (disconnected) {
86
- // defer shadow detection till dom connection event
87
- this._zone.onStable.pipe(debounceTime(10), take(1)).subscribe(() => this._initOrReset());
88
- }
89
- else {
90
- this._initOrReset();
91
- }
92
- }
93
- ngOnDestroy() {
94
- this._tearDownNodeMonitor();
95
- }
96
- _initOrReset() {
97
- const originalTarget = this._monitorTarget;
98
- if (this.buiSizingBy instanceof HTMLElement) {
99
- this._monitorTarget = this.buiSizingBy;
100
- }
101
- else if (this._defaultTarget) {
102
- this._monitorTarget = this._defaultTarget.element.nativeElement;
103
- }
104
- else if (this.buiSizingBy === 'root') {
105
- const root = this._element.getRootNode();
106
- if (root instanceof ShadowRoot) {
107
- this._monitorTarget = root.host;
108
- }
109
- else {
110
- this._monitorTarget = this._doc.documentElement;
111
- }
112
- }
113
- else {
114
- this._monitorTarget = this._element.parentElement;
115
- }
116
- if (this._monitorTarget != originalTarget) {
117
- this._setUpNodeMonitor();
118
- }
119
- this._sizingSpec = {};
120
- let spec = this.buiSizing;
121
- if (typeof spec === 'string') {
122
- spec = spec.split(',').map(k => k.trim());
123
- }
124
- if (Array.isArray(spec)) {
125
- spec.forEach((c, i) => {
126
- this._sizingSpec[SizingDirective.defaultSizingBreakpoints[i] || '~'] = c;
127
- });
128
- }
129
- else if (spec) {
130
- this._sizingSpec = spec;
131
- }
132
- this.buiFixedHeight = coerceBooleanProperty(this.buiFixedHeight);
133
- this._calculateSize();
134
- }
135
- _setUpNodeMonitor() {
136
- this._tearDownNodeMonitor();
137
- if (this._monitorTarget) {
138
- this._observer = new ResizeObserver(() => this._runWithObserver(this._calculateSize.bind(this)));
139
- this._observer.observe(this._monitorTarget, { box: 'border-box' });
140
- }
141
- }
142
- _tearDownNodeMonitor() {
143
- cancelAnimationFrame(this._frameHandlerId);
144
- this._runWithObserver(() => {
145
- this._observer.disconnect();
146
- this._observer = undefined;
147
- });
148
- }
149
- _runWithObserver(func) {
150
- if (this._observer) {
151
- return func();
152
- }
153
- return undefined;
154
- }
155
- _calculateSize() {
156
- const widthChanged = this._width !== this._monitorTarget.clientWidth;
157
- const heightChanged = this._height !== this._monitorTarget.clientHeight;
158
- if (widthChanged) {
159
- this._width = this._monitorTarget.clientWidth;
160
- const bks = Object.keys(this._sizingSpec).sort((a, b) => this._toNumber(a) - this._toNumber(b));
161
- let found = false;
162
- for (const key of bks) {
163
- const classesOrStyles = this._sizingSpec[key].split(/;+/).filter(c => c);
164
- this._removeClassesOrStyles(classesOrStyles);
165
- const expectedWidth = this._toNumber(key);
166
- if (this._width <= expectedWidth && !found) {
167
- this._applyClassesOrStyles(classesOrStyles);
168
- found = true;
169
- }
170
- }
171
- }
172
- if (widthChanged || heightChanged) {
173
- this._height = this._monitorTarget.clientHeight;
174
- if (this.buiFixedHeight) {
175
- this._reflowFrameCount = 0;
176
- this._reflowHeight();
177
- }
178
- setTimeout(() => this._zone.run(() => this.buiResized.emit({ width: this._width, height: this._height })));
179
- }
180
- }
181
- _applyClassesOrStyles(clsOrStyles) {
182
- clsOrStyles.forEach(s => {
183
- if (s.includes(':')) {
184
- const [prop, val] = s.split(':');
185
- this._element.style.setProperty(prop.trim(), val.trim());
186
- }
187
- else {
188
- const classes = s.split(/\s+/).filter(c => c);
189
- if (classes.length) {
190
- this._element.classList.add(...classes);
191
- }
192
- }
193
- });
194
- }
195
- _removeClassesOrStyles(clsOrStyles) {
196
- clsOrStyles.forEach(s => {
197
- if (s.includes(':')) {
198
- const [prop] = s.split(':');
199
- this._element.style.removeProperty(prop);
200
- }
201
- else {
202
- const classes = s.split(/\s+/).filter(c => c);
203
- if (classes.length) {
204
- this._element.classList.remove(...classes);
205
- }
206
- }
207
- });
208
- }
209
- _reflowHeight() {
210
- const cnt = this._reflowFrameCount;
211
- if (cnt < 15) {
212
- cancelAnimationFrame(this._frameHandlerId);
213
- this._frameHandlerId = requestAnimationFrame(this._reflowHeight.bind(this));
214
- if (cnt === 0) {
215
- this._element.style.height = '0';
216
- }
217
- else if (cnt === 14) {
218
- const gt = parseInt(getComputedStyle(this._monitorTarget).getPropertyValue('padding-top').replace(/px$/, '') || '0', 10);
219
- const gb = parseInt(getComputedStyle(this._monitorTarget).getPropertyValue('padding-bottom').replace(/px$/, '') || '0', 10);
220
- this._element.style.height = `${this._height - gt - gb - 5}px`;
221
- }
222
- }
223
- this._reflowFrameCount++;
224
- }
225
- _toNumber(s) {
226
- return (s === '~' ? Infinity : Number(s)) || -Infinity;
227
- }
228
- }
229
- /**
230
- * @ignore
231
- */
232
- SizingDirective.defaultSizingBreakpoints = ['400', '800', '~'];
233
- SizingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: SizingDirective, deps: [{ token: DOCUMENT }, { token: i1.SizingMonitorDirective, optional: true }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
234
- SizingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: SizingDirective, selector: "[buiSizing],[buiResized],[buiSizingBy],[buiFixedHeight]", inputs: { buiSizing: "buiSizing", sizingBy: "sizingBy", buiSizingBy: "buiSizingBy", buiFixedHeight: "buiFixedHeight" }, outputs: { buiResized: "buiResized" }, usesOnChanges: true, ngImport: i0 });
235
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: SizingDirective, decorators: [{
236
- type: Directive,
237
- args: [{
238
- selector: '[buiSizing],[buiResized],[buiSizingBy],[buiFixedHeight]'
239
- }]
240
- }], ctorParameters: function () { return [{ type: Document, decorators: [{
241
- type: Inject,
242
- args: [DOCUMENT]
243
- }] }, { type: i1.SizingMonitorDirective, decorators: [{
244
- type: Optional
245
- }] }, { type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { buiSizing: [{
246
- type: Input
247
- }], sizingBy: [{
248
- type: Input
249
- }], buiSizingBy: [{
250
- type: Input
251
- }], buiResized: [{
252
- type: Output
253
- }], buiFixedHeight: [{
254
- type: Input
255
- }] } });
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2l6aW5nLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL2JlaGF2aW9yL3NpemluZy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFFTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFHcEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBSUgsTUFBTSxPQUFPLGVBQWU7SUFtRTNCLFlBQzJCLElBQWMsRUFDcEIsY0FBc0MsRUFDMUQsT0FBZ0MsRUFDeEIsS0FBYTtRQUhLLFNBQUksR0FBSixJQUFJLENBQVU7UUFDcEIsbUJBQWMsR0FBZCxjQUFjLENBQXdCO1FBRWxELFVBQUssR0FBTCxLQUFLLENBQVE7UUFqRXRCOzs7Ozs7OztXQVFHO1FBRUgsY0FBUyxHQUF1RCxFQUFFLENBQUM7UUFFbkU7Ozs7O1dBS0c7UUFFSCxhQUFRLEdBQW9DLE1BQU0sQ0FBQztRQW1CbkQ7Ozs7V0FJRztRQUVILGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBcUMsQ0FBQztRQUVuRTs7V0FFRztRQUVILG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBSWYsZ0JBQVcsR0FBOEIsRUFBRSxDQUFDO1FBQzVDLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ1osc0JBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBRXRCLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBUTNCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FB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RSxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQ2xHLEVBQUUsQ0FDRixDQUFDO2dCQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQzthQUMvRDtTQUNEO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLFNBQVMsQ0FBQyxDQUFTO1FBQzFCLE9BQU8sQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3hELENBQUM7O0FBNU9EOztHQUVHO0FBQ0ksd0NBQXdCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRHQUoxQyxlQUFlLGtCQW9FbEIsUUFBUTtnR0FwRUwsZUFBZTsyRkFBZixlQUFlO2tCQUgzQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSx5REFBeUQ7aUJBQ25FOzswQkFxRUUsTUFBTTsyQkFBQyxRQUFROzswQkFDZixRQUFROzBGQXJEVixTQUFTO3NCQURSLEtBQUs7Z0JBVU4sUUFBUTtzQkFEUCxLQUFLO2dCQWFGLFdBQVc7c0JBRGQsS0FBSztnQkFjTixVQUFVO3NCQURULE1BQU07Z0JBT1AsY0FBYztzQkFEYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG5cdERpcmVjdGl2ZSxcblx0RWxlbWVudFJlZixcblx0RXZlbnRFbWl0dGVyLFxuXHRJbmplY3QsXG5cdElucHV0LFxuXHROZ1pvbmUsXG5cdE9uQ2hhbmdlcyxcblx0T25EZXN0cm95LFxuXHRPcHRpb25hbCxcblx0T3V0cHV0LFxuXHRTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU2l6aW5nTW9uaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4vc2l6aW5nLW1vbml0b3IuZGlyZWN0aXZlJztcblxuLyoqXG4gKiBUaGlzIGRpcmVjdGl2ZSBtb25pdG9ycyB0aGUgY2hhbmdlcyBpbiB0aGUgd2lkdGggb2YgdGhlIGBzaXppbmdCeWAgdGFyZ2V0LCBhbmQgYXBwbHkgc3BlY2lmaWVkIHN0eWxlXG4gKiAgY2xhc3NlcyBhbmQvb3IgaW5saW5lIHN0eWxlcyB0byB0aGUgY3VycmVudCBlbGVtZW50IGR5bmFtaWNhbGx5LlxuICpcbiAqIEluIG9yZGVyIGZvciB0aGUgbGF5b3V0IGVuZ2luZSB0byBlZmZpY2llbnRseSBjYWxjdWxhdGUgYW5kIHN0YWJpbGl6ZSB0aGUgZGltZW5zaW9ucywgdGhlIGVmZmVjdGl2ZSBzdHlsZSBwcm9wZXJ0eVxuICogYGJveC1zaXppbmdgIG9mIHRoZSBgc2l6aW5nQnlgIHRhcmdldCBlbGVtZW50IG11c3QgYmUgc2V0IHRvIGBib3JkZXItYm94YC5cbiAqXG4gKiBUaGUgZGlyZWN0aXZlIHVzZXMgW1Jlc2l6ZU9ic2VydmVyIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Jlc2l6ZV9PYnNlcnZlcl9BUEkpXG4gKiB0byBjYXB0dXJlIHRoZSBldmVudHMgb2YgZWxlbWVudCByZXNpemluZy4gUGxlYXNlIHVzZSBhIHBvbHlmaWxsIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgb2xkZXIgYnJvd3NlcnNcbiAqIHRoYXQgZG8gbm90IGltcGxlbWVudCBSZXNpemVPYnNlcnZlciBBUEkuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiAjcGFyZW50RWxlbWVudD5cbiAqICAgPGRpdiBbYnVpU2l6aW5nXT1cInsnNDAwJzogJ3NtYWxsJywgJzgwMCc6ICdtZWRpdW0nLCAnfic6ICdsYXJnZSd9XCIgW2J1aVNpemluZ0J5XT1cInBhcmVudEVsZW1lbnRcIj48L2Rpdj5cbiAqICAgPGRpdiBbYnVpU2l6aW5nXT1cIlsnc21hbGwnLCAnbWVkaXVtJywgJ2xhcmdlJ11cIiBbYnVpU2l6aW5nQnldPVwiJ3Jvb3QnXCI+PC9kaXY+XG4gKiAgIDxkaXYgW2J1aVNpemluZ109XCJ7JzY1MCc6ICdib3JkZXItY29sb3I6ICMyODU2OScsICd+JzogJ2JnLW11dGVkOyBib3JkZXItc3R5bGU6IGRvdHRlZCd9XCIgW2J1aVNpemluZ0J5XT1cInBhcmVudEVsZW1lbnRcIj48L2Rpdj5cbiAqIDwvZGl2PlxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuXHRzZWxlY3RvcjogJ1tidWlTaXppbmddLFtidWlSZXNpemVkXSxbYnVpU2l6aW5nQnldLFtidWlGaXhlZEhlaWdodF0nXG59KVxuZXhwb3J0IGNsYXNzIFNpemluZ0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblx0LyoqXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cdHN0YXRpYyBkZWZhdWx0U2l6aW5nQnJlYWtwb2ludHMgPSBbJzQwMCcsICc4MDAnLCAnfiddO1xuXG5cdC8qKlxuXHQgKiBTcGVjaWZpZXMgdGhlIGJyZWFrcG9pbnQgd2lkdGhzIGFuZCB0aGUgc3R5bGUgY2xhc3Nlcy5cblx0ICpcblx0ICogVGhlIHNpemluZyBzcGVjIGB7XCI0MDBcIjogXCJzbWFsbFwiLCBcIjgwMFwiOiBcIm1lZGl1bVwiLCBcIn5cIjogXCJsYXJnZVwifWAgdGVsbHMgdGhlIGRpcmVjdGl2ZSB0byBhcHBseVxuXHQgKiBhIHN0eWxlIGNsYXNzIGBzbWFsbGAgd2hlbiB0aGUgd2lkdGggb2YgdGhlIG1vbml0b3JlZCB0YXJnZXQgaXMgc21hbGxlciB0aGFuIDQwMCBwaXhlbHMsXG5cdCAqIGBtZWRpdW1gIHdoZW4gdGhlIHdpZHRoIGlzIGJldHdlZW4gNDAwIGFuZCA4MDAgcGl4ZWxzLCBhbmQgYGxhcmdlYCB3aGVuIGFib3ZlLlxuXHQgKlxuXHQgKiBAZXhhbXBsZSB7JzQwMCc6ICdzbWFsbCcsICc4MDAnOiAnbWVkaXVtJywgJ34nOiAnbGFyZ2UnfVxuXHQgKi9cblx0QElucHV0KClcblx0YnVpU2l6aW5nOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+IHwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG5cdC8qKlxuXHQgKiBUaGUgYWxpYXMgb2YgYGJ1aVNpemluZ0J5YC5cblx0ICogQGRlZmF1bHQgJ3Jvb3QnXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cdEBJbnB1dCgpXG5cdHNpemluZ0J5OiAncm9vdCcgfCAncGFyZW50JyB8IEhUTUxFbGVtZW50ID0gJ3Jvb3QnO1xuXG5cdC8qKlxuXHQgKiBEZXNpZ25hdGUgYW4gZWxlbWVudCB0byBiZSBtb25pdG9yZWQgZm9yIHJlY2FsY3VsYXRpbmcgdGhlIHN0eWxlIGNsYXNzZXMgb2YgdGhlIGN1cnJlbnQgZWxlbWVudC5cblx0ICpcblx0ICogLSBgcm9vdGAgc3BlY2lmaWVzIHRoZSBkb2N1bWVudCByb290IG9yIHRoZSBlbmNsb3Npbmcgc2hhZG93IGhvc3QuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUuXG5cdCAqIC0gYHBhcmVudGAgc3BlY2lmaWVzIHRoZSBwYXJlbnQgZWxlbWVudC5cblx0ICpcblx0ICogQGRlZmF1bHQgJ3Jvb3QnXG5cdCAqIEBhbGlhcyBzaXppbmdCeVxuXHQgKi9cblx0QElucHV0KClcblx0Z2V0IGJ1aVNpemluZ0J5KCk6ICdyb290JyB8ICdwYXJlbnQnIHwgSFRNTEVsZW1lbnQge1xuXHRcdHJldHVybiB0aGlzLnNpemluZ0J5O1xuXHR9XG5cdHNldCBidWlTaXppbmdCeSh0YXJnZXQ6ICdyb290JyB8ICdwYXJlbnQnIHwgSFRNTEVsZW1lbnQpIHtcblx0XHR0aGlzLnNpemluZ0J5ID0gdGFyZ2V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEVtaXRzIGB7d2lkdGgsIGhlaWdodH1gIHdoZW4gdGhlIG1vbml0b3IgdGFyZ2V0IGVsZW1lbnQgcmVzaXplcy5cblx0ICpcblx0ICogTm90ZSB0aGF0IHRoZSBkaW1lbnNpb25zIGVtaXR0ZWQgYXJlIG9mIHRoZSBbc2l6aW5nQnldIHRhcmdldCwgYnV0IG5vdCB0aGUgY3VycmVudCBlbGVtZW50LlxuXHQgKi9cblx0QE91dHB1dCgpXG5cdGJ1aVJlc2l6ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4oKTtcblxuXHQvKipcblx0ICogUmVjYWxjdWxhdGUgdGhlIGhlaWdodCBvZiB0aGlzIGVsZW1lbnQgYWNjb3JkaW5nIHRvIHRoZSBoZWlnaHQgb2YgdGhlIG1vbml0b3JlZCB0YXJnZXQuXG5cdCAqL1xuXHRASW5wdXQoKVxuXHRidWlGaXhlZEhlaWdodCA9IGZhbHNlO1xuXG5cdHByaXZhdGUgX21vbml0b3JUYXJnZXQ6IEhUTUxFbGVtZW50O1xuXHRwcml2YXRlIF9vYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgX3NpemluZ1NwZWM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblx0cHJpdmF0ZSBfd2lkdGggPSAwO1xuXHRwcml2YXRlIF9oZWlnaHQgPSAwO1xuXHRwcml2YXRlIF9yZWZsb3dGcmFtZUNvdW50ID0gMDtcblx0cHJpdmF0ZSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cdHByaXZhdGUgX2ZyYW1lSGFuZGxlcklkID0gMDtcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2M6IERvY3VtZW50LFxuXHRcdEBPcHRpb25hbCgpIHByaXZhdGUgX2RlZmF1bHRUYXJnZXQ6IFNpemluZ01vbml0b3JEaXJlY3RpdmUsXG5cdFx0ZWxlbVJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG5cdFx0cHJpdmF0ZSBfem9uZTogTmdab25lXG5cdCkge1xuXHRcdHRoaXMuX2VsZW1lbnQgPSBlbGVtUmVmLm5hdGl2ZUVsZW1lbnQ7XG5cdFx0dGhpcy5fbW9uaXRvclRhcmdldCA9IHRoaXMuX2VsZW1lbnQ7XG5cdH1cblxuXHRuZ09uQ2hhbmdlcyhfOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG5cdFx0Y29uc3QgZGlzY29ubmVjdGVkID0gdGhpcy5fZWxlbWVudC5nZXRSb290Tm9kZSgpIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG5cdFx0aWYgKGRpc2Nvbm5lY3RlZCkge1xuXHRcdFx0Ly8gZGVmZXIgc2hhZG93IGRldGVjdGlvbiB0aWxsIGRvbSBjb25uZWN0aW9uIGV2ZW50XG5cdFx0XHR0aGlzLl96b25lLm9uU3RhYmxlLnBpcGUoZGVib3VuY2VUaW1lKDEwKSwgdGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2luaXRPclJlc2V0KCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9pbml0T3JSZXNldCgpO1xuXHRcdH1cblx0fVxuXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xuXHRcdHRoaXMuX3RlYXJEb3duTm9kZU1vbml0b3IoKTtcblx0fVxuXG5cdHByaXZhdGUgX2luaXRPclJlc2V0KCkge1xuXHRcdGNvbnN0IG9yaWdpbmFsVGFyZ2V0ID0gdGhpcy5fbW9uaXRvclRhcmdldDtcblx0XHRpZiAodGhpcy5idWlTaXppbmdCeSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cdFx0XHR0aGlzLl9tb25pdG9yVGFyZ2V0ID0gdGhpcy5idWlTaXppbmdCeTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuX2RlZmF1bHRUYXJnZXQpIHtcblx0XHRcdHRoaXMuX21vbml0b3JUYXJnZXQgPSB0aGlzLl9kZWZhdWx0VGFyZ2V0LmVsZW1lbnQubmF0aXZlRWxlbWVudDtcblx0XHR9IGVsc2UgaWYgKHRoaXMuYnVpU2l6aW5nQnkgPT09ICdyb290Jykge1xuXHRcdFx0Y29uc3Qgcm9vdCA9IHRoaXMuX2VsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcblx0XHRcdGlmIChyb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuXHRcdFx0XHR0aGlzLl9tb25pdG9yVGFyZ2V0ID0gcm9vdC5ob3N0IGFzIEhUTUxFbGVtZW50O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fbW9uaXRvclRhcmdldCA9IHRoaXMuX2RvYy5kb2N1bWVudEVsZW1lbnQ7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX21vbml0b3JUYXJnZXQgPSB0aGlzLl9lbGVtZW50LnBhcmVudEVsZW1lbnQgYXMgYW55O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9tb25pdG9yVGFyZ2V0ICE9IG9yaWdpbmFsVGFyZ2V0KSB7XG5cdFx0XHR0aGlzLl9zZXRVcE5vZGVNb25pdG9yKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fc2l6aW5nU3BlYyA9IHt9O1xuXHRcdGxldCBzcGVjID0gdGhpcy5idWlTaXppbmc7XG5cdFx0aWYgKHR5cGVvZiBzcGVjID09PSAnc3RyaW5nJykge1xuXHRcdFx0c3BlYyA9IHNwZWMuc3BsaXQoJywnKS5tYXAoayA9PiBrLnRyaW0oKSk7XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoc3BlYykpIHtcblx0XHRcdHNwZWMuZm9yRWFjaCgoYywgaSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9zaXppbmdTcGVjW1NpemluZ0RpcmVjdGl2ZS5kZWZhdWx0U2l6aW5nQnJlYWtwb2ludHNbaV0gfHwgJ34nXSA9IGM7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKHNwZWMpIHtcblx0XHRcdHRoaXMuX3NpemluZ1NwZWMgPSBzcGVjO1xuXHRcdH1cblxuXHRcdHRoaXMuYnVpRml4ZWRIZWlnaHQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodGhpcy5idWlGaXhlZEhlaWdodCk7XG5cblx0XHR0aGlzLl9jYWxjdWxhdGVTaXplKCk7XG5cdH1cblxuXHRwcml2YXRlIF9zZXRVcE5vZGVNb25pdG9yKCkge1xuXHRcdHRoaXMuX3RlYXJEb3duTm9kZU1vbml0b3IoKTtcblx0XHRpZiAodGhpcy5fbW9uaXRvclRhcmdldCkge1xuXHRcdFx0dGhpcy5fb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5fcnVuV2l0aE9ic2VydmVyKHRoaXMuX2NhbGN1bGF0ZVNpemUuYmluZCh0aGlzKSkpO1xuXG5cdFx0XHR0aGlzLl9vYnNlcnZlci5vYnNlcnZlKHRoaXMuX21vbml0b3JUYXJnZXQsIHsgYm94OiAnYm9yZGVyLWJveCcgfSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBfdGVhckRvd25Ob2RlTW9uaXRvcigpIHtcblx0XHRjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9mcmFtZUhhbmRsZXJJZCk7XG5cdFx0dGhpcy5fcnVuV2l0aE9ic2VydmVyKCgpID0+IHtcblx0XHRcdHRoaXMuX29ic2VydmVyIS5kaXNjb25uZWN0KCk7XG5cdFx0XHR0aGlzLl9vYnNlcnZlciA9IHVuZGVmaW5lZDtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgX3J1bldpdGhPYnNlcnZlcjxUPihmdW5jOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuX29ic2VydmVyKSB7XG5cdFx0XHRyZXR1cm4gZnVuYygpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSBfY2FsY3VsYXRlU2l6ZSgpIHtcblx0XHRjb25zdCB3aWR0aENoYW5nZWQgPSB0aGlzLl93aWR0aCAhPT0gdGhpcy5fbW9uaXRvclRhcmdldC5jbGllbnRXaWR0aDtcblx0XHRjb25zdCBoZWlnaHRDaGFuZ2VkID0gdGhpcy5faGVpZ2h0ICE9PSB0aGlzLl9tb25pdG9yVGFyZ2V0LmNsaWVudEhlaWdodDtcblx0XHRpZiAod2lkdGhDaGFuZ2VkKSB7XG5cdFx0XHR0aGlzLl93aWR0aCA9IHRoaXMuX21vbml0b3JUYXJnZXQuY2xpZW50V2lkdGg7XG5cblx0XHRcdGNvbnN0IGJrcyA9IE9iamVjdC5rZXlzKHRoaXMuX3NpemluZ1NwZWMpLnNvcnQoKGEsIGIpID0+IHRoaXMuX3RvTnVtYmVyKGEpIC0gdGhpcy5fdG9OdW1iZXIoYikpO1xuXHRcdFx0bGV0IGZvdW5kID0gZmFsc2U7XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBvZiBia3MpIHtcblx0XHRcdFx0Y29uc3QgY2xhc3Nlc09yU3R5bGVzID0gdGhpcy5fc2l6aW5nU3BlY1trZXldLnNwbGl0KC87Ky8pLmZpbHRlcihjID0+IGMpO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVDbGFzc2VzT3JTdHlsZXMoY2xhc3Nlc09yU3R5bGVzKTtcblx0XHRcdFx0Y29uc3QgZXhwZWN0ZWRXaWR0aCA9IHRoaXMuX3RvTnVtYmVyKGtleSk7XG5cdFx0XHRcdGlmICh0aGlzLl93aWR0aCA8PSBleHBlY3RlZFdpZHRoICYmICFmb3VuZCkge1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5Q2xhc3Nlc09yU3R5bGVzKGNsYXNzZXNPclN0eWxlcyk7XG5cdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHdpZHRoQ2hhbmdlZCB8fCBoZWlnaHRDaGFuZ2VkKSB7XG5cdFx0XHR0aGlzLl9oZWlnaHQgPSB0aGlzLl9tb25pdG9yVGFyZ2V0LmNsaWVudEhlaWdodDtcblx0XHRcdGlmICh0aGlzLmJ1aUZpeGVkSGVpZ2h0KSB7XG5cdFx0XHRcdHRoaXMuX3JlZmxvd0ZyYW1lQ291bnQgPSAwO1xuXHRcdFx0XHR0aGlzLl9yZWZsb3dIZWlnaHQoKTtcblx0XHRcdH1cblx0XHRcdHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fem9uZS5ydW4oKCkgPT4gdGhpcy5idWlSZXNpemVkLmVtaXQoeyB3aWR0aDogdGhpcy5fd2lkdGgsIGhlaWdodDogdGhpcy5faGVpZ2h0IH0pKSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBfYXBwbHlDbGFzc2VzT3JTdHlsZXMoY2xzT3JTdHlsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Y2xzT3JTdHlsZXMuZm9yRWFjaChzID0+IHtcblx0XHRcdGlmIChzLmluY2x1ZGVzKCc6JykpIHtcblx0XHRcdFx0Y29uc3QgW3Byb3AsIHZhbF0gPSBzLnNwbGl0KCc6Jyk7XG5cdFx0XHRcdHRoaXMuX2VsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkocHJvcC50cmltKCksIHZhbC50cmltKCkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgY2xhc3NlcyA9IHMuc3BsaXQoL1xccysvKS5maWx0ZXIoYyA9PiBjKTtcblx0XHRcdFx0aWYgKGNsYXNzZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF9yZW1vdmVDbGFzc2VzT3JTdHlsZXMoY2xzT3JTdHlsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Y2xzT3JTdHlsZXMuZm9yRWFjaChzID0+IHtcblx0XHRcdGlmIChzLmluY2x1ZGVzKCc6JykpIHtcblx0XHRcdFx0Y29uc3QgW3Byb3BdID0gcy5zcGxpdCgnOicpO1xuXHRcdFx0XHR0aGlzLl9lbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3ApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgY2xhc3NlcyA9IHMuc3BsaXQoL1xccysvKS5maWx0ZXIoYyA9PiBjKTtcblx0XHRcdFx0aWYgKGNsYXNzZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLmNsYXNzZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF9yZWZsb3dIZWlnaHQoKSB7XG5cdFx0Y29uc3QgY250ID0gdGhpcy5fcmVmbG93RnJhbWVDb3VudDtcblx0XHRpZiAoY250IDwgMTUpIHtcblx0XHRcdGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2ZyYW1lSGFuZGxlcklkKTtcblx0XHRcdHRoaXMuX2ZyYW1lSGFuZGxlcklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZmxvd0hlaWdodC5iaW5kKHRoaXMpKTtcblxuXHRcdFx0aWYgKGNudCA9PT0gMCkge1xuXHRcdFx0XHR0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJztcblx0XHRcdH0gZWxzZSBpZiAoY250ID09PSAxNCkge1xuXHRcdFx0XHRjb25zdCBndCA9IHBhcnNlSW50KFxuXHRcdFx0XHRcdGdldENvbXB1dGVkU3R5bGUodGhpcy5fbW9uaXRvclRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKS5yZXBsYWNlKC9weCQvLCAnJykgfHwgJzAnLFxuXHRcdFx0XHRcdDEwXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IGdiID0gcGFyc2VJbnQoXG5cdFx0XHRcdFx0Z2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9tb25pdG9yVGFyZ2V0KS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLWJvdHRvbScpLnJlcGxhY2UoL3B4JC8sICcnKSB8fCAnMCcsXG5cdFx0XHRcdFx0MTBcblx0XHRcdFx0KTtcblx0XHRcdFx0dGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLl9oZWlnaHQgLSBndCAtIGdiIC0gNX1weGA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuX3JlZmxvd0ZyYW1lQ291bnQrKztcblx0fVxuXG5cdHByaXZhdGUgX3RvTnVtYmVyKHM6IHN0cmluZykge1xuXHRcdHJldHVybiAocyA9PT0gJ34nID8gSW5maW5pdHkgOiBOdW1iZXIocykpIHx8IC1JbmZpbml0eTtcblx0fVxufVxuIl19