@angular/core 8.0.0 → 8.1.0-beta.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 (191) hide show
  1. package/bundles/core-testing.umd.js +35 -9
  2. package/bundles/core-testing.umd.js.map +1 -1
  3. package/bundles/core-testing.umd.min.js +10 -10
  4. package/bundles/core-testing.umd.min.js.map +1 -1
  5. package/bundles/core.umd.js +11356 -9352
  6. package/bundles/core.umd.js.map +1 -1
  7. package/bundles/core.umd.min.js +201 -139
  8. package/bundles/core.umd.min.js.map +1 -1
  9. package/core.d.ts +1302 -404
  10. package/core.metadata.json +1 -1
  11. package/esm2015/core.js +2 -3
  12. package/esm2015/index.js +2 -2
  13. package/esm2015/public_api.js +2 -2
  14. package/esm2015/src/application_ref.js +7 -1
  15. package/esm2015/src/codegen_private_exports.js +2 -2
  16. package/esm2015/src/compiler/compiler_facade_interface.js +1 -1
  17. package/esm2015/src/core.js +4 -4
  18. package/esm2015/src/core_private_export.js +3 -1
  19. package/esm2015/src/core_render3_private_export.js +5 -3
  20. package/esm2015/src/debug/debug_node.js +4 -4
  21. package/esm2015/src/di/index.js +3 -3
  22. package/esm2015/src/di/injector.js +24 -96
  23. package/esm2015/src/di/injector_compatibility.js +103 -6
  24. package/esm2015/src/di/interface/defs.js +24 -3
  25. package/esm2015/src/di/r3_injector.js +82 -49
  26. package/esm2015/src/di/reflective_injector.js +3 -2
  27. package/esm2015/src/di.js +1 -1
  28. package/esm2015/src/i18n/locale_data.js +61 -0
  29. package/esm2015/src/i18n/locale_data_api.js +53 -0
  30. package/esm2015/src/i18n/locale_en.js +51 -0
  31. package/esm2015/src/i18n/localization.js +37 -0
  32. package/esm2015/src/linker/ng_module_factory_loader.js +4 -52
  33. package/esm2015/src/linker/ng_module_factory_registration.js +83 -0
  34. package/esm2015/src/metadata/ng_module.js +6 -1
  35. package/esm2015/src/metadata/resource_loading.js +2 -2
  36. package/esm2015/src/reflection/reflection_capabilities.js +14 -3
  37. package/esm2015/src/render3/assert.js +3 -2
  38. package/esm2015/src/render3/component.js +11 -5
  39. package/esm2015/src/render3/debug.js +23 -15
  40. package/esm2015/src/render3/definition.js +12 -2
  41. package/esm2015/src/render3/errors.js +29 -1
  42. package/esm2015/src/render3/features/inherit_definition_feature.js +51 -37
  43. package/esm2015/src/render3/fields.js +3 -1
  44. package/esm2015/src/render3/i18n.js +76 -465
  45. package/esm2015/src/render3/index.js +3 -3
  46. package/esm2015/src/render3/instructions/all.js +9 -4
  47. package/esm2015/src/render3/instructions/attribute.js +28 -0
  48. package/esm2015/src/render3/instructions/attribute_interpolation.js +376 -0
  49. package/esm2015/src/render3/instructions/container.js +17 -16
  50. package/esm2015/src/render3/instructions/element.js +57 -35
  51. package/esm2015/src/render3/instructions/element_container.js +9 -8
  52. package/esm2015/src/render3/instructions/embedded_view.js +9 -12
  53. package/esm2015/src/render3/instructions/interpolation.js +375 -0
  54. package/esm2015/src/render3/instructions/listener.js +3 -2
  55. package/esm2015/src/render3/instructions/projection.js +6 -6
  56. package/esm2015/src/render3/instructions/property.js +10 -4
  57. package/esm2015/src/render3/instructions/property_interpolation.js +49 -382
  58. package/esm2015/src/render3/instructions/shared.js +82 -118
  59. package/esm2015/src/render3/instructions/styling.js +189 -236
  60. package/esm2015/src/render3/instructions/text.js +8 -7
  61. package/esm2015/src/render3/instructions/text_interpolation.js +357 -0
  62. package/esm2015/src/render3/interfaces/container.js +9 -5
  63. package/esm2015/src/render3/interfaces/definition.js +12 -6
  64. package/esm2015/src/render3/interfaces/node.js +20 -8
  65. package/esm2015/src/render3/interfaces/styling.js +16 -15
  66. package/esm2015/src/render3/interfaces/view.js +2 -2
  67. package/esm2015/src/render3/jit/directive.js +14 -5
  68. package/esm2015/src/render3/jit/environment.js +30 -15
  69. package/esm2015/src/render3/jit/module.js +38 -19
  70. package/esm2015/src/render3/ng_module_ref.js +39 -3
  71. package/esm2015/src/render3/node_manipulation.js +45 -43
  72. package/esm2015/src/render3/node_selector_matcher.js +14 -13
  73. package/esm2015/src/render3/query.js +77 -61
  74. package/esm2015/src/render3/state.js +33 -6
  75. package/esm2015/src/render3/styling/class_and_style_bindings.js +91 -79
  76. package/esm2015/src/render3/styling/host_instructions_queue.js +8 -5
  77. package/esm2015/src/render3/styling/shared.js +2 -2
  78. package/esm2015/src/render3/styling/util.js +2 -2
  79. package/esm2015/src/render3/styling_next/bindings.js +602 -0
  80. package/esm2015/src/render3/styling_next/instructions.js +366 -0
  81. package/esm2015/src/render3/styling_next/interfaces.js +374 -0
  82. package/esm2015/src/render3/styling_next/map_based_bindings.js +408 -0
  83. package/esm2015/src/render3/styling_next/state.js +51 -0
  84. package/esm2015/src/render3/styling_next/styling_debug.js +291 -0
  85. package/esm2015/src/render3/styling_next/util.js +259 -0
  86. package/esm2015/src/render3/util/attrs_utils.js +4 -3
  87. package/esm2015/src/render3/util/debug_utils.js +18 -0
  88. package/esm2015/src/render3/util/view_traversal_utils.js +2 -2
  89. package/esm2015/src/render3/view_engine_compatibility.js +24 -10
  90. package/esm2015/src/sanitization/sanitization.js +17 -7
  91. package/esm2015/src/sanitization/style_sanitizer.js +11 -1
  92. package/esm2015/src/util/ng_dev_mode.js +7 -3
  93. package/esm2015/src/version.js +1 -1
  94. package/esm2015/src/view/ng_module.js +3 -3
  95. package/esm2015/src/view/util.js +2 -2
  96. package/esm2015/testing/src/r3_test_bed_compiler.js +44 -12
  97. package/esm5/core.js +2 -3
  98. package/esm5/src/application_ref.js +6 -1
  99. package/esm5/src/codegen_private_exports.js +2 -2
  100. package/esm5/src/compiler/compiler_facade_interface.js +1 -1
  101. package/esm5/src/core_private_export.js +3 -1
  102. package/esm5/src/core_render3_private_export.js +5 -3
  103. package/esm5/src/debug/debug_node.js +4 -4
  104. package/esm5/src/di/index.js +3 -3
  105. package/esm5/src/di/injector.js +14 -74
  106. package/esm5/src/di/injector_compatibility.js +77 -6
  107. package/esm5/src/di/interface/defs.js +24 -3
  108. package/esm5/src/di/r3_injector.js +60 -37
  109. package/esm5/src/di/reflective_injector.js +3 -2
  110. package/esm5/src/i18n/locale_data.js +38 -0
  111. package/esm5/src/i18n/locale_data_api.js +46 -0
  112. package/esm5/src/i18n/locale_en.js +39 -0
  113. package/esm5/src/i18n/localization.js +29 -0
  114. package/esm5/src/linker/ng_module_factory_loader.js +4 -32
  115. package/esm5/src/linker/ng_module_factory_registration.js +50 -0
  116. package/esm5/src/metadata/ng_module.js +1 -1
  117. package/esm5/src/metadata/resource_loading.js +2 -2
  118. package/esm5/src/reflection/reflection_capabilities.js +14 -3
  119. package/esm5/src/render3/assert.js +2 -1
  120. package/esm5/src/render3/component.js +10 -4
  121. package/esm5/src/render3/debug.js +17 -10
  122. package/esm5/src/render3/definition.js +8 -2
  123. package/esm5/src/render3/errors.js +14 -1
  124. package/esm5/src/render3/features/inherit_definition_feature.js +41 -36
  125. package/esm5/src/render3/fields.js +2 -1
  126. package/esm5/src/render3/i18n.js +67 -437
  127. package/esm5/src/render3/index.js +3 -3
  128. package/esm5/src/render3/instructions/all.js +6 -1
  129. package/esm5/src/render3/instructions/attribute.js +22 -0
  130. package/esm5/src/render3/instructions/attribute_interpolation.js +346 -0
  131. package/esm5/src/render3/instructions/container.js +16 -15
  132. package/esm5/src/render3/instructions/element.js +43 -32
  133. package/esm5/src/render3/instructions/element_container.js +9 -8
  134. package/esm5/src/render3/instructions/embedded_view.js +8 -11
  135. package/esm5/src/render3/instructions/interpolation.js +243 -0
  136. package/esm5/src/render3/instructions/listener.js +3 -2
  137. package/esm5/src/render3/instructions/projection.js +6 -6
  138. package/esm5/src/render3/instructions/property.js +10 -4
  139. package/esm5/src/render3/instructions/property_interpolation.js +40 -254
  140. package/esm5/src/render3/instructions/shared.js +70 -105
  141. package/esm5/src/render3/instructions/styling.js +167 -209
  142. package/esm5/src/render3/instructions/text.js +8 -7
  143. package/esm5/src/render3/instructions/text_interpolation.js +264 -0
  144. package/esm5/src/render3/interfaces/container.js +8 -2
  145. package/esm5/src/render3/interfaces/definition.js +1 -1
  146. package/esm5/src/render3/interfaces/node.js +1 -8
  147. package/esm5/src/render3/interfaces/styling.js +2 -2
  148. package/esm5/src/render3/interfaces/view.js +1 -1
  149. package/esm5/src/render3/jit/directive.js +12 -5
  150. package/esm5/src/render3/jit/environment.js +30 -15
  151. package/esm5/src/render3/jit/module.js +23 -18
  152. package/esm5/src/render3/ng_module_ref.js +37 -3
  153. package/esm5/src/render3/node_manipulation.js +39 -38
  154. package/esm5/src/render3/node_selector_matcher.js +14 -13
  155. package/esm5/src/render3/query.js +75 -53
  156. package/esm5/src/render3/state.js +29 -5
  157. package/esm5/src/render3/styling/class_and_style_bindings.js +79 -65
  158. package/esm5/src/render3/styling/host_instructions_queue.js +6 -3
  159. package/esm5/src/render3/styling/shared.js +2 -2
  160. package/esm5/src/render3/styling/util.js +2 -2
  161. package/esm5/src/render3/styling_next/bindings.js +446 -0
  162. package/esm5/src/render3/styling_next/instructions.js +277 -0
  163. package/esm5/src/render3/styling_next/interfaces.js +1 -0
  164. package/esm5/src/render3/styling_next/map_based_bindings.js +324 -0
  165. package/esm5/src/render3/styling_next/state.js +23 -0
  166. package/esm5/src/render3/styling_next/styling_debug.js +130 -0
  167. package/esm5/src/render3/styling_next/util.js +147 -0
  168. package/esm5/src/render3/util/attrs_utils.js +4 -3
  169. package/esm5/src/render3/util/debug_utils.js +11 -0
  170. package/esm5/src/render3/util/view_traversal_utils.js +2 -2
  171. package/esm5/src/render3/view_engine_compatibility.js +23 -10
  172. package/esm5/src/sanitization/sanitization.js +14 -6
  173. package/esm5/src/sanitization/style_sanitizer.js +1 -1
  174. package/esm5/src/util/ng_dev_mode.js +7 -3
  175. package/esm5/src/version.js +1 -1
  176. package/esm5/src/view/ng_module.js +3 -3
  177. package/esm5/src/view/util.js +2 -2
  178. package/esm5/testing/src/r3_test_bed_compiler.js +37 -11
  179. package/fesm2015/core.js +13481 -10733
  180. package/fesm2015/core.js.map +1 -1
  181. package/fesm2015/testing.js +43 -11
  182. package/fesm2015/testing.js.map +1 -1
  183. package/fesm5/core.js +11255 -9269
  184. package/fesm5/core.js.map +1 -1
  185. package/fesm5/testing.js +36 -10
  186. package/fesm5/testing.js.map +1 -1
  187. package/package.json +1 -1
  188. package/schematics/migrations/template-var-assignment/index.js +2 -2
  189. package/src/r3_symbols.d.ts +5 -1
  190. package/testing/testing.d.ts +1 -1
  191. package/testing.d.ts +1 -1
