@entake/particle 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +396 -0
  3. package/app/modules/accordion/accordion.component.d.ts +26 -0
  4. package/app/modules/accordion/accordion.module.d.ts +11 -0
  5. package/app/modules/accordion/directives/accordion-content.directive.d.ts +8 -0
  6. package/app/modules/accordion/directives/accordion-header.directive.d.ts +8 -0
  7. package/app/modules/accordion/directives/accordion-item.directive.d.ts +13 -0
  8. package/app/modules/background-carousel/background-carousel.directive.d.ts +42 -0
  9. package/app/modules/background-carousel/carousel-options.model.d.ts +30 -0
  10. package/app/modules/background-carousel/particle-background-carousel.module.d.ts +8 -0
  11. package/app/modules/checkbox/checkbox.component.d.ts +43 -0
  12. package/app/modules/checkbox/checkbox.module.d.ts +9 -0
  13. package/app/modules/color-picker/color-picker.component.d.ts +149 -0
  14. package/app/modules/color-picker/color-picker.module.d.ts +9 -0
  15. package/app/modules/date-picker/components/calendar/calendar.component.d.ts +211 -0
  16. package/app/modules/date-picker/components/date-range-picker/date-range-picker.component.d.ts +95 -0
  17. package/app/modules/date-picker/date-picker.component.d.ts +259 -0
  18. package/app/modules/date-picker/date-picker.module.d.ts +15 -0
  19. package/app/modules/dialog/dialog.component.d.ts +87 -0
  20. package/app/modules/dialog/dialog.module.d.ts +9 -0
  21. package/app/modules/dropdown/dropdown.component.d.ts +288 -0
  22. package/app/modules/dropdown/dropdown.module.d.ts +9 -0
  23. package/app/modules/dropdown/models/dropdown-option-group.model.d.ts +16 -0
  24. package/app/modules/dropdown/models/dropdown-option.model.d.ts +25 -0
  25. package/app/modules/endpoint-state/components/endpoint-state.component.d.ts +46 -0
  26. package/app/modules/endpoint-state/endpoint-state.module.d.ts +8 -0
  27. package/app/modules/icons/components/icon-select.component.d.ts +229 -0
  28. package/app/modules/icons/models/fontawesome-icons-brands.model.d.ts +13 -0
  29. package/app/modules/icons/models/fontawesome-icons-regular.model.d.ts +13 -0
  30. package/app/modules/icons/models/fontawesome-icons-solid.model.d.ts +13 -0
  31. package/app/modules/icons/models/particle-icons-light.model.d.ts +197 -0
  32. package/app/modules/icons/models/particle-icons-regular.model.d.ts +205 -0
  33. package/app/modules/icons/models/particle-icons-solid.model.d.ts +365 -0
  34. package/app/modules/icons/particle-icons.module.d.ts +13 -0
  35. package/app/modules/icons/services/icons.service.d.ts +44 -0
  36. package/app/modules/idle-timeout/idle-timeout.component.d.ts +35 -0
  37. package/app/modules/idle-timeout/idle-timer.d.ts +14 -0
  38. package/app/modules/idle-timeout/particle-idle-timeout.module.d.ts +9 -0
  39. package/app/modules/input-mask/input-mask.component.d.ts +86 -0
  40. package/app/modules/input-mask/input-mask.module.d.ts +8 -0
  41. package/app/modules/keyfilter/keyfilter.directive.d.ts +60 -0
  42. package/app/modules/keyfilter/keyfilter.module.d.ts +8 -0
  43. package/app/modules/layout/components/layout-full-framing/layout-full-framing.component.d.ts +27 -0
  44. package/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +23 -0
  45. package/app/modules/layout/layout.module.d.ts +10 -0
  46. package/app/modules/loader/components/loader.component.d.ts +11 -0
  47. package/app/modules/loader/loader.module.d.ts +8 -0
  48. package/app/modules/multi-select/models/multi-select-option-group.model.d.ts +16 -0
  49. package/app/modules/multi-select/models/multi-select-option.model.d.ts +25 -0
  50. package/app/modules/multi-select/multi-select.component.d.ts +279 -0
  51. package/app/modules/multi-select/multi-select.module.d.ts +8 -0
  52. package/app/modules/notification/models/notification.model.d.ts +21 -0
  53. package/app/modules/notification/notification.component.d.ts +46 -0
  54. package/app/modules/notification/notification.module.d.ts +8 -0
  55. package/app/modules/notification/services/notification.service.d.ts +54 -0
  56. package/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.d.ts +8 -0
  57. package/app/modules/ordinal-number-pipe/ordinal-number.pipe.d.ts +15 -0
  58. package/app/modules/paginator/pagination-event.model.d.ts +24 -0
  59. package/app/modules/paginator/paginator.component.d.ts +103 -0
  60. package/app/modules/paginator/particle-paginator.module.d.ts +13 -0
  61. package/app/modules/popover/popover.component.d.ts +140 -0
  62. package/app/modules/popover/popover.module.d.ts +9 -0
  63. package/app/modules/profile-pic/particle-profile-pic.module.d.ts +9 -0
  64. package/app/modules/profile-pic/profile-pic.component.d.ts +32 -0
  65. package/app/modules/progress-bar/progress-bar.component.d.ts +16 -0
  66. package/app/modules/progress-bar/progress-bar.module.d.ts +8 -0
  67. package/app/modules/push-container/particle-push-container.module.d.ts +9 -0
  68. package/app/modules/push-container/push-container-state.model.d.ts +7 -0
  69. package/app/modules/push-container/push-container.component.d.ts +137 -0
  70. package/app/modules/rich-text/particle-rich-text.module.d.ts +15 -0
  71. package/app/modules/rich-text/render-rich-text.component.d.ts +6 -0
  72. package/app/modules/rich-text/rich-text-capabilities.model.d.ts +7 -0
  73. package/app/modules/rich-text/rich-text.component.d.ts +48 -0
  74. package/app/modules/scroll-to-top/particle-scroll-to-top.module.d.ts +8 -0
  75. package/app/modules/scroll-to-top/scroll-to-top.component.d.ts +19 -0
  76. package/app/modules/slideover/particle-slideover.module.d.ts +8 -0
  77. package/app/modules/slideover/slideover.component.d.ts +35 -0
  78. package/app/modules/slider/slider.component.d.ts +143 -0
  79. package/app/modules/slider/slider.module.d.ts +9 -0
  80. package/app/modules/theming/components/theming.component.d.ts +43 -0
  81. package/app/modules/theming/models/theme.model.d.ts +88 -0
  82. package/app/modules/theming/services/theme-change-detection.service.d.ts +26 -0
  83. package/app/modules/theming/services/theming.service.d.ts +142 -0
  84. package/app/modules/theming/theming.module.d.ts +12 -0
  85. package/app/modules/toggle-switch/models/toggle-options.model.d.ts +11 -0
  86. package/app/modules/toggle-switch/toggle-switch.component.d.ts +43 -0
  87. package/app/modules/toggle-switch/toggle-switch.module.d.ts +8 -0
  88. package/app/modules/tooltip/tooltip.directive.d.ts +157 -0
  89. package/app/modules/tooltip/tooltip.module.d.ts +8 -0
  90. package/app/modules/week-picker/week-picker.component.d.ts +289 -0
  91. package/app/modules/week-picker/week-picker.module.d.ts +13 -0
  92. package/app/shared/enums/endpoint-status.enum.d.ts +9 -0
  93. package/app/shared/interceptors/json.interceptor.d.ts +17 -0
  94. package/app/shared/models/auditable.model.d.ts +21 -0
  95. package/app/shared/models/data-list.model.d.ts +9 -0
  96. package/app/shared/models/id.model.d.ts +9 -0
  97. package/app/shared/models/observable-container.d.ts +8 -0
  98. package/app/shared/models/particle-component-text.model.d.ts +211 -0
  99. package/app/shared/services/base-data.service.d.ts +130 -0
  100. package/app/shared/services/dialog.service.d.ts +10 -0
  101. package/app/shared/services/local-storage.service.d.ts +41 -0
  102. package/esm2022/app/modules/accordion/accordion.component.mjs +101 -0
  103. package/esm2022/app/modules/accordion/accordion.module.mjs +37 -0
  104. package/esm2022/app/modules/accordion/directives/accordion-content.directive.mjs +17 -0
  105. package/esm2022/app/modules/accordion/directives/accordion-header.directive.mjs +17 -0
  106. package/esm2022/app/modules/accordion/directives/accordion-item.directive.mjs +36 -0
  107. package/esm2022/app/modules/background-carousel/background-carousel.directive.mjs +91 -0
  108. package/esm2022/app/modules/background-carousel/carousel-options.model.mjs +36 -0
  109. package/esm2022/app/modules/background-carousel/particle-background-carousel.module.mjs +24 -0
  110. package/esm2022/app/modules/checkbox/checkbox.component.mjs +108 -0
  111. package/esm2022/app/modules/checkbox/checkbox.module.mjs +28 -0
  112. package/esm2022/app/modules/color-picker/color-picker.component.mjs +306 -0
  113. package/esm2022/app/modules/color-picker/color-picker.module.mjs +19 -0
  114. package/esm2022/app/modules/date-picker/components/calendar/calendar.component.mjs +496 -0
  115. package/esm2022/app/modules/date-picker/components/date-range-picker/date-range-picker.component.mjs +250 -0
  116. package/esm2022/app/modules/date-picker/date-picker.component.mjs +538 -0
  117. package/esm2022/app/modules/date-picker/date-picker.module.mjs +56 -0
  118. package/esm2022/app/modules/dialog/dialog.component.mjs +177 -0
  119. package/esm2022/app/modules/dialog/dialog.module.mjs +28 -0
  120. package/esm2022/app/modules/dropdown/dropdown.component.mjs +682 -0
  121. package/esm2022/app/modules/dropdown/dropdown.module.mjs +28 -0
  122. package/esm2022/app/modules/dropdown/models/dropdown-option-group.model.mjs +2 -0
  123. package/esm2022/app/modules/dropdown/models/dropdown-option.model.mjs +2 -0
  124. package/esm2022/app/modules/endpoint-state/components/endpoint-state.component.mjs +75 -0
  125. package/esm2022/app/modules/endpoint-state/endpoint-state.module.mjs +22 -0
  126. package/esm2022/app/modules/icons/components/icon-select.component.mjs +377 -0
  127. package/esm2022/app/modules/icons/models/fontawesome-icons-brands.model.mjs +471 -0
  128. package/esm2022/app/modules/icons/models/fontawesome-icons-regular.model.mjs +166 -0
  129. package/esm2022/app/modules/icons/models/fontawesome-icons-solid.model.mjs +1016 -0
  130. package/esm2022/app/modules/icons/models/particle-icons-light.model.mjs +310 -0
  131. package/esm2022/app/modules/icons/models/particle-icons-regular.model.mjs +324 -0
  132. package/esm2022/app/modules/icons/models/particle-icons-solid.model.mjs +581 -0
  133. package/esm2022/app/modules/icons/particle-icons.module.mjs +66 -0
  134. package/esm2022/app/modules/icons/services/icons.service.mjs +86 -0
  135. package/esm2022/app/modules/idle-timeout/idle-timeout.component.mjs +85 -0
  136. package/esm2022/app/modules/idle-timeout/idle-timer.mjs +66 -0
  137. package/esm2022/app/modules/idle-timeout/particle-idle-timeout.module.mjs +28 -0
  138. package/esm2022/app/modules/input-mask/input-mask.component.mjs +594 -0
  139. package/esm2022/app/modules/input-mask/input-mask.module.mjs +18 -0
  140. package/esm2022/app/modules/keyfilter/keyfilter.directive.mjs +158 -0
  141. package/esm2022/app/modules/keyfilter/keyfilter.module.mjs +18 -0
  142. package/esm2022/app/modules/layout/components/layout-full-framing/layout-full-framing.component.mjs +79 -0
  143. package/esm2022/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.mjs +65 -0
  144. package/esm2022/app/modules/layout/layout.module.mjs +33 -0
  145. package/esm2022/app/modules/loader/components/loader.component.mjs +30 -0
  146. package/esm2022/app/modules/loader/loader.module.mjs +24 -0
  147. package/esm2022/app/modules/multi-select/models/multi-select-option-group.model.mjs +2 -0
  148. package/esm2022/app/modules/multi-select/models/multi-select-option.model.mjs +2 -0
  149. package/esm2022/app/modules/multi-select/multi-select.component.mjs +665 -0
  150. package/esm2022/app/modules/multi-select/multi-select.module.mjs +18 -0
  151. package/esm2022/app/modules/notification/models/notification.model.mjs +2 -0
  152. package/esm2022/app/modules/notification/notification.component.mjs +122 -0
  153. package/esm2022/app/modules/notification/notification.module.mjs +18 -0
  154. package/esm2022/app/modules/notification/services/notification.service.mjs +84 -0
  155. package/esm2022/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.mjs +20 -0
  156. package/esm2022/app/modules/ordinal-number-pipe/ordinal-number.pipe.mjs +49 -0
  157. package/esm2022/app/modules/paginator/pagination-event.model.mjs +29 -0
  158. package/esm2022/app/modules/paginator/paginator.component.mjs +207 -0
  159. package/esm2022/app/modules/paginator/particle-paginator.module.mjs +48 -0
  160. package/esm2022/app/modules/popover/popover.component.mjs +352 -0
  161. package/esm2022/app/modules/popover/popover.module.mjs +24 -0
  162. package/esm2022/app/modules/profile-pic/particle-profile-pic.module.mjs +28 -0
  163. package/esm2022/app/modules/profile-pic/profile-pic.component.mjs +74 -0
  164. package/esm2022/app/modules/progress-bar/progress-bar.component.mjs +43 -0
  165. package/esm2022/app/modules/progress-bar/progress-bar.module.mjs +24 -0
  166. package/esm2022/app/modules/push-container/particle-push-container.module.mjs +26 -0
  167. package/esm2022/app/modules/push-container/push-container-state.model.mjs +2 -0
  168. package/esm2022/app/modules/push-container/push-container.component.mjs +363 -0
  169. package/esm2022/app/modules/rich-text/particle-rich-text.module.mjs +64 -0
  170. package/esm2022/app/modules/rich-text/render-rich-text.component.mjs +18 -0
  171. package/esm2022/app/modules/rich-text/rich-text-capabilities.model.mjs +2 -0
  172. package/esm2022/app/modules/rich-text/rich-text.component.mjs +187 -0
  173. package/esm2022/app/modules/scroll-to-top/particle-scroll-to-top.module.mjs +24 -0
  174. package/esm2022/app/modules/scroll-to-top/scroll-to-top.component.mjs +49 -0
  175. package/esm2022/app/modules/slideover/particle-slideover.module.mjs +24 -0
  176. package/esm2022/app/modules/slideover/slideover.component.mjs +115 -0
  177. package/esm2022/app/modules/slider/slider.component.mjs +243 -0
  178. package/esm2022/app/modules/slider/slider.module.mjs +26 -0
  179. package/esm2022/app/modules/theming/components/theming.component.mjs +86 -0
  180. package/esm2022/app/modules/theming/models/theme.model.mjs +9 -0
  181. package/esm2022/app/modules/theming/services/theme-change-detection.service.mjs +38 -0
  182. package/esm2022/app/modules/theming/services/theming.service.mjs +507 -0
  183. package/esm2022/app/modules/theming/theming.module.mjs +55 -0
  184. package/esm2022/app/modules/toggle-switch/models/toggle-options.model.mjs +2 -0
  185. package/esm2022/app/modules/toggle-switch/toggle-switch.component.mjs +107 -0
  186. package/esm2022/app/modules/toggle-switch/toggle-switch.module.mjs +24 -0
  187. package/esm2022/app/modules/tooltip/tooltip.directive.mjs +381 -0
  188. package/esm2022/app/modules/tooltip/tooltip.module.mjs +18 -0
  189. package/esm2022/app/modules/week-picker/week-picker.component.mjs +511 -0
  190. package/esm2022/app/modules/week-picker/week-picker.module.mjs +40 -0
  191. package/esm2022/app/shared/enums/endpoint-status.enum.mjs +11 -0
  192. package/esm2022/app/shared/interceptors/json.interceptor.mjs +23 -0
  193. package/esm2022/app/shared/models/auditable.model.mjs +2 -0
  194. package/esm2022/app/shared/models/data-list.model.mjs +2 -0
  195. package/esm2022/app/shared/models/id.model.mjs +2 -0
  196. package/esm2022/app/shared/models/observable-container.mjs +15 -0
  197. package/esm2022/app/shared/models/particle-component-text.model.mjs +2 -0
  198. package/esm2022/app/shared/services/base-data.service.mjs +190 -0
  199. package/esm2022/app/shared/services/dialog.service.mjs +50 -0
  200. package/esm2022/app/shared/services/local-storage.service.mjs +60 -0
  201. package/esm2022/entake-particle.mjs +5 -0
  202. package/esm2022/public_api.mjs +98 -0
  203. package/fesm2022/entake-particle.mjs +12477 -0
  204. package/fesm2022/entake-particle.mjs.map +1 -0
  205. package/index.d.ts +5 -0
  206. package/package.json +65 -0
  207. package/particle.css +1 -0
  208. package/public_api.d.ts +97 -0
