@angular/compiler 19.0.0-next.1 → 19.0.0-next.10
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/LICENSE +21 -0
- package/fesm2022/compiler.mjs +5465 -4675
- package/fesm2022/compiler.mjs.map +1 -1
- package/index.d.ts +115 -15
- package/package.json +2 -4
- package/esm2022/compiler.mjs +0 -13
- package/esm2022/index.mjs +0 -13
- package/esm2022/public_api.mjs +0 -15
- package/esm2022/src/assertions.mjs +0 -31
- package/esm2022/src/chars.mjs +0 -90
- package/esm2022/src/compiler.mjs +0 -88
- package/esm2022/src/compiler_facade_interface.mjs +0 -29
- package/esm2022/src/config.mjs +0 -20
- package/esm2022/src/constant_pool.mjs +0 -285
- package/esm2022/src/core.mjs +0 -96
- package/esm2022/src/expression_parser/ast.mjs +0 -755
- package/esm2022/src/expression_parser/lexer.mjs +0 -421
- package/esm2022/src/expression_parser/parser.mjs +0 -1222
- package/esm2022/src/i18n/digest.mjs +0 -322
- package/esm2022/src/i18n/extractor_merger.mjs +0 -409
- package/esm2022/src/i18n/i18n_ast.mjs +0 -212
- package/esm2022/src/i18n/i18n_html_parser.mjs +0 -54
- package/esm2022/src/i18n/i18n_parser.mjs +0 -247
- package/esm2022/src/i18n/index.mjs +0 -16
- package/esm2022/src/i18n/message_bundle.mjs +0 -93
- package/esm2022/src/i18n/parse_util.mjs +0 -17
- package/esm2022/src/i18n/serializers/placeholder.mjs +0 -139
- package/esm2022/src/i18n/serializers/serializer.mjs +0 -77
- package/esm2022/src/i18n/serializers/xliff.mjs +0 -300
- package/esm2022/src/i18n/serializers/xliff2.mjs +0 -349
- package/esm2022/src/i18n/serializers/xmb.mjs +0 -188
- package/esm2022/src/i18n/serializers/xml_helper.mjs +0 -94
- package/esm2022/src/i18n/serializers/xtb.mjs +0 -186
- package/esm2022/src/i18n/translation_bundle.mjs +0 -164
- package/esm2022/src/injectable_compiler_2.mjs +0 -138
- package/esm2022/src/jit_compiler_facade.mjs +0 -681
- package/esm2022/src/ml_parser/ast.mjs +0 -167
- package/esm2022/src/ml_parser/defaults.mjs +0 -24
- package/esm2022/src/ml_parser/entities.mjs +0 -2144
- package/esm2022/src/ml_parser/html_parser.mjs +0 -18
- package/esm2022/src/ml_parser/html_tags.mjs +0 -156
- package/esm2022/src/ml_parser/html_whitespaces.mjs +0 -107
- package/esm2022/src/ml_parser/icu_ast_expander.mjs +0 -125
- package/esm2022/src/ml_parser/lexer.mjs +0 -1210
- package/esm2022/src/ml_parser/parser.mjs +0 -539
- package/esm2022/src/ml_parser/tags.mjs +0 -47
- package/esm2022/src/ml_parser/tokens.mjs +0 -9
- package/esm2022/src/ml_parser/xml_parser.mjs +0 -19
- package/esm2022/src/ml_parser/xml_tags.mjs +0 -32
- package/esm2022/src/output/abstract_emitter.mjs +0 -524
- package/esm2022/src/output/abstract_js_emitter.mjs +0 -130
- package/esm2022/src/output/map_util.mjs +0 -19
- package/esm2022/src/output/output_ast.mjs +0 -1301
- package/esm2022/src/output/output_jit.mjs +0 -138
- package/esm2022/src/output/output_jit_trusted_types.mjs +0 -100
- package/esm2022/src/output/source_map.mjs +0 -150
- package/esm2022/src/parse_util.mjs +0 -198
- package/esm2022/src/render3/partial/api.mjs +0 -9
- package/esm2022/src/render3/partial/class_metadata.mjs +0 -52
- package/esm2022/src/render3/partial/component.mjs +0 -197
- package/esm2022/src/render3/partial/directive.mjs +0 -264
- package/esm2022/src/render3/partial/factory.mjs +0 -35
- package/esm2022/src/render3/partial/injectable.mjs +0 -67
- package/esm2022/src/render3/partial/injector.mjs +0 -41
- package/esm2022/src/render3/partial/ng_module.mjs +0 -63
- package/esm2022/src/render3/partial/pipe.mjs +0 -50
- package/esm2022/src/render3/partial/util.mjs +0 -79
- package/esm2022/src/render3/r3_ast.mjs +0 -493
- package/esm2022/src/render3/r3_class_debug_info_compiler.mjs +0 -35
- package/esm2022/src/render3/r3_class_metadata_compiler.mjs +0 -92
- package/esm2022/src/render3/r3_control_flow.mjs +0 -421
- package/esm2022/src/render3/r3_deferred_blocks.mjs +0 -170
- package/esm2022/src/render3/r3_deferred_triggers.mjs +0 -316
- package/esm2022/src/render3/r3_factory.mjs +0 -200
- package/esm2022/src/render3/r3_identifiers.mjs +0 -480
- package/esm2022/src/render3/r3_injector_compiler.mjs +0 -28
- package/esm2022/src/render3/r3_jit.mjs +0 -29
- package/esm2022/src/render3/r3_module_compiler.mjs +0 -211
- package/esm2022/src/render3/r3_pipe_compiler.mjs +0 -35
- package/esm2022/src/render3/r3_template_transform.mjs +0 -560
- package/esm2022/src/render3/util.mjs +0 -90
- package/esm2022/src/render3/view/api.mjs +0 -14
- package/esm2022/src/render3/view/compiler.mjs +0 -546
- package/esm2022/src/render3/view/i18n/get_msg_utils.mjs +0 -113
- package/esm2022/src/render3/view/i18n/icu_serializer.mjs +0 -43
- package/esm2022/src/render3/view/i18n/localize_utils.mjs +0 -118
- package/esm2022/src/render3/view/i18n/meta.mjs +0 -259
- package/esm2022/src/render3/view/i18n/util.mjs +0 -70
- package/esm2022/src/render3/view/query_generation.mjs +0 -182
- package/esm2022/src/render3/view/t2_api.mjs +0 -9
- package/esm2022/src/render3/view/t2_binder.mjs +0 -823
- package/esm2022/src/render3/view/template.mjs +0 -113
- package/esm2022/src/render3/view/util.mjs +0 -192
- package/esm2022/src/resource_loader.mjs +0 -17
- package/esm2022/src/schema/dom_element_schema_registry.mjs +0 -471
- package/esm2022/src/schema/dom_security_schema.mjs +0 -96
- package/esm2022/src/schema/element_schema_registry.mjs +0 -10
- package/esm2022/src/schema/trusted_types_sinks.mjs +0 -41
- package/esm2022/src/selector.mjs +0 -400
- package/esm2022/src/shadow_css.mjs +0 -1053
- package/esm2022/src/style_url_resolver.mjs +0 -17
- package/esm2022/src/template/pipeline/ir/index.mjs +0 -18
- package/esm2022/src/template/pipeline/ir/src/enums.mjs +0 -503
- package/esm2022/src/template/pipeline/ir/src/expression.mjs +0 -997
- package/esm2022/src/template/pipeline/ir/src/handle.mjs +0 -13
- package/esm2022/src/template/pipeline/ir/src/operations.mjs +0 -261
- package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +0 -405
- package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +0 -25
- package/esm2022/src/template/pipeline/ir/src/ops/shared.mjs +0 -43
- package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +0 -277
- package/esm2022/src/template/pipeline/ir/src/traits.mjs +0 -64
- package/esm2022/src/template/pipeline/ir/src/variable.mjs +0 -13
- package/esm2022/src/template/pipeline/src/compilation.mjs +0 -194
- package/esm2022/src/template/pipeline/src/conversion.mjs +0 -64
- package/esm2022/src/template/pipeline/src/emit.mjs +0 -238
- package/esm2022/src/template/pipeline/src/ingest.mjs +0 -1058
- package/esm2022/src/template/pipeline/src/instruction.mjs +0 -564
- package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +0 -32
- package/esm2022/src/template/pipeline/src/phases/apply_i18n_expressions.mjs +0 -63
- package/esm2022/src/template/pipeline/src/phases/assign_i18n_slot_dependencies.mjs +0 -63
- package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +0 -138
- package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +0 -75
- package/esm2022/src/template/pipeline/src/phases/chaining.mjs +0 -112
- package/esm2022/src/template/pipeline/src/phases/collapse_singleton_interpolations.mjs +0 -32
- package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +0 -58
- package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +0 -214
- package/esm2022/src/template/pipeline/src/phases/convert_i18n_bindings.mjs +0 -52
- package/esm2022/src/template/pipeline/src/phases/create_i18n_contexts.mjs +0 -105
- package/esm2022/src/template/pipeline/src/phases/deduplicate_text_bindings.mjs +0 -40
- package/esm2022/src/template/pipeline/src/phases/defer_configs.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/defer_resolve_targets.mjs +0 -113
- package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +0 -47
- package/esm2022/src/template/pipeline/src/phases/expand_safe_reads.mjs +0 -192
- package/esm2022/src/template/pipeline/src/phases/extract_i18n_messages.mjs +0 -218
- package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +0 -66
- package/esm2022/src/template/pipeline/src/phases/generate_local_let_references.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/generate_projection_def.mjs +0 -46
- package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +0 -170
- package/esm2022/src/template/pipeline/src/phases/has_const_expression_collection.mjs +0 -28
- package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +0 -81
- package/esm2022/src/template/pipeline/src/phases/i18n_const_collection.mjs +0 -309
- package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +0 -97
- package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +0 -43
- package/esm2022/src/template/pipeline/src/phases/namespace.mjs +0 -26
- package/esm2022/src/template/pipeline/src/phases/naming.mjs +0 -179
- package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +0 -75
- package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +0 -47
- package/esm2022/src/template/pipeline/src/phases/nullish_coalescing.mjs +0 -33
- package/esm2022/src/template/pipeline/src/phases/ordering.mjs +0 -140
- package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +0 -137
- package/esm2022/src/template/pipeline/src/phases/phase_remove_content_selectors.mjs +0 -42
- package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +0 -74
- package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +0 -30
- package/esm2022/src/template/pipeline/src/phases/propagate_i18n_blocks.mjs +0 -81
- package/esm2022/src/template/pipeline/src/phases/pure_function_extraction.mjs +0 -55
- package/esm2022/src/template/pipeline/src/phases/pure_literal_structures.mjs +0 -58
- package/esm2022/src/template/pipeline/src/phases/reify.mjs +0 -433
- package/esm2022/src/template/pipeline/src/phases/remove_empty_bindings.mjs +0 -31
- package/esm2022/src/template/pipeline/src/phases/remove_i18n_contexts.mjs +0 -27
- package/esm2022/src/template/pipeline/src/phases/remove_illegal_let_references.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/remove_unused_i18n_attrs.mjs +0 -33
- package/esm2022/src/template/pipeline/src/phases/resolve_contexts.mjs +0 -60
- package/esm2022/src/template/pipeline/src/phases/resolve_defer_deps_fns.mjs +0 -31
- package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_element_placeholders.mjs +0 -266
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_expression_placeholders.mjs +0 -70
- package/esm2022/src/template/pipeline/src/phases/resolve_names.mjs +0 -124
- package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +0 -123
- package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +0 -64
- package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +0 -62
- package/esm2022/src/template/pipeline/src/phases/store_let_optimization.mjs +0 -35
- package/esm2022/src/template/pipeline/src/phases/style_binding_specialization.mjs +0 -42
- package/esm2022/src/template/pipeline/src/phases/temporary_variables.mjs +0 -87
- package/esm2022/src/template/pipeline/src/phases/track_fn_generation.mjs +0 -52
- package/esm2022/src/template/pipeline/src/phases/track_fn_optimization.mjs +0 -88
- package/esm2022/src/template/pipeline/src/phases/track_variables.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/transform_two_way_binding_set.mjs +0 -43
- package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +0 -155
- package/esm2022/src/template/pipeline/src/phases/variable_optimization.mjs +0 -423
- package/esm2022/src/template/pipeline/src/phases/wrap_icus.mjs +0 -41
- package/esm2022/src/template/pipeline/src/util/elements.mjs +0 -29
- package/esm2022/src/template_parser/binding_parser.mjs +0 -465
- package/esm2022/src/template_parser/template_preparser.mjs +0 -84
- package/esm2022/src/util.mjs +0 -124
- package/esm2022/src/version.mjs +0 -15
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
import * as html from '../ml_parser/ast';
|
|
9
|
-
import { ParseError, ParseSourceSpan } from '../parse_util';
|
|
10
|
-
import * as t from './r3_ast';
|
|
11
|
-
import { getTriggerParametersStart, parseDeferredTime, parseOnTrigger, parseWhenTrigger, } from './r3_deferred_triggers';
|
|
12
|
-
/** Pattern to identify a `prefetch when` trigger. */
|
|
13
|
-
const PREFETCH_WHEN_PATTERN = /^prefetch\s+when\s/;
|
|
14
|
-
/** Pattern to identify a `prefetch on` trigger. */
|
|
15
|
-
const PREFETCH_ON_PATTERN = /^prefetch\s+on\s/;
|
|
16
|
-
/** Pattern to identify a `minimum` parameter in a block. */
|
|
17
|
-
const MINIMUM_PARAMETER_PATTERN = /^minimum\s/;
|
|
18
|
-
/** Pattern to identify a `after` parameter in a block. */
|
|
19
|
-
const AFTER_PARAMETER_PATTERN = /^after\s/;
|
|
20
|
-
/** Pattern to identify a `when` parameter in a block. */
|
|
21
|
-
const WHEN_PARAMETER_PATTERN = /^when\s/;
|
|
22
|
-
/** Pattern to identify a `on` parameter in a block. */
|
|
23
|
-
const ON_PARAMETER_PATTERN = /^on\s/;
|
|
24
|
-
/**
|
|
25
|
-
* Predicate function that determines if a block with
|
|
26
|
-
* a specific name cam be connected to a `defer` block.
|
|
27
|
-
*/
|
|
28
|
-
export function isConnectedDeferLoopBlock(name) {
|
|
29
|
-
return name === 'placeholder' || name === 'loading' || name === 'error';
|
|
30
|
-
}
|
|
31
|
-
/** Creates a deferred block from an HTML AST node. */
|
|
32
|
-
export function createDeferredBlock(ast, connectedBlocks, visitor, bindingParser) {
|
|
33
|
-
const errors = [];
|
|
34
|
-
const { placeholder, loading, error } = parseConnectedBlocks(connectedBlocks, errors, visitor);
|
|
35
|
-
const { triggers, prefetchTriggers } = parsePrimaryTriggers(ast.parameters, bindingParser, errors, placeholder);
|
|
36
|
-
// The `defer` block has a main span encompassing all of the connected branches as well.
|
|
37
|
-
let lastEndSourceSpan = ast.endSourceSpan;
|
|
38
|
-
let endOfLastSourceSpan = ast.sourceSpan.end;
|
|
39
|
-
if (connectedBlocks.length > 0) {
|
|
40
|
-
const lastConnectedBlock = connectedBlocks[connectedBlocks.length - 1];
|
|
41
|
-
lastEndSourceSpan = lastConnectedBlock.endSourceSpan;
|
|
42
|
-
endOfLastSourceSpan = lastConnectedBlock.sourceSpan.end;
|
|
43
|
-
}
|
|
44
|
-
const sourceSpanWithConnectedBlocks = new ParseSourceSpan(ast.sourceSpan.start, endOfLastSourceSpan);
|
|
45
|
-
const node = new t.DeferredBlock(html.visitAll(visitor, ast.children, ast.children), triggers, prefetchTriggers, placeholder, loading, error, ast.nameSpan, sourceSpanWithConnectedBlocks, ast.sourceSpan, ast.startSourceSpan, lastEndSourceSpan, ast.i18n);
|
|
46
|
-
return { node, errors };
|
|
47
|
-
}
|
|
48
|
-
function parseConnectedBlocks(connectedBlocks, errors, visitor) {
|
|
49
|
-
let placeholder = null;
|
|
50
|
-
let loading = null;
|
|
51
|
-
let error = null;
|
|
52
|
-
for (const block of connectedBlocks) {
|
|
53
|
-
try {
|
|
54
|
-
if (!isConnectedDeferLoopBlock(block.name)) {
|
|
55
|
-
errors.push(new ParseError(block.startSourceSpan, `Unrecognized block "@${block.name}"`));
|
|
56
|
-
break;
|
|
57
|
-
}
|
|
58
|
-
switch (block.name) {
|
|
59
|
-
case 'placeholder':
|
|
60
|
-
if (placeholder !== null) {
|
|
61
|
-
errors.push(new ParseError(block.startSourceSpan, `@defer block can only have one @placeholder block`));
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
placeholder = parsePlaceholderBlock(block, visitor);
|
|
65
|
-
}
|
|
66
|
-
break;
|
|
67
|
-
case 'loading':
|
|
68
|
-
if (loading !== null) {
|
|
69
|
-
errors.push(new ParseError(block.startSourceSpan, `@defer block can only have one @loading block`));
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
loading = parseLoadingBlock(block, visitor);
|
|
73
|
-
}
|
|
74
|
-
break;
|
|
75
|
-
case 'error':
|
|
76
|
-
if (error !== null) {
|
|
77
|
-
errors.push(new ParseError(block.startSourceSpan, `@defer block can only have one @error block`));
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
error = parseErrorBlock(block, visitor);
|
|
81
|
-
}
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
catch (e) {
|
|
86
|
-
errors.push(new ParseError(block.startSourceSpan, e.message));
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return { placeholder, loading, error };
|
|
90
|
-
}
|
|
91
|
-
function parsePlaceholderBlock(ast, visitor) {
|
|
92
|
-
let minimumTime = null;
|
|
93
|
-
for (const param of ast.parameters) {
|
|
94
|
-
if (MINIMUM_PARAMETER_PATTERN.test(param.expression)) {
|
|
95
|
-
if (minimumTime != null) {
|
|
96
|
-
throw new Error(`@placeholder block can only have one "minimum" parameter`);
|
|
97
|
-
}
|
|
98
|
-
const parsedTime = parseDeferredTime(param.expression.slice(getTriggerParametersStart(param.expression)));
|
|
99
|
-
if (parsedTime === null) {
|
|
100
|
-
throw new Error(`Could not parse time value of parameter "minimum"`);
|
|
101
|
-
}
|
|
102
|
-
minimumTime = parsedTime;
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
throw new Error(`Unrecognized parameter in @placeholder block: "${param.expression}"`);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return new t.DeferredBlockPlaceholder(html.visitAll(visitor, ast.children, ast.children), minimumTime, ast.nameSpan, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan, ast.i18n);
|
|
109
|
-
}
|
|
110
|
-
function parseLoadingBlock(ast, visitor) {
|
|
111
|
-
let afterTime = null;
|
|
112
|
-
let minimumTime = null;
|
|
113
|
-
for (const param of ast.parameters) {
|
|
114
|
-
if (AFTER_PARAMETER_PATTERN.test(param.expression)) {
|
|
115
|
-
if (afterTime != null) {
|
|
116
|
-
throw new Error(`@loading block can only have one "after" parameter`);
|
|
117
|
-
}
|
|
118
|
-
const parsedTime = parseDeferredTime(param.expression.slice(getTriggerParametersStart(param.expression)));
|
|
119
|
-
if (parsedTime === null) {
|
|
120
|
-
throw new Error(`Could not parse time value of parameter "after"`);
|
|
121
|
-
}
|
|
122
|
-
afterTime = parsedTime;
|
|
123
|
-
}
|
|
124
|
-
else if (MINIMUM_PARAMETER_PATTERN.test(param.expression)) {
|
|
125
|
-
if (minimumTime != null) {
|
|
126
|
-
throw new Error(`@loading block can only have one "minimum" parameter`);
|
|
127
|
-
}
|
|
128
|
-
const parsedTime = parseDeferredTime(param.expression.slice(getTriggerParametersStart(param.expression)));
|
|
129
|
-
if (parsedTime === null) {
|
|
130
|
-
throw new Error(`Could not parse time value of parameter "minimum"`);
|
|
131
|
-
}
|
|
132
|
-
minimumTime = parsedTime;
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
throw new Error(`Unrecognized parameter in @loading block: "${param.expression}"`);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return new t.DeferredBlockLoading(html.visitAll(visitor, ast.children, ast.children), afterTime, minimumTime, ast.nameSpan, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan, ast.i18n);
|
|
139
|
-
}
|
|
140
|
-
function parseErrorBlock(ast, visitor) {
|
|
141
|
-
if (ast.parameters.length > 0) {
|
|
142
|
-
throw new Error(`@error block cannot have parameters`);
|
|
143
|
-
}
|
|
144
|
-
return new t.DeferredBlockError(html.visitAll(visitor, ast.children, ast.children), ast.nameSpan, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan, ast.i18n);
|
|
145
|
-
}
|
|
146
|
-
function parsePrimaryTriggers(params, bindingParser, errors, placeholder) {
|
|
147
|
-
const triggers = {};
|
|
148
|
-
const prefetchTriggers = {};
|
|
149
|
-
for (const param of params) {
|
|
150
|
-
// The lexer ignores the leading spaces so we can assume
|
|
151
|
-
// that the expression starts with a keyword.
|
|
152
|
-
if (WHEN_PARAMETER_PATTERN.test(param.expression)) {
|
|
153
|
-
parseWhenTrigger(param, bindingParser, triggers, errors);
|
|
154
|
-
}
|
|
155
|
-
else if (ON_PARAMETER_PATTERN.test(param.expression)) {
|
|
156
|
-
parseOnTrigger(param, triggers, errors, placeholder);
|
|
157
|
-
}
|
|
158
|
-
else if (PREFETCH_WHEN_PATTERN.test(param.expression)) {
|
|
159
|
-
parseWhenTrigger(param, bindingParser, prefetchTriggers, errors);
|
|
160
|
-
}
|
|
161
|
-
else if (PREFETCH_ON_PATTERN.test(param.expression)) {
|
|
162
|
-
parseOnTrigger(param, prefetchTriggers, errors, placeholder);
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
errors.push(new ParseError(param.sourceSpan, 'Unrecognized trigger'));
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
return { triggers, prefetchTriggers };
|
|
169
|
-
}
|
|
170
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicjNfZGVmZXJyZWRfYmxvY2tzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3JlbmRlcjMvcjNfZGVmZXJyZWRfYmxvY2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFDLFVBQVUsRUFBRSxlQUFlLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHMUQsT0FBTyxLQUFLLENBQUMsTUFBTSxVQUFVLENBQUM7QUFDOUIsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGdCQUFnQixHQUNqQixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLHFEQUFxRDtBQUNyRCxNQUFNLHFCQUFxQixHQUFHLG9CQUFvQixDQUFDO0FBRW5ELG1EQUFtRDtBQUNuRCxNQUFNLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO0FBRS9DLDREQUE0RDtBQUM1RCxNQUFNLHlCQUF5QixHQUFHLFlBQVksQ0FBQztBQUUvQywwREFBMEQ7QUFDMUQsTUFBTSx1QkFBdUIsR0FBRyxVQUFVLENBQUM7QUFFM0MseURBQXlEO0FBQ3pELE1BQU0sc0JBQXNCLEdBQUcsU0FBUyxDQUFDO0FBRXpDLHVEQUF1RDtBQUN2RCxNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztBQUVyQzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsSUFBWTtJQUNwRCxPQUFPLElBQUksS0FBSyxhQUFhLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssT0FBTyxDQUFDO0FBQzFFLENBQUM7QUFFRCxzREFBc0Q7QUFDdEQsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxHQUFlLEVBQ2YsZUFBNkIsRUFDN0IsT0FBcUIsRUFDckIsYUFBNEI7SUFFNUIsTUFBTSxNQUFNLEdBQWlC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QU0sQ0FBQyxDQUFDO1FBQ25FLENBQUM7YUFBTSxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN0RCxjQUFjLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMvRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7UUFDeEUsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEVBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFDLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBodG1sIGZyb20gJy4uL21sX3BhcnNlci9hc3QnO1xuaW1wb3J0IHtQYXJzZUVycm9yLCBQYXJzZVNvdXJjZVNwYW59IGZyb20gJy4uL3BhcnNlX3V0aWwnO1xuaW1wb3J0IHtCaW5kaW5nUGFyc2VyfSBmcm9tICcuLi90ZW1wbGF0ZV9wYXJzZXIvYmluZGluZ19wYXJzZXInO1xuXG5pbXBvcnQgKiBhcyB0IGZyb20gJy4vcjNfYXN0JztcbmltcG9ydCB7XG4gIGdldFRyaWdnZXJQYXJhbWV0ZXJzU3RhcnQsXG4gIHBhcnNlRGVmZXJyZWRUaW1lLFxuICBwYXJzZU9uVHJpZ2dlcixcbiAgcGFyc2VXaGVuVHJpZ2dlcixcbn0gZnJvbSAnLi9yM19kZWZlcnJlZF90cmlnZ2Vycyc7XG5cbi8qKiBQYXR0ZXJuIHRvIGlkZW50aWZ5IGEgYHByZWZldGNoIHdoZW5gIHRyaWdnZXIuICovXG5jb25zdCBQUkVGRVRDSF9XSEVOX1BBVFRFUk4gPSAvXnByZWZldGNoXFxzK3doZW5cXHMvO1xuXG4vKiogUGF0dGVybiB0byBpZGVudGlmeSBhIGBwcmVmZXRjaCBvbmAgdHJpZ2dlci4gKi9cbmNvbnN0IFBSRUZFVENIX09OX1BBVFRFUk4gPSAvXnByZWZldGNoXFxzK29uXFxzLztcblxuLyoqIFBhdHRlcm4gdG8gaWRlbnRpZnkgYSBgbWluaW11bWAgcGFyYW1ldGVyIGluIGEgYmxvY2suICovXG5jb25zdCBNSU5JTVVNX1BBUkFNRVRFUl9QQVRURVJOID0gL15taW5pbXVtXFxzLztcblxuLyoqIFBhdHRlcm4gdG8gaWRlbnRpZnkgYSBgYWZ0ZXJgIHBhcmFtZXRlciBpbiBhIGJsb2NrLiAqL1xuY29uc3QgQUZURVJfUEFSQU1FVEVSX1BBVFRFUk4gPSAvXmFmdGVyXFxzLztcblxuLyoqIFBhdHRlcm4gdG8gaWRlbnRpZnkgYSBgd2hlbmAgcGFyYW1ldGVyIGluIGEgYmxvY2suICovXG5jb25zdCBXSEVOX1BBUkFNRVRFUl9QQVRURVJOID0gL153aGVuXFxzLztcblxuLyoqIFBhdHRlcm4gdG8gaWRlbnRpZnkgYSBgb25gIHBhcmFtZXRlciBpbiBhIGJsb2NrLiAqL1xuY29uc3QgT05fUEFSQU1FVEVSX1BBVFRFUk4gPSAvXm9uXFxzLztcblxuLyoqXG4gKiBQcmVkaWNhdGUgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGEgYmxvY2sgd2l0aFxuICogYSBzcGVjaWZpYyBuYW1lIGNhbSBiZSBjb25uZWN0ZWQgdG8gYSBgZGVmZXJgIGJsb2NrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb25uZWN0ZWREZWZlckxvb3BCbG9jayhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5hbWUgPT09ICdwbGFjZWhvbGRlcicgfHwgbmFtZSA9PT0gJ2xvYWRpbmcnIHx8IG5hbWUgPT09ICdlcnJvcic7XG59XG5cbi8qKiBDcmVhdGVzIGEgZGVmZXJyZWQgYmxvY2sgZnJvbSBhbiBIVE1MIEFTVCBub2RlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmVycmVkQmxvY2soXG4gIGFzdDogaHRtbC5CbG9jayxcbiAgY29ubmVjdGVkQmxvY2tzOiBodG1sLkJsb2NrW10sXG4gIHZpc2l0b3I6IGh0bWwuVmlzaXRvcixcbiAgYmluZGluZ1BhcnNlcjogQmluZGluZ1BhcnNlcixcbik6IHtub2RlOiB0LkRlZmVycmVkQmxvY2s7IGVycm9yczogUGFyc2VFcnJvcltdfSB7XG4gIGNvbnN0IGVycm9yczogUGFyc2VFcnJvcltdID0gW107XG4gIGNvbnN0IHtwbGFjZWhvbGRlciwgbG9hZGluZywgZXJyb3J9ID0gcGFyc2VDb25uZWN0ZWRCbG9ja3MoY29ubmVjdGVkQmxvY2tzLCBlcnJvcnMsIHZpc2l0b3IpO1xuICBjb25zdCB7dHJpZ2dlcnMsIHByZWZldGNoVHJpZ2dlcnN9ID0gcGFyc2VQcmltYXJ5VHJpZ2dlcnMoXG4gICAgYXN0LnBhcmFtZXRlcnMsXG4gICAgYmluZGluZ1BhcnNlcixcbiAgICBlcnJvcnMsXG4gICAgcGxhY2Vob2xkZXIsXG4gICk7XG5cbiAgLy8gVGhlIGBkZWZlcmAgYmxvY2sgaGFzIGEgbWFpbiBzcGFuIGVuY29tcGFzc2luZyBhbGwgb2YgdGhlIGNvbm5lY3RlZCBicmFuY2hlcyBhcyB3ZWxsLlxuICBsZXQgbGFzdEVuZFNvdXJjZVNwYW4gPSBhc3QuZW5kU291cmNlU3BhbjtcbiAgbGV0IGVuZE9mTGFzdFNvdXJjZVNwYW4gPSBhc3Quc291cmNlU3Bhbi5lbmQ7XG4gIGlmIChjb25uZWN0ZWRCbG9ja3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxhc3RDb25uZWN0ZWRCbG9jayA9IGNvbm5lY3RlZEJsb2Nrc1tjb25uZWN0ZWRCbG9ja3MubGVuZ3RoIC0gMV07XG4gICAgbGFzdEVuZFNvdXJjZVNwYW4gPSBsYXN0Q29ubmVjdGVkQmxvY2suZW5kU291cmNlU3BhbjtcbiAgICBlbmRPZkxhc3RTb3VyY2VTcGFuID0gbGFzdENvbm5lY3RlZEJsb2NrLnNvdXJjZVNwYW4uZW5kO1xuICB9XG5cbiAgY29uc3Qgc291cmNlU3BhbldpdGhDb25uZWN0ZWRCbG9ja3MgPSBuZXcgUGFyc2VTb3VyY2VTcGFuKFxuICAgIGFzdC5zb3VyY2VTcGFuLnN0YXJ0LFxuICAgIGVuZE9mTGFzdFNvdXJjZVNwYW4sXG4gICk7XG5cbiAgY29uc3Qgbm9kZSA9IG5ldyB0LkRlZmVycmVkQmxvY2soXG4gICAgaHRtbC52aXNpdEFsbCh2aXNpdG9yLCBhc3QuY2hpbGRyZW4sIGFzdC5jaGlsZHJlbiksXG4gICAgdHJpZ2dlcnMsXG4gICAgcHJlZmV0Y2hUcmlnZ2VycyxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBsb2FkaW5nLFxuICAgIGVycm9yLFxuICAgIGFzdC5uYW1lU3BhbixcbiAgICBzb3VyY2VTcGFuV2l0aENvbm5lY3RlZEJsb2NrcyxcbiAgICBhc3Quc291cmNlU3BhbixcbiAgICBhc3Quc3RhcnRTb3VyY2VTcGFuLFxuICAgIGxhc3RFbmRTb3VyY2VTcGFuLFxuICAgIGFzdC5pMThuLFxuICApO1xuXG4gIHJldHVybiB7bm9kZSwgZXJyb3JzfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VDb25uZWN0ZWRCbG9ja3MoXG4gIGNvbm5lY3RlZEJsb2NrczogaHRtbC5CbG9ja1tdLFxuICBlcnJvcnM6IFBhcnNlRXJyb3JbXSxcbiAgdmlzaXRvcjogaHRtbC5WaXNpdG9yLFxuKSB7XG4gIGxldCBwbGFjZWhvbGRlcjogdC5EZWZlcnJlZEJsb2NrUGxhY2Vob2xkZXIgfCBudWxsID0gbnVsbDtcbiAgbGV0IGxvYWRpbmc6IHQuRGVmZXJyZWRCbG9ja0xvYWRpbmcgfCBudWxsID0gbnVsbDtcbiAgbGV0IGVycm9yOiB0LkRlZmVycmVkQmxvY2tFcnJvciB8IG51bGwgPSBudWxsO1xuXG4gIGZvciAoY29uc3QgYmxvY2sgb2YgY29ubmVjdGVkQmxvY2tzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghaXNDb25uZWN0ZWREZWZlckxvb3BCbG9jayhibG9jay5uYW1lKSkge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgUGFyc2VFcnJvcihibG9jay5zdGFydFNvdXJjZVNwYW4sIGBVbnJlY29nbml6ZWQgYmxvY2sgXCJAJHtibG9jay5uYW1lfVwiYCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChibG9jay5uYW1lKSB7XG4gICAgICAgIGNhc2UgJ3BsYWNlaG9sZGVyJzpcbiAgICAgICAgICBpZiAocGxhY2Vob2xkZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgUGFyc2VFcnJvcihcbiAgICAgICAgICAgICAgICBibG9jay5zdGFydFNvdXJjZVNwYW4sXG4gICAgICAgICAgICAgICAgYEBkZWZlciBibG9jayBjYW4gb25seSBoYXZlIG9uZSBAcGxhY2Vob2xkZXIgYmxvY2tgLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGxhY2Vob2xkZXIgPSBwYXJzZVBsYWNlaG9sZGVyQmxvY2soYmxvY2ssIHZpc2l0b3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdsb2FkaW5nJzpcbiAgICAgICAgICBpZiAobG9hZGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgICAgIG5ldyBQYXJzZUVycm9yKFxuICAgICAgICAgICAgICAgIGJsb2NrLnN0YXJ0U291cmNlU3BhbixcbiAgICAgICAgICAgICAgICBgQGRlZmVyIGJsb2NrIGNhbiBvbmx5IGhhdmUgb25lIEBsb2FkaW5nIGJsb2NrYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvYWRpbmcgPSBwYXJzZUxvYWRpbmdCbG9jayhibG9jaywgdmlzaXRvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgUGFyc2VFcnJvcihibG9jay5zdGFydFNvdXJjZVNwYW4sIGBAZGVmZXIgYmxvY2sgY2FuIG9ubHkgaGF2ZSBvbmUgQGVycm9yIGJsb2NrYCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvciA9IHBhcnNlRXJyb3JCbG9jayhibG9jaywgdmlzaXRvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ycy5wdXNoKG5ldyBQYXJzZUVycm9yKGJsb2NrLnN0YXJ0U291cmNlU3BhbiwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge3BsYWNlaG9sZGVyLCBsb2FkaW5nLCBlcnJvcn07XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGxhY2Vob2xkZXJCbG9jayhhc3Q6IGh0bWwuQmxvY2ssIHZpc2l0b3I6IGh0bWwuVmlzaXRvcik6IHQuRGVmZXJyZWRCbG9ja1BsYWNlaG9sZGVyIHtcbiAgbGV0IG1pbmltdW1UaW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBmb3IgKGNvbnN0IHBhcmFtIG9mIGFzdC5wYXJhbWV0ZXJzKSB7XG4gICAgaWYgKE1JTklNVU1fUEFSQU1FVEVSX1BBVFRFUk4udGVzdChwYXJhbS5leHByZXNzaW9uKSkge1xuICAgICAgaWYgKG1pbmltdW1UaW1lICE9IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAcGxhY2Vob2xkZXIgYmxvY2sgY2FuIG9ubHkgaGF2ZSBvbmUgXCJtaW5pbXVtXCIgcGFyYW1ldGVyYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZFRpbWUgPSBwYXJzZURlZmVycmVkVGltZShcbiAgICAgICAgcGFyYW0uZXhwcmVzc2lvbi5zbGljZShnZXRUcmlnZ2VyUGFyYW1ldGVyc1N0YXJ0KHBhcmFtLmV4cHJlc3Npb24pKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChwYXJzZWRUaW1lID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIHRpbWUgdmFsdWUgb2YgcGFyYW1ldGVyIFwibWluaW11bVwiYCk7XG4gICAgICB9XG5cbiAgICAgIG1pbmltdW1UaW1lID0gcGFyc2VkVGltZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgcGFyYW1ldGVyIGluIEBwbGFjZWhvbGRlciBibG9jazogXCIke3BhcmFtLmV4cHJlc3Npb259XCJgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IHQuRGVmZXJyZWRCbG9ja1BsYWNlaG9sZGVyKFxuICAgIGh0bWwudmlzaXRBbGwodmlzaXRvciwgYXN0LmNoaWxkcmVuLCBhc3QuY2hpbGRyZW4pLFxuICAgIG1pbmltdW1UaW1lLFxuICAgIGFzdC5uYW1lU3BhbixcbiAgICBhc3Quc291cmNlU3BhbixcbiAgICBhc3Quc3RhcnRTb3VyY2VTcGFuLFxuICAgIGFzdC5lbmRTb3VyY2VTcGFuLFxuICAgIGFzdC5pMThuLFxuICApO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxvYWRpbmdCbG9jayhhc3Q6IGh0bWwuQmxvY2ssIHZpc2l0b3I6IGh0bWwuVmlzaXRvcik6IHQuRGVmZXJyZWRCbG9ja0xvYWRpbmcge1xuICBsZXQgYWZ0ZXJUaW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgbGV0IG1pbmltdW1UaW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBmb3IgKGNvbnN0IHBhcmFtIG9mIGFzdC5wYXJhbWV0ZXJzKSB7XG4gICAgaWYgKEFGVEVSX1BBUkFNRVRFUl9QQVRURVJOLnRlc3QocGFyYW0uZXhwcmVzc2lvbikpIHtcbiAgICAgIGlmIChhZnRlclRpbWUgIT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBsb2FkaW5nIGJsb2NrIGNhbiBvbmx5IGhhdmUgb25lIFwiYWZ0ZXJcIiBwYXJhbWV0ZXJgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyc2VkVGltZSA9IHBhcnNlRGVmZXJyZWRUaW1lKFxuICAgICAgICBwYXJhbS5leHByZXNzaW9uLnNsaWNlKGdldFRyaWdnZXJQYXJhbWV0ZXJzU3RhcnQocGFyYW0uZXhwcmVzc2lvbikpLFxuICAgICAgKTtcblxuICAgICAgaWYgKHBhcnNlZFRpbWUgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgdGltZSB2YWx1ZSBvZiBwYXJhbWV0ZXIgXCJhZnRlclwiYCk7XG4gICAgICB9XG5cbiAgICAgIGFmdGVyVGltZSA9IHBhcnNlZFRpbWU7XG4gICAgfSBlbHNlIGlmIChNSU5JTVVNX1BBUkFNRVRFUl9QQVRURVJOLnRlc3QocGFyYW0uZXhwcmVzc2lvbikpIHtcbiAgICAgIGlmIChtaW5pbXVtVGltZSAhPSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQGxvYWRpbmcgYmxvY2sgY2FuIG9ubHkgaGF2ZSBvbmUgXCJtaW5pbXVtXCIgcGFyYW1ldGVyYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZFRpbWUgPSBwYXJzZURlZmVycmVkVGltZShcbiAgICAgICAgcGFyYW0uZXhwcmVzc2lvbi5zbGljZShnZXRUcmlnZ2VyUGFyYW1ldGVyc1N0YXJ0KHBhcmFtLmV4cHJlc3Npb24pKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChwYXJzZWRUaW1lID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIHRpbWUgdmFsdWUgb2YgcGFyYW1ldGVyIFwibWluaW11bVwiYCk7XG4gICAgICB9XG5cbiAgICAgIG1pbmltdW1UaW1lID0gcGFyc2VkVGltZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgcGFyYW1ldGVyIGluIEBsb2FkaW5nIGJsb2NrOiBcIiR7cGFyYW0uZXhwcmVzc2lvbn1cImApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgdC5EZWZlcnJlZEJsb2NrTG9hZGluZyhcbiAgICBodG1sLnZpc2l0QWxsKHZpc2l0b3IsIGFzdC5jaGlsZHJlbiwgYXN0LmNoaWxkcmVuKSxcbiAgICBhZnRlclRpbWUsXG4gICAgbWluaW11bVRpbWUsXG4gICAgYXN0Lm5hbWVTcGFuLFxuICAgIGFzdC5zb3VyY2VTcGFuLFxuICAgIGFzdC5zdGFydFNvdXJjZVNwYW4sXG4gICAgYXN0LmVuZFNvdXJjZVNwYW4sXG4gICAgYXN0LmkxOG4sXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXJyb3JCbG9jayhhc3Q6IGh0bWwuQmxvY2ssIHZpc2l0b3I6IGh0bWwuVmlzaXRvcik6IHQuRGVmZXJyZWRCbG9ja0Vycm9yIHtcbiAgaWYgKGFzdC5wYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEBlcnJvciBibG9jayBjYW5ub3QgaGF2ZSBwYXJhbWV0ZXJzYCk7XG4gIH1cblxuICByZXR1cm4gbmV3IHQuRGVmZXJyZWRCbG9ja0Vycm9yKFxuICAgIGh0bWwudmlzaXRBbGwodmlzaXRvciwgYXN0LmNoaWxkcmVuLCBhc3QuY2hpbGRyZW4pLFxuICAgIGFzdC5uYW1lU3BhbixcbiAgICBhc3Quc291cmNlU3BhbixcbiAgICBhc3Quc3RhcnRTb3VyY2VTcGFuLFxuICAgIGFzdC5lbmRTb3VyY2VTcGFuLFxuICAgIGFzdC5pMThuLFxuICApO1xufVxuXG5mdW5jdGlvbiBwYXJzZVByaW1hcnlUcmlnZ2VycyhcbiAgcGFyYW1zOiBodG1sLkJsb2NrUGFyYW1ldGVyW10sXG4gIGJpbmRpbmdQYXJzZXI6IEJpbmRpbmdQYXJzZXIsXG4gIGVycm9yczogUGFyc2VFcnJvcltdLFxuICBwbGFjZWhvbGRlcjogdC5EZWZlcnJlZEJsb2NrUGxhY2Vob2xkZXIgfCBudWxsLFxuKSB7XG4gIGNvbnN0IHRyaWdnZXJzOiB0LkRlZmVycmVkQmxvY2tUcmlnZ2VycyA9IHt9O1xuICBjb25zdCBwcmVmZXRjaFRyaWdnZXJzOiB0LkRlZmVycmVkQmxvY2tUcmlnZ2VycyA9IHt9O1xuXG4gIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG4gICAgLy8gVGhlIGxleGVyIGlnbm9yZXMgdGhlIGxlYWRpbmcgc3BhY2VzIHNvIHdlIGNhbiBhc3N1bWVcbiAgICAvLyB0aGF0IHRoZSBleHByZXNzaW9uIHN0YXJ0cyB3aXRoIGEga2V5d29yZC5cbiAgICBpZiAoV0hFTl9QQVJBTUVURVJfUEFUVEVSTi50ZXN0KHBhcmFtLmV4cHJlc3Npb24pKSB7XG4gICAgICBwYXJzZVdoZW5UcmlnZ2VyKHBhcmFtLCBiaW5kaW5nUGFyc2VyLCB0cmlnZ2VycywgZXJyb3JzKTtcbiAgICB9IGVsc2UgaWYgKE9OX1BBUkFNRVRFUl9QQVRURVJOLnRlc3QocGFyYW0uZXhwcmVzc2lvbikpIHtcbiAgICAgIHBhcnNlT25UcmlnZ2VyKHBhcmFtLCB0cmlnZ2VycywgZXJyb3JzLCBwbGFjZWhvbGRlcik7XG4gICAgfSBlbHNlIGlmIChQUkVGRVRDSF9XSEVOX1BBVFRFUk4udGVzdChwYXJhbS5leHByZXNzaW9uKSkge1xuICAgICAgcGFyc2VXaGVuVHJpZ2dlcihwYXJhbSwgYmluZGluZ1BhcnNlciwgcHJlZmV0Y2hUcmlnZ2VycywgZXJyb3JzKTtcbiAgICB9IGVsc2UgaWYgKFBSRUZFVENIX09OX1BBVFRFUk4udGVzdChwYXJhbS5leHByZXNzaW9uKSkge1xuICAgICAgcGFyc2VPblRyaWdnZXIocGFyYW0sIHByZWZldGNoVHJpZ2dlcnMsIGVycm9ycywgcGxhY2Vob2xkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcnMucHVzaChuZXcgUGFyc2VFcnJvcihwYXJhbS5zb3VyY2VTcGFuLCAnVW5yZWNvZ25pemVkIHRyaWdnZXInKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHt0cmlnZ2VycywgcHJlZmV0Y2hUcmlnZ2Vyc307XG59XG4iXX0=
|
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
import * as chars from '../chars';
|
|
9
|
-
import { Lexer, TokenType } from '../expression_parser/lexer';
|
|
10
|
-
import { ParseError, ParseSourceSpan } from '../parse_util';
|
|
11
|
-
import * as t from './r3_ast';
|
|
12
|
-
/** Pattern for a timing value in a trigger. */
|
|
13
|
-
const TIME_PATTERN = /^\d+\.?\d*(ms|s)?$/;
|
|
14
|
-
/** Pattern for a separator between keywords in a trigger expression. */
|
|
15
|
-
const SEPARATOR_PATTERN = /^\s$/;
|
|
16
|
-
/** Pairs of characters that form syntax that is comma-delimited. */
|
|
17
|
-
const COMMA_DELIMITED_SYNTAX = new Map([
|
|
18
|
-
[chars.$LBRACE, chars.$RBRACE], // Object literals
|
|
19
|
-
[chars.$LBRACKET, chars.$RBRACKET], // Array literals
|
|
20
|
-
[chars.$LPAREN, chars.$RPAREN], // Function calls
|
|
21
|
-
]);
|
|
22
|
-
/** Possible types of `on` triggers. */
|
|
23
|
-
var OnTriggerType;
|
|
24
|
-
(function (OnTriggerType) {
|
|
25
|
-
OnTriggerType["IDLE"] = "idle";
|
|
26
|
-
OnTriggerType["TIMER"] = "timer";
|
|
27
|
-
OnTriggerType["INTERACTION"] = "interaction";
|
|
28
|
-
OnTriggerType["IMMEDIATE"] = "immediate";
|
|
29
|
-
OnTriggerType["HOVER"] = "hover";
|
|
30
|
-
OnTriggerType["VIEWPORT"] = "viewport";
|
|
31
|
-
})(OnTriggerType || (OnTriggerType = {}));
|
|
32
|
-
/** Parses a `when` deferred trigger. */
|
|
33
|
-
export function parseWhenTrigger({ expression, sourceSpan }, bindingParser, triggers, errors) {
|
|
34
|
-
const whenIndex = expression.indexOf('when');
|
|
35
|
-
const whenSourceSpan = new ParseSourceSpan(sourceSpan.start.moveBy(whenIndex), sourceSpan.start.moveBy(whenIndex + 'when'.length));
|
|
36
|
-
const prefetchSpan = getPrefetchSpan(expression, sourceSpan);
|
|
37
|
-
// This is here just to be safe, we shouldn't enter this function
|
|
38
|
-
// in the first place if a block doesn't have the "when" keyword.
|
|
39
|
-
if (whenIndex === -1) {
|
|
40
|
-
errors.push(new ParseError(sourceSpan, `Could not find "when" keyword in expression`));
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
const start = getTriggerParametersStart(expression, whenIndex + 1);
|
|
44
|
-
const parsed = bindingParser.parseBinding(expression.slice(start), false, sourceSpan, sourceSpan.start.offset + start);
|
|
45
|
-
trackTrigger('when', triggers, errors, new t.BoundDeferredTrigger(parsed, sourceSpan, prefetchSpan, whenSourceSpan));
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/** Parses an `on` trigger */
|
|
49
|
-
export function parseOnTrigger({ expression, sourceSpan }, triggers, errors, placeholder) {
|
|
50
|
-
const onIndex = expression.indexOf('on');
|
|
51
|
-
const onSourceSpan = new ParseSourceSpan(sourceSpan.start.moveBy(onIndex), sourceSpan.start.moveBy(onIndex + 'on'.length));
|
|
52
|
-
const prefetchSpan = getPrefetchSpan(expression, sourceSpan);
|
|
53
|
-
// This is here just to be safe, we shouldn't enter this function
|
|
54
|
-
// in the first place if a block doesn't have the "on" keyword.
|
|
55
|
-
if (onIndex === -1) {
|
|
56
|
-
errors.push(new ParseError(sourceSpan, `Could not find "on" keyword in expression`));
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
const start = getTriggerParametersStart(expression, onIndex + 1);
|
|
60
|
-
const parser = new OnTriggerParser(expression, start, sourceSpan, triggers, errors, placeholder, prefetchSpan, onSourceSpan);
|
|
61
|
-
parser.parse();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
function getPrefetchSpan(expression, sourceSpan) {
|
|
65
|
-
if (!expression.startsWith('prefetch')) {
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
return new ParseSourceSpan(sourceSpan.start, sourceSpan.start.moveBy('prefetch'.length));
|
|
69
|
-
}
|
|
70
|
-
class OnTriggerParser {
|
|
71
|
-
constructor(expression, start, span, triggers, errors, placeholder, prefetchSpan, onSourceSpan) {
|
|
72
|
-
this.expression = expression;
|
|
73
|
-
this.start = start;
|
|
74
|
-
this.span = span;
|
|
75
|
-
this.triggers = triggers;
|
|
76
|
-
this.errors = errors;
|
|
77
|
-
this.placeholder = placeholder;
|
|
78
|
-
this.prefetchSpan = prefetchSpan;
|
|
79
|
-
this.onSourceSpan = onSourceSpan;
|
|
80
|
-
this.index = 0;
|
|
81
|
-
this.tokens = new Lexer().tokenize(expression.slice(start));
|
|
82
|
-
}
|
|
83
|
-
parse() {
|
|
84
|
-
while (this.tokens.length > 0 && this.index < this.tokens.length) {
|
|
85
|
-
const token = this.token();
|
|
86
|
-
if (!token.isIdentifier()) {
|
|
87
|
-
this.unexpectedToken(token);
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
// An identifier immediately followed by a comma or the end of
|
|
91
|
-
// the expression cannot have parameters so we can exit early.
|
|
92
|
-
if (this.isFollowedByOrLast(chars.$COMMA)) {
|
|
93
|
-
this.consumeTrigger(token, []);
|
|
94
|
-
this.advance();
|
|
95
|
-
}
|
|
96
|
-
else if (this.isFollowedByOrLast(chars.$LPAREN)) {
|
|
97
|
-
this.advance(); // Advance to the opening paren.
|
|
98
|
-
const prevErrors = this.errors.length;
|
|
99
|
-
const parameters = this.consumeParameters();
|
|
100
|
-
if (this.errors.length !== prevErrors) {
|
|
101
|
-
break;
|
|
102
|
-
}
|
|
103
|
-
this.consumeTrigger(token, parameters);
|
|
104
|
-
this.advance(); // Advance past the closing paren.
|
|
105
|
-
}
|
|
106
|
-
else if (this.index < this.tokens.length - 1) {
|
|
107
|
-
this.unexpectedToken(this.tokens[this.index + 1]);
|
|
108
|
-
}
|
|
109
|
-
this.advance();
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
advance() {
|
|
113
|
-
this.index++;
|
|
114
|
-
}
|
|
115
|
-
isFollowedByOrLast(char) {
|
|
116
|
-
if (this.index === this.tokens.length - 1) {
|
|
117
|
-
return true;
|
|
118
|
-
}
|
|
119
|
-
return this.tokens[this.index + 1].isCharacter(char);
|
|
120
|
-
}
|
|
121
|
-
token() {
|
|
122
|
-
return this.tokens[Math.min(this.index, this.tokens.length - 1)];
|
|
123
|
-
}
|
|
124
|
-
consumeTrigger(identifier, parameters) {
|
|
125
|
-
const triggerNameStartSpan = this.span.start.moveBy(this.start + identifier.index - this.tokens[0].index);
|
|
126
|
-
const nameSpan = new ParseSourceSpan(triggerNameStartSpan, triggerNameStartSpan.moveBy(identifier.strValue.length));
|
|
127
|
-
const endSpan = triggerNameStartSpan.moveBy(this.token().end - identifier.index);
|
|
128
|
-
// Put the prefetch and on spans with the first trigger
|
|
129
|
-
// This should maybe be refactored to have something like an outer OnGroup AST
|
|
130
|
-
// Since triggers can be grouped with commas "on hover(x), interaction(y)"
|
|
131
|
-
const isFirstTrigger = identifier.index === 0;
|
|
132
|
-
const onSourceSpan = isFirstTrigger ? this.onSourceSpan : null;
|
|
133
|
-
const prefetchSourceSpan = isFirstTrigger ? this.prefetchSpan : null;
|
|
134
|
-
const sourceSpan = new ParseSourceSpan(isFirstTrigger ? this.span.start : triggerNameStartSpan, endSpan);
|
|
135
|
-
try {
|
|
136
|
-
switch (identifier.toString()) {
|
|
137
|
-
case OnTriggerType.IDLE:
|
|
138
|
-
this.trackTrigger('idle', createIdleTrigger(parameters, nameSpan, sourceSpan, prefetchSourceSpan, onSourceSpan));
|
|
139
|
-
break;
|
|
140
|
-
case OnTriggerType.TIMER:
|
|
141
|
-
this.trackTrigger('timer', createTimerTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan));
|
|
142
|
-
break;
|
|
143
|
-
case OnTriggerType.INTERACTION:
|
|
144
|
-
this.trackTrigger('interaction', createInteractionTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.placeholder));
|
|
145
|
-
break;
|
|
146
|
-
case OnTriggerType.IMMEDIATE:
|
|
147
|
-
this.trackTrigger('immediate', createImmediateTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan));
|
|
148
|
-
break;
|
|
149
|
-
case OnTriggerType.HOVER:
|
|
150
|
-
this.trackTrigger('hover', createHoverTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.placeholder));
|
|
151
|
-
break;
|
|
152
|
-
case OnTriggerType.VIEWPORT:
|
|
153
|
-
this.trackTrigger('viewport', createViewportTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.placeholder));
|
|
154
|
-
break;
|
|
155
|
-
default:
|
|
156
|
-
throw new Error(`Unrecognized trigger type "${identifier}"`);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
catch (e) {
|
|
160
|
-
this.error(identifier, e.message);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
consumeParameters() {
|
|
164
|
-
const parameters = [];
|
|
165
|
-
if (!this.token().isCharacter(chars.$LPAREN)) {
|
|
166
|
-
this.unexpectedToken(this.token());
|
|
167
|
-
return parameters;
|
|
168
|
-
}
|
|
169
|
-
this.advance();
|
|
170
|
-
const commaDelimStack = [];
|
|
171
|
-
let current = '';
|
|
172
|
-
while (this.index < this.tokens.length) {
|
|
173
|
-
const token = this.token();
|
|
174
|
-
// Stop parsing if we've hit the end character and we're outside of a comma-delimited syntax.
|
|
175
|
-
// Note that we don't need to account for strings here since the lexer already parsed them
|
|
176
|
-
// into string tokens.
|
|
177
|
-
if (token.isCharacter(chars.$RPAREN) && commaDelimStack.length === 0) {
|
|
178
|
-
if (current.length) {
|
|
179
|
-
parameters.push(current);
|
|
180
|
-
}
|
|
181
|
-
break;
|
|
182
|
-
}
|
|
183
|
-
// In the `on` microsyntax "top-level" commas (e.g. ones outside of an parameters) separate
|
|
184
|
-
// the different triggers (e.g. `on idle,timer(500)`). This is problematic, because the
|
|
185
|
-
// function-like syntax also implies that multiple parameters can be passed into the
|
|
186
|
-
// individual trigger (e.g. `on foo(a, b)`). To avoid tripping up the parser with commas that
|
|
187
|
-
// are part of other sorts of syntax (object literals, arrays), we treat anything inside
|
|
188
|
-
// a comma-delimited syntax block as plain text.
|
|
189
|
-
if (token.type === TokenType.Character && COMMA_DELIMITED_SYNTAX.has(token.numValue)) {
|
|
190
|
-
commaDelimStack.push(COMMA_DELIMITED_SYNTAX.get(token.numValue));
|
|
191
|
-
}
|
|
192
|
-
if (commaDelimStack.length > 0 &&
|
|
193
|
-
token.isCharacter(commaDelimStack[commaDelimStack.length - 1])) {
|
|
194
|
-
commaDelimStack.pop();
|
|
195
|
-
}
|
|
196
|
-
// If we hit a comma outside of a comma-delimited syntax, it means
|
|
197
|
-
// that we're at the top level and we're starting a new parameter.
|
|
198
|
-
if (commaDelimStack.length === 0 && token.isCharacter(chars.$COMMA) && current.length > 0) {
|
|
199
|
-
parameters.push(current);
|
|
200
|
-
current = '';
|
|
201
|
-
this.advance();
|
|
202
|
-
continue;
|
|
203
|
-
}
|
|
204
|
-
// Otherwise treat the token as a plain text character in the current parameter.
|
|
205
|
-
current += this.tokenText();
|
|
206
|
-
this.advance();
|
|
207
|
-
}
|
|
208
|
-
if (!this.token().isCharacter(chars.$RPAREN) || commaDelimStack.length > 0) {
|
|
209
|
-
this.error(this.token(), 'Unexpected end of expression');
|
|
210
|
-
}
|
|
211
|
-
if (this.index < this.tokens.length - 1 &&
|
|
212
|
-
!this.tokens[this.index + 1].isCharacter(chars.$COMMA)) {
|
|
213
|
-
this.unexpectedToken(this.tokens[this.index + 1]);
|
|
214
|
-
}
|
|
215
|
-
return parameters;
|
|
216
|
-
}
|
|
217
|
-
tokenText() {
|
|
218
|
-
// Tokens have a toString already which we could use, but for string tokens it omits the quotes.
|
|
219
|
-
// Eventually we could expose this information on the token directly.
|
|
220
|
-
return this.expression.slice(this.start + this.token().index, this.start + this.token().end);
|
|
221
|
-
}
|
|
222
|
-
trackTrigger(name, trigger) {
|
|
223
|
-
trackTrigger(name, this.triggers, this.errors, trigger);
|
|
224
|
-
}
|
|
225
|
-
error(token, message) {
|
|
226
|
-
const newStart = this.span.start.moveBy(this.start + token.index);
|
|
227
|
-
const newEnd = newStart.moveBy(token.end - token.index);
|
|
228
|
-
this.errors.push(new ParseError(new ParseSourceSpan(newStart, newEnd), message));
|
|
229
|
-
}
|
|
230
|
-
unexpectedToken(token) {
|
|
231
|
-
this.error(token, `Unexpected token "${token}"`);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
/** Adds a trigger to a map of triggers. */
|
|
235
|
-
function trackTrigger(name, allTriggers, errors, trigger) {
|
|
236
|
-
if (allTriggers[name]) {
|
|
237
|
-
errors.push(new ParseError(trigger.sourceSpan, `Duplicate "${name}" trigger is not allowed`));
|
|
238
|
-
}
|
|
239
|
-
else {
|
|
240
|
-
allTriggers[name] = trigger;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
function createIdleTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
|
|
244
|
-
if (parameters.length > 0) {
|
|
245
|
-
throw new Error(`"${OnTriggerType.IDLE}" trigger cannot have parameters`);
|
|
246
|
-
}
|
|
247
|
-
return new t.IdleDeferredTrigger(nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
|
|
248
|
-
}
|
|
249
|
-
function createTimerTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
|
|
250
|
-
if (parameters.length !== 1) {
|
|
251
|
-
throw new Error(`"${OnTriggerType.TIMER}" trigger must have exactly one parameter`);
|
|
252
|
-
}
|
|
253
|
-
const delay = parseDeferredTime(parameters[0]);
|
|
254
|
-
if (delay === null) {
|
|
255
|
-
throw new Error(`Could not parse time value of trigger "${OnTriggerType.TIMER}"`);
|
|
256
|
-
}
|
|
257
|
-
return new t.TimerDeferredTrigger(delay, nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
|
|
258
|
-
}
|
|
259
|
-
function createImmediateTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
|
|
260
|
-
if (parameters.length > 0) {
|
|
261
|
-
throw new Error(`"${OnTriggerType.IMMEDIATE}" trigger cannot have parameters`);
|
|
262
|
-
}
|
|
263
|
-
return new t.ImmediateDeferredTrigger(nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
|
|
264
|
-
}
|
|
265
|
-
function createHoverTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, placeholder) {
|
|
266
|
-
validateReferenceBasedTrigger(OnTriggerType.HOVER, parameters, placeholder);
|
|
267
|
-
return new t.HoverDeferredTrigger(parameters[0] ?? null, nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
|
|
268
|
-
}
|
|
269
|
-
function createInteractionTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, placeholder) {
|
|
270
|
-
validateReferenceBasedTrigger(OnTriggerType.INTERACTION, parameters, placeholder);
|
|
271
|
-
return new t.InteractionDeferredTrigger(parameters[0] ?? null, nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
|
|
272
|
-
}
|
|
273
|
-
function createViewportTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, placeholder) {
|
|
274
|
-
validateReferenceBasedTrigger(OnTriggerType.VIEWPORT, parameters, placeholder);
|
|
275
|
-
return new t.ViewportDeferredTrigger(parameters[0] ?? null, nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
|
|
276
|
-
}
|
|
277
|
-
function validateReferenceBasedTrigger(type, parameters, placeholder) {
|
|
278
|
-
if (parameters.length > 1) {
|
|
279
|
-
throw new Error(`"${type}" trigger can only have zero or one parameters`);
|
|
280
|
-
}
|
|
281
|
-
if (parameters.length === 0) {
|
|
282
|
-
if (placeholder === null) {
|
|
283
|
-
throw new Error(`"${type}" trigger with no parameters can only be placed on an @defer that has a @placeholder block`);
|
|
284
|
-
}
|
|
285
|
-
if (placeholder.children.length !== 1 || !(placeholder.children[0] instanceof t.Element)) {
|
|
286
|
-
throw new Error(`"${type}" trigger with no parameters can only be placed on an @defer that has a ` +
|
|
287
|
-
`@placeholder block with exactly one root element node`);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
/** Gets the index within an expression at which the trigger parameters start. */
|
|
292
|
-
export function getTriggerParametersStart(value, startPosition = 0) {
|
|
293
|
-
let hasFoundSeparator = false;
|
|
294
|
-
for (let i = startPosition; i < value.length; i++) {
|
|
295
|
-
if (SEPARATOR_PATTERN.test(value[i])) {
|
|
296
|
-
hasFoundSeparator = true;
|
|
297
|
-
}
|
|
298
|
-
else if (hasFoundSeparator) {
|
|
299
|
-
return i;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
return -1;
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Parses a time expression from a deferred trigger to
|
|
306
|
-
* milliseconds. Returns null if it cannot be parsed.
|
|
307
|
-
*/
|
|
308
|
-
export function parseDeferredTime(value) {
|
|
309
|
-
const match = value.match(TIME_PATTERN);
|
|
310
|
-
if (!match) {
|
|
311
|
-
return null;
|
|
312
|
-
}
|
|
313
|
-
const [time, units] = match;
|
|
314
|
-
return parseFloat(time) * (units === 's' ? 1000 : 1);
|
|
315
|
-
}
|
|
316
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicjNfZGVmZXJyZWRfdHJpZ2dlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvcmVuZGVyMy9yM19kZWZlcnJlZF90cmlnZ2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssS0FBSyxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUMsS0FBSyxFQUFTLFNBQVMsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRW5FLE9BQU8sRUFBQyxVQUFVLEVBQUUsZUFBZSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRzFELE9BQU8sS0FBSyxDQUFDLE1BQU0sVUFBVSxDQUFDO0FBRTlCLCtDQUErQztBQUMvQyxNQUFNLFlBQVksR0FBRyxvQkFBb0IsQ0FBQztBQUUxQyx3RUFBd0U7QUFDeEUsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFFakMsb0VBQW9FO0FBQ3BFLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDckMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxrQkFBa0I7SUFDbEQsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxpQkFBaUI7SUFDckQsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxpQkFBaUI7Q0FDbEQsQ0FBQyxDQUFDO0FBRUgsdUNBQXVDO0FBQ3ZDLElBQUssYUFPSjtBQVBELFdBQUssYUFBYTtJQUNoQiw4QkFBYSxDQUFBO0lBQ2IsZ0NBQWUsQ0FBQTtJQUNmLDRDQUEyQixDQUFBO0lBQzNCLHdDQUF1QixDQUFBO0lBQ3ZCLGdDQUFlLENBQUE7SUFDZixzQ0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBUEksYUFBYSxLQUFiLGFBQWEsUUFPakI7QUFFRCx3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Q0FBQztJQUVELE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDWixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWE7SUFDN0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUV4QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUM1QixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBjaGFycyBmcm9tICcuLi9jaGFycyc7XG5pbXBvcnQge0xleGVyLCBUb2tlbiwgVG9rZW5UeXBlfSBmcm9tICcuLi9leHByZXNzaW9uX3BhcnNlci9sZXhlcic7XG5pbXBvcnQgKiBhcyBodG1sIGZyb20gJy4uL21sX3BhcnNlci9hc3QnO1xuaW1wb3J0IHtQYXJzZUVycm9yLCBQYXJzZVNvdXJjZVNwYW59IGZyb20gJy4uL3BhcnNlX3V0aWwnO1xuaW1wb3J0IHtCaW5kaW5nUGFyc2VyfSBmcm9tICcuLi90ZW1wbGF0ZV9wYXJzZXIvYmluZGluZ19wYXJzZXInO1xuXG5pbXBvcnQgKiBhcyB0IGZyb20gJy4vcjNfYXN0JztcblxuLyoqIFBhdHRlcm4gZm9yIGEgdGltaW5nIHZhbHVlIGluIGEgdHJpZ2dlci4gKi9cbmNvbnN0IFRJTUVfUEFUVEVSTiA9IC9eXFxkK1xcLj9cXGQqKG1zfHMpPyQvO1xuXG4vKiogUGF0dGVybiBmb3IgYSBzZXBhcmF0b3IgYmV0d2VlbiBrZXl3b3JkcyBpbiBhIHRyaWdnZXIgZXhwcmVzc2lvbi4gKi9cbmNvbnN0IFNFUEFSQVRPUl9QQVRURVJOID0gL15cXHMkLztcblxuLyoqIFBhaXJzIG9mIGNoYXJhY3RlcnMgdGhhdCBmb3JtIHN5bnRheCB0aGF0IGlzIGNvbW1hLWRlbGltaXRlZC4gKi9cbmNvbnN0IENPTU1BX0RFTElNSVRFRF9TWU5UQVggPSBuZXcgTWFwKFtcbiAgW2NoYXJzLiRMQlJBQ0UsIGNoYXJzLiRSQlJBQ0VdLCAvLyBPYmplY3QgbGl0ZXJhbHNcbiAgW2NoYXJzLiRMQlJBQ0tFVCwgY2hhcnMuJFJCUkFDS0VUXSwgLy8gQXJyYXkgbGl0ZXJhbHNcbiAgW2NoYXJzLiRMUEFSRU4sIGNoYXJzLiRSUEFSRU5dLCAvLyBGdW5jdGlvbiBjYWxsc1xuXSk7XG5cbi8qKiBQb3NzaWJsZSB0eXBlcyBvZiBgb25gIHRyaWdnZXJzLiAqL1xuZW51bSBPblRyaWdnZXJUeXBlIHtcbiAgSURMRSA9ICdpZGxlJyxcbiAgVElNRVIgPSAndGltZXInLFxuICBJTlRFUkFDVElPTiA9ICdpbnRlcmFjdGlvbicsXG4gIElNTUVESUFURSA9ICdpbW1lZGlhdGUnLFxuICBIT1ZFUiA9ICdob3ZlcicsXG4gIFZJRVdQT1JUID0gJ3ZpZXdwb3J0Jyxcbn1cblxuLyoqIFBhcnNlcyBhIGB3aGVuYCBkZWZlcnJlZCB0cmlnZ2VyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlV2hlblRyaWdnZXIoXG4gIHtleHByZXNzaW9uLCBzb3VyY2VTcGFufTogaHRtbC5CbG9ja1BhcmFtZXRlcixcbiAgYmluZGluZ1BhcnNlcjogQmluZGluZ1BhcnNlcixcbiAgdHJpZ2dlcnM6IHQuRGVmZXJyZWRCbG9ja1RyaWdnZXJzLFxuICBlcnJvcnM6IFBhcnNlRXJyb3JbXSxcbik6IHZvaWQge1xuICBjb25zdCB3aGVuSW5kZXggPSBleHByZXNzaW9uLmluZGV4T2YoJ3doZW4nKTtcbiAgY29uc3Qgd2hlblNvdXJjZVNwYW4gPSBuZXcgUGFyc2VTb3VyY2VTcGFuKFxuICAgIHNvdXJjZVNwYW4uc3RhcnQubW92ZUJ5KHdoZW5JbmRleCksXG4gICAgc291cmNlU3Bhbi5zdGFydC5tb3ZlQnkod2hlbkluZGV4ICsgJ3doZW4nLmxlbmd0aCksXG4gICk7XG4gIGNvbnN0IHByZWZldGNoU3BhbiA9IGdldFByZWZldGNoU3BhbihleHByZXNzaW9uLCBzb3VyY2VTcGFuKTtcblxuICAvLyBUaGlzIGlzIGhlcmUganVzdCB0byBiZSBzYWZlLCB3ZSBzaG91bGRuJ3QgZW50ZXIgdGhpcyBmdW5jdGlvblxuICAvLyBpbiB0aGUgZmlyc3QgcGxhY2UgaWYgYSBibG9jayBkb2Vzbid0IGhhdmUgdGhlIFwid2hlblwiIGtleXdvcmQuXG4gIGlmICh3aGVuSW5kZXggPT09IC0xKSB7XG4gICAgZXJyb3JzLnB1c2gobmV3IFBhcnNlRXJyb3Ioc291cmNlU3BhbiwgYENvdWxkIG5vdCBmaW5kIFwid2hlblwiIGtleXdvcmQgaW4gZXhwcmVzc2lvbmApKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzdGFydCA9IGdldFRyaWdnZXJQYXJhbWV0ZXJzU3RhcnQoZXhwcmVzc2lvbiwgd2hlbkluZGV4ICsgMSk7XG4gICAgY29uc3QgcGFyc2VkID0gYmluZGluZ1BhcnNlci5wYXJzZUJpbmRpbmcoXG4gICAgICBleHByZXNzaW9uLnNsaWNlKHN0YXJ0KSxcbiAgICAgIGZhbHNlLFxuICAgICAgc291cmNlU3BhbixcbiAgICAgIHNvdXJjZVNwYW4uc3RhcnQub2Zmc2V0ICsgc3RhcnQsXG4gICAgKTtcbiAgICB0cmFja1RyaWdnZXIoXG4gICAgICAnd2hlbicsXG4gICAgICB0cmlnZ2VycyxcbiAgICAgIGVycm9ycyxcbiAgICAgIG5ldyB0LkJvdW5kRGVmZXJyZWRUcmlnZ2VyKHBhcnNlZCwgc291cmNlU3BhbiwgcHJlZmV0Y2hTcGFuLCB3aGVuU291cmNlU3BhbiksXG4gICAgKTtcbiAgfVxufVxuXG4vKiogUGFyc2VzIGFuIGBvbmAgdHJpZ2dlciAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT25UcmlnZ2VyKFxuICB7ZXhwcmVzc2lvbiwgc291cmNlU3Bhbn06IGh0bWwuQmxvY2tQYXJhbWV0ZXIsXG4gIHRyaWdnZXJzOiB0LkRlZmVycmVkQmxvY2tUcmlnZ2VycyxcbiAgZXJyb3JzOiBQYXJzZUVycm9yW10sXG4gIHBsYWNlaG9sZGVyOiB0LkRlZmVycmVkQmxvY2tQbGFjZWhvbGRlciB8IG51bGwsXG4pOiB2b2lkIHtcbiAgY29uc3Qgb25JbmRleCA9IGV4cHJlc3Npb24uaW5kZXhPZignb24nKTtcbiAgY29uc3Qgb25Tb3VyY2VTcGFuID0gbmV3IFBhcnNlU291cmNlU3BhbihcbiAgICBzb3VyY2VTcGFuLnN0YXJ0Lm1vdmVCeShvbkluZGV4KSxcbiAgICBzb3VyY2VTcGFuLnN0YXJ0Lm1vdmVCeShvbkluZGV4ICsgJ29uJy5sZW5ndGgpLFxuICApO1xuICBjb25zdCBwcmVmZXRjaFNwYW4gPSBnZXRQcmVmZXRjaFNwYW4oZXhwcmVzc2lvbiwgc291cmNlU3Bhbik7XG5cbiAgLy8gVGhpcyBpcyBoZXJlIGp1c3QgdG8gYmUgc2FmZSwgd2Ugc2hvdWxkbid0IGVudGVyIHRoaXMgZnVuY3Rpb25cbiAgLy8gaW4gdGhlIGZpcnN0IHBsYWNlIGlmIGEgYmxvY2sgZG9lc24ndCBoYXZlIHRoZSBcIm9uXCIga2V5d29yZC5cbiAgaWYgKG9uSW5kZXggPT09IC0xKSB7XG4gICAgZXJyb3JzLnB1c2gobmV3IFBhcnNlRXJyb3Ioc291cmNlU3BhbiwgYENvdWxkIG5vdCBmaW5kIFwib25cIiBrZXl3b3JkIGluIGV4cHJlc3Npb25gKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc3RhcnQgPSBnZXRUcmlnZ2VyUGFyYW1ldGVyc1N0YXJ0KGV4cHJlc3Npb24sIG9uSW5kZXggKyAxKTtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgT25UcmlnZ2VyUGFyc2VyKFxuICAgICAgZXhwcmVzc2lvbixcbiAgICAgIHN0YXJ0LFxuICAgICAgc291cmNlU3BhbixcbiAgICAgIHRyaWdnZXJzLFxuICAgICAgZXJyb3JzLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICBwcmVmZXRjaFNwYW4sXG4gICAgICBvblNvdXJjZVNwYW4sXG4gICAgKTtcbiAgICBwYXJzZXIucGFyc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQcmVmZXRjaFNwYW4oZXhwcmVzc2lvbjogc3RyaW5nLCBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pIHtcbiAgaWYgKCFleHByZXNzaW9uLnN0YXJ0c1dpdGgoJ3ByZWZldGNoJykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gbmV3IFBhcnNlU291cmNlU3Bhbihzb3VyY2VTcGFuLnN0YXJ0LCBzb3VyY2VTcGFuLnN0YXJ0Lm1vdmVCeSgncHJlZmV0Y2gnLmxlbmd0aCkpO1xufVxuXG5jbGFzcyBPblRyaWdnZXJQYXJzZXIge1xuICBwcml2YXRlIGluZGV4ID0gMDtcbiAgcHJpdmF0ZSB0b2tlbnM6IFRva2VuW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBleHByZXNzaW9uOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBzdGFydDogbnVtYmVyLFxuICAgIHByaXZhdGUgc3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHByaXZhdGUgdHJpZ2dlcnM6IHQuRGVmZXJyZWRCbG9ja1RyaWdnZXJzLFxuICAgIHByaXZhdGUgZXJyb3JzOiBQYXJzZUVycm9yW10sXG4gICAgcHJpdmF0ZSBwbGFjZWhvbGRlcjogdC5EZWZlcnJlZEJsb2NrUGxhY2Vob2xkZXIgfCBudWxsLFxuICAgIHByaXZhdGUgcHJlZmV0Y2hTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICAgIHByaXZhdGUgb25Tb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICkge1xuICAgIHRoaXMudG9rZW5zID0gbmV3IExleGVyKCkudG9rZW5pemUoZXhwcmVzc2lvbi5zbGljZShzdGFydCkpO1xuICB9XG5cbiAgcGFyc2UoKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMudG9rZW5zLmxlbmd0aCA+IDAgJiYgdGhpcy5pbmRleCA8IHRoaXMudG9rZW5zLmxlbmd0aCkge1xuICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLnRva2VuKCk7XG5cbiAgICAgIGlmICghdG9rZW4uaXNJZGVudGlmaWVyKCkpIHtcbiAgICAgICAgdGhpcy51bmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gQW4gaWRlbnRpZmllciBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGNvbW1hIG9yIHRoZSBlbmQgb2ZcbiAgICAgIC8vIHRoZSBleHByZXNzaW9uIGNhbm5vdCBoYXZlIHBhcmFtZXRlcnMgc28gd2UgY2FuIGV4aXQgZWFybHkuXG4gICAgICBpZiAodGhpcy5pc0ZvbGxvd2VkQnlPckxhc3QoY2hhcnMuJENPTU1BKSkge1xuICAgICAgICB0aGlzLmNvbnN1bWVUcmlnZ2VyKHRva2VuLCBbXSk7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRm9sbG93ZWRCeU9yTGFzdChjaGFycy4kTFBBUkVOKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTsgLy8gQWR2YW5jZSB0byB0aGUgb3BlbmluZyBwYXJlbi5cbiAgICAgICAgY29uc3QgcHJldkVycm9ycyA9IHRoaXMuZXJyb3JzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuY29uc3VtZVBhcmFtZXRlcnMoKTtcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JzLmxlbmd0aCAhPT0gcHJldkVycm9ycykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uc3VtZVRyaWdnZXIodG9rZW4sIHBhcmFtZXRlcnMpO1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTsgLy8gQWR2YW5jZSBwYXN0IHRoZSBjbG9zaW5nIHBhcmVuLlxuICAgICAgfSBlbHNlIGlmICh0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICB0aGlzLnVuZXhwZWN0ZWRUb2tlbih0aGlzLnRva2Vuc1t0aGlzLmluZGV4ICsgMV0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkdmFuY2UoKSB7XG4gICAgdGhpcy5pbmRleCsrO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ZvbGxvd2VkQnlPckxhc3QoY2hhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaW5kZXggPT09IHRoaXMudG9rZW5zLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRva2Vuc1t0aGlzLmluZGV4ICsgMV0uaXNDaGFyYWN0ZXIoY2hhcik7XG4gIH1cblxuICBwcml2YXRlIHRva2VuKCk6IFRva2VuIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbnNbTWF0aC5taW4odGhpcy5pbmRleCwgdGhpcy50b2tlbnMubGVuZ3RoIC0gMSldO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lVHJpZ2dlcihpZGVudGlmaWVyOiBUb2tlbiwgcGFyYW1ldGVyczogc3RyaW5nW10pIHtcbiAgICBjb25zdCB0cmlnZ2VyTmFtZVN0YXJ0U3BhbiA9IHRoaXMuc3Bhbi5zdGFydC5tb3ZlQnkoXG4gICAgICB0aGlzLnN0YXJ0ICsgaWRlbnRpZmllci5pbmRleCAtIHRoaXMudG9rZW5zWzBdLmluZGV4LFxuICAgICk7XG4gICAgY29uc3QgbmFtZVNwYW4gPSBuZXcgUGFyc2VTb3VyY2VTcGFuKFxuICAgICAgdHJpZ2dlck5hbWVTdGFydFNwYW4sXG4gICAgICB0cmlnZ2VyTmFtZVN0YXJ0U3Bhbi5tb3ZlQnkoaWRlbnRpZmllci5zdHJWYWx1ZS5sZW5ndGgpLFxuICAgICk7XG4gICAgY29uc3QgZW5kU3BhbiA9IHRyaWdnZXJOYW1lU3RhcnRTcGFuLm1vdmVCeSh0aGlzLnRva2VuKCkuZW5kIC0gaWRlbnRpZmllci5pbmRleCk7XG5cbiAgICAvLyBQdXQgdGhlIHByZWZldGNoIGFuZCBvbiBzcGFucyB3aXRoIHRoZSBmaXJzdCB0cmlnZ2VyXG4gICAgLy8gVGhpcyBzaG91bGQgbWF5YmUgYmUgcmVmYWN0b3JlZCB0byBoYXZlIHNvbWV0aGluZyBsaWtlIGFuIG91dGVyIE9uR3JvdXAgQVNUXG4gICAgLy8gU2luY2UgdHJpZ2dlcnMgY2FuIGJlIGdyb3VwZWQgd2l0aCBjb21tYXMgXCJvbiBob3Zlcih4KSwgaW50ZXJhY3Rpb24oeSlcIlxuICAgIGNvbnN0IGlzRmlyc3RUcmlnZ2VyID0gaWRlbnRpZmllci5pbmRleCA9PT0gMDtcbiAgICBjb25zdCBvblNvdXJjZVNwYW4gPSBpc0ZpcnN0VHJpZ2dlciA/IHRoaXMub25Tb3VyY2VTcGFuIDogbnVsbDtcbiAgICBjb25zdCBwcmVmZXRjaFNvdXJjZVNwYW4gPSBpc0ZpcnN0VHJpZ2dlciA/IHRoaXMucHJlZmV0Y2hTcGFuIDogbnVsbDtcbiAgICBjb25zdCBzb3VyY2VTcGFuID0gbmV3IFBhcnNlU291cmNlU3BhbihcbiAgICAgIGlzRmlyc3RUcmlnZ2VyID8gdGhpcy5zcGFuLnN0YXJ0IDogdHJpZ2dlck5hbWVTdGFydFNwYW4sXG4gICAgICBlbmRTcGFuLFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgc3dpdGNoIChpZGVudGlmaWVyLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgY2FzZSBPblRyaWdnZXJUeXBlLklETEU6XG4gICAgICAgICAgdGhpcy50cmFja1RyaWdnZXIoXG4gICAgICAgICAgICAnaWRsZScsXG4gICAgICAgICAgICBjcmVhdGVJZGxlVHJpZ2dlcihwYXJhbWV0ZXJzLCBuYW1lU3Bhbiwgc291cmNlU3BhbiwgcHJlZmV0Y2hTb3VyY2VTcGFuLCBvblNvdXJjZVNwYW4pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBPblRyaWdnZXJUeXBlLlRJTUVSOlxuICAgICAgICAgIHRoaXMudHJhY2tUcmlnZ2VyKFxuICAgICAgICAgICAgJ3RpbWVyJyxcbiAgICAgICAgICAgIGNyZWF0ZVRpbWVyVHJpZ2dlcihcbiAgICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgbmFtZVNwYW4sXG4gICAgICAgICAgICAgIHNvdXJjZVNwYW4sXG4gICAgICAgICAgICAgIHRoaXMucHJlZmV0Y2hTcGFuLFxuICAgICAgICAgICAgICB0aGlzLm9uU291cmNlU3BhbixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIE9uVHJpZ2dlclR5cGUuSU5URVJBQ1RJT046XG4gICAgICAgICAgdGhpcy50cmFja1RyaWdnZXIoXG4gICAgICAgICAgICAnaW50ZXJhY3Rpb24nLFxuICAgICAgICAgICAgY3JlYXRlSW50ZXJhY3Rpb25UcmlnZ2VyKFxuICAgICAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICBuYW1lU3BhbixcbiAgICAgICAgICAgICAgc291cmNlU3BhbixcbiAgICAgICAgICAgICAgdGhpcy5wcmVmZXRjaFNwYW4sXG4gICAgICAgICAgICAgIHRoaXMub25Tb3VyY2VTcGFuLFxuICAgICAgICAgICAgICB0aGlzLnBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgT25UcmlnZ2VyVHlwZS5JTU1FRElBVEU6XG4gICAgICAgICAgdGhpcy50cmFja1RyaWdnZXIoXG4gICAgICAgICAgICAnaW1tZWRpYXRlJyxcbiAgICAgICAgICAgIGNyZWF0ZUltbWVkaWF0ZVRyaWdnZXIoXG4gICAgICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgIG5hbWVTcGFuLFxuICAgICAgICAgICAgICBzb3VyY2VTcGFuLFxuICAgICAgICAgICAgICB0aGlzLnByZWZldGNoU3BhbixcbiAgICAgICAgICAgICAgdGhpcy5vblNvdXJjZVNwYW4sXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBPblRyaWdnZXJUeXBlLkhPVkVSOlxuICAgICAgICAgIHRoaXMudHJhY2tUcmlnZ2VyKFxuICAgICAgICAgICAgJ2hvdmVyJyxcbiAgICAgICAgICAgIGNyZWF0ZUhvdmVyVHJpZ2dlcihcbiAgICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgbmFtZVNwYW4sXG4gICAgICAgICAgICAgIHNvdXJjZVNwYW4sXG4gICAgICAgICAgICAgIHRoaXMucHJlZmV0Y2hTcGFuLFxuICAgICAgICAgICAgICB0aGlzLm9uU291cmNlU3BhbixcbiAgICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlcixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIE9uVHJpZ2dlclR5cGUuVklFV1BPUlQ6XG4gICAgICAgICAgdGhpcy50cmFja1RyaWdnZXIoXG4gICAgICAgICAgICAndmlld3BvcnQnLFxuICAgICAgICAgICAgY3JlYXRlVmlld3BvcnRUcmlnZ2VyKFxuICAgICAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICBuYW1lU3BhbixcbiAgICAgICAgICAgICAgc291cmNlU3BhbixcbiAgICAgICAgICAgICAgdGhpcy5wcmVmZXRjaFNwYW4sXG4gICAgICAgICAgICAgIHRoaXMub25Tb3VyY2VTcGFuLFxuICAgICAgICAgICAgICB0aGlzLnBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgdHJpZ2dlciB0eXBlIFwiJHtpZGVudGlmaWVyfVwiYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5lcnJvcihpZGVudGlmaWVyLCAoZSBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lUGFyYW1ldGVycygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICghdGhpcy50b2tlbigpLmlzQ2hhcmFjdGVyKGNoYXJzLiRMUEFSRU4pKSB7XG4gICAgICB0aGlzLnVuZXhwZWN0ZWRUb2tlbih0aGlzLnRva2VuKCkpO1xuICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7XG4gICAgfVxuXG4gICAgdGhpcy5hZHZhbmNlKCk7XG5cbiAgICBjb25zdCBjb21tYURlbGltU3RhY2s6IG51bWJlcltdID0gW107XG4gICAgbGV0IGN1cnJlbnQgPSAnJztcblxuICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW4oKTtcblxuICAgICAgLy8gU3RvcCBwYXJzaW5nIGlmIHdlJ3ZlIGhpdCB0aGUgZW5kIGNoYXJhY3RlciBhbmQgd2UncmUgb3V0c2lkZSBvZiBhIGNvbW1hLWRlbGltaXRlZCBzeW50YXguXG4gICAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBhY2NvdW50IGZvciBzdHJpbmdzIGhlcmUgc2luY2UgdGhlIGxleGVyIGFscmVhZHkgcGFyc2VkIHRoZW1cbiAgICAgIC8vIGludG8gc3RyaW5nIHRva2Vucy5cbiAgICAgIGlmICh0b2tlbi5pc0NoYXJhY3RlcihjaGFycy4kUlBBUkVOKSAmJiBjb21tYURlbGltU3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gSW4gdGhlIGBvbmAgbWljcm9zeW50YXggXCJ0b3AtbGV2ZWxcIiBjb21tYXMgKGUuZy4gb25lcyBvdXRzaWRlIG9mIGFuIHBhcmFtZXRlcnMpIHNlcGFyYXRlXG4gICAgICAvLyB0aGUgZGlmZmVyZW50IHRyaWdnZXJzIChlLmcuIGBvbiBpZGxlLHRpbWVyKDUwMClgKS4gVGhpcyBpcyBwcm9ibGVtYXRpYywgYmVjYXVzZSB0aGVcbiAgICAgIC8vIGZ1bmN0aW9uLWxpa2Ugc3ludGF4IGFsc28gaW1wbGllcyB0aGF0IG11bHRpcGxlIHBhcmFtZXRlcnMgY2FuIGJlIHBhc3NlZCBpbnRvIHRoZVxuICAgICAgLy8gaW5kaXZpZHVhbCB0cmlnZ2VyIChlLmcuIGBvbiBmb28oYSwgYilgKS4gVG8gYXZvaWQgdHJpcHBpbmcgdXAgdGhlIHBhcnNlciB3aXRoIGNvbW1hcyB0aGF0XG4gICAgICAvLyBhcmUgcGFydCBvZiBvdGhlciBzb3J0cyBvZiBzeW50YXggKG9iamVjdCBsaXRlcmFscywgYXJyYXlzKSwgd2UgdHJlYXQgYW55dGhpbmcgaW5zaWRlXG4gICAgICAvLyBhIGNvbW1hLWRlbGltaXRlZCBzeW50YXggYmxvY2sgYXMgcGxhaW4gdGV4dC5cbiAgICAgIGlmICh0b2tlbi50eXBlID09PSBUb2tlblR5cGUuQ2hhcmFjdGVyICYmIENPTU1BX0RFTElNSVRFRF9TWU5UQVguaGFzKHRva2VuLm51bVZhbHVlKSkge1xuICAgICAgICBjb21tYURlbGltU3RhY2sucHVzaChDT01NQV9ERUxJTUlURURfU1lOVEFYLmdldCh0b2tlbi5udW1WYWx1ZSkhKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBjb21tYURlbGltU3RhY2subGVuZ3RoID4gMCAmJlxuICAgICAgICB0b2tlbi5pc0NoYXJhY3Rlcihjb21tYURlbGltU3RhY2tbY29tbWFEZWxpbVN0YWNrLmxlbmd0aCAtIDFdKVxuICAgICAgKSB7XG4gICAgICAgIGNvbW1hRGVsaW1TdGFjay5wb3AoKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgd2UgaGl0IGEgY29tbWEgb3V0c2lkZSBvZiBhIGNvbW1hLWRlbGltaXRlZCBzeW50YXgsIGl0IG1lYW5zXG4gICAgICAvLyB0aGF0IHdlJ3JlIGF0IHRoZSB0b3AgbGV2ZWwgYW5kIHdlJ3JlIHN0YXJ0aW5nIGEgbmV3IHBhcmFtZXRlci5cbiAgICAgIGlmIChjb21tYURlbGltU3RhY2subGVuZ3RoID09PSAwICYmIHRva2VuLmlzQ2hhcmFjdGVyKGNoYXJzLiRDT01NQSkgJiYgY3VycmVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHBhcmFtZXRlcnMucHVzaChjdXJyZW50KTtcbiAgICAgICAgY3VycmVudCA9ICcnO1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyd2lzZSB0cmVhdCB0aGUgdG9rZW4gYXMgYSBwbGFpbiB0ZXh0IGNoYXJhY3RlciBpbiB0aGUgY3VycmVudCBwYXJhbWV0ZXIuXG4gICAgICBjdXJyZW50ICs9IHRoaXMudG9rZW5UZXh0KCk7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudG9rZW4oKS5pc0NoYXJhY3RlcihjaGFycy4kUlBBUkVOKSB8fCBjb21tYURlbGltU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5lcnJvcih0aGlzLnRva2VuKCksICdVbmV4cGVjdGVkIGVuZCBvZiBleHByZXNzaW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5pbmRleCA8IHRoaXMudG9rZW5zLmxlbmd0aCAtIDEgJiZcbiAgICAgICF0aGlzLnRva2Vuc1t0aGlzLmluZGV4ICsgMV0uaXNDaGFyYWN0ZXIoY2hhcnMuJENPTU1BKVxuICAgICkge1xuICAgICAgdGhpcy51bmV4cGVjdGVkVG9rZW4odGhpcy50b2tlbnNbdGhpcy5pbmRleCArIDFdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1ldGVycztcbiAgfVxuXG4gIHByaXZhdGUgdG9rZW5UZXh0KCk6IHN0cmluZyB7XG4gICAgLy8gVG9rZW5zIGhhdmUgYSB0b1N0cmluZyBhbHJlYWR5IHdoaWNoIHdlIGNvdWxkIHVzZSwgYnV0IGZvciBzdHJpbmcgdG9rZW5zIGl0IG9taXRzIHRoZSBxdW90ZXMuXG4gICAgLy8gRXZlbnR1YWxseSB3ZSBjb3VsZCBleHBvc2UgdGhpcyBpbmZvcm1hdGlvbiBvbiB0aGUgdG9rZW4gZGlyZWN0bHkuXG4gICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbi5zbGljZSh0aGlzLnN0YXJ0ICsgdGhpcy50b2tlbigpLmluZGV4LCB0aGlzLnN0YXJ0ICsgdGhpcy50b2tlbigpLmVuZCk7XG4gIH1cblxuICBwcml2YXRlIHRyYWNrVHJpZ2dlcihuYW1lOiBrZXlvZiB0LkRlZmVycmVkQmxvY2tUcmlnZ2VycywgdHJpZ2dlcjogdC5EZWZlcnJlZFRyaWdnZXIpOiB2b2lkIHtcbiAgICB0cmFja1RyaWdnZXIobmFtZSwgdGhpcy50cmlnZ2VycywgdGhpcy5lcnJvcnMsIHRyaWdnZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBlcnJvcih0b2tlbjogVG9rZW4sIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5ld1N0YXJ0ID0gdGhpcy5zcGFuLnN0YXJ0Lm1vdmVCeSh0aGlzLnN0YXJ0ICsgdG9rZW4uaW5kZXgpO1xuICAgIGNvbnN0IG5ld0VuZCA9IG5ld1N0YXJ0Lm1vdmVCeSh0b2tlbi5lbmQgLSB0b2tlbi5pbmRleCk7XG4gICAgdGhpcy5lcnJvcnMucHVzaChuZXcgUGFyc2VFcnJvcihuZXcgUGFyc2VTb3VyY2VTcGFuKG5ld1N0YXJ0LCBuZXdFbmQpLCBtZXNzYWdlKSk7XG4gIH1cblxuICBwcml2YXRlIHVuZXhwZWN0ZWRUb2tlbih0b2tlbjogVG9rZW4pIHtcbiAgICB0aGlzLmVycm9yKHRva2VuLCBgVW5leHBlY3RlZCB0b2tlbiBcIiR7dG9rZW59XCJgKTtcbiAgfVxufVxuXG4vKiogQWRkcyBhIHRyaWdnZXIgdG8gYSBtYXAgb2YgdHJpZ2dlcnMuICovXG5mdW5jdGlvbiB0cmFja1RyaWdnZXIoXG4gIG5hbWU6IGtleW9mIHQuRGVmZXJyZWRCbG9ja1RyaWdnZXJzLFxuICBhbGxUcmlnZ2VyczogdC5EZWZlcnJlZEJsb2NrVHJpZ2dlcnMsXG4gIGVycm9yczogUGFyc2VFcnJvcltdLFxuICB0cmlnZ2VyOiB0LkRlZmVycmVkVHJpZ2dlcixcbikge1xuICBpZiAoYWxsVHJpZ2dlcnNbbmFtZV0pIHtcbiAgICBlcnJvcnMucHVzaChuZXcgUGFyc2VFcnJvcih0cmlnZ2VyLnNvdXJjZVNwYW4sIGBEdXBsaWNhdGUgXCIke25hbWV9XCIgdHJpZ2dlciBpcyBub3QgYWxsb3dlZGApKTtcbiAgfSBlbHNlIHtcbiAgICBhbGxUcmlnZ2Vyc1tuYW1lXSA9IHRyaWdnZXIgYXMgYW55O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUlkbGVUcmlnZ2VyKFxuICBwYXJhbWV0ZXJzOiBzdHJpbmdbXSxcbiAgbmFtZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICBwcmVmZXRjaFNwYW46IFBhcnNlU291cmNlU3BhbiB8IG51bGwsXG4gIG9uU291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuIHwgbnVsbCxcbik6IHQuSWRsZURlZmVycmVkVHJpZ2dlciB7XG4gIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFwiJHtPblRyaWdnZXJUeXBlLklETEV9XCIgdHJpZ2dlciBjYW5ub3QgaGF2ZSBwYXJhbWV0ZXJzYCk7XG4gIH1cblxuICByZXR1cm4gbmV3IHQuSWRsZURlZmVycmVkVHJpZ2dlcihuYW1lU3Bhbiwgc291cmNlU3BhbiwgcHJlZmV0Y2hTcGFuLCBvblNvdXJjZVNwYW4pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUaW1lclRyaWdnZXIoXG4gIHBhcmFtZXRlcnM6IHN0cmluZ1tdLFxuICBuYW1lU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gIHByZWZldGNoU3BhbjogUGFyc2VTb3VyY2VTcGFuIHwgbnVsbCxcbiAgb25Tb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuKSB7XG4gIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgXCIke09uVHJpZ2dlclR5cGUuVElNRVJ9XCIgdHJpZ2dlciBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyYCk7XG4gIH1cblxuICBjb25zdCBkZWxheSA9IHBhcnNlRGVmZXJyZWRUaW1lKHBhcmFtZXRlcnNbMF0pO1xuXG4gIGlmIChkZWxheSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIHRpbWUgdmFsdWUgb2YgdHJpZ2dlciBcIiR7T25UcmlnZ2VyVHlwZS5USU1FUn1cImApO1xuICB9XG5cbiAgcmV0dXJuIG5ldyB0LlRpbWVyRGVmZXJyZWRUcmlnZ2VyKGRlbGF5LCBuYW1lU3Bhbiwgc291cmNlU3BhbiwgcHJlZmV0Y2hTcGFuLCBvblNvdXJjZVNwYW4pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVJbW1lZGlhdGVUcmlnZ2VyKFxuICBwYXJhbWV0ZXJzOiBzdHJpbmdbXSxcbiAgbmFtZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICBwcmVmZXRjaFNwYW46IFBhcnNlU291cmNlU3BhbiB8IG51bGwsXG4gIG9uU291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuIHwgbnVsbCxcbik6IHQuSW1tZWRpYXRlRGVmZXJyZWRUcmlnZ2VyIHtcbiAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgXCIke09uVHJpZ2dlclR5cGUuSU1NRURJQVRFfVwiIHRyaWdnZXIgY2Fubm90IGhhdmUgcGFyYW1ldGVyc2ApO1xuICB9XG5cbiAgcmV0dXJuIG5ldyB0LkltbWVkaWF0ZURlZmVycmVkVHJpZ2dlcihuYW1lU3Bhbiwgc291cmNlU3BhbiwgcHJlZmV0Y2hTcGFuLCBvblNvdXJjZVNwYW4pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIb3ZlclRyaWdnZXIoXG4gIHBhcmFtZXRlcnM6IHN0cmluZ1tdLFxuICBuYW1lU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gIHByZWZldGNoU3BhbjogUGFyc2VTb3VyY2VTcGFuIHwgbnVsbCxcbiAgb25Tb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICBwbGFjZWhvbGRlcjogdC5EZWZlcnJlZEJsb2NrUGxhY2Vob2xkZXIgfCBudWxsLFxuKTogdC5Ib3ZlckRlZmVycmVkVHJpZ2dlciB7XG4gIHZhbGlkYXRlUmVmZXJlbmNlQmFzZWRUcmlnZ2VyKE9uVHJpZ2dlclR5cGUuSE9WRVIsIHBhcmFtZXRlcnMsIHBsYWNlaG9sZGVyKTtcbiAgcmV0dXJuIG5ldyB0LkhvdmVyRGVmZXJyZWRUcmlnZ2VyKFxuICAgIHBhcmFtZXRlcnNbMF0gPz8gbnVsbCxcbiAgICBuYW1lU3BhbixcbiAgICBzb3VyY2VTcGFuLFxuICAgIHByZWZldGNoU3BhbixcbiAgICBvblNvdXJjZVNwYW4sXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUludGVyYWN0aW9uVHJpZ2dlcihcbiAgcGFyYW1ldGVyczogc3RyaW5nW10sXG4gIG5hbWVTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgcHJlZmV0Y2hTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICBvblNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbiB8IG51bGwsXG4gIHBsYWNlaG9sZGVyOiB0LkRlZmVycmVkQmxvY2tQbGFjZWhvbGRlciB8IG51bGwsXG4pOiB0LkludGVyYWN0aW9uRGVmZXJyZWRUcmlnZ2VyIHtcbiAgdmFsaWRhdGVSZWZlcmVuY2VCYXNlZFRyaWdnZXIoT25UcmlnZ2VyVHlwZS5JTlRFUkFDVElPTiwgcGFyYW1ldGVycywgcGxhY2Vob2xkZXIpO1xuICByZXR1cm4gbmV3IHQuSW50ZXJhY3Rpb25EZWZlcnJlZFRyaWdnZXIoXG4gICAgcGFyYW1ldGVyc1swXSA/PyBudWxsLFxuICAgIG5hbWVTcGFuLFxuICAgIHNvdXJjZVNwYW4sXG4gICAgcHJlZmV0Y2hTcGFuLFxuICAgIG9uU291cmNlU3BhbixcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmlld3BvcnRUcmlnZ2VyKFxuICBwYXJhbWV0ZXJzOiBzdHJpbmdbXSxcbiAgbmFtZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICBwcmVmZXRjaFNwYW46IFBhcnNlU291cmNlU3BhbiB8IG51bGwsXG4gIG9uU291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuIHwgbnVsbCxcbiAgcGxhY2Vob2xkZXI6IHQuRGVmZXJyZWRCbG9ja1BsYWNlaG9sZGVyIHwgbnVsbCxcbik6IHQuVmlld3BvcnREZWZlcnJlZFRyaWdnZXIge1xuICB2YWxpZGF0ZVJlZmVyZW5jZUJhc2VkVHJpZ2dlcihPblRyaWdnZXJUeXBlLlZJRVdQT1JULCBwYXJhbWV0ZXJzLCBwbGFjZWhvbGRlcik7XG4gIHJldHVybiBuZXcgdC5WaWV3cG9ydERlZmVycmVkVHJpZ2dlcihcbiAgICBwYXJhbWV0ZXJzWzBdID8/IG51bGwsXG4gICAgbmFtZVNwYW4sXG4gICAgc291cmNlU3BhbixcbiAgICBwcmVmZXRjaFNwYW4sXG4gICAgb25Tb3VyY2VTcGFuLFxuICApO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJlZmVyZW5jZUJhc2VkVHJpZ2dlcihcbiAgdHlwZTogT25UcmlnZ2VyVHlwZSxcbiAgcGFyYW1ldGVyczogc3RyaW5nW10sXG4gIHBsYWNlaG9sZGVyOiB0LkRlZmVycmVkQmxvY2tQbGFjZWhvbGRlciB8IG51bGwsXG4pIHtcbiAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgXCIke3R5cGV9XCIgdHJpZ2dlciBjYW4gb25seSBoYXZlIHplcm8gb3Igb25lIHBhcmFtZXRlcnNgKTtcbiAgfVxuXG4gIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChwbGFjZWhvbGRlciA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgXCIke3R5cGV9XCIgdHJpZ2dlciB3aXRoIG5vIHBhcmFtZXRlcnMgY2FuIG9ubHkgYmUgcGxhY2VkIG9uIGFuIEBkZWZlciB0aGF0IGhhcyBhIEBwbGFjZWhvbGRlciBibG9ja2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwbGFjZWhvbGRlci5jaGlsZHJlbi5sZW5ndGggIT09IDEgfHwgIShwbGFjZWhvbGRlci5jaGlsZHJlblswXSBpbnN0YW5jZW9mIHQuRWxlbWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFwiJHt0eXBlfVwiIHRyaWdnZXIgd2l0aCBubyBwYXJhbWV0ZXJzIGNhbiBvbmx5IGJlIHBsYWNlZCBvbiBhbiBAZGVmZXIgdGhhdCBoYXMgYSBgICtcbiAgICAgICAgICBgQHBsYWNlaG9sZGVyIGJsb2NrIHdpdGggZXhhY3RseSBvbmUgcm9vdCBlbGVtZW50IG5vZGVgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEdldHMgdGhlIGluZGV4IHdpdGhpbiBhbiBleHByZXNzaW9uIGF0IHdoaWNoIHRoZSB0cmlnZ2VyIHBhcmFtZXRlcnMgc3RhcnQuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJpZ2dlclBhcmFtZXRlcnNTdGFydCh2YWx1ZTogc3RyaW5nLCBzdGFydFBvc2l0aW9uID0gMCk6IG51bWJlciB7XG4gIGxldCBoYXNGb3VuZFNlcGFyYXRvciA9IGZhbHNlO1xuXG4gIGZvciAobGV0IGkgPSBzdGFydFBvc2l0aW9uOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoU0VQQVJBVE9SX1BBVFRFUk4udGVzdCh2YWx1ZVtpXSkpIHtcbiAgICAgIGhhc0ZvdW5kU2VwYXJhdG9yID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGhhc0ZvdW5kU2VwYXJhdG9yKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgdGltZSBleHByZXNzaW9uIGZyb20gYSBkZWZlcnJlZCB0cmlnZ2VyIHRvXG4gKiBtaWxsaXNlY29uZHMuIFJldHVybnMgbnVsbCBpZiBpdCBjYW5ub3QgYmUgcGFyc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEZWZlcnJlZFRpbWUodmFsdWU6IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBtYXRjaCA9IHZhbHVlLm1hdGNoKFRJTUVfUEFUVEVSTik7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgW3RpbWUsIHVuaXRzXSA9IG1hdGNoO1xuICByZXR1cm4gcGFyc2VGbG9hdCh0aW1lKSAqICh1bml0cyA9PT0gJ3MnID8gMTAwMCA6IDEpO1xufVxuIl19
|