@gravitee/ui-particles-angular 15.13.0-angular-20-4a9d88b → 15.13.0-fix-cron-e0271bb

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 (375) hide show
  1. package/esm2022/gio-asciidoctor/gio-asciidoctor.component.mjs +104 -0
  2. package/esm2022/gio-asciidoctor/gio-asciidoctor.module.mjs +33 -0
  3. package/esm2022/gio-asciidoctor/gio-asciidoctor.service.mjs +48 -0
  4. package/esm2022/gio-asciidoctor/gravitee-ui-particles-angular-gio-asciidoctor.mjs +5 -0
  5. package/esm2022/gio-asciidoctor/public-api.mjs +19 -0
  6. package/esm2022/gio-el/gio-el-editor/gio-el-editor-condition-group/gio-el-editor-condition-group.component.mjs +127 -0
  7. package/esm2022/gio-el/gio-el-editor/gio-el-editor-condition-group/gio-el-editor-condition-group.harness.mjs +158 -0
  8. package/esm2022/gio-el/gio-el-editor/gio-el-editor.component.mjs +131 -0
  9. package/esm2022/gio-el/gio-el-editor/gio-el-editor.harness.mjs +28 -0
  10. package/esm2022/gio-el/gio-el-editor/gio-el-field/gio-el-field.component.mjs +271 -0
  11. package/esm2022/gio-el/gio-el-editor/gio-el-field/gio-el-field.harness.mjs +53 -0
  12. package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-boolean/gio-el-editor-type-boolean.component.mjs +57 -0
  13. package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-boolean/gio-el-editor-type-boolean.harness.mjs +31 -0
  14. package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-date/gio-el-editor-type-date.component.mjs +74 -0
  15. package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-date/gio-el-editor-type-date.harness.mjs +29 -0
  16. package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-number/gio-el-editor-type-number.component.mjs +70 -0
  17. package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-number/gio-el-editor-type-number.harness.mjs +29 -0
  18. package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-string/gio-el-editor-type-string.component.mjs +73 -0
  19. package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-string/gio-el-editor-type-string.harness.mjs +29 -0
  20. package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type.harness.mjs +38 -0
  21. package/esm2022/gio-el/gravitee-ui-particles-angular-gio-el.mjs +5 -0
  22. package/esm2022/gio-el/models/Condition.mjs +9 -0
  23. package/esm2022/gio-el/models/ConditionGroup.mjs +7 -0
  24. package/esm2022/gio-el/models/ConditionModel.mjs +17 -0
  25. package/esm2022/gio-el/models/ConditionsModel.mjs +4 -0
  26. package/esm2022/gio-el/models/ExpressionLanguageBuilder.mjs +97 -0
  27. package/esm2022/gio-el/models/Operator.mjs +2 -0
  28. package/esm2022/gio-el/models/public-api.mjs +21 -0
  29. package/esm2022/gio-el/public-api.mjs +19 -0
  30. package/esm2022/gravitee-ui-particles-angular.mjs +5 -0
  31. package/esm2022/lib/gio-avatar/gio-avatar.component.mjs +74 -0
  32. package/esm2022/lib/gio-avatar/gio-avatar.module.mjs +33 -0
  33. package/esm2022/lib/gio-avatar/index.mjs +18 -0
  34. package/esm2022/lib/gio-banner/gio-banner.component.mjs +120 -0
  35. package/esm2022/lib/gio-banner/gio-banner.module.mjs +64 -0
  36. package/esm2022/lib/gio-breadcrumb/gio-breadcrumb-item.directive.mjs +32 -0
  37. package/esm2022/lib/gio-breadcrumb/gio-breadcrumb.component.mjs +32 -0
  38. package/esm2022/lib/gio-breadcrumb/gio-breadcrumb.module.mjs +35 -0
  39. package/esm2022/lib/gio-breadcrumb/index.mjs +19 -0
  40. package/esm2022/lib/gio-card-empty-state/gio-card-empty-state.component.mjs +35 -0
  41. package/esm2022/lib/gio-card-empty-state/gio-card-empty-state.module.mjs +36 -0
  42. package/esm2022/lib/gio-card-empty-state/index.mjs +18 -0
  43. package/esm2022/lib/gio-clipboard/gio-clipboard-copy-icon.component.mjs +67 -0
  44. package/esm2022/lib/gio-clipboard/gio-clipboard-copy-wrapper.component.mjs +71 -0
  45. package/esm2022/lib/gio-clipboard/gio-clipboard.base.component.mjs +64 -0
  46. package/esm2022/lib/gio-clipboard/gio-clipboard.module.mjs +39 -0
  47. package/esm2022/lib/gio-confirm-and-validate-dialog/gio-confirm-and-validate-dialog.component.mjs +61 -0
  48. package/esm2022/lib/gio-confirm-and-validate-dialog/gio-confirm-and-validate-dialog.harness.mjs +40 -0
  49. package/esm2022/lib/gio-confirm-and-validate-dialog/gio-confirm-and-validate-dialog.module.mjs +40 -0
  50. package/esm2022/lib/gio-confirm-dialog/gio-confirm-dialog.component.mjs +54 -0
  51. package/esm2022/lib/gio-confirm-dialog/gio-confirm-dialog.harness.mjs +34 -0
  52. package/esm2022/lib/gio-confirm-dialog/gio-confirm-dialog.module.mjs +36 -0
  53. package/esm2022/lib/gio-dialog/gio-dialog.constant.mjs +21 -0
  54. package/esm2022/lib/gio-el/gio-el-assistant/gio-el-assistant.component.mjs +62 -0
  55. package/esm2022/lib/gio-el/gio-el-prompt/gio-el-prompt.component.mjs +112 -0
  56. package/esm2022/lib/gio-el/gio-el.service.mjs +60 -0
  57. package/esm2022/lib/gio-el/index.mjs +20 -0
  58. package/esm2022/lib/gio-el/models/ElAiPromptState.mjs +23 -0
  59. package/esm2022/lib/gio-el/public-api.mjs +20 -0
  60. package/esm2022/lib/gio-form-cron/gio-form-cron-hint.component.mjs +30 -0
  61. package/esm2022/lib/gio-form-cron/gio-form-cron-label.component.mjs +30 -0
  62. package/esm2022/lib/gio-form-cron/gio-form-cron.adapter.mjs +249 -0
  63. package/esm2022/lib/gio-form-cron/gio-form-cron.component.mjs +211 -0
  64. package/esm2022/lib/gio-form-cron/gio-form-cron.harness.mjs +77 -0
  65. package/esm2022/lib/gio-form-cron/gio-form-cron.module.mjs +69 -0
  66. package/esm2022/lib/gio-form-file-picker/gio-form-file-picker-add-button/gio-form-file-picker-add-button.component.mjs +29 -0
  67. package/esm2022/lib/gio-form-file-picker/gio-form-file-picker-empty/gio-form-file-picker-empty.component.mjs +27 -0
  68. package/esm2022/lib/gio-form-file-picker/gio-form-file-picker-label/gio-form-file-picker-label.component.mjs +26 -0
  69. package/esm2022/lib/gio-form-file-picker/gio-form-file-picker.component.harness.mjs +95 -0
  70. package/esm2022/lib/gio-form-file-picker/gio-form-file-picker.component.mjs +167 -0
  71. package/esm2022/lib/gio-form-file-picker/gio-form-file-picker.model.mjs +23 -0
  72. package/esm2022/lib/gio-form-file-picker/gio-form-file-picker.module.mjs +57 -0
  73. package/esm2022/lib/gio-form-file-picker/index.mjs +23 -0
  74. package/esm2022/lib/gio-form-focus-first-invalid/gio-form-focus-first-invalid-ignore.directive.mjs +31 -0
  75. package/esm2022/lib/gio-form-focus-first-invalid/gio-form-focus-first-invalid.directive.mjs +96 -0
  76. package/esm2022/lib/gio-form-focus-first-invalid/gio-form-focus-first-invalid.module.mjs +32 -0
  77. package/esm2022/lib/gio-form-headers/gio-form-headers-label.component.mjs +30 -0
  78. package/esm2022/lib/gio-form-headers/gio-form-headers.component.mjs +284 -0
  79. package/esm2022/lib/gio-form-headers/gio-form-headers.harness.mjs +73 -0
  80. package/esm2022/lib/gio-form-headers/gio-form-headers.module.mjs +77 -0
  81. package/esm2022/lib/gio-form-json-schema/gio-form-json-schema.component.mjs +209 -0
  82. package/esm2022/lib/gio-form-json-schema/gio-form-json-schema.module.mjs +244 -0
  83. package/esm2022/lib/gio-form-json-schema/gio-formly-json-schema.service.mjs +261 -0
  84. package/esm2022/lib/gio-form-json-schema/model/GioJsonSchema.mjs +17 -0
  85. package/esm2022/lib/gio-form-json-schema/model/GioJsonSchemaContext.mjs +2 -0
  86. package/esm2022/lib/gio-form-json-schema/type-component/array-type.component.mjs +109 -0
  87. package/esm2022/lib/gio-form-json-schema/type-component/code-editor-type.component.mjs +47 -0
  88. package/esm2022/lib/gio-form-json-schema/type-component/cron-type.component.mjs +42 -0
  89. package/esm2022/lib/gio-form-json-schema/type-component/headers-type.component.mjs +108 -0
  90. package/esm2022/lib/gio-form-json-schema/type-component/multischema-type.component.mjs +66 -0
  91. package/esm2022/lib/gio-form-json-schema/type-component/null-type.component.mjs +31 -0
  92. package/esm2022/lib/gio-form-json-schema/type-component/object-type.component.mjs +62 -0
  93. package/esm2022/lib/gio-form-json-schema/type-component/toggle-type.component.mjs +60 -0
  94. package/esm2022/lib/gio-form-json-schema/util/validation-message.util.mjs +38 -0
  95. package/esm2022/lib/gio-form-json-schema/wrappers/gio-banner-extension.mjs +10 -0
  96. package/esm2022/lib/gio-form-json-schema/wrappers/gio-banner-wrapper.component.mjs +28 -0
  97. package/esm2022/lib/gio-form-json-schema/wrappers/gio-el-helper-wrapper.component.mjs +61 -0
  98. package/esm2022/lib/gio-form-json-schema/wrappers/gio-password-eye.component.mjs +74 -0
  99. package/esm2022/lib/gio-form-selection-inline/gio-form-selection-inline-card-content/gio-form-selection-inline-card-content.component.mjs +79 -0
  100. package/esm2022/lib/gio-form-selection-inline/gio-form-selection-inline-card.component.mjs +86 -0
  101. package/esm2022/lib/gio-form-selection-inline/gio-form-selection-inline-card.harness.mjs +44 -0
  102. package/esm2022/lib/gio-form-selection-inline/gio-form-selection-inline.component.mjs +103 -0
  103. package/esm2022/lib/gio-form-selection-inline/gio-form-selection-inline.harness.mjs +65 -0
  104. package/esm2022/lib/gio-form-selection-inline/gio-form-selection-inline.module.mjs +59 -0
  105. package/esm2022/lib/gio-form-selection-inline/public-api.mjs +22 -0
  106. package/esm2022/lib/gio-form-slide-toggle/gio-form-label.directive.mjs +52 -0
  107. package/esm2022/lib/gio-form-slide-toggle/gio-form-slide-toggle.component.mjs +69 -0
  108. package/esm2022/lib/gio-form-slide-toggle/gio-form-slide-toggle.module.mjs +34 -0
  109. package/esm2022/lib/gio-form-tags-input/gio-form-tags-input.component.mjs +316 -0
  110. package/esm2022/lib/gio-form-tags-input/gio-form-tags-input.harness.mjs +82 -0
  111. package/esm2022/lib/gio-form-tags-input/gio-form-tags-input.module.mjs +67 -0
  112. package/esm2022/lib/gio-icons/gio-icons.module.mjs +37 -0
  113. package/esm2022/lib/gio-license/gio-license-dialog/gio-license-dialog.component.mjs +43 -0
  114. package/esm2022/lib/gio-license/gio-license-dialog/gio-license-dialog.module.mjs +37 -0
  115. package/esm2022/lib/gio-license/gio-license.directive.mjs +92 -0
  116. package/esm2022/lib/gio-license/gio-license.module.mjs +35 -0
  117. package/esm2022/lib/gio-license/gio-license.service.mjs +101 -0
  118. package/esm2022/lib/gio-license/gio-license.testing.module.mjs +107 -0
  119. package/esm2022/lib/gio-license-expiration-notification/gio-license-expiration-notification.component.mjs +77 -0
  120. package/esm2022/lib/gio-license-expiration-notification/gio-license-expiration-notification.harness.mjs +44 -0
  121. package/esm2022/lib/gio-license-expiration-notification/gio-license-expiration-notification.module.mjs +36 -0
  122. package/esm2022/lib/gio-loader/gio-loader.component.mjs +27 -0
  123. package/esm2022/lib/gio-loader/gio-loader.module.mjs +34 -0
  124. package/esm2022/lib/gio-mat-config/gio-mat-config.module.mjs +30 -0
  125. package/esm2022/lib/gio-mat-config/index.mjs +17 -0
  126. package/esm2022/lib/gio-monaco-editor/gio-monaco-clipboard-copy.component.mjs +44 -0
  127. package/esm2022/lib/gio-monaco-editor/gio-monaco-editor-form-field.directive.mjs +150 -0
  128. package/esm2022/lib/gio-monaco-editor/gio-monaco-editor.component.mjs +314 -0
  129. package/esm2022/lib/gio-monaco-editor/gio-monaco-editor.harness.mjs +70 -0
  130. package/esm2022/lib/gio-monaco-editor/gio-monaco-editor.module.mjs +60 -0
  131. package/esm2022/lib/gio-monaco-editor/gio-monaco-editor.testing.component.mjs +42 -0
  132. package/esm2022/lib/gio-monaco-editor/models/GioMonacoEditorConfig.mjs +18 -0
  133. package/esm2022/lib/gio-monaco-editor/models/JSONSchemaAutoComplete.mjs +115 -0
  134. package/esm2022/lib/gio-monaco-editor/models/MonacoEditorTheme.mjs +2 -0
  135. package/esm2022/lib/gio-monaco-editor/services/gio-language-el.service.mjs +226 -0
  136. package/esm2022/lib/gio-monaco-editor/services/gio-language-json.service.mjs +72 -0
  137. package/esm2022/lib/gio-monaco-editor/services/gio-monaco-editor.service.mjs +72 -0
  138. package/esm2022/lib/gio-pipe/gio.pipe.module.mjs +32 -0
  139. package/esm2022/lib/gio-pipe/safe.pipe.mjs +53 -0
  140. package/esm2022/lib/gio-popover/gio-popover-trigger.directive.mjs +46 -0
  141. package/esm2022/lib/gio-popover/gio-popover.component.mjs +83 -0
  142. package/esm2022/lib/gio-popover/index.mjs +18 -0
  143. package/esm2022/lib/gio-popover/public-api.mjs +18 -0
  144. package/esm2022/lib/gio-prismjs/gio-prismjs.service.mjs +80 -0
  145. package/esm2022/lib/gio-save-bar/gio-save-bar.component.mjs +142 -0
  146. package/esm2022/lib/gio-save-bar/gio-save-bar.harness.mjs +54 -0
  147. package/esm2022/lib/gio-save-bar/gio-save-bar.module.mjs +35 -0
  148. package/esm2022/lib/oem-theme/gio-menu/gio-menu-footer/gio-menu-footer.component.mjs +26 -0
  149. package/esm2022/lib/oem-theme/gio-menu/gio-menu-header/gio-menu-header.component.mjs +26 -0
  150. package/esm2022/lib/oem-theme/gio-menu/gio-menu-item/gio-menu-item.component.mjs +85 -0
  151. package/esm2022/lib/oem-theme/gio-menu/gio-menu-license-expiration-notification/gio-menu-license-expiration-notification.component.mjs +26 -0
  152. package/esm2022/lib/oem-theme/gio-menu/gio-menu-list/gio-menu-list.component.mjs +26 -0
  153. package/esm2022/lib/oem-theme/gio-menu/gio-menu-search/gio-menu-search.component.mjs +62 -0
  154. package/esm2022/lib/oem-theme/gio-menu/gio-menu-search/gio-menu-search.harness.mjs +41 -0
  155. package/esm2022/lib/oem-theme/gio-menu/gio-menu-search/gio-menu-search.service.mjs +41 -0
  156. package/esm2022/lib/oem-theme/gio-menu/gio-menu-selector/gio-menu-selector.component.mjs +49 -0
  157. package/esm2022/lib/oem-theme/gio-menu/gio-menu-selector/gio-menu-selector.harness.mjs +41 -0
  158. package/esm2022/lib/oem-theme/gio-menu/gio-menu.component.mjs +50 -0
  159. package/esm2022/lib/oem-theme/gio-menu/gio-menu.module.mjs +78 -0
  160. package/esm2022/lib/oem-theme/gio-menu/gio-menu.service.mjs +45 -0
  161. package/esm2022/lib/oem-theme/gio-menu/index.mjs +29 -0
  162. package/esm2022/lib/oem-theme/gio-submenu/gio-submenu-group/gio-submenu-group.component.mjs +34 -0
  163. package/esm2022/lib/oem-theme/gio-submenu/gio-submenu-item/gio-submenu-item.component.mjs +46 -0
  164. package/esm2022/lib/oem-theme/gio-submenu/gio-submenu.component.mjs +112 -0
  165. package/esm2022/lib/oem-theme/gio-submenu/gio-submenu.module.mjs +37 -0
  166. package/esm2022/lib/oem-theme/gio-submenu/index.mjs +20 -0
  167. package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar-content/gio-top-bar-content.component.mjs +35 -0
  168. package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar-link/gio-top-bar-link.component.mjs +35 -0
  169. package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar-link/gio-top-bar-link.module.mjs +35 -0
  170. package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar-menu/gio-top-bar-menu.component.mjs +26 -0
  171. package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar-menu/gio-top-bar-menu.module.mjs +33 -0
  172. package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar.component.mjs +34 -0
  173. package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar.module.mjs +36 -0
  174. package/esm2022/lib/oem-theme/gio-top-bar/index.mjs +23 -0
  175. package/esm2022/lib/oem-theme/oem-theme.service.mjs +83 -0
  176. package/esm2022/lib/oem-theme/public-api.mjs +20 -0
  177. package/esm2022/lib/public-api.mjs +85 -0
  178. package/esm2022/public-api.mjs +20 -0
  179. package/esm2022/testing/gravitee-ui-particles-angular-testing.mjs +5 -0
  180. package/esm2022/testing/harnesses/div.harness.mjs +42 -0
  181. package/esm2022/testing/harnesses/index.mjs +18 -0
  182. package/esm2022/testing/harnesses/span.harness.mjs +42 -0
  183. package/esm2022/testing/public-api.mjs +17 -0
  184. package/fesm2022/gravitee-ui-particles-angular-gio-asciidoctor.mjs +11 -11
  185. package/fesm2022/gravitee-ui-particles-angular-gio-asciidoctor.mjs.map +1 -1
  186. package/fesm2022/gravitee-ui-particles-angular-gio-el.mjs +80 -74
  187. package/fesm2022/gravitee-ui-particles-angular-gio-el.mjs.map +1 -1
  188. package/fesm2022/gravitee-ui-particles-angular-testing.mjs.map +1 -1
  189. package/fesm2022/gravitee-ui-particles-angular.mjs +568 -637
  190. package/fesm2022/gravitee-ui-particles-angular.mjs.map +1 -1
  191. package/gio-asciidoctor/gio-asciidoctor.component.d.ts +26 -0
  192. package/gio-asciidoctor/gio-asciidoctor.module.d.ts +8 -0
  193. package/gio-asciidoctor/gio-asciidoctor.service.d.ts +14 -0
  194. package/gio-asciidoctor/index.d.ts +5 -49
  195. package/gio-asciidoctor/public-api.d.ts +3 -0
  196. package/gio-el/gio-el-editor/gio-el-editor-condition-group/gio-el-editor-condition-group.component.d.ts +25 -0
  197. package/gio-el/gio-el-editor/gio-el-editor-condition-group/gio-el-editor-condition-group.harness.d.ts +36 -0
  198. package/gio-el/gio-el-editor/gio-el-editor.component.d.ts +25 -0
  199. package/gio-el/gio-el-editor/gio-el-editor.harness.d.ts +7 -0
  200. package/gio-el/gio-el-editor/gio-el-field/gio-el-field.component.d.ts +70 -0
  201. package/gio-el/gio-el-editor/gio-el-field/gio-el-field.harness.d.ts +14 -0
  202. package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-boolean/gio-el-editor-type-boolean.component.d.ts +15 -0
  203. package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-boolean/gio-el-editor-type-boolean.harness.d.ts +6 -0
  204. package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-date/gio-el-editor-type-date.component.d.ts +17 -0
  205. package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-date/gio-el-editor-type-date.harness.d.ts +6 -0
  206. package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-number/gio-el-editor-type-number.component.d.ts +17 -0
  207. package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-number/gio-el-editor-type-number.harness.d.ts +6 -0
  208. package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-string/gio-el-editor-type-string.component.d.ts +23 -0
  209. package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-string/gio-el-editor-type-string.harness.d.ts +6 -0
  210. package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type.harness.d.ts +10 -0
  211. package/gio-el/index.d.ts +5 -146
  212. package/gio-el/models/Condition.d.ts +19 -0
  213. package/gio-el/models/ConditionGroup.d.ts +7 -0
  214. package/gio-el/models/ConditionModel.d.ts +32 -0
  215. package/gio-el/models/ConditionsModel.d.ts +8 -0
  216. package/gio-el/models/ExpressionLanguageBuilder.d.ts +12 -0
  217. package/gio-el/models/Operator.d.ts +1 -0
  218. package/gio-el/models/public-api.d.ts +5 -0
  219. package/gio-el/public-api.d.ts +3 -0
  220. package/index.d.ts +3 -1822
  221. package/lib/gio-avatar/gio-avatar.component.d.ts +21 -0
  222. package/lib/gio-avatar/gio-avatar.module.d.ts +8 -0
  223. package/lib/gio-avatar/index.d.ts +2 -0
  224. package/lib/gio-banner/gio-banner.component.d.ts +43 -0
  225. package/lib/gio-banner/gio-banner.module.d.ts +11 -0
  226. package/lib/gio-breadcrumb/gio-breadcrumb-item.directive.d.ts +8 -0
  227. package/lib/gio-breadcrumb/gio-breadcrumb.component.d.ts +8 -0
  228. package/lib/gio-breadcrumb/gio-breadcrumb.module.d.ts +10 -0
  229. package/lib/gio-breadcrumb/index.d.ts +3 -0
  230. package/lib/gio-card-empty-state/gio-card-empty-state.component.d.ts +8 -0
  231. package/lib/gio-card-empty-state/gio-card-empty-state.module.d.ts +11 -0
  232. package/lib/gio-card-empty-state/index.d.ts +2 -0
  233. package/lib/gio-clipboard/gio-clipboard-copy-icon.component.d.ts +6 -0
  234. package/lib/gio-clipboard/gio-clipboard-copy-wrapper.component.d.ts +6 -0
  235. package/lib/gio-clipboard/gio-clipboard.base.component.d.ts +18 -0
  236. package/lib/gio-clipboard/gio-clipboard.module.d.ts +14 -0
  237. package/lib/gio-confirm-and-validate-dialog/gio-confirm-and-validate-dialog.component.d.ts +33 -0
  238. package/lib/gio-confirm-and-validate-dialog/gio-confirm-and-validate-dialog.harness.d.ts +9 -0
  239. package/lib/gio-confirm-and-validate-dialog/gio-confirm-and-validate-dialog.module.d.ts +15 -0
  240. package/lib/gio-confirm-dialog/gio-confirm-dialog.component.d.ts +29 -0
  241. package/lib/gio-confirm-dialog/gio-confirm-dialog.harness.d.ts +8 -0
  242. package/lib/gio-confirm-dialog/gio-confirm-dialog.module.d.ts +11 -0
  243. package/lib/gio-dialog/gio-dialog.constant.d.ts +5 -0
  244. package/lib/gio-el/gio-el-assistant/gio-el-assistant.component.d.ts +7 -0
  245. package/lib/gio-el/gio-el-prompt/gio-el-prompt.component.d.ts +28 -0
  246. package/lib/gio-el/gio-el.service.d.ts +19 -0
  247. package/lib/gio-el/index.d.ts +4 -0
  248. package/lib/gio-el/models/ElAiPromptState.d.ts +15 -0
  249. package/lib/gio-el/public-api.d.ts +4 -0
  250. package/lib/gio-form-cron/gio-form-cron-hint.component.d.ts +5 -0
  251. package/lib/gio-form-cron/gio-form-cron-label.component.d.ts +5 -0
  252. package/lib/gio-form-cron/gio-form-cron.adapter.d.ts +18 -0
  253. package/lib/gio-form-cron/gio-form-cron.component.d.ts +42 -0
  254. package/lib/gio-form-cron/gio-form-cron.harness.d.ts +23 -0
  255. package/lib/gio-form-cron/gio-form-cron.module.d.ts +18 -0
  256. package/lib/gio-form-file-picker/gio-form-file-picker-add-button/gio-form-file-picker-add-button.component.d.ts +5 -0
  257. package/lib/gio-form-file-picker/gio-form-file-picker-empty/gio-form-file-picker-empty.component.d.ts +5 -0
  258. package/lib/gio-form-file-picker/gio-form-file-picker-label/gio-form-file-picker-label.component.d.ts +5 -0
  259. package/lib/gio-form-file-picker/gio-form-file-picker.component.d.ts +43 -0
  260. package/lib/gio-form-file-picker/gio-form-file-picker.component.harness.d.ts +30 -0
  261. package/lib/gio-form-file-picker/gio-form-file-picker.model.d.ts +6 -0
  262. package/lib/gio-form-file-picker/gio-form-file-picker.module.d.ts +16 -0
  263. package/lib/gio-form-file-picker/index.d.ts +7 -0
  264. package/lib/gio-form-focus-first-invalid/gio-form-focus-first-invalid-ignore.directive.d.ts +6 -0
  265. package/lib/gio-form-focus-first-invalid/gio-form-focus-first-invalid.directive.d.ts +22 -0
  266. package/lib/gio-form-focus-first-invalid/gio-form-focus-first-invalid.module.d.ts +8 -0
  267. package/lib/gio-form-headers/gio-form-headers-label.component.d.ts +5 -0
  268. package/lib/gio-form-headers/gio-form-headers.component.d.ts +46 -0
  269. package/lib/gio-form-headers/gio-form-headers.harness.d.ts +39 -0
  270. package/lib/gio-form-headers/gio-form-headers.module.d.ts +20 -0
  271. package/lib/gio-form-json-schema/gio-form-json-schema.component.d.ts +43 -0
  272. package/lib/gio-form-json-schema/gio-form-json-schema.module.d.ts +35 -0
  273. package/lib/gio-form-json-schema/gio-formly-json-schema.service.d.ts +26 -0
  274. package/lib/gio-form-json-schema/model/GioJsonSchema.d.ts +47 -0
  275. package/lib/gio-form-json-schema/model/GioJsonSchemaContext.d.ts +1 -0
  276. package/lib/gio-form-json-schema/type-component/array-type.component.d.ts +10 -0
  277. package/lib/gio-form-json-schema/type-component/code-editor-type.component.d.ts +16 -0
  278. package/lib/gio-form-json-schema/type-component/cron-type.component.d.ts +9 -0
  279. package/lib/gio-form-json-schema/type-component/headers-type.component.d.ts +18 -0
  280. package/lib/gio-form-json-schema/type-component/multischema-type.component.d.ts +13 -0
  281. package/lib/gio-form-json-schema/type-component/null-type.component.d.ts +6 -0
  282. package/lib/gio-form-json-schema/type-component/object-type.component.d.ts +9 -0
  283. package/lib/gio-form-json-schema/type-component/toggle-type.component.d.ts +8 -0
  284. package/lib/gio-form-json-schema/util/validation-message.util.d.ts +15 -0
  285. package/lib/gio-form-json-schema/wrappers/gio-banner-extension.d.ts +2 -0
  286. package/lib/gio-form-json-schema/wrappers/gio-banner-wrapper.component.d.ts +6 -0
  287. package/lib/gio-form-json-schema/wrappers/gio-el-helper-wrapper.component.d.ts +11 -0
  288. package/lib/gio-form-json-schema/wrappers/gio-password-eye.component.d.ts +12 -0
  289. package/lib/gio-form-selection-inline/gio-form-selection-inline-card-content/gio-form-selection-inline-card-content.component.d.ts +15 -0
  290. package/lib/gio-form-selection-inline/gio-form-selection-inline-card.component.d.ts +17 -0
  291. package/lib/gio-form-selection-inline/gio-form-selection-inline-card.harness.d.ts +19 -0
  292. package/lib/gio-form-selection-inline/gio-form-selection-inline.component.d.ts +20 -0
  293. package/lib/gio-form-selection-inline/gio-form-selection-inline.harness.d.ts +26 -0
  294. package/lib/gio-form-selection-inline/gio-form-selection-inline.module.d.ts +14 -0
  295. package/lib/gio-form-selection-inline/public-api.d.ts +6 -0
  296. package/lib/gio-form-slide-toggle/gio-form-label.directive.d.ts +13 -0
  297. package/lib/gio-form-slide-toggle/gio-form-slide-toggle.component.d.ts +15 -0
  298. package/lib/gio-form-slide-toggle/gio-form-slide-toggle.module.d.ts +9 -0
  299. package/lib/gio-form-tags-input/gio-form-tags-input.component.d.ts +95 -0
  300. package/lib/gio-form-tags-input/gio-form-tags-input.harness.d.ts +23 -0
  301. package/lib/gio-form-tags-input/gio-form-tags-input.module.d.ts +16 -0
  302. package/lib/gio-icons/gio-icons.module.d.ts +11 -0
  303. package/lib/gio-license/gio-license-dialog/gio-license-dialog.component.d.ts +16 -0
  304. package/lib/gio-license/gio-license-dialog/gio-license-dialog.module.d.ts +12 -0
  305. package/lib/gio-license/gio-license.directive.d.ts +24 -0
  306. package/lib/gio-license/gio-license.module.d.ts +10 -0
  307. package/lib/gio-license/gio-license.service.d.ts +58 -0
  308. package/lib/gio-license/gio-license.testing.module.d.ts +24 -0
  309. package/lib/gio-license-expiration-notification/gio-license-expiration-notification.component.d.ts +17 -0
  310. package/lib/gio-license-expiration-notification/gio-license-expiration-notification.harness.d.ts +13 -0
  311. package/lib/gio-license-expiration-notification/gio-license-expiration-notification.module.d.ts +11 -0
  312. package/lib/gio-loader/gio-loader.component.d.ts +5 -0
  313. package/lib/gio-loader/gio-loader.module.d.ts +9 -0
  314. package/lib/gio-mat-config/gio-mat-config.module.d.ts +6 -0
  315. package/lib/gio-mat-config/index.d.ts +1 -0
  316. package/lib/gio-monaco-editor/gio-monaco-clipboard-copy.component.d.ts +7 -0
  317. package/lib/gio-monaco-editor/gio-monaco-editor-form-field.directive.d.ts +45 -0
  318. package/lib/gio-monaco-editor/gio-monaco-editor.component.d.ts +67 -0
  319. package/lib/gio-monaco-editor/gio-monaco-editor.harness.d.ts +19 -0
  320. package/lib/gio-monaco-editor/gio-monaco-editor.module.d.ts +20 -0
  321. package/lib/gio-monaco-editor/gio-monaco-editor.testing.component.d.ts +12 -0
  322. package/lib/gio-monaco-editor/models/GioMonacoEditorConfig.d.ts +7 -0
  323. package/lib/gio-monaco-editor/models/JSONSchemaAutoComplete.d.ts +39 -0
  324. package/lib/gio-monaco-editor/models/MonacoEditorTheme.d.ts +1 -0
  325. package/lib/gio-monaco-editor/services/gio-language-el.service.d.ts +18 -0
  326. package/lib/gio-monaco-editor/services/gio-language-json.service.d.ts +18 -0
  327. package/lib/gio-monaco-editor/services/gio-monaco-editor.service.d.ts +19 -0
  328. package/lib/gio-pipe/gio.pipe.module.d.ts +7 -0
  329. package/lib/gio-pipe/safe.pipe.d.ts +10 -0
  330. package/lib/gio-popover/gio-popover-trigger.directive.d.ts +12 -0
  331. package/lib/gio-popover/gio-popover.component.d.ts +15 -0
  332. package/lib/gio-popover/index.d.ts +2 -0
  333. package/lib/gio-popover/public-api.d.ts +2 -0
  334. package/lib/gio-prismjs/gio-prismjs.service.d.ts +14 -0
  335. package/lib/gio-save-bar/gio-save-bar.component.d.ts +30 -0
  336. package/lib/gio-save-bar/gio-save-bar.harness.d.ts +15 -0
  337. package/lib/gio-save-bar/gio-save-bar.module.d.ts +10 -0
  338. package/lib/oem-theme/gio-menu/gio-menu-footer/gio-menu-footer.component.d.ts +5 -0
  339. package/lib/oem-theme/gio-menu/gio-menu-header/gio-menu-header.component.d.ts +5 -0
  340. package/lib/oem-theme/gio-menu/gio-menu-item/gio-menu-item.component.d.ts +19 -0
  341. package/lib/oem-theme/gio-menu/gio-menu-license-expiration-notification/gio-menu-license-expiration-notification.component.d.ts +5 -0
  342. package/lib/oem-theme/gio-menu/gio-menu-list/gio-menu-list.component.d.ts +5 -0
  343. package/lib/oem-theme/gio-menu/gio-menu-search/gio-menu-search.component.d.ts +25 -0
  344. package/lib/oem-theme/gio-menu/gio-menu-search/gio-menu-search.harness.d.ts +10 -0
  345. package/lib/oem-theme/gio-menu/gio-menu-search/gio-menu-search.service.d.ts +9 -0
  346. package/lib/oem-theme/gio-menu/gio-menu-selector/gio-menu-selector.component.d.ts +17 -0
  347. package/lib/oem-theme/gio-menu/gio-menu-selector/gio-menu-selector.harness.d.ts +8 -0
  348. package/lib/oem-theme/gio-menu/gio-menu.component.d.ts +14 -0
  349. package/lib/oem-theme/gio-menu/gio-menu.module.d.ts +21 -0
  350. package/lib/oem-theme/gio-menu/gio-menu.service.d.ts +18 -0
  351. package/lib/oem-theme/gio-menu/index.d.ts +13 -0
  352. package/lib/oem-theme/gio-submenu/gio-submenu-group/gio-submenu-group.component.d.ts +8 -0
  353. package/lib/oem-theme/gio-submenu/gio-submenu-item/gio-submenu-item.component.d.ts +9 -0
  354. package/lib/oem-theme/gio-submenu/gio-submenu.component.d.ts +28 -0
  355. package/lib/oem-theme/gio-submenu/gio-submenu.module.d.ts +12 -0
  356. package/lib/oem-theme/gio-submenu/index.d.ts +4 -0
  357. package/lib/oem-theme/gio-top-bar/gio-top-bar-content/gio-top-bar-content.component.d.ts +8 -0
  358. package/lib/oem-theme/gio-top-bar/gio-top-bar-link/gio-top-bar-link.component.d.ts +7 -0
  359. package/lib/oem-theme/gio-top-bar/gio-top-bar-link/gio-top-bar-link.module.d.ts +10 -0
  360. package/lib/oem-theme/gio-top-bar/gio-top-bar-menu/gio-top-bar-menu.component.d.ts +5 -0
  361. package/lib/oem-theme/gio-top-bar/gio-top-bar-menu/gio-top-bar-menu.module.d.ts +8 -0
  362. package/lib/oem-theme/gio-top-bar/gio-top-bar.component.d.ts +8 -0
  363. package/lib/oem-theme/gio-top-bar/gio-top-bar.module.d.ts +11 -0
  364. package/lib/oem-theme/gio-top-bar/index.d.ts +7 -0
  365. package/lib/oem-theme/oem-theme.service.d.ts +22 -0
  366. package/lib/oem-theme/public-api.d.ts +4 -0
  367. package/lib/public-api.d.ts +66 -0
  368. package/package.json +15 -7
  369. package/public-api.d.ts +1 -0
  370. package/src/scss/gio-mat-theme.scss +1 -2
  371. package/testing/harnesses/div.harness.d.ts +21 -0
  372. package/testing/harnesses/index.d.ts +2 -0
  373. package/testing/harnesses/span.harness.d.ts +21 -0
  374. package/testing/index.d.ts +5 -47
  375. package/testing/public-api.d.ts +1 -0
