@angular/compiler 19.0.0-next.1 → 19.0.0-next.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/fesm2022/compiler.mjs +4742 -4473
  2. package/fesm2022/compiler.mjs.map +1 -1
  3. package/index.d.ts +35 -3
  4. package/package.json +2 -4
  5. package/esm2022/compiler.mjs +0 -13
  6. package/esm2022/index.mjs +0 -13
  7. package/esm2022/public_api.mjs +0 -15
  8. package/esm2022/src/assertions.mjs +0 -31
  9. package/esm2022/src/chars.mjs +0 -90
  10. package/esm2022/src/compiler.mjs +0 -88
  11. package/esm2022/src/compiler_facade_interface.mjs +0 -29
  12. package/esm2022/src/config.mjs +0 -20
  13. package/esm2022/src/constant_pool.mjs +0 -285
  14. package/esm2022/src/core.mjs +0 -96
  15. package/esm2022/src/expression_parser/ast.mjs +0 -755
  16. package/esm2022/src/expression_parser/lexer.mjs +0 -421
  17. package/esm2022/src/expression_parser/parser.mjs +0 -1222
  18. package/esm2022/src/i18n/digest.mjs +0 -322
  19. package/esm2022/src/i18n/extractor_merger.mjs +0 -409
  20. package/esm2022/src/i18n/i18n_ast.mjs +0 -212
  21. package/esm2022/src/i18n/i18n_html_parser.mjs +0 -54
  22. package/esm2022/src/i18n/i18n_parser.mjs +0 -247
  23. package/esm2022/src/i18n/index.mjs +0 -16
  24. package/esm2022/src/i18n/message_bundle.mjs +0 -93
  25. package/esm2022/src/i18n/parse_util.mjs +0 -17
  26. package/esm2022/src/i18n/serializers/placeholder.mjs +0 -139
  27. package/esm2022/src/i18n/serializers/serializer.mjs +0 -77
  28. package/esm2022/src/i18n/serializers/xliff.mjs +0 -300
  29. package/esm2022/src/i18n/serializers/xliff2.mjs +0 -349
  30. package/esm2022/src/i18n/serializers/xmb.mjs +0 -188
  31. package/esm2022/src/i18n/serializers/xml_helper.mjs +0 -94
  32. package/esm2022/src/i18n/serializers/xtb.mjs +0 -186
  33. package/esm2022/src/i18n/translation_bundle.mjs +0 -164
  34. package/esm2022/src/injectable_compiler_2.mjs +0 -138
  35. package/esm2022/src/jit_compiler_facade.mjs +0 -681
  36. package/esm2022/src/ml_parser/ast.mjs +0 -167
  37. package/esm2022/src/ml_parser/defaults.mjs +0 -24
  38. package/esm2022/src/ml_parser/entities.mjs +0 -2144
  39. package/esm2022/src/ml_parser/html_parser.mjs +0 -18
  40. package/esm2022/src/ml_parser/html_tags.mjs +0 -156
  41. package/esm2022/src/ml_parser/html_whitespaces.mjs +0 -107
  42. package/esm2022/src/ml_parser/icu_ast_expander.mjs +0 -125
  43. package/esm2022/src/ml_parser/lexer.mjs +0 -1210
  44. package/esm2022/src/ml_parser/parser.mjs +0 -539
  45. package/esm2022/src/ml_parser/tags.mjs +0 -47
  46. package/esm2022/src/ml_parser/tokens.mjs +0 -9
  47. package/esm2022/src/ml_parser/xml_parser.mjs +0 -19
  48. package/esm2022/src/ml_parser/xml_tags.mjs +0 -32
  49. package/esm2022/src/output/abstract_emitter.mjs +0 -524
  50. package/esm2022/src/output/abstract_js_emitter.mjs +0 -130
  51. package/esm2022/src/output/map_util.mjs +0 -19
  52. package/esm2022/src/output/output_ast.mjs +0 -1301
  53. package/esm2022/src/output/output_jit.mjs +0 -138
  54. package/esm2022/src/output/output_jit_trusted_types.mjs +0 -100
  55. package/esm2022/src/output/source_map.mjs +0 -150
  56. package/esm2022/src/parse_util.mjs +0 -198
  57. package/esm2022/src/render3/partial/api.mjs +0 -9
  58. package/esm2022/src/render3/partial/class_metadata.mjs +0 -52
  59. package/esm2022/src/render3/partial/component.mjs +0 -197
  60. package/esm2022/src/render3/partial/directive.mjs +0 -264
  61. package/esm2022/src/render3/partial/factory.mjs +0 -35
  62. package/esm2022/src/render3/partial/injectable.mjs +0 -67
  63. package/esm2022/src/render3/partial/injector.mjs +0 -41
  64. package/esm2022/src/render3/partial/ng_module.mjs +0 -63
  65. package/esm2022/src/render3/partial/pipe.mjs +0 -50
  66. package/esm2022/src/render3/partial/util.mjs +0 -79
  67. package/esm2022/src/render3/r3_ast.mjs +0 -493
  68. package/esm2022/src/render3/r3_class_debug_info_compiler.mjs +0 -35
  69. package/esm2022/src/render3/r3_class_metadata_compiler.mjs +0 -92
  70. package/esm2022/src/render3/r3_control_flow.mjs +0 -421
  71. package/esm2022/src/render3/r3_deferred_blocks.mjs +0 -170
  72. package/esm2022/src/render3/r3_deferred_triggers.mjs +0 -316
  73. package/esm2022/src/render3/r3_factory.mjs +0 -200
  74. package/esm2022/src/render3/r3_identifiers.mjs +0 -480
  75. package/esm2022/src/render3/r3_injector_compiler.mjs +0 -28
  76. package/esm2022/src/render3/r3_jit.mjs +0 -29
  77. package/esm2022/src/render3/r3_module_compiler.mjs +0 -211
  78. package/esm2022/src/render3/r3_pipe_compiler.mjs +0 -35
  79. package/esm2022/src/render3/r3_template_transform.mjs +0 -560
  80. package/esm2022/src/render3/util.mjs +0 -90
  81. package/esm2022/src/render3/view/api.mjs +0 -14
  82. package/esm2022/src/render3/view/compiler.mjs +0 -546
  83. package/esm2022/src/render3/view/i18n/get_msg_utils.mjs +0 -113
  84. package/esm2022/src/render3/view/i18n/icu_serializer.mjs +0 -43
  85. package/esm2022/src/render3/view/i18n/localize_utils.mjs +0 -118
  86. package/esm2022/src/render3/view/i18n/meta.mjs +0 -259
  87. package/esm2022/src/render3/view/i18n/util.mjs +0 -70
  88. package/esm2022/src/render3/view/query_generation.mjs +0 -182
  89. package/esm2022/src/render3/view/t2_api.mjs +0 -9
  90. package/esm2022/src/render3/view/t2_binder.mjs +0 -823
  91. package/esm2022/src/render3/view/template.mjs +0 -113
  92. package/esm2022/src/render3/view/util.mjs +0 -192
  93. package/esm2022/src/resource_loader.mjs +0 -17
  94. package/esm2022/src/schema/dom_element_schema_registry.mjs +0 -471
  95. package/esm2022/src/schema/dom_security_schema.mjs +0 -96
  96. package/esm2022/src/schema/element_schema_registry.mjs +0 -10
  97. package/esm2022/src/schema/trusted_types_sinks.mjs +0 -41
  98. package/esm2022/src/selector.mjs +0 -400
  99. package/esm2022/src/shadow_css.mjs +0 -1053
  100. package/esm2022/src/style_url_resolver.mjs +0 -17
  101. package/esm2022/src/template/pipeline/ir/index.mjs +0 -18
  102. package/esm2022/src/template/pipeline/ir/src/enums.mjs +0 -503
  103. package/esm2022/src/template/pipeline/ir/src/expression.mjs +0 -997
  104. package/esm2022/src/template/pipeline/ir/src/handle.mjs +0 -13
  105. package/esm2022/src/template/pipeline/ir/src/operations.mjs +0 -261
  106. package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +0 -405
  107. package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +0 -25
  108. package/esm2022/src/template/pipeline/ir/src/ops/shared.mjs +0 -43
  109. package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +0 -277
  110. package/esm2022/src/template/pipeline/ir/src/traits.mjs +0 -64
  111. package/esm2022/src/template/pipeline/ir/src/variable.mjs +0 -13
  112. package/esm2022/src/template/pipeline/src/compilation.mjs +0 -194
  113. package/esm2022/src/template/pipeline/src/conversion.mjs +0 -64
  114. package/esm2022/src/template/pipeline/src/emit.mjs +0 -238
  115. package/esm2022/src/template/pipeline/src/ingest.mjs +0 -1058
  116. package/esm2022/src/template/pipeline/src/instruction.mjs +0 -564
  117. package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +0 -32
  118. package/esm2022/src/template/pipeline/src/phases/apply_i18n_expressions.mjs +0 -63
  119. package/esm2022/src/template/pipeline/src/phases/assign_i18n_slot_dependencies.mjs +0 -63
  120. package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +0 -138
  121. package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +0 -75
  122. package/esm2022/src/template/pipeline/src/phases/chaining.mjs +0 -112
  123. package/esm2022/src/template/pipeline/src/phases/collapse_singleton_interpolations.mjs +0 -32
  124. package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +0 -58
  125. package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +0 -214
  126. package/esm2022/src/template/pipeline/src/phases/convert_i18n_bindings.mjs +0 -52
  127. package/esm2022/src/template/pipeline/src/phases/create_i18n_contexts.mjs +0 -105
  128. package/esm2022/src/template/pipeline/src/phases/deduplicate_text_bindings.mjs +0 -40
  129. package/esm2022/src/template/pipeline/src/phases/defer_configs.mjs +0 -29
  130. package/esm2022/src/template/pipeline/src/phases/defer_resolve_targets.mjs +0 -113
  131. package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +0 -47
  132. package/esm2022/src/template/pipeline/src/phases/expand_safe_reads.mjs +0 -192
  133. package/esm2022/src/template/pipeline/src/phases/extract_i18n_messages.mjs +0 -218
  134. package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +0 -66
  135. package/esm2022/src/template/pipeline/src/phases/generate_local_let_references.mjs +0 -29
  136. package/esm2022/src/template/pipeline/src/phases/generate_projection_def.mjs +0 -46
  137. package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +0 -170
  138. package/esm2022/src/template/pipeline/src/phases/has_const_expression_collection.mjs +0 -28
  139. package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +0 -81
  140. package/esm2022/src/template/pipeline/src/phases/i18n_const_collection.mjs +0 -309
  141. package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +0 -97
  142. package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +0 -43
  143. package/esm2022/src/template/pipeline/src/phases/namespace.mjs +0 -26
  144. package/esm2022/src/template/pipeline/src/phases/naming.mjs +0 -179
  145. package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +0 -75
  146. package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +0 -29
  147. package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +0 -47
  148. package/esm2022/src/template/pipeline/src/phases/nullish_coalescing.mjs +0 -33
  149. package/esm2022/src/template/pipeline/src/phases/ordering.mjs +0 -140
  150. package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +0 -137
  151. package/esm2022/src/template/pipeline/src/phases/phase_remove_content_selectors.mjs +0 -42
  152. package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +0 -74
  153. package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +0 -30
  154. package/esm2022/src/template/pipeline/src/phases/propagate_i18n_blocks.mjs +0 -81
  155. package/esm2022/src/template/pipeline/src/phases/pure_function_extraction.mjs +0 -55
  156. package/esm2022/src/template/pipeline/src/phases/pure_literal_structures.mjs +0 -58
  157. package/esm2022/src/template/pipeline/src/phases/reify.mjs +0 -433
  158. package/esm2022/src/template/pipeline/src/phases/remove_empty_bindings.mjs +0 -31
  159. package/esm2022/src/template/pipeline/src/phases/remove_i18n_contexts.mjs +0 -27
  160. package/esm2022/src/template/pipeline/src/phases/remove_illegal_let_references.mjs +0 -36
  161. package/esm2022/src/template/pipeline/src/phases/remove_unused_i18n_attrs.mjs +0 -33
  162. package/esm2022/src/template/pipeline/src/phases/resolve_contexts.mjs +0 -60
  163. package/esm2022/src/template/pipeline/src/phases/resolve_defer_deps_fns.mjs +0 -31
  164. package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +0 -36
  165. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_element_placeholders.mjs +0 -266
  166. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_expression_placeholders.mjs +0 -70
  167. package/esm2022/src/template/pipeline/src/phases/resolve_names.mjs +0 -124
  168. package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +0 -123
  169. package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +0 -64
  170. package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +0 -62
  171. package/esm2022/src/template/pipeline/src/phases/store_let_optimization.mjs +0 -35
  172. package/esm2022/src/template/pipeline/src/phases/style_binding_specialization.mjs +0 -42
  173. package/esm2022/src/template/pipeline/src/phases/temporary_variables.mjs +0 -87
  174. package/esm2022/src/template/pipeline/src/phases/track_fn_generation.mjs +0 -52
  175. package/esm2022/src/template/pipeline/src/phases/track_fn_optimization.mjs +0 -88
  176. package/esm2022/src/template/pipeline/src/phases/track_variables.mjs +0 -36
  177. package/esm2022/src/template/pipeline/src/phases/transform_two_way_binding_set.mjs +0 -43
  178. package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +0 -155
  179. package/esm2022/src/template/pipeline/src/phases/variable_optimization.mjs +0 -423
  180. package/esm2022/src/template/pipeline/src/phases/wrap_icus.mjs +0 -41
  181. package/esm2022/src/template/pipeline/src/util/elements.mjs +0 -29
  182. package/esm2022/src/template_parser/binding_parser.mjs +0 -465
  183. package/esm2022/src/template_parser/template_preparser.mjs +0 -84
  184. package/esm2022/src/util.mjs +0 -124
  185. package/esm2022/src/version.mjs +0 -15
