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