@@ -0,0 +1,324 @@
1
+ import { setStylingMapsSyncFn } from './bindings';
2
+ import { getBindingValue, getValuesCount, isStylingValueDefined } from './util';
3
+ /**
4
+ * --------
5
+ *
6
+ * This file contains the algorithm logic for applying map-based bindings
7
+ * such as `[style]` and `[class]`.
8
+ *
9
+ * --------
10
+ */
11
+ /**
12
+ * Used to apply styling values presently within any map-based bindings on an element.
13
+ *
14
+ * Angular supports map-based styling bindings which can be applied via the
15
+ * `[style]` and `[class]` bindings which can be placed on any HTML element.
16
+ * These bindings can work independently, together or alongside prop-based
17
+ * styling bindings (e.g. `<div [style]="x" [style.width]="w">`).
18
+ *
19
+ * If a map-based styling binding is detected by the compiler, the following
20
+ * AOT code is produced:
21
+ *
22
+ * ```typescript
23
+ * styleMap(ctx.styles); // styles = {key:value}
24
+ * classMap(ctx.classes); // classes = {key:value}|string
25
+ * ```
26
+ *
27
+ * If and when either of the instructions above are evaluated, then the code
28
+ * present in this file is included into the bundle. The mechanism used, to
29
+ * activate support for map-based bindings at runtime is possible via the
30
+ * `activeStylingMapFeature` function (which is also present in this file).
31
+ *
32
+ * # The Algorithm
33
+ * Whenever a map-based binding updates (which is when the identity of the
34
+ * map-value changes) then the map is iterated over and a `LStylingMap` array
35
+ * is produced. The `LStylingMap` instance is stored in the binding location
36
+ * where the `BINDING_INDEX` is situated when the `styleMap()` or `classMap()`
37
+ * instruction were called. Once the binding changes, then the internal `bitMask`
38
+ * value is marked as dirty.
39
+ *
40
+ * Styling values are applied once CD exits the element (which happens when
41
+ * the `select(n)` instruction is called or the template function exits). When
42
+ * this occurs, all prop-based bindings are applied. If a map-based binding is
43
+ * present then a special flushing function (called a sync function) is made
44
+ * available and it will be called each time a styling property is flushed.
45
+ *
46
+ * The flushing algorithm is designed to apply styling for a property (which is
47
+ * a CSS property or a className value) one by one. If map-based bindings
48
+ * are present, then the flushing algorithm will keep calling the maps styling
49
+ * sync function each time a property is visited. This way, the flushing
50
+ * behavior of map-based bindings will always be at the same property level
51
+ * as the current prop-based property being iterated over (because everything
52
+ * is alphabetically sorted).
53
+ *
54
+ * Let's imagine we have the following HTML template code:
55
+ *
56
+ * ```html
57
+ * <div [style]="{width:'100px', height:'200px', 'z-index':'10'}"
58
+ * [style.width.px]="200">...</div>
59
+ * ```
60
+ *
61
+ * When CD occurs, both the `[style]` and `[style.width]` bindings
62
+ * are evaluated. Then when the styles are flushed on screen, the
63
+ * following operations happen:
64
+ *
65
+ * 1. `[style.width]` is attempted to be written to the element.
66
+ *
67
+ * 2. Once that happens, the algorithm instructs the map-based
68
+ * entries (`[style]` in this case) to "catch up" and apply
69
+ * all values up to the `width` value. When this happens the
70
+ * `height` value is applied to the element (since it is
71
+ * alphabetically situated before the `width` property).
72
+ *
73
+ * 3. Since there are no more prop-based entries anymore, the
74
+ * loop exits and then, just before the flushing ends, it
75
+ * instructs all map-based bindings to "finish up" applying
76
+ * their values.
77
+ *
78
+ * 4. The only remaining value within the map-based entries is
79
+ * the `z-index` value (`width` got skipped because it was
80
+ * successfully applied via the prop-based `[style.width]`
81
+ * binding). Since all map-based entries are told to "finish up",
82
+ * the `z-index` value is iterated over and it is then applied
83
+ * to the element.
84
+ *
85
+ * The most important thing to take note of here is that prop-based
86
+ * bindings are evaluated in order alongside map-based bindings.
87
+ * This allows all styling across an element to be applied in O(n)
88
+ * time (a similar algorithm is that of the array merge algorithm
89
+ * in merge sort).
90
+ */
91
+ export var syncStylingMap = function (context, renderer, element, data, applyStylingFn, sanitizer, mode, targetProp, defaultValue) {
92
+ var targetPropValueWasApplied = false;
93
+ // once the map-based styling code is activate it is never deactivated. For this reason a
94
+ // check to see if the current styling context has any map based bindings is required.
95
+ var totalMaps = getValuesCount(context, 2 /* MapBindingsPosition */);
96
+ if (totalMaps) {
97
+ var runTheSyncAlgorithm = true;
98
+ var loopUntilEnd = !targetProp;
99
+ // If the code is told to finish up (run until the end), but the mode
100
+ // hasn't been flagged to apply values (it only traverses values) then
101
+ // there is no point in iterating over the array because nothing will
102
+ // be applied to the element.
103
+ if (loopUntilEnd && (mode & ~1 /* ApplyAllValues */)) {
104
+ runTheSyncAlgorithm = false;
105
+ targetPropValueWasApplied = true;
106
+ }
107
+ if (runTheSyncAlgorithm) {
108
+ targetPropValueWasApplied = innerSyncStylingMap(context, renderer, element, data, applyStylingFn, sanitizer, mode, targetProp || null, 0, defaultValue || null);
109
+ }
110
+ if (loopUntilEnd) {
111
+ resetSyncCursors();
112
+ }
113
+ }
114
+ return targetPropValueWasApplied;
115
+ };
116
+ /**
117
+ * Recursive function designed to apply map-based styling to an element one map at a time.
118
+ *
119
+ * This function is designed to be called from the `syncStylingMap` function and will
120
+ * apply map-based styling data one map at a time to the provided `element`.
121
+ *
122
+ * This function is recursive and it will call itself if a follow-up map value is to be
123
+ * processed. To learn more about how the algorithm works, see `syncStylingMap`.
124
+ */
125
+ function innerSyncStylingMap(context, renderer, element, data, applyStylingFn, sanitizer, mode, targetProp, currentMapIndex, defaultValue) {
126
+ var targetPropValueWasApplied = false;
127
+ var totalMaps = getValuesCount(context, 2 /* MapBindingsPosition */);
128
+ if (currentMapIndex < totalMaps) {
129
+ var bindingIndex = getBindingValue(context, 2 /* MapBindingsPosition */, currentMapIndex);
130
+ var lStylingMap = data[bindingIndex];
131
+ var cursor = getCurrentSyncCursor(currentMapIndex);
132
+ while (cursor < lStylingMap.length) {
133
+ var prop = getMapProp(lStylingMap, cursor);
134
+ var iteratedTooFar = targetProp && prop > targetProp;
135
+ var isTargetPropMatched = !iteratedTooFar && prop === targetProp;
136
+ var value = getMapValue(lStylingMap, cursor);
137
+ var valueIsDefined = isStylingValueDefined(value);
138
+ // the recursive code is designed to keep applying until
139
+ // it reaches or goes past the target prop. If and when
140
+ // this happens then it will stop processing values, but
141
+ // all other map values must also catch up to the same
142
+ // point. This is why a recursive call is still issued
143
+ // even if the code has iterated too far.
144
+ var innerMode = iteratedTooFar ? mode : resolveInnerMapMode(mode, valueIsDefined, isTargetPropMatched);
145
+ var innerProp = iteratedTooFar ? targetProp : prop;
146
+ var valueApplied = innerSyncStylingMap(context, renderer, element, data, applyStylingFn, sanitizer, innerMode, innerProp, currentMapIndex + 1, defaultValue);
147
+ if (iteratedTooFar) {
148
+ break;
149
+ }
150
+ if (!valueApplied && isValueAllowedToBeApplied(mode, isTargetPropMatched)) {
151
+ var useDefault = isTargetPropMatched && !valueIsDefined;
152
+ var valueToApply = useDefault ? defaultValue : value;
153
+ var bindingIndexToApply = useDefault ? bindingIndex : null;
154
+ var finalValue = sanitizer ?
155
+ sanitizer(prop, valueToApply, 3 /* ValidateAndSanitize */) :
156
+ valueToApply;
157
+ applyStylingFn(renderer, element, prop, finalValue, bindingIndexToApply);
158
+ valueApplied = true;
159
+ }
160
+ targetPropValueWasApplied = valueApplied && isTargetPropMatched;
161
+ cursor += 2 /* TupleSize */;
162
+ }
163
+ setCurrentSyncCursor(currentMapIndex, cursor);
164
+ }
165
+ return targetPropValueWasApplied;
166
+ }
167
+ /**
168
+ * Enables support for map-based styling bindings (e.g. `[style]` and `[class]` bindings).
169
+ */
170
+ export function activeStylingMapFeature() {
171
+ setStylingMapsSyncFn(syncStylingMap);
172
+ }
173
+ /**
174
+ * Used to determine the mode for the inner recursive call.
175
+ *
176
+ * If an inner map is iterated on then this is done so for one
177
+ * of two reasons:
178
+ *
179
+ * - The target property was detected and the inner map
180
+ * must now "catch up" (pointer-wise) up to where the current
181
+ * map's cursor is situated.
182
+ *
183
+ * - The target property was not detected in the current map
184
+ * and must be found in an inner map. This can only be allowed
185
+ * if the current map iteration is not set to skip the target
186
+ * property.
187
+ */
188
+ function resolveInnerMapMode(currentMode, valueIsDefined, isExactMatch) {
189
+ var innerMode = currentMode;
190
+ if (!valueIsDefined && isExactMatch && !(currentMode & 4 /* SkipTargetProp */)) {
191
+ // case 1: set the mode to apply the targeted prop value if it
192
+ // ends up being encountered in another map value
193
+ innerMode |= 2 /* ApplyTargetProp */;
194
+ innerMode &= ~4 /* SkipTargetProp */;
195
+ }
196
+ else {
197
+ // case 2: set the mode to skip the targeted prop value if it
198
+ // ends up being encountered in another map value
199
+ innerMode |= 4 /* SkipTargetProp */;
200
+ innerMode &= ~2 /* ApplyTargetProp */;
201
+ }
202
+ return innerMode;
203
+ }
204
+ /**
205
+ * Decides whether or not a prop/value entry will be applied to an element.
206
+ *
207
+ * To determine whether or not a value is to be applied,
208
+ * the following procedure is evaluated:
209
+ *
210
+ * First check to see the current `mode` status:
211
+ * 1. If the mode value permits all props to be applied then allow.
212
+ * - But do not allow if the current prop is set to be skipped.
213
+ * 2. Otherwise if the current prop is permitted then allow.
214
+ */
215
+ function isValueAllowedToBeApplied(mode, isTargetPropMatched) {
216
+ var doApplyValue = (mode & 1 /* ApplyAllValues */) > 0;
217
+ if (!doApplyValue) {
218
+ if (mode & 2 /* ApplyTargetProp */) {
219
+ doApplyValue = isTargetPropMatched;
220
+ }
221
+ }
222
+ else if ((mode & 4 /* SkipTargetProp */) && isTargetPropMatched) {
223
+ doApplyValue = false;
224
+ }
225
+ return doApplyValue;
226
+ }
227
+ /**
228
+ * Used to keep track of concurrent cursor values for multiple map-based styling bindings present on
229
+ * an element.
230
+ */
231
+ var MAP_CURSORS = [];
232
+ /**
233
+ * Used to reset the state of each cursor value being used to iterate over map-based styling
234
+ * bindings.
235
+ */
236
+ function resetSyncCursors() {
237
+ for (var i = 0; i < MAP_CURSORS.length; i++) {
238
+ MAP_CURSORS[i] = 1 /* ValuesStartPosition */;
239
+ }
240
+ }
241
+ /**
242
+ * Returns an active cursor value at a given mapIndex location.
243
+ */
244
+ function getCurrentSyncCursor(mapIndex) {
245
+ if (mapIndex >= MAP_CURSORS.length) {
246
+ MAP_CURSORS.push(1 /* ValuesStartPosition */);
247
+ }
248
+ return MAP_CURSORS[mapIndex];
249
+ }
250
+ /**
251
+ * Sets a cursor value at a given mapIndex location.
252
+ */
253
+ function setCurrentSyncCursor(mapIndex, indexValue) {
254
+ MAP_CURSORS[mapIndex] = indexValue;
255
+ }
256
+ /**
257
+ * Used to convert a {key:value} map into a `LStylingMap` array.
258
+ *
259
+ * This function will either generate a new `LStylingMap` instance
260
+ * or it will patch the provided `newValues` map value into an
261
+ * existing `LStylingMap` value (this only happens if `bindingValue`
262
+ * is an instance of `LStylingMap`).
263
+ *
264
+ * If a new key/value map is provided with an old `LStylingMap`
265
+ * value then all properties will be overwritten with their new
266
+ * values or with `null`. This means that the array will never
267
+ * shrink in size (but it will also not be created and thrown
268
+ * away whenever the {key:value} map entries change).
269
+ */
270
+ export function normalizeIntoStylingMap(bindingValue, newValues) {
271
+ var lStylingMap = Array.isArray(bindingValue) ? bindingValue : [null];
272
+ lStylingMap[0 /* RawValuePosition */] = newValues || null;
273
+ // because the new values may not include all the properties
274
+ // that the old ones had, all values are set to `null` before
275
+ // the new values are applied. This way, when flushed, the
276
+ // styling algorithm knows exactly what style/class values
277
+ // to remove from the element (since they are `null`).
278
+ for (var j = 1 /* ValuesStartPosition */; j < lStylingMap.length; j += 2 /* TupleSize */) {
279
+ setMapValue(lStylingMap, j, null);
280
+ }
281
+ var props = null;
282
+ var map;
283
+ var allValuesTrue = false;
284
+ if (typeof newValues === 'string') { // [class] bindings allow string values
285
+ if (newValues.length) {
286
+ props = newValues.split(/\s+/);
287
+ allValuesTrue = true;
288
+ }
289
+ }
290
+ else {
291
+ props = newValues ? Object.keys(newValues) : null;
292
+ map = newValues;
293
+ }
294
+ if (props) {
295
+ outer: for (var i = 0; i < props.length; i++) {
296
+ var prop = props[i];
297
+ var value = allValuesTrue ? true : map[prop];
298
+ for (var j = 1 /* ValuesStartPosition */; j < lStylingMap.length; j += 2 /* TupleSize */) {
299
+ var propAtIndex = getMapProp(lStylingMap, j);
300
+ if (prop <= propAtIndex) {
301
+ if (propAtIndex === prop) {
302
+ setMapValue(lStylingMap, j, value);
303
+ }
304
+ else {
305
+ lStylingMap.splice(j, 0, prop, value);
306
+ }
307
+ continue outer;
308
+ }
309
+ }
310
+ lStylingMap.push(prop, value);
311
+ }
312
+ }
313
+ return lStylingMap;
314
+ }
315
+ export function getMapProp(map, index) {
316
+ return map[index + 0 /* PropOffset */];
317
+ }
318
+ export function setMapValue(map, index, value) {
319
+ map[index + 1 /* ValueOffset */] = value;
320
+ }
321
+ export function getMapValue(map, index) {
322
+ return map[index + 1 /* ValueOffset */];
323
+ }
324
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwX2Jhc2VkX2JpbmRpbmdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9zdHlsaW5nX25leHQvbWFwX2Jhc2VkX2JpbmRpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVoRCxPQUFPLEVBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUc5RTs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErRUc7QUFDSCxNQUFNLENBQUMsSUFBTSxjQUFjLEdBQ3ZCLFVBQUMsT0FBd0IsRUFBRSxRQUFnRCxFQUFFLE9BQWlCLEVBQzdGLElBQWtCLEVBQUUsY0FBOEIsRUFBRSxTQUFpQyxFQUNyRixJQUF5QixFQUFFLFVBQTBCLEVBQ3JELFlBQTRCO0lBQzNCLElBQUkseUJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBRXRDLHlGQUF5RjtJQUN6RixzRkFBc0Y7SUFDdEYsSUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLE9BQU8sOEJBQTJDLENBQUM7SUFDcEYsSUFBSSxTQUFTLEVBQUU7UUFDYixJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUMvQixJQUFNLFlBQVksR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUVqQyxxRUFBcUU7UUFDckUsc0VBQXNFO1FBQ3RFLHFFQUFxRTtRQUNyRSw2QkFBNkI7UUFDN0IsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLEdBQUcsdUJBQW1DLENBQUMsRUFBRTtZQUNoRSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7WUFDNUIseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1NBQ2xDO1FB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LElBQUksSUFBSSxXQUFXLEVBQUU7b0JBQ3ZCLElBQUksV0FBVyxLQUFLLElBQUksRUFBRTt3QkFDeEIsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQ3BDO3lCQUFNO3dCQUNMLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQ3ZDO29CQUNELFNBQVMsS0FBSyxDQUFDO2lCQUNoQjthQUNGO1lBQ0QsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDL0I7S0FDRjtJQUVELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLEdBQWdCLEVBQUUsS0FBYTtJQUN4RCxPQUFPLEdBQUcsQ0FBQyxLQUFLLHFCQUE4QixDQUFXLENBQUM7QUFDNUQsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsR0FBZ0IsRUFBRSxLQUFhLEVBQUUsS0FBb0I7SUFDL0UsR0FBRyxDQUFDLEtBQUssc0JBQStCLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDcEQsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsR0FBZ0IsRUFBRSxLQUFhO0lBQ3pELE9BQU8sR0FBRyxDQUFDLEtBQUssc0JBQStCLENBQWtCLENBQUM7QUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuKiBAbGljZW5zZVxuKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbipcbiogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuKi9cbmltcG9ydCB7U3R5bGVTYW5pdGl6ZUZuLCBTdHlsZVNhbml0aXplTW9kZX0gZnJvbSAnLi4vLi4vc2FuaXRpemF0aW9uL3N0eWxlX3Nhbml0aXplcic7XG5pbXBvcnQge1Byb2NlZHVyYWxSZW5kZXJlcjMsIFJFbGVtZW50LCBSZW5kZXJlcjN9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVuZGVyZXInO1xuXG5pbXBvcnQge3NldFN0eWxpbmdNYXBzU3luY0ZufSBmcm9tICcuL2JpbmRpbmdzJztcbmltcG9ydCB7QXBwbHlTdHlsaW5nRm4sIExTdHlsaW5nRGF0YSwgTFN0eWxpbmdNYXAsIExTdHlsaW5nTWFwSW5kZXgsIFN0eWxpbmdNYXBzU3luY01vZGUsIFN5bmNTdHlsaW5nTWFwc0ZuLCBUU3R5bGluZ0NvbnRleHQsIFRTdHlsaW5nQ29udGV4dEluZGV4fSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtnZXRCaW5kaW5nVmFsdWUsIGdldFZhbHVlc0NvdW50LCBpc1N0eWxpbmdWYWx1ZURlZmluZWR9IGZyb20gJy4vdXRpbCc7XG5cblxuLyoqXG4gKiAtLS0tLS0tLVxuICpcbiAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYWxnb3JpdGhtIGxvZ2ljIGZvciBhcHBseWluZyBtYXAtYmFzZWQgYmluZGluZ3NcbiAqIHN1Y2ggYXMgYFtzdHlsZV1gIGFuZCBgW2NsYXNzXWAuXG4gKlxuICogLS0tLS0tLS1cbiAqL1xuXG4vKipcbiAqIFVzZWQgdG8gYXBwbHkgc3R5bGluZyB2YWx1ZXMgcHJlc2VudGx5IHdpdGhpbiBhbnkgbWFwLWJhc2VkIGJpbmRpbmdzIG9uIGFuIGVsZW1lbnQuXG4gKlxuICogQW5ndWxhciBzdXBwb3J0cyBtYXAtYmFzZWQgc3R5bGluZyBiaW5kaW5ncyB3aGljaCBjYW4gYmUgYXBwbGllZCB2aWEgdGhlXG4gKiBgW3N0eWxlXWAgYW5kIGBbY2xhc3NdYCBiaW5kaW5ncyB3aGljaCBjYW4gYmUgcGxhY2VkIG9uIGFueSBIVE1MIGVsZW1lbnQuXG4gKiBUaGVzZSBiaW5kaW5ncyBjYW4gd29yayBpbmRlcGVuZGVudGx5LCB0b2dldGhlciBvciBhbG9uZ3NpZGUgcHJvcC1iYXNlZFxuICogc3R5bGluZyBiaW5kaW5ncyAoZS5nLiBgPGRpdiBbc3R5bGVdPVwieFwiIFtzdHlsZS53aWR0aF09XCJ3XCI+YCkuXG4gKlxuICogSWYgYSBtYXAtYmFzZWQgc3R5bGluZyBiaW5kaW5nIGlzIGRldGVjdGVkIGJ5IHRoZSBjb21waWxlciwgdGhlIGZvbGxvd2luZ1xuICogQU9UIGNvZGUgaXMgcHJvZHVjZWQ6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogc3R5bGVNYXAoY3R4LnN0eWxlcyk7IC8vIHN0eWxlcyA9IHtrZXk6dmFsdWV9XG4gKiBjbGFzc01hcChjdHguY2xhc3Nlcyk7IC8vIGNsYXNzZXMgPSB7a2V5OnZhbHVlfXxzdHJpbmdcbiAqIGBgYFxuICpcbiAqIElmIGFuZCB3aGVuIGVpdGhlciBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGFib3ZlIGFyZSBldmFsdWF0ZWQsIHRoZW4gdGhlIGNvZGVcbiAqIHByZXNlbnQgaW4gdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGludG8gdGhlIGJ1bmRsZS4gVGhlIG1lY2hhbmlzbSB1c2VkLCB0b1xuICogYWN0aXZhdGUgc3VwcG9ydCBmb3IgbWFwLWJhc2VkIGJpbmRpbmdzIGF0IHJ1bnRpbWUgaXMgcG9zc2libGUgdmlhIHRoZVxuICogYGFjdGl2ZVN0eWxpbmdNYXBGZWF0dXJlYCBmdW5jdGlvbiAod2hpY2ggaXMgYWxzbyBwcmVzZW50IGluIHRoaXMgZmlsZSkuXG4gKlxuICogIyBUaGUgQWxnb3JpdGhtXG4gKiBXaGVuZXZlciBhIG1hcC1iYXNlZCBiaW5kaW5nIHVwZGF0ZXMgKHdoaWNoIGlzIHdoZW4gdGhlIGlkZW50aXR5IG9mIHRoZVxuICogbWFwLXZhbHVlIGNoYW5nZXMpIHRoZW4gdGhlIG1hcCBpcyBpdGVyYXRlZCBvdmVyIGFuZCBhIGBMU3R5bGluZ01hcGAgYXJyYXlcbiAqIGlzIHByb2R1Y2VkLiBUaGUgYExTdHlsaW5nTWFwYCBpbnN0YW5jZSBpcyBzdG9yZWQgaW4gdGhlIGJpbmRpbmcgbG9jYXRpb25cbiAqIHdoZXJlIHRoZSBgQklORElOR19JTkRFWGAgaXMgc2l0dWF0ZWQgd2hlbiB0aGUgYHN0eWxlTWFwKClgIG9yIGBjbGFzc01hcCgpYFxuICogaW5zdHJ1Y3Rpb24gd2VyZSBjYWxsZWQuIE9uY2UgdGhlIGJpbmRpbmcgY2hhbmdlcywgdGhlbiB0aGUgaW50ZXJuYWwgYGJpdE1hc2tgXG4gKiB2YWx1ZSBpcyBtYXJrZWQgYXMgZGlydHkuXG4gKlxuICogU3R5bGluZyB2YWx1ZXMgYXJlIGFwcGxpZWQgb25jZSBDRCBleGl0cyB0aGUgZWxlbWVudCAod2hpY2ggaGFwcGVucyB3aGVuXG4gKiB0aGUgYHNlbGVjdChuKWAgaW5zdHJ1Y3Rpb24gaXMgY2FsbGVkIG9yIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbiBleGl0cykuIFdoZW5cbiAqIHRoaXMgb2NjdXJzLCBhbGwgcHJvcC1iYXNlZCBiaW5kaW5ncyBhcmUgYXBwbGllZC4gSWYgYSBtYXAtYmFzZWQgYmluZGluZyBpc1xuICogcHJlc2VudCB0aGVuIGEgc3BlY2lhbCBmbHVzaGluZyBmdW5jdGlvbiAoY2FsbGVkIGEgc3luYyBmdW5jdGlvbikgaXMgbWFkZVxuICogYXZhaWxhYmxlIGFuZCBpdCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgYSBzdHlsaW5nIHByb3BlcnR5IGlzIGZsdXNoZWQuXG4gKlxuICogVGhlIGZsdXNoaW5nIGFsZ29yaXRobSBpcyBkZXNpZ25lZCB0byBhcHBseSBzdHlsaW5nIGZvciBhIHByb3BlcnR5ICh3aGljaCBpc1xuICogYSBDU1MgcHJvcGVydHkgb3IgYSBjbGFzc05hbWUgdmFsdWUpIG9uZSBieSBvbmUuIElmIG1hcC1iYXNlZCBiaW5kaW5nc1xuICogYXJlIHByZXNlbnQsIHRoZW4gdGhlIGZsdXNoaW5nIGFsZ29yaXRobSB3aWxsIGtlZXAgY2FsbGluZyB0aGUgbWFwcyBzdHlsaW5nXG4gKiBzeW5jIGZ1bmN0aW9uIGVhY2ggdGltZSBhIHByb3BlcnR5IGlzIHZpc2l0ZWQuIFRoaXMgd2F5LCB0aGUgZmx1c2hpbmdcbiAqIGJlaGF2aW9yIG9mIG1hcC1iYXNlZCBiaW5kaW5ncyB3aWxsIGFsd2F5cyBiZSBhdCB0aGUgc2FtZSBwcm9wZXJ0eSBsZXZlbFxuICogYXMgdGhlIGN1cnJlbnQgcHJvcC1iYXNlZCBwcm9wZXJ0eSBiZWluZyBpdGVyYXRlZCBvdmVyIChiZWNhdXNlIGV2ZXJ5dGhpbmdcbiAqIGlzIGFscGhhYmV0aWNhbGx5IHNvcnRlZCkuXG4gKlxuICogTGV0J3MgaW1hZ2luZSB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgSFRNTCB0ZW1wbGF0ZSBjb2RlOlxuICpcbiAqIGBgYGh0bWxcbiAqIDxkaXYgW3N0eWxlXT1cInt3aWR0aDonMTAwcHgnLCBoZWlnaHQ6JzIwMHB4JywgJ3otaW5kZXgnOicxMCd9XCJcbiAqICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIjIwMFwiPi4uLjwvZGl2PlxuICogYGBgXG4gKlxuICogV2hlbiBDRCBvY2N1cnMsIGJvdGggdGhlIGBbc3R5bGVdYCBhbmQgYFtzdHlsZS53aWR0aF1gIGJpbmRpbmdzXG4gKiBhcmUgZXZhbHVhdGVkLiBUaGVuIHdoZW4gdGhlIHN0eWxlcyBhcmUgZmx1c2hlZCBvbiBzY3JlZW4sIHRoZVxuICogZm9sbG93aW5nIG9wZXJhdGlvbnMgaGFwcGVuOlxuICpcbiAqIDEuIGBbc3R5bGUud2lkdGhdYCBpcyBhdHRlbXB0ZWQgdG8gYmUgd3JpdHRlbiB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiAyLiAgT25jZSB0aGF0IGhhcHBlbnMsIHRoZSBhbGdvcml0aG0gaW5zdHJ1Y3RzIHRoZSBtYXAtYmFzZWRcbiAqICAgICBlbnRyaWVzIChgW3N0eWxlXWAgaW4gdGhpcyBjYXNlKSB0byBcImNhdGNoIHVwXCIgYW5kIGFwcGx5XG4gKiAgICAgYWxsIHZhbHVlcyB1cCB0byB0aGUgYHdpZHRoYCB2YWx1ZS4gV2hlbiB0aGlzIGhhcHBlbnMgdGhlXG4gKiAgICAgYGhlaWdodGAgdmFsdWUgaXMgYXBwbGllZCB0byB0aGUgZWxlbWVudCAoc2luY2UgaXQgaXNcbiAqICAgICBhbHBoYWJldGljYWxseSBzaXR1YXRlZCBiZWZvcmUgdGhlIGB3aWR0aGAgcHJvcGVydHkpLlxuICpcbiAqIDMuIFNpbmNlIHRoZXJlIGFyZSBubyBtb3JlIHByb3AtYmFzZWQgZW50cmllcyBhbnltb3JlLCB0aGVcbiAqICAgIGxvb3AgZXhpdHMgYW5kIHRoZW4sIGp1c3QgYmVmb3JlIHRoZSBmbHVzaGluZyBlbmRzLCBpdFxuICogICAgaW5zdHJ1Y3RzIGFsbCBtYXAtYmFzZWQgYmluZGluZ3MgdG8gXCJmaW5pc2ggdXBcIiBhcHBseWluZ1xuICogICAgdGhlaXIgdmFsdWVzLlxuICpcbiAqIDQuIFRoZSBvbmx5IHJlbWFpbmluZyB2YWx1ZSB3aXRoaW4gdGhlIG1hcC1iYXNlZCBlbnRyaWVzIGlzXG4gKiAgICB0aGUgYHotaW5kZXhgIHZhbHVlIChgd2lkdGhgIGdvdCBza2lwcGVkIGJlY2F1c2UgaXQgd2FzXG4gKiAgICBzdWNjZXNzZnVsbHkgYXBwbGllZCB2aWEgdGhlIHByb3AtYmFzZWQgYFtzdHlsZS53aWR0aF1gXG4gKiAgICBiaW5kaW5nKS4gU2luY2UgYWxsIG1hcC1iYXNlZCBlbnRyaWVzIGFyZSB0b2xkIHRvIFwiZmluaXNoIHVwXCIsXG4gKiAgICB0aGUgYHotaW5kZXhgIHZhbHVlIGlzIGl0ZXJhdGVkIG92ZXIgYW5kIGl0IGlzIHRoZW4gYXBwbGllZFxuICogICAgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogVGhlIG1vc3QgaW1wb3J0YW50IHRoaW5nIHRvIHRha2Ugbm90ZSBvZiBoZXJlIGlzIHRoYXQgcHJvcC1iYXNlZFxuICogYmluZGluZ3MgYXJlIGV2YWx1YXRlZCBpbiBvcmRlciBhbG9uZ3NpZGUgbWFwLWJhc2VkIGJpbmRpbmdzLlxuICogVGhpcyBhbGxvd3MgYWxsIHN0eWxpbmcgYWNyb3NzIGFuIGVsZW1lbnQgdG8gYmUgYXBwbGllZCBpbiBPKG4pXG4gKiB0aW1lIChhIHNpbWlsYXIgYWxnb3JpdGhtIGlzIHRoYXQgb2YgdGhlIGFycmF5IG1lcmdlIGFsZ29yaXRobVxuICogaW4gbWVyZ2Ugc29ydCkuXG4gKi9cbmV4cG9ydCBjb25zdCBzeW5jU3R5bGluZ01hcDogU3luY1N0eWxpbmdNYXBzRm4gPVxuICAgIChjb250ZXh0OiBUU3R5bGluZ0NvbnRleHQsIHJlbmRlcmVyOiBSZW5kZXJlcjMgfCBQcm9jZWR1cmFsUmVuZGVyZXIzIHwgbnVsbCwgZWxlbWVudDogUkVsZW1lbnQsXG4gICAgIGRhdGE6IExTdHlsaW5nRGF0YSwgYXBwbHlTdHlsaW5nRm46IEFwcGx5U3R5bGluZ0ZuLCBzYW5pdGl6ZXI6IFN0eWxlU2FuaXRpemVGbiB8IG51bGwsXG4gICAgIG1vZGU6IFN0eWxpbmdNYXBzU3luY01vZGUsIHRhcmdldFByb3A/OiBzdHJpbmcgfCBudWxsLFxuICAgICBkZWZhdWx0VmFsdWU/OiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiA9PiB7XG4gICAgICBsZXQgdGFyZ2V0UHJvcFZhbHVlV2FzQXBwbGllZCA9IGZhbHNlO1xuXG4gICAgICAvLyBvbmNlIHRoZSBtYXAtYmFzZWQgc3R5bGluZyBjb2RlIGlzIGFjdGl2YXRlIGl0IGlzIG5ldmVyIGRlYWN0aXZhdGVkLiBGb3IgdGhpcyByZWFzb24gYVxuICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBjdXJyZW50IHN0eWxpbmcgY29udGV4dCBoYXMgYW55IG1hcCBiYXNlZCBiaW5kaW5ncyBpcyByZXF1aXJlZC5cbiAgICAgIGNvbnN0IHRvdGFsTWFwcyA9IGdldFZhbHVlc0NvdW50KGNvbnRleHQsIFRTdHlsaW5nQ29udGV4dEluZGV4Lk1hcEJpbmRpbmdzUG9zaXRpb24pO1xuICAgICAgaWYgKHRvdGFsTWFwcykge1xuICAgICAgICBsZXQgcnVuVGhlU3luY0FsZ29yaXRobSA9IHRydWU7XG4gICAgICAgIGNvbnN0IGxvb3BVbnRpbEVuZCA9ICF0YXJnZXRQcm9wO1xuXG4gICAgICAgIC8vIElmIHRoZSBjb2RlIGlzIHRvbGQgdG8gZmluaXNoIHVwIChydW4gdW50aWwgdGhlIGVuZCksIGJ1dCB0aGUgbW9kZVxuICAgICAgICAvLyBoYXNuJ3QgYmVlbiBmbGFnZ2VkIHRvIGFwcGx5IHZhbHVlcyAoaXQgb25seSB0cmF2ZXJzZXMgdmFsdWVzKSB0aGVuXG4gICAgICAgIC8vIHRoZXJlIGlzIG5vIHBvaW50IGluIGl0ZXJhdGluZyBvdmVyIHRoZSBhcnJheSBiZWNhdXNlIG5vdGhpbmcgd2lsbFxuICAgICAgICAvLyBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LlxuICAgICAgICBpZiAobG9vcFVudGlsRW5kICYmIChtb2RlICYgflN0eWxpbmdNYXBzU3luY01vZGUuQXBwbHlBbGxWYWx1ZXMpKSB7XG4gICAgICAgICAgcnVuVGhlU3luY0FsZ29yaXRobSA9IGZhbHNlO1xuICAgICAgICAgIHRhcmdldFByb3BWYWx1ZVdhc0FwcGxpZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1blRoZVN5bmNBbGdvcml0aG0pIHtcbiAgICAgICAgICB0YXJnZXRQcm9wVmFsdWVXYXNBcHBsaWVkID0gaW5uZXJTeW5jU3R5bGluZ01hcChcbiAgICAgICAgICAgICAgY29udGV4dCwgcmVuZGVyZXIsIGVsZW1lbnQsIGRhdGEsIGFwcGx5U3R5bGluZ0ZuLCBzYW5pdGl6ZXIsIG1vZGUsIHRhcmdldFByb3AgfHwgbnVsbCxcbiAgICAgICAgICAgICAgMCwgZGVmYXVsdFZhbHVlIHx8IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvb3BVbnRpbEVuZCkge1xuICAgICAgICAgIHJlc2V0U3luY0N1cnNvcnMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0UHJvcFZhbHVlV2FzQXBwbGllZDtcbiAgICB9O1xuXG4vKipcbiAqIFJlY3Vyc2l2ZSBmdW5jdGlvbiBkZXNpZ25lZCB0byBhcHBseSBtYXAtYmFzZWQgc3R5bGluZyB0byBhbiBlbGVtZW50IG9uZSBtYXAgYXQgYSB0aW1lLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgY2FsbGVkIGZyb20gdGhlIGBzeW5jU3R5bGluZ01hcGAgZnVuY3Rpb24gYW5kIHdpbGxcbiAqIGFwcGx5IG1hcC1iYXNlZCBzdHlsaW5nIGRhdGEgb25lIG1hcCBhdCBhIHRpbWUgdG8gdGhlIHByb3ZpZGVkIGBlbGVtZW50YC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHJlY3Vyc2l2ZSBhbmQgaXQgd2lsbCBjYWxsIGl0c2VsZiBpZiBhIGZvbGxvdy11cCBtYXAgdmFsdWUgaXMgdG8gYmVcbiAqIHByb2Nlc3NlZC4gVG8gbGVhcm4gbW9yZSBhYm91dCBob3cgdGhlIGFsZ29yaXRobSB3b3Jrcywgc2VlIGBzeW5jU3R5bGluZ01hcGAuXG4gKi9cbmZ1bmN0aW9uIGlubmVyU3luY1N0eWxpbmdNYXAoXG4gICAgY29udGV4dDogVFN0eWxpbmdDb250ZXh0LCByZW5kZXJlcjogUmVuZGVyZXIzIHwgUHJvY2VkdXJhbFJlbmRlcmVyMyB8IG51bGwsIGVsZW1lbnQ6IFJFbGVtZW50LFxuICAgIGRhdGE6IExTdHlsaW5nRGF0YSwgYXBwbHlTdHlsaW5nRm46IEFwcGx5U3R5bGluZ0ZuLCBzYW5pdGl6ZXI6IFN0eWxlU2FuaXRpemVGbiB8IG51bGwsXG4gICAgbW9kZTogU3R5bGluZ01hcHNTeW5jTW9kZSwgdGFyZ2V0UHJvcDogc3RyaW5nIHwgbnVsbCwgY3VycmVudE1hcEluZGV4OiBudW1iZXIsXG4gICAgZGVmYXVsdFZhbHVlOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gIGxldCB0YXJnZXRQcm9wVmFsdWVXYXNBcHBsaWVkID0gZmFsc2U7XG5cbiAgY29uc3QgdG90YWxNYXBzID0gZ2V0VmFsdWVzQ291bnQoY29udGV4dCwgVFN0eWxpbmdDb250ZXh0SW5kZXguTWFwQmluZGluZ3NQb3NpdGlvbik7XG4gIGlmIChjdXJyZW50TWFwSW5kZXggPCB0b3RhbE1hcHMpIHtcbiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nVmFsdWUoXG4gICAgICAgIGNvbnRleHQsIFRTdHlsaW5nQ29udGV4dEluZGV4Lk1hcEJpbmRpbmdzUG9zaXRpb24sIGN1cnJlbnRNYXBJbmRleCkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IGxTdHlsaW5nTWFwID0gZGF0YVtiaW5kaW5nSW5kZXhdIGFzIExTdHlsaW5nTWFwO1xuXG4gICAgbGV0IGN1cnNvciA9IGdldEN1cnJlbnRTeW5jQ3Vyc29yKGN1cnJlbnRNYXBJbmRleCk7XG4gICAgd2hpbGUgKGN1cnNvciA8IGxTdHlsaW5nTWFwLmxlbmd0aCkge1xuICAgICAgY29uc3QgcHJvcCA9IGdldE1hcFByb3AobFN0eWxpbmdNYXAsIGN1cnNvcik7XG4gICAgICBjb25zdCBpdGVyYXRlZFRvb0ZhciA9IHRhcmdldFByb3AgJiYgcHJvcCA+IHRhcmdldFByb3A7XG4gICAgICBjb25zdCBpc1RhcmdldFByb3BNYXRjaGVkID0gIWl0ZXJhdGVkVG9vRmFyICYmIHByb3AgPT09IHRhcmdldFByb3A7XG4gICAgICBjb25zdCB2YWx1ZSA9IGdldE1hcFZhbHVlKGxTdHlsaW5nTWFwLCBjdXJzb3IpO1xuICAgICAgY29uc3QgdmFsdWVJc0RlZmluZWQgPSBpc1N0eWxpbmdWYWx1ZURlZmluZWQodmFsdWUpO1xuXG4gICAgICAvLyB0aGUgcmVjdXJzaXZlIGNvZGUgaXMgZGVzaWduZWQgdG8ga2VlcCBhcHBseWluZyB1bnRpbFxuICAgICAgLy8gaXQgcmVhY2hlcyBvciBnb2VzIHBhc3QgdGhlIHRhcmdldCBwcm9wLiBJZiBhbmQgd2hlblxuICAgICAgLy8gdGhpcyBoYXBwZW5zIHRoZW4gaXQgd2lsbCBzdG9wIHByb2Nlc3NpbmcgdmFsdWVzLCBidXRcbiAgICAgIC8vIGFsbCBvdGhlciBtYXAgdmFsdWVzIG11c3QgYWxzbyBjYXRjaCB1cCB0byB0aGUgc2FtZVxuICAgICAgLy8gcG9pbnQuIFRoaXMgaXMgd2h5IGEgcmVjdXJzaXZlIGNhbGwgaXMgc3RpbGwgaXNzdWVkXG4gICAgICAvLyBldmVuIGlmIHRoZSBjb2RlIGhhcyBpdGVyYXRlZCB0b28gZmFyLlxuICAgICAgY29uc3QgaW5uZXJNb2RlID1cbiAgICAgICAgICBpdGVyYXRlZFRvb0ZhciA/IG1vZGUgOiByZXNvbHZlSW5uZXJNYXBNb2RlKG1vZGUsIHZhbHVlSXNEZWZpbmVkLCBpc1RhcmdldFByb3BNYXRjaGVkKTtcbiAgICAgIGNvbnN0IGlubmVyUHJvcCA9IGl0ZXJhdGVkVG9vRmFyID8gdGFyZ2V0UHJvcCA6IHByb3A7XG4gICAgICBsZXQgdmFsdWVBcHBsaWVkID0gaW5uZXJTeW5jU3R5bGluZ01hcChcbiAgICAgICAgICBjb250ZXh0LCByZW5kZXJlciwgZWxlbWVudCwgZGF0YSwgYXBwbHlTdHlsaW5nRm4sIHNhbml0aXplciwgaW5uZXJNb2RlLCBpbm5lclByb3AsXG4gICAgICAgICAgY3VycmVudE1hcEluZGV4ICsgMSwgZGVmYXVsdFZhbHVlKTtcblxuICAgICAgaWYgKGl0ZXJhdGVkVG9vRmFyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbHVlQXBwbGllZCAmJiBpc1ZhbHVlQWxsb3dlZFRvQmVBcHBsaWVkKG1vZGUsIGlzVGFyZ2V0UHJvcE1hdGNoZWQpKSB7XG4gICAgICAgIGNvbnN0IHVzZURlZmF1bHQgPSBpc1RhcmdldFByb3BNYXRjaGVkICYmICF2YWx1ZUlzRGVmaW5lZDtcbiAgICAgICAgY29uc3QgdmFsdWVUb0FwcGx5ID0gdXNlRGVmYXVsdCA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuICAgICAgICBjb25zdCBiaW5kaW5nSW5kZXhUb0FwcGx5ID0gdXNlRGVmYXVsdCA/IGJpbmRpbmdJbmRleCA6IG51bGw7XG4gICAgICAgIGNvbnN0IGZpbmFsVmFsdWUgPSBzYW5pdGl6ZXIgP1xuICAgICAgICAgICAgc2FuaXRpemVyKHByb3AsIHZhbHVlVG9BcHBseSwgU3R5bGVTYW5pdGl6ZU1vZGUuVmFsaWRhdGVBbmRTYW5pdGl6ZSkgOlxuICAgICAgICAgICAgdmFsdWVUb0FwcGx5O1xuICAgICAgICBhcHBseVN0eWxpbmdGbihyZW5kZXJlciwgZWxlbWVudCwgcHJvcCwgZmluYWxWYWx1ZSwgYmluZGluZ0luZGV4VG9BcHBseSk7XG4gICAgICAgIHZhbHVlQXBwbGllZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRhcmdldFByb3BWYWx1ZVdhc0FwcGxpZWQgPSB2YWx1ZUFwcGxpZWQgJiYgaXNUYXJnZXRQcm9wTWF0Y2hlZDtcbiAgICAgIGN1cnNvciArPSBMU3R5bGluZ01hcEluZGV4LlR1cGxlU2l6ZTtcbiAgICB9XG4gICAgc2V0Q3VycmVudFN5bmNDdXJzb3IoY3VycmVudE1hcEluZGV4LCBjdXJzb3IpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldFByb3BWYWx1ZVdhc0FwcGxpZWQ7XG59XG5cblxuLyoqXG4gKiBFbmFibGVzIHN1cHBvcnQgZm9yIG1hcC1iYXNlZCBzdHlsaW5nIGJpbmRpbmdzIChlLmcuIGBbc3R5bGVdYCBhbmQgYFtjbGFzc11gIGJpbmRpbmdzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFjdGl2ZVN0eWxpbmdNYXBGZWF0dXJlKCkge1xuICBzZXRTdHlsaW5nTWFwc1N5bmNGbihzeW5jU3R5bGluZ01hcCk7XG59XG5cbi8qKlxuICogVXNlZCB0byBkZXRlcm1pbmUgdGhlIG1vZGUgZm9yIHRoZSBpbm5lciByZWN1cnNpdmUgY2FsbC5cbiAqXG4gKiBJZiBhbiBpbm5lciBtYXAgaXMgaXRlcmF0ZWQgb24gdGhlbiB0aGlzIGlzIGRvbmUgc28gZm9yIG9uZVxuICogb2YgdHdvIHJlYXNvbnM6XG4gKlxuICogLSBUaGUgdGFyZ2V0IHByb3BlcnR5IHdhcyBkZXRlY3RlZCBhbmQgdGhlIGlubmVyIG1hcFxuICogICBtdXN0IG5vdyBcImNhdGNoIHVwXCIgKHBvaW50ZXItd2lzZSkgdXAgdG8gd2hlcmUgdGhlIGN1cnJlbnRcbiAqICAgbWFwJ3MgY3Vyc29yIGlzIHNpdHVhdGVkLlxuICpcbiAqIC0gVGhlIHRhcmdldCBwcm9wZXJ0eSB3YXMgbm90IGRldGVjdGVkIGluIHRoZSBjdXJyZW50IG1hcFxuICogICBhbmQgbXVzdCBiZSBmb3VuZCBpbiBhbiBpbm5lciBtYXAuIFRoaXMgY2FuIG9ubHkgYmUgYWxsb3dlZFxuICogICBpZiB0aGUgY3VycmVudCBtYXAgaXRlcmF0aW9uIGlzIG5vdCBzZXQgdG8gc2tpcCB0aGUgdGFyZ2V0XG4gKiAgIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiByZXNvbHZlSW5uZXJNYXBNb2RlKFxuICAgIGN1cnJlbnRNb2RlOiBudW1iZXIsIHZhbHVlSXNEZWZpbmVkOiBib29sZWFuLCBpc0V4YWN0TWF0Y2g6IGJvb2xlYW4pOiBudW1iZXIge1xuICBsZXQgaW5uZXJNb2RlID0gY3VycmVudE1vZGU7XG4gIGlmICghdmFsdWVJc0RlZmluZWQgJiYgaXNFeGFjdE1hdGNoICYmICEoY3VycmVudE1vZGUgJiBTdHlsaW5nTWFwc1N5bmNNb2RlLlNraXBUYXJnZXRQcm9wKSkge1xuICAgIC8vIGNhc2UgMTogc2V0IHRoZSBtb2RlIHRvIGFwcGx5IHRoZSB0YXJnZXRlZCBwcm9wIHZhbHVlIGlmIGl0XG4gICAgLy8gZW5kcyB1cCBiZWluZyBlbmNvdW50ZXJlZCBpbiBhbm90aGVyIG1hcCB2YWx1ZVxuICAgIGlubmVyTW9kZSB8PSBTdHlsaW5nTWFwc1N5bmNNb2RlLkFwcGx5VGFyZ2V0UHJvcDtcbiAgICBpbm5lck1vZGUgJj0gflN0eWxpbmdNYXBzU3luY01vZGUuU2tpcFRhcmdldFByb3A7XG4gIH0gZWxzZSB7XG4gICAgLy8gY2FzZSAyOiBzZXQgdGhlIG1vZGUgdG8gc2tpcCB0aGUgdGFyZ2V0ZWQgcHJvcCB2YWx1ZSBpZiBpdFxuICAgIC8vIGVuZHMgdXAgYmVpbmcgZW5jb3VudGVyZWQgaW4gYW5vdGhlciBtYXAgdmFsdWVcbiAgICBpbm5lck1vZGUgfD0gU3R5bGluZ01hcHNTeW5jTW9kZS5Ta2lwVGFyZ2V0UHJvcDtcbiAgICBpbm5lck1vZGUgJj0gflN0eWxpbmdNYXBzU3luY01vZGUuQXBwbHlUYXJnZXRQcm9wO1xuICB9XG4gIHJldHVybiBpbm5lck1vZGU7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIG9yIG5vdCBhIHByb3AvdmFsdWUgZW50cnkgd2lsbCBiZSBhcHBsaWVkIHRvIGFuIGVsZW1lbnQuXG4gKlxuICogVG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgaXMgdG8gYmUgYXBwbGllZCxcbiAqIHRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIGlzIGV2YWx1YXRlZDpcbiAqXG4gKiBGaXJzdCBjaGVjayB0byBzZWUgdGhlIGN1cnJlbnQgYG1vZGVgIHN0YXR1czpcbiAqICAxLiBJZiB0aGUgbW9kZSB2YWx1ZSBwZXJtaXRzIGFsbCBwcm9wcyB0byBiZSBhcHBsaWVkIHRoZW4gYWxsb3cuXG4gKiAgICAtIEJ1dCBkbyBub3QgYWxsb3cgaWYgdGhlIGN1cnJlbnQgcHJvcCBpcyBzZXQgdG8gYmUgc2tpcHBlZC5cbiAqICAyLiBPdGhlcndpc2UgaWYgdGhlIGN1cnJlbnQgcHJvcCBpcyBwZXJtaXR0ZWQgdGhlbiBhbGxvdy5cbiAqL1xuZnVuY3Rpb24gaXNWYWx1ZUFsbG93ZWRUb0JlQXBwbGllZChtb2RlOiBudW1iZXIsIGlzVGFyZ2V0UHJvcE1hdGNoZWQ6IGJvb2xlYW4pIHtcbiAgbGV0IGRvQXBwbHlWYWx1ZSA9IChtb2RlICYgU3R5bGluZ01hcHNTeW5jTW9kZS5BcHBseUFsbFZhbHVlcykgPiAwO1xuICBpZiAoIWRvQXBwbHlWYWx1ZSkge1xuICAgIGlmIChtb2RlICYgU3R5bGluZ01hcHNTeW5jTW9kZS5BcHBseVRhcmdldFByb3ApIHtcbiAgICAgIGRvQXBwbHlWYWx1ZSA9IGlzVGFyZ2V0UHJvcE1hdGNoZWQ7XG4gICAgfVxuICB9IGVsc2UgaWYgKChtb2RlICYgU3R5bGluZ01hcHNTeW5jTW9kZS5Ta2lwVGFyZ2V0UHJvcCkgJiYgaXNUYXJnZXRQcm9wTWF0Y2hlZCkge1xuICAgIGRvQXBwbHlWYWx1ZSA9IGZhbHNlO1xuICB9XG4gIHJldHVybiBkb0FwcGx5VmFsdWU7XG59XG5cbi8qKlxuICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIGNvbmN1cnJlbnQgY3Vyc29yIHZhbHVlcyBmb3IgbXVsdGlwbGUgbWFwLWJhc2VkIHN0eWxpbmcgYmluZGluZ3MgcHJlc2VudCBvblxuICogYW4gZWxlbWVudC5cbiAqL1xuY29uc3QgTUFQX0NVUlNPUlM6IG51bWJlcltdID0gW107XG5cbi8qKlxuICogVXNlZCB0byByZXNldCB0aGUgc3RhdGUgb2YgZWFjaCBjdXJzb3IgdmFsdWUgYmVpbmcgdXNlZCB0byBpdGVyYXRlIG92ZXIgbWFwLWJhc2VkIHN0eWxpbmdcbiAqIGJpbmRpbmdzLlxuICovXG5mdW5jdGlvbiByZXNldFN5bmNDdXJzb3JzKCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IE1BUF9DVVJTT1JTLmxlbmd0aDsgaSsrKSB7XG4gICAgTUFQX0NVUlNPUlNbaV0gPSBMU3R5bGluZ01hcEluZGV4LlZhbHVlc1N0YXJ0UG9zaXRpb247XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFjdGl2ZSBjdXJzb3IgdmFsdWUgYXQgYSBnaXZlbiBtYXBJbmRleCBsb2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZ2V0Q3VycmVudFN5bmNDdXJzb3IobWFwSW5kZXg6IG51bWJlcikge1xuICBpZiAobWFwSW5kZXggPj0gTUFQX0NVUlNPUlMubGVuZ3RoKSB7XG4gICAgTUFQX0NVUlNPUlMucHVzaChMU3R5bGluZ01hcEluZGV4LlZhbHVlc1N0YXJ0UG9zaXRpb24pO1xuICB9XG4gIHJldHVybiBNQVBfQ1VSU09SU1ttYXBJbmRleF07XG59XG5cbi8qKlxuICogU2V0cyBhIGN1cnNvciB2YWx1ZSBhdCBhIGdpdmVuIG1hcEluZGV4IGxvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBzZXRDdXJyZW50U3luY0N1cnNvcihtYXBJbmRleDogbnVtYmVyLCBpbmRleFZhbHVlOiBudW1iZXIpIHtcbiAgTUFQX0NVUlNPUlNbbWFwSW5kZXhdID0gaW5kZXhWYWx1ZTtcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGNvbnZlcnQgYSB7a2V5OnZhbHVlfSBtYXAgaW50byBhIGBMU3R5bGluZ01hcGAgYXJyYXkuXG4gKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGVpdGhlciBnZW5lcmF0ZSBhIG5ldyBgTFN0eWxpbmdNYXBgIGluc3RhbmNlXG4gKiBvciBpdCB3aWxsIHBhdGNoIHRoZSBwcm92aWRlZCBgbmV3VmFsdWVzYCBtYXAgdmFsdWUgaW50byBhblxuICogZXhpc3RpbmcgYExTdHlsaW5nTWFwYCB2YWx1ZSAodGhpcyBvbmx5IGhhcHBlbnMgaWYgYGJpbmRpbmdWYWx1ZWBcbiAqIGlzIGFuIGluc3RhbmNlIG9mIGBMU3R5bGluZ01hcGApLlxuICpcbiAqIElmIGEgbmV3IGtleS92YWx1ZSBtYXAgaXMgcHJvdmlkZWQgd2l0aCBhbiBvbGQgYExTdHlsaW5nTWFwYFxuICogdmFsdWUgdGhlbiBhbGwgcHJvcGVydGllcyB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlaXIgbmV3XG4gKiB2YWx1ZXMgb3Igd2l0aCBgbnVsbGAuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYXJyYXkgd2lsbCBuZXZlclxuICogc2hyaW5rIGluIHNpemUgKGJ1dCBpdCB3aWxsIGFsc28gbm90IGJlIGNyZWF0ZWQgYW5kIHRocm93blxuICogYXdheSB3aGVuZXZlciB0aGUge2tleTp2YWx1ZX0gbWFwIGVudHJpZXMgY2hhbmdlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUludG9TdHlsaW5nTWFwKFxuICAgIGJpbmRpbmdWYWx1ZTogbnVsbCB8IExTdHlsaW5nTWFwLFxuICAgIG5ld1ZhbHVlczoge1trZXk6IHN0cmluZ106IGFueX0gfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogTFN0eWxpbmdNYXAge1xuICBjb25zdCBsU3R5bGluZ01hcDogTFN0eWxpbmdNYXAgPSBBcnJheS5pc0FycmF5KGJpbmRpbmdWYWx1ZSkgPyBiaW5kaW5nVmFsdWUgOiBbbnVsbF07XG4gIGxTdHlsaW5nTWFwW0xTdHlsaW5nTWFwSW5kZXguUmF3VmFsdWVQb3NpdGlvbl0gPSBuZXdWYWx1ZXMgfHwgbnVsbDtcblxuICAvLyBiZWNhdXNlIHRoZSBuZXcgdmFsdWVzIG1heSBub3QgaW5jbHVkZSBhbGwgdGhlIHByb3BlcnRpZXNcbiAgLy8gdGhhdCB0aGUgb2xkIG9uZXMgaGFkLCBhbGwgdmFsdWVzIGFyZSBzZXQgdG8gYG51bGxgIGJlZm9yZVxuICAvLyB0aGUgbmV3IHZhbHVlcyBhcmUgYXBwbGllZC4gVGhpcyB3YXksIHdoZW4gZmx1c2hlZCwgdGhlXG4gIC8vIHN0eWxpbmcgYWxnb3JpdGhtIGtub3dzIGV4YWN0bHkgd2hhdCBzdHlsZS9jbGFzcyB2YWx1ZXNcbiAgLy8gdG8gcmVtb3ZlIGZyb20gdGhlIGVsZW1lbnQgKHNpbmNlIHRoZXkgYXJlIGBudWxsYCkuXG4gIGZvciAobGV0IGogPSBMU3R5bGluZ01hcEluZGV4LlZhbHVlc1N0YXJ0UG9zaXRpb247IGogPCBsU3R5bGluZ01hcC5sZW5ndGg7XG4gICAgICAgaiArPSBMU3R5bGluZ01hcEluZGV4LlR1cGxlU2l6ZSkge1xuICAgIHNldE1hcFZhbHVlKGxTdHlsaW5nTWFwLCBqLCBudWxsKTtcbiAgfVxuXG4gIGxldCBwcm9wczogc3RyaW5nW118bnVsbCA9IG51bGw7XG4gIGxldCBtYXA6IHtba2V5OiBzdHJpbmddOiBhbnl9fHVuZGVmaW5lZHxudWxsO1xuICBsZXQgYWxsVmFsdWVzVHJ1ZSA9IGZhbHNlO1xuICBpZiAodHlwZW9mIG5ld1ZhbHVlcyA9PT0gJ3N0cmluZycpIHsgIC8vIFtjbGFzc10gYmluZGluZ3MgYWxsb3cgc3RyaW5nIHZhbHVlc1xuICAgIGlmIChuZXdWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICBwcm9wcyA9IG5ld1ZhbHVlcy5zcGxpdCgvXFxzKy8pO1xuICAgICAgYWxsVmFsdWVzVHJ1ZSA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHByb3BzID0gbmV3VmFsdWVzID8gT2JqZWN0LmtleXMobmV3VmFsdWVzKSA6IG51bGw7XG4gICAgbWFwID0gbmV3VmFsdWVzO1xuICB9XG5cbiAgaWYgKHByb3BzKSB7XG4gICAgb3V0ZXI6IGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHByb3AgPSBwcm9wc1tpXSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCB2YWx1ZSA9IGFsbFZhbHVlc1RydWUgPyB0cnVlIDogbWFwICFbcHJvcF07XG4gICAgICBmb3IgKGxldCBqID0gTFN0eWxpbmdNYXBJbmRleC5WYWx1ZXNTdGFydFBvc2l0aW9uOyBqIDwgbFN0eWxpbmdNYXAubGVuZ3RoO1xuICAgICAgICAgICBqICs9IExTdHlsaW5nTWFwSW5kZXguVHVwbGVTaXplKSB7XG4gICAgICAgIGNvbnN0IHByb3BBdEluZGV4ID0gZ2V0TWFwUHJvcChsU3R5bGluZ01hcCwgaik7XG4gICAgICAgIGlmIChwcm9wIDw9IHByb3BBdEluZGV4KSB7XG4gICAgICAgICAgaWYgKHByb3BBdEluZGV4ID09PSBwcm9wKSB7XG4gICAgICAgICAgICBzZXRNYXBWYWx1ZShsU3R5bGluZ01hcCwgaiwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsU3R5bGluZ01hcC5zcGxpY2UoaiwgMCwgcHJvcCwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbFN0eWxpbmdNYXAucHVzaChwcm9wLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxTdHlsaW5nTWFwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFwUHJvcChtYXA6IExTdHlsaW5nTWFwLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIG1hcFtpbmRleCArIExTdHlsaW5nTWFwSW5kZXguUHJvcE9mZnNldF0gYXMgc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TWFwVmFsdWUobWFwOiBMU3R5bGluZ01hcCwgaW5kZXg6IG51bWJlciwgdmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgbWFwW2luZGV4ICsgTFN0eWxpbmdNYXBJbmRleC5WYWx1ZU9mZnNldF0gPSB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1hcFZhbHVlKG1hcDogTFN0eWxpbmdNYXAsIGluZGV4OiBudW1iZXIpOiBzdHJpbmd8bnVsbCB7XG4gIHJldHVybiBtYXBbaW5kZXggKyBMU3R5bGluZ01hcEluZGV4LlZhbHVlT2Zmc2V0XSBhcyBzdHJpbmcgfCBudWxsO1xufVxuIl19
@@ -0,0 +1,23 @@
1
+ var _stylingMode = 0;
2
+ /**
3
+ * Temporary function used to inform the existing styling algorithm
4
+ * code to delegate all styling instruction calls to the new refactored
5
+ * styling code.
6
+ */
7
+ export function runtimeSetStylingMode(mode) {
8
+ _stylingMode = mode;
9
+ }
10
+ export function runtimeIsNewStylingInUse() {
11
+ return _stylingMode > 0 /* UseOld */;
12
+ }
13
+ export function runtimeAllowOldStyling() {
14
+ return _stylingMode < 2 /* UseNew */;
15
+ }
16
+ var _currentSanitizer;
17
+ export function setCurrentStyleSanitizer(sanitizer) {
18
+ _currentSanitizer = sanitizer;
19
+ }
20
+ export function getCurrentStyleSanitizer() {
21
+ return _currentSanitizer;
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3N0eWxpbmdfbmV4dC9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQ0EsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBRXJCOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBd0I7SUFDNUQsWUFBWSxHQUFHLElBQUksQ0FBQztBQUN0QixDQUFDO0FBRUQsTUFBTSxVQUFVLHdCQUF3QjtJQUN0QyxPQUFPLFlBQVksaUJBQTRCLENBQUM7QUFDbEQsQ0FBQztBQUVELE1BQU0sVUFBVSxzQkFBc0I7SUFDcEMsT0FBTyxZQUFZLGlCQUE0QixDQUFDO0FBQ2xELENBQUM7QUFFRCxJQUFJLGlCQUFpRCxDQUFDO0FBQ3RELE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxTQUE2QztJQUNwRixpQkFBaUIsR0FBRyxTQUFTLENBQUM7QUFDaEMsQ0FBQztBQUVELE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsT0FBTyxpQkFBaUIsQ0FBQztBQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4qIEBsaWNlbnNlXG4qIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuKlxuKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4qL1xuaW1wb3J0IHtTYW5pdGl6ZXJ9IGZyb20gJy4uLy4uL3Nhbml0aXphdGlvbi9zZWN1cml0eSc7XG5pbXBvcnQge1N0eWxlU2FuaXRpemVGbn0gZnJvbSAnLi4vLi4vc2FuaXRpemF0aW9uL3N0eWxlX3Nhbml0aXplcic7XG5cbi8qKlxuICogLS0tLS0tLS1cbiAqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgdGVtcG9yYXJ5IGNvZGUgdG8gaW5jb3Jwb3JhdGUgdGhlIG5ldyBzdHlsaW5nIHJlZmFjdG9yXG4gKiBjb2RlIHRvIHdvcmsgYWxvbmdzaWRlIHRoZSBleGlzdGluZyBpbnN0cnVjdGlvbiBzZXQuXG4gKlxuICogVGhpcyBmaWxlIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIGBzZWxlY3QobilgIGlzIGZ1bGx5IGZ1bmN0aW9uYWwgKG9uY2VcbiAqIGl0IGlzIGFibGUgdG8gZXZhbHVhdGUgaG9zdCBiaW5kaW5ncyBpbiBzeW5jIGVsZW1lbnQtYnktZWxlbWVudFxuICogd2l0aCB0ZW1wbGF0ZSBjb2RlKS5cbiAqXG4gKiAtLS0tLS0tLVxuICovXG5cbi8qKlxuICogQSB0ZW1wb3JhcnkgZW51bSBvZiBzdGF0ZXMgdGhhdCBpbmZvcm0gdGhlIGNvcmUgd2hldGhlciBvciBub3RcbiAqIHRvIGRlZmVyIGFsbCBzdHlsaW5nIGluc3RydWN0aW9uIGNhbGxzIHRvIHRoZSBvbGQgb3IgbmV3XG4gKiBzdHlsaW5nIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgZW51bSBSdW50aW1lU3R5bGluZ01vZGUge1xuICBVc2VPbGQgPSAwLFxuICBVc2VCb3RoT2xkQW5kTmV3ID0gMSxcbiAgVXNlTmV3ID0gMixcbn1cblxubGV0IF9zdHlsaW5nTW9kZSA9IDA7XG5cbi8qKlxuICogVGVtcG9yYXJ5IGZ1bmN0aW9uIHVzZWQgdG8gaW5mb3JtIHRoZSBleGlzdGluZyBzdHlsaW5nIGFsZ29yaXRobVxuICogY29kZSB0byBkZWxlZ2F0ZSBhbGwgc3R5bGluZyBpbnN0cnVjdGlvbiBjYWxscyB0byB0aGUgbmV3IHJlZmFjdG9yZWRcbiAqIHN0eWxpbmcgY29kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bnRpbWVTZXRTdHlsaW5nTW9kZShtb2RlOiBSdW50aW1lU3R5bGluZ01vZGUpIHtcbiAgX3N0eWxpbmdNb2RlID0gbW9kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bnRpbWVJc05ld1N0eWxpbmdJblVzZSgpIHtcbiAgcmV0dXJuIF9zdHlsaW5nTW9kZSA+IFJ1bnRpbWVTdHlsaW5nTW9kZS5Vc2VPbGQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW50aW1lQWxsb3dPbGRTdHlsaW5nKCkge1xuICByZXR1cm4gX3N0eWxpbmdNb2RlIDwgUnVudGltZVN0eWxpbmdNb2RlLlVzZU5ldztcbn1cblxubGV0IF9jdXJyZW50U2FuaXRpemVyOiBTYW5pdGl6ZXJ8U3R5bGVTYW5pdGl6ZUZufG51bGw7XG5leHBvcnQgZnVuY3Rpb24gc2V0Q3VycmVudFN0eWxlU2FuaXRpemVyKHNhbml0aXplcjogU2FuaXRpemVyIHwgU3R5bGVTYW5pdGl6ZUZuIHwgbnVsbCkge1xuICBfY3VycmVudFNhbml0aXplciA9IHNhbml0aXplcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRTdHlsZVNhbml0aXplcigpIHtcbiAgcmV0dXJuIF9jdXJyZW50U2FuaXRpemVyO1xufVxuIl19
@@ -0,0 +1,130 @@
1
+ import { attachDebugObject } from '../util/debug_utils';
2
+ import { applyStyling } from './bindings';
3
+ import { activeStylingMapFeature } from './map_based_bindings';
4
+ import { getCurrentOrLViewSanitizer, getDefaultValue, getGuardMask, getProp, getValuesCount, isContextLocked, isSanitizationRequired } from './util';
5
+ /**
6
+ * Instantiates and attaches an instance of `TStylingContextDebug` to the provided context.
7
+ */
8
+ export function attachStylingDebugObject(context) {
9
+ var debug = new TStylingContextDebug(context);
10
+ attachDebugObject(context, debug);
11
+ return debug;
12
+ }
13
+ /**
14
+ * A human-readable debug summary of the styling data present within `TStylingContext`.
15
+ *
16
+ * This class is designed to be used within testing code or when an
17
+ * application has `ngDevMode` activated.
18
+ */
19
+ var TStylingContextDebug = /** @class */ (function () {
20
+ function TStylingContextDebug(context) {
21
+ this.context = context;
22
+ }
23
+ Object.defineProperty(TStylingContextDebug.prototype, "isLocked", {
24
+ get: function () { return isContextLocked(this.context); },
25
+ enumerable: true,
26
+ configurable: true
27
+ });
28
+ Object.defineProperty(TStylingContextDebug.prototype, "entries", {
29
+ /**
30
+ * Returns a detailed summary of each styling entry in the context.
31
+ *
32
+ * See `TStylingTupleSummary`.
33
+ */
34
+ get: function () {
35
+ var context = this.context;
36
+ var entries = {};
37
+ var start = 2 /* MapBindingsPosition */;
38
+ var i = start;
39
+ while (i < context.length) {
40
+ var valuesCount = getValuesCount(context, i);
41
+ // the context may contain placeholder values which are populated ahead of time,
42
+ // but contain no actual binding values. In this situation there is no point in
43
+ // classifying this as an "entry" since no real data is stored here yet.
44
+ if (valuesCount) {
45
+ var prop = getProp(context, i);
46
+ var guardMask = getGuardMask(context, i);
47
+ var defaultValue = getDefaultValue(context, i);
48
+ var sanitizationRequired = isSanitizationRequired(context, i);
49
+ var bindingsStartPosition = i + 3 /* BindingsStartOffset */;
50
+ var sources = [];
51
+ for (var j = 0; j < valuesCount; j++) {
52
+ sources.push(context[bindingsStartPosition + j]);
53
+ }
54
+ entries[prop] = { prop: prop, guardMask: guardMask, sanitizationRequired: sanitizationRequired, valuesCount: valuesCount, defaultValue: defaultValue, sources: sources };
55
+ }
56
+ i += 3 /* BindingsStartOffset */ + valuesCount;
57
+ }
58
+ return entries;
59
+ },
60
+ enumerable: true,
61
+ configurable: true
62
+ });
63
+ return TStylingContextDebug;
64
+ }());
65
+ /**
66
+ * A human-readable debug summary of the styling data present for a `DebugNode` instance.
67
+ *
68
+ * This class is designed to be used within testing code or when an
69
+ * application has `ngDevMode` activated.
70
+ */
71
+ var NodeStylingDebug = /** @class */ (function () {
72
+ function NodeStylingDebug(context, _data, _isClassBased) {
73
+ this.context = context;
74
+ this._data = _data;
75
+ this._isClassBased = _isClassBased;
76
+ this._sanitizer = null;
77
+ }
78
+ /**
79
+ * Overrides the sanitizer used to process styles.
80
+ */
81
+ NodeStylingDebug.prototype.overrideSanitizer = function (sanitizer) { this._sanitizer = sanitizer; };
82
+ Object.defineProperty(NodeStylingDebug.prototype, "summary", {
83
+ /**
84
+ * Returns a detailed summary of each styling entry in the context and
85
+ * what their runtime representation is.
86
+ *
87
+ * See `LStylingSummary`.
88
+ */
89
+ get: function () {
90
+ var entries = {};
91
+ this._mapValues(function (prop, value, bindingIndex) {
92
+ entries[prop] = { prop: prop, value: value, bindingIndex: bindingIndex };
93
+ });
94
+ return entries;
95
+ },
96
+ enumerable: true,
97
+ configurable: true
98
+ });
99
+ Object.defineProperty(NodeStylingDebug.prototype, "values", {
100
+ /**
101
+ * Returns a key/value map of all the styles/classes that were last applied to the element.
102
+ */
103
+ get: function () {
104
+ var entries = {};
105
+ this._mapValues(function (prop, value) { entries[prop] = value; });
106
+ return entries;
107
+ },
108
+ enumerable: true,
109
+ configurable: true
110
+ });
111
+ NodeStylingDebug.prototype._mapValues = function (fn) {
112
+ // there is no need to store/track an element instance. The
113
+ // element is only used when the styling algorithm attempts to
114
+ // style the value (and we mock out the stylingApplyFn anyway).
115
+ var mockElement = {};
116
+ var hasMaps = getValuesCount(this.context, 2 /* MapBindingsPosition */) > 0;
117
+ if (hasMaps) {
118
+ activeStylingMapFeature();
119
+ }
120
+ var mapFn = function (renderer, element, prop, value, bindingIndex) {
121
+ fn(prop, value, bindingIndex || null);
122
+ };
123
+ var sanitizer = this._isClassBased ? null : (this._sanitizer ||
124
+ getCurrentOrLViewSanitizer(this._data));
125
+ applyStyling(this.context, null, mockElement, this._data, true, mapFn, sanitizer);
126
+ };
127
+ return NodeStylingDebug;
128
+ }());
129
+ export { NodeStylingDebug };
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGluZ19kZWJ1Zy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvc3R5bGluZ19uZXh0L3N0eWxpbmdfZGVidWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUV4QyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU3RCxPQUFPLEVBQUMsMEJBQTBCLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBYyxzQkFBc0IsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQXlGL0o7O0dBRUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsT0FBd0I7SUFDL0QsSUFBTSxLQUFLLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSDtJQUNFLDhCQUE0QixPQUF3QjtRQUF4QixZQUFPLEdBQVAsT0FBTyxDQUFpQjtJQUFHLENBQUM7SUFFeEQsc0JBQUksMENBQVE7YUFBWixjQUFpQixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQU94RCxzQkFBSSx5Q0FBTztRQUxYOzs7O1dBSUc7YUFDSDtZQUNFLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDN0IsSUFBTSxPQUFPLEdBQTJDLEVBQUUsQ0FBQztZQUMzRCxJQUFNLEtBQUssOEJBQTJDLENBQUM7WUFDdkQsSUFBSSxDQUFD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SSxPQUFPLEVBQUU7WUFDWCx1QkFBdUIsRUFBRSxDQUFDO1NBQzNCO1FBRUQsSUFBTSxLQUFLLEdBQ1AsVUFBQyxRQUFhLEVBQUUsT0FBaUIsRUFBRSxJQUFZLEVBQUUsS0FBVSxFQUFFLFlBQW9CO1lBQy9FLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUM7UUFFTixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFDZiwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsS0FBYyxDQUFDLENBQUMsQ0FBQztRQUNoRyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBQ0gsdUJBQUM7QUFBRCxDQUFDLEFBdERELElBc0RDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4qIEBsaWNlbnNlXG4qIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuKlxuKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4qL1xuaW1wb3J0IHtTYW5pdGl6ZXJ9IGZyb20gJy4uLy4uL3Nhbml0aXphdGlvbi9zZWN1cml0eSc7XG5pbXBvcnQge1N0eWxlU2FuaXRpemVGbn0gZnJvbSAnLi4vLi4vc2FuaXRpemF0aW9uL3N0eWxlX3Nhbml0aXplcic7XG5pbXBvcnQge1JFbGVtZW50fSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlbmRlcmVyJztcbmltcG9ydCB7TFZpZXcsIFNBTklUSVpFUn0gZnJvbSAnLi4vaW50ZXJmYWNlcy92aWV3JztcbmltcG9ydCB7YXR0YWNoRGVidWdPYmplY3R9IGZyb20gJy4uL3V0aWwvZGVidWdfdXRpbHMnO1xuXG5pbXBvcnQge2FwcGx5U3R5bGluZ30gZnJvbSAnLi9iaW5kaW5ncyc7XG5pbXBvcnQge0FwcGx5U3R5bGluZ0ZuLCBMU3R5bGluZ0RhdGEsIFRTdHlsaW5nQ29udGV4dCwgVFN0eWxpbmdDb250ZXh0SW5kZXh9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge2FjdGl2ZVN0eWxpbmdNYXBGZWF0dXJlfSBmcm9tICcuL21hcF9iYXNlZF9iaW5kaW5ncyc7XG5pbXBvcnQge2dldEN1cnJlbnRTdHlsZVNhbml0aXplcn0gZnJvbSAnLi9zdGF0ZSc7XG5pbXBvcnQge2dldEN1cnJlbnRPckxWaWV3U2FuaXRpemVyLCBnZXREZWZhdWx0VmFsdWUsIGdldEd1YXJkTWFzaywgZ2V0UHJvcCwgZ2V0VmFsdWVzQ291bnQsIGlzQ29udGV4dExvY2tlZCwgaXNNYXBCYXNlZCwgaXNTYW5pdGl6YXRpb25SZXF1aXJlZH0gZnJvbSAnLi91dGlsJztcblxuXG5cbi8qKlxuICogLS0tLS0tLS1cbiAqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvcmUgZGVidWcgZnVuY3Rpb25hbGl0eSBmb3Igc3R5bGluZyBpbiBBbmd1bGFyLlxuICpcbiAqIFRvIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGFsZ29yaXRobSBzZWUgYFRTdHlsaW5nQ29udGV4dGAuXG4gKlxuICogLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQSBkZWJ1Zy90ZXN0aW5nLW9yaWVudGVkIHN1bW1hcnkgb2YgYSBzdHlsaW5nIGVudHJ5LlxuICpcbiAqIEEgdmFsdWUgc3VjaCBhcyB0aGlzIGlzIGdlbmVyYXRlZCBhcyBhbiBhcnRpZmFjdCBvZiB0aGUgYERlYnVnU3R5bGluZ2BcbiAqIHN1bW1hcnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTFN0eWxpbmdTdW1tYXJ5IHtcbiAgLyoqIFRoZSBzdHlsZS9jbGFzcyBwcm9wZXJ0eSB0aGF0IHRoZSBzdW1tYXJ5IGlzIGF0dGFjaGVkIHRvICovXG4gIHByb3A6IHN0cmluZztcblxuICAvKiogVGhlIGxhc3QgYXBwbGllZCB2YWx1ZSBmb3IgdGhlIHN0eWxlL2NsYXNzIHByb3BlcnR5ICovXG4gIHZhbHVlOiBzdHJpbmd8Ym9vbGVhbnxudWxsO1xuXG4gIC8qKiBUaGUgYmluZGluZyBpbmRleCBvZiB0aGUgbGFzdCBhcHBsaWVkIHN0eWxlL2NsYXNzIHByb3BlcnR5ICovXG4gIGJpbmRpbmdJbmRleDogbnVtYmVyfG51bGw7XG59XG5cbi8qKlxuICogQSBkZWJ1Zy90ZXN0aW5nLW9yaWVudGVkIHN1bW1hcnkgb2YgYWxsIHN0eWxpbmcgZW50cmllcyBmb3IgYSBgRGVidWdOb2RlYCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWJ1Z1N0eWxpbmcge1xuICAvKiogVGhlIGFzc29jaWF0ZWQgVFN0eWxpbmdDb250ZXh0IGluc3RhbmNlICovXG4gIGNvbnRleHQ6IFRTdHlsaW5nQ29udGV4dDtcblxuICAvKipcbiAgICogQSBzdW1tYXJpemF0aW9uIG9mIGVhY2ggc3R5bGUvY2xhc3MgcHJvcGVydHlcbiAgICogcHJlc2VudCBpbiB0aGUgY29udGV4dC5cbiAgICovXG4gIHN1bW1hcnk6IHtba2V5OiBzdHJpbmddOiBMU3R5bGluZ1N1bW1hcnl9O1xuXG4gIC8qKlxuICAgKiBBIGtleS92YWx1ZSBtYXAgb2YgYWxsIHN0eWxpbmcgcHJvcGVydGllcyBhbmQgdGhlaXJcbiAgICogcnVudGltZSB2YWx1ZXMuXG4gICAqL1xuICB2YWx1ZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgYm9vbGVhbn07XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGUgc2FuaXRpemVyIHVzZWQgdG8gcHJvY2VzcyBzdHlsZXMuXG4gICAqL1xuICBvdmVycmlkZVNhbml0aXplcihzYW5pdGl6ZXI6IFN0eWxlU2FuaXRpemVGbnxudWxsKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIGRlYnVnL3Rlc3Rpbmctb3JpZW50ZWQgc3VtbWFyeSBvZiBhbGwgc3R5bGluZyBlbnRyaWVzIHdpdGhpbiBhIGBUU3R5bGluZ0NvbnRleHRgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRTdHlsaW5nVHVwbGVTdW1tYXJ5IHtcbiAgLyoqIFRoZSBwcm9wZXJ0eSAoc3R5bGUgb3IgY2xhc3MgcHJvcGVydHkpIHRoYXQgdGhpcyB0dXBsZSByZXByZXNlbnRzICovXG4gIHByb3A6IHN0cmluZztcblxuICAvKiogVGhlIHRvdGFsIGFtb3VudCBvZiBzdHlsaW5nIGVudHJpZXMgYXBhcnQgb2YgdGhpcyB0dXBsZSAqL1xuICB2YWx1ZXNDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYml0IGd1YXJkIG1hc2sgdGhhdCBpcyB1c2VkIHRvIGNvbXBhcmUgYW5kIHByb3RlY3QgYWdhaW5zdFxuICAgKiBzdHlsaW5nIGNoYW5nZXMgd2hlbiBhbmQgc3R5bGluZyBiaW5kaW5ncyB1cGRhdGVcbiAgICovXG4gIGd1YXJkTWFzazogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZW50cnkgcmVxdWlyZXMgc2FuaXRpemF0aW9uXG4gICAqL1xuICBzYW5pdGl6YXRpb25SZXF1aXJlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgdGhhdCB3aWxsIGJlIGFwcGxpZWQgaWYgYW55IGJpbmRpbmdzIGFyZSBmYWxzeS5cbiAgICovXG4gIGRlZmF1bHRWYWx1ZTogc3RyaW5nfGJvb2xlYW58bnVsbDtcblxuICAvKipcbiAgICogQWxsIGJpbmRpbmdJbmRleCBzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgZm9yIHRoaXMgc3R5bGUuXG4gICAqL1xuICBzb3VyY2VzOiAobnVtYmVyfG51bGx8c3RyaW5nKVtdO1xufVxuXG4vKipcbiAqIEluc3RhbnRpYXRlcyBhbmQgYXR0YWNoZXMgYW4gaW5zdGFuY2Ugb2YgYFRTdHlsaW5nQ29udGV4dERlYnVnYCB0byB0aGUgcHJvdmlkZWQgY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFN0eWxpbmdEZWJ1Z09iamVjdChjb250ZXh0OiBUU3R5bGluZ0NvbnRleHQpIHtcbiAgY29uc3QgZGVidWcgPSBuZXcgVFN0eWxpbmdDb250ZXh0RGVidWcoY29udGV4dCk7XG4gIGF0dGFjaERlYnVnT2JqZWN0KGNvbnRleHQsIGRlYnVnKTtcbiAgcmV0dXJuIGRlYnVnO1xufVxuXG4vKipcbiAqIEEgaHVtYW4tcmVhZGFibGUgZGVidWcgc3VtbWFyeSBvZiB0aGUgc3R5bGluZyBkYXRhIHByZXNlbnQgd2l0aGluIGBUU3R5bGluZ0NvbnRleHRgLlxuICpcbiAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoaW4gdGVzdGluZyBjb2RlIG9yIHdoZW4gYW5cbiAqIGFwcGxpY2F0aW9uIGhhcyBgbmdEZXZNb2RlYCBhY3RpdmF0ZWQuXG4gKi9cbmNsYXNzIFRTdHlsaW5nQ29udGV4dERlYnVnIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNvbnRleHQ6IFRTdHlsaW5nQ29udGV4dCkge31cblxuICBnZXQgaXNMb2NrZWQoKSB7IHJldHVybiBpc0NvbnRleHRMb2NrZWQodGhpcy5jb250ZXh0KTsgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZGV0YWlsZWQgc3VtbWFyeSBvZiBlYWNoIHN0eWxpbmcgZW50cnkgaW4gdGhlIGNvbnRleHQuXG4gICAqXG4gICAqIFNlZSBgVFN0eWxpbmdUdXBsZVN1bW1hcnlgLlxuICAgKi9cbiAgZ2V0IGVudHJpZXMoKToge1twcm9wOiBzdHJpbmddOiBUU3R5bGluZ1R1cGxlU3VtbWFyeX0ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgY29uc3QgZW50cmllczoge1twcm9wOiBzdHJpbmddOiBUU3R5bGluZ1R1cGxlU3VtbWFyeX0gPSB7fTtcbiAgICBjb25zdCBzdGFydCA9IFRTdHlsaW5nQ29udGV4dEluZGV4Lk1hcEJpbmRpbmdzUG9zaXRpb247XG4gICAgbGV0IGkgPSBzdGFydDtcbiAgICB3aGlsZSAoaSA8IGNvbnRleHQubGVuZ3RoKSB7XG4gICAgICBjb25zdCB2YWx1ZXNDb3VudCA9IGdldFZhbHVlc0NvdW50KGNvbnRleHQsIGkpO1xuICAgICAgLy8gdGhlIGNvbnRleHQgbWF5IGNvbnRhaW4gcGxhY2Vob2xkZXIgdmFsdWVzIHdoaWNoIGFyZSBwb3B1bGF0ZWQgYWhlYWQgb2YgdGltZSxcbiAgICAgIC8vIGJ1dCBjb250YWluIG5vIGFjdHVhbCBiaW5kaW5nIHZhbHVlcy4gSW4gdGhpcyBzaXR1YXRpb24gdGhlcmUgaXMgbm8gcG9pbnQgaW5cbiAgICAgIC8vIGNsYXNzaWZ5aW5nIHRoaXMgYXMgYW4gXCJlbnRyeVwiIHNpbmNlIG5vIHJlYWwgZGF0YSBpcyBzdG9yZWQgaGVyZSB5ZXQuXG4gICAgICBpZiAodmFsdWVzQ291bnQpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IGdldFByb3AoY29udGV4dCwgaSk7XG4gICAgICAgIGNvbnN0IGd1YXJkTWFzayA9IGdldEd1YXJkTWFzayhjb250ZXh0LCBpKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZ2V0RGVmYXVsdFZhbHVlKGNvbnRleHQsIGkpO1xuICAgICAgICBjb25zdCBzYW5pdGl6YXRpb25SZXF1aXJlZCA9IGlzU2FuaXRpemF0aW9uUmVxdWlyZWQoY29udGV4dCwgaSk7XG4gICAgICAgIGNvbnN0IGJpbmRpbmdzU3RhcnRQb3NpdGlvbiA9IGkgKyBUU3R5bGluZ0NvbnRleHRJbmRleC5CaW5kaW5nc1N0YXJ0T2Zmc2V0O1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZXM6IChudW1iZXIgfCBzdHJpbmcgfCBudWxsKVtdID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdmFsdWVzQ291bnQ7IGorKykge1xuICAgICAgICAgIHNvdXJjZXMucHVzaChjb250ZXh0W2JpbmRpbmdzU3RhcnRQb3NpdGlvbiArIGpdIGFzIG51bWJlciB8IHN0cmluZyB8IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgZW50cmllc1twcm9wXSA9IHtwcm9wLCBndWFyZE1hc2ssIHNhbml0aXphdGlvblJlcXVpcmVkLCB2YWx1ZXNDb3VudCwgZGVmYXVsdFZhbHVlLCBzb3VyY2VzfTtcbiAgICAgIH1cblxuICAgICAgaSArPSBUU3R5bGluZ0NvbnRleHRJbmRleC5CaW5kaW5nc1N0YXJ0T2Zmc2V0ICsgdmFsdWVzQ291bnQ7XG4gICAgfVxuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG59XG5cbi8qKlxuICogQSBodW1hbi1yZWFkYWJsZSBkZWJ1ZyBzdW1tYXJ5IG9mIHRoZSBzdHlsaW5nIGRhdGEgcHJlc2VudCBmb3IgYSBgRGVidWdOb2RlYCBpbnN0YW5jZS5cbiAqXG4gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgd2l0aGluIHRlc3RpbmcgY29kZSBvciB3aGVuIGFuXG4gKiBhcHBsaWNhdGlvbiBoYXMgYG5nRGV2TW9kZWAgYWN0aXZhdGVkLlxuICovXG5leHBvcnQgY2xhc3MgTm9kZVN0eWxpbmdEZWJ1ZyBpbXBsZW1lbnRzIERlYnVnU3R5bGluZyB7XG4gIHByaXZhdGUgX3Nhbml0aXplcjogU3R5bGVTYW5pdGl6ZUZufG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHVibGljIGNvbnRleHQ6IFRTdHlsaW5nQ29udGV4dCwgcHJpdmF0ZSBfZGF0YTogTFN0eWxpbmdEYXRhLFxuICAgICAgcHJpdmF0ZSBfaXNDbGFzc0Jhc2VkPzogYm9vbGVhbikge31cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBzYW5pdGl6ZXIgdXNlZCB0byBwcm9jZXNzIHN0eWxlcy5cbiAgICovXG4gIG92ZXJyaWRlU2FuaXRpemVyKHNhbml0aXplcjogU3R5bGVTYW5pdGl6ZUZufG51bGwpIHsgdGhpcy5fc2FuaXRpemVyID0gc2FuaXRpemVyOyB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkZXRhaWxlZCBzdW1tYXJ5IG9mIGVhY2ggc3R5bGluZyBlbnRyeSBpbiB0aGUgY29udGV4dCBhbmRcbiAgICogd2hhdCB0aGVpciBydW50aW1lIHJlcHJlc2VudGF0aW9uIGlzLlxuICAgKlxuICAgKiBTZWUgYExTdHlsaW5nU3VtbWFyeWAuXG4gICAqL1xuICBnZXQgc3VtbWFyeSgpOiB7W2tleTogc3RyaW5nXTogTFN0eWxpbmdTdW1tYXJ5fSB7XG4gICAgY29uc3QgZW50cmllczoge1trZXk6IHN0cmluZ106IExTdHlsaW5nU3VtbWFyeX0gPSB7fTtcbiAgICB0aGlzLl9tYXBWYWx1ZXMoKHByb3A6IHN0cmluZywgdmFsdWU6IGFueSwgYmluZGluZ0luZGV4OiBudW1iZXIgfCBudWxsKSA9PiB7XG4gICAgICBlbnRyaWVzW3Byb3BdID0ge3Byb3AsIHZhbHVlLCBiaW5kaW5nSW5kZXh9O1xuICAgIH0pO1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBrZXkvdmFsdWUgbWFwIG9mIGFsbCB0aGUgc3R5bGVzL2NsYXNzZXMgdGhhdCB3ZXJlIGxhc3QgYXBwbGllZCB0byB0aGUgZWxlbWVudC5cbiAgICovXG4gIGdldCB2YWx1ZXMoKToge1trZXk6IHN0cmluZ106IGFueX0ge1xuICAgIGNvbnN0IGVudHJpZXM6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0ge307XG4gICAgdGhpcy5fbWFwVmFsdWVzKChwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHsgZW50cmllc1twcm9wXSA9IHZhbHVlOyB9KTtcbiAgICByZXR1cm4gZW50cmllcztcbiAgfVxuXG4gIHByaXZhdGUgX21hcFZhbHVlcyhmbjogKHByb3A6IHN0cmluZywgdmFsdWU6IGFueSwgYmluZGluZ0luZGV4OiBudW1iZXJ8bnVsbCkgPT4gYW55KSB7XG4gICAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byBzdG9yZS90cmFjayBhbiBlbGVtZW50IGluc3RhbmNlLiBUaGVcbiAgICAvLyBlbGVtZW50IGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBzdHlsaW5nIGFsZ29yaXRobSBhdHRlbXB0cyB0b1xuICAgIC8vIHN0eWxlIHRoZSB2YWx1ZSAoYW5kIHdlIG1vY2sgb3V0IHRoZSBzdHlsaW5nQXBwbHlGbiBhbnl3YXkpLlxuICAgIGNvbnN0IG1vY2tFbGVtZW50ID0ge30gYXMgYW55O1xuICAgIGNvbnN0IGhhc01hcHMgPSBnZXRWYWx1ZXNDb3VudCh0aGlzLmNvbnRleHQsIFRTdHlsaW5nQ29udGV4dEluZGV4Lk1hcEJpbmRpbmdzUG9zaXRpb24pID4gMDtcbiAgICBpZiAoaGFzTWFwcykge1xuICAgICAgYWN0aXZlU3R5bGluZ01hcEZlYXR1cmUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXBGbjogQXBwbHlTdHlsaW5nRm4gPVxuICAgICAgICAocmVuZGVyZXI6IGFueSwgZWxlbWVudDogUkVsZW1lbnQsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSwgYmluZGluZ0luZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBmbihwcm9wLCB2YWx1ZSwgYmluZGluZ0luZGV4IHx8IG51bGwpO1xuICAgICAgICB9O1xuXG4gICAgY29uc3Qgc2FuaXRpemVyID0gdGhpcy5faXNDbGFzc0Jhc2VkID8gbnVsbCA6ICh0aGlzLl9zYW5pdGl6ZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEN1cnJlbnRPckxWaWV3U2FuaXRpemVyKHRoaXMuX2RhdGEgYXMgTFZpZXcpKTtcbiAgICBhcHBseVN0eWxpbmcodGhpcy5jb250ZXh0LCBudWxsLCBtb2NrRWxlbWVudCwgdGhpcy5fZGF0YSwgdHJ1ZSwgbWFwRm4sIHNhbml0aXplcik7XG4gIH1cbn1cbiJdfQ==