@@ -0,0 +1,507 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { Z_INDEX_LAYERS } from '../models/theme.model';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../../shared/services/local-storage.service";
6
+ import * as i2 from "./theme-change-detection.service";
7
+ export class ThemingService {
8
+ localStorageService;
9
+ themeChangeDetectionService;
10
+ // PSA: ORDER MATTERS, DO NOT MOVE ITEMS AROUND
11
+ defaultZIndexes = [
12
+ Z_INDEX_LAYERS.BASE,
13
+ Z_INDEX_LAYERS.FRAME,
14
+ Z_INDEX_LAYERS.OVERLAY,
15
+ Z_INDEX_LAYERS.DIALOG,
16
+ Z_INDEX_LAYERS.NOTIFICATION
17
+ ];
18
+ /**
19
+ * Prefix used to build the key for local storage of the theme
20
+ */
21
+ THEME_KEY = 'theme';
22
+ /**
23
+ * A private BehaviorSubject to store the loaded themes
24
+ */
25
+ themes = new BehaviorSubject([]);
26
+ $selectedTheme = new BehaviorSubject(null);
27
+ get selectedTheme() {
28
+ return this.$selectedTheme.asObservable();
29
+ }
30
+ /**
31
+ * Key for the product this is deployed into
32
+ */
33
+ applicationName = null;
34
+ /**
35
+ * Constructor
36
+ *
37
+ * @param localStorageService
38
+ * @param themeChangeDetectionService
39
+ */
40
+ constructor(localStorageService, themeChangeDetectionService) {
41
+ this.localStorageService = localStorageService;
42
+ this.themeChangeDetectionService = themeChangeDetectionService;
43
+ }
44
+ /**
45
+ * Converts a JSON property name to snake case
46
+ *
47
+ * @param prop
48
+ */
49
+ toSnakeCase(prop) {
50
+ return prop.split(/(?=[A-Z])/).join('_').toLowerCase();
51
+ }
52
+ toKebabCase(prop) {
53
+ return prop.split(/(?=[A-Z])/).join('-').toLowerCase();
54
+ }
55
+ convertUnderscoreToDash(prop) {
56
+ return prop.split('_').join('-').toLowerCase();
57
+ }
58
+ /**
59
+ * For the given color, it'll lighten or darken the color by the percentage supplied. Positive percent will lighten, negative to darken.
60
+ *
61
+ * @param color
62
+ * @param percent
63
+ */
64
+ lightenDarkenColor(color, percent) {
65
+ let usePound = false;
66
+ if (color[0] === '#') {
67
+ color = color.slice(1);
68
+ usePound = true;
69
+ }
70
+ const num = parseInt(color, 16);
71
+ let r = (num >> 16) + percent;
72
+ if (r > 255) {
73
+ r = 255;
74
+ }
75
+ else if (r < 0) {
76
+ r = 0;
77
+ }
78
+ let b = ((num >> 8) & 0x00FF) + percent;
79
+ if (b > 255) {
80
+ b = 255;
81
+ }
82
+ else if (b < 0) {
83
+ b = 0;
84
+ }
85
+ let g = (num & 0x0000FF) + percent;
86
+ if (g > 255) {
87
+ g = 255;
88
+ }
89
+ else if (g < 0) {
90
+ g = 0;
91
+ }
92
+ let newColor = (g | (b << 8) | (r << 16)).toString(16);
93
+ while (newColor.length < 6) {
94
+ newColor = '0' + newColor;
95
+ }
96
+ return (usePound ? '#' : '') + newColor;
97
+ }
98
+ /**
99
+ * Converts a hex value to a Javascript object with r,g, and b variables.
100
+ *
101
+ * @param hex
102
+ */
103
+ hexToRgb(hex) {
104
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
105
+ return result ? {
106
+ r: parseInt(result[1], 16),
107
+ g: parseInt(result[2], 16),
108
+ b: parseInt(result[3], 16)
109
+ } : null;
110
+ }
111
+ /**
112
+ * Generates a random hex color
113
+ */
114
+ getRandomColor() {
115
+ return '#' + Math.floor(Math.random() * 16777215).toString(16);
116
+ }
117
+ /**
118
+ * On App Initialization (in app.component.ts, ngOnInit) call this to load themes and apply the user selected theme or default theme.
119
+ *
120
+ * @param applicationName
121
+ * @param themes
122
+ */
123
+ appInit(applicationName, themes) {
124
+ if (!applicationName) {
125
+ throw new Error('Application Name was not supplied.');
126
+ }
127
+ this.applicationName = applicationName;
128
+ this.themes.next(themes);
129
+ this.applySettings();
130
+ }
131
+ /**
132
+ * Return the themes for the current app
133
+ */
134
+ getThemes() {
135
+ return this.themes;
136
+ }
137
+ /**
138
+ * Apply the selected theme
139
+ */
140
+ applySettings() {
141
+ const settings = this.getTheme();
142
+ this.$selectedTheme.next(settings);
143
+ this.changeColors(settings);
144
+ }
145
+ /**
146
+ * Constructs a theme object based on another theme object
147
+ *
148
+ * @param theme
149
+ */
150
+ generateTheme(theme) {
151
+ let newTheme = {};
152
+ if (theme) {
153
+ for (const prop of Object.keys(theme)) {
154
+ // @ts-ignore
155
+ newTheme[prop] = theme[prop];
156
+ }
157
+ }
158
+ else {
159
+ newTheme = this.themes.getValue().find(theTheme => theTheme.isDefault);
160
+ }
161
+ return newTheme;
162
+ }
163
+ /**
164
+ * Returns a list of the color classes specifically based on the properties of the theme model
165
+ */
166
+ getClassesFromTheme(theme) {
167
+ const classes = [];
168
+ for (const prop of Object.keys(theme)) {
169
+ if (prop.toLowerCase().includes('bg') || prop.toLowerCase().includes('color')) {
170
+ classes.push(prop.split(/(?=[A-Z])/).join('_').toLowerCase());
171
+ }
172
+ }
173
+ return classes;
174
+ }
175
+ /**
176
+ * Returns the user selected theme from local storage
177
+ */
178
+ getTheme() {
179
+ const themeId = this.localStorageService.getObject(this.applicationName + this.THEME_KEY);
180
+ let defaultTheme = this.themes.value.filter(theme => theme.isDefault)[0];
181
+ for (const theme of this.themes.value) {
182
+ if (theme.themeId === themeId) {
183
+ return theme;
184
+ }
185
+ }
186
+ return defaultTheme;
187
+ }
188
+ /**
189
+ * Persists the user selected theme in local storage
190
+ *
191
+ * @param settings
192
+ */
193
+ saveTheme(settings) {
194
+ this.$selectedTheme.next(settings);
195
+ this.localStorageService.putObject(this.applicationName + this.THEME_KEY, settings.themeId);
196
+ }
197
+ /**
198
+ * Writes the theme information to a style tag in the header so that the theme is applied.
199
+ *
200
+ * @param theme
201
+ * @param prefix
202
+ */
203
+ changeColors(theme, prefix) {
204
+ if (!prefix) {
205
+ prefix = '';
206
+ }
207
+ const style = document.createElement('style');
208
+ let rootVars = ':root {';
209
+ // Render the color palette styles
210
+ if (theme.colorPalette) {
211
+ for (const prop of Object.keys(theme.colorPalette)) {
212
+ if (prop !== 'extension') {
213
+ const value = theme.colorPalette[prop];
214
+ const color = this.addHashmark(value);
215
+ this.generateColors(style, color, prefix + this.toSnakeCase(prop));
216
+ rootVars += `--${prefix}${this.toKebabCase(prop)}-color: ${color};`;
217
+ }
218
+ }
219
+ for (const extension of theme.colorPalette.extension) {
220
+ if (extension.textColor && !extension.color) {
221
+ style.appendChild(document.createTextNode(`.${prefix}${extension.className}{color: ${this.addHashmark(extension.textColor)};}`));
222
+ }
223
+ if (extension.color) {
224
+ if (!extension.textColor) {
225
+ this.generateColors(style, this.addHashmark(extension.color), prefix + extension.className);
226
+ }
227
+ else {
228
+ style.appendChild(document.createTextNode(`.${prefix}${extension.className}{background-color: ${this.addHashmark(extension.color)};color: ${this.addHashmark(extension.textColor)};fill: currentColor;}`));
229
+ }
230
+ rootVars += `--${prefix}${this.convertUnderscoreToDash(extension.className)}: ${this.addHashmark(extension.color)};`;
231
+ }
232
+ }
233
+ }
234
+ // Render the layout color styles
235
+ if (theme.layoutColors) {
236
+ for (const prop of Object.keys(theme.layoutColors)) {
237
+ const value = theme.layoutColors[prop];
238
+ const color = value.startsWith('#') ? value : '#' + value;
239
+ this.generateColors(style, color, prefix + this.toSnakeCase(prop));
240
+ rootVars += `--${prefix}${this.toKebabCase(prop)}: ${color};`;
241
+ }
242
+ if (this.isDarkTheme(theme.layoutColors.bodyColor)) {
243
+ style.appendChild(document.createTextNode(`.${prefix}bg_overlay{background-color:rgba(255,255,255,0.05);color:inherit;}`));
244
+ style.appendChild(document.createTextNode(`.${prefix}bg_overlay_rev{background-color:rgba(0,0,0,0.05);color:inherit;}`));
245
+ style.appendChild(document.createTextNode(`.${prefix}brdr{border:1px solid rgba(150,150,150,0.5);}`));
246
+ }
247
+ else {
248
+ style.appendChild(document.createTextNode(`.${prefix}bg_overlay{background-color:rgba(255,255,255,0.1);color:inherit;}`));
249
+ style.appendChild(document.createTextNode(`.${prefix}bg_overlay_rev{background-color:rgba(0,0,0,0.04);color:inherit;}`));
250
+ style.appendChild(document.createTextNode(`.${prefix}brdr{border:1px solid rgba(150,150,150,0.5);}`));
251
+ }
252
+ }
253
+ if (theme.accessibility && theme.accessibility.enabled) {
254
+ const outlineColor = theme.accessibility.highlightColor.startsWith('#') ? theme.accessibility.highlightColor : '#' + theme.accessibility.highlightColor;
255
+ style.appendChild(document.createTextNode(`.${prefix}access{outline: ${outlineColor} ${theme.accessibility.highlightThickness} solid !important;outline-color: transparent !important;transition:all 0.3s ease-in-out;}`));
256
+ style.appendChild(document.createTextNode(`.${prefix}access:focus{outline: ${outlineColor} ${theme.accessibility.highlightThickness} solid !important;outline-offset: ${theme.accessibility.highlightOffset};}`));
257
+ if (theme.accessibility.hoverEnabled) {
258
+ style.appendChild(document.createTextNode(`.${prefix}access:hover{outline: ${outlineColor} ${theme.accessibility.highlightThickness} solid !important;outline-offset: ${theme.accessibility.highlightOffset};}`));
259
+ }
260
+ }
261
+ // Render the button color styles
262
+ if (theme.buttonColorPalette) {
263
+ for (const prop of Object.keys(theme.buttonColorPalette)) {
264
+ const value = theme.buttonColorPalette[prop];
265
+ const color = value.startsWith('#') ? value : '#' + value;
266
+ this.generateColors(style, color, prefix + this.toSnakeCase(prop));
267
+ rootVars += `--${prefix}${this.toKebabCase(prop)}: ${color};`;
268
+ }
269
+ }
270
+ if (theme.stylingVariables) {
271
+ if (theme.stylingVariables.inputTextSize) {
272
+ style.appendChild(document.createTextNode(`.${prefix}ptl_input_text_size{font-size: ${theme.stylingVariables.inputTextSize};}`));
273
+ }
274
+ if (theme.stylingVariables.inputLabelSize) {
275
+ style.appendChild(document.createTextNode(`.${prefix}ptl_input_label_size{font-size: ${theme.stylingVariables.inputLabelSize};}`));
276
+ }
277
+ if (theme.stylingVariables.inputBgColor) {
278
+ style.appendChild(document.createTextNode(`.${prefix}ptl_input_bg_color{background-color: ${this.addHashmark(theme.stylingVariables.inputBgColor)};color: ${this.getTextColor(theme.stylingVariables.inputBgColor)}}`));
279
+ }
280
+ if (theme.stylingVariables.borderColor) {
281
+ style.appendChild(document.createTextNode(`.${prefix}ptl_brdr_color{border-color: ${this.addHashmark(theme.stylingVariables.borderColor)};}`));
282
+ }
283
+ if (theme.stylingVariables.borderSize) {
284
+ style.appendChild(document.createTextNode(`.${prefix}ptl_brdr_size{border-width: ${theme.stylingVariables.borderSize};border-style:solid;}`));
285
+ }
286
+ if (theme.stylingVariables.borderRadius) {
287
+ style.appendChild(document.createTextNode(`.${prefix}ptl_brdr_radius{border-radius: ${theme.stylingVariables.borderRadius};}`));
288
+ }
289
+ if (theme.stylingVariables.inputHeight) {
290
+ style.appendChild(document.createTextNode(`.${prefix}ptl_input_height{height: ${theme.stylingVariables.inputHeight};}`));
291
+ }
292
+ if (theme.stylingVariables.inputPadding) {
293
+ style.appendChild(document.createTextNode(`.${prefix}ptl_input_padding{padding: ${theme.stylingVariables.inputPadding};}`));
294
+ }
295
+ if (theme.stylingVariables.tooltipTextSize || theme.stylingVariables.tooltipBackgroundColor) {
296
+ const bgColor = theme.stylingVariables.tooltipBackgroundColor;
297
+ const textSize = theme.stylingVariables.tooltipTextSize;
298
+ const borderSize = theme.stylingVariables.tooltipBorderSize;
299
+ const borderColor = theme.stylingVariables.tooltipBorderColor;
300
+ const caretSize = theme.stylingVariables.tooltipCaretSize ?? '6px';
301
+ let tooltipStyle = '.particle_tooltip{';
302
+ if (bgColor) {
303
+ const textColor = this.getTextColor(bgColor);
304
+ tooltipStyle += `color: ${textColor};`;
305
+ tooltipStyle += `background-color: ${bgColor};`;
306
+ }
307
+ if (borderColor && borderSize) {
308
+ tooltipStyle += `border: ${borderSize} solid ${borderColor};`;
309
+ }
310
+ if (textSize) {
311
+ tooltipStyle += 'font-size: ' + textSize + ';';
312
+ }
313
+ tooltipStyle += '}';
314
+ style.appendChild(document.createTextNode(tooltipStyle));
315
+ let caretStyleColor = null;
316
+ if (borderColor && borderSize) {
317
+ caretStyleColor = borderColor;
318
+ }
319
+ else if (bgColor) {
320
+ caretStyleColor = bgColor;
321
+ }
322
+ if (caretStyleColor) {
323
+ style.appendChild(document.createTextNode(`.particle_tooltip.right::after{border-color: transparent ${caretStyleColor} transparent transparent;margin-top: -${caretSize};border-width: ${caretSize};}`));
324
+ style.appendChild(document.createTextNode(`.particle_tooltip.left::after{border-color: transparent transparent transparent ${caretStyleColor};margin-top: -${caretSize};border-width: ${caretSize};}`));
325
+ style.appendChild(document.createTextNode(`.particle_tooltip.top::after{border-color: ${caretStyleColor} transparent transparent transparent;margin-left: -${caretSize};border-width: ${caretSize};}`));
326
+ style.appendChild(document.createTextNode(`.particle_tooltip.bottom::after{border-color: transparent transparent ${caretStyleColor} transparent;margin-left: -${caretSize};border-width: ${caretSize};}`));
327
+ }
328
+ }
329
+ }
330
+ const head = document.head || document.getElementsByTagName('head')[0];
331
+ this.removeThemeFromHeader(prefix);
332
+ // Write the fonts to the header
333
+ if (prefix === '') {
334
+ this.addFonts(theme, head, style);
335
+ rootVars = this.createZIndexes(rootVars, theme.zIndexList);
336
+ }
337
+ rootVars += '}';
338
+ style.appendChild(document.createTextNode(rootVars));
339
+ style.setAttribute('id', (prefix ? prefix + '-' : '') + 'particle-theme');
340
+ head.appendChild(style);
341
+ this.themeChangeDetectionService.changeTheme();
342
+ }
343
+ addHashmark(color) {
344
+ return color.startsWith('#') ? color : '#' + color;
345
+ }
346
+ addFonts(theme, head, style) {
347
+ if (!theme.fonts) {
348
+ return;
349
+ }
350
+ let defaultFont = null;
351
+ for (const font of theme.fonts) {
352
+ if (font.isDefault || theme.fonts.length === 1) {
353
+ defaultFont = font;
354
+ }
355
+ if (!this.fontExists(head, font)) {
356
+ let element = document.createElement('link');
357
+ if (font.source === 'adobe') {
358
+ element.setAttribute('href', `https://use.typekit.net/${font.id}.css`);
359
+ }
360
+ else {
361
+ element.setAttribute('href', `https://fonts.googleapis.com/css?family=${font.name.replace(' ', '+')}&display=swap`);
362
+ }
363
+ element.setAttribute('rel', 'stylesheet');
364
+ head.appendChild(element);
365
+ }
366
+ }
367
+ style.appendChild(document.createTextNode(`html * { font-family: ${defaultFont.name}, ${defaultFont.isSerif ? 'serif' : 'sans-serif'}; }`));
368
+ }
369
+ fontExists(head, font) {
370
+ for (const child of head.childNodes) {
371
+ if (child.href && font.source === 'adobe' && child.href.indexOf(font.id) > -1) {
372
+ return true;
373
+ }
374
+ else if (child.href && child.href.indexOf(font.name.replace(' ', '+')) > -1) {
375
+ return true;
376
+ }
377
+ }
378
+ return false;
379
+ }
380
+ removeThemeFromHeader(prefix) {
381
+ const head = document.head || document.getElementsByTagName('head')[0];
382
+ for (const child of head.childNodes) {
383
+ if (child.id === (prefix ? prefix + '-' : '') + 'particle-theme') {
384
+ head.removeChild(child);
385
+ break;
386
+ }
387
+ }
388
+ }
389
+ /**
390
+ * Determines the contrast between a given color and its auto-selected text color
391
+ *
392
+ * @param color
393
+ */
394
+ getContrast(color) {
395
+ const colorRgb = this.hexToRgb(color);
396
+ const textColorRgb = this.hexToRgb(this.getTextColor(color));
397
+ return this.contrast(colorRgb, textColorRgb);
398
+ }
399
+ /**
400
+ * Calculates luminance
401
+ *
402
+ * @param r
403
+ * @param g
404
+ * @param b
405
+ */
406
+ luminance(r, g, b) {
407
+ const a = [r, g, b].map(function (v) {
408
+ v /= 255;
409
+ return v <= 0.03928
410
+ ? v / 12.92
411
+ : Math.pow((v + 0.055) / 1.055, 2.4);
412
+ });
413
+ return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;
414
+ }
415
+ isDarkTheme(color) {
416
+ const rgb = this.hexToRgb(color);
417
+ return (this.luminance(rgb.r, rgb.g, rgb.b) * 100) < 50;
418
+ }
419
+ /**
420
+ * Calculates the contrast
421
+ *
422
+ * @param rgb1
423
+ * @param rgb2
424
+ */
425
+ contrast(rgb1, rgb2) {
426
+ let contrast = (this.luminance(rgb1.r, rgb1.g, rgb1.b) + 0.05)
427
+ / (this.luminance(rgb2.r, rgb2.g, rgb2.b) + 0.05);
428
+ if (contrast < 1) {
429
+ contrast = (this.luminance(rgb2.r, rgb2.g, rgb2.b) + 0.05)
430
+ / (this.luminance(rgb1.r, rgb1.g, rgb1.b) + 0.05);
431
+ }
432
+ return contrast;
433
+ }
434
+ /**
435
+ * Returns the maximally contrasting text color for the supplied background color
436
+ *
437
+ * @param color
438
+ */
439
+ getTextColor(color) {
440
+ const rgb = this.hexToRgb(color);
441
+ let textRgb = this.hexToRgb('#FFFFFF');
442
+ const whiteContrast = this.contrast(textRgb, rgb);
443
+ textRgb = this.hexToRgb('#222222');
444
+ const blackContrast = this.contrast(textRgb, rgb);
445
+ // 7 is the contrast ratio for WCAG AAA, if we're less than that, go full black for max contrast
446
+ if (blackContrast > whiteContrast && blackContrast < 7) {
447
+ return '#000000';
448
+ }
449
+ return whiteContrast > blackContrast ? '#FFFFFF' : '#222222';
450
+ }
451
+ /**
452
+ * Generates the CSS for each of the colors in the theme. Will write the base color and 9 light and dark variants of the given color.
453
+ *
454
+ * @param style
455
+ * @param color
456
+ * @param className
457
+ */
458
+ generateColors(style, color, className) {
459
+ if (!color) {
460
+ return;
461
+ }
462
+ let textColor = this.getTextColor(color);
463
+ style.appendChild(document.createTextNode(`.${className}{background-color: ${color};color: ${textColor};fill: currentColor;}`));
464
+ for (let i = 1; i < 10; i++) {
465
+ const newColor = this.lightenDarkenColor(color, i * 10);
466
+ textColor = this.getTextColor(newColor);
467
+ style.appendChild(document.createTextNode(`.${className}_light_${i}{background-color: ${newColor};color: ${textColor};fill: currentColor;}`));
468
+ }
469
+ for (let i = 1; i < 10; i++) {
470
+ const newColor = this.lightenDarkenColor(color, 0 - (i * 10));
471
+ textColor = this.getTextColor(newColor);
472
+ style.appendChild(document.createTextNode(`.${className}_dark_${i}{background-color: ${newColor};color: ${textColor};fill: currentColor;}`));
473
+ }
474
+ }
475
+ getDefaultZIndexes() {
476
+ return this.defaultZIndexes;
477
+ }
478
+ createZIndexes(rootVars, zIndexes) {
479
+ let zIndexesToCreate = this.defaultZIndexes;
480
+ if (zIndexes) {
481
+ if (zIndexes.includes(Z_INDEX_LAYERS.BASE)
482
+ && zIndexes.includes(Z_INDEX_LAYERS.FRAME)
483
+ && zIndexes.includes(Z_INDEX_LAYERS.OVERLAY)
484
+ && zIndexes.includes(Z_INDEX_LAYERS.DIALOG)
485
+ && zIndexes.includes(Z_INDEX_LAYERS.NOTIFICATION)) {
486
+ zIndexesToCreate = zIndexes;
487
+ }
488
+ else {
489
+ console.warn('THEMING: Z Index List missing required layers, ignoring provided list.');
490
+ }
491
+ }
492
+ let i = 0;
493
+ for (const zIndex of zIndexesToCreate) {
494
+ rootVars += `--z-${zIndex}: ${i++};`;
495
+ }
496
+ return rootVars;
497
+ }
498
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: ThemingService, deps: [{ token: i1.LocalStorageService }, { token: i2.ThemeChangeDetectionService }], target: i0.ɵɵFactoryTarget.Injectable });
499
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: ThemingService, providedIn: 'root' });
500
+ }
501
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: ThemingService, decorators: [{
502
+ type: Injectable,
503
+ args: [{
504
+ providedIn: 'root'
505
+ }]
506
+ }], ctorParameters: () => [{ type: i1.LocalStorageService }, { type: i2.ThemeChangeDetectionService }] });
507
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWluZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL3RoZW1pbmcvc2VydmljZXMvdGhlbWluZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLGVBQWUsRUFBYSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQW1CLGNBQWMsRUFBQyxNQUFNLHVCQUF1QixDQUFDOzs7O0FBT3ZFLE1BQU0sT0FBTyxjQUFjO0lBd0NmO0lBQ0E7SUF2Q1YsK0NBQStDO0lBQzlCLGVBQWUsR0FBa0I7UUFDaEQsY0FBYyxDQUFDLElBQUk7UUFDbkIsY0FBYyxDQUFDLEtBQUs7UUFDcEIsY0FBYyxDQUFDLE9BQU87UUFDdEIsY0FBYyxDQUFDLE1BQU07UUFDckIsY0FBYyxDQUFDLFlBQVk7S0FDNUIsQ0FBQztJQUVGOztPQUVHO0lBQ2MsU0FBUyxHQUFHLE9BQU8sQ0FBQztJQUVyQzs7T0FFRztJQUNLLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBVSxFQUFFLENBQUMsQ0FBQztJQUUxQyxjQUFjLEdBQUcsSUFBSSxlQUFlLENBQVEsSUFBVyxDQUFDLENBQUM7SUFFakUsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFHRDs7T0FFRztJQUNPLGVBQWUsR0FBVyxJQUFXLENBQUM7SUFFaEQ7Ozs7O09BS0c7SUFDSCxZQUNVLG1CQUF3QyxFQUN4QywyQkFBd0Q7UUFEeEQsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxnQ0FBMkIsR0FBM0IsMkJBQTJCLENBQTZCO0lBRWxFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssV0FBVyxDQUFDLElBQVk7UUFDOUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFD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QUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFTyxjQUFjLENBQUMsUUFBZ0IsRUFBRSxRQUF1QjtRQUM5RCxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFFNUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO21CQUNyQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7bUJBQ3ZDLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQzttQkFDekMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO21CQUN4QyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFDakQsQ0FBQztnQkFDRCxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7WUFDOUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0VBQXdFLENBQUMsQ0FBQztZQUN6RixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLEtBQUssTUFBTSxNQUFNLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUN0QyxRQUFRLElBQUksT0FBTyxNQUFNLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQztRQUN2QyxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzt1R0Fya0JVLGNBQWM7MkdBQWQsY0FBYyxjQUZiLE1BQU07OzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1RoZW1lLCBUaGVtZUZvbnQsIFpfSU5ERVhfTEFZRVJTfSBmcm9tICcuLi9tb2RlbHMvdGhlbWUubW9kZWwnO1xyXG5pbXBvcnQge1RoZW1lQ2hhbmdlRGV0ZWN0aW9uU2VydmljZX0gZnJvbSAnLi90aGVtZS1jaGFuZ2UtZGV0ZWN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge0xvY2FsU3RvcmFnZVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9sb2NhbC1zdG9yYWdlLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGhlbWluZ1NlcnZpY2Uge1xyXG5cclxuICAvLyBQU0E6IE9SREVSIE1BVFRFUlMsIERPIE5PVCBNT1ZFIElURU1TIEFST1VORFxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFpJbmRleGVzOiBBcnJheTxzdHJpbmc+ID0gW1xyXG4gICAgWl9JTkRFWF9MQVlFUlMuQkFTRSxcclxuICAgIFpfSU5ERVhfTEFZRVJTLkZSQU1FLFxyXG4gICAgWl9JTkRFWF9MQVlFUlMuT1ZFUkxBWSxcclxuICAgIFpfSU5ERVhfTEFZRVJTLkRJQUxPRyxcclxuICAgIFpfSU5ERVhfTEFZRVJTLk5PVElGSUNBVElPTlxyXG4gIF07XHJcblxyXG4gIC8qKlxyXG4gICAqIFByZWZpeCB1c2VkIHRvIGJ1aWxkIHRoZSBrZXkgZm9yIGxvY2FsIHN0b3JhZ2Ugb2YgdGhlIHRoZW1lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBUSEVNRV9LRVkgPSAndGhlbWUnO1xyXG5cclxuICAvKipcclxuICAgKiBBIHByaXZhdGUgQmVoYXZpb3JTdWJqZWN0IHRvIHN0b3JlIHRoZSBsb2FkZWQgdGhlbWVzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0aGVtZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRoZW1lW10+KFtdKTtcclxuXHJcbiAgcHJpdmF0ZSAkc2VsZWN0ZWRUaGVtZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGhlbWU+KG51bGwgYXMgYW55KTtcclxuXHJcbiAgZ2V0IHNlbGVjdGVkVGhlbWUoKTogT2JzZXJ2YWJsZTxUaGVtZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuJHNlbGVjdGVkVGhlbWUuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogS2V5IGZvciB0aGUgcHJvZHVjdCB0aGlzIGlzIGRlcGxveWVkIGludG9cclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXBwbGljYXRpb25OYW1lOiBzdHJpbmcgPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0b3JcclxuICAgKlxyXG4gICAqIEBwYXJhbSBsb2NhbFN0b3JhZ2VTZXJ2aWNlXHJcbiAgICogQHBhcmFtIHRoZW1lQ2hhbmdlRGV0ZWN0aW9uU2VydmljZVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0aGVtZUNoYW5nZURldGVjdGlvblNlcnZpY2U6IFRoZW1lQ2hhbmdlRGV0ZWN0aW9uU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydHMgYSBKU09OIHByb3BlcnR5IG5hbWUgdG8gc25ha2UgY2FzZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHByb3BcclxuICAgKi9cclxuICBwcml2YXRlIHRvU25ha2VDYXNlKHByb3A6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcHJvcC5zcGxpdCgvKD89W0EtWl0pLykuam9pbignXycpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvS2ViYWJDYXNlKHByb3A6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcHJvcC5zcGxpdCgvKD89W0EtWl0pLykuam9pbignLScpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnZlcnRVbmRlcnNjb3JlVG9EYXNoKHByb3A6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcHJvcC5zcGxpdCgnXycpLmpvaW4oJy0nKS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9yIHRoZSBnaXZlbiBjb2xvciwgaXQnbGwgbGlnaHRlbiBvciBkYXJrZW4gdGhlIGNvbG9yIGJ5IHRoZSBwZXJjZW50YWdlIHN1cHBsaWVkLiBQb3NpdGl2ZSBwZXJjZW50IHdpbGwgbGlnaHRlbiwgbmVnYXRpdmUgdG8gZGFya2VuLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvbG9yXHJcbiAgICogQHBhcmFtIHBlcmNlbnRcclxuICAgKi9cclxuICBwcml2YXRlIGxpZ2h0ZW5EYXJrZW5Db2xvcihjb2xvcjogc3RyaW5nLCBwZXJjZW50OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHVzZVBvdW5kID0gZmFsc2U7XHJcbiAgICBpZiAoY29sb3JbMF0gPT09ICcjJykge1xyXG4gICAgICBjb2xvciA9IGNvbG9yLnNsaWNlKDEpO1xyXG4gICAgICB1c2VQb3VuZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbnVtID0gcGFyc2VJbnQoY29sb3IsIDE2KTtcclxuXHJcbiAgICBsZXQgciA9IChudW0gPj4gMTYpICsgcGVyY2VudDtcclxuICAgIGlmIChyID4gMjU1KSB7XHJcbiAgICAgIHIgPSAyNTU7XHJcbiAgICB9IGVsc2UgaWYgKHIgPCAwKSB7XHJcbiAgICAgIHIgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBiID0gKChudW0gPj4gOCkgJiAweDAwRkYpICsgcGVyY2VudDtcclxuICAgIGlmIChiID4gMjU1KSB7XHJcbiAgICAgIGIgPSAyNTU7XHJcbiAgICB9IGVsc2UgaWYgKGIgPCAwKSB7XHJcbiAgICAgIGIgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBnID0gKG51bSAmIDB4MDAwMEZGKSArIHBlcmNlbnQ7XHJcbiAgICBpZiAoZyA+IDI1NSkge1xyXG4gICAgICBnID0gMjU1O1xyXG4gICAgfSBlbHNlIGlmIChnIDwgMCkge1xyXG4gICAgICBnID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbmV3Q29sb3IgPSAoZyB8IChiIDw8IDgpIHwgKHIgPDwgMTYpKS50b1N0cmluZygxNik7XHJcblxyXG4gICAgd2hpbGUgKG5ld0NvbG9yLmxlbmd0aCA8IDYpIHtcclxuICAgICAgbmV3Q29sb3IgPSAnMCcgKyBuZXdDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKHVzZVBvdW5kID8gJyMnIDogJycpICsgbmV3Q29sb3I7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0cyBhIGhleCB2YWx1ZSB0byBhIEphdmFzY3JpcHQgb2JqZWN0IHdpdGggcixnLCBhbmQgYiB2YXJpYWJsZXMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaGV4XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoZXhUb1JnYihoZXg6IHN0cmluZyk6IGFueSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSAvXiM/KFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pJC9pLmV4ZWMoaGV4KTtcclxuICAgIHJldHVybiByZXN1bHQgPyB7XHJcbiAgICAgIHI6IHBhcnNlSW50KHJlc3VsdFsxXSwgMTYpLFxyXG4gICAgICBnOiBwYXJzZUludChyZXN1bHRbMl0sIDE2KSxcclxuICAgICAgYjogcGFyc2VJbnQocmVzdWx0WzNdLCAxNilcclxuICAgIH0gOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIGEgcmFuZG9tIGhleCBjb2xvclxyXG4gICAqL1xyXG4gIGdldFJhbmRvbUNvbG9yKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJyMnICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTY3NzcyMTUpLnRvU3RyaW5nKDE2KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIEFwcCBJbml0aWFsaXphdGlvbiAoaW4gYXBwLmNvbXBvbmVudC50cywgbmdPbkluaXQpIGNhbGwgdGhpcyB0byBsb2FkIHRoZW1lcyBhbmQgYXBwbHkgdGhlIHVzZXIgc2VsZWN0ZWQgdGhlbWUgb3IgZGVmYXVsdCB0aGVtZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBhcHBsaWNhdGlvbk5hbWVcclxuICAgKiBAcGFyYW0gdGhlbWVzXHJcbiAgICovXHJcbiAgYXBwSW5pdChhcHBsaWNhdGlvbk5hbWU6IHN0cmluZywgdGhlbWVzOiBUaGVtZVtdKTogdm9pZCB7XHJcbiAgICAgIGlmICghYXBwbGljYXRpb25OYW1lKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHBsaWNhdGlvbiBOYW1lIHdhcyBub3Qgc3VwcGxpZWQuJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYXBwbGljYXRpb25OYW1lID0gYXBwbGljYXRpb25OYW1lO1xyXG4gICAgICB0aGlzLnRoZW1lcy5uZXh0KHRoZW1lcyk7XHJcbiAgICAgIHRoaXMuYXBwbHlTZXR0aW5ncygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSB0aGVtZXMgZm9yIHRoZSBjdXJyZW50IGFwcFxyXG4gICAqL1xyXG4gIGdldFRoZW1lcygpOiBPYnNlcnZhYmxlPFRoZW1lW10+IHtcclxuICAgIHJldHVybiB0aGlzLnRoZW1lcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IHRoZSBzZWxlY3RlZCB0aGVtZVxyXG4gICAqL1xyXG4gIGFwcGx5U2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0VGhlbWUoKTtcclxuICAgIHRoaXMuJHNlbGVjdGVkVGhlbWUubmV4dChzZXR0aW5ncyk7XHJcbiAgICB0aGlzLmNoYW5nZUNvbG9ycyhzZXR0aW5ncyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgdGhlbWUgb2JqZWN0IGJhc2VkIG9uIGFub3RoZXIgdGhlbWUgb2JqZWN0XHJcbiAgICpcclxuICAgKiBAcGFyYW0gdGhlbWVcclxuICAgKi9cclxuICBnZW5lcmF0ZVRoZW1lKHRoZW1lPzogVGhlbWUpOiBUaGVtZSB7XHJcbiAgICBsZXQgbmV3VGhlbWU6IFRoZW1lID0ge30gYXMgVGhlbWU7XHJcbiAgICBpZiAodGhlbWUpIHtcclxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKHRoZW1lKSkge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBuZXdUaGVtZVtwcm9wXSA9IHRoZW1lW3Byb3BdO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBuZXdUaGVtZSA9IHRoaXMudGhlbWVzLmdldFZhbHVlKCkuZmluZCh0aGVUaGVtZSA9PiB0aGVUaGVtZS5pc0RlZmF1bHQpIGFzIFRoZW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXdUaGVtZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBjb2xvciBjbGFzc2VzIHNwZWNpZmljYWxseSBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgdGhlbWUgbW9kZWxcclxuICAgKi9cclxuICBnZXRDbGFzc2VzRnJvbVRoZW1lKHRoZW1lOiBUaGVtZSk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IGNsYXNzZXMgPSBbXTtcclxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGVtZSkpIHtcclxuICAgICAgaWYgKHByb3AudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYmcnKSB8fCBwcm9wLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2NvbG9yJykpIHtcclxuICAgICAgICBjbGFzc2VzLnB1c2gocHJvcC5zcGxpdCgvKD89W0EtWl0pLykuam9pbignXycpLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNsYXNzZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSB1c2VyIHNlbGVjdGVkIHRoZW1lIGZyb20gbG9jYWwgc3RvcmFnZVxyXG4gICAqL1xyXG4gIGdldFRoZW1lKCk6IFRoZW1lIHtcclxuICAgIGNvbnN0IHRoZW1lSWQgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0T2JqZWN0KHRoaXMuYXBwbGljYXRpb25OYW1lICsgdGhpcy5USEVNRV9LRVkpO1xyXG4gICAgbGV0IGRlZmF1bHRUaGVtZSA9IHRoaXMudGhlbWVzLnZhbHVlLmZpbHRlcih0aGVtZSA9PiB0aGVtZS5pc0RlZmF1bHQpWzBdO1xyXG5cclxuICAgIGZvciAoY29uc3QgdGhlbWUgb2YgdGhpcy50aGVtZXMudmFsdWUpIHtcclxuICAgICAgaWYgKHRoZW1lLnRoZW1lSWQgPT09IHRoZW1lSWQpIHtcclxuICAgICAgICByZXR1cm4gdGhlbWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGVmYXVsdFRoZW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyc2lzdHMgdGhlIHVzZXIgc2VsZWN0ZWQgdGhlbWUgaW4gbG9jYWwgc3RvcmFnZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHNldHRpbmdzXHJcbiAgICovXHJcbiAgc2F2ZVRoZW1lKHNldHRpbmdzOiBUaGVtZSk6IHZvaWQge1xyXG4gICAgdGhpcy4kc2VsZWN0ZWRUaGVtZS5uZXh0KHNldHRpbmdzKTtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5wdXRPYmplY3QodGhpcy5hcHBsaWNhdGlvbk5hbWUgKyB0aGlzLlRIRU1FX0tFWSwgc2V0dGluZ3MudGhlbWVJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXcml0ZXMgdGhlIHRoZW1lIGluZm9ybWF0aW9uIHRvIGEgc3R5bGUgdGFnIGluIHRoZSBoZWFkZXIgc28gdGhhdCB0aGUgdGhlbWUgaXMgYXBwbGllZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB0aGVtZVxyXG4gICAqIEBwYXJhbSBwcmVmaXhcclxuICAgKi9cclxuICBjaGFuZ2VDb2xvcnModGhlbWU6IFRoZW1lLCBwcmVmaXg/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghcHJlZml4KSB7XHJcbiAgICAgIHByZWZpeCA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcclxuICAgIGxldCByb290VmFycyA9ICc6cm9vdCB7JztcclxuXHJcbiAgICAvLyBSZW5kZXIgdGhlIGNvbG9yIHBhbGV0dGUgc3R5bGVzXHJcbiAgICBpZiAodGhlbWUuY29sb3JQYWxldHRlKSB7XHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGVtZS5jb2xvclBhbGV0dGUpKSB7XHJcbiAgICAgICAgaWYgKHByb3AgIT09ICdleHRlbnNpb24nKSB7XHJcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGVtZS5jb2xvclBhbGV0dGUgYXMgYW55KVtwcm9wXSBhcyBzdHJpbmc7XHJcblxyXG4gICAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLmFkZEhhc2htYXJrKHZhbHVlKTtcclxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDb2xvcnMoc3R5bGUsIGNvbG9yLCBwcmVmaXggKyB0aGlzLnRvU25ha2VDYXNlKHByb3ApKTtcclxuXHJcbiAgICAgICAgICByb290VmFycyArPSBgLS0ke3ByZWZpeH0ke3RoaXMudG9LZWJhYkNhc2UocHJvcCl9LWNvbG9yOiAke2NvbG9yfTtgO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgdGhlbWUuY29sb3JQYWxldHRlLmV4dGVuc2lvbikge1xyXG4gICAgICAgIGlmIChleHRlbnNpb24udGV4dENvbG9yICYmICFleHRlbnNpb24uY29sb3IpIHtcclxuICAgICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9JHtleHRlbnNpb24uY2xhc3NOYW1lfXtjb2xvcjogJHt0aGlzLmFkZEhhc2htYXJrKGV4dGVuc2lvbi50ZXh0Q29sb3IpfTt9YCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5jb2xvcikge1xyXG4gICAgICAgICAgaWYgKCFleHRlbnNpb24udGV4dENvbG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDb2xvcnMoc3R5bGUsIHRoaXMuYWRkSGFzaG1hcmsoZXh0ZW5zaW9uLmNvbG9yIGFzIHN0cmluZyksIHByZWZpeCArIGV4dGVuc2lvbi5jbGFzc05hbWUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC4ke3ByZWZpeH0ke2V4dGVuc2lvbi5jbGFzc05hbWV9e2JhY2tncm91bmQtY29sb3I6ICR7dGhpcy5hZGRIYXNobWFyayhleHRlbnNpb24uY29sb3IpfTtjb2xvcjogJHt0aGlzLmFkZEhhc2htYXJrKGV4dGVuc2lvbi50ZXh0Q29sb3IpfTtmaWxsOiBjdXJyZW50Q29sb3I7fWApKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByb290VmFycyArPSBgLS0ke3ByZWZpeH0ke3RoaXMuY29udmVydFVuZGVyc2NvcmVUb0Rhc2goZXh0ZW5zaW9uLmNsYXNzTmFtZSl9OiAke3RoaXMuYWRkSGFzaG1hcmsoZXh0ZW5zaW9uLmNvbG9yIGFzIHN0cmluZyl9O2A7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVuZGVyIHRoZSBsYXlvdXQgY29sb3Igc3R5bGVzXHJcbiAgICBpZiAodGhlbWUubGF5b3V0Q29sb3JzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGVtZS5sYXlvdXRDb2xvcnMpKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSAodGhlbWUubGF5b3V0Q29sb3JzIGFzIGFueSlbcHJvcF0gYXMgc3RyaW5nO1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvciA9IHZhbHVlLnN0YXJ0c1dpdGgoJyMnKSA/IHZhbHVlIDogJyMnICsgdmFsdWU7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNvbG9ycyhzdHlsZSwgY29sb3IsIHByZWZpeCArIHRoaXMudG9TbmFrZUNhc2UocHJvcCkpO1xyXG4gICAgICAgIHJvb3RWYXJzICs9IGAtLSR7cHJlZml4fSR7dGhpcy50b0tlYmFiQ2FzZShwcm9wKX06ICR7Y29sb3J9O2A7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmlzRGFya1RoZW1lKHRoZW1lLmxheW91dENvbG9ycy5ib2R5Q29sb3IpKSB7XHJcbiAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC4ke3ByZWZpeH1iZ19vdmVybGF5e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwwLjA1KTtjb2xvcjppbmhlcml0O31gKSk7XHJcbiAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC4ke3ByZWZpeH1iZ19vdmVybGF5X3JldntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMC4wNSk7Y29sb3I6aW5oZXJpdDt9YCkpO1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9YnJkcntib3JkZXI6MXB4IHNvbGlkIHJnYmEoMTUwLDE1MCwxNTAsMC41KTt9YCkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9Ymdfb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMC4xKTtjb2xvcjppbmhlcml0O31gKSk7XHJcbiAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC4ke3ByZWZpeH1iZ19vdmVybGF5X3JldntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMC4wNCk7Y29sb3I6aW5oZXJpdDt9YCkpO1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9YnJkcntib3JkZXI6MXB4IHNvbGlkIHJnYmEoMTUwLDE1MCwxNTAsMC41KTt9YCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoZW1lLmFjY2Vzc2liaWxpdHkgJiYgdGhlbWUuYWNjZXNzaWJpbGl0eS5lbmFibGVkKSB7XHJcbiAgICAgIGNvbnN0IG91dGxpbmVDb2xvciA9IHRoZW1lLmFjY2Vzc2liaWxpdHkuaGlnaGxpZ2h0Q29sb3Iuc3RhcnRzV2l0aCgnIycpID8gdGhlbWUuYWNjZXNzaWJpbGl0eS5oaWdobGlnaHRDb2xvciA6ICcjJyArIHRoZW1lLmFjY2Vzc2liaWxpdHkuaGlnaGxpZ2h0Q29sb3I7XHJcbiAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9YWNjZXNze291dGxpbmU6ICR7b3V0bGluZUNvbG9yfSAke3RoZW1lLmFjY2Vzc2liaWxpdHkuaGlnaGxpZ2h0VGhpY2tuZXNzfSBzb2xpZCAhaW1wb3J0YW50O291dGxpbmUtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7dHJhbnNpdGlvbjphbGwgMC4zcyBlYXNlLWluLW91dDt9YCkpO1xyXG4gICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgLiR7cHJlZml4fWFjY2Vzczpmb2N1c3tvdXRsaW5lOiAke291dGxpbmVDb2xvcn0gJHt0aGVtZS5hY2Nlc3NpYmlsaXR5LmhpZ2hsaWdodFRoaWNrbmVzc30gc29saWQgIWltcG9ydGFudDtvdXRsaW5lLW9mZnNldDogJHt0aGVtZS5hY2Nlc3NpYmlsaXR5LmhpZ2hsaWdodE9mZnNldH07fWApKTtcclxuXHJcbiAgICAgIGlmICh0aGVtZS5hY2Nlc3NpYmlsaXR5LmhvdmVyRW5hYmxlZCkge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9YWNjZXNzOmhvdmVye291dGxpbmU6ICR7b3V0bGluZUNvbG9yfSAke3RoZW1lLmFjY2Vzc2liaWxpdHkuaGlnaGxpZ2h0VGhpY2tuZXNzfSBzb2xpZCAhaW1wb3J0YW50O291dGxpbmUtb2Zmc2V0OiAke3RoZW1lLmFjY2Vzc2liaWxpdHkuaGlnaGxpZ2h0T2Zmc2V0fTt9YCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVuZGVyIHRoZSBidXR0b24gY29sb3Igc3R5bGVzXHJcbiAgICBpZiAodGhlbWUuYnV0dG9uQ29sb3JQYWxldHRlKSB7XHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGVtZS5idXR0b25Db2xvclBhbGV0dGUpKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSAodGhlbWUuYnV0dG9uQ29sb3JQYWxldHRlIGFzIGFueSlbcHJvcF0gYXMgc3RyaW5nO1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvciA9IHZhbHVlLnN0YXJ0c1dpdGgoJyMnKSA/IHZhbHVlIDogJyMnICsgdmFsdWU7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNvbG9ycyhzdHlsZSwgY29sb3IsIHByZWZpeCArIHRoaXMudG9TbmFrZUNhc2UocHJvcCkpO1xyXG5cclxuICAgICAgICByb290VmFycyArPSBgLS0ke3ByZWZpeH0ke3RoaXMudG9LZWJhYkNhc2UocHJvcCl9OiAke2NvbG9yfTtgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoZW1lLnN0eWxpbmdWYXJpYWJsZXMpIHtcclxuICAgICAgaWYgKHRoZW1lLnN0eWxpbmdWYXJpYWJsZXMuaW5wdXRUZXh0U2l6ZSkge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9cHRsX2lucHV0X3RleHRfc2l6ZXtmb250LXNpemU6ICR7dGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5pbnB1dFRleHRTaXplfTt9YCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5pbnB1dExhYmVsU2l6ZSkge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9cHRsX2lucHV0X2xhYmVsX3NpemV7Zm9udC1zaXplOiAke3RoZW1lLnN0eWxpbmdWYXJpYWJsZXMuaW5wdXRMYWJlbFNpemV9O31gKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGVtZS5zdHlsaW5nVmFyaWFibGVzLmlucHV0QmdDb2xvcikge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9cHRsX2lucHV0X2JnX2NvbG9ye2JhY2tncm91bmQtY29sb3I6ICR7dGhpcy5hZGRIYXNobWFyayh0aGVtZS5zdHlsaW5nVmFyaWFibGVzLmlucHV0QmdDb2xvcil9O2NvbG9yOiAke3RoaXMuZ2V0VGV4dENvbG9yKHRoZW1lLnN0eWxpbmdWYXJpYWJsZXMuaW5wdXRCZ0NvbG9yKX19YCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5ib3JkZXJDb2xvcikge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9cHRsX2JyZHJfY29sb3J7Ym9yZGVyLWNvbG9yOiAke3RoaXMuYWRkSGFzaG1hcmsodGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5ib3JkZXJDb2xvcil9O31gKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGVtZS5zdHlsaW5nVmFyaWFibGVzLmJvcmRlclNpemUpIHtcclxuICAgICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgLiR7cHJlZml4fXB0bF9icmRyX3NpemV7Ym9yZGVyLXdpZHRoOiAke3RoZW1lLnN0eWxpbmdWYXJpYWJsZXMuYm9yZGVyU2l6ZX07Ym9yZGVyLXN0eWxlOnNvbGlkO31gKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGVtZS5zdHlsaW5nVmFyaWFibGVzLmJvcmRlclJhZGl1cykge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9cHRsX2JyZHJfcmFkaXVze2JvcmRlci1yYWRpdXM6ICR7dGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5ib3JkZXJSYWRpdXN9O31gKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGVtZS5zdHlsaW5nVmFyaWFibGVzLmlucHV0SGVpZ2h0KSB7XHJcbiAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC4ke3ByZWZpeH1wdGxfaW5wdXRfaGVpZ2h0e2hlaWdodDogJHt0aGVtZS5zdHlsaW5nVmFyaWFibGVzLmlucHV0SGVpZ2h0fTt9YCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5pbnB1dFBhZGRpbmcpIHtcclxuICAgICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgLiR7cHJlZml4fXB0bF9pbnB1dF9wYWRkaW5ne3BhZGRpbmc6ICR7dGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5pbnB1dFBhZGRpbmd9O31gKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGVtZS5zdHlsaW5nVmFyaWFibGVzLnRvb2x0aXBUZXh0U2l6ZSB8fCB0aGVtZS5zdHlsaW5nVmFyaWFibGVzLnRvb2x0aXBCYWNrZ3JvdW5kQ29sb3IpIHtcclxuICAgICAgICBjb25zdCBiZ0NvbG9yID0gdGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy50b29sdGlwQmFja2dyb3VuZENvbG9yO1xyXG4gICAgICAgIGNvbnN0IHRleHRTaXplID0gdGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy50b29sdGlwVGV4dFNpemU7XHJcbiAgICAgICAgY29uc3QgYm9yZGVyU2l6ZSA9IHRoZW1lLnN0eWxpbmdWYXJpYWJsZXMudG9vbHRpcEJvcmRlclNpemU7XHJcbiAgICAgICAgY29uc3QgYm9yZGVyQ29sb3IgPSB0aGVtZS5zdHlsaW5nVmFyaWFibGVzLnRvb2x0aXBCb3JkZXJDb2xvcjtcclxuICAgICAgICBjb25zdCBjYXJldFNpemUgPSB0aGVtZS5zdHlsaW5nVmFyaWFibGVzLnRvb2x0aXBDYXJldFNpemUgPz8gJzZweCc7XHJcblxyXG4gICAgICAgIGxldCB0b29sdGlwU3R5bGUgPSAnLnBhcnRpY2xlX3Rvb2x0aXB7JztcclxuXHJcbiAgICAgICAgaWYgKGJnQ29sb3IpIHtcclxuICAgICAgICAgIGNvbnN0IHRleHRDb2xvciA9IHRoaXMuZ2V0VGV4dENvbG9yKGJnQ29sb3IpO1xyXG4gICAgICAgICAgdG9vbHRpcFN0eWxlICs9IGBjb2xvcjogJHt0ZXh0Q29sb3J9O2A7XHJcbiAgICAgICAgICB0b29sdGlwU3R5bGUgKz0gYGJhY2tncm91bmQtY29sb3I6ICR7YmdDb2xvcn07YDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChib3JkZXJDb2xvciAmJiBib3JkZXJTaXplKSB7XHJcbiAgICAgICAgICB0b29sdGlwU3R5bGUgKz0gYGJvcmRlcjogJHtib3JkZXJTaXplfSBzb2xpZCAke2JvcmRlckNvbG9yfTtgO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRleHRTaXplKSB7XHJcbiAgICAgICAgICB0b29sdGlwU3R5bGUgKz0gJ2ZvbnQtc2l6ZTogJyArIHRleHRTaXplICsgJzsnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdG9vbHRpcFN0eWxlICs9ICd9JztcclxuICAgICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0b29sdGlwU3R5bGUpKTtcclxuXHJcbiAgICAgICAgbGV0IGNhcmV0U3R5bGVDb2xvcjogc3RyaW5nID0gbnVsbCBhcyBhbnk7XHJcbiAgICAgICAgaWYgKGJvcmRlckNvbG9yICYmIGJvcmRlclNpemUpIHtcclxuICAgICAgICAgIGNhcmV0U3R5bGVDb2xvciA9IGJvcmRlckNvbG9yO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYmdDb2xvcikge1xyXG4gICAgICAgICAgY2FyZXRTdHlsZUNvbG9yID0gYmdDb2xvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYXJldFN0eWxlQ29sb3IpIHtcclxuICAgICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAucGFydGljbGVfdG9vbHRpcC5yaWdodDo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCAke2NhcmV0U3R5bGVDb2xvcn0gdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7bWFyZ2luLXRvcDogLSR7Y2FyZXRTaXplfTtib3JkZXItd2lkdGg6ICR7Y2FyZXRTaXplfTt9YCkpO1xyXG4gICAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC5wYXJ0aWNsZV90b29sdGlwLmxlZnQ6OmFmdGVye2JvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgJHtjYXJldFN0eWxlQ29sb3J9O21hcmdpbi10b3A6IC0ke2NhcmV0U2l6ZX07Ym9yZGVyLXdpZHRoOiAke2NhcmV0U2l6ZX07fWApKTtcclxuICAgICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAucGFydGljbGVfdG9vbHRpcC50b3A6OmFmdGVye2JvcmRlci1jb2xvcjogJHtjYXJldFN0eWxlQ29sb3J9IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O21hcmdpbi1sZWZ0OiAtJHtjYXJldFNpemV9O2JvcmRlci13aWR0aDogJHtjYXJldFNpemV9O31gKSk7XHJcbiAgICAgICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgLnBhcnRpY2xlX3Rvb2x0aXAuYm90dG9tOjphZnRlcntib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICR7Y2FyZXRTdHlsZUNvbG9yfSB0cmFuc3BhcmVudDttYXJnaW4tbGVmdDogLSR7Y2FyZXRTaXplfTtib3JkZXItd2lkdGg6ICR7Y2FyZXRTaXplfTt9YCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XHJcblxyXG4gICAgdGhpcy5yZW1vdmVUaGVtZUZyb21IZWFkZXIocHJlZml4KTtcclxuXHJcbiAgICAvLyBXcml0ZSB0aGUgZm9udHMgdG8gdGhlIGhlYWRlclxyXG4gICAgaWYgKHByZWZpeCA9PT0gJycpIHtcclxuICAgICAgdGhpcy5hZGRGb250cyh0aGVtZSwgaGVhZCwgc3R5bGUpO1xyXG4gICAgICByb290VmFycyA9IHRoaXMuY3JlYXRlWkluZGV4ZXMocm9vdFZhcnMsIHRoZW1lLnpJbmRleExpc3QgYXMgQXJyYXk8c3RyaW5nPik7XHJcbiAgICB9XHJcblxyXG4gICAgcm9vdFZhcnMgKz0gJ30nO1xyXG4gICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocm9vdFZhcnMpKTtcclxuICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgnaWQnLCAocHJlZml4ID8gcHJlZml4ICsgJy0nIDogJycpICsgJ3BhcnRpY2xlLXRoZW1lJyk7XHJcbiAgICBoZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcclxuXHJcbiAgICB0aGlzLnRoZW1lQ2hhbmdlRGV0ZWN0aW9uU2VydmljZS5jaGFuZ2VUaGVtZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRIYXNobWFyayhjb2xvcjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBjb2xvci5zdGFydHNXaXRoKCcjJykgPyBjb2xvciA6ICcjJyArIGNvbG9yO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRGb250cyh0aGVtZTogVGhlbWUsIGhlYWQ6IEhUTUxIZWFkRWxlbWVudCwgc3R5bGU6IEhUTUxTdHlsZUVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhlbWUuZm9udHMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkZWZhdWx0Rm9udDogVGhlbWVGb250ID0gbnVsbCBhcyBhbnk7XHJcbiAgICBmb3IgKGNvbnN0IGZvbnQgb2YgdGhlbWUuZm9udHMpIHtcclxuICAgICAgaWYgKGZvbnQuaXNEZWZhdWx0IHx8IHRoZW1lLmZvbnRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIGRlZmF1bHRGb250ID0gZm9udDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLmZvbnRFeGlzdHMoaGVhZCwgZm9udCkpIHtcclxuICAgICAgICBsZXQgZWxlbWVudDogSFRNTExpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xyXG4gICAgICAgIGlmIChmb250LnNvdXJjZSA9PT0gJ2Fkb2JlJykge1xyXG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBgaHR0cHM6Ly91c2UudHlwZWtpdC5uZXQvJHtmb250LmlkfS5jc3NgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBgaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PSR7Zm9udC5uYW1lLnJlcGxhY2UoJyAnLCAnKycpfSZkaXNwbGF5PXN3YXBgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdzdHlsZXNoZWV0Jyk7XHJcbiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGBodG1sICogeyBmb250LWZhbWlseTogJHtkZWZhdWx0Rm9udC5uYW1lfSwgJHtkZWZhdWx0Rm9udC5pc1NlcmlmID8gJ3NlcmlmJyA6ICdzYW5zLXNlcmlmJ307IH1gKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvbnRFeGlzdHMoaGVhZDogSFRNTEhlYWRFbGVtZW50LCBmb250OiBUaGVtZUZvbnQpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgPGFueT5oZWFkLmNoaWxkTm9kZXMpIHtcclxuICAgICAgaWYgKGNoaWxkLmhyZWYgJiYgZm9udC5zb3VyY2UgPT09ICdhZG9iZScgJiYgY2hpbGQuaHJlZi5pbmRleE9mKGZvbnQuaWQpID4gLTEpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmIChjaGlsZC5ocmVmICYmIGNoaWxkLmhyZWYuaW5kZXhPZihmb250Lm5hbWUucmVwbGFjZSgnICcsICcrJykpID4gLTEpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVRoZW1lRnJvbUhlYWRlcihwcmVmaXg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIDxhbnk+aGVhZC5jaGlsZE5vZGVzKSB7XHJcbiAgICAgIGlmICgoY2hpbGQgYXMgRWxlbWVudCkuaWQgPT09IChwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJykgKyAncGFydGljbGUtdGhlbWUnKSB7XHJcbiAgICAgICAgaGVhZC5yZW1vdmVDaGlsZChjaGlsZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgdGhlIGNvbnRyYXN0IGJldHdlZW4gYSBnaXZlbiBjb2xvciBhbmQgaXRzIGF1dG8tc2VsZWN0ZWQgdGV4dCBjb2xvclxyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvbG9yXHJcbiAgICovXHJcbiAgZ2V0Q29udHJhc3QoY29sb3I6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBjb2xvclJnYiA9IHRoaXMuaGV4VG9SZ2IoY29sb3IpO1xyXG4gICAgY29uc3QgdGV4dENvbG9yUmdiID0gdGhpcy5oZXhUb1JnYih0aGlzLmdldFRleHRDb2xvcihjb2xvcikpO1xyXG4gICAgcmV0dXJuIHRoaXMuY29udHJhc3QoY29sb3JSZ2IsIHRleHRDb2xvclJnYik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxjdWxhdGVzIGx1bWluYW5jZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJcclxuICAgKiBAcGFyYW0gZ1xyXG4gICAqIEBwYXJhbSBiXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsdW1pbmFuY2UocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBhID0gW3IsIGcsIGJdLm1hcChmdW5jdGlvbiAodikge1xyXG4gICAgICB2IC89IDI1NTtcclxuICAgICAgcmV0dXJuIHYgPD0gMC4wMzkyOFxyXG4gICAgICAgID8gdiAvIDEyLjkyXHJcbiAgICAgICAgOiBNYXRoLnBvdygodiArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gYVswXSAqIDAuMjEyNiArIGFbMV0gKiAwLjcxNTIgKyBhWzJdICogMC4wNzIyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0RhcmtUaGVtZShjb2xvcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGNvbG9yKTtcclxuICAgIHJldHVybiAodGhpcy5sdW1pbmFuY2UocmdiLnIsIHJnYi5nLCByZ2IuYikgKiAxMDApIDwgNTA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxjdWxhdGVzIHRoZSBjb250cmFzdFxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJnYjFcclxuICAgKiBAcGFyYW0gcmdiMlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY29udHJhc3QocmdiMTogYW55LCByZ2IyOiBhbnkpOiBudW1iZXIge1xyXG4gICAgbGV0IGNvbnRyYXN0ID0gKHRoaXMubHVtaW5hbmNlKHJnYjEuciwgcmdiMS5nLCByZ2IxLmIpICsgMC4wNSlcclxuICAgICAgLyAodGhpcy5sdW1pbmFuY2UocmdiMi5yLCByZ2IyLmcsIHJnYjIuYikgKyAwLjA1KTtcclxuXHJcbiAgICBpZiAoY29udHJhc3QgPCAxKSB7XHJcbiAgICAgIGNvbnRyYXN0ID0gKHRoaXMubHVtaW5hbmNlKHJnYjIuciwgcmdiMi5nLCByZ2IyLmIpICsgMC4wNSlcclxuICAgICAgICAvICh0aGlzLmx1bWluYW5jZShyZ2IxLnIsIHJnYjEuZywgcmdiMS5iKSArIDAuMDUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb250cmFzdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG1heGltYWxseSBjb250cmFzdGluZyB0ZXh0IGNvbG9yIGZvciB0aGUgc3VwcGxpZWQgYmFja2dyb3VuZCBjb2xvclxyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvbG9yXHJcbiAgICovXHJcbiAgZ2V0VGV4dENvbG9yKGNvbG9yOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihjb2xvcik7XHJcbiAgICBsZXQgdGV4dFJnYiA9IHRoaXMuaGV4VG9SZ2IoJyNGRkZGRkYnKTtcclxuICAgIGNvbnN0IHdoaXRlQ29udHJhc3QgPSB0aGlzLmNvbnRyYXN0KHRleHRSZ2IsIHJnYik7XHJcblxyXG4gICAgdGV4dFJnYiA9IHRoaXMuaGV4VG9SZ2IoJyMyMjIyMjInKTtcclxuICAgIGNvbnN0IGJsYWNrQ29udHJhc3QgPSB0aGlzLmNvbnRyYXN0KHRleHRSZ2IsIHJnYik7XHJcblxyXG4gICAgLy8gNyBpcyB0aGUgY29udHJhc3QgcmF0aW8gZm9yIFdDQUcgQUFBLCBpZiB3ZSdyZSBsZXNzIHRoYW4gdGhhdCwgZ28gZnVsbCBibGFjayBmb3IgbWF4IGNvbnRyYXN0XHJcbiAgICBpZiAoYmxhY2tDb250cmFzdCA+IHdoaXRlQ29udHJhc3QgJiYgYmxhY2tDb250cmFzdCA8IDcpIHtcclxuICAgICAgcmV0dXJuICcjMDAwMDAwJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gd2hpdGVDb250cmFzdCA+IGJsYWNrQ29udHJhc3QgPyAnI0ZGRkZGRicgOiAnIzIyMjIyMic7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgdGhlIENTUyBmb3IgZWFjaCBvZiB0aGUgY29sb3JzIGluIHRoZSB0aGVtZS4gV2lsbCB3cml0ZSB0aGUgYmFzZSBjb2xvciBhbmQgOSBsaWdodCBhbmQgZGFyayB2YXJpYW50cyBvZiB0aGUgZ2l2ZW4gY29sb3IuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gc3R5bGVcclxuICAgKiBAcGFyYW0gY29sb3JcclxuICAgKiBAcGFyYW0gY2xhc3NOYW1lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUNvbG9ycyhzdHlsZTogSFRNTFN0eWxlRWxlbWVudCwgY29sb3I6IHN0cmluZywgY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghY29sb3IpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0ZXh0Q29sb3IgPSB0aGlzLmdldFRleHRDb2xvcihjb2xvcik7XHJcbiAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgLiR7Y2xhc3NOYW1lfXtiYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfTtjb2xvcjogJHt0ZXh0Q29sb3J9O2ZpbGw6IGN1cnJlbnRDb2xvcjt9YCkpO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCAxMDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG5ld0NvbG9yID0gdGhpcy5saWdodGVuRGFya2VuQ29sb3IoY29sb3IsIGkgKiAxMCk7XHJcbiAgICAgIHRleHRDb2xvciA9IHRoaXMuZ2V0VGV4dENvbG9yKG5ld0NvbG9yKTtcclxuXHJcbiAgICAgIHN0eWxlLmFwcGVuZENoaWxkKFxyXG4gICAgICAgIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtjbGFzc05hbWV9X2xpZ2h0XyR7aX17YmFja2dyb3VuZC1jb2xvcjogJHtuZXdDb2xvcn07Y29sb3I6ICR7dGV4dENvbG9yfTtmaWxsOiBjdXJyZW50Q29sb3I7fWApKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IDEwOyBpKyspIHtcclxuICAgICAgY29uc3QgbmV3Q29sb3IgPSB0aGlzLmxpZ2h0ZW5EYXJrZW5Db2xvcihjb2xvciwgMCAtIChpICogMTApKTtcclxuICAgICAgdGV4dENvbG9yID0gdGhpcy5nZXRUZXh0Q29sb3IobmV3Q29sb3IpO1xyXG5cclxuICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoXHJcbiAgICAgICAgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC4ke2NsYXNzTmFtZX1fZGFya18ke2l9e2JhY2tncm91bmQtY29sb3I6ICR7bmV3Q29sb3J9O2NvbG9yOiAke3RleHRDb2xvcn07ZmlsbDogY3VycmVudENvbG9yO31gKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXREZWZhdWx0WkluZGV4ZXMoKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0WkluZGV4ZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVpJbmRleGVzKHJvb3RWYXJzOiBzdHJpbmcsIHpJbmRleGVzOiBBcnJheTxzdHJpbmc+KTogc3RyaW5nIHtcclxuICAgIGxldCB6SW5kZXhlc1RvQ3JlYXRlID0gdGhpcy5kZWZhdWx0WkluZGV4ZXM7XHJcblxyXG4gICAgaWYgKHpJbmRleGVzKSB7XHJcbiAgICAgIGlmICh6SW5kZXhlcy5pbmNsdWRlcyhaX0lOREVYX0xBWUVSUy5CQVNFKVxyXG4gICAgICAgICYmIHpJbmRleGVzLmluY2x1ZGVzKFpfSU5ERVhfTEFZRVJTLkZSQU1FKVxyXG4gICAgICAgICYmIHpJbmRleGVzLmluY2x1ZGVzKFpfSU5ERVhfTEFZRVJTLk9WRVJMQVkpXHJcbiAgICAgICAgJiYgekluZGV4ZXMuaW5jbHVkZXMoWl9JTkRFWF9MQVlFUlMuRElBTE9HKVxyXG4gICAgICAgICYmIHpJbmRleGVzLmluY2x1ZGVzKFpfSU5ERVhfTEFZRVJTLk5PVElGSUNBVElPTilcclxuICAgICAgKSB7XHJcbiAgICAgICAgekluZGV4ZXNUb0NyZWF0ZSA9IHpJbmRleGVzO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignVEhFTUlORzogWiBJbmRleCBMaXN0IG1pc3NpbmcgcmVxdWlyZWQgbGF5ZXJzLCBpZ25vcmluZyBwcm92aWRlZCBsaXN0LicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChjb25zdCB6SW5kZXggb2YgekluZGV4ZXNUb0NyZWF0ZSkge1xyXG4gICAgICByb290VmFycyArPSBgLS16LSR7ekluZGV4fTogJHtpKyt9O2A7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJvb3RWYXJzO1xyXG4gIH1cclxuXHJcbn1cclxuIl19