@@ -0,0 +1,249 @@
1
+ /*
2
+ * Copyright (C) 2023 The Gravitee team (http://gravitee.io)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import Cronstrue from 'cronstrue/i18n';
17
+ import { isEmpty } from 'lodash';
18
+ export const CRON_DISPLAY_MODES = ['secondly', 'minutely', 'hourly', 'daily', 'weekly', 'monthly', 'custom'];
19
+ const DISPLAY_MODE_LIST = [
20
+ {
21
+ mode: 'secondly',
22
+ default: '*/1 * * * * *',
23
+ regex: /^(\*\/\d+\s)(\*\s){4}\*/,
24
+ },
25
+ {
26
+ mode: 'minutely',
27
+ default: '0 */1 * * * *',
28
+ regex: /^0\s\*\/\d+\s(\*\s){3}\*$/,
29
+ },
30
+ {
31
+ mode: 'hourly',
32
+ default: '0 0 */1 * * *',
33
+ regex: /^0\s\d+\s\*\/\d+\s(\*\s){2}\*$/,
34
+ },
35
+ {
36
+ mode: 'daily',
37
+ default: '0 0 0 */1 * *',
38
+ regex: /^0\s\d+\s\d+\s\*\/\d+\s\*\s\*$/,
39
+ },
40
+ {
41
+ mode: 'weekly',
42
+ default: '0 0 0 * * 0',
43
+ regex: /^(\d{1,2}\s){2,3}(\*\s){2}\d{1,2}$/,
44
+ },
45
+ {
46
+ mode: 'monthly',
47
+ default: '0 0 0 1 * *',
48
+ regex: /^(\d+\s){3,4}\*\s\*$/,
49
+ },
50
+ {
51
+ mode: 'custom',
52
+ default: '* * * * * *',
53
+ regex: /^.*$/,
54
+ },
55
+ ];
56
+ export const getDefaultCronDisplay = (mode) => {
57
+ const modeFound = DISPLAY_MODE_LIST.find(mf => mf.mode === mode);
58
+ if (!modeFound) {
59
+ throw new Error('Invalid cron mode.');
60
+ }
61
+ return parseCronExpression(modeFound.default);
62
+ };
63
+ export const parseCronExpression = (cronExpression) => {
64
+ throwIfInvalid(cronExpression);
65
+ const parts = cronExpression.split(' ');
66
+ // Normalize cron so that second segment is included.
67
+ if (cronExpression && cronExpression.split(' ').length === 6) {
68
+ parts.push('');
69
+ }
70
+ const hourInterval = getHourInterval(parts);
71
+ const minuteInterval = getMinuteInterval(parts);
72
+ const secondInterval = getSecondInterval(parts);
73
+ const dayInterval = getDayInterval(parts);
74
+ const dayOfWeek = getDayOfWeek(parts);
75
+ const dayOfMonth = getDayOfMonth(parts);
76
+ const hours = getHours(parts);
77
+ const minutes = getMinutes(parts);
78
+ const displayMode = getDisplayMode(cronExpression);
79
+ switch (displayMode.mode) {
80
+ case 'secondly':
81
+ return {
82
+ mode: 'secondly',
83
+ secondInterval,
84
+ };
85
+ case 'minutely':
86
+ return {
87
+ mode: 'minutely',
88
+ minuteInterval,
89
+ };
90
+ case 'hourly':
91
+ return {
92
+ mode: 'hourly',
93
+ hourInterval,
94
+ minutes,
95
+ };
96
+ case 'daily':
97
+ return {
98
+ mode: 'daily',
99
+ dayInterval,
100
+ hours,
101
+ minutes,
102
+ };
103
+ case 'weekly':
104
+ return {
105
+ mode: 'weekly',
106
+ dayOfWeek,
107
+ hours,
108
+ minutes,
109
+ };
110
+ case 'monthly':
111
+ return {
112
+ mode: 'monthly',
113
+ dayOfMonth,
114
+ hours,
115
+ minutes,
116
+ };
117
+ case 'custom':
118
+ return {
119
+ mode: 'custom',
120
+ customExpression: cronExpression,
121
+ };
122
+ }
123
+ };
124
+ export const toCronExpression = (cronDisplay) => {
125
+ switch (cronDisplay.mode) {
126
+ case 'secondly':
127
+ return `*/${cronDisplay.secondInterval} * * * * *`;
128
+ case 'minutely':
129
+ return `0 */${cronDisplay.minuteInterval} * * * *`;
130
+ case 'hourly':
131
+ return `0 ${cronDisplay.minutes} */${cronDisplay.hourInterval} * * *`;
132
+ case 'daily':
133
+ return `0 ${cronDisplay.minutes} ${cronDisplay.hours} */${cronDisplay.dayInterval} * *`;
134
+ case 'weekly':
135
+ return `0 ${cronDisplay.minutes} ${cronDisplay.hours} * * ${cronDisplay.dayOfWeek}`;
136
+ case 'monthly':
137
+ return `0 ${cronDisplay.minutes} ${cronDisplay.hours} ${cronDisplay.dayOfMonth} * *`;
138
+ case 'custom':
139
+ return `${cronDisplay.customExpression}`;
140
+ }
141
+ };
142
+ export const toCronDescription = (cronExpression) => {
143
+ throwIfInvalid(cronExpression);
144
+ if (!isEmpty(cronExpression)) {
145
+ return Cronstrue.toString(expandMisleadingSteps(cronExpression));
146
+ }
147
+ return '';
148
+ };
149
+ /**
150
+ * Expand step values (like *\/50) that don't evenly divide the field range
151
+ * into explicit value lists (like 0,50) so that cronstrue generates an accurate description.
152
+ *
153
+ * For example, *\/50 in the minutes field means "at every minute divisible by 50" (i.e. 0 and 50),
154
+ * NOT "every 50 minutes". Without this fix, cronstrue would display "Every 50 minutes" which is misleading.
155
+ *
156
+ * See: https://github.com/bradymholt/cRonstrue/issues/360
157
+ */
158
+ const expandMisleadingSteps = (cronExpression) => {
159
+ const parts = cronExpression.trim().split(/\s+/);
160
+ // Field ranges: [seconds, minutes, hours, day-of-month, month, day-of-week]
161
+ const fieldRanges = [60, 60, 24, undefined, undefined, undefined];
162
+ const expandedParts = parts.map((part, index) => {
163
+ const range = fieldRanges[index];
164
+ if (range === undefined)
165
+ return part;
166
+ const match = part.match(/^\*\/(\d+)$/);
167
+ if (!match)
168
+ return part;
169
+ const step = parseInt(match[1], 10);
170
+ if (step <= 0 || range % step === 0)
171
+ return part;
172
+ const values = [];
173
+ for (let v = 0; v < range; v += step) {
174
+ values.push(v);
175
+ }
176
+ return values.join(',');
177
+ });
178
+ return expandedParts.join(' ');
179
+ };
180
+ /**
181
+ * Simple validation to ensure that the cron expression has 6 parts.
182
+ * Note : The full cron expression validation is done by the backend.
183
+ */
184
+ const throwIfInvalid = (cronExpression) => {
185
+ const parts = cronExpression.trim().split(/\s+/);
186
+ if (parts.length != 6) {
187
+ throw new Error('Cron expression must have 6 parts.');
188
+ }
189
+ };
190
+ const getDisplayMode = (cronExpression) => {
191
+ const modeFound = DISPLAY_MODE_LIST.find(mf => {
192
+ const regex = mf.regex;
193
+ return regex.test(cronExpression);
194
+ });
195
+ if (!modeFound) {
196
+ throw new Error('Invalid cron expression.');
197
+ }
198
+ return {
199
+ mode: modeFound.mode,
200
+ default: modeFound.default,
201
+ };
202
+ };
203
+ const getSecondInterval = (expressionParts) => {
204
+ const v = getSegment(expressionParts[0])[0][1];
205
+ return typeof v === 'number' ? v : undefined;
206
+ };
207
+ const getMinuteInterval = (expressionParts) => {
208
+ const v = getSegment(expressionParts[1])[0][1];
209
+ return typeof v === 'number' ? v : undefined;
210
+ };
211
+ const getHourInterval = (expressionParts) => {
212
+ const v = getSegment(expressionParts[2])[0][1];
213
+ return typeof v === 'number' ? v : undefined;
214
+ };
215
+ const getDayInterval = (expressionParts) => {
216
+ const v = getSegment(expressionParts[3])[0][1];
217
+ return typeof v === 'number' ? v : undefined;
218
+ };
219
+ const getDayOfWeek = (expressionParts) => {
220
+ const v = getSegment(expressionParts[5])[0][0];
221
+ return typeof v === 'number' ? v : undefined;
222
+ };
223
+ const getDayOfMonth = (expressionParts) => {
224
+ const v = getSegment(expressionParts[3])[0][0];
225
+ return typeof v === 'number' ? v : undefined;
226
+ };
227
+ const getMinutes = (expressionParts) => {
228
+ const v = getSegment(expressionParts[1])[0][0];
229
+ return typeof v === 'number' ? v : undefined;
230
+ };
231
+ const getHours = (expressionParts) => {
232
+ const v = getSegment(expressionParts[2])[0][0];
233
+ return typeof v === 'number' ? v : undefined;
234
+ };
235
+ const getSegment = (value) => {
236
+ if (value === undefined) {
237
+ value = '*';
238
+ }
239
+ return value.split(',').map(s => {
240
+ if (s === undefined) {
241
+ s = '*';
242
+ }
243
+ return s.split('/').map(p => {
244
+ const v = parseInt(p, 10);
245
+ return isNaN(v) ? p : v;
246
+ });
247
+ });
248
+ };
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLWZvcm0tY3Jvbi5hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktcGFydGljbGVzLWFuZ3VsYXIvc3JjL2xpYi9naW8tZm9ybS1jcm9uL2dpby1mb3JtLWNyb24uYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sU0FBUyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFnQmpDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFHdEgsTUFBTSxpQkFBaUIsR0FJakI7SUFDSjtRQUNFLElBQUksRUFBRSxVQUFVO1FBQ2hCLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLEtBQUssRUFBRSx5QkFBeUI7S0FDakM7SUFDRDtRQUNFLElBQUksRUFBRSxVQUFVO1FBQ2hCLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLEtBQUssRUFBRSwyQkFBMkI7S0FDbkM7SUFDRDtRQUNFLElBQUksRUFBRSxRQUFRO1FBQ2QsT0FBTyxFQUFFLGVBQWU7UUFDeEIsS0FBSyxFQUFFLGdDQUFnQztLQUN4QztJQUNEO1FBQ0UsSUFBSSxFQUFFLE9BQU87UUFDYixPQUFPLEVBQUUsZUFBZTtRQUN4QixLQUFLLEVBQUUsZ0NBQWdDO0tBQ3hDO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsUUFBUTtRQUNkLE9BQU8sRUFBRSxhQUFhO1FBQ3RCLEtBQUssRUFBRSxvQ0FBb0M7S0FDNUM7SUFDRDtRQUNFLElBQUksRUFBRSxTQUFTO1FBQ2YsT0FBTyxFQUFFLGFBQWE7UUFDdEIsS0FBSyxFQUFFLHNCQUFzQjtLQUM5QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLFFBQVE7UUFD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QU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxlQUF5QixFQUFzQixFQUFFO0lBQ3hFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsQ0FBQyxlQUF5QixFQUFzQixFQUFFO0lBQ3ZFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUcsQ0FBQyxlQUF5QixFQUFzQixFQUFFO0lBQ3JFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxhQUFhLEdBQUcsQ0FBQyxlQUF5QixFQUFzQixFQUFFO0lBQ3RFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxlQUF5QixFQUFzQixFQUFFO0lBQ25FLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxlQUF5QixFQUFzQixFQUFFO0lBQ2pFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFhLEVBQWlDLEVBQUU7SUFDbEUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEIsS0FBSyxHQUFHLEdBQUcsQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzlCLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDVixDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMxQixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBDcm9uc3RydWUgZnJvbSAnY3JvbnN0cnVlL2kxOG4nO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gJ2xvZGFzaCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JvbkRpc3BsYXkge1xuICBtb2RlOiBDcm9uRGlzcGxheU1vZGU7XG5cbiAgc2Vjb25kSW50ZXJ2YWw/OiBudW1iZXI7XG4gIG1pbnV0ZUludGVydmFsPzogbnVtYmVyO1xuICBob3VySW50ZXJ2YWw/OiBudW1iZXI7XG4gIGRheUludGVydmFsPzogbnVtYmVyO1xuICBkYXlPZldlZWs/OiBudW1iZXI7XG4gIGRheU9mTW9udGg/OiBudW1iZXI7XG4gIGN1c3RvbUV4cHJlc3Npb24/OiBzdHJpbmc7XG5cbiAgaG91cnM/OiBudW1iZXI7XG4gIG1pbnV0ZXM/OiBudW1iZXI7XG59XG5leHBvcnQgY29uc3QgQ1JPTl9ESVNQTEFZX01PREVTID0gWydzZWNvbmRseScsICdtaW51dGVseScsICdob3VybHknLCAnZGFpbHknLCAnd2Vla2x5JywgJ21vbnRobHknLCAnY3VzdG9tJ10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBDcm9uRGlzcGxheU1vZGUgPSAodHlwZW9mIENST05fRElTUExBWV9NT0RFUylbbnVtYmVyXTtcblxuY29uc3QgRElTUExBWV9NT0RFX0xJU1Q6IHtcbiAgbW9kZTogQ3JvbkRpc3BsYXlNb2RlO1xuICBkZWZhdWx0OiBzdHJpbmc7XG4gIHJlZ2V4OiBSZWdFeHA7XG59W10gPSBbXG4gIHtcbiAgICBtb2RlOiAnc2Vjb25kbHknLFxuICAgIGRlZmF1bHQ6ICcqLzEgKiAqICogKiAqJyxcbiAgICByZWdleDogL14oXFwqXFwvXFxkK1xccykoXFwqXFxzKXs0fVxcKi8sXG4gIH0sXG4gIHtcbiAgICBtb2RlOiAnbWludXRlbHknLFxuICAgIGRlZmF1bHQ6ICcwICovMSAqICogKiAqJyxcbiAgICByZWdleDogL14wXFxzXFwqXFwvXFxkK1xccyhcXCpcXHMpezN9XFwqJC8sXG4gIH0sXG4gIHtcbiAgICBtb2RlOiAnaG91cmx5JyxcbiAgICBkZWZhdWx0OiAnMCAwICovMSAqICogKicsXG4gICAgcmVnZXg6IC9eMFxcc1xcZCtcXHNcXCpcXC9cXGQrXFxzKFxcKlxccyl7Mn1cXCokLyxcbiAgfSxcbiAge1xuICAgIG1vZGU6ICdkYWlseScsXG4gICAgZGVmYXVsdDogJzAgMCAwICovMSAqIConLFxuICAgIHJlZ2V4OiAvXjBcXHNcXGQrXFxzXFxkK1xcc1xcKlxcL1xcZCtcXHNcXCpcXHNcXCokLyxcbiAgfSxcbiAge1xuICAgIG1vZGU6ICd3ZWVrbHknLFxuICAgIGRlZmF1bHQ6ICcwIDAgMCAqICogMCcsXG4gICAgcmVnZXg6IC9eKFxcZHsxLDJ9XFxzKXsyLDN9KFxcKlxccyl7Mn1cXGR7MSwyfSQvLFxuICB9LFxuICB7XG4gICAgbW9kZTogJ21vbnRobHknLFxuICAgIGRlZmF1bHQ6ICcwIDAgMCAxICogKicsXG4gICAgcmVnZXg6IC9eKFxcZCtcXHMpezMsNH1cXCpcXHNcXCokLyxcbiAgfSxcbiAge1xuICAgIG1vZGU6ICdjdXN0b20nLFxuICAgIGRlZmF1bHQ6ICcqICogKiAqICogKicsXG4gICAgcmVnZXg6IC9eLiokLyxcbiAgfSxcbl07XG5cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0Q3JvbkRpc3BsYXkgPSAobW9kZTogQ3JvbkRpc3BsYXlNb2RlKTogQ3JvbkRpc3BsYXkgPT4ge1xuICBjb25zdCBtb2RlRm91bmQgPSBESVNQTEFZX01PREVfTElTVC5maW5kKG1mID0+IG1mLm1vZGUgPT09IG1vZGUpO1xuICBpZiAoIW1vZGVGb3VuZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjcm9uIG1vZGUuJyk7XG4gIH1cblxuICByZXR1cm4gcGFyc2VDcm9uRXhwcmVzc2lvbihtb2RlRm91bmQuZGVmYXVsdCk7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VDcm9uRXhwcmVzc2lvbiA9IChjcm9uRXhwcmVzc2lvbjogc3RyaW5nKTogQ3JvbkRpc3BsYXkgPT4ge1xuICB0aHJvd0lmSW52YWxpZChjcm9uRXhwcmVzc2lvbik7XG5cbiAgY29uc3QgcGFydHMgPSBjcm9uRXhwcmVzc2lvbi5zcGxpdCgnICcpO1xuXG4gIC8vIE5vcm1hbGl6ZSBjcm9uIHNvIHRoYXQgc2Vjb25kIHNlZ21lbnQgaXMgaW5jbHVkZWQuXG4gIGlmIChjcm9uRXhwcmVzc2lvbiAmJiBjcm9uRXhwcmVzc2lvbi5zcGxpdCgnICcpLmxlbmd0aCA9PT0gNikge1xuICAgIHBhcnRzLnB1c2goJycpO1xuICB9XG5cbiAgY29uc3QgaG91ckludGVydmFsID0gZ2V0SG91ckludGVydmFsKHBhcnRzKTtcbiAgY29uc3QgbWludXRlSW50ZXJ2YWwgPSBnZXRNaW51dGVJbnRlcnZhbChwYXJ0cyk7XG4gIGNvbnN0IHNlY29uZEludGVydmFsID0gZ2V0U2Vjb25kSW50ZXJ2YWwocGFydHMpO1xuICBjb25zdCBkYXlJbnRlcnZhbCA9IGdldERheUludGVydmFsKHBhcnRzKTtcbiAgY29uc3QgZGF5T2ZXZWVrID0gZ2V0RGF5T2ZXZWVrKHBhcnRzKTtcbiAgY29uc3QgZGF5T2ZNb250aCA9IGdldERheU9mTW9udGgocGFydHMpO1xuXG4gIGNvbnN0IGhvdXJzID0gZ2V0SG91cnMocGFydHMpO1xuICBjb25zdCBtaW51dGVzID0gZ2V0TWludXRlcyhwYXJ0cyk7XG5cbiAgY29uc3QgZGlzcGxheU1vZGUgPSBnZXREaXNwbGF5TW9kZShjcm9uRXhwcmVzc2lvbik7XG5cbiAgc3dpdGNoIChkaXNwbGF5TW9kZS5tb2RlKSB7XG4gICAgY2FzZSAnc2Vjb25kbHknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZTogJ3NlY29uZGx5JyxcbiAgICAgICAgc2Vjb25kSW50ZXJ2YWwsXG4gICAgICB9O1xuICAgIGNhc2UgJ21pbnV0ZWx5JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vZGU6ICdtaW51dGVseScsXG4gICAgICAgIG1pbnV0ZUludGVydmFsLFxuICAgICAgfTtcbiAgICBjYXNlICdob3VybHknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZTogJ2hvdXJseScsXG4gICAgICAgIGhvdXJJbnRlcnZhbCxcbiAgICAgICAgbWludXRlcyxcbiAgICAgIH07XG4gICAgY2FzZSAnZGFpbHknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZTogJ2RhaWx5JyxcbiAgICAgICAgZGF5SW50ZXJ2YWwsXG4gICAgICAgIGhvdXJzLFxuICAgICAgICBtaW51dGVzLFxuICAgICAgfTtcbiAgICBjYXNlICd3ZWVrbHknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZTogJ3dlZWtseScsXG4gICAgICAgIGRheU9mV2VlayxcbiAgICAgICAgaG91cnMsXG4gICAgICAgIG1pbnV0ZXMsXG4gICAgICB9O1xuICAgIGNhc2UgJ21vbnRobHknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZTogJ21vbnRobHknLFxuICAgICAgICBkYXlPZk1vbnRoLFxuICAgICAgICBob3VycyxcbiAgICAgICAgbWludXRlcyxcbiAgICAgIH07XG4gICAgY2FzZSAnY3VzdG9tJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vZGU6ICdjdXN0b20nLFxuICAgICAgICBjdXN0b21FeHByZXNzaW9uOiBjcm9uRXhwcmVzc2lvbixcbiAgICAgIH07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0b0Nyb25FeHByZXNzaW9uID0gKGNyb25EaXNwbGF5OiBPbWl0PENyb25EaXNwbGF5LCAnY3JvbkRlc2NyaXB0aW9uJz4pOiBzdHJpbmcgPT4ge1xuICBzd2l0Y2ggKGNyb25EaXNwbGF5Lm1vZGUpIHtcbiAgICBjYXNlICdzZWNvbmRseSc6XG4gICAgICByZXR1cm4gYCovJHtjcm9uRGlzcGxheS5zZWNvbmRJbnRlcnZhbH0gKiAqICogKiAqYDtcbiAgICBjYXNlICdtaW51dGVseSc6XG4gICAgICByZXR1cm4gYDAgKi8ke2Nyb25EaXNwbGF5Lm1pbnV0ZUludGVydmFsfSAqICogKiAqYDtcbiAgICBjYXNlICdob3VybHknOlxuICAgICAgcmV0dXJuIGAwICR7Y3JvbkRpc3BsYXkubWludXRlc30gKi8ke2Nyb25EaXNwbGF5LmhvdXJJbnRlcnZhbH0gKiAqICpgO1xuICAgIGNhc2UgJ2RhaWx5JzpcbiAgICAgIHJldHVybiBgMCAke2Nyb25EaXNwbGF5Lm1pbnV0ZXN9ICR7Y3JvbkRpc3BsYXkuaG91cnN9ICovJHtjcm9uRGlzcGxheS5kYXlJbnRlcnZhbH0gKiAqYDtcbiAgICBjYXNlICd3ZWVrbHknOlxuICAgICAgcmV0dXJuIGAwICR7Y3JvbkRpc3BsYXkubWludXRlc30gJHtjcm9uRGlzcGxheS5ob3Vyc30gKiAqICR7Y3JvbkRpc3BsYXkuZGF5T2ZXZWVrfWA7XG4gICAgY2FzZSAnbW9udGhseSc6XG4gICAgICByZXR1cm4gYDAgJHtjcm9uRGlzcGxheS5taW51dGVzfSAke2Nyb25EaXNwbGF5LmhvdXJzfSAke2Nyb25EaXNwbGF5LmRheU9mTW9udGh9ICogKmA7XG4gICAgY2FzZSAnY3VzdG9tJzpcbiAgICAgIHJldHVybiBgJHtjcm9uRGlzcGxheS5jdXN0b21FeHByZXNzaW9ufWA7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0b0Nyb25EZXNjcmlwdGlvbiA9IChjcm9uRXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdGhyb3dJZkludmFsaWQoY3JvbkV4cHJlc3Npb24pO1xuXG4gIGlmICghaXNFbXB0eShjcm9uRXhwcmVzc2lvbikpIHtcbiAgICByZXR1cm4gQ3JvbnN0cnVlLnRvU3RyaW5nKGV4cGFuZE1pc2xlYWRpbmdTdGVwcyhjcm9uRXhwcmVzc2lvbikpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufTtcblxuLyoqXG4gKiBFeHBhbmQgc3RlcCB2YWx1ZXMgKGxpa2UgKlxcLzUwKSB0aGF0IGRvbid0IGV2ZW5seSBkaXZpZGUgdGhlIGZpZWxkIHJhbmdlXG4gKiBpbnRvIGV4cGxpY2l0IHZhbHVlIGxpc3RzIChsaWtlIDAsNTApIHNvIHRoYXQgY3JvbnN0cnVlIGdlbmVyYXRlcyBhbiBhY2N1cmF0ZSBkZXNjcmlwdGlvbi5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgKlxcLzUwIGluIHRoZSBtaW51dGVzIGZpZWxkIG1lYW5zIFwiYXQgZXZlcnkgbWludXRlIGRpdmlzaWJsZSBieSA1MFwiIChpLmUuIDAgYW5kIDUwKSxcbiAqIE5PVCBcImV2ZXJ5IDUwIG1pbnV0ZXNcIi4gV2l0aG91dCB0aGlzIGZpeCwgY3JvbnN0cnVlIHdvdWxkIGRpc3BsYXkgXCJFdmVyeSA1MCBtaW51dGVzXCIgd2hpY2ggaXMgbWlzbGVhZGluZy5cbiAqXG4gKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9icmFkeW1ob2x0L2NSb25zdHJ1ZS9pc3N1ZXMvMzYwXG4gKi9cbmNvbnN0IGV4cGFuZE1pc2xlYWRpbmdTdGVwcyA9IChjcm9uRXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFydHMgPSBjcm9uRXhwcmVzc2lvbi50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgLy8gRmllbGQgcmFuZ2VzOiBbc2Vjb25kcywgbWludXRlcywgaG91cnMsIGRheS1vZi1tb250aCwgbW9udGgsIGRheS1vZi13ZWVrXVxuICBjb25zdCBmaWVsZFJhbmdlcyA9IFs2MCwgNjAsIDI0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkXTtcblxuICBjb25zdCBleHBhbmRlZFBhcnRzID0gcGFydHMubWFwKChwYXJ0LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHJhbmdlID0gZmllbGRSYW5nZXNbaW5kZXhdO1xuICAgIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gcGFydDtcblxuICAgIGNvbnN0IG1hdGNoID0gcGFydC5tYXRjaCgvXlxcKlxcLyhcXGQrKSQvKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gcGFydDtcblxuICAgIGNvbnN0IHN0ZXAgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICAgIGlmIChzdGVwIDw9IDAgfHwgcmFuZ2UgJSBzdGVwID09PSAwKSByZXR1cm4gcGFydDtcblxuICAgIGNvbnN0IHZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCB2ID0gMDsgdiA8IHJhbmdlOyB2ICs9IHN0ZXApIHtcbiAgICAgIHZhbHVlcy5wdXNoKHYpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzLmpvaW4oJywnKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGV4cGFuZGVkUGFydHMuam9pbignICcpO1xufTtcblxuLyoqXG4gKiBTaW1wbGUgdmFsaWRhdGlvbiB0byBlbnN1cmUgdGhhdCB0aGUgY3JvbiBleHByZXNzaW9uIGhhcyA2IHBhcnRzLlxuICogTm90ZSA6IFRoZSBmdWxsIGNyb24gZXhwcmVzc2lvbiB2YWxpZGF0aW9uIGlzIGRvbmUgYnkgdGhlIGJhY2tlbmQuXG4gKi9cbmNvbnN0IHRocm93SWZJbnZhbGlkID0gKGNyb25FeHByZXNzaW9uOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgY29uc3QgcGFydHMgPSBjcm9uRXhwcmVzc2lvbi50cmltKCkuc3BsaXQoL1xccysvKTtcblxuICBpZiAocGFydHMubGVuZ3RoICE9IDYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nyb24gZXhwcmVzc2lvbiBtdXN0IGhhdmUgNiBwYXJ0cy4nKTtcbiAgfVxufTtcblxuY29uc3QgZ2V0RGlzcGxheU1vZGUgPSAoXG4gIGNyb25FeHByZXNzaW9uOiBzdHJpbmcsXG4pOiB7XG4gIG1vZGU6IENyb25EaXNwbGF5TW9kZTtcbiAgZGVmYXVsdDogc3RyaW5nO1xufSA9PiB7XG4gIGNvbnN0IG1vZGVGb3VuZCA9IERJU1BMQVlfTU9ERV9MSVNULmZpbmQobWYgPT4ge1xuICAgIGNvbnN0IHJlZ2V4ID0gbWYucmVnZXg7XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QoY3JvbkV4cHJlc3Npb24pO1xuICB9KTtcblxuICBpZiAoIW1vZGVGb3VuZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjcm9uIGV4cHJlc3Npb24uJyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vZGU6IG1vZGVGb3VuZC5tb2RlLFxuICAgIGRlZmF1bHQ6IG1vZGVGb3VuZC5kZWZhdWx0LFxuICB9O1xufTtcblxuY29uc3QgZ2V0U2Vjb25kSW50ZXJ2YWwgPSAoZXhwcmVzc2lvblBhcnRzOiBzdHJpbmdbXSk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHYgPSBnZXRTZWdtZW50KGV4cHJlc3Npb25QYXJ0c1swXSlbMF1bMV07XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogdW5kZWZpbmVkO1xufTtcblxuY29uc3QgZ2V0TWludXRlSW50ZXJ2YWwgPSAoZXhwcmVzc2lvblBhcnRzOiBzdHJpbmdbXSk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHYgPSBnZXRTZWdtZW50KGV4cHJlc3Npb25QYXJ0c1sxXSlbMF1bMV07XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogdW5kZWZpbmVkO1xufTtcblxuY29uc3QgZ2V0SG91ckludGVydmFsID0gKGV4cHJlc3Npb25QYXJ0czogc3RyaW5nW10pOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB2ID0gZ2V0U2VnbWVudChleHByZXNzaW9uUGFydHNbMl0pWzBdWzFdO1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGdldERheUludGVydmFsID0gKGV4cHJlc3Npb25QYXJ0czogc3RyaW5nW10pOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB2ID0gZ2V0U2VnbWVudChleHByZXNzaW9uUGFydHNbM10pWzBdWzFdO1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGdldERheU9mV2VlayA9IChleHByZXNzaW9uUGFydHM6IHN0cmluZ1tdKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgdiA9IGdldFNlZ21lbnQoZXhwcmVzc2lvblBhcnRzWzVdKVswXVswXTtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSAnbnVtYmVyJyA/IHYgOiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBnZXREYXlPZk1vbnRoID0gKGV4cHJlc3Npb25QYXJ0czogc3RyaW5nW10pOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB2ID0gZ2V0U2VnbWVudChleHByZXNzaW9uUGFydHNbM10pWzBdWzBdO1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGdldE1pbnV0ZXMgPSAoZXhwcmVzc2lvblBhcnRzOiBzdHJpbmdbXSk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHYgPSBnZXRTZWdtZW50KGV4cHJlc3Npb25QYXJ0c1sxXSlbMF1bMF07XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogdW5kZWZpbmVkO1xufTtcblxuY29uc3QgZ2V0SG91cnMgPSAoZXhwcmVzc2lvblBhcnRzOiBzdHJpbmdbXSk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHYgPSBnZXRTZWdtZW50KGV4cHJlc3Npb25QYXJ0c1syXSlbMF1bMF07XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogdW5kZWZpbmVkO1xufTtcblxuY29uc3QgZ2V0U2VnbWVudCA9ICh2YWx1ZTogc3RyaW5nKTogQXJyYXk8QXJyYXk8c3RyaW5nIHwgbnVtYmVyPj4gPT4ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHZhbHVlID0gJyonO1xuICB9XG4gIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcChzID0+IHtcbiAgICBpZiAocyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzID0gJyonO1xuICAgIH1cbiAgICByZXR1cm4gcy5zcGxpdCgnLycpLm1hcChwID0+IHtcbiAgICAgIGNvbnN0IHYgPSBwYXJzZUludChwLCAxMCk7XG4gICAgICByZXR1cm4gaXNOYU4odikgPyBwIDogdjtcbiAgICB9KTtcbiAgfSk7XG59O1xuIl19
@@ -0,0 +1,211 @@
1
+ import { Component, HostBinding, forwardRef } from '@angular/core';
2
+ import { UntypedFormControl, UntypedFormGroup, NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
3
+ import { isEmpty, range } from 'lodash';
4
+ import { Subject } from 'rxjs';
5
+ import { filter, takeUntil, tap } from 'rxjs/operators';
6
+ import { getDefaultCronDisplay, parseCronExpression, toCronDescription, toCronExpression } from './gio-form-cron.adapter';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/cdk/a11y";
9
+ import * as i2 from "@angular/common";
10
+ import * as i3 from "@angular/forms";
11
+ import * as i4 from "@angular/material/button-toggle";
12
+ import * as i5 from "@angular/material/input";
13
+ import * as i6 from "@angular/material/select";
14
+ import * as i7 from "@angular/material/autocomplete";
15
+ import * as i8 from "@angular/material/button";
16
+ import * as i9 from "@angular/material/tooltip";
17
+ import * as i10 from "@angular/material/icon";
18
+ export class GioFormCronComponent {
19
+ constructor(elRef, fm, ngZone, cdr) {
20
+ this.elRef = elRef;
21
+ this.fm = fm;
22
+ this.ngZone = ngZone;
23
+ this.cdr = cdr;
24
+ this._onChange = () => ({});
25
+ this._onTouched = () => ({});
26
+ this.seconds = [...range(0, 60)];
27
+ this.minutes = [...range(0, 60)];
28
+ this.hours = [...range(0, 24)];
29
+ this.daysOfMonth = [...range(1, 32)];
30
+ this.daysOfWeek = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
31
+ this.isDisabled = false;
32
+ this.smallDisplay = false;
33
+ this.touched = false;
34
+ this.focused = false;
35
+ this.hasError = false;
36
+ this.unsubscribe$ = new Subject();
37
+ fm.monitor(elRef.nativeElement, true)
38
+ .pipe(takeUntil(this.unsubscribe$))
39
+ .subscribe(origin => {
40
+ this.focused = !!origin;
41
+ this._onTouched();
42
+ this.touched = true;
43
+ });
44
+ }
45
+ ngOnInit() {
46
+ if (window.ResizeObserver) {
47
+ this.resizeObserver = new ResizeObserver(entries => {
48
+ this.ngZone.run(() => {
49
+ const width = entries[0].contentRect.width;
50
+ this.smallDisplay = width < 580;
51
+ this.cdr.markForCheck();
52
+ });
53
+ });
54
+ this.resizeObserver.observe(this.elRef.nativeElement);
55
+ }
56
+ this.internalFormGroup = new UntypedFormGroup({
57
+ mode: new UntypedFormControl(),
58
+ secondInterval: new UntypedFormControl(),
59
+ minuteInterval: new UntypedFormControl(),
60
+ hourInterval: new UntypedFormControl(),
61
+ dayInterval: new UntypedFormControl(),
62
+ dayOfWeek: new UntypedFormControl(),
63
+ dayOfMonth: new UntypedFormControl(),
64
+ hours: new UntypedFormControl(),
65
+ minutes: new UntypedFormControl(),
66
+ customExpression: new UntypedFormControl(),
67
+ });
68
+ this.isDisabled ? this.internalFormGroup.disable({ emitEvent: false }) : this.internalFormGroup.enable({ emitEvent: false });
69
+ this.internalFormGroup
70
+ .get('mode')
71
+ ?.valueChanges.pipe(filter(mode => !!mode), tap(mode => {
72
+ this.cronDisplay = getDefaultCronDisplay(mode);
73
+ this.refreshInternalForm();
74
+ }), takeUntil(this.unsubscribe$))
75
+ .subscribe();
76
+ this.internalFormGroup.valueChanges
77
+ ?.pipe(tap(value => {
78
+ this.hasError = false;
79
+ if (!value?.mode) {
80
+ this._onChange(null);
81
+ return;
82
+ }
83
+ try {
84
+ this.value = toCronExpression({
85
+ mode: value.mode,
86
+ secondInterval: value.secondInterval,
87
+ minuteInterval: value.minuteInterval,
88
+ hourInterval: value.hourInterval,
89
+ dayInterval: value.dayInterval,
90
+ dayOfWeek: value.dayOfWeek,
91
+ dayOfMonth: value.dayOfMonth,
92
+ customExpression: value.customExpression,
93
+ hours: value.hours,
94
+ minutes: value.minutes,
95
+ });
96
+ this.expressionDescription = toCronDescription(this.value);
97
+ this._onChange(this.value);
98
+ }
99
+ catch (error) {
100
+ this.hasError = true;
101
+ this.expressionDescription = `${error}` ?? 'Invalid cron expression.';
102
+ this._onChange(null);
103
+ }
104
+ }), takeUntil(this.unsubscribe$))
105
+ .subscribe();
106
+ this.refreshInternalForm();
107
+ }
108
+ ngOnDestroy() {
109
+ this.fm.stopMonitoring(this.elRef.nativeElement);
110
+ this.resizeObserver?.unobserve(this.elRef.nativeElement);
111
+ this.unsubscribe$.next();
112
+ this.unsubscribe$.complete();
113
+ }
114
+ // From ControlValueAccessor interface
115
+ writeValue(value) {
116
+ if (isEmpty(value)) {
117
+ this.onClear();
118
+ return;
119
+ }
120
+ try {
121
+ this.value = value;
122
+ this.cronDisplay = parseCronExpression(value);
123
+ this.expressionDescription = toCronDescription(this.value);
124
+ this.refreshInternalForm();
125
+ }
126
+ catch (error) {
127
+ this.hasError = true;
128
+ this.expressionDescription = `${error}` ?? 'Invalid cron expression.';
129
+ }
130
+ }
131
+ // From ControlValueAccessor interface
132
+ registerOnChange(fn) {
133
+ this._onChange = fn;
134
+ }
135
+ // From ControlValueAccessor interface
136
+ registerOnTouched(fn) {
137
+ this._onTouched = fn;
138
+ }
139
+ // From ControlValueAccessor interface
140
+ setDisabledState(isDisabled) {
141
+ this.isDisabled = isDisabled;
142
+ this.refreshInternalForm();
143
+ }
144
+ validate(_) {
145
+ return this.hasError ? { invalid: true } : null;
146
+ }
147
+ onClear({ touched } = {}) {
148
+ this.value = undefined;
149
+ this.cronDisplay = undefined;
150
+ this.internalFormGroup?.reset({}, { emitEvent: true });
151
+ if (touched) {
152
+ this.touched = true;
153
+ this._onTouched();
154
+ }
155
+ }
156
+ refreshInternalForm() {
157
+ if (!this.internalFormGroup)
158
+ return;
159
+ this.isDisabled ? this.internalFormGroup.disable({ emitEvent: false }) : this.internalFormGroup.enable({ emitEvent: false });
160
+ const d = this.cronDisplay;
161
+ if (d) {
162
+ this.internalFormGroup.patchValue({
163
+ mode: d.mode,
164
+ customExpression: d.customExpression,
165
+ secondInterval: d.secondInterval,
166
+ minuteInterval: d.minuteInterval,
167
+ hourInterval: d.hourInterval,
168
+ dayInterval: d.dayInterval,
169
+ dayOfWeek: d.dayOfWeek,
170
+ dayOfMonth: d.dayOfMonth,
171
+ hours: d.hours,
172
+ minutes: d.minutes,
173
+ }, { emitEvent: false });
174
+ }
175
+ }
176
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioFormCronComponent, deps: [{ token: i0.ElementRef }, { token: i1.FocusMonitor }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
177
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: GioFormCronComponent, isStandalone: false, selector: "gio-form-cron", host: { properties: { "class.disabled": "this.isDisabled", "class.smallDisplay": "this.smallDisplay" } }, providers: [
178
+ {
179
+ provide: NG_VALUE_ACCESSOR,
180
+ useExisting: forwardRef(() => GioFormCronComponent),
181
+ multi: true,
182
+ },
183
+ {
184
+ provide: NG_VALIDATORS,
185
+ useExisting: forwardRef(() => GioFormCronComponent),
186
+ multi: true,
187
+ },
188
+ ], ngImport: i0, template: "<!--\n\n Copyright (C) 2015 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<div class=\"label\"><ng-content select=\"gio-form-cron-label\"></ng-content></div>\n<div class=\"wrapper\" [class.smallDisplay]=\"smallDisplay\" [class.disabled]=\"isDisabled\">\n <ng-container *ngIf=\"internalFormGroup\" [formGroup]=\"internalFormGroup\">\n <div class=\"menu\">\n <mat-button-toggle-group\n class=\"gio-button-toggle-group menu__mode\"\n name=\"mode\"\n aria-label=\"Cron mode\"\n formControlName=\"mode\"\n [hideSingleSelectionIndicator]=\"true\"\n >\n <mat-button-toggle value=\"secondly\" matTooltip=\"Secondly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 's' : 'Secondly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"minutely\" matTooltip=\"Minutely\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'm' : 'Minutely'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"hourly\" matTooltip=\"Hourly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'h' : 'Hourly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"daily\" matTooltip=\"Daily\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'D' : 'Daily'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"weekly\" matTooltip=\"Weekly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'W' : 'Weekly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"monthly\" matTooltip=\"Monthly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'M' : 'Monthly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"custom\" matTooltip=\"Custom\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'C' : 'Custom'\n }}</mat-button-toggle>\n </mat-button-toggle-group>\n <button\n *ngIf=\"value && !isDisabled\"\n mat-button\n aria-label=\"Clear\"\n matTooltip=\"Clear\"\n type=\"button\"\n (click)=\"onClear({ touched: true })\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <ng-container [ngSwitch]=\"internalFormGroup.get('mode')?.value\">\n <ng-container *ngSwitchCase=\"'secondly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Second</mat-label>\n <mat-select formControlName=\"secondInterval\">\n <mat-option *ngFor=\"let second of seconds\" [value]=\"second\">{{ second }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'minutely'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minute(s)</mat-label>\n <mat-select formControlName=\"minuteInterval\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'hourly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hour(s)</mat-label>\n <mat-select formControlName=\"hourInterval\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minute(s)</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'daily'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Day(s)</mat-label>\n <mat-select formControlName=\"dayInterval\">\n <mat-option *ngFor=\"let day of daysOfMonth\" [value]=\"day\">{{ day }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\"> at </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hour(s)</mat-label>\n <mat-select formControlName=\"hours\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minute(s)</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'weekly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-medium\">\n <mat-label>Day of the week</mat-label>\n <mat-select formControlName=\"dayOfWeek\">\n <mat-option *ngFor=\"let day of daysOfWeek; let index = index\" [value]=\"index\">{{ day }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\"> at </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hours</mat-label>\n <mat-select formControlName=\"hours\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minutes</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'monthly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">On the </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Day(s)</mat-label>\n <mat-select formControlName=\"dayOfMonth\">\n <mat-option *ngFor=\"let day of daysOfMonth\" [value]=\"day\">{{ day }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\"> of every month at </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hours</mat-label>\n <mat-select formControlName=\"hours\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minutes</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'custom'\">\n <div class=\"modeForm\">\n <mat-form-field class=\"modeForm__field-custom\">\n <mat-label>Cron expression</mat-label>\n <input matInput formControlName=\"customExpression\" placeholder=\"* * * * * *\" />\n </mat-form-field>\n </div>\n </ng-container>\n </ng-container>\n\n <div *ngIf=\"value; else placeholder\" class=\"preview\">\n <span *ngIf=\"internalFormGroup.get('mode')?.value !== 'custom'\" class=\"preview__value\">\n {{ value }}\n </span>\n <span class=\"preview__hint\">{{ expressionDescription }}</span>\n </div>\n </ng-container>\n\n <ng-template #placeholder>\n <div class=\"placeholder\">No cron expression defined.</div>\n </ng-template>\n</div>\n<div class=\"hint\"><ng-content select=\"gio-form-cron-hint\"></ng-content></div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;min-width:342px;flex-direction:column}::ng-deep gio-form-cron{--mat-form-field-container-height: 48px;--mat-form-field-filled-label-display: none;--mat-form-field-container-vertical-padding: 12px;--mat-form-field-filled-with-label-container-padding-top: 12px;--mat-form-field-filled-with-label-container-padding-bottom: 12px}.label{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;padding-left:10px;color:var(--mdc-outlined-text-field-label-text-color)}.label:empty{display:none}.wrapper{display:inline-flex;flex-direction:column;padding:8px;border:1px solid var(--mdc-outlined-text-field-outline-color);border-radius:4px}.wrapper:hover:not(.disabled){padding:8px;border:1px solid var(--mdc-outlined-text-field-hover-outline-color)}.wrapper .menu{display:inline-flex;align-items:center;justify-content:space-between;margin-bottom:4px}.wrapper .menu__mode{border:none;margin-bottom:0}.wrapper .modeForm{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:8px;column-gap:4px}.wrapper .modeForm__field-small,.wrapper .modeForm__field-medium,.wrapper .modeForm__field-custom{display:inline-block;height:52px}.wrapper .modeForm__field-small{width:124px}.wrapper .modeForm__field-medium{width:158px}.wrapper .modeForm__field-custom{width:100%}.wrapper .preview,.wrapper .placeholder{display:flex;flex-direction:column;align-items:center;padding:8px;border-radius:4px;background-color:#f7f7f8;color:#000}.wrapper .preview__hint,.wrapper .placeholder{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal}.wrapper.disabled .preview,.wrapper.disabled .placeholder{opacity:.4}.hint{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;padding-top:2px;padding-left:10px}.hint:empty{display:none}:host(.ng-invalid.ng-touched) .wrapper{padding:8px;border-width:1px;border-color:var(--mdc-outlined-text-field-error-outline-color)}:host(.ng-invalid.ng-touched) .wrapper .preview,:host(.ng-invalid.ng-touched) .wrapper .placeholder{color:#dd1d1f}:host(.ng-invalid.ng-touched) .label,:host(.ng-invalid.ng-touched) .hint{color:var(--mdc-outlined-text-field-error-outline-color)}:host(.disabled) .wrapper{border-color:#f7f7f8}:host(.disabled) .wrapper,:host(.disabled) .hint,:host(.disabled) .label{color:#d2cecd}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i4.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
189
+ }
190
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioFormCronComponent, decorators: [{
191
+ type: Component,
192
+ args: [{ selector: 'gio-form-cron', providers: [
193
+ {
194
+ provide: NG_VALUE_ACCESSOR,
195
+ useExisting: forwardRef(() => GioFormCronComponent),
196
+ multi: true,
197
+ },
198
+ {
199
+ provide: NG_VALIDATORS,
200
+ useExisting: forwardRef(() => GioFormCronComponent),
201
+ multi: true,
202
+ },
203
+ ], standalone: false, template: "<!--\n\n Copyright (C) 2015 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<div class=\"label\"><ng-content select=\"gio-form-cron-label\"></ng-content></div>\n<div class=\"wrapper\" [class.smallDisplay]=\"smallDisplay\" [class.disabled]=\"isDisabled\">\n <ng-container *ngIf=\"internalFormGroup\" [formGroup]=\"internalFormGroup\">\n <div class=\"menu\">\n <mat-button-toggle-group\n class=\"gio-button-toggle-group menu__mode\"\n name=\"mode\"\n aria-label=\"Cron mode\"\n formControlName=\"mode\"\n [hideSingleSelectionIndicator]=\"true\"\n >\n <mat-button-toggle value=\"secondly\" matTooltip=\"Secondly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 's' : 'Secondly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"minutely\" matTooltip=\"Minutely\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'm' : 'Minutely'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"hourly\" matTooltip=\"Hourly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'h' : 'Hourly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"daily\" matTooltip=\"Daily\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'D' : 'Daily'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"weekly\" matTooltip=\"Weekly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'W' : 'Weekly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"monthly\" matTooltip=\"Monthly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'M' : 'Monthly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"custom\" matTooltip=\"Custom\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'C' : 'Custom'\n }}</mat-button-toggle>\n </mat-button-toggle-group>\n <button\n *ngIf=\"value && !isDisabled\"\n mat-button\n aria-label=\"Clear\"\n matTooltip=\"Clear\"\n type=\"button\"\n (click)=\"onClear({ touched: true })\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <ng-container [ngSwitch]=\"internalFormGroup.get('mode')?.value\">\n <ng-container *ngSwitchCase=\"'secondly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Second</mat-label>\n <mat-select formControlName=\"secondInterval\">\n <mat-option *ngFor=\"let second of seconds\" [value]=\"second\">{{ second }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'minutely'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minute(s)</mat-label>\n <mat-select formControlName=\"minuteInterval\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'hourly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hour(s)</mat-label>\n <mat-select formControlName=\"hourInterval\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minute(s)</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'daily'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Day(s)</mat-label>\n <mat-select formControlName=\"dayInterval\">\n <mat-option *ngFor=\"let day of daysOfMonth\" [value]=\"day\">{{ day }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\"> at </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hour(s)</mat-label>\n <mat-select formControlName=\"hours\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minute(s)</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'weekly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-medium\">\n <mat-label>Day of the week</mat-label>\n <mat-select formControlName=\"dayOfWeek\">\n <mat-option *ngFor=\"let day of daysOfWeek; let index = index\" [value]=\"index\">{{ day }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\"> at </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hours</mat-label>\n <mat-select formControlName=\"hours\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minutes</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'monthly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">On the </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Day(s)</mat-label>\n <mat-select formControlName=\"dayOfMonth\">\n <mat-option *ngFor=\"let day of daysOfMonth\" [value]=\"day\">{{ day }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\"> of every month at </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hours</mat-label>\n <mat-select formControlName=\"hours\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minutes</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'custom'\">\n <div class=\"modeForm\">\n <mat-form-field class=\"modeForm__field-custom\">\n <mat-label>Cron expression</mat-label>\n <input matInput formControlName=\"customExpression\" placeholder=\"* * * * * *\" />\n </mat-form-field>\n </div>\n </ng-container>\n </ng-container>\n\n <div *ngIf=\"value; else placeholder\" class=\"preview\">\n <span *ngIf=\"internalFormGroup.get('mode')?.value !== 'custom'\" class=\"preview__value\">\n {{ value }}\n </span>\n <span class=\"preview__hint\">{{ expressionDescription }}</span>\n </div>\n </ng-container>\n\n <ng-template #placeholder>\n <div class=\"placeholder\">No cron expression defined.</div>\n </ng-template>\n</div>\n<div class=\"hint\"><ng-content select=\"gio-form-cron-hint\"></ng-content></div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;min-width:342px;flex-direction:column}::ng-deep gio-form-cron{--mat-form-field-container-height: 48px;--mat-form-field-filled-label-display: none;--mat-form-field-container-vertical-padding: 12px;--mat-form-field-filled-with-label-container-padding-top: 12px;--mat-form-field-filled-with-label-container-padding-bottom: 12px}.label{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;padding-left:10px;color:var(--mdc-outlined-text-field-label-text-color)}.label:empty{display:none}.wrapper{display:inline-flex;flex-direction:column;padding:8px;border:1px solid var(--mdc-outlined-text-field-outline-color);border-radius:4px}.wrapper:hover:not(.disabled){padding:8px;border:1px solid var(--mdc-outlined-text-field-hover-outline-color)}.wrapper .menu{display:inline-flex;align-items:center;justify-content:space-between;margin-bottom:4px}.wrapper .menu__mode{border:none;margin-bottom:0}.wrapper .modeForm{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:8px;column-gap:4px}.wrapper .modeForm__field-small,.wrapper .modeForm__field-medium,.wrapper .modeForm__field-custom{display:inline-block;height:52px}.wrapper .modeForm__field-small{width:124px}.wrapper .modeForm__field-medium{width:158px}.wrapper .modeForm__field-custom{width:100%}.wrapper .preview,.wrapper .placeholder{display:flex;flex-direction:column;align-items:center;padding:8px;border-radius:4px;background-color:#f7f7f8;color:#000}.wrapper .preview__hint,.wrapper .placeholder{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal}.wrapper.disabled .preview,.wrapper.disabled .placeholder{opacity:.4}.hint{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;padding-top:2px;padding-left:10px}.hint:empty{display:none}:host(.ng-invalid.ng-touched) .wrapper{padding:8px;border-width:1px;border-color:var(--mdc-outlined-text-field-error-outline-color)}:host(.ng-invalid.ng-touched) .wrapper .preview,:host(.ng-invalid.ng-touched) .wrapper .placeholder{color:#dd1d1f}:host(.ng-invalid.ng-touched) .label,:host(.ng-invalid.ng-touched) .hint{color:var(--mdc-outlined-text-field-error-outline-color)}:host(.disabled) .wrapper{border-color:#f7f7f8}:host(.disabled) .wrapper,:host(.disabled) .hint,:host(.disabled) .label{color:#d2cecd}\n"] }]
204
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.FocusMonitor }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }], propDecorators: { isDisabled: [{
205
+ type: HostBinding,
206
+ args: ['class.disabled']
207
+ }], smallDisplay: [{
208
+ type: HostBinding,
209
+ args: ['class.smallDisplay']
210
+ }] } });
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLWZvcm0tY3Jvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1wYXJ0aWNsZXMtYW5ndWxhci9zcmMvbGliL2dpby1mb3JtLWNyb24vZ2lvLWZvcm0tY3Jvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1wYXJ0aWNsZXMtYW5ndWxhci9zcmMvbGliL2dpby1mb3JtLWNyb24vZ2lvLWZvcm0tY3Jvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFFLFNBQVMsRUFBYyxXQUFXLEVBQTZCLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0gsT0FBTyxFQUdMLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEQsT0FBTyxFQUFlLHFCQUFxQixFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7OztBQW9CdkksTUFBTSxPQUFPLG9CQUFvQjtJQTJCL0IsWUFDbUIsS0FBaUIsRUFDakIsRUFBZ0IsRUFDaEIsTUFBYyxFQUNkLEdBQXNCO1FBSHRCLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsT0FBRSxHQUFGLEVBQUUsQ0FBYztRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE5QmxDLGNBQVMsR0FBbUMsR0FBRyxFQUFFLENBQUMs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TVUsb0JBQW9CO2tHQUFwQixvQkFBb0IsdUtBZHBCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDbkQsS0FBSyxFQUFFLElBQUk7YUFDWjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDO2dCQUNuRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsMEJDakRILG1xU0ErTUE7OzJGRDNKYSxvQkFBb0I7a0JBbEJoQyxTQUFTOytCQUNFLGVBQWUsYUFHZDt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQzs0QkFDbkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDOzRCQUNuRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixjQUNXLEtBQUs7K0pBZ0JWLFVBQVU7c0JBRGhCLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQUd0QixZQUFZO3NCQURsQixXQUFXO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZvY3VzTW9uaXRvciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIE5nWm9uZSwgT25EZXN0cm95LCBPbkluaXQsIGZvcndhcmRSZWYsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gIFVudHlwZWRGb3JtR3JvdXAsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGlzRW1wdHksIHJhbmdlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IENyb25EaXNwbGF5LCBnZXREZWZhdWx0Q3JvbkRpc3BsYXksIHBhcnNlQ3JvbkV4cHJlc3Npb24sIHRvQ3JvbkRlc2NyaXB0aW9uLCB0b0Nyb25FeHByZXNzaW9uIH0gZnJvbSAnLi9naW8tZm9ybS1jcm9uLmFkYXB0ZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnaW8tZm9ybS1jcm9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dpby1mb3JtLWNyb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9naW8tZm9ybS1jcm9uLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gR2lvRm9ybUNyb25Db21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gR2lvRm9ybUNyb25Db21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG59KVxuZXhwb3J0IGNsYXNzIEdpb0Zvcm1Dcm9uQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95LCBWYWxpZGF0b3Ige1xuICBwdWJsaWMgX29uQ2hhbmdlOiAodmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZvaWQgPSAoKSA9PiAoe30pO1xuXG4gIHB1YmxpYyBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4gKHt9KTtcblxuICBwdWJsaWMgc2Vjb25kcyA9IFsuLi5yYW5nZSgwLCA2MCldO1xuICBwdWJsaWMgbWludXRlcyA9IFsuLi5yYW5nZSgwLCA2MCldO1xuICBwdWJsaWMgaG91cnMgPSBbLi4ucmFuZ2UoMCwgMjQpXTtcbiAgcHVibGljIGRheXNPZk1vbnRoID0gWy4uLnJhbmdlKDEsIDMyKV07XG4gIHB1YmxpYyBkYXlzT2ZXZWVrID0gWydNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5JywgJ1N1bmRheSddO1xuICBwdWJsaWMgaW50ZXJuYWxGb3JtR3JvdXA/OiBVbnR5cGVkRm9ybUdyb3VwO1xuICBwdWJsaWMgdmFsdWU/OiBzdHJpbmc7XG4gIHB1YmxpYyBleHByZXNzaW9uRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuZGlzYWJsZWQnKVxuICBwdWJsaWMgaXNEaXNhYmxlZCA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNtYWxsRGlzcGxheScpXG4gIHB1YmxpYyBzbWFsbERpc3BsYXkgPSBmYWxzZTtcblxuICBwcml2YXRlIHRvdWNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBmb2N1c2VkID0gZmFsc2U7XG4gIHByaXZhdGUgaGFzRXJyb3IgPSBmYWxzZTtcblxuICBwcml2YXRlIGNyb25EaXNwbGF5PzogQ3JvbkRpc3BsYXk7XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZtOiBGb2N1c01vbml0b3IsXG4gICAgcHJpdmF0ZSByZWFkb25seSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge1xuICAgIGZtLm1vbml0b3IoZWxSZWYubmF0aXZlRWxlbWVudCwgdHJ1ZSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpXG4gICAgICAuc3Vic2NyaWJlKG9yaWdpbiA9PiB7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9ICEhb3JpZ2luO1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh3aW5kb3cuUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd2lkdGggPSBlbnRyaWVzWzBdLmNvbnRlbnRSZWN0LndpZHRoO1xuICAgICAgICAgIHRoaXMuc21hbGxEaXNwbGF5ID0gd2lkdGggPCA1ODA7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVybmFsRm9ybUdyb3VwID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe1xuICAgICAgbW9kZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpLFxuICAgICAgc2Vjb25kSW50ZXJ2YWw6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICAgIG1pbnV0ZUludGVydmFsOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKCksXG4gICAgICBob3VySW50ZXJ2YWw6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICAgIGRheUludGVydmFsOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKCksXG4gICAgICBkYXlPZldlZWs6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICAgIGRheU9mTW9udGg6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcblxuICAgICAgaG91cnM6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICAgIG1pbnV0ZXM6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICAgIGN1c3RvbUV4cHJlc3Npb246IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICB9KTtcblxuICAgIHRoaXMuaXNEaXNhYmxlZCA/IHRoaXMuaW50ZXJuYWxGb3JtR3JvdXAuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSkgOiB0aGlzLmludGVybmFsRm9ybUdyb3VwLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICB0aGlzLmludGVybmFsRm9ybUdyb3VwXG4gICAgICAuZ2V0KCdtb2RlJylcbiAgICAgID8udmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgIGZpbHRlcihtb2RlID0+ICEhbW9kZSksXG4gICAgICAgIHRhcChtb2RlID0+IHtcbiAgICAgICAgICB0aGlzLmNyb25EaXNwbGF5ID0gZ2V0RGVmYXVsdENyb25EaXNwbGF5KG1vZGUpO1xuXG4gICAgICAgICAgdGhpcy5yZWZyZXNoSW50ZXJuYWxGb3JtKCk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5pbnRlcm5hbEZvcm1Hcm91cC52YWx1ZUNoYW5nZXNcbiAgICAgID8ucGlwZShcbiAgICAgICAgdGFwKHZhbHVlID0+IHtcbiAgICAgICAgICB0aGlzLmhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgICAgaWYgKCF2YWx1ZT8ubW9kZSkge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdG9Dcm9uRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgIG1vZGU6IHZhbHVlLm1vZGUsXG4gICAgICAgICAgICAgIHNlY29uZEludGVydmFsOiB2YWx1ZS5zZWNvbmRJbnRlcnZhbCxcbiAgICAgICAgICAgICAgbWludXRlSW50ZXJ2YWw6IHZhbHVlLm1pbnV0ZUludGVydmFsLFxuICAgICAgICAgICAgICBob3VySW50ZXJ2YWw6IHZhbHVlLmhvdXJJbnRlcnZhbCxcbiAgICAgICAgICAgICAgZGF5SW50ZXJ2YWw6IHZhbHVlLmRheUludGVydmFsLFxuICAgICAgICAgICAgICBkYXlPZldlZWs6IHZhbHVlLmRheU9mV2VlayxcbiAgICAgICAgICAgICAgZGF5T2ZNb250aDogdmFsdWUuZGF5T2ZNb250aCxcbiAgICAgICAgICAgICAgY3VzdG9tRXhwcmVzc2lvbjogdmFsdWUuY3VzdG9tRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgaG91cnM6IHZhbHVlLmhvdXJzLFxuICAgICAgICAgICAgICBtaW51dGVzOiB2YWx1ZS5taW51dGVzLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbkRlc2NyaXB0aW9uID0gdG9Dcm9uRGVzY3JpcHRpb24odGhpcy52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25EZXNjcmlwdGlvbiA9IGAke2Vycm9yfWAgPz8gJ0ludmFsaWQgY3JvbiBleHByZXNzaW9uLic7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5yZWZyZXNoSW50ZXJuYWxGb3JtKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5mbS5zdG9wTW9uaXRvcmluZyh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LnVub2JzZXJ2ZSh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLy8gRnJvbSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChpc0VtcHR5KHZhbHVlKSkge1xuICAgICAgdGhpcy5vbkNsZWFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLmNyb25EaXNwbGF5ID0gcGFyc2VDcm9uRXhwcmVzc2lvbih2YWx1ZSk7XG5cbiAgICAgIHRoaXMuZXhwcmVzc2lvbkRlc2NyaXB0aW9uID0gdG9Dcm9uRGVzY3JpcHRpb24odGhpcy52YWx1ZSk7XG4gICAgICB0aGlzLnJlZnJlc2hJbnRlcm5hbEZvcm0oKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICB0aGlzLmV4cHJlc3Npb25EZXNjcmlwdGlvbiA9IGAke2Vycm9yfWAgPz8gJ0ludmFsaWQgY3JvbiBleHByZXNzaW9uLic7XG4gICAgfVxuICB9XG5cbiAgLy8gRnJvbSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvLyBGcm9tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZVxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8vIEZyb20gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzRGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuXG4gICAgdGhpcy5yZWZyZXNoSW50ZXJuYWxGb3JtKCk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoXzogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmhhc0Vycm9yID8geyBpbnZhbGlkOiB0cnVlIH0gOiBudWxsO1xuICB9XG5cbiAgcHVibGljIG9uQ2xlYXIoeyB0b3VjaGVkIH06IHsgdG91Y2hlZD86IGJvb2xlYW4gfSA9IHt9KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNyb25EaXNwbGF5ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaW50ZXJuYWxGb3JtR3JvdXA/LnJlc2V0KHt9LCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcblxuICAgIGlmICh0b3VjaGVkKSB7XG4gICAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoSW50ZXJuYWxGb3JtKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnRlcm5hbEZvcm1Hcm91cCkgcmV0dXJuO1xuXG4gICAgdGhpcy5pc0Rpc2FibGVkID8gdGhpcy5pbnRlcm5hbEZvcm1Hcm91cC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KSA6IHRoaXMuaW50ZXJuYWxGb3JtR3JvdXAuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIGNvbnN0IGQgPSB0aGlzLmNyb25EaXNwbGF5O1xuICAgIGlmIChkKSB7XG4gICAgICB0aGlzLmludGVybmFsRm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICAgIHtcbiAgICAgICAgICBtb2RlOiBkLm1vZGUsXG4gICAgICAgICAgY3VzdG9tRXhwcmVzc2lvbjogZC5jdXN0b21FeHByZXNzaW9uLFxuICAgICAgICAgIHNlY29uZEludGVydmFsOiBkLnNlY29uZEludGVydmFsLFxuICAgICAgICAgIG1pbnV0ZUludGVydmFsOiBkLm1pbnV0ZUludGVydmFsLFxuICAgICAgICAgIGhvdXJJbnRlcnZhbDogZC5ob3VySW50ZXJ2YWwsXG4gICAgICAgICAgZGF5SW50ZXJ2YWw6IGQuZGF5SW50ZXJ2YWwsXG4gICAgICAgICAgZGF5T2ZXZWVrOiBkLmRheU9mV2VlayxcbiAgICAgICAgICBkYXlPZk1vbnRoOiBkLmRheU9mTW9udGgsXG5cbiAgICAgICAgICBob3VyczogZC5ob3VycyxcbiAgICAgICAgICBtaW51dGVzOiBkLm1pbnV0ZXMsXG4gICAgICAgIH0sXG4gICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsIjwhLS1cblxuICAgIENvcHlyaWdodCAoQykgMjAxNSBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbi0tPlxuPGRpdiBjbGFzcz1cImxhYmVsXCI+PG5nLWNvbnRlbnQgc2VsZWN0PVwiZ2lvLWZvcm0tY3Jvbi1sYWJlbFwiPjwvbmctY29udGVudD48L2Rpdj5cbjxkaXYgY2xhc3M9XCJ3cmFwcGVyXCIgW2NsYXNzLnNtYWxsRGlzcGxheV09XCJzbWFsbERpc3BsYXlcIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW50ZXJuYWxGb3JtR3JvdXBcIiBbZm9ybUdyb3VwXT1cImludGVybmFsRm9ybUdyb3VwXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1lbnVcIj5cbiAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFxuICAgICAgICBjbGFzcz1cImdpby1idXR0b24tdG9nZ2xlLWdyb3VwIG1lbnVfX21vZGVcIlxuICAgICAgICBuYW1lPVwibW9kZVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJDcm9uIG1vZGVcIlxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtb2RlXCJcbiAgICAgICAgW2hpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3JdPVwidHJ1ZVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cInNlY29uZGx5XCIgbWF0VG9vbHRpcD1cIlNlY29uZGx5XCIgW21hdFRvb2x0aXBEaXNhYmxlZF09XCIhc21hbGxEaXNwbGF5XCI+e3tcbiAgICAgICAgICBzbWFsbERpc3BsYXkgPyAncycgOiAnU2Vjb25kbHknXG4gICAgICAgIH19PC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwibWludXRlbHlcIiBtYXRUb29sdGlwPVwiTWludXRlbHlcIiBbbWF0VG9vbHRpcERpc2FibGVkXT1cIiFzbWFsbERpc3BsYXlcIj57e1xuICAgICAgICAgIHNtYWxsRGlzcGxheSA/ICdtJyA6ICdNaW51dGVseSdcbiAgICAgICAgfX08L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJob3VybHlcIiBtYXRUb29sdGlwPVwiSG91cmx5XCIgW21hdFRvb2x0aXBEaXNhYmxlZF09XCIhc21hbGxEaXNwbGF5XCI+e3tcbiAgICAgICAgICBzbWFsbERpc3BsYXkgPyAnaCcgOiAnSG91cmx5J1xuICAgICAgICB9fTwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cImRhaWx5XCIgbWF0VG9vbHRpcD1cIkRhaWx5XCIgW21hdFRvb2x0aXBEaXNhYmxlZF09XCIhc21hbGxEaXNwbGF5XCI+e3tcbiAgICAgICAgICBzbWFsbERpc3BsYXkgPyAnRCcgOiAnRGFpbHknXG4gICAgICAgIH19PC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwid2Vla2x5XCIgbWF0VG9vbHRpcD1cIldlZWtseVwiIFttYXRUb29sdGlwRGlzYWJsZWRdPVwiIXNtYWxsRGlzcGxheVwiPnt7XG4gICAgICAgICAgc21hbGxEaXNwbGF5ID8gJ1cnIDogJ1dlZWtseSdcbiAgICAgICAgfX08L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJtb250aGx5XCIgbWF0VG9vbHRpcD1cIk1vbnRobHlcIiBbbWF0VG9vbHRpcERpc2FibGVkXT1cIiFzbWFsbERpc3BsYXlcIj57e1xuICAgICAgICAgIHNtYWxsRGlzcGxheSA/ICdNJyA6ICdNb250aGx5J1xuICAgICAgICB9fTwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cImN1c3RvbVwiIG1hdFRvb2x0aXA9XCJDdXN0b21cIiBbbWF0VG9vbHRpcERpc2FibGVkXT1cIiFzbWFsbERpc3BsYXlcIj57e1xuICAgICAgICAgIHNtYWxsRGlzcGxheSA/ICdDJyA6ICdDdXN0b20nXG4gICAgICAgIH19PC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwidmFsdWUgJiYgIWlzRGlzYWJsZWRcIlxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhclwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJDbGVhclwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhcih7IHRvdWNoZWQ6IHRydWUgfSlcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJpbnRlcm5hbEZvcm1Hcm91cC5nZXQoJ21vZGUnKT8udmFsdWVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzZWNvbmRseSdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVGb3JtXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcm9uLWZvcm0tbGFiZWxcIj5FdmVyeSA8L3NwYW4+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibW9kZUZvcm1fX2ZpZWxkLXNtYWxsXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPlNlY29uZDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwic2Vjb25kSW50ZXJ2YWxcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHNlY29uZCBvZiBzZWNvbmRzXCIgW3ZhbHVlXT1cInNlY29uZFwiPnt7IHNlY29uZCB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbWludXRlbHknXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlRm9ybVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvbi1mb3JtLWxhYmVsXCI+RXZlcnkgPC9zcGFuPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1vZGVGb3JtX19maWVsZC1zbWFsbFwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5NaW51dGUocyk8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cIm1pbnV0ZUludGVydmFsXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBtaW51dGUgb2YgbWludXRlc1wiIFt2YWx1ZV09XCJtaW51dGVcIj57eyBtaW51dGUgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2hvdXJseSdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVGb3JtXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcm9uLWZvcm0tbGFiZWxcIj5FdmVyeSA8L3NwYW4+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibW9kZUZvcm1fX2ZpZWxkLXNtYWxsXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPkhvdXIocyk8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImhvdXJJbnRlcnZhbFwiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaG91ciBvZiBob3Vyc1wiIFt2YWx1ZV09XCJob3VyXCI+e3sgaG91ciB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvbi1mb3JtLWxhYmVsXCI+Ojwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtb2RlRm9ybV9fZmllbGQtc21hbGxcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+TWludXRlKHMpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJtaW51dGVzXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBtaW51dGUgb2YgbWludXRlc1wiIFt2YWx1ZV09XCJtaW51dGVcIj57eyBtaW51dGUgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhaWx5J1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZUZvcm1cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyb24tZm9ybS1sYWJlbFwiPkV2ZXJ5IDwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtb2RlRm9ybV9fZmllbGQtc21hbGxcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+RGF5KHMpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJkYXlJbnRlcnZhbFwiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZGF5IG9mIGRheXNPZk1vbnRoXCIgW3ZhbHVlXT1cImRheVwiPnt7IGRheSB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvbi1mb3JtLWxhYmVsXCI+IGF0IDwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtb2RlRm9ybV9fZmllbGQtc21hbGxcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+SG91cihzKTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiaG91cnNcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGhvdXIgb2YgaG91cnNcIiBbdmFsdWVdPVwiaG91clwiPnt7IGhvdXIgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyb24tZm9ybS1sYWJlbFwiPjo8L3NwYW4+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibW9kZUZvcm1fX2ZpZWxkLXNtYWxsXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPk1pbnV0ZShzKTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwibWludXRlc1wiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgbWludXRlIG9mIG1pbnV0ZXNcIiBbdmFsdWVdPVwibWludXRlXCI+e3sgbWludXRlIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid3ZWVrbHknXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlRm9ybVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvbi1mb3JtLWxhYmVsXCI+RXZlcnkgPC9zcGFuPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1vZGVGb3JtX19maWVsZC1tZWRpdW1cIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+RGF5IG9mIHRoZSB3ZWVrPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJkYXlPZldlZWtcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGRheSBvZiBkYXlzT2ZXZWVrOyBsZXQgaW5kZXggPSBpbmRleFwiIFt2YWx1ZV09XCJpbmRleFwiPnt7IGRheSB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvbi1mb3JtLWxhYmVsXCI+IGF0IDwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtb2RlRm9ybV9fZmllbGQtc21hbGxcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+SG91cnM8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImhvdXJzXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBob3VyIG9mIGhvdXJzXCIgW3ZhbHVlXT1cImhvdXJcIj57eyBob3VyIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcm9uLWZvcm0tbGFiZWxcIj46PC9zcGFuPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1vZGVGb3JtX19maWVsZC1zbWFsbFwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5NaW51dGVzPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJtaW51dGVzXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBtaW51dGUgb2YgbWludXRlc1wiIFt2YWx1ZV09XCJtaW51dGVcIj57eyBtaW51dGUgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ21vbnRobHknXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlRm9ybVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvbi1mb3JtLWxhYmVsXCI+T24gdGhlIDwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtb2RlRm9ybV9fZmllbGQtc21hbGxcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+RGF5KHMpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJkYXlPZk1vbnRoXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBkYXkgb2YgZGF5c09mTW9udGhcIiBbdmFsdWVdPVwiZGF5XCI+e3sgZGF5IH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcm9uLWZvcm0tbGFiZWxcIj4gb2YgZXZlcnkgbW9udGggYXQgPC9zcGFuPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1vZGVGb3JtX19maWVsZC1zbWFsbFwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5Ib3VyczwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiaG91cnNcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGhvdXIgb2YgaG91cnNcIiBbdmFsdWVdPVwiaG91clwiPnt7IGhvdXIgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyb24tZm9ybS1sYWJlbFwiPjo8L3NwYW4+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibW9kZUZvcm1fX2ZpZWxkLXNtYWxsXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPk1pbnV0ZXM8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cIm1pbnV0ZXNcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG1pbnV0ZSBvZiBtaW51dGVzXCIgW3ZhbHVlXT1cIm1pbnV0ZVwiPnt7IG1pbnV0ZSB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY3VzdG9tJ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZUZvcm1cIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtb2RlRm9ybV9fZmllbGQtY3VzdG9tXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPkNyb24gZXhwcmVzc2lvbjwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImN1c3RvbUV4cHJlc3Npb25cIiBwbGFjZWhvbGRlcj1cIiogKiAqICogKiAqXCIgLz5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiAqbmdJZj1cInZhbHVlOyBlbHNlIHBsYWNlaG9sZGVyXCIgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICA8c3BhbiAqbmdJZj1cImludGVybmFsRm9ybUdyb3VwLmdldCgnbW9kZScpPy52YWx1ZSAhPT0gJ2N1c3RvbSdcIiBjbGFzcz1cInByZXZpZXdfX3ZhbHVlXCI+XG4gICAgICAgIHt7IHZhbHVlIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInByZXZpZXdfX2hpbnRcIj57eyBleHByZXNzaW9uRGVzY3JpcHRpb24gfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy10ZW1wbGF0ZSAjcGxhY2Vob2xkZXI+XG4gICAgPGRpdiBjbGFzcz1cInBsYWNlaG9sZGVyXCI+Tm8gY3JvbiBleHByZXNzaW9uIGRlZmluZWQuPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJoaW50XCI+PG5nLWNvbnRlbnQgc2VsZWN0PVwiZ2lvLWZvcm0tY3Jvbi1oaW50XCI+PC9uZy1jb250ZW50PjwvZGl2PlxuIl19