@porscheinformatik/material-addons 0.0.34 → 0.0.99

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 (227) hide show
  1. package/README.md +29 -29
  2. package/esm2022/lib/button/button.mjs +7 -0
  3. package/esm2022/lib/button/button.module.mjs +26 -0
  4. package/esm2022/lib/button/danger-button/danger-button.component.mjs +28 -0
  5. package/esm2022/lib/button/flat-button/link-button.component.mjs +28 -0
  6. package/esm2022/lib/button/icon-button/icon-button.component.mjs +28 -0
  7. package/esm2022/lib/button/mad-basic-button.mjs +39 -0
  8. package/esm2022/lib/button/outline-button/outline-button.component.mjs +28 -0
  9. package/esm2022/lib/button/primary-button/primary-button.component.mjs +28 -0
  10. package/esm2022/lib/card/card.component.mjs +129 -0
  11. package/esm2022/lib/card/card.mjs +2 -0
  12. package/esm2022/lib/card/card.module.mjs +23 -0
  13. package/esm2022/lib/content-panel/content-header/content-header.component.mjs +11 -0
  14. package/esm2022/lib/content-panel/content-panel-container/content-panel-container.component.mjs +11 -0
  15. package/esm2022/lib/content-panel/content-panel-container-content/content-panel-container-content.component.mjs +11 -0
  16. package/esm2022/lib/content-panel/content-panel-container-footer/content-panel-container-footer.component.mjs +11 -0
  17. package/esm2022/lib/content-panel/content-panel.module.mjs +42 -0
  18. package/esm2022/lib/content-panel/main-container/main-container.component.mjs +11 -0
  19. package/esm2022/lib/data-table/data-table-action-type.mjs +6 -0
  20. package/esm2022/lib/data-table/data-table-action.mjs +2 -0
  21. package/esm2022/lib/data-table/data-table-column-definition.mjs +2 -0
  22. package/esm2022/lib/data-table/data-table-column.mjs +2 -0
  23. package/esm2022/lib/data-table/data-table-columns-modal/data-table-columns-modal.component.mjs +103 -0
  24. package/esm2022/lib/data-table/data-table-row.mjs +2 -0
  25. package/esm2022/lib/data-table/data-table.component.mjs +529 -0
  26. package/esm2022/lib/data-table/data-table.mjs +3 -0
  27. package/esm2022/lib/data-table/data-table.module.mjs +81 -0
  28. package/esm2022/lib/file-upload/drag-and-drop-directive.directive.mjs +61 -0
  29. package/esm2022/lib/file-upload/file-upload.component.mjs +78 -0
  30. package/esm2022/lib/flowbar/flowbar.component.mjs +190 -0
  31. package/esm2022/lib/flowbar/flowbar.module.mjs +19 -0
  32. package/esm2022/lib/material-action-button/material-action-button.component.mjs +34 -0
  33. package/esm2022/lib/material-action-button/material-action-button.module.mjs +22 -0
  34. package/esm2022/lib/material-addons.module.mjs +45 -0
  35. package/esm2022/lib/numeric-field/number-format.service.mjs +139 -0
  36. package/esm2022/lib/numeric-field/numeric-field.directive.mjs +295 -0
  37. package/esm2022/lib/numeric-field/numeric-field.mjs +2 -0
  38. package/esm2022/lib/numeric-field/numeric-field.module.mjs +24 -0
  39. package/esm2022/lib/quick-list/base-quick-list.component.mjs +124 -0
  40. package/esm2022/lib/quick-list/quick-list-compact/quick-list-compact.component.mjs +22 -0
  41. package/esm2022/lib/quick-list/quick-list.component.mjs +23 -0
  42. package/esm2022/lib/quick-list/quick-list.mjs +6 -0
  43. package/esm2022/lib/quick-list/quick-list.module.mjs +46 -0
  44. package/esm2022/lib/quick-list/reactive-form-quick-list/reactive-form-quick-list.component.mjs +22 -0
  45. package/esm2022/lib/quick-list/reactive-form-quick-list-compact/reactive-form-quick-list-compact.component.mjs +22 -0
  46. package/esm2022/lib/readonly/readonly-form-field/readonly-form-field.component.mjs +181 -0
  47. package/esm2022/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.mjs +206 -0
  48. package/esm2022/lib/readonly/readonly-form-field.module.mjs +25 -0
  49. package/esm2022/lib/stepper/mad-stepper-animation.mjs +13 -0
  50. package/esm2022/lib/stepper/step-header/step-header.component.mjs +77 -0
  51. package/esm2022/lib/stepper/stepper.component.mjs +159 -0
  52. package/esm2022/lib/stepper/stepper.module.mjs +23 -0
  53. package/esm2022/lib/table/column-header.mjs +2 -0
  54. package/esm2022/lib/table/table-action.mjs +2 -0
  55. package/esm2022/lib/table/table.component.mjs +130 -0
  56. package/esm2022/lib/table/table.mjs +2 -0
  57. package/esm2022/lib/table/table.module.mjs +56 -0
  58. package/esm2022/lib/throttle-click/throttle-click.directive.mjs +38 -0
  59. package/esm2022/lib/throttle-click/throttle-click.module.mjs +18 -0
  60. package/esm2022/lib/toolbar/toolbar-action.interface.mjs +2 -0
  61. package/esm2022/lib/toolbar/toolbar.component.mjs +78 -0
  62. package/esm2022/lib/toolbar/toolbar.module.mjs +56 -0
  63. package/esm2022/lib/toolbar/toolbar.service.mjs +124 -0
  64. package/esm2022/porscheinformatik-material-addons.mjs +5 -0
  65. package/esm2022/public_api.mjs +42 -0
  66. package/fesm2022/porscheinformatik-material-addons.mjs +3229 -0
  67. package/fesm2022/porscheinformatik-material-addons.mjs.map +1 -0
  68. package/index.d.ts +6 -0
  69. package/lib/button/button.d.ts +7 -0
  70. package/lib/button/button.d.ts.map +1 -0
  71. package/lib/button/button.module.d.ts +17 -0
  72. package/lib/button/button.module.d.ts.map +1 -0
  73. package/lib/button/danger-button/danger-button.component.d.ts +13 -0
  74. package/lib/button/danger-button/danger-button.component.d.ts.map +1 -0
  75. package/lib/button/flat-button/link-button.component.d.ts +13 -0
  76. package/lib/button/flat-button/link-button.component.d.ts.map +1 -0
  77. package/lib/button/icon-button/icon-button.component.d.ts +13 -0
  78. package/lib/button/icon-button/icon-button.component.d.ts.map +1 -0
  79. package/lib/button/mad-basic-button.d.ts +14 -0
  80. package/lib/button/mad-basic-button.d.ts.map +1 -0
  81. package/lib/button/outline-button/outline-button.component.d.ts +13 -0
  82. package/lib/button/outline-button/outline-button.component.d.ts.map +1 -0
  83. package/lib/button/primary-button/primary-button.component.d.ts +13 -0
  84. package/lib/button/primary-button/primary-button.component.d.ts.map +1 -0
  85. package/lib/card/card.component.d.ts +28 -0
  86. package/lib/card/card.component.d.ts.map +1 -0
  87. package/lib/card/card.d.ts +2 -0
  88. package/lib/card/card.d.ts.map +1 -0
  89. package/lib/card/card.module.d.ts +14 -0
  90. package/lib/card/card.module.d.ts.map +1 -0
  91. package/lib/content-panel/content-header/content-header.component.d.ts +6 -0
  92. package/lib/content-panel/content-header/content-header.component.d.ts.map +1 -0
  93. package/lib/content-panel/content-panel-container/content-panel-container.component.d.ts +6 -0
  94. package/lib/content-panel/content-panel-container/content-panel-container.component.d.ts.map +1 -0
  95. package/lib/content-panel/content-panel-container-content/content-panel-container-content.component.d.ts +6 -0
  96. package/lib/content-panel/content-panel-container-content/content-panel-container-content.component.d.ts.map +1 -0
  97. package/lib/content-panel/content-panel-container-footer/content-panel-container-footer.component.d.ts +6 -0
  98. package/lib/content-panel/content-panel-container-footer/content-panel-container-footer.component.d.ts.map +1 -0
  99. package/lib/content-panel/content-panel.module.d.ts +13 -0
  100. package/lib/content-panel/content-panel.module.d.ts.map +1 -0
  101. package/lib/content-panel/main-container/main-container.component.d.ts +6 -0
  102. package/lib/content-panel/main-container/main-container.component.d.ts.map +1 -0
  103. package/lib/data-table/data-table-action-type.d.ts +6 -0
  104. package/lib/data-table/data-table-action-type.d.ts.map +1 -0
  105. package/lib/data-table/data-table-action.d.ts +8 -0
  106. package/lib/data-table/data-table-action.d.ts.map +1 -0
  107. package/lib/data-table/data-table-column-definition.d.ts +28 -0
  108. package/lib/data-table/data-table-column-definition.d.ts.map +1 -0
  109. package/lib/data-table/data-table-column.d.ts +11 -0
  110. package/lib/data-table/data-table-column.d.ts.map +1 -0
  111. package/lib/data-table/data-table-columns-modal/data-table-columns-modal.component.d.ts +27 -0
  112. package/lib/data-table/data-table-columns-modal/data-table-columns-modal.component.d.ts.map +1 -0
  113. package/lib/data-table/data-table-row.d.ts +7 -0
  114. package/lib/data-table/data-table-row.d.ts.map +1 -0
  115. package/lib/data-table/data-table.component.d.ts +123 -0
  116. package/lib/data-table/data-table.component.d.ts.map +1 -0
  117. package/lib/data-table/data-table.d.ts +6 -0
  118. package/lib/data-table/data-table.d.ts.map +1 -0
  119. package/lib/data-table/data-table.module.d.ts +25 -0
  120. package/lib/data-table/data-table.module.d.ts.map +1 -0
  121. package/lib/file-upload/drag-and-drop-directive.directive.d.ts +13 -0
  122. package/lib/file-upload/drag-and-drop-directive.directive.d.ts.map +1 -0
  123. package/lib/file-upload/file-upload.component.d.ts +22 -0
  124. package/lib/file-upload/file-upload.component.d.ts.map +1 -0
  125. package/lib/flowbar/flowbar.component.d.ts +47 -0
  126. package/lib/flowbar/flowbar.component.d.ts.map +1 -0
  127. package/lib/flowbar/flowbar.module.d.ts +10 -0
  128. package/lib/flowbar/flowbar.module.d.ts.map +1 -0
  129. package/lib/material-action-button/material-action-button.component.d.ts +12 -8
  130. package/lib/material-action-button/material-action-button.component.d.ts.map +1 -0
  131. package/lib/material-action-button/material-action-button.module.d.ts +13 -2
  132. package/lib/material-action-button/material-action-button.module.d.ts.map +1 -0
  133. package/lib/material-addons.module.d.ts +15 -2
  134. package/lib/material-addons.module.d.ts.map +1 -0
  135. package/lib/numeric-field/number-format.service.d.ts +31 -0
  136. package/lib/numeric-field/number-format.service.d.ts.map +1 -0
  137. package/lib/numeric-field/numeric-field.d.ts +2 -0
  138. package/lib/numeric-field/numeric-field.d.ts.map +1 -0
  139. package/lib/numeric-field/numeric-field.directive.d.ts +45 -0
  140. package/lib/numeric-field/numeric-field.directive.d.ts.map +1 -0
  141. package/lib/numeric-field/numeric-field.module.d.ts +10 -0
  142. package/lib/numeric-field/numeric-field.module.d.ts.map +1 -0
  143. package/lib/quick-list/base-quick-list.component.d.ts +41 -0
  144. package/lib/quick-list/base-quick-list.component.d.ts.map +1 -0
  145. package/lib/quick-list/quick-list-compact/quick-list-compact.component.d.ts +12 -0
  146. package/lib/quick-list/quick-list-compact/quick-list-compact.component.d.ts.map +1 -0
  147. package/lib/quick-list/quick-list.component.d.ts +12 -0
  148. package/lib/quick-list/quick-list.component.d.ts.map +1 -0
  149. package/lib/quick-list/quick-list.d.ts +6 -0
  150. package/lib/quick-list/quick-list.d.ts.map +1 -0
  151. package/lib/quick-list/quick-list.module.d.ts +17 -0
  152. package/lib/quick-list/quick-list.module.d.ts.map +1 -0
  153. package/lib/quick-list/reactive-form-quick-list/reactive-form-quick-list.component.d.ts +12 -0
  154. package/lib/quick-list/reactive-form-quick-list/reactive-form-quick-list.component.d.ts.map +1 -0
  155. package/lib/quick-list/reactive-form-quick-list-compact/reactive-form-quick-list-compact.component.d.ts +12 -0
  156. package/lib/quick-list/reactive-form-quick-list-compact/reactive-form-quick-list-compact.component.d.ts.map +1 -0
  157. package/lib/readonly/readonly-form-field/readonly-form-field.component.d.ts +56 -14
  158. package/lib/readonly/readonly-form-field/readonly-form-field.component.d.ts.map +1 -0
  159. package/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.d.ts +89 -31
  160. package/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.d.ts.map +1 -0
  161. package/lib/readonly/readonly-form-field.module.d.ts +16 -2
  162. package/lib/readonly/readonly-form-field.module.d.ts.map +1 -0
  163. package/lib/stepper/mad-stepper-animation.d.ts +8 -0
  164. package/lib/stepper/mad-stepper-animation.d.ts.map +1 -0
  165. package/lib/stepper/step-header/step-header.component.d.ts +27 -0
  166. package/lib/stepper/step-header/step-header.component.d.ts.map +1 -0
  167. package/lib/stepper/stepper.component.d.ts +53 -0
  168. package/lib/stepper/stepper.component.d.ts.map +1 -0
  169. package/lib/stepper/stepper.module.d.ts +14 -0
  170. package/lib/stepper/stepper.module.d.ts.map +1 -0
  171. package/lib/table/column-header.d.ts +8 -0
  172. package/lib/table/column-header.d.ts.map +1 -0
  173. package/lib/table/table-action.d.ts +6 -0
  174. package/lib/table/table-action.d.ts.map +1 -0
  175. package/lib/table/table.component.d.ts +43 -0
  176. package/lib/table/table.component.d.ts.map +1 -0
  177. package/lib/table/table.d.ts +4 -0
  178. package/lib/table/table.d.ts.map +1 -0
  179. package/lib/table/table.module.d.ts +18 -0
  180. package/lib/table/table.module.d.ts.map +1 -0
  181. package/lib/throttle-click/throttle-click.directive.d.ts +14 -0
  182. package/lib/throttle-click/throttle-click.directive.d.ts.map +1 -0
  183. package/lib/throttle-click/throttle-click.module.d.ts +9 -0
  184. package/lib/throttle-click/throttle-click.module.d.ts.map +1 -0
  185. package/lib/toolbar/toolbar-action.interface.d.ts +28 -18
  186. package/lib/toolbar/toolbar-action.interface.d.ts.map +1 -0
  187. package/lib/toolbar/toolbar.component.d.ts +28 -19
  188. package/lib/toolbar/toolbar.component.d.ts.map +1 -0
  189. package/lib/toolbar/toolbar.module.d.ts +18 -2
  190. package/lib/toolbar/toolbar.module.d.ts.map +1 -0
  191. package/lib/toolbar/toolbar.service.d.ts +44 -33
  192. package/lib/toolbar/toolbar.service.d.ts.map +1 -0
  193. package/package.json +29 -24
  194. package/porscheinformatik-material-addons.d.ts.map +1 -0
  195. package/public_api.d.ts +39 -0
  196. package/public_api.d.ts.map +1 -0
  197. package/themes/common/styles.scss +359 -303
  198. package/themes/pbv.scss +64 -56
  199. package/themes/poa.scss +64 -40
  200. package/bundles/porscheinformatik-material-addons.umd.js +0 -755
  201. package/esm2015/lib/material-action-button/material-action-button.component.js +0 -43
  202. package/esm2015/lib/material-action-button/material-action-button.module.js +0 -19
  203. package/esm2015/lib/material-addons.module.js +0 -16
  204. package/esm2015/lib/readonly/readonly-form-field/readonly-form-field.component.js +0 -61
  205. package/esm2015/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.js +0 -124
  206. package/esm2015/lib/readonly/readonly-form-field.module.js +0 -20
  207. package/esm2015/lib/toolbar/toolbar-action.interface.js +0 -47
  208. package/esm2015/lib/toolbar/toolbar.component.js +0 -112
  209. package/esm2015/lib/toolbar/toolbar.module.js +0 -29
  210. package/esm2015/lib/toolbar/toolbar.service.js +0 -197
  211. package/esm2015/porscheinformatik-material-addons.js +0 -9
  212. package/esm2015/public-api.js +0 -18
  213. package/esm5/lib/material-action-button/material-action-button.component.js +0 -45
  214. package/esm5/lib/material-action-button/material-action-button.module.js +0 -23
  215. package/esm5/lib/material-addons.module.js +0 -20
  216. package/esm5/lib/readonly/readonly-form-field/readonly-form-field.component.js +0 -67
  217. package/esm5/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.js +0 -145
  218. package/esm5/lib/readonly/readonly-form-field.module.js +0 -24
  219. package/esm5/lib/toolbar/toolbar-action.interface.js +0 -47
  220. package/esm5/lib/toolbar/toolbar.component.js +0 -131
  221. package/esm5/lib/toolbar/toolbar.module.js +0 -33
  222. package/esm5/lib/toolbar/toolbar.service.js +0 -245
  223. package/esm5/porscheinformatik-material-addons.js +0 -9
  224. package/esm5/public-api.js +0 -18
  225. package/porscheinformatik-material-addons.d.ts +0 -4
  226. package/porscheinformatik-material-addons.metadata.json +0 -1
  227. package/public-api.d.ts +0 -10