@@ -1,87 +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 o from '../../../../output/output_ast';
9
- import * as ir from '../../ir';
10
- /**
11
- * Find all assignments and usages of temporary variables, which are linked to each other with cross
12
- * references. Generate names for each cross-reference, and add a `DeclareVarStmt` to initialize
13
- * them at the beginning of the update block.
14
- *
15
- * TODO: Sometimes, it will be possible to reuse names across different subexpressions. For example,
16
- * in the double keyed read `a?.[f()]?.[f()]`, the two function calls have non-overlapping scopes.
17
- * Implement an algorithm for reuse.
18
- */
19
- export function generateTemporaryVariables(job) {
20
- for (const unit of job.units) {
21
- unit.create.prepend(generateTemporaries(unit.create));
22
- unit.update.prepend(generateTemporaries(unit.update));
23
- }
24
- }
25
- function generateTemporaries(ops) {
26
- let opCount = 0;
27
- let generatedStatements = [];
28
- // For each op, search for any variables that are assigned or read. For each variable, generate a
29
- // name and produce a `DeclareVarStmt` to the beginning of the block.
30
- for (const op of ops) {
31
- // Identify the final time each temp var is read.
32
- const finalReads = new Map();
33
- ir.visitExpressionsInOp(op, (expr, flag) => {
34
- if (flag & ir.VisitorContextFlag.InChildOperation) {
35
- return;
36
- }
37
- if (expr instanceof ir.ReadTemporaryExpr) {
38
- finalReads.set(expr.xref, expr);
39
- }
40
- });
41
- // Name the temp vars, accounting for the fact that a name can be reused after it has been
42
- // read for the final time.
43
- let count = 0;
44
- const assigned = new Set();
45
- const released = new Set();
46
- const defs = new Map();
47
- ir.visitExpressionsInOp(op, (expr, flag) => {
48
- if (flag & ir.VisitorContextFlag.InChildOperation) {
49
- return;
50
- }
51
- if (expr instanceof ir.AssignTemporaryExpr) {
52
- if (!assigned.has(expr.xref)) {
53
- assigned.add(expr.xref);
54
- // TODO: Exactly replicate the naming scheme used by `TemplateDefinitionBuilder`.
55
- // It seems to rely on an expression index instead of an op index.
56
- defs.set(expr.xref, `tmp_${opCount}_${count++}`);
57
- }
58
- assignName(defs, expr);
59
- }
60
- else if (expr instanceof ir.ReadTemporaryExpr) {
61
- if (finalReads.get(expr.xref) === expr) {
62
- released.add(expr.xref);
63
- count--;
64
- }
65
- assignName(defs, expr);
66
- }
67
- });
68
- // Add declarations for the temp vars.
69
- generatedStatements.push(...Array.from(new Set(defs.values())).map((name) => ir.createStatementOp(new o.DeclareVarStmt(name))));
70
- opCount++;
71
- if (op.kind === ir.OpKind.Listener || op.kind === ir.OpKind.TwoWayListener) {
72
- op.handlerOps.prepend(generateTemporaries(op.handlerOps));
73
- }
74
- }
75
- return generatedStatements;
76
- }
77
- /**
78
- * Assigns a name to the temporary variable in the given temporary variable expression.
79
- */
80
- function assignName(names, expr) {
81
- const name = names.get(expr.xref);
82
- if (name === undefined) {
83
- throw new Error(`Found xref with unassigned name: ${expr.xref}`);
84
- }
85
- expr.name = name;
86
- }
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG9yYXJ5X3ZhcmlhYmxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyL3NyYy90ZW1wbGF0ZS9waXBlbGluZS9zcmMvcGhhc2VzL3RlbXBvcmFyeV92YXJpYWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxLQUFLLENBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxHQUFtQjtJQUM1RCxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUF1QyxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBdUMsQ0FBQyxDQUFDO0lBQzlGLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FDMUIsR0FBeUM7SUFFekMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLElBQUksbUJBQW1CLEdBQXVDLEVBQUUsQ0FBQztJQUVqRSxpR0FBaUc7SUFDakcscUVBQXFFO0lBQ3JFLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7UUFDckIsaURBQWlEO1FBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO1FBQzlELEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDekMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDLGdC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QUFDLG9DQUFvQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBvIGZyb20gJy4uLy4uLy4uLy4uL291dHB1dC9vdXRwdXRfYXN0JztcbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcbmltcG9ydCB0eXBlIHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG4vKipcbiAqIEZpbmQgYWxsIGFzc2lnbm1lbnRzIGFuZCB1c2FnZXMgb2YgdGVtcG9yYXJ5IHZhcmlhYmxlcywgd2hpY2ggYXJlIGxpbmtlZCB0byBlYWNoIG90aGVyIHdpdGggY3Jvc3NcbiAqIHJlZmVyZW5jZXMuIEdlbmVyYXRlIG5hbWVzIGZvciBlYWNoIGNyb3NzLXJlZmVyZW5jZSwgYW5kIGFkZCBhIGBEZWNsYXJlVmFyU3RtdGAgdG8gaW5pdGlhbGl6ZVxuICogdGhlbSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1cGRhdGUgYmxvY2suXG4gKlxuICogVE9ETzogU29tZXRpbWVzLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIHJldXNlIG5hbWVzIGFjcm9zcyBkaWZmZXJlbnQgc3ViZXhwcmVzc2lvbnMuIEZvciBleGFtcGxlLFxuICogaW4gdGhlIGRvdWJsZSBrZXllZCByZWFkIGBhPy5bZigpXT8uW2YoKV1gLCB0aGUgdHdvIGZ1bmN0aW9uIGNhbGxzIGhhdmUgbm9uLW92ZXJsYXBwaW5nIHNjb3Blcy5cbiAqIEltcGxlbWVudCBhbiBhbGdvcml0aG0gZm9yIHJldXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUZW1wb3JhcnlWYXJpYWJsZXMoam9iOiBDb21waWxhdGlvbkpvYik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgdW5pdC5jcmVhdGUucHJlcGVuZChnZW5lcmF0ZVRlbXBvcmFyaWVzKHVuaXQuY3JlYXRlKSBhcyBBcnJheTxpci5TdGF0ZW1lbnRPcDxpci5DcmVhdGVPcD4+KTtcbiAgICB1bml0LnVwZGF0ZS5wcmVwZW5kKGdlbmVyYXRlVGVtcG9yYXJpZXModW5pdC51cGRhdGUpIGFzIEFycmF5PGlyLlN0YXRlbWVudE9wPGlyLlVwZGF0ZU9wPj4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlVGVtcG9yYXJpZXMoXG4gIG9wczogaXIuT3BMaXN0PGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3A+LFxuKTogQXJyYXk8aXIuU3RhdGVtZW50T3A8aXIuQ3JlYXRlT3AgfCBpci5VcGRhdGVPcD4+IHtcbiAgbGV0IG9wQ291bnQgPSAwO1xuICBsZXQgZ2VuZXJhdGVkU3RhdGVtZW50czogQXJyYXk8aXIuU3RhdGVtZW50T3A8aXIuVXBkYXRlT3A+PiA9IFtdO1xuXG4gIC8vIEZvciBlYWNoIG9wLCBzZWFyY2ggZm9yIGFueSB2YXJpYWJsZXMgdGhhdCBhcmUgYXNzaWduZWQgb3IgcmVhZC4gRm9yIGVhY2ggdmFyaWFibGUsIGdlbmVyYXRlIGFcbiAgLy8gbmFtZSBhbmQgcHJvZHVjZSBhIGBEZWNsYXJlVmFyU3RtdGAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2suXG4gIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7XG4gICAgLy8gSWRlbnRpZnkgdGhlIGZpbmFsIHRpbWUgZWFjaCB0ZW1wIHZhciBpcyByZWFkLlxuICAgIGNvbnN0IGZpbmFsUmVhZHMgPSBuZXcgTWFwPGlyLlhyZWZJZCwgaXIuUmVhZFRlbXBvcmFyeUV4cHI+KCk7XG4gICAgaXIudmlzaXRFeHByZXNzaW9uc0luT3Aob3AsIChleHByLCBmbGFnKSA9PiB7XG4gICAgICBpZiAoZmxhZyAmIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5JbkNoaWxkT3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChleHByIGluc3RhbmNlb2YgaXIuUmVhZFRlbXBvcmFyeUV4cHIpIHtcbiAgICAgICAgZmluYWxSZWFkcy5zZXQoZXhwci54cmVmLCBleHByKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE5hbWUgdGhlIHRlbXAgdmFycywgYWNjb3VudGluZyBmb3IgdGhlIGZhY3QgdGhhdCBhIG5hbWUgY2FuIGJlIHJldXNlZCBhZnRlciBpdCBoYXMgYmVlblxuICAgIC8vIHJlYWQgZm9yIHRoZSBmaW5hbCB0aW1lLlxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgY29uc3QgYXNzaWduZWQgPSBuZXcgU2V0PGlyLlhyZWZJZD4oKTtcbiAgICBjb25zdCByZWxlYXNlZCA9IG5ldyBTZXQ8aXIuWHJlZklkPigpO1xuICAgIGNvbnN0IGRlZnMgPSBuZXcgTWFwPGlyLlhyZWZJZCwgc3RyaW5nPigpO1xuICAgIGlyLnZpc2l0RXhwcmVzc2lvbnNJbk9wKG9wLCAoZXhwciwgZmxhZykgPT4ge1xuICAgICAgaWYgKGZsYWcgJiBpci5WaXNpdG9yQ29udGV4dEZsYWcuSW5DaGlsZE9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIGlyLkFzc2lnblRlbXBvcmFyeUV4cHIpIHtcbiAgICAgICAgaWYgKCFhc3NpZ25lZC5oYXMoZXhwci54cmVmKSkge1xuICAgICAgICAgIGFzc2lnbmVkLmFkZChleHByLnhyZWYpO1xuICAgICAgICAgIC8vIFRPRE86IEV4YWN0bHkgcmVwbGljYXRlIHRoZSBuYW1pbmcgc2NoZW1lIHVzZWQgYnkgYFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXJgLlxuICAgICAgICAgIC8vIEl0IHNlZW1zIHRvIHJlbHkgb24gYW4gZXhwcmVzc2lvbiBpbmRleCBpbnN0ZWFkIG9mIGFuIG9wIGluZGV4LlxuICAgICAgICAgIGRlZnMuc2V0KGV4cHIueHJlZiwgYHRtcF8ke29wQ291bnR9XyR7Y291bnQrK31gKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NpZ25OYW1lKGRlZnMsIGV4cHIpO1xuICAgICAgfSBlbHNlIGlmIChleHByIGluc3RhbmNlb2YgaXIuUmVhZFRlbXBvcmFyeUV4cHIpIHtcbiAgICAgICAgaWYgKGZpbmFsUmVhZHMuZ2V0KGV4cHIueHJlZikgPT09IGV4cHIpIHtcbiAgICAgICAgICByZWxlYXNlZC5hZGQoZXhwci54cmVmKTtcbiAgICAgICAgICBjb3VudC0tO1xuICAgICAgICB9XG4gICAgICAgIGFzc2lnbk5hbWUoZGVmcywgZXhwcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgZGVjbGFyYXRpb25zIGZvciB0aGUgdGVtcCB2YXJzLlxuICAgIGdlbmVyYXRlZFN0YXRlbWVudHMucHVzaChcbiAgICAgIC4uLkFycmF5LmZyb20obmV3IFNldChkZWZzLnZhbHVlcygpKSkubWFwKChuYW1lKSA9PlxuICAgICAgICBpci5jcmVhdGVTdGF0ZW1lbnRPcDxpci5VcGRhdGVPcD4obmV3IG8uRGVjbGFyZVZhclN0bXQobmFtZSkpLFxuICAgICAgKSxcbiAgICApO1xuICAgIG9wQ291bnQrKztcblxuICAgIGlmIChvcC5raW5kID09PSBpci5PcEtpbmQuTGlzdGVuZXIgfHwgb3Aua2luZCA9PT0gaXIuT3BLaW5kLlR3b1dheUxpc3RlbmVyKSB7XG4gICAgICBvcC5oYW5kbGVyT3BzLnByZXBlbmQoZ2VuZXJhdGVUZW1wb3JhcmllcyhvcC5oYW5kbGVyT3BzKSBhcyBpci5VcGRhdGVPcFtdKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVkU3RhdGVtZW50cztcbn1cblxuLyoqXG4gKiBBc3NpZ25zIGEgbmFtZSB0byB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlIGluIHRoZSBnaXZlbiB0ZW1wb3JhcnkgdmFyaWFibGUgZXhwcmVzc2lvbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduTmFtZShcbiAgbmFtZXM6IE1hcDxpci5YcmVmSWQsIHN0cmluZz4sXG4gIGV4cHI6IGlyLkFzc2lnblRlbXBvcmFyeUV4cHIgfCBpci5SZWFkVGVtcG9yYXJ5RXhwcixcbikge1xuICBjb25zdCBuYW1lID0gbmFtZXMuZ2V0KGV4cHIueHJlZik7XG4gIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIHhyZWYgd2l0aCB1bmFzc2lnbmVkIG5hbWU6ICR7ZXhwci54cmVmfWApO1xuICB9XG4gIGV4cHIubmFtZSA9IG5hbWU7XG59XG4iXX0=
@@ -1,52 +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 o from '../../../../output/output_ast';
9
- import * as ir from '../../ir';
10
- /**
11
- * Generate track functions that need to be extracted to the constant pool. This entails wrapping
12
- * them in an arrow (or traditional) function, replacing context reads with `this.`, and storing
13
- * them in the constant pool.
14
- *
15
- * Note that, if a track function was previously optimized, it will not need to be extracted, and
16
- * this phase is a no-op.
17
- */
18
- export function generateTrackFns(job) {
19
- for (const unit of job.units) {
20
- for (const op of unit.create) {
21
- if (op.kind !== ir.OpKind.RepeaterCreate) {
22
- continue;
23
- }
24
- if (op.trackByFn !== null) {
25
- // The final track function was already set, probably because it was optimized.
26
- continue;
27
- }
28
- // Find all component context reads.
29
- let usesComponentContext = false;
30
- op.track = ir.transformExpressionsInExpression(op.track, (expr) => {
31
- if (expr instanceof ir.PipeBindingExpr || expr instanceof ir.PipeBindingVariadicExpr) {
32
- throw new Error(`Illegal State: Pipes are not allowed in this context`);
33
- }
34
- if (expr instanceof ir.TrackContextExpr) {
35
- usesComponentContext = true;
36
- return o.variable('this');
37
- }
38
- return expr;
39
- }, ir.VisitorContextFlag.None);
40
- let fn;
41
- const fnParams = [new o.FnParam('$index'), new o.FnParam('$item')];
42
- if (usesComponentContext) {
43
- fn = new o.FunctionExpr(fnParams, [new o.ReturnStatement(op.track)]);
44
- }
45
- else {
46
- fn = o.arrowFn(fnParams, op.track);
47
- }
48
- op.trackByFn = job.pool.getSharedFunctionReference(fn, '_forTrack');
49
- }
50
- }
51
- }
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tfZm5fZ2VuZXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyL3NyYy90ZW1wbGF0ZS9waXBlbGluZS9zcmMvcGhhc2VzL3RyYWNrX2ZuX2dlbmVyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxLQUFLLENBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUkvQjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQW1CO0lBQ2xELEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN6QyxTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksRUFBRSxDQUFDLFNBQVMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDMUIsK0VBQStFO2dCQUMvRSxTQUFTO1lBQ1gsQ0FBQztZQUVELG9DQUFvQztZQUNwQyxJQUFJLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNqQyxFQUFFLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FDNUMsRUFBRSxDQUFDLEtBQUssRUFDUixDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNQLElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQyxlQUFlLElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO29CQUNyRixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7Z0JBQzFFLENBQUM7Z0JBQ0QsSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQUM7b0JBQ3hDLG9CQUFvQixHQUFHLElBQUksQ0FBQztvQkFDNUIsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QixDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQyxFQUNELEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQzNCLENBQUM7WUFFRixJQUFJLEVBQXdDLENBQUM7WUFFN0MsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDbkUsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO2dCQUN6QixFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFFRCxFQUFFLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBvIGZyb20gJy4uLy4uLy4uLy4uL291dHB1dC9vdXRwdXRfYXN0JztcbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcblxuaW1wb3J0IHR5cGUge0NvbXBpbGF0aW9uSm9ifSBmcm9tICcuLi9jb21waWxhdGlvbic7XG5cbi8qKlxuICogR2VuZXJhdGUgdHJhY2sgZnVuY3Rpb25zIHRoYXQgbmVlZCB0byBiZSBleHRyYWN0ZWQgdG8gdGhlIGNvbnN0YW50IHBvb2wuIFRoaXMgZW50YWlscyB3cmFwcGluZ1xuICogdGhlbSBpbiBhbiBhcnJvdyAob3IgdHJhZGl0aW9uYWwpIGZ1bmN0aW9uLCByZXBsYWNpbmcgY29udGV4dCByZWFkcyB3aXRoIGB0aGlzLmAsIGFuZCBzdG9yaW5nXG4gKiB0aGVtIGluIHRoZSBjb25zdGFudCBwb29sLlxuICpcbiAqIE5vdGUgdGhhdCwgaWYgYSB0cmFjayBmdW5jdGlvbiB3YXMgcHJldmlvdXNseSBvcHRpbWl6ZWQsIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgZXh0cmFjdGVkLCBhbmRcbiAqIHRoaXMgcGhhc2UgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVHJhY2tGbnMoam9iOiBDb21waWxhdGlvbkpvYik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LmNyZWF0ZSkge1xuICAgICAgaWYgKG9wLmtpbmQgIT09IGlyLk9wS2luZC5SZXBlYXRlckNyZWF0ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcC50cmFja0J5Rm4gIT09IG51bGwpIHtcbiAgICAgICAgLy8gVGhlIGZpbmFsIHRyYWNrIGZ1bmN0aW9uIHdhcyBhbHJlYWR5IHNldCwgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgb3B0aW1pemVkLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRmluZCBhbGwgY29tcG9uZW50IGNvbnRleHQgcmVhZHMuXG4gICAgICBsZXQgdXNlc0NvbXBvbmVudENvbnRleHQgPSBmYWxzZTtcbiAgICAgIG9wLnRyYWNrID0gaXIudHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24oXG4gICAgICAgIG9wLnRyYWNrLFxuICAgICAgICAoZXhwcikgPT4ge1xuICAgICAgICAgIGlmIChleHByIGluc3RhbmNlb2YgaXIuUGlwZUJpbmRpbmdFeHByIHx8IGV4cHIgaW5zdGFuY2VvZiBpci5QaXBlQmluZGluZ1ZhcmlhZGljRXhwcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbGxlZ2FsIFN0YXRlOiBQaXBlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBjb250ZXh0YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChleHByIGluc3RhbmNlb2YgaXIuVHJhY2tDb250ZXh0RXhwcikge1xuICAgICAgICAgICAgdXNlc0NvbXBvbmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIG8udmFyaWFibGUoJ3RoaXMnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICAgIH0sXG4gICAgICAgIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5Ob25lLFxuICAgICAgKTtcblxuICAgICAgbGV0IGZuOiBvLkZ1bmN0aW9uRXhwciB8IG8uQXJyb3dGdW5jdGlvbkV4cHI7XG5cbiAgICAgIGNvbnN0IGZuUGFyYW1zID0gW25ldyBvLkZuUGFyYW0oJyRpbmRleCcpLCBuZXcgby5GblBhcmFtKCckaXRlbScpXTtcbiAgICAgIGlmICh1c2VzQ29tcG9uZW50Q29udGV4dCkge1xuICAgICAgICBmbiA9IG5ldyBvLkZ1bmN0aW9uRXhwcihmblBhcmFtcywgW25ldyBvLlJldHVyblN0YXRlbWVudChvcC50cmFjayldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZuID0gby5hcnJvd0ZuKGZuUGFyYW1zLCBvcC50cmFjayk7XG4gICAgICB9XG5cbiAgICAgIG9wLnRyYWNrQnlGbiA9IGpvYi5wb29sLmdldFNoYXJlZEZ1bmN0aW9uUmVmZXJlbmNlKGZuLCAnX2ZvclRyYWNrJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,88 +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 o from '../../../../output/output_ast';
9
- import { Identifiers } from '../../../../render3/r3_identifiers';
10
- import * as ir from '../../ir';
11
- /**
12
- * `track` functions in `for` repeaters can sometimes be "optimized," i.e. transformed into inline
13
- * expressions, in lieu of an external function call. For example, tracking by `$index` can be be
14
- * optimized into an inline `trackByIndex` reference. This phase checks track expressions for
15
- * optimizable cases.
16
- */
17
- export function optimizeTrackFns(job) {
18
- for (const unit of job.units) {
19
- for (const op of unit.create) {
20
- if (op.kind !== ir.OpKind.RepeaterCreate) {
21
- continue;
22
- }
23
- if (op.track instanceof o.ReadVarExpr && op.track.name === '$index') {
24
- // Top-level access of `$index` uses the built in `repeaterTrackByIndex`.
25
- op.trackByFn = o.importExpr(Identifiers.repeaterTrackByIndex);
26
- }
27
- else if (op.track instanceof o.ReadVarExpr && op.track.name === '$item') {
28
- // Top-level access of the item uses the built in `repeaterTrackByIdentity`.
29
- op.trackByFn = o.importExpr(Identifiers.repeaterTrackByIdentity);
30
- }
31
- else if (isTrackByFunctionCall(job.root.xref, op.track)) {
32
- // Mark the function as using the component instance to play it safe
33
- // since the method might be using `this` internally (see #53628).
34
- op.usesComponentInstance = true;
35
- // Top-level method calls in the form of `fn($index, item)` can be passed in directly.
36
- if (op.track.receiver.receiver.view === unit.xref) {
37
- // TODO: this may be wrong
38
- op.trackByFn = op.track.receiver;
39
- }
40
- else {
41
- // This is a plain method call, but not in the component's root view.
42
- // We need to get the component instance, and then call the method on it.
43
- op.trackByFn = o
44
- .importExpr(Identifiers.componentInstance)
45
- .callFn([])
46
- .prop(op.track.receiver.name);
47
- // Because the context is not avaiable (without a special function), we don't want to
48
- // try to resolve it later. Let's get rid of it by overwriting the original track
49
- // expression (which won't be used anyway).
50
- op.track = op.trackByFn;
51
- }
52
- }
53
- else {
54
- // The track function could not be optimized.
55
- // Replace context reads with a special IR expression, since context reads in a track
56
- // function are emitted specially.
57
- op.track = ir.transformExpressionsInExpression(op.track, (expr) => {
58
- if (expr instanceof ir.ContextExpr) {
59
- op.usesComponentInstance = true;
60
- return new ir.TrackContextExpr(expr.view);
61
- }
62
- return expr;
63
- }, ir.VisitorContextFlag.None);
64
- }
65
- }
66
- }
67
- }
68
- function isTrackByFunctionCall(rootView, expr) {
69
- if (!(expr instanceof o.InvokeFunctionExpr) || expr.args.length === 0 || expr.args.length > 2) {
70
- return false;
71
- }
72
- if (!(expr.receiver instanceof o.ReadPropExpr && expr.receiver.receiver instanceof ir.ContextExpr) ||
73
- expr.receiver.receiver.view !== rootView) {
74
- return false;
75
- }
76
- const [arg0, arg1] = expr.args;
77
- if (!(arg0 instanceof o.ReadVarExpr) || arg0.name !== '$index') {
78
- return false;
79
- }
80
- else if (expr.args.length === 1) {
81
- return true;
82
- }
83
- if (!(arg1 instanceof o.ReadVarExpr) || arg1.name !== '$item') {
84
- return false;
85
- }
86
- return true;
87
- }
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tfZm5fb3B0aW1pemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvdHJhY2tfZm5fb3B0aW1pemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxDQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbkQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSS9COzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQW1CO0lBQ2xELEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN6QyxTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksRUFBRSxDQUFDLEtBQUssWUFBWSxDQUFDLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNwRSx5RUFBeUU7Z0JBQ3pFLEVBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNoRSxDQUFDO2lCQUFNLElBQUksRUFBRSxDQUFDLEtBQUssWUFBWSxDQUFDLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUMxRSw0RUFBNEU7Z0JBQzVFLEVBQUUsQ0FBQyxTQUFT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Q2QsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUM5RCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgbyBmcm9tICcuLi8uLi8uLi8uLi9vdXRwdXQvb3V0cHV0X2FzdCc7XG5pbXBvcnQge0lkZW50aWZpZXJzfSBmcm9tICcuLi8uLi8uLi8uLi9yZW5kZXIzL3IzX2lkZW50aWZpZXJzJztcbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcblxuaW1wb3J0IHR5cGUge0NvbXBpbGF0aW9uSm9ifSBmcm9tICcuLi9jb21waWxhdGlvbic7XG5cbi8qKlxuICogYHRyYWNrYCBmdW5jdGlvbnMgaW4gYGZvcmAgcmVwZWF0ZXJzIGNhbiBzb21ldGltZXMgYmUgXCJvcHRpbWl6ZWQsXCIgaS5lLiB0cmFuc2Zvcm1lZCBpbnRvIGlubGluZVxuICogZXhwcmVzc2lvbnMsIGluIGxpZXUgb2YgYW4gZXh0ZXJuYWwgZnVuY3Rpb24gY2FsbC4gRm9yIGV4YW1wbGUsIHRyYWNraW5nIGJ5IGAkaW5kZXhgIGNhbiBiZSBiZVxuICogb3B0aW1pemVkIGludG8gYW4gaW5saW5lIGB0cmFja0J5SW5kZXhgIHJlZmVyZW5jZS4gVGhpcyBwaGFzZSBjaGVja3MgdHJhY2sgZXhwcmVzc2lvbnMgZm9yXG4gKiBvcHRpbWl6YWJsZSBjYXNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGltaXplVHJhY2tGbnMoam9iOiBDb21waWxhdGlvbkpvYik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LmNyZWF0ZSkge1xuICAgICAgaWYgKG9wLmtpbmQgIT09IGlyLk9wS2luZC5SZXBlYXRlckNyZWF0ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcC50cmFjayBpbnN0YW5jZW9mIG8uUmVhZFZhckV4cHIgJiYgb3AudHJhY2submFtZSA9PT0gJyRpbmRleCcpIHtcbiAgICAgICAgLy8gVG9wLWxldmVsIGFjY2VzcyBvZiBgJGluZGV4YCB1c2VzIHRoZSBidWlsdCBpbiBgcmVwZWF0ZXJUcmFja0J5SW5kZXhgLlxuICAgICAgICBvcC50cmFja0J5Rm4gPSBvLmltcG9ydEV4cHIoSWRlbnRpZmllcnMucmVwZWF0ZXJUcmFja0J5SW5kZXgpO1xuICAgICAgfSBlbHNlIGlmIChvcC50cmFjayBpbnN0YW5jZW9mIG8uUmVhZFZhckV4cHIgJiYgb3AudHJhY2submFtZSA9PT0gJyRpdGVtJykge1xuICAgICAgICAvLyBUb3AtbGV2ZWwgYWNjZXNzIG9mIHRoZSBpdGVtIHVzZXMgdGhlIGJ1aWx0IGluIGByZXBlYXRlclRyYWNrQnlJZGVudGl0eWAuXG4gICAgICAgIG9wLnRyYWNrQnlGbiA9IG8uaW1wb3J0RXhwcihJZGVudGlmaWVycy5yZXBlYXRlclRyYWNrQnlJZGVudGl0eSk7XG4gICAgICB9IGVsc2UgaWYgKGlzVHJhY2tCeUZ1bmN0aW9uQ2FsbChqb2Iucm9vdC54cmVmLCBvcC50cmFjaykpIHtcbiAgICAgICAgLy8gTWFyayB0aGUgZnVuY3Rpb24gYXMgdXNpbmcgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0byBwbGF5IGl0IHNhZmVcbiAgICAgICAgLy8gc2luY2UgdGhlIG1ldGhvZCBtaWdodCBiZSB1c2luZyBgdGhpc2AgaW50ZXJuYWxseSAoc2VlICM1MzYyOCkuXG4gICAgICAgIG9wLnVzZXNDb21wb25lbnRJbnN0YW5jZSA9IHRydWU7XG5cbiAgICAgICAgLy8gVG9wLWxldmVsIG1ldGhvZCBjYWxscyBpbiB0aGUgZm9ybSBvZiBgZm4oJGluZGV4LCBpdGVtKWAgY2FuIGJlIHBhc3NlZCBpbiBkaXJlY3RseS5cbiAgICAgICAgaWYgKG9wLnRyYWNrLnJlY2VpdmVyLnJlY2VpdmVyLnZpZXcgPT09IHVuaXQueHJlZikge1xuICAgICAgICAgIC8vIFRPRE86IHRoaXMgbWF5IGJlIHdyb25nXG4gICAgICAgICAgb3AudHJhY2tCeUZuID0gb3AudHJhY2sucmVjZWl2ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIHBsYWluIG1ldGhvZCBjYWxsLCBidXQgbm90IGluIHRoZSBjb21wb25lbnQncyByb290IHZpZXcuXG4gICAgICAgICAgLy8gV2UgbmVlZCB0byBnZXQgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSwgYW5kIHRoZW4gY2FsbCB0aGUgbWV0aG9kIG9uIGl0LlxuICAgICAgICAgIG9wLnRyYWNrQnlGbiA9IG9cbiAgICAgICAgICAgIC5pbXBvcnRFeHByKElkZW50aWZpZXJzLmNvbXBvbmVudEluc3RhbmNlKVxuICAgICAgICAgICAgLmNhbGxGbihbXSlcbiAgICAgICAgICAgIC5wcm9wKG9wLnRyYWNrLnJlY2VpdmVyLm5hbWUpO1xuICAgICAgICAgIC8vIEJlY2F1c2UgdGhlIGNvbnRleHQgaXMgbm90IGF2YWlhYmxlICh3aXRob3V0IGEgc3BlY2lhbCBmdW5jdGlvbiksIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgICAvLyB0cnkgdG8gcmVzb2x2ZSBpdCBsYXRlci4gTGV0J3MgZ2V0IHJpZCBvZiBpdCBieSBvdmVyd3JpdGluZyB0aGUgb3JpZ2luYWwgdHJhY2tcbiAgICAgICAgICAvLyBleHByZXNzaW9uICh3aGljaCB3b24ndCBiZSB1c2VkIGFueXdheSkuXG4gICAgICAgICAgb3AudHJhY2sgPSBvcC50cmFja0J5Rm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSB0cmFjayBmdW5jdGlvbiBjb3VsZCBub3QgYmUgb3B0aW1pemVkLlxuICAgICAgICAvLyBSZXBsYWNlIGNvbnRleHQgcmVhZHMgd2l0aCBhIHNwZWNpYWwgSVIgZXhwcmVzc2lvbiwgc2luY2UgY29udGV4dCByZWFkcyBpbiBhIHRyYWNrXG4gICAgICAgIC8vIGZ1bmN0aW9uIGFyZSBlbWl0dGVkIHNwZWNpYWxseS5cbiAgICAgICAgb3AudHJhY2sgPSBpci50cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihcbiAgICAgICAgICBvcC50cmFjayxcbiAgICAgICAgICAoZXhwcikgPT4ge1xuICAgICAgICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBpci5Db250ZXh0RXhwcikge1xuICAgICAgICAgICAgICBvcC51c2VzQ29tcG9uZW50SW5zdGFuY2UgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IGlyLlRyYWNrQ29udGV4dEV4cHIoZXhwci52aWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBleHByO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaXIuVmlzaXRvckNvbnRleHRGbGFnLk5vbmUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVHJhY2tCeUZ1bmN0aW9uQ2FsbChcbiAgcm9vdFZpZXc6IGlyLlhyZWZJZCxcbiAgZXhwcjogby5FeHByZXNzaW9uLFxuKTogZXhwciBpcyBvLkludm9rZUZ1bmN0aW9uRXhwciAmIHtcbiAgcmVjZWl2ZXI6IG8uUmVhZFByb3BFeHByICYge1xuICAgIHJlY2VpdmVyOiBpci5Db250ZXh0RXhwcjtcbiAgfTtcbn0ge1xuICBpZiAoIShleHByIGluc3RhbmNlb2Ygby5JbnZva2VGdW5jdGlvbkV4cHIpIHx8IGV4cHIuYXJncy5sZW5ndGggPT09IDAgfHwgZXhwci5hcmdzLmxlbmd0aCA+IDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgIShcbiAgICAgIGV4cHIucmVjZWl2ZXIgaW5zdGFuY2VvZiBvLlJlYWRQcm9wRXhwciAmJiBleHByLnJlY2VpdmVyLnJlY2VpdmVyIGluc3RhbmNlb2YgaXIuQ29udGV4dEV4cHJcbiAgICApIHx8XG4gICAgZXhwci5yZWNlaXZlci5yZWNlaXZlci52aWV3ICE9PSByb290Vmlld1xuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBbYXJnMCwgYXJnMV0gPSBleHByLmFyZ3M7XG4gIGlmICghKGFyZzAgaW5zdGFuY2VvZiBvLlJlYWRWYXJFeHByKSB8fCBhcmcwLm5hbWUgIT09ICckaW5kZXgnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKGV4cHIuYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIShhcmcxIGluc3RhbmNlb2Ygby5SZWFkVmFyRXhwcikgfHwgYXJnMS5uYW1lICE9PSAnJGl0ZW0nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIl19
@@ -1,36 +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 o from '../../../../output/output_ast';
9
- import * as ir from '../../ir';
10
- /**
11
- * Inside the `track` expression on a `for` repeater, the `$index` and `$item` variables are
12
- * ambiently available. In this phase, we find those variable usages, and replace them with the
13
- * appropriate output read.
14
- */
15
- export function generateTrackVariables(job) {
16
- for (const unit of job.units) {
17
- for (const op of unit.create) {
18
- if (op.kind !== ir.OpKind.RepeaterCreate) {
19
- continue;
20
- }
21
- op.track = ir.transformExpressionsInExpression(op.track, (expr) => {
22
- if (expr instanceof ir.LexicalReadExpr) {
23
- if (op.varNames.$index.has(expr.name)) {
24
- return o.variable('$index');
25
- }
26
- else if (expr.name === op.varNames.$implicit) {
27
- return o.variable('$item');
28
- }
29
- // TODO: handle prohibited context variables (emit as globals?)
30
- }
31
- return expr;
32
- }, ir.VisitorContextFlag.None);
33
- }
34
- }
35
- }
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tfdmFyaWFibGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvdHJhY2tfdmFyaWFibGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxDQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJL0I7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxHQUFtQjtJQUN4RCxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDekMsU0FBUztZQUNYLENBQUM7WUFFRCxFQUFFLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FDNUMsRUFBRSxDQUFDLEtBQUssRUFDUixDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNQLElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDdkMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQ3RDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDOUIsQ0FBQzt5QkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDL0MsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM3QixDQUFDO29CQUVELCtEQUErRDtnQkFDakUsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUMsRUFDRCxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUMzQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIG8gZnJvbSAnLi4vLi4vLi4vLi4vb3V0cHV0L291dHB1dF9hc3QnO1xuaW1wb3J0ICogYXMgaXIgZnJvbSAnLi4vLi4vaXInO1xuXG5pbXBvcnQgdHlwZSB7Q29tcGlsYXRpb25Kb2J9IGZyb20gJy4uL2NvbXBpbGF0aW9uJztcblxuLyoqXG4gKiBJbnNpZGUgdGhlIGB0cmFja2AgZXhwcmVzc2lvbiBvbiBhIGBmb3JgIHJlcGVhdGVyLCB0aGUgYCRpbmRleGAgYW5kIGAkaXRlbWAgdmFyaWFibGVzIGFyZVxuICogYW1iaWVudGx5IGF2YWlsYWJsZS4gSW4gdGhpcyBwaGFzZSwgd2UgZmluZCB0aG9zZSB2YXJpYWJsZSB1c2FnZXMsIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGVcbiAqIGFwcHJvcHJpYXRlIG91dHB1dCByZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUcmFja1ZhcmlhYmxlcyhqb2I6IENvbXBpbGF0aW9uSm9iKTogdm9pZCB7XG4gIGZvciAoY29uc3QgdW5pdCBvZiBqb2IudW5pdHMpIHtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQuY3JlYXRlKSB7XG4gICAgICBpZiAob3Aua2luZCAhPT0gaXIuT3BLaW5kLlJlcGVhdGVyQ3JlYXRlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBvcC50cmFjayA9IGlyLnRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKFxuICAgICAgICBvcC50cmFjayxcbiAgICAgICAgKGV4cHIpID0+IHtcbiAgICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIGlyLkxleGljYWxSZWFkRXhwcikge1xuICAgICAgICAgICAgaWYgKG9wLnZhck5hbWVzLiRpbmRleC5oYXMoZXhwci5uYW1lKSkge1xuICAgICAgICAgICAgICByZXR1cm4gby52YXJpYWJsZSgnJGluZGV4Jyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV4cHIubmFtZSA9PT0gb3AudmFyTmFtZXMuJGltcGxpY2l0KSB7XG4gICAgICAgICAgICAgIHJldHVybiBvLnZhcmlhYmxlKCckaXRlbScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgcHJvaGliaXRlZCBjb250ZXh0IHZhcmlhYmxlcyAoZW1pdCBhcyBnbG9iYWxzPylcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICAgIH0sXG4gICAgICAgIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5Ob25lLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,43 +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 o from '../../../../output/output_ast';
9
- import * as ir from '../../ir';
10
- import * as ng from '../instruction';
11
- /**
12
- * Transforms a `TwoWayBindingSet` expression into an expression that either
13
- * sets a value through the `twoWayBindingSet` instruction or falls back to setting
14
- * the value directly. E.g. the expression `TwoWayBindingSet(target, value)` becomes:
15
- * `ng.twoWayBindingSet(target, value) || (target = value)`.
16
- */
17
- export function transformTwoWayBindingSet(job) {
18
- for (const unit of job.units) {
19
- for (const op of unit.create) {
20
- if (op.kind === ir.OpKind.TwoWayListener) {
21
- ir.transformExpressionsInOp(op, (expr) => {
22
- if (!(expr instanceof ir.TwoWayBindingSetExpr)) {
23
- return expr;
24
- }
25
- const { target, value } = expr;
26
- if (target instanceof o.ReadPropExpr || target instanceof o.ReadKeyExpr) {
27
- return ng.twoWayBindingSet(target, value).or(target.set(value));
28
- }
29
- // ASSUMPTION: here we're assuming that `ReadVariableExpr` will be a reference
30
- // to a local template variable. This appears to be the case at the time of writing.
31
- // If the expression is targeting a variable read, we only emit the `twoWayBindingSet`
32
- // since the fallback would be attempting to write into a constant. Invalid usages will be
33
- // flagged during template type checking.
34
- if (target instanceof ir.ReadVariableExpr) {
35
- return ng.twoWayBindingSet(target, value);
36
- }
37
- throw new Error(`Unsupported expression in two-way action binding.`);
38
- }, ir.VisitorContextFlag.InChildOperation);
39
- }
40
- }
41
- }
42
- }
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtX3R3b193YXlfYmluZGluZ19zZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvdGVtcGxhdGUvcGlwZWxpbmUvc3JjL3BoYXNlcy90cmFuc2Zvcm1fdHdvX3dheV9iaW5kaW5nX3NldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssQ0FBQyxNQUFNLCtCQUErQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHckM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsR0FBbUI7SUFDM0QsS0FBSyxNQUFNLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3pDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FDekIsRUFBRSxFQUNGLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ1AsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7d0JBQy9DLE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBRUQsTUFBTSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7b0JBRTdCLElBQUksTUFBTSxZQUFZLENBQUMsQ0FBQyxZQUFZLElBQUksTUFBTSxZQUFZLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDeEUsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ2xFLENBQUM7b0JBRUQsOEVBQThFO29CQUM5RSxvRkFBb0Y7b0JBQ3BGLHNGQUFzRjtvQkFDdEYsMEZBQTBGO29CQUMxRix5Q0FBeUM7b0JBQ3pDLElBQUksTUFBTSxZQUFZLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO3dCQUMxQyxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQzVDLENBQUM7b0JBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO2dCQUN2RSxDQUFDLEVBQ0QsRUFBRSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUN2QyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBvIGZyb20gJy4uLy4uLy4uLy4uL291dHB1dC9vdXRwdXRfYXN0JztcbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcbmltcG9ydCAqIGFzIG5nIGZyb20gJy4uL2luc3RydWN0aW9uJztcbmltcG9ydCB0eXBlIHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBgVHdvV2F5QmluZGluZ1NldGAgZXhwcmVzc2lvbiBpbnRvIGFuIGV4cHJlc3Npb24gdGhhdCBlaXRoZXJcbiAqIHNldHMgYSB2YWx1ZSB0aHJvdWdoIHRoZSBgdHdvV2F5QmluZGluZ1NldGAgaW5zdHJ1Y3Rpb24gb3IgZmFsbHMgYmFjayB0byBzZXR0aW5nXG4gKiB0aGUgdmFsdWUgZGlyZWN0bHkuIEUuZy4gdGhlIGV4cHJlc3Npb24gYFR3b1dheUJpbmRpbmdTZXQodGFyZ2V0LCB2YWx1ZSlgIGJlY29tZXM6XG4gKiBgbmcudHdvV2F5QmluZGluZ1NldCh0YXJnZXQsIHZhbHVlKSB8fCAodGFyZ2V0ID0gdmFsdWUpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVR3b1dheUJpbmRpbmdTZXQoam9iOiBDb21waWxhdGlvbkpvYik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LmNyZWF0ZSkge1xuICAgICAgaWYgKG9wLmtpbmQgPT09IGlyLk9wS2luZC5Ud29XYXlMaXN0ZW5lcikge1xuICAgICAgICBpci50cmFuc2Zvcm1FeHByZXNzaW9uc0luT3AoXG4gICAgICAgICAgb3AsXG4gICAgICAgICAgKGV4cHIpID0+IHtcbiAgICAgICAgICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBpci5Ud29XYXlCaW5kaW5nU2V0RXhwcikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHt0YXJnZXQsIHZhbHVlfSA9IGV4cHI7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBvLlJlYWRQcm9wRXhwciB8fCB0YXJnZXQgaW5zdGFuY2VvZiBvLlJlYWRLZXlFeHByKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZy50d29XYXlCaW5kaW5nU2V0KHRhcmdldCwgdmFsdWUpLm9yKHRhcmdldC5zZXQodmFsdWUpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQVNTVU1QVElPTjogaGVyZSB3ZSdyZSBhc3N1bWluZyB0aGF0IGBSZWFkVmFyaWFibGVFeHByYCB3aWxsIGJlIGEgcmVmZXJlbmNlXG4gICAgICAgICAgICAvLyB0byBhIGxvY2FsIHRlbXBsYXRlIHZhcmlhYmxlLiBUaGlzIGFwcGVhcnMgdG8gYmUgdGhlIGNhc2UgYXQgdGhlIHRpbWUgb2Ygd3JpdGluZy5cbiAgICAgICAgICAgIC8vIElmIHRoZSBleHByZXNzaW9uIGlzIHRhcmdldGluZyBhIHZhcmlhYmxlIHJlYWQsIHdlIG9ubHkgZW1pdCB0aGUgYHR3b1dheUJpbmRpbmdTZXRgXG4gICAgICAgICAgICAvLyBzaW5jZSB0aGUgZmFsbGJhY2sgd291bGQgYmUgYXR0ZW1wdGluZyB0byB3cml0ZSBpbnRvIGEgY29uc3RhbnQuIEludmFsaWQgdXNhZ2VzIHdpbGwgYmVcbiAgICAgICAgICAgIC8vIGZsYWdnZWQgZHVyaW5nIHRlbXBsYXRlIHR5cGUgY2hlY2tpbmcuXG4gICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgaXIuUmVhZFZhcmlhYmxlRXhwcikge1xuICAgICAgICAgICAgICByZXR1cm4gbmcudHdvV2F5QmluZGluZ1NldCh0YXJnZXQsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBleHByZXNzaW9uIGluIHR3by13YXkgYWN0aW9uIGJpbmRpbmcuYCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpci5WaXNpdG9yQ29udGV4dEZsYWcuSW5DaGlsZE9wZXJhdGlvbixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,155 +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 ir from '../../ir';
9
- import { ComponentCompilationJob } from '../compilation';
10
- /**
11
- * Counts the number of variable slots used within each view, and stores that on the view itself, as
12
- * well as propagates it to the `ir.TemplateOp` for embedded views.
13
- */
14
- export function countVariables(job) {
15
- // First, count the vars used in each view, and update the view-level counter.
16
- for (const unit of job.units) {
17
- let varCount = 0;
18
- // Count variables on top-level ops first. Don't explore nested expressions just yet.
19
- for (const op of unit.ops()) {
20
- if (ir.hasConsumesVarsTrait(op)) {
21
- varCount += varsUsedByOp(op);
22
- }
23
- }
24
- // Count variables on expressions inside ops. We do this later because some of these expressions
25
- // might be conditional (e.g. `pipeBinding` inside of a ternary), and we don't want to interfere
26
- // with indices for top-level binding slots (e.g. `property`).
27
- for (const op of unit.ops()) {
28
- ir.visitExpressionsInOp(op, (expr) => {
29
- if (!ir.isIrExpression(expr)) {
30
- return;
31
- }
32
- // TemplateDefinitionBuilder assigns variable offsets for everything but pure functions
33
- // first, and then assigns offsets to pure functions lazily. We emulate that behavior by
34
- // assigning offsets in two passes instead of one, only in compatibility mode.
35
- if (job.compatibility === ir.CompatibilityMode.TemplateDefinitionBuilder &&
36
- expr instanceof ir.PureFunctionExpr) {
37
- return;
38
- }
39
- // Some expressions require knowledge of the number of variable slots consumed.
40
- if (ir.hasUsesVarOffsetTrait(expr)) {
41
- expr.varOffset = varCount;
42
- }
43
- if (ir.hasConsumesVarsTrait(expr)) {
44
- varCount += varsUsedByIrExpression(expr);
45
- }
46
- });
47
- }
48
- // Compatibility mode pass for pure function offsets (as explained above).
49
- if (job.compatibility === ir.CompatibilityMode.TemplateDefinitionBuilder) {
50
- for (const op of unit.ops()) {
51
- ir.visitExpressionsInOp(op, (expr) => {
52
- if (!ir.isIrExpression(expr) || !(expr instanceof ir.PureFunctionExpr)) {
53
- return;
54
- }
55
- // Some expressions require knowledge of the number of variable slots consumed.
56
- if (ir.hasUsesVarOffsetTrait(expr)) {
57
- expr.varOffset = varCount;
58
- }
59
- if (ir.hasConsumesVarsTrait(expr)) {
60
- varCount += varsUsedByIrExpression(expr);
61
- }
62
- });
63
- }
64
- }
65
- unit.vars = varCount;
66
- }
67
- if (job instanceof ComponentCompilationJob) {
68
- // Add var counts for each view to the `ir.TemplateOp` which declares that view (if the view is
69
- // an embedded view).
70
- for (const unit of job.units) {
71
- for (const op of unit.create) {
72
- if (op.kind !== ir.OpKind.Template && op.kind !== ir.OpKind.RepeaterCreate) {
73
- continue;
74
- }
75
- const childView = job.views.get(op.xref);
76
- op.vars = childView.vars;
77
- // TODO: currently we handle the vars for the RepeaterCreate empty template in the reify
78
- // phase. We should handle that here instead.
79
- }
80
- }
81
- }
82
- }
83
- /**
84
- * Different operations that implement `ir.UsesVarsTrait` use different numbers of variables, so
85
- * count the variables used by any particular `op`.
86
- */
87
- function varsUsedByOp(op) {
88
- let slots;
89
- switch (op.kind) {
90
- case ir.OpKind.Property:
91
- case ir.OpKind.HostProperty:
92
- case ir.OpKind.Attribute:
93
- // All of these bindings use 1 variable slot, plus 1 slot for every interpolated expression,
94
- // if any.
95
- slots = 1;
96
- if (op.expression instanceof ir.Interpolation && !isSingletonInterpolation(op.expression)) {
97
- slots += op.expression.expressions.length;
98
- }
99
- return slots;
100
- case ir.OpKind.TwoWayProperty:
101
- // Two-way properties can only have expressions so they only need one variable slot.
102
- return 1;
103
- case ir.OpKind.StyleProp:
104
- case ir.OpKind.ClassProp:
105
- case ir.OpKind.StyleMap:
106
- case ir.OpKind.ClassMap:
107
- // Style & class bindings use 2 variable slots, plus 1 slot for every interpolated expression,
108
- // if any.
109
- slots = 2;
110
- if (op.expression instanceof ir.Interpolation) {
111
- slots += op.expression.expressions.length;
112
- }
113
- return slots;
114
- case ir.OpKind.InterpolateText:
115
- // `ir.InterpolateTextOp`s use a variable slot for each dynamic expression.
116
- return op.interpolation.expressions.length;
117
- case ir.OpKind.I18nExpression:
118
- case ir.OpKind.Conditional:
119
- case ir.OpKind.DeferWhen:
120
- case ir.OpKind.StoreLet:
121
- return 1;
122
- case ir.OpKind.RepeaterCreate:
123
- // Repeaters may require an extra variable binding slot, if they have an empty view, for the
124
- // empty block tracking.
125
- // TODO: It's a bit odd to have a create mode instruction consume variable slots. Maybe we can
126
- // find a way to use the Repeater update op instead.
127
- return op.emptyView ? 1 : 0;
128
- default:
129
- throw new Error(`Unhandled op: ${ir.OpKind[op.kind]}`);
130
- }
131
- }
132
- export function varsUsedByIrExpression(expr) {
133
- switch (expr.kind) {
134
- case ir.ExpressionKind.PureFunctionExpr:
135
- return 1 + expr.args.length;
136
- case ir.ExpressionKind.PipeBinding:
137
- return 1 + expr.args.length;
138
- case ir.ExpressionKind.PipeBindingVariadic:
139
- return 1 + expr.numArgs;
140
- case ir.ExpressionKind.StoreLet:
141
- return 1;
142
- default:
143
- throw new Error(`AssertionError: unhandled ConsumesVarsTrait expression ${expr.constructor.name}`);
144
- }
145
- }
146
- function isSingletonInterpolation(expr) {
147
- if (expr.expressions.length !== 1 || expr.strings.length !== 2) {
148
- return false;
149
- }
150
- if (expr.strings[0] !== '' || expr.strings[1] !== '') {
151
- return false;
152
- }
153
- return true;
154
- }
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyX2NvdW50aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvdmFyX2NvdW50aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2RTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQW1CO0lBQ2hELDhFQUE4RTtJQUM5RSxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFFakIscUZBQXFGO1FBQ3JGLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDNUIsSUFBSSxFQUFFLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsUUFBUSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvQixDQUFDO1FBQ0gsQ0FBQztRQUVELGdHQUFnRztRQUNoRyxnR0FBZ0c7UUFDaEcsOERBQThEO1FBQzlELEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDNUIsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNuQyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUM3QixPQUFPO2dCQUNULENBQUM7Z0JBRUQsdUZBQXVGO2dCQUN2Rix3RkFBd0Y7Z0JBQ3hGLDhFQUE4RTtnQkFDOUUsSUFDRSxHQUFHLENBQUMsYUFBYSxLQUFLLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyx5QkFBeUI7b0JBQ3BFLElBQUksWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEVBQ25DLENBQUM7b0JBQ0QsT0FBTztnQkFDVCxDQUFDO2dCQUVELCtFQUErRTtnQkFDL0UsSUFBSSxFQUFFLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7Z0JBQzVCLENBQUM7Z0JBRUQsSUFBSSxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDbEMsUUFBUSxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsMEVBQTBFO1FBQzFFLElBQUksR0FBRyxDQUFDLGFBQWEsS0FBSyxFQUFFLENBQUMsaUJBQWlCLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUN6RSxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO2dCQUM1QixFQUFFLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ25DLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQzt3QkFDdkUsT0FBTztvQkFDVCxDQUFDO29CQUVELCtFQUErRTtvQkFDL0UsSUFBSSxFQUFFLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3QkFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7b0JBQzVCLENBQUM7b0JBRUQsSUFBSSxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3QkFDbEMsUUFBUSxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMzQyxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxHQUFHLFlBQVksdUJBQXVCLEVBQUUsQ0FBQztRQUMzQywrRkFBK0Y7UUFDL0YscUJBQXFCO1FBQ3JCLEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdCLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM3QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUMzRSxTQUFTO2dCQUNYLENBQUM7Z0JBRUQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBRSxDQUFDO2dCQUMxQyxFQUFFLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBRXpCLHdGQUF3RjtnQkFDeEYsNkNBQTZDO1lBQy9DLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxFQUFzRDtJQUMxRSxJQUFJLEtBQWEsQ0FBQztJQUNsQixRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ3hCLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDNUIsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVM7WUFDdEIsNEZBQTRGO1lBQzVGLFVBQVU7WUFDVixLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxFQUFFLENBQUMsVUFBVSxZQUFZLEVBQUUsQ0FBQyxhQUFhLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDMUYsS0FBSyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUM1QyxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYztZQUMzQixvRkFBb0Y7WUFDcEYsT0FBTyxDQUFDLENBQUM7UUFDWCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ3pCLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDekIsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN4QixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUNyQiw4RkFBOEY7WUFDOUYsVUFBVTtZQUNWLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLEVBQUUsQ0FBQyxVQUFVLFlBQVksRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUM5QyxLQUFLLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQzVDLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxlQUFlO1lBQzVCLDJFQUEyRTtZQUMzRSxPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUM3QyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQzlCLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDM0IsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUN6QixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUNyQixPQUFPLENBQUMsQ0FBQztRQUNYLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjO1lBQzNCLDRGQUE0RjtZQUM1Rix3QkFBd0I7WUFDeEIsOEZBQThGO1lBQzlGLG9EQUFvRDtZQUNwRCxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBQTBDO0lBQy9FLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLEtBQUssRUFBRSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0I7WUFDckMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDOUIsS0FBSyxFQUFFLENBQUMsY0FBYyxDQUFDLFdBQVc7WUFDaEMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDOUIsS0FBSyxFQUFFLENBQUMsY0FBYyxDQUFDLG1CQUFtQjtZQUN4QyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzFCLEtBQUssRUFBRSxDQUFDLGNBQWMsQ0FBQyxRQUFRO1lBQzdCLE9BQU8sQ0FBQyxDQUFDO1FBQ1g7WUFDRSxNQUFNLElBQUksS0FBSyxDQUNiLDBEQUEwRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUNsRixDQUFDO0lBQ04sQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLHdCQUF3QixDQUFDLElBQXNCO0lBQ3RELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9ELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNyRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgaXIgZnJvbSAnLi4vLi4vaXInO1xuaW1wb3J0IHtDb21waWxhdGlvbkpvYiwgQ29tcG9uZW50Q29tcGlsYXRpb25Kb2J9IGZyb20gJy4uL2NvbXBpbGF0aW9uJztcblxuLyoqXG4gKiBDb3VudHMgdGhlIG51bWJlciBvZiB2YXJpYWJsZSBzbG90cyB1c2VkIHdpdGhpbiBlYWNoIHZpZXcsIGFuZCBzdG9yZXMgdGhhdCBvbiB0aGUgdmlldyBpdHNlbGYsIGFzXG4gKiB3ZWxsIGFzIHByb3BhZ2F0ZXMgaXQgdG8gdGhlIGBpci5UZW1wbGF0ZU9wYCBmb3IgZW1iZWRkZWQgdmlld3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudFZhcmlhYmxlcyhqb2I6IENvbXBpbGF0aW9uSm9iKTogdm9pZCB7XG4gIC8vIEZpcnN0LCBjb3VudCB0aGUgdmFycyB1c2VkIGluIGVhY2ggdmlldywgYW5kIHVwZGF0ZSB0aGUgdmlldy1sZXZlbCBjb3VudGVyLlxuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgbGV0IHZhckNvdW50ID0gMDtcblxuICAgIC8vIENvdW50IHZhcmlhYmxlcyBvbiB0b3AtbGV2ZWwgb3BzIGZpcnN0LiBEb24ndCBleHBsb3JlIG5lc3RlZCBleHByZXNzaW9ucyBqdXN0IHlldC5cbiAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQub3BzKCkpIHtcbiAgICAgIGlmIChpci5oYXNDb25zdW1lc1ZhcnNUcmFpdChvcCkpIHtcbiAgICAgICAgdmFyQ291bnQgKz0gdmFyc1VzZWRCeU9wKG9wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb3VudCB2YXJpYWJsZXMgb24gZXhwcmVzc2lvbnMgaW5zaWRlIG9wcy4gV2UgZG8gdGhpcyBsYXRlciBiZWNhdXNlIHNvbWUgb2YgdGhlc2UgZXhwcmVzc2lvbnNcbiAgICAvLyBtaWdodCBiZSBjb25kaXRpb25hbCAoZS5nLiBgcGlwZUJpbmRpbmdgIGluc2lkZSBvZiBhIHRlcm5hcnkpLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBpbnRlcmZlcmVcbiAgICAvLyB3aXRoIGluZGljZXMgZm9yIHRvcC1sZXZlbCBiaW5kaW5nIHNsb3RzIChlLmcuIGBwcm9wZXJ0eWApLlxuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5vcHMoKSkge1xuICAgICAgaXIudmlzaXRFeHByZXNzaW9uc0luT3Aob3AsIChleHByKSA9PiB7XG4gICAgICAgIGlmICghaXIuaXNJckV4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyIGFzc2lnbnMgdmFyaWFibGUgb2Zmc2V0cyBmb3IgZXZlcnl0aGluZyBidXQgcHVyZSBmdW5jdGlvbnNcbiAgICAgICAgLy8gZmlyc3QsIGFuZCB0aGVuIGFzc2lnbnMgb2Zmc2V0cyB0byBwdXJlIGZ1bmN0aW9ucyBsYXppbHkuIFdlIGVtdWxhdGUgdGhhdCBiZWhhdmlvciBieVxuICAgICAgICAvLyBhc3NpZ25pbmcgb2Zmc2V0cyBpbiB0d28gcGFzc2VzIGluc3RlYWQgb2Ygb25lLCBvbmx5IGluIGNvbXBhdGliaWxpdHkgbW9kZS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGpvYi5jb21wYXRpYmlsaXR5ID09PSBpci5Db21wYXRpYmlsaXR5TW9kZS5UZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyICYmXG4gICAgICAgICAgZXhwciBpbnN0YW5jZW9mIGlyLlB1cmVGdW5jdGlvbkV4cHJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29tZSBleHByZXNzaW9ucyByZXF1aXJlIGtub3dsZWRnZSBvZiB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlIHNsb3RzIGNvbnN1bWVkLlxuICAgICAgICBpZiAoaXIuaGFzVXNlc1Zhck9mZnNldFRyYWl0KGV4cHIpKSB7XG4gICAgICAgICAgZXhwci52YXJPZmZzZXQgPSB2YXJDb3VudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpci5oYXNDb25zdW1lc1ZhcnNUcmFpdChleHByKSkge1xuICAgICAgICAgIHZhckNvdW50ICs9IHZhcnNVc2VkQnlJckV4cHJlc3Npb24oZXhwcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvbXBhdGliaWxpdHkgbW9kZSBwYXNzIGZvciBwdXJlIGZ1bmN0aW9uIG9mZnNldHMgKGFzIGV4cGxhaW5lZCBhYm92ZSkuXG4gICAgaWYgKGpvYi5jb21wYXRpYmlsaXR5ID09PSBpci5Db21wYXRpYmlsaXR5TW9kZS5UZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyKSB7XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQub3BzKCkpIHtcbiAgICAgICAgaXIudmlzaXRFeHByZXNzaW9uc0luT3Aob3AsIChleHByKSA9PiB7XG4gICAgICAgICAgaWYgKCFpci5pc0lyRXhwcmVzc2lvbihleHByKSB8fCAhKGV4cHIgaW5zdGFuY2VvZiBpci5QdXJlRnVuY3Rpb25FeHByKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNvbWUgZXhwcmVzc2lvbnMgcmVxdWlyZSBrbm93bGVkZ2Ugb2YgdGhlIG51bWJlciBvZiB2YXJpYWJsZSBzbG90cyBjb25zdW1lZC5cbiAgICAgICAgICBpZiAoaXIuaGFzVXNlc1Zhck9mZnNldFRyYWl0KGV4cHIpKSB7XG4gICAgICAgICAgICBleHByLnZhck9mZnNldCA9IHZhckNvdW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpci5oYXNDb25zdW1lc1ZhcnNUcmFpdChleHByKSkge1xuICAgICAgICAgICAgdmFyQ291bnQgKz0gdmFyc1VzZWRCeUlyRXhwcmVzc2lvbihleHByKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHVuaXQudmFycyA9IHZhckNvdW50O1xuICB9XG5cbiAgaWYgKGpvYiBpbnN0YW5jZW9mIENvbXBvbmVudENvbXBpbGF0aW9uSm9iKSB7XG4gICAgLy8gQWRkIHZhciBjb3VudHMgZm9yIGVhY2ggdmlldyB0byB0aGUgYGlyLlRlbXBsYXRlT3BgIHdoaWNoIGRlY2xhcmVzIHRoYXQgdmlldyAoaWYgdGhlIHZpZXcgaXNcbiAgICAvLyBhbiBlbWJlZGRlZCB2aWV3KS5cbiAgICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQuY3JlYXRlKSB7XG4gICAgICAgIGlmIChvcC5raW5kICE9PSBpci5PcEtpbmQuVGVtcGxhdGUgJiYgb3Aua2luZCAhPT0gaXIuT3BLaW5kLlJlcGVhdGVyQ3JlYXRlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGlsZFZpZXcgPSBqb2Iudmlld3MuZ2V0KG9wLnhyZWYpITtcbiAgICAgICAgb3AudmFycyA9IGNoaWxkVmlldy52YXJzO1xuXG4gICAgICAgIC8vIFRPRE86IGN1cnJlbnRseSB3ZSBoYW5kbGUgdGhlIHZhcnMgZm9yIHRoZSBSZXBlYXRlckNyZWF0ZSBlbXB0eSB0ZW1wbGF0ZSBpbiB0aGUgcmVpZnlcbiAgICAgICAgLy8gcGhhc2UuIFdlIHNob3VsZCBoYW5kbGUgdGhhdCBoZXJlIGluc3RlYWQuXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGlmZmVyZW50IG9wZXJhdGlvbnMgdGhhdCBpbXBsZW1lbnQgYGlyLlVzZXNWYXJzVHJhaXRgIHVzZSBkaWZmZXJlbnQgbnVtYmVycyBvZiB2YXJpYWJsZXMsIHNvXG4gKiBjb3VudCB0aGUgdmFyaWFibGVzIHVzZWQgYnkgYW55IHBhcnRpY3VsYXIgYG9wYC5cbiAqL1xuZnVuY3Rpb24gdmFyc1VzZWRCeU9wKG9wOiAoaXIuQ3JlYXRlT3AgfCBpci5VcGRhdGVPcCkgJiBpci5Db25zdW1lc1ZhcnNUcmFpdCk6IG51bWJlciB7XG4gIGxldCBzbG90czogbnVtYmVyO1xuICBzd2l0Y2ggKG9wLmtpbmQpIHtcbiAgICBjYXNlIGlyLk9wS2luZC5Qcm9wZXJ0eTpcbiAgICBjYXNlIGlyLk9wS2luZC5Ib3N0UHJvcGVydHk6XG4gICAgY2FzZSBpci5PcEtpbmQuQXR0cmlidXRlOlxuICAgICAgLy8gQWxsIG9mIHRoZXNlIGJpbmRpbmdzIHVzZSAxIHZhcmlhYmxlIHNsb3QsIHBsdXMgMSBzbG90IGZvciBldmVyeSBpbnRlcnBvbGF0ZWQgZXhwcmVzc2lvbixcbiAgICAgIC8vIGlmIGFueS5cbiAgICAgIHNsb3RzID0gMTtcbiAgICAgIGlmIChvcC5leHByZXNzaW9uIGluc3RhbmNlb2YgaXIuSW50ZXJwb2xhdGlvbiAmJiAhaXNTaW5nbGV0b25JbnRlcnBvbGF0aW9uKG9wLmV4cHJlc3Npb24pKSB7XG4gICAgICAgIHNsb3RzICs9IG9wLmV4cHJlc3Npb24uZXhwcmVzc2lvbnMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNsb3RzO1xuICAgIGNhc2UgaXIuT3BLaW5kLlR3b1dheVByb3BlcnR5OlxuICAgICAgLy8gVHdvLXdheSBwcm9wZXJ0aWVzIGNhbiBvbmx5IGhhdmUgZXhwcmVzc2lvbnMgc28gdGhleSBvbmx5IG5lZWQgb25lIHZhcmlhYmxlIHNsb3QuXG4gICAgICByZXR1cm4gMTtcbiAgICBjYXNlIGlyLk9wS2luZC5TdHlsZVByb3A6XG4gICAgY2FzZSBpci5PcEtpbmQuQ2xhc3NQcm9wOlxuICAgIGNhc2UgaXIuT3BLaW5kLlN0eWxlTWFwOlxuICAgIGNhc2UgaXIuT3BLaW5kLkNsYXNzTWFwOlxuICAgICAgLy8gU3R5bGUgJiBjbGFzcyBiaW5kaW5ncyB1c2UgMiB2YXJpYWJsZSBzbG90cywgcGx1cyAxIHNsb3QgZm9yIGV2ZXJ5IGludGVycG9sYXRlZCBleHByZXNzaW9uLFxuICAgICAgLy8gaWYgYW55LlxuICAgICAgc2xvdHMgPSAyO1xuICAgICAgaWYgKG9wLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBpci5JbnRlcnBvbGF0aW9uKSB7XG4gICAgICAgIHNsb3RzICs9IG9wLmV4cHJlc3Npb24uZXhwcmVzc2lvbnMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNsb3RzO1xuICAgIGNhc2UgaXIuT3BLaW5kLkludGVycG9sYXRlVGV4dDpcbiAgICAgIC8vIGBpci5JbnRlcnBvbGF0ZVRleHRPcGBzIHVzZSBhIHZhcmlhYmxlIHNsb3QgZm9yIGVhY2ggZHluYW1pYyBleHByZXNzaW9uLlxuICAgICAgcmV0dXJuIG9wLmludGVycG9sYXRpb24uZXhwcmVzc2lvbnMubGVuZ3RoO1xuICAgIGNhc2UgaXIuT3BLaW5kLkkxOG5FeHByZXNzaW9uOlxuICAgIGNhc2UgaXIuT3BLaW5kLkNvbmRpdGlvbmFsOlxuICAgIGNhc2UgaXIuT3BLaW5kLkRlZmVyV2hlbjpcbiAgICBjYXNlIGlyLk9wS2luZC5TdG9yZUxldDpcbiAgICAgIHJldHVybiAxO1xuICAgIGNhc2UgaXIuT3BLaW5kLlJlcGVhdGVyQ3JlYXRlOlxuICAgICAgLy8gUmVwZWF0ZXJzIG1heSByZXF1aXJlIGFuIGV4dHJhIHZhcmlhYmxlIGJpbmRpbmcgc2xvdCwgaWYgdGhleSBoYXZlIGFuIGVtcHR5IHZpZXcsIGZvciB0aGVcbiAgICAgIC8vIGVtcHR5IGJsb2NrIHRyYWNraW5nLlxuICAgICAgLy8gVE9ETzogSXQncyBhIGJpdCBvZGQgdG8gaGF2ZSBhIGNyZWF0ZSBtb2RlIGluc3RydWN0aW9uIGNvbnN1bWUgdmFyaWFibGUgc2xvdHMuIE1heWJlIHdlIGNhblxuICAgICAgLy8gZmluZCBhIHdheSB0byB1c2UgdGhlIFJlcGVhdGVyIHVwZGF0ZSBvcCBpbnN0ZWFkLlxuICAgICAgcmV0dXJuIG9wLmVtcHR5VmlldyA/IDEgOiAwO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBvcDogJHtpci5PcEtpbmRbb3Aua2luZF19YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhcnNVc2VkQnlJckV4cHJlc3Npb24oZXhwcjogaXIuRXhwcmVzc2lvbiAmIGlyLkNvbnN1bWVzVmFyc1RyYWl0KTogbnVtYmVyIHtcbiAgc3dpdGNoIChleHByLmtpbmQpIHtcbiAgICBjYXNlIGlyLkV4cHJlc3Npb25LaW5kLlB1cmVGdW5jdGlvbkV4cHI6XG4gICAgICByZXR1cm4gMSArIGV4cHIuYXJncy5sZW5ndGg7XG4gICAgY2FzZSBpci5FeHByZXNzaW9uS2luZC5QaXBlQmluZGluZzpcbiAgICAgIHJldHVybiAxICsgZXhwci5hcmdzLmxlbmd0aDtcbiAgICBjYXNlIGlyLkV4cHJlc3Npb25LaW5kLlBpcGVCaW5kaW5nVmFyaWFkaWM6XG4gICAgICByZXR1cm4gMSArIGV4cHIubnVtQXJncztcbiAgICBjYXNlIGlyLkV4cHJlc3Npb25LaW5kLlN0b3JlTGV0OlxuICAgICAgcmV0dXJuIDE7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFzc2VydGlvbkVycm9yOiB1bmhhbmRsZWQgQ29uc3VtZXNWYXJzVHJhaXQgZXhwcmVzc2lvbiAke2V4cHIuY29uc3RydWN0b3IubmFtZX1gLFxuICAgICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NpbmdsZXRvbkludGVycG9sYXRpb24oZXhwcjogaXIuSW50ZXJwb2xhdGlvbik6IGJvb2xlYW4ge1xuICBpZiAoZXhwci5leHByZXNzaW9ucy5sZW5ndGggIT09IDEgfHwgZXhwci5zdHJpbmdzLmxlbmd0aCAhPT0gMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZXhwci5zdHJpbmdzWzBdICE9PSAnJyB8fCBleHByLnN0cmluZ3NbMV0gIT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIl19