@angular/compiler 17.0.0-next.1 → 17.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.
- package/esm2022/src/compiler.mjs +2 -2
- package/esm2022/src/compiler_util/expression_converter.mjs +22 -2
- package/esm2022/src/constant_pool.mjs +21 -2
- package/esm2022/src/output/abstract_emitter.mjs +1 -1
- package/esm2022/src/output/abstract_js_emitter.mjs +25 -1
- package/esm2022/src/output/output_ast.mjs +49 -3
- package/esm2022/src/render3/partial/class_metadata.mjs +1 -1
- package/esm2022/src/render3/partial/directive.mjs +1 -1
- package/esm2022/src/render3/partial/factory.mjs +1 -1
- package/esm2022/src/render3/partial/injectable.mjs +1 -1
- package/esm2022/src/render3/partial/injector.mjs +1 -1
- package/esm2022/src/render3/partial/ng_module.mjs +1 -1
- package/esm2022/src/render3/partial/pipe.mjs +1 -1
- package/esm2022/src/render3/r3_ast.mjs +1 -1
- package/esm2022/src/render3/r3_control_flow.mjs +7 -2
- package/esm2022/src/render3/r3_identifiers.mjs +6 -1
- package/esm2022/src/render3/view/compiler.mjs +26 -9
- package/esm2022/src/render3/view/template.mjs +215 -31
- package/esm2022/src/render3/view/util.mjs +2 -1
- package/esm2022/src/template/pipeline/ir/src/enums.mjs +41 -17
- package/esm2022/src/template/pipeline/ir/src/expression.mjs +69 -2
- package/esm2022/src/template/pipeline/ir/src/operations.mjs +13 -1
- package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +46 -25
- package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +3 -2
- package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +18 -2
- package/esm2022/src/template/pipeline/src/compilation.mjs +107 -87
- package/esm2022/src/template/pipeline/src/emit.mjs +69 -72
- package/esm2022/src/template/pipeline/src/ingest.mjs +93 -58
- package/esm2022/src/template/pipeline/src/instruction.mjs +27 -9
- package/esm2022/src/template/pipeline/src/phases/align_pipe_variadic_var_offset.mjs +4 -4
- package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +4 -4
- package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +34 -12
- package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +4 -5
- package/esm2022/src/template/pipeline/src/phases/chaining.mjs +4 -1
- package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +44 -0
- package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +49 -13
- package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +5 -4
- package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +5 -5
- package/esm2022/src/template/pipeline/src/phases/generate_i18n_blocks.mjs +38 -0
- package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +3 -3
- package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +10 -4
- package/esm2022/src/template/pipeline/src/phases/i18n_message_extraction.mjs +108 -0
- package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +32 -0
- package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +5 -5
- package/esm2022/src/template/pipeline/src/phases/namespace.mjs +3 -3
- package/esm2022/src/template/pipeline/src/phases/naming.mjs +19 -14
- package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +5 -5
- package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +4 -4
- package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +3 -3
- package/esm2022/src/template/pipeline/src/phases/ordering.mjs +97 -0
- package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +3 -3
- package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +9 -9
- package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +4 -4
- package/esm2022/src/template/pipeline/src/phases/reify.mjs +31 -3
- package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +6 -6
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_placeholders.mjs +63 -0
- package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +5 -5
- package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +8 -8
- package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +8 -8
- package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +3 -3
- package/esm2022/src/template/pipeline/src/util/elements.mjs +3 -3
- package/esm2022/src/version.mjs +1 -1
- package/fesm2022/compiler.mjs +10287 -9431
- package/fesm2022/compiler.mjs.map +1 -1
- package/fesm2022/testing.mjs +1 -1
- package/index.d.ts +28 -5
- package/package.json +2 -2
- package/testing/index.d.ts +1 -1
- package/esm2022/src/template/pipeline/src/phases/property_ordering.mjs +0 -99
package/fesm2022/testing.mjs
CHANGED
package/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v17.0.0-next.
|
|
2
|
+
* @license Angular v17.0.0-next.3
|
|
3
3
|
* (c) 2010-2022 Google LLC. https://angular.io/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -34,6 +34,19 @@ export declare class ArrayType extends Type {
|
|
|
34
34
|
visitType(visitor: TypeVisitor, context: any): any;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
declare function arrowFn(params: FnParam[], body: Expression | Statement[], type?: Type | null, sourceSpan?: ParseSourceSpan | null): ArrowFunctionExpr;
|
|
38
|
+
|
|
39
|
+
export declare class ArrowFunctionExpr extends Expression {
|
|
40
|
+
params: FnParam[];
|
|
41
|
+
body: Expression | Statement[];
|
|
42
|
+
constructor(params: FnParam[], body: Expression | Statement[], type?: Type | null, sourceSpan?: ParseSourceSpan | null);
|
|
43
|
+
isEquivalent(e: Expression): boolean;
|
|
44
|
+
isConstant(): boolean;
|
|
45
|
+
visitExpression(visitor: ExpressionVisitor, context: any): any;
|
|
46
|
+
clone(): Expression;
|
|
47
|
+
toDeclStmt(name: string, modifiers?: StmtModifier): DeclareVarStmt;
|
|
48
|
+
}
|
|
49
|
+
|
|
37
50
|
export declare abstract class AST {
|
|
38
51
|
span: ParseSpan;
|
|
39
52
|
/**
|
|
@@ -774,6 +787,7 @@ export declare class ConstantPool {
|
|
|
774
787
|
literalFactory: outputAst.Expression;
|
|
775
788
|
literalFactoryArguments: outputAst.Expression[];
|
|
776
789
|
};
|
|
790
|
+
getSharedFunctionReference(fn: outputAst.FunctionExpr | outputAst.ArrowFunctionExpr, prefix: string): outputAst.Expression;
|
|
777
791
|
private _getLiteralFactory;
|
|
778
792
|
/**
|
|
779
793
|
* Produce a unique name.
|
|
@@ -1291,6 +1305,7 @@ export declare interface ExpressionVisitor {
|
|
|
1291
1305
|
visitCommaExpr(ast: CommaExpr, context: any): any;
|
|
1292
1306
|
visitWrappedNodeExpr(ast: WrappedNodeExpr<any>, context: any): any;
|
|
1293
1307
|
visitTypeofExpr(ast: TypeofExpr, context: any): any;
|
|
1308
|
+
visitArrowFunctionExpr(ast: ArrowFunctionExpr, context: any): any;
|
|
1294
1309
|
}
|
|
1295
1310
|
|
|
1296
1311
|
export declare class ExternalExpr extends Expression {
|
|
@@ -1368,7 +1383,7 @@ export declare class FunctionExpr extends Expression {
|
|
|
1368
1383
|
statements: Statement[];
|
|
1369
1384
|
name?: string | null | undefined;
|
|
1370
1385
|
constructor(params: FnParam[], statements: Statement[], type?: Type | null, sourceSpan?: ParseSourceSpan | null, name?: string | null | undefined);
|
|
1371
|
-
isEquivalent(e: Expression): boolean;
|
|
1386
|
+
isEquivalent(e: Expression | Statement): boolean;
|
|
1372
1387
|
isConstant(): boolean;
|
|
1373
1388
|
visitExpression(visitor: ExpressionVisitor, context: any): any;
|
|
1374
1389
|
toDeclStmt(name: string, modifiers?: StmtModifier): DeclareFunctionStmt;
|
|
@@ -2042,6 +2057,7 @@ declare namespace outputAst {
|
|
|
2042
2057
|
unary,
|
|
2043
2058
|
not,
|
|
2044
2059
|
fn,
|
|
2060
|
+
arrowFn,
|
|
2045
2061
|
ifStmt,
|
|
2046
2062
|
taggedTemplate,
|
|
2047
2063
|
literal,
|
|
@@ -2091,6 +2107,7 @@ declare namespace outputAst {
|
|
|
2091
2107
|
NotExpr,
|
|
2092
2108
|
FnParam,
|
|
2093
2109
|
FunctionExpr,
|
|
2110
|
+
ArrowFunctionExpr,
|
|
2094
2111
|
UnaryOperatorExpr,
|
|
2095
2112
|
BinaryOperatorExpr,
|
|
2096
2113
|
ReadPropExpr,
|
|
@@ -3729,6 +3746,11 @@ export declare class R3Identifiers {
|
|
|
3729
3746
|
static deferPrefetchOnInteraction: outputAst.ExternalReference;
|
|
3730
3747
|
static deferPrefetchOnViewport: outputAst.ExternalReference;
|
|
3731
3748
|
static conditional: outputAst.ExternalReference;
|
|
3749
|
+
static repeater: outputAst.ExternalReference;
|
|
3750
|
+
static repeaterCreate: outputAst.ExternalReference;
|
|
3751
|
+
static repeaterTrackByIndex: outputAst.ExternalReference;
|
|
3752
|
+
static repeaterTrackByIdentity: outputAst.ExternalReference;
|
|
3753
|
+
static componentInstance: outputAst.ExternalReference;
|
|
3732
3754
|
static text: outputAst.ExternalReference;
|
|
3733
3755
|
static enableBindings: outputAst.ExternalReference;
|
|
3734
3756
|
static disableBindings: outputAst.ExternalReference;
|
|
@@ -4259,6 +4281,7 @@ declare class RecursiveAstVisitor_2 implements StatementVisitor, ExpressionVisit
|
|
|
4259
4281
|
visitConditionalExpr(ast: ConditionalExpr, context: any): any;
|
|
4260
4282
|
visitNotExpr(ast: NotExpr, context: any): any;
|
|
4261
4283
|
visitFunctionExpr(ast: FunctionExpr, context: any): any;
|
|
4284
|
+
visitArrowFunctionExpr(ast: ArrowFunctionExpr, context: any): any;
|
|
4262
4285
|
visitUnaryOperatorExpr(ast: UnaryOperatorExpr, context: any): any;
|
|
4263
4286
|
visitBinaryOperatorExpr(ast: BinaryOperatorExpr, context: any): any;
|
|
4264
4287
|
visitReadPropExpr(ast: ReadPropExpr, context: any): any;
|
|
@@ -4811,15 +4834,15 @@ export declare class TmplAstElement implements TmplAstNode {
|
|
|
4811
4834
|
|
|
4812
4835
|
export declare class TmplAstForLoopBlock implements TmplAstNode {
|
|
4813
4836
|
itemName: string;
|
|
4814
|
-
expression:
|
|
4815
|
-
trackBy:
|
|
4837
|
+
expression: ASTWithSource;
|
|
4838
|
+
trackBy: ASTWithSource;
|
|
4816
4839
|
contextVariables: ForLoopBlockContext | null;
|
|
4817
4840
|
children: TmplAstNode[];
|
|
4818
4841
|
empty: TmplAstForLoopBlockEmpty | null;
|
|
4819
4842
|
sourceSpan: ParseSourceSpan;
|
|
4820
4843
|
startSourceSpan: ParseSourceSpan;
|
|
4821
4844
|
endSourceSpan: ParseSourceSpan | null;
|
|
4822
|
-
constructor(itemName: string, expression:
|
|
4845
|
+
constructor(itemName: string, expression: ASTWithSource, trackBy: ASTWithSource, contextVariables: ForLoopBlockContext | null, children: TmplAstNode[], empty: TmplAstForLoopBlockEmpty | null, sourceSpan: ParseSourceSpan, startSourceSpan: ParseSourceSpan, endSourceSpan: ParseSourceSpan | null);
|
|
4823
4846
|
visit<Result>(visitor: Visitor_3<Result>): Result;
|
|
4824
4847
|
}
|
|
4825
4848
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@angular/compiler",
|
|
3
|
-
"version": "17.0.0-next.
|
|
3
|
+
"version": "17.0.0-next.3",
|
|
4
4
|
"description": "Angular - the compiler library",
|
|
5
5
|
"author": "angular",
|
|
6
6
|
"license": "MIT",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"tslib": "^2.3.0"
|
|
12
12
|
},
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"@angular/core": "17.0.0-next.
|
|
14
|
+
"@angular/core": "17.0.0-next.3"
|
|
15
15
|
},
|
|
16
16
|
"peerDependenciesMeta": {
|
|
17
17
|
"@angular/core": {
|
package/testing/index.d.ts
CHANGED
|
@@ -1,99 +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
|
-
function kindTest(kind) {
|
|
10
|
-
return (op) => op.kind === kind;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Defines the groups based on `OpKind` that ops will be divided into. Ops will be collected into
|
|
14
|
-
* groups, then optionally transformed, before recombining the groups in the order defined here.
|
|
15
|
-
*/
|
|
16
|
-
const ORDERING = [
|
|
17
|
-
{ test: kindTest(ir.OpKind.StyleMap), transform: keepLast },
|
|
18
|
-
{ test: kindTest(ir.OpKind.ClassMap), transform: keepLast },
|
|
19
|
-
{ test: kindTest(ir.OpKind.StyleProp) },
|
|
20
|
-
{ test: kindTest(ir.OpKind.ClassProp) },
|
|
21
|
-
{
|
|
22
|
-
test: (op) => (op.kind === ir.OpKind.Property || op.kind === ir.OpKind.HostProperty) &&
|
|
23
|
-
op.expression instanceof ir.Interpolation
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
test: (op) => (op.kind === ir.OpKind.Property || op.kind === ir.OpKind.HostProperty) &&
|
|
27
|
-
!(op.expression instanceof ir.Interpolation)
|
|
28
|
-
},
|
|
29
|
-
{ test: kindTest(ir.OpKind.Attribute) },
|
|
30
|
-
];
|
|
31
|
-
/**
|
|
32
|
-
* The set of all op kinds we handle in the reordering phase.
|
|
33
|
-
*/
|
|
34
|
-
const handledOpKinds = new Set([
|
|
35
|
-
ir.OpKind.StyleMap,
|
|
36
|
-
ir.OpKind.ClassMap,
|
|
37
|
-
ir.OpKind.StyleProp,
|
|
38
|
-
ir.OpKind.ClassProp,
|
|
39
|
-
ir.OpKind.Property,
|
|
40
|
-
ir.OpKind.HostProperty,
|
|
41
|
-
ir.OpKind.Attribute,
|
|
42
|
-
]);
|
|
43
|
-
/**
|
|
44
|
-
* Reorders property and attribute ops according to the following ordering:
|
|
45
|
-
* 1. styleMap & styleMapInterpolate (drops all but the last op in the group)
|
|
46
|
-
* 2. classMap & classMapInterpolate (drops all but the last op in the group)
|
|
47
|
-
* 3. styleProp & stylePropInterpolate (ordering preserved within group)
|
|
48
|
-
* 4. classProp (ordering preserved within group)
|
|
49
|
-
* 5. propertyInterpolate (ordering preserved within group)
|
|
50
|
-
* 6. property (ordering preserved within group)
|
|
51
|
-
* 7. attribute & attributeInterpolate (ordering preserve within group)
|
|
52
|
-
*/
|
|
53
|
-
export function phasePropertyOrdering(cpl) {
|
|
54
|
-
for (const unit of cpl.units) {
|
|
55
|
-
let opsToOrder = [];
|
|
56
|
-
for (const op of unit.update) {
|
|
57
|
-
if (handledOpKinds.has(op.kind)) {
|
|
58
|
-
// Pull out ops that need o be ordered.
|
|
59
|
-
opsToOrder.push(op);
|
|
60
|
-
ir.OpList.remove(op);
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
// When we encounter an op that shouldn't be reordered, put the ones we've pulled so far
|
|
64
|
-
// back in the correct order.
|
|
65
|
-
for (const orderedOp of reorder(opsToOrder)) {
|
|
66
|
-
ir.OpList.insertBefore(orderedOp, op);
|
|
67
|
-
}
|
|
68
|
-
opsToOrder = [];
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
// If we still have ops pulled at the end, put them back in the correct order.
|
|
72
|
-
for (const orderedOp of reorder(opsToOrder)) {
|
|
73
|
-
unit.update.push(orderedOp);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Reorders the given list of ops according to the ordering defined by `ORDERING`.
|
|
79
|
-
*/
|
|
80
|
-
function reorder(ops) {
|
|
81
|
-
// Break the ops list into groups based on OpKind.
|
|
82
|
-
const groups = Array.from(ORDERING, () => new Array());
|
|
83
|
-
for (const op of ops) {
|
|
84
|
-
const groupIndex = ORDERING.findIndex(o => o.test(op));
|
|
85
|
-
groups[groupIndex].push(op);
|
|
86
|
-
}
|
|
87
|
-
// Reassemble the groups into a single list, in the correct order.
|
|
88
|
-
return groups.flatMap((group, i) => {
|
|
89
|
-
const transform = ORDERING[i].transform;
|
|
90
|
-
return transform ? transform(group) : group;
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Keeps only the last op in a list of ops.
|
|
95
|
-
*/
|
|
96
|
-
function keepLast(ops) {
|
|
97
|
-
return ops.slice(ops.length - 1);
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHlfb3JkZXJpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvdGVtcGxhdGUvcGlwZWxpbmUvc3JjL3BoYXNlcy9wcm9wZXJ0eV9vcmRlcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQixTQUFTLFFBQVEsQ0FBQyxJQUFlO0lBQy9CLE9BQU8sQ0FBQyxFQUFlLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDO0FBQy9DLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFFBQVEsR0FJVjtJQUNFLEVBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUM7SUFDekQsRUFBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBQztJQUN6RCxFQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQztJQUNyQyxFQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQztJQUNyQztRQUNFLElBQUksRUFBRSxDQUFDLEVBQWUsRUFBRSxFQUFFLENBQ3RCLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1lBQ3RFLEVBQUUsQ0FBQyxVQUFVLFlBQVksRUFBRSxDQUFDLGFBQWE7S0FDOUM7SUFDRDtRQUNFLElBQUks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QUVEOztHQUVHO0FBQ0gsU0FBUyxRQUFRLENBQUksR0FBYTtJQUNoQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcbmltcG9ydCB0eXBlIHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG5mdW5jdGlvbiBraW5kVGVzdChraW5kOiBpci5PcEtpbmQpOiAob3A6IGlyLlVwZGF0ZU9wKSA9PiBib29sZWFuIHtcbiAgcmV0dXJuIChvcDogaXIuVXBkYXRlT3ApID0+IG9wLmtpbmQgPT09IGtpbmQ7XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZ3JvdXBzIGJhc2VkIG9uIGBPcEtpbmRgIHRoYXQgb3BzIHdpbGwgYmUgZGl2aWRlZCBpbnRvLiBPcHMgd2lsbCBiZSBjb2xsZWN0ZWQgaW50b1xuICogZ3JvdXBzLCB0aGVuIG9wdGlvbmFsbHkgdHJhbnNmb3JtZWQsIGJlZm9yZSByZWNvbWJpbmluZyB0aGUgZ3JvdXBzIGluIHRoZSBvcmRlciBkZWZpbmVkIGhlcmUuXG4gKi9cbmNvbnN0IE9SREVSSU5HOiB7XG4gIHRlc3Q6IChvcDogaXIuVXBkYXRlT3ApID0+IGJvb2xlYW4sXG4gIHRyYW5zZm9ybT86IChvcHM6IEFycmF5PGlyLlVwZGF0ZU9wPikgPT4gQXJyYXk8aXIuVXBkYXRlT3A+XG59W10gPVxuICAgIFtcbiAgICAgIHt0ZXN0OiBraW5kVGVzdChpci5PcEtpbmQuU3R5bGVNYXApLCB0cmFuc2Zvcm06IGtlZXBMYXN0fSxcbiAgICAgIHt0ZXN0OiBraW5kVGVzdChpci5PcEtpbmQuQ2xhc3NNYXApLCB0cmFuc2Zvcm06IGtlZXBMYXN0fSxcbiAgICAgIHt0ZXN0OiBraW5kVGVzdChpci5PcEtpbmQuU3R5bGVQcm9wKX0sXG4gICAgICB7dGVzdDoga2luZFRlc3QoaXIuT3BLaW5kLkNsYXNzUHJvcCl9LFxuICAgICAge1xuICAgICAgICB0ZXN0OiAob3A6IGlyLlVwZGF0ZU9wKSA9PlxuICAgICAgICAgICAgKG9wLmtpbmQgPT09IGlyLk9wS2luZC5Qcm9wZXJ0eSB8fCBvcC5raW5kID09PSBpci5PcEtpbmQuSG9zdFByb3BlcnR5KSAmJlxuICAgICAgICAgICAgb3AuZXhwcmVzc2lvbiBpbnN0YW5jZW9mIGlyLkludGVycG9sYXRpb25cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRlc3Q6IChvcDogaXIuVXBkYXRlT3ApID0+XG4gICAgICAgICAgICAob3Aua2luZCA9PT0gaXIuT3BLaW5kLlByb3BlcnR5IHx8IG9wLmtpbmQgPT09IGlyLk9wS2luZC5Ib3N0UHJvcGVydHkpICYmXG4gICAgICAgICAgICAhKG9wLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBpci5JbnRlcnBvbGF0aW9uKVxuICAgICAgfSxcbiAgICAgIHt0ZXN0OiBraW5kVGVzdChpci5PcEtpbmQuQXR0cmlidXRlKX0sXG4gICAgXTtcblxuLyoqXG4gKiBUaGUgc2V0IG9mIGFsbCBvcCBraW5kcyB3ZSBoYW5kbGUgaW4gdGhlIHJlb3JkZXJpbmcgcGhhc2UuXG4gKi9cbmNvbnN0IGhhbmRsZWRPcEtpbmRzID0gbmV3IFNldChbXG4gIGlyLk9wS2luZC5TdHlsZU1hcCxcbiAgaXIuT3BLaW5kLkNsYXNzTWFwLFxuICBpci5PcEtpbmQuU3R5bGVQcm9wLFxuICBpci5PcEtpbmQuQ2xhc3NQcm9wLFxuICBpci5PcEtpbmQuUHJvcGVydHksXG4gIGlyLk9wS2luZC5Ib3N0UHJvcGVydHksXG4gIGlyLk9wS2luZC5BdHRyaWJ1dGUsXG5dKTtcblxuLyoqXG4gKiBSZW9yZGVycyBwcm9wZXJ0eSBhbmQgYXR0cmlidXRlIG9wcyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBvcmRlcmluZzpcbiAqIDEuIHN0eWxlTWFwICYgc3R5bGVNYXBJbnRlcnBvbGF0ZSAoZHJvcHMgYWxsIGJ1dCB0aGUgbGFzdCBvcCBpbiB0aGUgZ3JvdXApXG4gKiAyLiBjbGFzc01hcCAmIGNsYXNzTWFwSW50ZXJwb2xhdGUgKGRyb3BzIGFsbCBidXQgdGhlIGxhc3Qgb3AgaW4gdGhlIGdyb3VwKVxuICogMy4gc3R5bGVQcm9wICYgc3R5bGVQcm9wSW50ZXJwb2xhdGUgKG9yZGVyaW5nIHByZXNlcnZlZCB3aXRoaW4gZ3JvdXApXG4gKiA0LiBjbGFzc1Byb3AgKG9yZGVyaW5nIHByZXNlcnZlZCB3aXRoaW4gZ3JvdXApXG4gKiA1LiBwcm9wZXJ0eUludGVycG9sYXRlIChvcmRlcmluZyBwcmVzZXJ2ZWQgd2l0aGluIGdyb3VwKVxuICogNi4gcHJvcGVydHkgKG9yZGVyaW5nIHByZXNlcnZlZCB3aXRoaW4gZ3JvdXApXG4gKiA3LiBhdHRyaWJ1dGUgJiBhdHRyaWJ1dGVJbnRlcnBvbGF0ZSAob3JkZXJpbmcgcHJlc2VydmUgd2l0aGluIGdyb3VwKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGhhc2VQcm9wZXJ0eU9yZGVyaW5nKGNwbDogQ29tcGlsYXRpb25Kb2IpIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGNwbC51bml0cykge1xuICAgIGxldCBvcHNUb09yZGVyID0gW107XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LnVwZGF0ZSkge1xuICAgICAgaWYgKGhhbmRsZWRPcEtpbmRzLmhhcyhvcC5raW5kKSkge1xuICAgICAgICAvLyBQdWxsIG91dCBvcHMgdGhhdCBuZWVkIG8gYmUgb3JkZXJlZC5cbiAgICAgICAgb3BzVG9PcmRlci5wdXNoKG9wKTtcbiAgICAgICAgaXIuT3BMaXN0LnJlbW92ZShvcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXaGVuIHdlIGVuY291bnRlciBhbiBvcCB0aGF0IHNob3VsZG4ndCBiZSByZW9yZGVyZWQsIHB1dCB0aGUgb25lcyB3ZSd2ZSBwdWxsZWQgc28gZmFyXG4gICAgICAgIC8vIGJhY2sgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG4gICAgICAgIGZvciAoY29uc3Qgb3JkZXJlZE9wIG9mIHJlb3JkZXIob3BzVG9PcmRlcikpIHtcbiAgICAgICAgICBpci5PcExpc3QuaW5zZXJ0QmVmb3JlKG9yZGVyZWRPcCwgb3ApO1xuICAgICAgICB9XG4gICAgICAgIG9wc1RvT3JkZXIgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBvcHMgcHVsbGVkIGF0IHRoZSBlbmQsIHB1dCB0aGVtIGJhY2sgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG4gICAgZm9yIChjb25zdCBvcmRlcmVkT3Agb2YgcmVvcmRlcihvcHNUb09yZGVyKSkge1xuICAgICAgdW5pdC51cGRhdGUucHVzaChvcmRlcmVkT3ApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlb3JkZXJzIHRoZSBnaXZlbiBsaXN0IG9mIG9wcyBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyaW5nIGRlZmluZWQgYnkgYE9SREVSSU5HYC5cbiAqL1xuZnVuY3Rpb24gcmVvcmRlcihvcHM6IEFycmF5PGlyLlVwZGF0ZU9wPik6IEFycmF5PGlyLlVwZGF0ZU9wPiB7XG4gIC8vIEJyZWFrIHRoZSBvcHMgbGlzdCBpbnRvIGdyb3VwcyBiYXNlZCBvbiBPcEtpbmQuXG4gIGNvbnN0IGdyb3VwcyA9IEFycmF5LmZyb20oT1JERVJJTkcsICgpID0+IG5ldyBBcnJheTxpci5VcGRhdGVPcD4oKSk7XG4gIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7XG4gICAgY29uc3QgZ3JvdXBJbmRleCA9IE9SREVSSU5HLmZpbmRJbmRleChvID0+IG8udGVzdChvcCkpO1xuICAgIGdyb3Vwc1tncm91cEluZGV4XS5wdXNoKG9wKTtcbiAgfVxuICAvLyBSZWFzc2VtYmxlIHRoZSBncm91cHMgaW50byBhIHNpbmdsZSBsaXN0LCBpbiB0aGUgY29ycmVjdCBvcmRlci5cbiAgcmV0dXJuIGdyb3Vwcy5mbGF0TWFwKChncm91cCwgaSkgPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IE9SREVSSU5HW2ldLnRyYW5zZm9ybTtcbiAgICByZXR1cm4gdHJhbnNmb3JtID8gdHJhbnNmb3JtKGdyb3VwKSA6IGdyb3VwO1xuICB9KTtcbn1cblxuLyoqXG4gKiBLZWVwcyBvbmx5IHRoZSBsYXN0IG9wIGluIGEgbGlzdCBvZiBvcHMuXG4gKi9cbmZ1bmN0aW9uIGtlZXBMYXN0PFQ+KG9wczogQXJyYXk8VD4pIHtcbiAgcmV0dXJuIG9wcy5zbGljZShvcHMubGVuZ3RoIC0gMSk7XG59XG4iXX0=
|