@@ -0,0 +1,45 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { ToolbarModule } from './toolbar/toolbar.module';
3
+ import { ReadOnlyFormFieldModule } from './readonly/readonly-form-field.module';
4
+ import { MaterialActionButtonModule } from './material-action-button/material-action-button.module';
5
+ import { NumericFieldModule } from './numeric-field/numeric-field.module';
6
+ import { CardModule } from './card/card.module';
7
+ import { QuickListModule } from './quick-list/quick-list.module';
8
+ import { ButtonModule } from './button/button.module';
9
+ import { ThrottleClickModule } from './throttle-click/throttle-click.module';
10
+ import * as i0 from "@angular/core";
11
+ export class MaterialAddonsModule {
12
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: MaterialAddonsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
13
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.4", ngImport: i0, type: MaterialAddonsModule, exports: [ReadOnlyFormFieldModule,
14
+ ButtonModule,
15
+ ToolbarModule,
16
+ MaterialActionButtonModule,
17
+ NumericFieldModule,
18
+ CardModule,
19
+ QuickListModule,
20
+ ThrottleClickModule] }); }
21
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: MaterialAddonsModule, imports: [ReadOnlyFormFieldModule,
22
+ ButtonModule,
23
+ ToolbarModule,
24
+ MaterialActionButtonModule,
25
+ NumericFieldModule,
26
+ CardModule,
27
+ QuickListModule,
28
+ ThrottleClickModule] }); }
29
+ }
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: MaterialAddonsModule, decorators: [{
31
+ type: NgModule,
32
+ args: [{
33
+ exports: [
34
+ ReadOnlyFormFieldModule,
35
+ ButtonModule,
36
+ ToolbarModule,
37
+ MaterialActionButtonModule,
38
+ NumericFieldModule,
39
+ CardModule,
40
+ QuickListModule,
41
+ ThrottleClickModule,
42
+ ],
43
+ }]
44
+ }] });
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwtYWRkb25zLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsLWFkZG9ucy9zcmMvbGliL21hdGVyaWFsLWFkZG9ucy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDcEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7O0FBYzdFLE1BQU0sT0FBTyxvQkFBb0I7OEdBQXBCLG9CQUFvQjsrR0FBcEIsb0JBQW9CLFlBVjdCLHVCQUF1QjtZQUN2QixZQUFZO1lBQ1osYUFBYTtZQUNiLDBCQUEwQjtZQUMxQixrQkFBa0I7WUFDbEIsVUFBVTtZQUNWLGVBQWU7WUFDZixtQkFBbUI7K0dBR1Ysb0JBQW9CLFlBVjdCLHVCQUF1QjtZQUN2QixZQUFZO1lBQ1osYUFBYTtZQUNiLDBCQUEwQjtZQUMxQixrQkFBa0I7WUFDbEIsVUFBVTtZQUNWLGVBQWU7WUFDZixtQkFBbUI7OzJGQUdWLG9CQUFvQjtrQkFaaEMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1AsdUJBQXVCO3dCQUN2QixZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsMEJBQTBCO3dCQUMxQixrQkFBa0I7d0JBQ2xCLFVBQVU7d0JBQ1YsZUFBZTt3QkFDZixtQkFBbUI7cUJBQ3BCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvb2xiYXJNb2R1bGUgfSBmcm9tICcuL3Rvb2xiYXIvdG9vbGJhci5tb2R1bGUnO1xuaW1wb3J0IHsgUmVhZE9ubHlGb3JtRmllbGRNb2R1bGUgfSBmcm9tICcuL3JlYWRvbmx5L3JlYWRvbmx5LWZvcm0tZmllbGQubW9kdWxlJztcbmltcG9ydCB7IE1hdGVyaWFsQWN0aW9uQnV0dG9uTW9kdWxlIH0gZnJvbSAnLi9tYXRlcmlhbC1hY3Rpb24tYnV0dG9uL21hdGVyaWFsLWFjdGlvbi1idXR0b24ubW9kdWxlJztcbmltcG9ydCB7IE51bWVyaWNGaWVsZE1vZHVsZSB9IGZyb20gJy4vbnVtZXJpYy1maWVsZC9udW1lcmljLWZpZWxkLm1vZHVsZSc7XG5pbXBvcnQgeyBDYXJkTW9kdWxlIH0gZnJvbSAnLi9jYXJkL2NhcmQubW9kdWxlJztcbmltcG9ydCB7IFF1aWNrTGlzdE1vZHVsZSB9IGZyb20gJy4vcXVpY2stbGlzdC9xdWljay1saXN0Lm1vZHVsZSc7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICcuL2J1dHRvbi9idXR0b24ubW9kdWxlJztcbmltcG9ydCB7IFRocm90dGxlQ2xpY2tNb2R1bGUgfSBmcm9tICcuL3Rocm90dGxlLWNsaWNrL3Rocm90dGxlLWNsaWNrLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGV4cG9ydHM6IFtcbiAgICBSZWFkT25seUZvcm1GaWVsZE1vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgVG9vbGJhck1vZHVsZSxcbiAgICBNYXRlcmlhbEFjdGlvbkJ1dHRvbk1vZHVsZSxcbiAgICBOdW1lcmljRmllbGRNb2R1bGUsXG4gICAgQ2FyZE1vZHVsZSxcbiAgICBRdWlja0xpc3RNb2R1bGUsXG4gICAgVGhyb3R0bGVDbGlja01vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTWF0ZXJpYWxBZGRvbnNNb2R1bGUge31cbiJdfQ==
@@ -0,0 +1,139 @@
1
+ import { Inject, LOCALE_ID, Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class NumberFormatService {
4
+ static { this.NEGATIVE = '-'; }
5
+ static { this.NUMBERS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; }
6
+ static { this.DEFAULT_FINAL_FORMATTING = true; }
7
+ static { this.DEFAULT_DECIMAL_PLACES = 2; }
8
+ static { this.DEFAULT_AUTOFILL_DECIMALS = false; }
9
+ static { this.DEFAULT_REMOVE_LEADING_ZEROS = false; }
10
+ constructor(locale) {
11
+ this.allowedKeys = [];
12
+ // try to get the current formatting
13
+ const localeDecimalSeparator = (1.1).toLocaleString(locale).charAt(1);
14
+ this.decimalSeparator = localeDecimalSeparator === ',' ? ',' : '.';
15
+ this.groupingSeparator = localeDecimalSeparator === ',' ? '.' : ',';
16
+ this.allowedKeys = [...NumberFormatService.NUMBERS, NumberFormatService.NEGATIVE, this.decimalSeparator];
17
+ }
18
+ static valueIsSet(value) {
19
+ return typeof value !== 'undefined' && value !== null && (typeof value !== 'string' || value.length !== 0);
20
+ }
21
+ format(value, options) {
22
+ return NumberFormatService.valueIsSet(value)
23
+ ? this.formatNumber(value.toString().replace(new RegExp('[.]', 'g'), this.decimalSeparator), options)
24
+ : '';
25
+ }
26
+ formatNumber(value, options) {
27
+ const autofillDecimals = this.valueOrDefault(options?.autofillDecimals, NumberFormatService.DEFAULT_AUTOFILL_DECIMALS);
28
+ const decimalPlaces = this.valueOrDefault(options?.decimalPlaces, NumberFormatService.DEFAULT_DECIMAL_PLACES);
29
+ const finalFormatting = this.valueOrDefault(options?.finalFormatting, NumberFormatService.DEFAULT_FINAL_FORMATTING);
30
+ let result = this.strip(value, { decimalPlaces, removeLeadingZeros: finalFormatting });
31
+ /* add grouping separator */
32
+ const decimalIndex = result.indexOf(this.decimalSeparator);
33
+ const isNegative = result.startsWith(NumberFormatService.NEGATIVE);
34
+ let i = decimalIndex > -1 ? decimalIndex : result.length;
35
+ while (i > (isNegative ? 4 : 3)) {
36
+ i -= 3;
37
+ result = result.substring(0, i) + this.groupingSeparator + result.substring(i, result.length);
38
+ }
39
+ if (finalFormatting) {
40
+ if (decimalPlaces > 0 && !!result) {
41
+ /* autofill decimal places */
42
+ let actualDecimalIndex = result.indexOf(this.decimalSeparator);
43
+ if (autofillDecimals) {
44
+ if (actualDecimalIndex === -1) {
45
+ actualDecimalIndex = result.length;
46
+ result += this.decimalSeparator;
47
+ }
48
+ result = this.addMissingLeadingZero(result, actualDecimalIndex);
49
+ actualDecimalIndex = result.indexOf(this.decimalSeparator);
50
+ const actualDecimalPlaces = result.length - actualDecimalIndex - 1;
51
+ for (let j = 0; j < decimalPlaces - actualDecimalPlaces; j++) {
52
+ result += '0';
53
+ }
54
+ }
55
+ else {
56
+ result = this.addMissingLeadingZero(result, actualDecimalIndex);
57
+ }
58
+ }
59
+ }
60
+ return result;
61
+ }
62
+ strip(value, options) {
63
+ const decimalPlaces = this.valueOrDefault(options?.decimalPlaces, NumberFormatService.DEFAULT_DECIMAL_PLACES);
64
+ const removeLeadingZeros = this.valueOrDefault(options?.removeLeadingZeros, NumberFormatService.DEFAULT_REMOVE_LEADING_ZEROS);
65
+ let result = '';
66
+ let indexDecimalSep = -1;
67
+ let j = -1;
68
+ let ignoredChars = 0;
69
+ for (const char of value) {
70
+ j++;
71
+ if (this.allowedKeys.includes(char)) {
72
+ if (char === this.decimalSeparator) {
73
+ if (decimalPlaces === 0) {
74
+ /* dismiss content after a decimal separator, when no places allowed */
75
+ break;
76
+ }
77
+ else if (indexDecimalSep > -1) {
78
+ /* ignore subsequent decimal separators */
79
+ continue;
80
+ }
81
+ indexDecimalSep = j;
82
+ }
83
+ if (char === '0' && removeLeadingZeros) {
84
+ /* remove leading zero only if it's not the only zero in the 'value' string */
85
+ if ((result.length === 0 && j + 1 !== value.length) || result === NumberFormatService.NEGATIVE) {
86
+ ignoredChars++;
87
+ continue;
88
+ }
89
+ }
90
+ if (char === NumberFormatService.NEGATIVE && j > 0) {
91
+ /* dismiss content after a negative sign not on first position */
92
+ break;
93
+ }
94
+ if (indexDecimalSep > -1 && result.length + ignoredChars > indexDecimalSep + decimalPlaces) {
95
+ /* dismiss content after maximum decimal places reached */
96
+ break;
97
+ }
98
+ result += char;
99
+ }
100
+ else if (char === this.groupingSeparator) {
101
+ if (indexDecimalSep === -1) {
102
+ ignoredChars++;
103
+ }
104
+ }
105
+ else {
106
+ /* dismiss content after a invalid character */
107
+ break;
108
+ }
109
+ }
110
+ return result;
111
+ }
112
+ addMissingLeadingZero(result, actualDecimalIndex) {
113
+ const isNegative = result.startsWith(NumberFormatService.NEGATIVE);
114
+ /* autoadd a zero before decimal separator, when it's missing */
115
+ if (actualDecimalIndex === 0) {
116
+ result = '0' + result;
117
+ }
118
+ /* autoadd a zero before decimal separator, when it's missing, for negative values */
119
+ if (actualDecimalIndex === 1 && isNegative) {
120
+ result = result[0] + '0' + result.substring(1, result.length);
121
+ }
122
+ return result;
123
+ }
124
+ valueOrDefault(value, defaultValue) {
125
+ return NumberFormatService.valueIsSet(value) ? value : defaultValue;
126
+ }
127
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NumberFormatService, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
128
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NumberFormatService, providedIn: 'any' }); }
129
+ }
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NumberFormatService, decorators: [{
131
+ type: Injectable,
132
+ args: [{
133
+ providedIn: 'any',
134
+ }]
135
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
136
+ type: Inject,
137
+ args: [LOCALE_ID]
138
+ }] }] });
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLWZvcm1hdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwtYWRkb25zL3NyYy9saWIvbnVtZXJpYy1maWVsZC9udW1iZXItZm9ybWF0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQW1COUQsTUFBTSxPQUFPLG1CQUFtQjthQUNkLGFBQVEsR0FBRyxHQUFHLEFBQU4sQ0FBTzthQUNmLFlBQU8sR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxBQUFyRCxDQUFzRDthQUM3RCw2QkFBd0IsR0FBRyxJQUFJLEFBQVAsQ0FBUTthQUNoQywyQkFBc0IsR0FBRyxDQUFDLEFBQUosQ0FBSzthQUMzQiw4QkFBeUIsR0FBRyxLQUFLLEFBQVIsQ0FBUzthQUNsQyxpQ0FBNEIsR0FBRyxLQUFLLEFBQVIsQ0FBUztJQU9yRCxZQUErQixNQUFjO1FBRjdDLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBR3pCLG9DQUFvQztRQUNwQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsc0JBQXNCLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNuRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsc0JBQXNCLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUVw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QUM7UUFDbkUsZ0VBQWdFO1FBQ2hFLElBQUksa0JBQWtCLEtBQUssQ0FBQyxFQUFFO1lBQzVCLE1BQU0sR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO1NBQ3ZCO1FBQ0QscUZBQXFGO1FBQ3JGLElBQUksa0JBQWtCLEtBQUssQ0FBQyxJQUFJLFVBQVUsRUFBRTtZQUMxQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDL0Q7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sY0FBYyxDQUFDLEtBQVUsRUFBRSxZQUFpQjtRQUNsRCxPQUFPLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDdEUsQ0FBQzs4R0F6SVUsbUJBQW1CLGtCQWFWLFNBQVM7a0hBYmxCLG1CQUFtQixjQUZsQixLQUFLOzsyRkFFTixtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCOzswQkFjYyxNQUFNOzJCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIExPQ0FMRV9JRCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgRm9ybWF0T3B0aW9ucyB7XG4gIGRlY2ltYWxQbGFjZXM/OiBudW1iZXI7XG5cbiAgZmluYWxGb3JtYXR0aW5nPzogYm9vbGVhbjtcblxuICBhdXRvZmlsbERlY2ltYWxzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFN0cmlwT3B0aW9ucyB7XG4gIGRlY2ltYWxQbGFjZXM/OiBudW1iZXI7XG5cbiAgcmVtb3ZlTGVhZGluZ1plcm9zPzogYm9vbGVhbjtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAnYW55Jyxcbn0pXG5leHBvcnQgY2xhc3MgTnVtYmVyRm9ybWF0U2VydmljZSB7XG4gIHN0YXRpYyByZWFkb25seSBORUdBVElWRSA9ICctJztcbiAgc3RhdGljIHJlYWRvbmx5IE5VTUJFUlMgPSBbJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknXTtcbiAgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfRklOQUxfRk9STUFUVElORyA9IHRydWU7XG4gIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0RFQ0lNQUxfUExBQ0VTID0gMjtcbiAgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfQVVUT0ZJTExfREVDSU1BTFMgPSBmYWxzZTtcbiAgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfUkVNT1ZFX0xFQURJTkdfWkVST1MgPSBmYWxzZTtcblxuICBkZWNpbWFsU2VwYXJhdG9yOiAnLCcgfCAnLic7XG4gIGdyb3VwaW5nU2VwYXJhdG9yOiAnLCcgfCAnLic7XG5cbiAgYWxsb3dlZEtleXM6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChMT0NBTEVfSUQpIGxvY2FsZTogc3RyaW5nKSB7XG4gICAgLy8gdHJ5IHRvIGdldCB0aGUgY3VycmVudCBmb3JtYXR0aW5nXG4gICAgY29uc3QgbG9jYWxlRGVjaW1hbFNlcGFyYXRvciA9ICgxLjEpLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSkuY2hhckF0KDEpO1xuICAgIHRoaXMuZGVjaW1hbFNlcGFyYXRvciA9IGxvY2FsZURlY2ltYWxTZXBhcmF0b3IgPT09ICcsJyA/ICcsJyA6ICcuJztcbiAgICB0aGlzLmdyb3VwaW5nU2VwYXJhdG9yID0gbG9jYWxlRGVjaW1hbFNlcGFyYXRvciA9PT0gJywnID8gJy4nIDogJywnO1xuXG4gICAgdGhpcy5hbGxvd2VkS2V5cyA9IFsuLi5OdW1iZXJGb3JtYXRTZXJ2aWNlLk5VTUJFUlMsIE51bWJlckZvcm1hdFNlcnZpY2UuTkVHQVRJVkUsIHRoaXMuZGVjaW1hbFNlcGFyYXRvcl07XG4gIH1cblxuICBzdGF0aWMgdmFsdWVJc1NldCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwgJiYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUubGVuZ3RoICE9PSAwKTtcbiAgfVxuXG4gIGZvcm1hdCh2YWx1ZTogbnVtYmVyLCBvcHRpb25zPzogUGFydGlhbDxGb3JtYXRPcHRpb25zPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIE51bWJlckZvcm1hdFNlcnZpY2UudmFsdWVJc1NldCh2YWx1ZSlcbiAgICAgID8gdGhpcy5mb3JtYXROdW1iZXIodmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1suXScsICdnJyksIHRoaXMuZGVjaW1hbFNlcGFyYXRvciksIG9wdGlvbnMpXG4gICAgICA6ICcnO1xuICB9XG5cbiAgZm9ybWF0TnVtYmVyKHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBQYXJ0aWFsPEZvcm1hdE9wdGlvbnM+KTogc3RyaW5nIHtcbiAgICBjb25zdCBhdXRvZmlsbERlY2ltYWxzID0gdGhpcy52YWx1ZU9yRGVmYXVsdChvcHRpb25zPy5hdXRvZmlsbERlY2ltYWxzLCBOdW1iZXJGb3JtYXRTZXJ2aWNlLkRFRkFVTFRfQVVUT0ZJTExfREVDSU1BTFMpO1xuICAgIGNvbnN0IGRlY2ltYWxQbGFjZXMgPSB0aGlzLnZhbHVlT3JEZWZhdWx0KG9wdGlvbnM/LmRlY2ltYWxQbGFjZXMsIE51bWJlckZvcm1hdFNlcnZpY2UuREVGQVVMVF9ERUNJTUFMX1BMQUNFUyk7XG4gICAgY29uc3QgZmluYWxGb3JtYXR0aW5nID0gdGhpcy52YWx1ZU9yRGVmYXVsdChvcHRpb25zPy5maW5hbEZvcm1hdHRpbmcsIE51bWJlckZvcm1hdFNlcnZpY2UuREVGQVVMVF9GSU5BTF9GT1JNQVRUSU5HKTtcblxuICAgIGxldCByZXN1bHQgPSB0aGlzLnN0cmlwKHZhbHVlLCB7IGRlY2ltYWxQbGFjZXMsIHJlbW92ZUxlYWRpbmdaZXJvczogZmluYWxGb3JtYXR0aW5nIH0pO1xuXG4gICAgLyogYWRkIGdyb3VwaW5nIHNlcGFyYXRvciAqL1xuICAgIGNvbnN0IGRlY2ltYWxJbmRleCA9IHJlc3VsdC5pbmRleE9mKHRoaXMuZGVjaW1hbFNlcGFyYXRvcik7XG4gICAgY29uc3QgaXNOZWdhdGl2ZSA9IHJlc3VsdC5zdGFydHNXaXRoKE51bWJlckZvcm1hdFNlcnZpY2UuTkVHQVRJVkUpO1xuICAgIGxldCBpID0gZGVjaW1hbEluZGV4ID4gLTEgPyBkZWNpbWFsSW5kZXggOiByZXN1bHQubGVuZ3RoO1xuICAgIHdoaWxlIChpID4gKGlzTmVnYXRpdmUgPyA0IDogMykpIHtcbiAgICAgIGkgLT0gMztcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoMCwgaSkgKyB0aGlzLmdyb3VwaW5nU2VwYXJhdG9yICsgcmVzdWx0LnN1YnN0cmluZyhpLCByZXN1bHQubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAoZmluYWxGb3JtYXR0aW5nKSB7XG4gICAgICBpZiAoZGVjaW1hbFBsYWNlcyA+IDAgJiYgISFyZXN1bHQpIHtcbiAgICAgICAgLyogYXV0b2ZpbGwgZGVjaW1hbCBwbGFjZXMgKi9cbiAgICAgICAgbGV0IGFjdHVhbERlY2ltYWxJbmRleCA9IHJlc3VsdC5pbmRleE9mKHRoaXMuZGVjaW1hbFNlcGFyYXRvcik7XG4gICAgICAgIGlmIChhdXRvZmlsbERlY2ltYWxzKSB7XG4gICAgICAgICAgaWYgKGFjdHVhbERlY2ltYWxJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGFjdHVhbERlY2ltYWxJbmRleCA9IHJlc3VsdC5sZW5ndGg7XG4gICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5kZWNpbWFsU2VwYXJhdG9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYWRkTWlzc2luZ0xlYWRpbmdaZXJvKHJlc3VsdCwgYWN0dWFsRGVjaW1hbEluZGV4KTtcbiAgICAgICAgICBhY3R1YWxEZWNpbWFsSW5kZXggPSByZXN1bHQuaW5kZXhPZih0aGlzLmRlY2ltYWxTZXBhcmF0b3IpO1xuXG4gICAgICAgICAgY29uc3QgYWN0dWFsRGVjaW1hbFBsYWNlcyA9IHJlc3VsdC5sZW5ndGggLSBhY3R1YWxEZWNpbWFsSW5kZXggLSAxO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGVjaW1hbFBsYWNlcyAtIGFjdHVhbERlY2ltYWxQbGFjZXM7IGorKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICcwJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5hZGRNaXNzaW5nTGVhZGluZ1plcm8ocmVzdWx0LCBhY3R1YWxEZWNpbWFsSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdHJpcCh2YWx1ZTogc3RyaW5nLCBvcHRpb25zPzogU3RyaXBPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZWNpbWFsUGxhY2VzID0gdGhpcy52YWx1ZU9yRGVmYXVsdChvcHRpb25zPy5kZWNpbWFsUGxhY2VzLCBOdW1iZXJGb3JtYXRTZXJ2aWNlLkRFRkFVTFRfREVDSU1BTF9QTEFDRVMpO1xuICAgIGNvbnN0IHJlbW92ZUxlYWRpbmdaZXJvcyA9IHRoaXMudmFsdWVPckRlZmF1bHQob3B0aW9ucz8ucmVtb3ZlTGVhZGluZ1plcm9zLCBOdW1iZXJGb3JtYXRTZXJ2aWNlLkRFRkFVTFRfUkVNT1ZFX0xFQURJTkdfWkVST1MpO1xuXG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIGxldCBpbmRleERlY2ltYWxTZXAgPSAtMTtcbiAgICBsZXQgaiA9IC0xO1xuICAgIGxldCBpZ25vcmVkQ2hhcnMgPSAwO1xuICAgIGZvciAoY29uc3QgY2hhciBvZiB2YWx1ZSkge1xuICAgICAgaisrO1xuICAgICAgaWYgKHRoaXMuYWxsb3dlZEtleXMuaW5jbHVkZXMoY2hhcikpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IHRoaXMuZGVjaW1hbFNlcGFyYXRvcikge1xuICAgICAgICAgIGlmIChkZWNpbWFsUGxhY2VzID09PSAwKSB7XG4gICAgICAgICAgICAvKiBkaXNtaXNzIGNvbnRlbnQgYWZ0ZXIgYSBkZWNpbWFsIHNlcGFyYXRvciwgd2hlbiBubyBwbGFjZXMgYWxsb3dlZCAqL1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbmRleERlY2ltYWxTZXAgPiAtMSkge1xuICAgICAgICAgICAgLyogaWdub3JlIHN1YnNlcXVlbnQgZGVjaW1hbCBzZXBhcmF0b3JzICovXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5kZXhEZWNpbWFsU2VwID0gajtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhciA9PT0gJzAnICYmIHJlbW92ZUxlYWRpbmdaZXJvcykge1xuICAgICAgICAgIC8qIHJlbW92ZSBsZWFkaW5nIHplcm8gb25seSBpZiBpdCdzIG5vdCB0aGUgb25seSB6ZXJvIGluIHRoZSAndmFsdWUnIHN0cmluZyAqL1xuICAgICAgICAgIGlmICgocmVzdWx0Lmxlbmd0aCA9PT0gMCAmJiBqICsgMSAhPT0gdmFsdWUubGVuZ3RoKSB8fCByZXN1bHQgPT09IE51bWJlckZvcm1hdFNlcnZpY2UuTkVHQVRJVkUpIHtcbiAgICAgICAgICAgIGlnbm9yZWRDaGFycysrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSBOdW1iZXJGb3JtYXRTZXJ2aWNlLk5FR0FUSVZFICYmIGogPiAwKSB7XG4gICAgICAgICAgLyogZGlzbWlzcyBjb250ZW50IGFmdGVyIGEgbmVnYXRpdmUgc2lnbiBub3Qgb24gZmlyc3QgcG9zaXRpb24gKi9cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXhEZWNpbWFsU2VwID4gLTEgJiYgcmVzdWx0Lmxlbmd0aCArIGlnbm9yZWRDaGFycyA+IGluZGV4RGVjaW1hbFNlcCArIGRlY2ltYWxQbGFjZXMpIHtcbiAgICAgICAgICAvKiBkaXNtaXNzIGNvbnRlbnQgYWZ0ZXIgbWF4aW11bSBkZWNpbWFsIHBsYWNlcyByZWFjaGVkICovXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IHRoaXMuZ3JvdXBpbmdTZXBhcmF0b3IpIHtcbiAgICAgICAgaWYgKGluZGV4RGVjaW1hbFNlcCA9PT0gLTEpIHtcbiAgICAgICAgICBpZ25vcmVkQ2hhcnMrKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogZGlzbWlzcyBjb250ZW50IGFmdGVyIGEgaW52YWxpZCBjaGFyYWN0ZXIgKi9cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGFkZE1pc3NpbmdMZWFkaW5nWmVybyhyZXN1bHQ6IHN0cmluZywgYWN0dWFsRGVjaW1hbEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSByZXN1bHQuc3RhcnRzV2l0aChOdW1iZXJGb3JtYXRTZXJ2aWNlLk5FR0FUSVZFKTtcbiAgICAvKiBhdXRvYWRkIGEgemVybyBiZWZvcmUgZGVjaW1hbCBzZXBhcmF0b3IsIHdoZW4gaXQncyBtaXNzaW5nICovXG4gICAgaWYgKGFjdHVhbERlY2ltYWxJbmRleCA9PT0gMCkge1xuICAgICAgcmVzdWx0ID0gJzAnICsgcmVzdWx0O1xuICAgIH1cbiAgICAvKiBhdXRvYWRkIGEgemVybyBiZWZvcmUgZGVjaW1hbCBzZXBhcmF0b3IsIHdoZW4gaXQncyBtaXNzaW5nLCBmb3IgbmVnYXRpdmUgdmFsdWVzICovXG4gICAgaWYgKGFjdHVhbERlY2ltYWxJbmRleCA9PT0gMSAmJiBpc05lZ2F0aXZlKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHRbMF0gKyAnMCcgKyByZXN1bHQuc3Vic3RyaW5nKDEsIHJlc3VsdC5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSB2YWx1ZU9yRGVmYXVsdCh2YWx1ZTogYW55LCBkZWZhdWx0VmFsdWU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIE51bWJlckZvcm1hdFNlcnZpY2UudmFsdWVJc1NldCh2YWx1ZSkgPyB2YWx1ZSA6IGRlZmF1bHRWYWx1ZTtcbiAgfVxufVxuIl19
@@ -0,0 +1,295 @@
1
+ /*
2
+ * Copyright (c) 2018-2020 Porsche Informatik. All Rights Reserved.
3
+ * This software is released under MIT license.
4
+ * The full license information can be found in LICENSE in the root directory of this project.
5
+ */
6
+ import { Directive, EventEmitter, forwardRef, Input, Output, } from '@angular/core';
7
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
8
+ import { NumberFormatService } from './number-format.service';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "./number-format.service";
11
+ const BACK_KEYCODE = 8;
12
+ const SPACE_KEYCODE = 32;
13
+ const DEL_KEYCODE = 46;
14
+ const CONTROL_KEYCODES_UPPER_BORDER = 46;
15
+ const OTHER_CONTROL_KEYS = new Set([224, 91, 93]);
16
+ export class NumericFieldDirective {
17
+ set numericValue(value) {
18
+ if (this._numericValue !== value && !(isNaN(this._numericValue) && (isNaN(value) || value === null))) {
19
+ this.originalValue = value;
20
+ // Don't roundOrTruncate if value was set to empty otherwise input value will be set to 0 instead of empty
21
+ // which happens when an input is being reset
22
+ this._numericValue = value === null || value === undefined ? value : this.roundOrTruncate(value); // eslint-disable-line
23
+ this.handleInputChanged();
24
+ }
25
+ }
26
+ constructor(renderer, inputEl, numberFormatService) {
27
+ this.renderer = renderer;
28
+ this.inputEl = inputEl;
29
+ this.numberFormatService = numberFormatService;
30
+ this.textAlign = 'right';
31
+ this.decimalPlaces = 2;
32
+ this.roundValue = false;
33
+ this.autofillDecimals = false;
34
+ this.unit = null;
35
+ this.unitPosition = 'right';
36
+ this.numericValueChanged = new EventEmitter();
37
+ this.displayValue = '';
38
+ this.originalValue = NaN;
39
+ /* Control Values Accessor Stuff below */
40
+ // eslint-disable-next-line
41
+ this.onChange = () => { };
42
+ // eslint-disable-next-line
43
+ this.onTouched = () => { };
44
+ }
45
+ registerOnChange(fn) {
46
+ this.onChange = fn;
47
+ }
48
+ registerOnTouched(fn) {
49
+ this.onTouched = fn;
50
+ }
51
+ setDisabledState() {
52
+ // Dont need to implement since its just a directive
53
+ }
54
+ writeValue(value) {
55
+ this.numericValue = value;
56
+ }
57
+ ngOnInit() {
58
+ /* needs to be parsed as number explicitly as it comes as string from user input */
59
+ this.decimalPlaces = parseInt(this.decimalPlaces.toString(), 10);
60
+ this.inputChangeListener = this.renderer.listen(this.inputEl.nativeElement, 'blur', (event) => {
61
+ this.formatInput(event.target, true);
62
+ });
63
+ this.keyupListener = this.renderer.listen(this.inputEl.nativeElement, 'keyup', (event) => {
64
+ if (event.keyCode === BACK_KEYCODE || (event.keyCode >= CONTROL_KEYCODES_UPPER_BORDER && !OTHER_CONTROL_KEYS.has(event.keyCode))) {
65
+ this.formatInput(event.target, false);
66
+ }
67
+ });
68
+ this.keydownListener = this.renderer.listen(this.inputEl.nativeElement, 'keydown', (event) => {
69
+ const value = event.target.value;
70
+ if (this.numberFormatService.allowedKeys.includes(event.key) ||
71
+ (event.keyCode <= CONTROL_KEYCODES_UPPER_BORDER && event.keyCode > 0 && event.keyCode !== SPACE_KEYCODE) ||
72
+ event.metaKey ||
73
+ event.ctrlKey ||
74
+ event.altKey) {
75
+ /* allow negative sign only as first character and none exists outside of text selection */
76
+ const indexNegativeSign = value.indexOf(NumberFormatService.NEGATIVE);
77
+ if (event.key === NumberFormatService.NEGATIVE &&
78
+ (event.target.selectionStart > 0 || indexNegativeSign > -1) &&
79
+ (event.target.selectionStart === event.target.selectionEnd ||
80
+ !(indexNegativeSign >= event.target.selectionStart && indexNegativeSign <= event.target.selectionEnd))) {
81
+ return false;
82
+ }
83
+ /* no duplicate decimal separators */
84
+ const indexDecimalSep = value.indexOf(this.numberFormatService.decimalSeparator);
85
+ if (event.key === this.numberFormatService.decimalSeparator &&
86
+ (indexDecimalSep > -1 || this.decimalPlaces === 0) &&
87
+ (event.target.selectionStart === event.target.selectionEnd ||
88
+ !(indexDecimalSep >= event.target.selectionStart && indexDecimalSep <= event.target.selectionEnd))) {
89
+ return false;
90
+ }
91
+ /* prevent too many decimal places */
92
+ if (NumberFormatService.NUMBERS.includes(event.key) &&
93
+ indexDecimalSep > -1 &&
94
+ indexDecimalSep < event.target.selectionStart &&
95
+ event.target.selectionStart === event.target.selectionEnd &&
96
+ value.length > indexDecimalSep + this.decimalPlaces) {
97
+ return false;
98
+ }
99
+ /* when deleting thousand separator, remove the digit before or after it */
100
+ const cursorStart = event.target.selectionStart;
101
+ if (cursorStart === event.target.selectionEnd) {
102
+ if (event.keyCode === BACK_KEYCODE && value.substr(cursorStart - 1, 1) === this.numberFormatService.groupingSeparator) {
103
+ event.target.value = value.substring(0, cursorStart - 2) + value.substring(cursorStart - 1, value.length);
104
+ event.target.selectionStart = event.target.selectionEnd = cursorStart - 1;
105
+ return false;
106
+ }
107
+ else if (event.keyCode === DEL_KEYCODE && value.substr(cursorStart, 1) === this.numberFormatService.groupingSeparator) {
108
+ event.target.value = value.substring(0, cursorStart + 1) + value.substring(cursorStart + 2, value.length);
109
+ event.target.selectionStart = event.target.selectionEnd = cursorStart + 1;
110
+ return false;
111
+ }
112
+ }
113
+ this.originalValue = NaN;
114
+ }
115
+ else {
116
+ return false;
117
+ }
118
+ return true;
119
+ });
120
+ }
121
+ ngOnDestroy() {
122
+ this.detachListener();
123
+ }
124
+ ngAfterViewChecked() {
125
+ this.injectUnitSymbol();
126
+ }
127
+ handleInputChanged() {
128
+ // Call in set timeout to avoid Expression has changed after it has been checked error.
129
+ // Sometimes the value changes because we cut off decimal places
130
+ setTimeout(() => {
131
+ this.updateInput(this.numberFormatService.format(this._numericValue, {
132
+ decimalPlaces: this.decimalPlaces,
133
+ finalFormatting: false,
134
+ autofillDecimals: this.autofillDecimals,
135
+ }));
136
+ }, 1);
137
+ }
138
+ formatInput(element, finalFormatting) {
139
+ const cursorPos = element.selectionStart;
140
+ const length = element.value.length;
141
+ const setCursor = this.displayValue !== element.value;
142
+ const textFormatted = this.numberFormatService.formatNumber(element.value, {
143
+ decimalPlaces: this.decimalPlaces,
144
+ finalFormatting,
145
+ autofillDecimals: this.autofillDecimals,
146
+ });
147
+ // special handling to move unit symbol along with display value
148
+ if (this.textAlign === 'left' && this.unitPosition === 'right') {
149
+ const inputStyles = window.getComputedStyle(this.inputEl.nativeElement.parentElement, null);
150
+ this.unitSpan.style.position = 'absolute';
151
+ this.unitSpan.style.marginTop = inputStyles.getPropertyValue('border-top-width');
152
+ this.unitSpan.style.paddingTop = inputStyles.getPropertyValue('padding-top');
153
+ this.unitSpan.style.paddingBottom = inputStyles.getPropertyValue('padding-bottom');
154
+ if (!this.textSpan) {
155
+ this.textSpan = document.createElement('span');
156
+ document.body.appendChild(this.textSpan);
157
+ this.textSpan.style.font = inputStyles.getPropertyValue('font');
158
+ this.textSpan.style.fontSize = inputStyles.getPropertyValue('font-size');
159
+ this.textSpan.style.height = 'auto';
160
+ this.textSpan.style.width = 'auto';
161
+ this.textSpan.style.position = 'absolute';
162
+ this.textSpan.style.top = '0';
163
+ this.textSpan.style.whiteSpace = 'no-wrap';
164
+ this.textSpan.style.visibility = 'hidden';
165
+ }
166
+ this.textSpan.innerHTML = textFormatted;
167
+ const width = Math.min(this.inputEl.nativeElement.clientWidth - this.unitSpan.clientWidth, Math.ceil(this.textSpan.clientWidth));
168
+ this.unitSpan.style.left = width + 'px';
169
+ }
170
+ this.updateInput(textFormatted);
171
+ if (setCursor) {
172
+ element.selectionStart = element.selectionEnd = Math.max(cursorPos + element.value.length - length, 0);
173
+ }
174
+ }
175
+ updateInput(value) {
176
+ this.displayValue = value;
177
+ this.inputEl.nativeElement.value = value;
178
+ this._numericValue = parseFloat(this.numberFormatService.strip(value, { decimalPlaces: this.decimalPlaces }).replace(this.numberFormatService.decimalSeparator, '.'));
179
+ if (this._numericValue !== this.roundOrTruncate(this.originalValue)) {
180
+ this.originalValue = this._numericValue;
181
+ this.numericValueChanged.emit(this._numericValue);
182
+ }
183
+ }
184
+ getValueForFormControl() {
185
+ this.formatInput(this.inputEl.nativeElement, false);
186
+ if (isNaN(this._numericValue)) {
187
+ // Return undefined instead of NaN to support the default required validator.
188
+ return undefined; // eslint-disable-line
189
+ }
190
+ return this._numericValue;
191
+ }
192
+ injectUnitSymbol() {
193
+ // Need to inject the unit symbol when the input element width is set to its actual value,
194
+ // otherwise the icon wont show in the correct position
195
+ if (!!this.unit && !this.unitSpan && this.inputEl.nativeElement.offsetWidth !== 0) {
196
+ // Get the input wrapper and apply necessary styles
197
+ const inputWrapper = this.inputEl.nativeElement.parentNode.parentNode;
198
+ // Create the span with unit symbol and apply necessary styles
199
+ this.unitSpan = this.renderer.createElement('span');
200
+ if (this.unitPosition === 'left') {
201
+ this.renderer.setAttribute(this.unitSpan, 'matPrefix', '');
202
+ this.renderer.setStyle(this.unitSpan, 'padding-right', '5px');
203
+ this.renderer.insertBefore(inputWrapper, this.unitSpan, inputWrapper.children[0]);
204
+ }
205
+ else {
206
+ this.renderer.setAttribute(this.unitSpan, 'matSuffix', '');
207
+ this.renderer.setStyle(this.unitSpan, 'padding-left', '5px');
208
+ this.renderer.appendChild(inputWrapper, this.unitSpan);
209
+ }
210
+ }
211
+ // do not display unit symbol if the unit should move along display value
212
+ if (!!this.unitSpan && this.textAlign === 'left' && this.unitPosition === 'right') {
213
+ if (NumberFormatService.valueIsSet(this.displayValue)) {
214
+ this.unitSpan.style.display = 'unset';
215
+ }
216
+ else {
217
+ this.unitSpan.style.display = 'none';
218
+ }
219
+ }
220
+ // always reset unit symbol
221
+ if (!!this.unitSpan) {
222
+ this.unitSpan.textContent = this.unit;
223
+ }
224
+ }
225
+ detachListener() {
226
+ if (this.inputChangeListener) {
227
+ this.inputChangeListener();
228
+ delete this.inputChangeListener;
229
+ }
230
+ if (this.keydownListener) {
231
+ this.keydownListener();
232
+ delete this.keydownListener;
233
+ }
234
+ if (this.keyupListener) {
235
+ this.keyupListener();
236
+ delete this.keyupListener;
237
+ }
238
+ }
239
+ roundOrTruncate(value) {
240
+ const method = this.roundValue ? 'round' : value < 0 ? 'ceil' : 'floor';
241
+ return Math[method](value * Math.pow(10, this.decimalPlaces)) / Math.pow(10, this.decimalPlaces);
242
+ }
243
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NumericFieldDirective, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.NumberFormatService }], target: i0.ɵɵFactoryTarget.Directive }); }
244
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.4", type: NumericFieldDirective, selector: "[madNumericField]", inputs: { textAlign: "textAlign", decimalPlaces: "decimalPlaces", roundValue: ["roundDisplayValue", "roundValue"], autofillDecimals: "autofillDecimals", unit: "unit", unitPosition: "unitPosition", numericValue: "numericValue" }, outputs: { numericValueChanged: "numericValueChange" }, host: { listeners: { "change": "onChange(getValueForFormControl())", "input": "onChange(getValueForFormControl())", "blur": "onTouched()" }, properties: { "class.text-right": "textAlign === \"right\"" } }, providers: [
245
+ {
246
+ provide: NG_VALUE_ACCESSOR,
247
+ useExisting: forwardRef(() => NumericFieldDirective),
248
+ multi: true,
249
+ },
250
+ ], ngImport: i0 }); }
251
+ }
252
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NumericFieldDirective, decorators: [{
253
+ type: Directive,
254
+ args: [{
255
+ selector: '[madNumericField]',
256
+ host: {
257
+ '[class.text-right]': 'textAlign === "right"',
258
+ '(change)': 'onChange(getValueForFormControl())',
259
+ '(input)': 'onChange(getValueForFormControl())',
260
+ '(blur)': 'onTouched()',
261
+ },
262
+ providers: [
263
+ {
264
+ provide: NG_VALUE_ACCESSOR,
265
+ useExisting: forwardRef(() => NumericFieldDirective),
266
+ multi: true,
267
+ },
268
+ ],
269
+ }]
270
+ }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.NumberFormatService }], propDecorators: { textAlign: [{
271
+ type: Input,
272
+ args: ['textAlign']
273
+ }], decimalPlaces: [{
274
+ type: Input,
275
+ args: ['decimalPlaces']
276
+ }], roundValue: [{
277
+ type: Input,
278
+ args: ['roundDisplayValue']
279
+ }], autofillDecimals: [{
280
+ type: Input,
281
+ args: ['autofillDecimals']
282
+ }], unit: [{
283
+ type: Input,
284
+ args: ['unit']
285
+ }], unitPosition: [{
286
+ type: Input,
287
+ args: ['unitPosition']
288
+ }], numericValueChanged: [{
289
+ type: Output,
290
+ args: ['numericValueChange']
291
+ }], numericValue: [{
292
+ type: Input,
293
+ args: ['numericValue']
294
+ }] } });
295
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1maWVsZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjL2xpYi9udW1lcmljLWZpZWxkL251bWVyaWMtZmllbGQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7OztBQUU5RCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDdkIsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUN2QixNQUFNLDZCQUE2QixHQUFHLEVBQUUsQ0FBQztBQUN6QyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBa0JsRCxNQUFNLE9BQU8scUJBQXFCO0lBZ0JoQyxJQUNJLFlBQVksQ0FBQyxLQUFhO1FBQzVCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDcEcsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsMEdBQTBHO1lBQzFHLDZDQUE2QztZQUM3QyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFL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UyxtQkFBbUI7c0JBQWhELE1BQU07dUJBQUMsb0JBQW9CO2dCQVV4QixZQUFZO3NCQURmLEtBQUs7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMCBQb3JzY2hlIEluZm9ybWF0aWsuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE51bWJlckZvcm1hdFNlcnZpY2UgfSBmcm9tICcuL251bWJlci1mb3JtYXQuc2VydmljZSc7XG5cbmNvbnN0IEJBQ0tfS0VZQ09ERSA9IDg7XG5jb25zdCBTUEFDRV9LRVlDT0RFID0gMzI7XG5jb25zdCBERUxfS0VZQ09ERSA9IDQ2O1xuY29uc3QgQ09OVFJPTF9LRVlDT0RFU19VUFBFUl9CT1JERVIgPSA0NjtcbmNvbnN0IE9USEVSX0NPTlRST0xfS0VZUyA9IG5ldyBTZXQoWzIyNCwgOTEsIDkzXSk7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1ttYWROdW1lcmljRmllbGRdJyxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MudGV4dC1yaWdodF0nOiAndGV4dEFsaWduID09PSBcInJpZ2h0XCInLFxuICAgICcoY2hhbmdlKSc6ICdvbkNoYW5nZShnZXRWYWx1ZUZvckZvcm1Db250cm9sKCkpJyxcbiAgICAnKGlucHV0KSc6ICdvbkNoYW5nZShnZXRWYWx1ZUZvckZvcm1Db250cm9sKCkpJyxcbiAgICAnKGJsdXIpJzogJ29uVG91Y2hlZCgpJyxcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOdW1lcmljRmllbGREaXJlY3RpdmUpLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBOdW1lcmljRmllbGREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoJ3RleHRBbGlnbicpIHRleHRBbGlnbjogJ3JpZ2h0JyB8ICdsZWZ0JyA9ICdyaWdodCc7XG4gIEBJbnB1dCgnZGVjaW1hbFBsYWNlcycpIGRlY2ltYWxQbGFjZXMgPSAyO1xuICBASW5wdXQoJ3JvdW5kRGlzcGxheVZhbHVlJykgcm91bmRWYWx1ZSA9IGZhbHNlO1xuICBASW5wdXQoJ2F1dG9maWxsRGVjaW1hbHMnKSBhdXRvZmlsbERlY2ltYWxzID0gZmFsc2U7XG4gIEBJbnB1dCgndW5pdCcpIHVuaXQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoJ3VuaXRQb3NpdGlvbicpIHVuaXRQb3NpdGlvbjogJ3JpZ2h0JyB8ICdsZWZ0JyA9ICdyaWdodCc7XG4gIEBPdXRwdXQoJ251bWVyaWNWYWx1ZUNoYW5nZScpIG51bWVyaWNWYWx1ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBwcml2YXRlIGRpc3BsYXlWYWx1ZSA9ICcnO1xuICBwcml2YXRlIG9yaWdpbmFsVmFsdWUgPSBOYU47XG4gIHByaXZhdGUgX251bWVyaWNWYWx1ZTogbnVtYmVyO1xuICBwcml2YXRlIGlucHV0Q2hhbmdlTGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUga2V5dXBMaXN0ZW5lcjogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBrZXlkb3duTGlzdGVuZXI6ICgpID0+IHZvaWQ7XG5cbiAgQElucHV0KCdudW1lcmljVmFsdWUnKVxuICBzZXQgbnVtZXJpY1ZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5fbnVtZXJpY1ZhbHVlICE9PSB2YWx1ZSAmJiAhKGlzTmFOKHRoaXMuX251bWVyaWNWYWx1ZSkgJiYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gbnVsbCkpKSB7XG4gICAgICB0aGlzLm9yaWdpbmFsVmFsdWUgPSB2YWx1ZTtcbiAgICAgIC8vIERvbid0IHJvdW5kT3JUcnVuY2F0ZSBpZiB2YWx1ZSB3YXMgc2V0IHRvIGVtcHR5IG90aGVyd2lzZSBpbnB1dCB2YWx1ZSB3aWxsIGJlIHNldCB0byAwIGluc3RlYWQgb2YgZW1wdHlcbiAgICAgIC8vIHdoaWNoIGhhcHBlbnMgd2hlbiBhbiBpbnB1dCBpcyBiZWluZyByZXNldFxuICAgICAgdGhpcy5fbnVtZXJpY1ZhbHVlID0gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogdGhpcy5yb3VuZE9yVHJ1bmNhdGUodmFsdWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICB0aGlzLmhhbmRsZUlucHV0Q2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5pdFNwYW46IEhUTUxTcGFuRWxlbWVudDtcbiAgcHJpdmF0ZSB0ZXh0U3BhbjogSFRNTFNwYW5FbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGlucHV0RWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBudW1iZXJGb3JtYXRTZXJ2aWNlOiBOdW1iZXJGb3JtYXRTZXJ2aWNlLFxuICApIHt9XG5cbiAgLyogQ29udHJvbCBWYWx1ZXMgQWNjZXNzb3IgU3R1ZmYgYmVsb3cgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIG9uQ2hhbmdlOiBhbnkgPSAoKSA9PiB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKCk6IHZvaWQge1xuICAgIC8vIERvbnQgbmVlZCB0byBpbXBsZW1lbnQgc2luY2UgaXRzIGp1c3QgYSBkaXJlY3RpdmVcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubnVtZXJpY1ZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvKiBuZWVkcyB0byBiZSBwYXJzZWQgYXMgbnVtYmVyIGV4cGxpY2l0bHkgYXMgaXQgY29tZXMgYXMgc3RyaW5nIGZyb20gdXNlciBpbnB1dCAqL1xuICAgIHRoaXMuZGVjaW1hbFBsYWNlcyA9IHBhcnNlSW50KHRoaXMuZGVjaW1hbFBsYWNlcy50b1N0cmluZygpLCAxMCk7XG5cbiAgICB0aGlzLmlucHV0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudCwgJ2JsdXInLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuZm9ybWF0SW5wdXQoZXZlbnQudGFyZ2V0LCB0cnVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMua2V5dXBMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LCAna2V5dXAnLCAoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBCQUNLX0tFWUNPREUgfHwgKGV2ZW50LmtleUNvZGUgPj0gQ09OVFJPTF9LRVlDT0RFU19VUFBFUl9CT1JERVIgJiYgIU9USEVSX0NPTlRST0xfS0VZUy5oYXMoZXZlbnQua2V5Q29kZSkpKSB7XG4gICAgICAgIHRoaXMuZm9ybWF0SW5wdXQoZXZlbnQudGFyZ2V0LCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmtleWRvd25MaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LCAna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWU6IHN0cmluZyA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5udW1iZXJGb3JtYXRTZXJ2aWNlLmFsbG93ZWRLZXlzLmluY2x1ZGVzKGV2ZW50LmtleSkgfHxcbiAgICAgICAgKGV2ZW50LmtleUNvZGUgPD0gQ09OVFJPTF9LRVlDT0RFU19VUFBFUl9CT1JERVIgJiYgZXZlbnQua2V5Q29kZSA+IDAgJiYgZXZlbnQua2V5Q29kZSAhPT0gU1BBQ0VfS0VZQ09ERSkgfHxcbiAgICAgICAgZXZlbnQubWV0YUtleSB8fFxuICAgICAgICBldmVudC5jdHJsS2V5IHx8XG4gICAgICAgIGV2ZW50LmFsdEtleVxuICAgICAgKSB7XG4gICAgICAgIC8qIGFsbG93IG5lZ2F0aXZlIHNpZ24gb25seSBhcyBmaXJzdCBjaGFyYWN0ZXIgYW5kIG5vbmUgZXhpc3RzIG91dHNpZGUgb2YgdGV4dCBzZWxlY3Rpb24gKi9cbiAgICAgICAgY29uc3QgaW5kZXhOZWdhdGl2ZVNpZ24gPSB2YWx1ZS5pbmRleE9mKE51bWJlckZvcm1hdFNlcnZpY2UuTkVHQVRJVkUpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXZlbnQua2V5ID09PSBOdW1iZXJGb3JtYXRTZXJ2aWNlLk5FR0FUSVZFICYmXG4gICAgICAgICAgKGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCA+IDAgfHwgaW5kZXhOZWdhdGl2ZVNpZ24gPiAtMSkgJiZcbiAgICAgICAgICAoZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID09PSBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kIHx8XG4gICAgICAgICAgICAhKGluZGV4TmVnYXRpdmVTaWduID49IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCAmJiBpbmRleE5lZ2F0aXZlU2lnbiA8PSBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogbm8gZHVwbGljYXRlIGRlY2ltYWwgc2VwYXJhdG9ycyAqL1xuICAgICAgICBjb25zdCBpbmRleERlY2ltYWxTZXAgPSB2YWx1ZS5pbmRleE9mKHRoaXMubnVtYmVyRm9ybWF0U2VydmljZS5kZWNpbWFsU2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGV2ZW50LmtleSA9PT0gdGhpcy5udW1iZXJGb3JtYXRTZXJ2aWNlLmRlY2ltYWxTZXBhcmF0b3IgJiZcbiAgICAgICAgICAoaW5kZXhEZWNpbWFsU2VwID4gLTEgfHwgdGhpcy5kZWNpbWFsUGxhY2VzID09PSAwKSAmJlxuICAgICAgICAgIChldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQgPT09IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQgfHxcbiAgICAgICAgICAgICEoaW5kZXhEZWNpbWFsU2VwID49IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCAmJiBpbmRleERlY2ltYWxTZXAgPD0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZCkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIHByZXZlbnQgdG9vIG1hbnkgZGVjaW1hbCBwbGFjZXMgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgIE51bWJlckZvcm1hdFNlcnZpY2UuTlVNQkVSUy5pbmNsdWRlcyhldmVudC5rZXkpICYmXG4gICAgICAgICAgaW5kZXhEZWNpbWFsU2VwID4gLTEgJiZcbiAgICAgICAgICBpbmRleERlY2ltYWxTZXAgPCBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQgJiZcbiAgICAgICAgICBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQgPT09IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQgJiZcbiAgICAgICAgICB2YWx1ZS5sZW5ndGggPiBpbmRleERlY2ltYWxTZXAgKyB0aGlzLmRlY2ltYWxQbGFjZXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogd2hlbiBkZWxldGluZyB0aG91c2FuZCBzZXBhcmF0b3IsIHJlbW92ZSB0aGUgZGlnaXQgYmVmb3JlIG9yIGFmdGVyIGl0ICovXG4gICAgICAgIGNvbnN0IGN1cnNvclN0YXJ0ID0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0O1xuXG4gICAgICAgIGlmIChjdXJzb3JTdGFydCA9PT0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZCkge1xuICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBCQUNLX0tFWUNPREUgJiYgdmFsdWUuc3Vic3RyKGN1cnNvclN0YXJ0IC0gMSwgMSkgPT09IHRoaXMubnVtYmVyRm9ybWF0U2VydmljZS5ncm91cGluZ1NlcGFyYXRvcikge1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIGN1cnNvclN0YXJ0IC0gMikgKyB2YWx1ZS5zdWJzdHJpbmcoY3Vyc29yU3RhcnQgLSAxLCB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZCA9IGN1cnNvclN0YXJ0IC0gMTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IERFTF9LRVlDT0RFICYmIHZhbHVlLnN1YnN0cihjdXJzb3JTdGFydCwgMSkgPT09IHRoaXMubnVtYmVyRm9ybWF0U2VydmljZS5ncm91cGluZ1NlcGFyYXRvcikge1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIGN1cnNvclN0YXJ0ICsgMSkgKyB2YWx1ZS5zdWJzdHJpbmcoY3Vyc29yU3RhcnQgKyAyLCB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZCA9IGN1cnNvclN0YXJ0ICsgMTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlID0gTmFOO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaExpc3RlbmVyKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pbmplY3RVbml0U3ltYm9sKCk7XG4gIH1cblxuICBoYW5kbGVJbnB1dENoYW5nZWQoKTogdm9pZCB7XG4gICAgLy8gQ2FsbCBpbiBzZXQgdGltZW91dCB0byBhdm9pZCBFeHByZXNzaW9uIGhhcyBjaGFuZ2VkIGFmdGVyIGl0IGhhcyBiZWVuIGNoZWNrZWQgZXJyb3IuXG4gICAgLy8gU29tZXRpbWVzIHRoZSB2YWx1ZSBjaGFuZ2VzIGJlY2F1c2Ugd2UgY3V0IG9mZiBkZWNpbWFsIHBsYWNlc1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVJbnB1dChcbiAgICAgICAgdGhpcy5udW1iZXJGb3JtYXRTZXJ2aWNlLmZvcm1hdCh0aGlzLl9udW1lcmljVmFsdWUsIHtcbiAgICAgICAgICBkZWNpbWFsUGxhY2VzOiB0aGlzLmRlY2ltYWxQbGFjZXMsXG4gICAgICAgICAgZmluYWxGb3JtYXR0aW5nOiBmYWxzZSxcbiAgICAgICAgICBhdXRvZmlsbERlY2ltYWxzOiB0aGlzLmF1dG9maWxsRGVjaW1hbHMsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9LCAxKTtcbiAgfVxuXG4gIGZvcm1hdElucHV0KGVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQsIGZpbmFsRm9ybWF0dGluZzogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnNvclBvcyA9IGVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgY29uc3QgbGVuZ3RoID0gZWxlbWVudC52YWx1ZS5sZW5ndGg7XG4gICAgY29uc3Qgc2V0Q3Vyc29yID0gdGhpcy5kaXNwbGF5VmFsdWUgIT09IGVsZW1lbnQudmFsdWU7XG4gICAgY29uc3QgdGV4dEZvcm1hdHRlZCA9IHRoaXMubnVtYmVyRm9ybWF0U2VydmljZS5mb3JtYXROdW1iZXIoZWxlbWVudC52YWx1ZSwge1xuICAgICAgZGVjaW1hbFBsYWNlczogdGhpcy5kZWNpbWFsUGxhY2VzLFxuICAgICAgZmluYWxGb3JtYXR0aW5nLFxuICAgICAgYXV0b2ZpbGxEZWNpbWFsczogdGhpcy5hdXRvZmlsbERlY2ltYWxzLFxuICAgIH0pO1xuXG4gICAgLy8gc3BlY2lhbCBoYW5kbGluZyB0byBtb3ZlIHVuaXQgc3ltYm9sIGFsb25nIHdpdGggZGlzcGxheSB2YWx1ZVxuICAgIGlmICh0aGlzLnRleHRBbGlnbiA9PT0gJ2xlZnQnICYmIHRoaXMudW5pdFBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICBjb25zdCBpbnB1dFN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQsIG51bGwpO1xuICAgICAgdGhpcy51bml0U3Bhbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICB0aGlzLnVuaXRTcGFuLnN0eWxlLm1hcmdpblRvcCA9IGlucHV0U3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci10b3Atd2lkdGgnKTtcbiAgICAgIHRoaXMudW5pdFNwYW4uc3R5bGUucGFkZGluZ1RvcCA9IGlucHV0U3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctdG9wJyk7XG4gICAgICB0aGlzLnVuaXRTcGFuLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBpbnB1dFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLWJvdHRvbScpO1xuXG4gICAgICBpZiAoIXRoaXMudGV4dFNwYW4pIHtcbiAgICAgICAgdGhpcy50ZXh0U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnRleHRTcGFuKTtcbiAgICAgICAgdGhpcy50ZXh0U3Bhbi5zdHlsZS5mb250ID0gaW5wdXRTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udCcpO1xuICAgICAgICB0aGlzLnRleHRTcGFuLnN0eWxlLmZvbnRTaXplID0gaW5wdXRTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJyk7XG4gICAgICAgIHRoaXMudGV4dFNwYW4uc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgICB0aGlzLnRleHRTcGFuLnN0eWxlLndpZHRoID0gJ2F1dG8nO1xuICAgICAgICB0aGlzLnRleHRTcGFuLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy50ZXh0U3Bhbi5zdHlsZS50b3AgPSAnMCc7XG4gICAgICAgIHRoaXMudGV4dFNwYW4uc3R5bGUud2hpdGVTcGFjZSA9ICduby13cmFwJztcbiAgICAgICAgdGhpcy50ZXh0U3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICB9XG4gICAgICB0aGlzLnRleHRTcGFuLmlubmVySFRNTCA9IHRleHRGb3JtYXR0ZWQ7XG4gICAgICBjb25zdCB3aWR0aCA9IE1hdGgubWluKHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIC0gdGhpcy51bml0U3Bhbi5jbGllbnRXaWR0aCwgTWF0aC5jZWlsKHRoaXMudGV4dFNwYW4uY2xpZW50V2lkdGgpKTtcbiAgICAgIHRoaXMudW5pdFNwYW4uc3R5bGUubGVmdCA9IHdpZHRoICsgJ3B4JztcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUlucHV0KHRleHRGb3JtYXR0ZWQpO1xuICAgIGlmIChzZXRDdXJzb3IpIHtcbiAgICAgIGVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPSBlbGVtZW50LnNlbGVjdGlvbkVuZCA9IE1hdGgubWF4KGN1cnNvclBvcyArIGVsZW1lbnQudmFsdWUubGVuZ3RoIC0gbGVuZ3RoLCAwKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVJbnB1dCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuX251bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQoXG4gICAgICB0aGlzLm51bWJlckZvcm1hdFNlcnZpY2Uuc3RyaXAodmFsdWUsIHsgZGVjaW1hbFBsYWNlczogdGhpcy5kZWNpbWFsUGxhY2VzIH0pLnJlcGxhY2UodGhpcy5udW1iZXJGb3JtYXRTZXJ2aWNlLmRlY2ltYWxTZXBhcmF0b3IsICcuJyksXG4gICAgKTtcbiAgICBpZiAodGhpcy5fbnVtZXJpY1ZhbHVlICE9PSB0aGlzLnJvdW5kT3JUcnVuY2F0ZSh0aGlzLm9yaWdpbmFsVmFsdWUpKSB7XG4gICAgICB0aGlzLm9yaWdpbmFsVmFsdWUgPSB0aGlzLl9udW1lcmljVmFsdWU7XG4gICAgICB0aGlzLm51bWVyaWNWYWx1ZUNoYW5nZWQuZW1pdCh0aGlzLl9udW1lcmljVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldFZhbHVlRm9yRm9ybUNvbnRyb2woKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICB0aGlzLmZvcm1hdElucHV0KHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LCBmYWxzZSk7XG4gICAgaWYgKGlzTmFOKHRoaXMuX251bWVyaWNWYWx1ZSkpIHtcbiAgICAgIC8vIFJldHVybiB1bmRlZmluZWQgaW5zdGVhZCBvZiBOYU4gdG8gc3VwcG9ydCB0aGUgZGVmYXVsdCByZXF1aXJlZCB2YWxpZGF0b3IuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9udW1lcmljVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGluamVjdFVuaXRTeW1ib2woKTogdm9pZCB7XG4gICAgLy8gTmVlZCB0byBpbmplY3QgdGhlIHVuaXQgc3ltYm9sIHdoZW4gdGhlIGlucHV0IGVsZW1lbnQgd2lkdGggaXMgc2V0IHRvIGl0cyBhY3R1YWwgdmFsdWUsXG4gICAgLy8gb3RoZXJ3aXNlIHRoZSBpY29uIHdvbnQgc2hvdyBpbiB0aGUgY29ycmVjdCBwb3NpdGlvblxuICAgIGlmICghIXRoaXMudW5pdCAmJiAhdGhpcy51bml0U3BhbiAmJiB0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAhPT0gMCkge1xuICAgICAgLy8gR2V0IHRoZSBpbnB1dCB3cmFwcGVyIGFuZCBhcHBseSBuZWNlc3Nhcnkgc3R5bGVzXG4gICAgICBjb25zdCBpbnB1dFdyYXBwZXIgPSB0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudC5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgc3BhbiB3aXRoIHVuaXQgc3ltYm9sIGFuZCBhcHBseSBuZWNlc3Nhcnkgc3R5bGVzXG4gICAgICB0aGlzLnVuaXRTcGFuID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cbiAgICAgIGlmICh0aGlzLnVuaXRQb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMudW5pdFNwYW4sICdtYXRQcmVmaXgnLCAnJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy51bml0U3BhbiwgJ3BhZGRpbmctcmlnaHQnLCAnNXB4Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKGlucHV0V3JhcHBlciwgdGhpcy51bml0U3BhbiwgaW5wdXRXcmFwcGVyLmNoaWxkcmVuWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMudW5pdFNwYW4sICdtYXRTdWZmaXgnLCAnJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy51bml0U3BhbiwgJ3BhZGRpbmctbGVmdCcsICc1cHgnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChpbnB1dFdyYXBwZXIsIHRoaXMudW5pdFNwYW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRvIG5vdCBkaXNwbGF5IHVuaXQgc3ltYm9sIGlmIHRoZSB1bml0IHNob3VsZCBtb3ZlIGFsb25nIGRpc3BsYXkgdmFsdWVcbiAgICBpZiAoISF0aGlzLnVuaXRTcGFuICYmIHRoaXMudGV4dEFsaWduID09PSAnbGVmdCcgJiYgdGhpcy51bml0UG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgIGlmIChOdW1iZXJGb3JtYXRTZXJ2aWNlLnZhbHVlSXNTZXQodGhpcy5kaXNwbGF5VmFsdWUpKSB7XG4gICAgICAgIHRoaXMudW5pdFNwYW4uc3R5bGUuZGlzcGxheSA9ICd1bnNldCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVuaXRTcGFuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGFsd2F5cyByZXNldCB1bml0IHN5bWJvbFxuICAgIGlmICghIXRoaXMudW5pdFNwYW4pIHtcbiAgICAgIHRoaXMudW5pdFNwYW4udGV4dENvbnRlbnQgPSB0aGlzLnVuaXQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXRhY2hMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnB1dENoYW5nZUxpc3RlbmVyKSB7XG4gICAgICB0aGlzLmlucHV0Q2hhbmdlTGlzdGVuZXIoKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmlucHV0Q2hhbmdlTGlzdGVuZXI7XG4gICAgfVxuICAgIGlmICh0aGlzLmtleWRvd25MaXN0ZW5lcikge1xuICAgICAgdGhpcy5rZXlkb3duTGlzdGVuZXIoKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmtleWRvd25MaXN0ZW5lcjtcbiAgICB9XG4gICAgaWYgKHRoaXMua2V5dXBMaXN0ZW5lcikge1xuICAgICAgdGhpcy5rZXl1cExpc3RlbmVyKCk7XG4gICAgICBkZWxldGUgdGhpcy5rZXl1cExpc3RlbmVyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcm91bmRPclRydW5jYXRlKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMucm91bmRWYWx1ZSA/ICdyb3VuZCcgOiB2YWx1ZSA8IDAgPyAnY2VpbCcgOiAnZmxvb3InO1xuICAgIHJldHVybiBNYXRoW21ldGhvZF0odmFsdWUgKiBNYXRoLnBvdygxMCwgdGhpcy5kZWNpbWFsUGxhY2VzKSkgLyBNYXRoLnBvdygxMCwgdGhpcy5kZWNpbWFsUGxhY2VzKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export { NumericFieldDirective } from './numeric-field.directive';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1maWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsLWFkZG9ucy9zcmMvbGliL251bWVyaWMtZmllbGQvbnVtZXJpYy1maWVsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IE51bWVyaWNGaWVsZERpcmVjdGl2ZSB9IGZyb20gJy4vbnVtZXJpYy1maWVsZC5kaXJlY3RpdmUnO1xuIl19
@@ -0,0 +1,24 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { NumericFieldDirective } from './numeric-field.directive';
3
+ import { NumberFormatService } from './number-format.service';
4
+ import * as i0 from "@angular/core";
5
+ export class NumericFieldModule {
6
+ static forRoot() {
7
+ return {
8
+ ngModule: NumericFieldModule,
9
+ providers: [NumberFormatService],
10
+ };
11
+ }
12
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NumericFieldModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
13
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.4", ngImport: i0, type: NumericFieldModule, declarations: [NumericFieldDirective], exports: [NumericFieldDirective] }); }
14
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NumericFieldModule, providers: [NumberFormatService] }); }
15
+ }
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NumericFieldModule, decorators: [{
17
+ type: NgModule,
18
+ args: [{
19
+ providers: [NumberFormatService],
20
+ declarations: [NumericFieldDirective],
21
+ exports: [NumericFieldDirective],
22
+ }]
23
+ }] });
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1maWVsZC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjL2xpYi9udW1lcmljLWZpZWxkL251bWVyaWMtZmllbGQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQU85RCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLE1BQU0sQ0FBQyxPQUFPO1FBQ1osT0FBTztZQUNMLFFBQVEsRUFBRSxrQkFBa0I7WUFDNUIsU0FBUyxFQUFFLENBQUMsbUJBQW1CLENBQUM7U0FDakMsQ0FBQztJQUNKLENBQUM7OEdBTlUsa0JBQWtCOytHQUFsQixrQkFBa0IsaUJBSGQscUJBQXFCLGFBQzFCLHFCQUFxQjsrR0FFcEIsa0JBQWtCLGFBSmxCLENBQUMsbUJBQW1CLENBQUM7OzJGQUlyQixrQkFBa0I7a0JBTDlCLFFBQVE7bUJBQUM7b0JBQ1IsU0FBUyxFQUFFLENBQUMsbUJBQW1CLENBQUM7b0JBQ2hDLFlBQVksRUFBRSxDQUFDLHFCQUFxQixDQUFDO29CQUNyQyxPQUFPLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztpQkFDakMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnVtZXJpY0ZpZWxkRGlyZWN0aXZlIH0gZnJvbSAnLi9udW1lcmljLWZpZWxkLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOdW1iZXJGb3JtYXRTZXJ2aWNlIH0gZnJvbSAnLi9udW1iZXItZm9ybWF0LnNlcnZpY2UnO1xuXG5ATmdNb2R1bGUoe1xuICBwcm92aWRlcnM6IFtOdW1iZXJGb3JtYXRTZXJ2aWNlXSxcbiAgZGVjbGFyYXRpb25zOiBbTnVtZXJpY0ZpZWxkRGlyZWN0aXZlXSxcbiAgZXhwb3J0czogW051bWVyaWNGaWVsZERpcmVjdGl2ZV0sXG59KVxuZXhwb3J0IGNsYXNzIE51bWVyaWNGaWVsZE1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KCk6IE1vZHVsZVdpdGhQcm92aWRlcnM8TnVtZXJpY0ZpZWxkTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBOdW1lcmljRmllbGRNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtOdW1iZXJGb3JtYXRTZXJ2aWNlXSxcbiAgICB9O1xuICB9XG59XG4iXX0=