angular-odata 0.130.0 → 0.131.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/angular-odata.mjs +2298 -2162
- package/fesm2022/angular-odata.mjs.map +1 -1
- package/lib/api.d.ts +10 -11
- package/lib/cache/cache.d.ts +2 -2
- package/lib/cache/memory.d.ts +2 -2
- package/lib/cache/storage.d.ts +2 -2
- package/lib/loaders.d.ts +8 -8
- package/lib/metadata/csdl/csdl-annotation.d.ts +3 -3
- package/lib/metadata/csdl/csdl-entity-container.d.ts +2 -2
- package/lib/metadata/csdl/csdl-entity-set.d.ts +2 -2
- package/lib/metadata/csdl/csdl-enum-type.d.ts +3 -3
- package/lib/metadata/csdl/csdl-function-action.d.ts +4 -4
- package/lib/metadata/csdl/csdl-reference.d.ts +2 -2
- package/lib/metadata/csdl/csdl-schema.d.ts +2 -2
- package/lib/metadata/csdl/csdl-structural-property.d.ts +3 -3
- package/lib/metadata/csdl/csdl-structured-type.d.ts +3 -3
- package/lib/metadata/metadata.d.ts +2 -2
- package/lib/models/options.d.ts +2 -2
- package/lib/module.d.ts +3 -3
- package/lib/options.d.ts +3 -3
- package/lib/resources/query/expressions/apply.d.ts +1 -1
- package/lib/resources/query/expressions/compute.d.ts +1 -1
- package/lib/resources/query/expressions/count.d.ts +1 -1
- package/lib/resources/query/expressions/expand.d.ts +4 -3
- package/lib/resources/query/expressions/filter.d.ts +2 -1
- package/lib/resources/query/expressions/orderby.d.ts +2 -1
- package/lib/resources/query/expressions/search.d.ts +2 -1
- package/lib/resources/query/expressions/select.d.ts +2 -1
- package/lib/resources/query/handlers.d.ts +17 -5
- package/lib/resources/resource.d.ts +5 -5
- package/lib/resources/types/action.d.ts +2 -2
- package/lib/resources/types/entity-set.d.ts +2 -2
- package/lib/resources/types/navigation-property.d.ts +2 -2
- package/lib/resources/types/property.d.ts +2 -2
- package/lib/schema/annotation.d.ts +3 -3
- package/lib/schema/callable.d.ts +3 -3
- package/lib/schema/element.d.ts +3 -3
- package/lib/schema/entity-container.d.ts +2 -2
- package/lib/schema/entity-set.d.ts +2 -2
- package/lib/schema/enum-type.d.ts +2 -2
- package/lib/schema/parsers/callable.d.ts +4 -4
- package/lib/schema/parsers/enum-type.d.ts +3 -3
- package/lib/schema/parsers/structured-type.d.ts +4 -4
- package/lib/schema/schema.d.ts +3 -3
- package/lib/schema/singleton.d.ts +2 -2
- package/lib/schema/structured-type.d.ts +3 -3
- package/lib/services/entity.d.ts +1 -1
- package/lib/settings.d.ts +2 -2
- package/lib/types.d.ts +76 -74
- package/lib/utils/odata.d.ts +2 -2
- package/package.json +3 -5
- package/schematics/apigen/files/api-config/__fileName__.ts +4 -4
- package/esm2022/angular-odata.mjs +0 -5
- package/esm2022/lib/annotations.mjs +0 -146
- package/esm2022/lib/api.mjs +0 -439
- package/esm2022/lib/cache/cache.mjs +0 -177
- package/esm2022/lib/cache/index.mjs +0 -4
- package/esm2022/lib/cache/memory.mjs +0 -30
- package/esm2022/lib/cache/storage.mjs +0 -57
- package/esm2022/lib/client.mjs +0 -215
- package/esm2022/lib/constants.mjs +0 -95
- package/esm2022/lib/helper.mjs +0 -288
- package/esm2022/lib/index.mjs +0 -22
- package/esm2022/lib/loaders.mjs +0 -43
- package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -273
- package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -59
- package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -50
- package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -74
- package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -204
- package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -15
- package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -76
- package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -87
- package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -37
- package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -145
- package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -159
- package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -46
- package/esm2022/lib/metadata/index.mjs +0 -3
- package/esm2022/lib/metadata/metadata.mjs +0 -41
- package/esm2022/lib/metadata/parser.mjs +0 -564
- package/esm2022/lib/models/collection.mjs +0 -816
- package/esm2022/lib/models/index.mjs +0 -4
- package/esm2022/lib/models/model.mjs +0 -577
- package/esm2022/lib/models/options.mjs +0 -1227
- package/esm2022/lib/module.mjs +0 -55
- package/esm2022/lib/options.mjs +0 -91
- package/esm2022/lib/resources/index.mjs +0 -7
- package/esm2022/lib/resources/options.mjs +0 -66
- package/esm2022/lib/resources/path/handlers.mjs +0 -81
- package/esm2022/lib/resources/path/index.mjs +0 -3
- package/esm2022/lib/resources/path/segments.mjs +0 -149
- package/esm2022/lib/resources/query/builder.mjs +0 -645
- package/esm2022/lib/resources/query/expressions/apply.mjs +0 -238
- package/esm2022/lib/resources/query/expressions/base.mjs +0 -26
- package/esm2022/lib/resources/query/expressions/compute.mjs +0 -55
- package/esm2022/lib/resources/query/expressions/count.mjs +0 -118
- package/esm2022/lib/resources/query/expressions/expand.mjs +0 -154
- package/esm2022/lib/resources/query/expressions/filter.mjs +0 -180
- package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
- package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -81
- package/esm2022/lib/resources/query/expressions/search.mjs +0 -144
- package/esm2022/lib/resources/query/expressions/select.mjs +0 -49
- package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -770
- package/esm2022/lib/resources/query/handlers.mjs +0 -423
- package/esm2022/lib/resources/query/index.mjs +0 -5
- package/esm2022/lib/resources/query/options.mjs +0 -140
- package/esm2022/lib/resources/request.mjs +0 -210
- package/esm2022/lib/resources/resource.mjs +0 -316
- package/esm2022/lib/resources/response.mjs +0 -180
- package/esm2022/lib/resources/types/action.mjs +0 -118
- package/esm2022/lib/resources/types/batch.mjs +0 -428
- package/esm2022/lib/resources/types/count.mjs +0 -33
- package/esm2022/lib/resources/types/entity-set.mjs +0 -131
- package/esm2022/lib/resources/types/entity.mjs +0 -112
- package/esm2022/lib/resources/types/function.mjs +0 -149
- package/esm2022/lib/resources/types/index.mjs +0 -15
- package/esm2022/lib/resources/types/media.mjs +0 -44
- package/esm2022/lib/resources/types/metadata.mjs +0 -35
- package/esm2022/lib/resources/types/navigation-property.mjs +0 -246
- package/esm2022/lib/resources/types/options.mjs +0 -2
- package/esm2022/lib/resources/types/property.mjs +0 -187
- package/esm2022/lib/resources/types/reference.mjs +0 -87
- package/esm2022/lib/resources/types/singleton.mjs +0 -125
- package/esm2022/lib/resources/types/value.mjs +0 -48
- package/esm2022/lib/schema/annotation.mjs +0 -44
- package/esm2022/lib/schema/callable.mjs +0 -69
- package/esm2022/lib/schema/element.mjs +0 -70
- package/esm2022/lib/schema/entity-container.mjs +0 -13
- package/esm2022/lib/schema/entity-set.mjs +0 -11
- package/esm2022/lib/schema/enum-type.mjs +0 -69
- package/esm2022/lib/schema/index.mjs +0 -9
- package/esm2022/lib/schema/parsers/callable.mjs +0 -123
- package/esm2022/lib/schema/parsers/edm.mjs +0 -101
- package/esm2022/lib/schema/parsers/enum-type.mjs +0 -148
- package/esm2022/lib/schema/parsers/index.mjs +0 -5
- package/esm2022/lib/schema/parsers/structured-type.mjs +0 -548
- package/esm2022/lib/schema/schema.mjs +0 -52
- package/esm2022/lib/schema/singleton.mjs +0 -11
- package/esm2022/lib/schema/structured-type.mjs +0 -220
- package/esm2022/lib/services/base.mjs +0 -32
- package/esm2022/lib/services/entity-set.mjs +0 -161
- package/esm2022/lib/services/entity.mjs +0 -12
- package/esm2022/lib/services/factory.mjs +0 -39
- package/esm2022/lib/services/index.mjs +0 -5
- package/esm2022/lib/services/singleton.mjs +0 -55
- package/esm2022/lib/settings.mjs +0 -113
- package/esm2022/lib/types.mjs +0 -118
- package/esm2022/lib/utils/arraybuffers.mjs +0 -46
- package/esm2022/lib/utils/arrays.mjs +0 -10
- package/esm2022/lib/utils/dates.mjs +0 -18
- package/esm2022/lib/utils/durations.mjs +0 -40
- package/esm2022/lib/utils/enums.mjs +0 -61
- package/esm2022/lib/utils/http.mjs +0 -95
- package/esm2022/lib/utils/index.mjs +0 -10
- package/esm2022/lib/utils/objects.mjs +0 -204
- package/esm2022/lib/utils/odata.mjs +0 -22
- package/esm2022/lib/utils/strings.mjs +0 -20
- package/esm2022/lib/utils/types.mjs +0 -136
- package/esm2022/lib/utils/urls.mjs +0 -24
- package/esm2022/public-api.mjs +0 -5
|
@@ -1,548 +0,0 @@
|
|
|
1
|
-
import { COMPUTED, DEFAULT_VERSION, DESCRIPTION, LONG_DESCRIPTION, } from '../../constants';
|
|
2
|
-
import { ODataHelper } from '../../helper';
|
|
3
|
-
import { raw } from '../../resources/query';
|
|
4
|
-
import { NONE_PARSER, EdmType, JsonType as JsonSchemaType, } from '../../types';
|
|
5
|
-
import { Objects, Strings, Types } from '../../utils';
|
|
6
|
-
import { ODataAnnotatable } from '../annotation';
|
|
7
|
-
import { ODataEnumTypeParser } from './enum-type';
|
|
8
|
-
export class ODataEntityTypeKey {
|
|
9
|
-
name;
|
|
10
|
-
alias;
|
|
11
|
-
constructor({ name, alias }) {
|
|
12
|
-
this.name = name;
|
|
13
|
-
this.alias = alias;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
export class ODataReferential {
|
|
17
|
-
property;
|
|
18
|
-
referencedProperty;
|
|
19
|
-
constructor({ property, referencedProperty, }) {
|
|
20
|
-
this.property = property;
|
|
21
|
-
this.referencedProperty = referencedProperty;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
export class ODataStructuredTypeFieldParser extends ODataAnnotatable {
|
|
25
|
-
name;
|
|
26
|
-
structured;
|
|
27
|
-
type;
|
|
28
|
-
parser;
|
|
29
|
-
collection;
|
|
30
|
-
navigation;
|
|
31
|
-
nullable;
|
|
32
|
-
default;
|
|
33
|
-
maxLength;
|
|
34
|
-
precision;
|
|
35
|
-
scale;
|
|
36
|
-
referentials;
|
|
37
|
-
parserOptions;
|
|
38
|
-
constructor(name, structured, field) {
|
|
39
|
-
super(field);
|
|
40
|
-
this.name = name;
|
|
41
|
-
this.structured = structured;
|
|
42
|
-
this.type = field.type;
|
|
43
|
-
this.parser = NONE_PARSER;
|
|
44
|
-
this.referentials = (field.referentials || []).map((referential) => new ODataReferential(referential));
|
|
45
|
-
this.default = field.default;
|
|
46
|
-
this.maxLength = field.maxLength;
|
|
47
|
-
this.nullable = field.nullable ?? true;
|
|
48
|
-
this.collection = Boolean(field.collection);
|
|
49
|
-
this.navigation = Boolean(field.navigation);
|
|
50
|
-
this.precision = field.precision;
|
|
51
|
-
this.scale = field.scale;
|
|
52
|
-
}
|
|
53
|
-
validate(value, { method, navigation = false, } = {}) {
|
|
54
|
-
let errors;
|
|
55
|
-
if (this.collection && Array.isArray(value)) {
|
|
56
|
-
errors = value.map((v) => this.validate(v, { method, navigation }));
|
|
57
|
-
}
|
|
58
|
-
else if ((this.isStructuredType() &&
|
|
59
|
-
typeof value === 'object' &&
|
|
60
|
-
value !== null) ||
|
|
61
|
-
(this.navigation && value !== undefined)) {
|
|
62
|
-
errors =
|
|
63
|
-
this.structuredType().validate(value, { method, navigation }) ||
|
|
64
|
-
{};
|
|
65
|
-
}
|
|
66
|
-
else if (this.isEnumType() &&
|
|
67
|
-
(typeof value === 'string' || typeof value === 'number')) {
|
|
68
|
-
errors = this.enumType().validate(value, { method, navigation });
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
// IsEdmType
|
|
72
|
-
const computed = this.annotatedValue(COMPUTED);
|
|
73
|
-
errors = [];
|
|
74
|
-
if (!this.nullable &&
|
|
75
|
-
(value === null || (value === undefined && method !== 'modify')) && // Is null or undefined without patch?
|
|
76
|
-
!(computed && method === 'create') // Not (Is Computed field and create) ?
|
|
77
|
-
) {
|
|
78
|
-
errors.push(`required`);
|
|
79
|
-
}
|
|
80
|
-
if (this.maxLength !== undefined &&
|
|
81
|
-
typeof value === 'string' &&
|
|
82
|
-
value.length > this.maxLength) {
|
|
83
|
-
errors.push(`maxlength`);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
87
|
-
}
|
|
88
|
-
//#region Deserialize
|
|
89
|
-
parse(parser, value, options) {
|
|
90
|
-
const type = options !== undefined && Types.isPlainObject(value)
|
|
91
|
-
? ODataHelper[options?.version || DEFAULT_VERSION].type(value)
|
|
92
|
-
: undefined;
|
|
93
|
-
if (type !== undefined) {
|
|
94
|
-
return parser
|
|
95
|
-
.childParser((c) => c.isTypeOf(type))
|
|
96
|
-
.deserialize(value, options);
|
|
97
|
-
}
|
|
98
|
-
return parser.deserialize(value, options);
|
|
99
|
-
}
|
|
100
|
-
deserialize(value, options) {
|
|
101
|
-
const parserOptions = { ...this.parserOptions, ...options };
|
|
102
|
-
if (this.parser instanceof ODataStructuredTypeParser) {
|
|
103
|
-
const parser = this.parser;
|
|
104
|
-
return Array.isArray(value)
|
|
105
|
-
? value.map((v) => this.parse(parser, v, parserOptions))
|
|
106
|
-
: this.parse(parser, value, parserOptions);
|
|
107
|
-
}
|
|
108
|
-
return this.parser.deserialize(value, {
|
|
109
|
-
field: this,
|
|
110
|
-
...parserOptions,
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
//#endregion
|
|
114
|
-
//#region Serialize
|
|
115
|
-
toJson(parser, value, options) {
|
|
116
|
-
const type = options !== undefined && Types.isPlainObject(value)
|
|
117
|
-
? ODataHelper[options?.version || DEFAULT_VERSION].type(value)
|
|
118
|
-
: undefined;
|
|
119
|
-
if (type !== undefined) {
|
|
120
|
-
return parser
|
|
121
|
-
.childParser((c) => c.isTypeOf(type))
|
|
122
|
-
.serialize(value, options);
|
|
123
|
-
}
|
|
124
|
-
return parser.serialize(value, options);
|
|
125
|
-
}
|
|
126
|
-
serialize(value, options) {
|
|
127
|
-
const parserOptions = { ...this.parserOptions, ...options };
|
|
128
|
-
if (this.parser instanceof ODataStructuredTypeParser) {
|
|
129
|
-
const parser = this.parser;
|
|
130
|
-
return Array.isArray(value)
|
|
131
|
-
? value.map((v) => this.toJson(parser, v, parserOptions))
|
|
132
|
-
: this.toJson(parser, value, parserOptions);
|
|
133
|
-
}
|
|
134
|
-
return this.parser.serialize(value, {
|
|
135
|
-
field: this,
|
|
136
|
-
...parserOptions,
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
//#endregion
|
|
140
|
-
//#region Encode
|
|
141
|
-
encode(value, options) {
|
|
142
|
-
const parserOptions = { ...this.parserOptions, ...options };
|
|
143
|
-
return this.parser.encode(value, {
|
|
144
|
-
field: this,
|
|
145
|
-
...parserOptions,
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
//#endregion
|
|
149
|
-
configure({ options, parserForType, }) {
|
|
150
|
-
this.parserOptions = options;
|
|
151
|
-
this.parser = parserForType(this.type);
|
|
152
|
-
if (this.default !== undefined) {
|
|
153
|
-
this.default = this.deserialize(this.default, options);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
//#region Json Schema
|
|
157
|
-
// https://json-schema.org/
|
|
158
|
-
toJsonSchema(options = {}) {
|
|
159
|
-
let schema = this.parser instanceof ODataStructuredTypeFieldParser ||
|
|
160
|
-
this.parser instanceof ODataStructuredTypeParser ||
|
|
161
|
-
this.parser instanceof ODataEnumTypeParser
|
|
162
|
-
? this.parser.toJsonSchema(options)
|
|
163
|
-
: { title: this.name, type: JsonSchemaType.object };
|
|
164
|
-
switch (this.type) {
|
|
165
|
-
case EdmType.String:
|
|
166
|
-
schema.type = JsonSchemaType.string;
|
|
167
|
-
break;
|
|
168
|
-
case EdmType.Guid:
|
|
169
|
-
schema.type = JsonSchemaType.string;
|
|
170
|
-
schema.pattern =
|
|
171
|
-
'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$';
|
|
172
|
-
break;
|
|
173
|
-
case EdmType.Binary:
|
|
174
|
-
schema.type = JsonSchemaType.string;
|
|
175
|
-
schema.contentEncoding = 'base64';
|
|
176
|
-
break;
|
|
177
|
-
case EdmType.Date:
|
|
178
|
-
schema.type = JsonSchemaType.string;
|
|
179
|
-
schema.format = 'date';
|
|
180
|
-
break;
|
|
181
|
-
case EdmType.TimeOfDay:
|
|
182
|
-
schema.type = JsonSchemaType.string;
|
|
183
|
-
schema.format = 'time';
|
|
184
|
-
break;
|
|
185
|
-
case EdmType.DateTimeOffset:
|
|
186
|
-
schema.type = JsonSchemaType.string;
|
|
187
|
-
schema.format = 'date-time';
|
|
188
|
-
break;
|
|
189
|
-
case EdmType.Duration:
|
|
190
|
-
schema.type = JsonSchemaType.string;
|
|
191
|
-
schema.format = 'duration';
|
|
192
|
-
break;
|
|
193
|
-
case EdmType.Byte:
|
|
194
|
-
case EdmType.SByte:
|
|
195
|
-
case EdmType.Int16:
|
|
196
|
-
case EdmType.Int32:
|
|
197
|
-
case EdmType.Int64:
|
|
198
|
-
//TODO: Range
|
|
199
|
-
schema.type = JsonSchemaType.integer;
|
|
200
|
-
break;
|
|
201
|
-
case EdmType.Single:
|
|
202
|
-
case EdmType.Double:
|
|
203
|
-
case EdmType.Decimal:
|
|
204
|
-
schema.type = JsonSchemaType.number;
|
|
205
|
-
break;
|
|
206
|
-
case EdmType.Boolean:
|
|
207
|
-
schema.type = JsonSchemaType.boolean;
|
|
208
|
-
break;
|
|
209
|
-
}
|
|
210
|
-
if (this.maxLength)
|
|
211
|
-
schema.maxLength = this.maxLength;
|
|
212
|
-
if (this.default)
|
|
213
|
-
schema.default = this.default;
|
|
214
|
-
if (this.nullable)
|
|
215
|
-
schema.type = [schema.type, JsonSchemaType.null];
|
|
216
|
-
if (this.collection)
|
|
217
|
-
schema = {
|
|
218
|
-
type: JsonSchemaType.array,
|
|
219
|
-
items: schema,
|
|
220
|
-
additionalItems: false,
|
|
221
|
-
};
|
|
222
|
-
return schema;
|
|
223
|
-
}
|
|
224
|
-
//#endregion
|
|
225
|
-
isKey() {
|
|
226
|
-
return this.structured
|
|
227
|
-
.keys({ include_parents: true })
|
|
228
|
-
.some((k) => k.name === this.name);
|
|
229
|
-
}
|
|
230
|
-
hasReferentials() {
|
|
231
|
-
return this.referentials.length !== 0;
|
|
232
|
-
}
|
|
233
|
-
isEdmType() {
|
|
234
|
-
return this.type.startsWith('Edm.');
|
|
235
|
-
}
|
|
236
|
-
isEnumType() {
|
|
237
|
-
return this.parser instanceof ODataEnumTypeParser;
|
|
238
|
-
}
|
|
239
|
-
enumType() {
|
|
240
|
-
if (!this.isEnumType())
|
|
241
|
-
throw new Error('Field are not EnumType');
|
|
242
|
-
return this.parser;
|
|
243
|
-
}
|
|
244
|
-
isStructuredType() {
|
|
245
|
-
return this.parser instanceof ODataStructuredTypeParser;
|
|
246
|
-
}
|
|
247
|
-
structuredType() {
|
|
248
|
-
if (!this.isStructuredType())
|
|
249
|
-
throw new Error('Field are not StrucuturedType');
|
|
250
|
-
return this.parser;
|
|
251
|
-
}
|
|
252
|
-
field(name) {
|
|
253
|
-
if (this.isStructuredType())
|
|
254
|
-
return this.parser.field(name);
|
|
255
|
-
throw new Error(`The field ${this.name} is not related to a StructuredType`);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
export class ODataStructuredTypeParser extends ODataAnnotatable {
|
|
259
|
-
name;
|
|
260
|
-
namespace;
|
|
261
|
-
open;
|
|
262
|
-
children = [];
|
|
263
|
-
alias;
|
|
264
|
-
base;
|
|
265
|
-
parent;
|
|
266
|
-
_keys;
|
|
267
|
-
_fields = [];
|
|
268
|
-
parserOptions;
|
|
269
|
-
constructor(config, namespace, alias) {
|
|
270
|
-
super(config);
|
|
271
|
-
this.name = config.name;
|
|
272
|
-
this.base = config.base;
|
|
273
|
-
this.open = config.open || false;
|
|
274
|
-
this.namespace = namespace;
|
|
275
|
-
this.alias = alias;
|
|
276
|
-
if (Array.isArray(config.keys))
|
|
277
|
-
this._keys = config.keys.map((key) => new ODataEntityTypeKey(key));
|
|
278
|
-
Object.entries((config.fields ?? {})).forEach(([name, config]) => this.addField(name, config));
|
|
279
|
-
}
|
|
280
|
-
addField(name, config) {
|
|
281
|
-
const field = new ODataStructuredTypeFieldParser(name, this, config);
|
|
282
|
-
this._fields.push(field);
|
|
283
|
-
return field;
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Create a nicer looking title.
|
|
287
|
-
* Titleize is meant for creating pretty output.
|
|
288
|
-
* @param term The term of the annotation to find.
|
|
289
|
-
* @returns The titleized string.
|
|
290
|
-
*/
|
|
291
|
-
titleize(term) {
|
|
292
|
-
return (term && this.annotatedValue(term)) || Strings.titleCase(this.name);
|
|
293
|
-
}
|
|
294
|
-
isTypeOf(type) {
|
|
295
|
-
var names = [`${this.namespace}.${this.name}`];
|
|
296
|
-
if (this.alias)
|
|
297
|
-
names.push(`${this.alias}.${this.name}`);
|
|
298
|
-
return names.indexOf(type) !== -1;
|
|
299
|
-
}
|
|
300
|
-
isSubtypeOf(type) {
|
|
301
|
-
if (this.isTypeOf(type))
|
|
302
|
-
return true;
|
|
303
|
-
if (this.parent)
|
|
304
|
-
return this.parent.isSubtypeOf(type);
|
|
305
|
-
return false;
|
|
306
|
-
}
|
|
307
|
-
isSupertypeOf(type) {
|
|
308
|
-
return (this.isTypeOf(type) || this.children.some((c) => c.isSupertypeOf(type)));
|
|
309
|
-
}
|
|
310
|
-
isOpenType() {
|
|
311
|
-
return this.open;
|
|
312
|
-
}
|
|
313
|
-
findChildParser(predicate) {
|
|
314
|
-
if (predicate(this))
|
|
315
|
-
return this;
|
|
316
|
-
let match;
|
|
317
|
-
for (let ch of this.children) {
|
|
318
|
-
match = ch.findChildParser(predicate);
|
|
319
|
-
if (match !== undefined)
|
|
320
|
-
break;
|
|
321
|
-
}
|
|
322
|
-
return match;
|
|
323
|
-
}
|
|
324
|
-
childParser(predicate) {
|
|
325
|
-
return this.findChildParser(predicate) || NONE_PARSER;
|
|
326
|
-
}
|
|
327
|
-
// Deserialize
|
|
328
|
-
deserialize(value, options) {
|
|
329
|
-
const parserOptions = { ...this.parserOptions, ...options };
|
|
330
|
-
const fields = this.fields({
|
|
331
|
-
include_navigation: true,
|
|
332
|
-
include_parents: true,
|
|
333
|
-
}).filter((f) => f.name in value &&
|
|
334
|
-
value[f.name] !== undefined &&
|
|
335
|
-
value[f.name] !== null);
|
|
336
|
-
return {
|
|
337
|
-
...value,
|
|
338
|
-
...fields.reduce((acc, f) => ({
|
|
339
|
-
...acc,
|
|
340
|
-
[f.name]: f.deserialize(value[f.name], parserOptions),
|
|
341
|
-
}), {}),
|
|
342
|
-
};
|
|
343
|
-
}
|
|
344
|
-
// Serialize
|
|
345
|
-
serialize(value, options) {
|
|
346
|
-
const parserOptions = { ...this.parserOptions, ...options };
|
|
347
|
-
const fields = this.fields({
|
|
348
|
-
include_navigation: true,
|
|
349
|
-
include_parents: true,
|
|
350
|
-
}).filter((f) => f.name in value &&
|
|
351
|
-
value[f.name] !== undefined &&
|
|
352
|
-
value[f.name] !== null);
|
|
353
|
-
return {
|
|
354
|
-
...value,
|
|
355
|
-
...fields.reduce((acc, f) => ({
|
|
356
|
-
...acc,
|
|
357
|
-
[f.name]: f.serialize(value[f.name], parserOptions),
|
|
358
|
-
}), {}),
|
|
359
|
-
};
|
|
360
|
-
}
|
|
361
|
-
// Encode
|
|
362
|
-
encode(value, options) {
|
|
363
|
-
const parserOptions = { ...this.parserOptions, ...options };
|
|
364
|
-
return raw(JSON.stringify(this.serialize(value, parserOptions)));
|
|
365
|
-
}
|
|
366
|
-
configure({ options, parserForType, }) {
|
|
367
|
-
this.parserOptions = options;
|
|
368
|
-
if (this.base) {
|
|
369
|
-
const parent = parserForType(this.base);
|
|
370
|
-
parent.children.push(this);
|
|
371
|
-
this.parent = parent;
|
|
372
|
-
}
|
|
373
|
-
this._fields.forEach((f) => f.configure({ options, parserForType }));
|
|
374
|
-
}
|
|
375
|
-
/**
|
|
376
|
-
* Returns all fields of the structured type.
|
|
377
|
-
* @param include_navigation Include navigation properties in the result.
|
|
378
|
-
* @param include_parents Include the parent types in the result.
|
|
379
|
-
* @returns All fields of the structured type.
|
|
380
|
-
*/
|
|
381
|
-
fields({ include_navigation, include_parents, }) {
|
|
382
|
-
return [
|
|
383
|
-
...(include_parents && this.parent !== undefined
|
|
384
|
-
? this.parent.fields({ include_parents, include_navigation })
|
|
385
|
-
: []),
|
|
386
|
-
...this._fields.filter((field) => include_navigation || !field.navigation),
|
|
387
|
-
];
|
|
388
|
-
}
|
|
389
|
-
/**
|
|
390
|
-
* Returns the keys of the structured type.
|
|
391
|
-
* @param include_parents Include the parent fields
|
|
392
|
-
* @returns The keys of the structured type
|
|
393
|
-
*/
|
|
394
|
-
keys({ include_parents, }) {
|
|
395
|
-
return [
|
|
396
|
-
...(include_parents && this.parent !== undefined
|
|
397
|
-
? this.parent.keys({ include_parents })
|
|
398
|
-
: []),
|
|
399
|
-
...(this._keys || []),
|
|
400
|
-
];
|
|
401
|
-
}
|
|
402
|
-
isEntityType() {
|
|
403
|
-
return (this._keys !== undefined ||
|
|
404
|
-
(this.parent !== undefined && this.parent.isEntityType()));
|
|
405
|
-
}
|
|
406
|
-
isComplexType() {
|
|
407
|
-
return !this.isEntityType();
|
|
408
|
-
}
|
|
409
|
-
/**
|
|
410
|
-
* Find the field parser for the given field name.
|
|
411
|
-
* @param name Name of the field
|
|
412
|
-
* @returns The field parser
|
|
413
|
-
*/
|
|
414
|
-
field(name) {
|
|
415
|
-
let field = this.fields({
|
|
416
|
-
include_parents: true,
|
|
417
|
-
include_navigation: true,
|
|
418
|
-
}).find((field) => field.name === name);
|
|
419
|
-
//Throw error if not found
|
|
420
|
-
if (field === undefined)
|
|
421
|
-
throw new Error(`${this.name} has no field named ${String(name)}`);
|
|
422
|
-
return field;
|
|
423
|
-
}
|
|
424
|
-
/**
|
|
425
|
-
* Picks the fields from attributes.
|
|
426
|
-
* @param attrs
|
|
427
|
-
* @param include_parents Include the parent fields
|
|
428
|
-
* @param include_navigation Include the navigation fields
|
|
429
|
-
* @param include_etag Include the etag field
|
|
430
|
-
* @returns The picked fields
|
|
431
|
-
*/
|
|
432
|
-
pick(attrs, { include_id = true, include_key = true, include_parents = true, include_navigation = false, include_computed = false, include_etag = true, options, } = {}) {
|
|
433
|
-
const parserOptions = options ?? this.parserOptions;
|
|
434
|
-
let fields = this.fields({ include_parents, include_navigation });
|
|
435
|
-
if (!include_key) {
|
|
436
|
-
fields = fields.filter((f) => !f.isKey());
|
|
437
|
-
}
|
|
438
|
-
if (!include_computed) {
|
|
439
|
-
fields = fields.filter((f) => !f.annotatedValue(COMPUTED) || (f.isKey() && include_key));
|
|
440
|
-
}
|
|
441
|
-
return Object.keys(attrs)
|
|
442
|
-
.filter((key) => fields.some((f) => f.name === key) ||
|
|
443
|
-
(key ==
|
|
444
|
-
ODataHelper[parserOptions?.version || DEFAULT_VERSION].ODATA_ETAG &&
|
|
445
|
-
include_etag) ||
|
|
446
|
-
(key ==
|
|
447
|
-
ODataHelper[parserOptions?.version || DEFAULT_VERSION].ODATA_ID &&
|
|
448
|
-
include_id))
|
|
449
|
-
.reduce((acc, key) => Object.assign(acc, { [key]: attrs[key] }), {});
|
|
450
|
-
}
|
|
451
|
-
resolveKey(value, { resolve = true, single = true, } = {}) {
|
|
452
|
-
const keyTypes = this.keys({ include_parents: true });
|
|
453
|
-
const key = new Map();
|
|
454
|
-
for (var kt of keyTypes) {
|
|
455
|
-
let v = value;
|
|
456
|
-
let structured = this;
|
|
457
|
-
let field;
|
|
458
|
-
for (let name of kt.name.split('/')) {
|
|
459
|
-
if (structured === undefined)
|
|
460
|
-
break;
|
|
461
|
-
field = structured
|
|
462
|
-
.fields({ include_navigation: false, include_parents: true })
|
|
463
|
-
.find((f) => f.name === name);
|
|
464
|
-
if (field !== undefined) {
|
|
465
|
-
v = Types.isPlainObject(v) ? v[field.name] : v;
|
|
466
|
-
structured = field.isStructuredType()
|
|
467
|
-
? field.structuredType()
|
|
468
|
-
: undefined;
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
if (field !== undefined && v !== undefined) {
|
|
472
|
-
key.set(kt.alias || field.name, field.encode(v));
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
if (key.size === 0)
|
|
476
|
-
return undefined;
|
|
477
|
-
return resolve
|
|
478
|
-
? Objects.resolveKey(key, { single })
|
|
479
|
-
: Object.fromEntries(key);
|
|
480
|
-
}
|
|
481
|
-
defaults() {
|
|
482
|
-
let fields = this.fields({
|
|
483
|
-
include_navigation: false,
|
|
484
|
-
include_parents: true,
|
|
485
|
-
}).filter((f) => f.default !== undefined || f.isStructuredType());
|
|
486
|
-
return {
|
|
487
|
-
...fields.reduce((acc, f) => {
|
|
488
|
-
let value = f.isStructuredType()
|
|
489
|
-
? f.structuredType().defaults()
|
|
490
|
-
: f.default;
|
|
491
|
-
return Types.isEmpty(value) ? acc : { ...acc, [f.name]: value };
|
|
492
|
-
}, {}),
|
|
493
|
-
};
|
|
494
|
-
}
|
|
495
|
-
// Json Schema
|
|
496
|
-
toJsonSchema(options = {}) {
|
|
497
|
-
let schema = {
|
|
498
|
-
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
499
|
-
$id: `${this.namespace}.${this.name}`,
|
|
500
|
-
title: this.titleize(DESCRIPTION),
|
|
501
|
-
description: this.annotatedValue(LONG_DESCRIPTION),
|
|
502
|
-
type: JsonSchemaType.object,
|
|
503
|
-
properties: {},
|
|
504
|
-
required: [],
|
|
505
|
-
};
|
|
506
|
-
const fields = this.fields({
|
|
507
|
-
include_navigation: true,
|
|
508
|
-
include_parents: true,
|
|
509
|
-
}).filter((f) => (!f.navigation || (options.expand && f.name in options.expand)) &&
|
|
510
|
-
(!options.select || options.select.indexOf(f.name) !== -1));
|
|
511
|
-
schema.properties = Object.assign({}, schema.properties, fields
|
|
512
|
-
.map((f) => {
|
|
513
|
-
let expand = options.expand && f.name in options.expand
|
|
514
|
-
? options.expand[f.name]
|
|
515
|
-
: undefined;
|
|
516
|
-
let schema = f.toJsonSchema(expand);
|
|
517
|
-
if (options.custom && f.name in options.custom)
|
|
518
|
-
schema = options.custom[f.name](schema, f);
|
|
519
|
-
return { [f.name]: schema };
|
|
520
|
-
})
|
|
521
|
-
.reduce((acc, v) => Object.assign(acc, v), {}));
|
|
522
|
-
schema.required = [
|
|
523
|
-
...schema.required,
|
|
524
|
-
...fields
|
|
525
|
-
.filter((f) => options.required && f.name in options.required
|
|
526
|
-
? options.required[f.name]
|
|
527
|
-
: !f.nullable)
|
|
528
|
-
.map((f) => f.name),
|
|
529
|
-
];
|
|
530
|
-
return schema;
|
|
531
|
-
}
|
|
532
|
-
validate(attrs, { method, navigation = false, } = {}) {
|
|
533
|
-
const errors = {};
|
|
534
|
-
const fields = this.fields({
|
|
535
|
-
include_navigation: true,
|
|
536
|
-
include_parents: true,
|
|
537
|
-
}).filter((f) => !f.navigation || navigation);
|
|
538
|
-
for (var field of fields) {
|
|
539
|
-
const value = attrs[field.name];
|
|
540
|
-
const errs = field.validate(value, { method, navigation });
|
|
541
|
-
if (errs !== undefined) {
|
|
542
|
-
errors[field.name] = errs;
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJlZC10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3NjaGVtYS9wYXJzZXJzL3N0cnVjdHVyZWQtdHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLGVBQWUsRUFDZixXQUFXLEVBQ1gsZ0JBQWdCLEdBQ2pCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUMsT0FBTyxFQUNMLFdBQVcsRUFPWCxPQUFPLEVBQ1AsUUFBUSxJQUFJLGNBQWMsR0FDM0IsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFtQmxELE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsSUFBSSxDQUFTO0lBQ2IsS0FBSyxDQUFVO0lBQ2YsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQW9DO1FBQzNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsUUFBUSxDQUFTO0lBQ2pCLGtCQUFrQixDQUFTO0lBQzNCLFlBQVksRUFDVixRQUFRLEVBQ1Isa0JBQWtCLEdBSW5CO1FBQ0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixD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Q04sS0FBVSxFQUNWLEVBQ0UsTUFBTSxFQUNOLFVBQVUsR0FBRyxLQUFLLE1BS2hCLEVBQUU7UUFFTixNQUFNLE1BQU0sR0FBRyxFQUE2QixDQUFDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDekIsa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLENBQUM7UUFDOUMsS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN6QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQWUsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3JELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENPTVBVVEVELFxuICBERUZBVUxUX1ZFUlNJT04sXG4gIERFU0NSSVBUSU9OLFxuICBMT05HX0RFU0NSSVBUSU9OLFxufSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFIZWxwZXIgfSBmcm9tICcuLi8uLi9oZWxwZXInO1xuaW1wb3J0IHsgcmF3IH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3F1ZXJ5JztcbmltcG9ydCB7XG4gIE5PTkVfUEFSU0VSLFxuICBQYXJzZXJPcHRpb25zLFxuICBQYXJzZXIsXG4gIFN0cnVjdHVyZWRUeXBlQ29uZmlnLFxuICBTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnLFxuICBTdHJ1Y3R1cmVkVHlwZUZpZWxkT3B0aW9ucyxcbiAgRmllbGRQYXJzZXIsXG4gIEVkbVR5cGUsXG4gIEpzb25UeXBlIGFzIEpzb25TY2hlbWFUeXBlLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBPYmplY3RzLCBTdHJpbmdzLCBUeXBlcyB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IE9EYXRhQW5ub3RhdGFibGUgfSBmcm9tICcuLi9hbm5vdGF0aW9uJztcbmltcG9ydCB7IE9EYXRhRW51bVR5cGVQYXJzZXIgfSBmcm9tICcuL2VudW0tdHlwZSc7XG5cbi8vIEpTT04gU0NIRU1BXG50eXBlIEpzb25TY2hlbWFTZWxlY3Q8VD4gPSBBcnJheTxrZXlvZiBUPjtcbnR5cGUgSnNvblNjaGVtYUN1c3RvbTxUPiA9IHtcbiAgW1AgaW4ga2V5b2YgVF0/OiAoXG4gICAgc2NoZW1hOiBhbnksXG4gICAgZmllbGQ6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxUW1BdPixcbiAgKSA9PiBhbnk7XG59O1xudHlwZSBKc29uU2NoZW1hRXhwYW5kPFQ+ID0geyBbUCBpbiBrZXlvZiBUXT86IEpzb25TY2hlbWFPcHRpb25zPFRbUF0+IH07XG50eXBlIEpzb25TY2hlbWFSZXF1aXJlZDxUPiA9IHsgW1AgaW4ga2V5b2YgVF0/OiBib29sZWFuIH07XG5leHBvcnQgdHlwZSBKc29uU2NoZW1hT3B0aW9uczxUPiA9IHtcbiAgc2VsZWN0PzogSnNvblNjaGVtYVNlbGVjdDxUPjtcbiAgY3VzdG9tPzogSnNvblNjaGVtYUN1c3RvbTxUPjtcbiAgZXhwYW5kPzogSnNvblNjaGVtYUV4cGFuZDxUPjtcbiAgcmVxdWlyZWQ/OiBKc29uU2NoZW1hUmVxdWlyZWQ8VD47XG59O1xuXG5leHBvcnQgY2xhc3MgT0RhdGFFbnRpdHlUeXBlS2V5IHtcbiAgbmFtZTogc3RyaW5nO1xuICBhbGlhcz86IHN0cmluZztcbiAgY29uc3RydWN0b3IoeyBuYW1lLCBhbGlhcyB9OiB7IG5hbWU6IHN0cmluZzsgYWxpYXM/OiBzdHJpbmcgfSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVJlZmVyZW50aWFsIHtcbiAgcHJvcGVydHk6IHN0cmluZztcbiAgcmVmZXJlbmNlZFByb3BlcnR5OiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBwcm9wZXJ0eSxcbiAgICByZWZlcmVuY2VkUHJvcGVydHksXG4gIH06IHtcbiAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgIHJlZmVyZW5jZWRQcm9wZXJ0eTogc3RyaW5nO1xuICB9KSB7XG4gICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgIHRoaXMucmVmZXJlbmNlZFByb3BlcnR5ID0gcmVmZXJlbmNlZFByb3BlcnR5O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8VD5cbiAgZXh0ZW5kcyBPRGF0YUFubm90YXRhYmxlXG4gIGltcGxlbWVudHMgRmllbGRQYXJzZXI8VD5cbntcbiAgbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHN0cnVjdHVyZWQ6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PjtcbiAgdHlwZTogc3RyaW5nIHwgRWRtVHlwZTtcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjxUPjtcbiAgY29sbGVjdGlvbjogYm9vbGVhbjtcbiAgbmF2aWdhdGlvbjogYm9vbGVhbjtcbiAgbnVsbGFibGU/OiBib29sZWFuO1xuICBkZWZhdWx0PzogYW55O1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIHByZWNpc2lvbj86IG51bWJlcjtcbiAgc2NhbGU/OiBudW1iZXIgfCAndmFyaWFibGUnO1xuICByZWZlcmVudGlhbHM6IE9EYXRhUmVmZXJlbnRpYWxbXTtcbiAgcGFyc2VyT3B0aW9ucz86IFBhcnNlck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0cnVjdHVyZWQ6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PixcbiAgICBmaWVsZDogU3RydWN0dXJlZFR5cGVGaWVsZENvbmZpZyxcbiAgKSB7XG4gICAgc3VwZXIoZmllbGQpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdHJ1Y3R1cmVkID0gc3RydWN0dXJlZDtcbiAgICB0aGlzLnR5cGUgPSBmaWVsZC50eXBlO1xuICAgIHRoaXMucGFyc2VyID0gTk9ORV9QQVJTRVI7XG4gICAgdGhpcy5yZWZlcmVudGlhbHMgPSAoZmllbGQucmVmZXJlbnRpYWxzIHx8IFtdKS5tYXAoXG4gICAgICAocmVmZXJlbnRpYWwpID0+IG5ldyBPRGF0YVJlZmVyZW50aWFsKHJlZmVyZW50aWFsKSxcbiAgICApO1xuICAgIHRoaXMuZGVmYXVsdCA9IGZpZWxkLmRlZmF1bHQ7XG4gICAgdGhpcy5tYXhMZW5ndGggPSBmaWVsZC5tYXhMZW5ndGg7XG4gICAgdGhpcy5udWxsYWJsZSA9IGZpZWxkLm51bGxhYmxlID8/IHRydWU7XG4gICAgdGhpcy5jb2xsZWN0aW9uID0gQm9vbGVhbihmaWVsZC5jb2xsZWN0aW9uKTtcbiAgICB0aGlzLm5hdmlnYXRpb24gPSBCb29sZWFuKGZpZWxkLm5hdmlnYXRpb24pO1xuICAgIHRoaXMucHJlY2lzaW9uID0gZmllbGQucHJlY2lzaW9uO1xuICAgIHRoaXMuc2NhbGUgPSBmaWVsZC5zY2FsZTtcbiAgfVxuXG4gIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAge1xuICAgICAgbWV0aG9kLFxuICAgICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKTpcbiAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgfCBzdHJpbmdbXVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgZXJyb3JzO1xuICAgIGlmICh0aGlzLmNvbGxlY3Rpb24gJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGVycm9ycyA9IHZhbHVlLm1hcCgodikgPT4gdGhpcy52YWxpZGF0ZSh2LCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSkgYXMge1xuICAgICAgICBbbmFtZTogc3RyaW5nXTogYW55W107XG4gICAgICB9W107XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICh0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHZhbHVlICE9PSBudWxsKSB8fFxuICAgICAgKHRoaXMubmF2aWdhdGlvbiAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgZXJyb3JzID1cbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmVkVHlwZSgpLnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSB8fFxuICAgICAgICAoe30gYXMgeyBbbmFtZTogc3RyaW5nXTogYW55W10gfSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuaXNFbnVtVHlwZSgpICYmXG4gICAgICAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKVxuICAgICkge1xuICAgICAgZXJyb3JzID0gdGhpcy5lbnVtVHlwZSgpLnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSXNFZG1UeXBlXG4gICAgICBjb25zdCBjb21wdXRlZCA9IHRoaXMuYW5ub3RhdGVkVmFsdWU8Ym9vbGVhbj4oQ09NUFVURUQpO1xuICAgICAgZXJyb3JzID0gW107XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLm51bGxhYmxlICYmXG4gICAgICAgICh2YWx1ZSA9PT0gbnVsbCB8fCAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBtZXRob2QgIT09ICdtb2RpZnknKSkgJiYgLy8gSXMgbnVsbCBvciB1bmRlZmluZWQgd2l0aG91dCBwYXRjaD9cbiAgICAgICAgIShjb21wdXRlZCAmJiBtZXRob2QgPT09ICdjcmVhdGUnKSAvLyBOb3QgKElzIENvbXB1dGVkIGZpZWxkIGFuZCBjcmVhdGUpID9cbiAgICAgICkge1xuICAgICAgICBlcnJvcnMucHVzaChgcmVxdWlyZWRgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5tYXhMZW5ndGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHZhbHVlLmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYG1heGxlbmd0aGApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZXJyb3JzKSA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBEZXNlcmlhbGl6ZVxuICBwcml2YXRlIHBhcnNlKFxuICAgIHBhcnNlcjogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPixcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zLFxuICApOiBhbnkge1xuICAgIGNvbnN0IHR5cGUgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIFR5cGVzLmlzUGxhaW5PYmplY3QodmFsdWUpXG4gICAgICAgID8gT0RhdGFIZWxwZXJbb3B0aW9ucz8udmVyc2lvbiB8fCBERUZBVUxUX1ZFUlNJT05dLnR5cGUodmFsdWUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwYXJzZXJcbiAgICAgICAgLmNoaWxkUGFyc2VyKChjKSA9PiBjLmlzVHlwZU9mKHR5cGUpKVxuICAgICAgICAuZGVzZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VyLmRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGRlc2VyaWFsaXplKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKTogVCB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IHsgLi4udGhpcy5wYXJzZXJPcHRpb25zLCAuLi5vcHRpb25zIH07XG4gICAgaWYgKHRoaXMucGFyc2VyIGluc3RhbmNlb2YgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcikge1xuICAgICAgY29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXIgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPjtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICA/IHZhbHVlLm1hcCgodikgPT4gdGhpcy5wYXJzZShwYXJzZXIsIHYsIHBhcnNlck9wdGlvbnMpKVxuICAgICAgICA6IHRoaXMucGFyc2UocGFyc2VyLCB2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlci5kZXNlcmlhbGl6ZSh2YWx1ZSwge1xuICAgICAgZmllbGQ6IHRoaXMsXG4gICAgICAuLi5wYXJzZXJPcHRpb25zLFxuICAgIH0gYXMgU3RydWN0dXJlZFR5cGVGaWVsZE9wdGlvbnMpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBTZXJpYWxpemVcbiAgcHJpdmF0ZSB0b0pzb24oXG4gICAgcGFyc2VyOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+LFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMsXG4gICk6IGFueSB7XG4gICAgY29uc3QgdHlwZSA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgVHlwZXMuaXNQbGFpbk9iamVjdCh2YWx1ZSlcbiAgICAgICAgPyBPRGF0YUhlbHBlcltvcHRpb25zPy52ZXJzaW9uIHx8IERFRkFVTFRfVkVSU0lPTl0udHlwZSh2YWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHBhcnNlclxuICAgICAgICAuY2hpbGRQYXJzZXIoKGMpID0+IGMuaXNUeXBlT2YodHlwZSkpXG4gICAgICAgIC5zZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VyLnNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBzZXJpYWxpemUodmFsdWU6IFQsIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0geyAuLi50aGlzLnBhcnNlck9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICBpZiAodGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyKSB7XG4gICAgICBjb25zdCBwYXJzZXIgPSB0aGlzLnBhcnNlciBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+O1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgID8gKHZhbHVlIGFzIGFueVtdKS5tYXAoKHYpID0+IHRoaXMudG9Kc29uKHBhcnNlciwgdiwgcGFyc2VyT3B0aW9ucykpXG4gICAgICAgIDogdGhpcy50b0pzb24ocGFyc2VyLCB2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlci5zZXJpYWxpemUodmFsdWUsIHtcbiAgICAgIGZpZWxkOiB0aGlzLFxuICAgICAgLi4ucGFyc2VyT3B0aW9ucyxcbiAgICB9IGFzIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gRW5jb2RlXG4gIGVuY29kZSh2YWx1ZTogVCwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSB7IC4uLnRoaXMucGFyc2VyT3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5lbmNvZGUodmFsdWUsIHtcbiAgICAgIGZpZWxkOiB0aGlzLFxuICAgICAgLi4ucGFyc2VyT3B0aW9ucyxcbiAgICB9IGFzIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBjb25maWd1cmUoe1xuICAgIG9wdGlvbnMsXG4gICAgcGFyc2VyRm9yVHlwZSxcbiAgfToge1xuICAgIG9wdGlvbnM6IFBhcnNlck9wdGlvbnM7XG4gICAgcGFyc2VyRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gUGFyc2VyPGFueT47XG4gIH0pIHtcbiAgICB0aGlzLnBhcnNlck9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMucGFyc2VyID0gcGFyc2VyRm9yVHlwZSh0aGlzLnR5cGUpO1xuICAgIGlmICh0aGlzLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kZWZhdWx0ID0gdGhpcy5kZXNlcmlhbGl6ZSh0aGlzLmRlZmF1bHQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8vI3JlZ2lvbiBKc29uIFNjaGVtYVxuICAvLyBodHRwczovL2pzb24tc2NoZW1hLm9yZy9cbiAgdG9Kc29uU2NoZW1hKG9wdGlvbnM6IEpzb25TY2hlbWFPcHRpb25zPFQ+ID0ge30pIHtcbiAgICBsZXQgc2NoZW1hOiBhbnkgPVxuICAgICAgdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXIgfHxcbiAgICAgIHRoaXMucGFyc2VyIGluc3RhbmNlb2YgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlciB8fFxuICAgICAgdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YUVudW1UeXBlUGFyc2VyXG4gICAgICAgID8gdGhpcy5wYXJzZXIudG9Kc29uU2NoZW1hKG9wdGlvbnMpXG4gICAgICAgIDogKHsgdGl0bGU6IHRoaXMubmFtZSwgdHlwZTogSnNvblNjaGVtYVR5cGUub2JqZWN0IH0gYXMgYW55KTtcblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIEVkbVR5cGUuU3RyaW5nOlxuICAgICAgICBzY2hlbWEudHlwZSA9IEpzb25TY2hlbWFUeXBlLnN0cmluZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVkbVR5cGUuR3VpZDpcbiAgICAgICAgc2NoZW1hLnR5cGUgPSBKc29uU2NoZW1hVHlwZS5zdHJpbmc7XG4gICAgICAgIHNjaGVtYS5wYXR0ZXJuID1cbiAgICAgICAgICAnXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRWRtVHlwZS5CaW5hcnk6XG4gICAgICAgIHNjaGVtYS50eXBlID0gSnNvblNjaGVtYVR5cGUuc3RyaW5nO1xuICAgICAgICBzY2hlbWEuY29udGVudEVuY29kaW5nID0gJ2Jhc2U2NCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFZG1UeXBlLkRhdGU6XG4gICAgICAgIHNjaGVtYS50eXBlID0gSnNvblNjaGVtYVR5cGUuc3RyaW5nO1xuICAgICAgICBzY2hlbWEuZm9ybWF0ID0gJ2RhdGUnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRWRtVHlwZS5UaW1lT2ZEYXk6XG4gICAgICAgIHNjaGVtYS50eXBlID0gSnNvblNjaGVtYVR5cGUuc3RyaW5nO1xuICAgICAgICBzY2hlbWEuZm9ybWF0ID0gJ3RpbWUnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRWRtVHlwZS5EYXRlVGltZU9mZnNldDpcbiAgICAgICAgc2NoZW1hLnR5cGUgPSBKc29uU2NoZW1hVHlwZS5zdHJpbmc7XG4gICAgICAgIHNjaGVtYS5mb3JtYXQgPSAnZGF0ZS10aW1lJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVkbVR5cGUuRHVyYXRpb246XG4gICAgICAgIHNjaGVtYS50eXBlID0gSnNvblNjaGVtYVR5cGUuc3RyaW5nO1xuICAgICAgICBzY2hlbWEuZm9ybWF0ID0gJ2R1cmF0aW9uJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVkbVR5cGUuQnl0ZTpcbiAgICAgIGNhc2UgRWRtVHlwZS5TQnl0ZTpcbiAgICAgIGNhc2UgRWRtVHlwZS5JbnQxNjpcbiAgICAgIGNhc2UgRWRtVHlwZS5JbnQzMjpcbiAgICAgIGNhc2UgRWRtVHlwZS5JbnQ2NDpcbiAgICAgICAgLy9UT0RPOiBSYW5nZVxuICAgICAgICBzY2hlbWEudHlwZSA9IEpzb25TY2hlbWFUeXBlLmludGVnZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFZG1UeXBlLlNpbmdsZTpcbiAgICAgIGNhc2UgRWRtVHlwZS5Eb3VibGU6XG4gICAgICBjYXNlIEVkbVR5cGUuRGVjaW1hbDpcbiAgICAgICAgc2NoZW1hLnR5cGUgPSBKc29uU2NoZW1hVHlwZS5udW1iZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFZG1UeXBlLkJvb2xlYW46XG4gICAgICAgIHNjaGVtYS50eXBlID0gSnNvblNjaGVtYVR5cGUuYm9vbGVhbjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICh0aGlzLm1heExlbmd0aCkgc2NoZW1hLm1heExlbmd0aCA9IHRoaXMubWF4TGVuZ3RoO1xuICAgIGlmICh0aGlzLmRlZmF1bHQpIHNjaGVtYS5kZWZhdWx0ID0gdGhpcy5kZWZhdWx0O1xuICAgIGlmICh0aGlzLm51bGxhYmxlKSBzY2hlbWEudHlwZSA9IFtzY2hlbWEudHlwZSwgSnNvblNjaGVtYVR5cGUubnVsbF07XG4gICAgaWYgKHRoaXMuY29sbGVjdGlvbilcbiAgICAgIHNjaGVtYSA9IHtcbiAgICAgICAgdHlwZTogSnNvblNjaGVtYVR5cGUuYXJyYXksXG4gICAgICAgIGl0ZW1zOiBzY2hlbWEsXG4gICAgICAgIGFkZGl0aW9uYWxJdGVtczogZmFsc2UsXG4gICAgICB9O1xuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgaXNLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RydWN0dXJlZFxuICAgICAgLmtleXMoeyBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgIC5zb21lKChrKSA9PiBrLm5hbWUgPT09IHRoaXMubmFtZSk7XG4gIH1cblxuICBoYXNSZWZlcmVudGlhbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVmZXJlbnRpYWxzLmxlbmd0aCAhPT0gMDtcbiAgfVxuXG4gIGlzRWRtVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlLnN0YXJ0c1dpdGgoJ0VkbS4nKTtcbiAgfVxuXG4gIGlzRW51bVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyIGluc3RhbmNlb2YgT0RhdGFFbnVtVHlwZVBhcnNlcjtcbiAgfVxuXG4gIGVudW1UeXBlKCkge1xuICAgIGlmICghdGhpcy5pc0VudW1UeXBlKCkpIHRocm93IG5ldyBFcnJvcignRmllbGQgYXJlIG5vdCBFbnVtVHlwZScpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlciBhcyBPRGF0YUVudW1UeXBlUGFyc2VyPFQ+O1xuICB9XG5cbiAgaXNTdHJ1Y3R1cmVkVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyO1xuICB9XG5cbiAgc3RydWN0dXJlZFR5cGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmllbGQgYXJlIG5vdCBTdHJ1Y3V0dXJlZFR5cGUnKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPjtcbiAgfVxuXG4gIGZpZWxkPEY+KG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSlcbiAgICAgIHJldHVybiAodGhpcy5wYXJzZXIgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPikuZmllbGQ8Rj4oXG4gICAgICAgIG5hbWUgYXMga2V5b2YgVCxcbiAgICAgICk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBmaWVsZCAke3RoaXMubmFtZX0gaXMgbm90IHJlbGF0ZWQgdG8gYSBTdHJ1Y3R1cmVkVHlwZWAsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPlxuICBleHRlbmRzIE9EYXRhQW5ub3RhdGFibGVcbiAgaW1wbGVtZW50cyBQYXJzZXI8VD5cbntcbiAgbmFtZTogc3RyaW5nO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgb3BlbjogYm9vbGVhbjtcbiAgY2hpbGRyZW46IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PltdID0gW107XG4gIGFsaWFzPzogc3RyaW5nO1xuICBiYXNlPzogc3RyaW5nO1xuICBwYXJlbnQ/OiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT47XG4gIHByaXZhdGUgX2tleXM/OiBPRGF0YUVudGl0eVR5cGVLZXlbXTtcbiAgcHJpdmF0ZSBfZmllbGRzOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8YW55PltdID0gW107XG4gIHBhcnNlck9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU3RydWN0dXJlZFR5cGVDb25maWcsIG5hbWVzcGFjZTogc3RyaW5nLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5iYXNlID0gY29uZmlnLmJhc2U7XG4gICAgdGhpcy5vcGVuID0gY29uZmlnLm9wZW4gfHwgZmFsc2U7XG4gICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5rZXlzKSlcbiAgICAgIHRoaXMuX2tleXMgPSBjb25maWcua2V5cy5tYXAoKGtleSkgPT4gbmV3IE9EYXRhRW50aXR5VHlwZUtleShrZXkpKTtcbiAgICBPYmplY3QuZW50cmllczxTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnPihcbiAgICAgIChjb25maWcuZmllbGRzID8/IHt9KSBhcyB7IFtQIGluIGtleW9mIFRdOiBTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnIH0sXG4gICAgKS5mb3JFYWNoKChbbmFtZSwgY29uZmlnXSkgPT4gdGhpcy5hZGRGaWVsZChuYW1lLCBjb25maWcpKTtcbiAgfVxuXG4gIGFkZEZpZWxkPEY+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjb25maWc6IFN0cnVjdHVyZWRUeXBlRmllbGRDb25maWcsXG4gICk6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxGPiB7XG4gICAgY29uc3QgZmllbGQgPSBuZXcgT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+KG5hbWUsIHRoaXMsIGNvbmZpZyk7XG4gICAgdGhpcy5fZmllbGRzLnB1c2goZmllbGQpO1xuICAgIHJldHVybiBmaWVsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuaWNlciBsb29raW5nIHRpdGxlLlxuICAgKiBUaXRsZWl6ZSBpcyBtZWFudCBmb3IgY3JlYXRpbmcgcHJldHR5IG91dHB1dC5cbiAgICogQHBhcmFtIHRlcm0gVGhlIHRlcm0gb2YgdGhlIGFubm90YXRpb24gdG8gZmluZC5cbiAgICogQHJldHVybnMgVGhlIHRpdGxlaXplZCBzdHJpbmcuXG4gICAqL1xuICB0aXRsZWl6ZSh0ZXJtPzogc3RyaW5nIHwgUmVnRXhwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRlcm0gJiYgdGhpcy5hbm5vdGF0ZWRWYWx1ZSh0ZXJtKSkgfHwgU3RyaW5ncy50aXRsZUNhc2UodGhpcy5uYW1lKTtcbiAgfVxuXG4gIGlzVHlwZU9mKHR5cGU6IHN0cmluZykge1xuICAgIHZhciBuYW1lcyA9IFtgJHt0aGlzLm5hbWVzcGFjZX0uJHt0aGlzLm5hbWV9YF07XG4gICAgaWYgKHRoaXMuYWxpYXMpIG5hbWVzLnB1c2goYCR7dGhpcy5hbGlhc30uJHt0aGlzLm5hbWV9YCk7XG4gICAgcmV0dXJuIG5hbWVzLmluZGV4T2YodHlwZSkgIT09IC0xO1xuICB9XG5cbiAgaXNTdWJ0eXBlT2YodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNUeXBlT2YodHlwZSkpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmlzU3VidHlwZU9mKHR5cGUpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzU3VwZXJ0eXBlT2YodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNUeXBlT2YodHlwZSkgfHwgdGhpcy5jaGlsZHJlbi5zb21lKChjKSA9PiBjLmlzU3VwZXJ0eXBlT2YodHlwZSkpXG4gICAgKTtcbiAgfVxuXG4gIGlzT3BlblR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMub3BlbjtcbiAgfVxuXG4gIGZpbmRDaGlsZFBhcnNlcihcbiAgICBwcmVkaWNhdGU6IChwOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4pID0+IGJvb2xlYW4sXG4gICk6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByZWRpY2F0ZSh0aGlzKSkgcmV0dXJuIHRoaXM7XG4gICAgbGV0IG1hdGNoOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgY2ggb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgbWF0Y2ggPSBjaC5maW5kQ2hpbGRQYXJzZXIocHJlZGljYXRlKTtcbiAgICAgIGlmIChtYXRjaCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoO1xuICB9XG5cbiAgY2hpbGRQYXJzZXIoXG4gICAgcHJlZGljYXRlOiAocDogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+KSA9PiBib29sZWFuLFxuICApOiBQYXJzZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZENoaWxkUGFyc2VyKHByZWRpY2F0ZSkgfHwgTk9ORV9QQVJTRVI7XG4gIH1cblxuICAvLyBEZXNlcmlhbGl6ZVxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55LCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IFQge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSB7IC4uLnRoaXMucGFyc2VyT3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KS5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgZi5uYW1lIGluIHZhbHVlICYmXG4gICAgICAgIHZhbHVlW2YubmFtZV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB2YWx1ZVtmLm5hbWVdICE9PSBudWxsLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgLi4uZmllbGRzLnJlZHVjZShcbiAgICAgICAgKGFjYywgZikgPT4gKHtcbiAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgW2YubmFtZV06IGYuZGVzZXJpYWxpemUodmFsdWVbZi5uYW1lXSwgcGFyc2VyT3B0aW9ucyksXG4gICAgICAgIH0pLFxuICAgICAgICB7fSxcbiAgICAgICksXG4gICAgfTtcbiAgfVxuXG4gIC8vIFNlcmlhbGl6ZVxuICBzZXJpYWxpemUodmFsdWU6IFBhcnRpYWw8VD4sIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0geyAuLi50aGlzLnBhcnNlck9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgfSkuZmlsdGVyKFxuICAgICAgKGYpID0+XG4gICAgICAgIGYubmFtZSBpbiB2YWx1ZSAmJlxuICAgICAgICAodmFsdWUgYXMgYW55KVtmLm5hbWVdICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKHZhbHVlIGFzIGFueSlbZi5uYW1lXSAhPT0gbnVsbCxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIC4uLmZpZWxkcy5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGYpID0+ICh7XG4gICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgIFtmLm5hbWVdOiBmLnNlcmlhbGl6ZSgodmFsdWUgYXMgYW55KVtmLm5hbWVdLCBwYXJzZXJPcHRpb25zKSxcbiAgICAgICAgfSksXG4gICAgICAgIHt9LFxuICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gRW5jb2RlXG4gIGVuY29kZSh2YWx1ZTogVCwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSB7IC4uLnRoaXMucGFyc2VyT3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIHJldHVybiByYXcoSlNPTi5zdHJpbmdpZnkodGhpcy5zZXJpYWxpemUodmFsdWUsIHBhcnNlck9wdGlvbnMpKSk7XG4gIH1cblxuICBjb25maWd1cmUoe1xuICAgIG9wdGlvbnMsXG4gICAgcGFyc2VyRm9yVHlwZSxcbiAgfToge1xuICAgIG9wdGlvbnM6IFBhcnNlck9wdGlvbnM7XG4gICAgcGFyc2VyRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gUGFyc2VyPGFueT47XG4gIH0pIHtcbiAgICB0aGlzLnBhcnNlck9wdGlvbnMgPSBvcHRpb25zO1xuICAgIGlmICh0aGlzLmJhc2UpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHBhcnNlckZvclR5cGUodGhpcy5iYXNlKSBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT47XG4gICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICB0aGlzLl9maWVsZHMuZm9yRWFjaCgoZikgPT4gZi5jb25maWd1cmUoeyBvcHRpb25zLCBwYXJzZXJGb3JUeXBlIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBmaWVsZHMgb2YgdGhlIHN0cnVjdHVyZWQgdHlwZS5cbiAgICogQHBhcmFtIGluY2x1ZGVfbmF2aWdhdGlvbiBJbmNsdWRlIG5hdmlnYXRpb24gcHJvcGVydGllcyBpbiB0aGUgcmVzdWx0LlxuICAgKiBAcGFyYW0gaW5jbHVkZV9wYXJlbnRzIEluY2x1ZGUgdGhlIHBhcmVudCB0eXBlcyBpbiB0aGUgcmVzdWx0LlxuICAgKiBAcmV0dXJucyBBbGwgZmllbGRzIG9mIHRoZSBzdHJ1Y3R1cmVkIHR5cGUuXG4gICAqL1xuICBmaWVsZHMoe1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICBpbmNsdWRlX3BhcmVudHMsXG4gIH06IHtcbiAgICBpbmNsdWRlX3BhcmVudHM6IGJvb2xlYW47XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBib29sZWFuO1xuICB9KTogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPGFueT5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLihpbmNsdWRlX3BhcmVudHMgJiYgdGhpcy5wYXJlbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMucGFyZW50LmZpZWxkcyh7IGluY2x1ZGVfcGFyZW50cywgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pXG4gICAgICAgIDogW10pLFxuICAgICAgLi4udGhpcy5fZmllbGRzLmZpbHRlcihcbiAgICAgICAgKGZpZWxkKSA9PiBpbmNsdWRlX25hdmlnYXRpb24gfHwgIWZpZWxkLm5hdmlnYXRpb24sXG4gICAgICApLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUga2V5cyBvZiB0aGUgc3RydWN0dXJlZCB0eXBlLlxuICAgKiBAcGFyYW0gaW5jbHVkZV9wYXJlbnRzIEluY2x1ZGUgdGhlIHBhcmVudCBmaWVsZHNcbiAgICogQHJldHVybnMgVGhlIGtleXMgb2YgdGhlIHN0cnVjdHVyZWQgdHlwZVxuICAgKi9cbiAga2V5cyh7XG4gICAgaW5jbHVkZV9wYXJlbnRzLFxuICB9OiB7XG4gICAgaW5jbHVkZV9wYXJlbnRzOiBib29sZWFuO1xuICB9KTogT0RhdGFFbnRpdHlUeXBlS2V5W10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4oaW5jbHVkZV9wYXJlbnRzICYmIHRoaXMucGFyZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLnBhcmVudC5rZXlzKHsgaW5jbHVkZV9wYXJlbnRzIH0pXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKHRoaXMuX2tleXMgfHwgW10pLFxuICAgIF07XG4gIH1cblxuICBpc0VudGl0eVR5cGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2tleXMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgKHRoaXMucGFyZW50ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wYXJlbnQuaXNFbnRpdHlUeXBlKCkpXG4gICAgKTtcbiAgfVxuXG4gIGlzQ29tcGxleFR5cGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzRW50aXR5VHlwZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGZpZWxkIHBhcnNlciBmb3IgdGhlIGdpdmVuIGZpZWxkIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZCBwYXJzZXJcbiAgICovXG4gIGZpZWxkPEY+KG5hbWU6IGtleW9mIFQpOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8Rj4ge1xuICAgIGxldCBmaWVsZCA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICB9KS5maW5kKChmaWVsZDogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+KSA9PiBmaWVsZC5uYW1lID09PSBuYW1lKTtcbiAgICAvL1Rocm93IGVycm9yIGlmIG5vdCBmb3VuZFxuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubmFtZX0gaGFzIG5vIGZpZWxkIG5hbWVkICR7U3RyaW5nKG5hbWUpfWApO1xuICAgIHJldHVybiBmaWVsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyB0aGUgZmllbGRzIGZyb20gYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIGF0dHJzXG4gICAqIEBwYXJhbSBpbmNsdWRlX3BhcmVudHMgSW5jbHVkZSB0aGUgcGFyZW50IGZpZWxkc1xuICAgKiBAcGFyYW0gaW5jbHVkZV9uYXZpZ2F0aW9uIEluY2x1ZGUgdGhlIG5hdmlnYXRpb24gZmllbGRzXG4gICAqIEBwYXJhbSBpbmNsdWRlX2V0YWcgSW5jbHVkZSB0aGUgZXRhZyBmaWVsZFxuICAgKiBAcmV0dXJucyBUaGUgcGlja2VkIGZpZWxkc1xuICAgKi9cbiAgcGljayhcbiAgICBhdHRyczogeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAge1xuICAgICAgaW5jbHVkZV9pZCA9IHRydWUsXG4gICAgICBpbmNsdWRlX2tleSA9IHRydWUsXG4gICAgICBpbmNsdWRlX3BhcmVudHMgPSB0cnVlLFxuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX2V0YWcgPSB0cnVlLFxuICAgICAgb3B0aW9ucyxcbiAgICB9OiB7XG4gICAgICBpbmNsdWRlX2lkPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfa2V5PzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfcGFyZW50cz86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2V0YWc/OiBib29sZWFuO1xuICAgICAgb3B0aW9ucz86IFBhcnNlck9wdGlvbnM7XG4gICAgfSA9IHt9LFxuICApOiBQYXJ0aWFsPFQ+IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0gb3B0aW9ucyA/PyB0aGlzLnBhcnNlck9wdGlvbnM7XG4gICAgbGV0IGZpZWxkcyA9IHRoaXMuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzLCBpbmNsdWRlX25hdmlnYXRpb24gfSk7XG4gICAgaWYgKCFpbmNsdWRlX2tleSkge1xuICAgICAgZmllbGRzID0gZmllbGRzLmZpbHRlcigoZikgPT4gIWYuaXNLZXkoKSk7XG4gICAgfVxuICAgIGlmICghaW5jbHVkZV9jb21wdXRlZCkge1xuICAgICAgZmllbGRzID0gZmllbGRzLmZpbHRlcihcbiAgICAgICAgKGYpID0+XG4gICAgICAgICAgIWYuYW5ub3RhdGVkVmFsdWU8Ym9vbGVhbj4oQ09NUFVURUQpIHx8IChmLmlzS2V5KCkgJiYgaW5jbHVkZV9rZXkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJzKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGtleSkgPT5cbiAgICAgICAgICBmaWVsZHMuc29tZSgoZikgPT4gZi5uYW1lID09PSBrZXkpIHx8XG4gICAgICAgICAgKGtleSA9PVxuICAgICAgICAgICAgT0RhdGFIZWxwZXJbcGFyc2VyT3B0aW9ucz8udmVyc2lvbiB8fCBERUZBVUxUX1ZFUlNJT05dLk9EQVRBX0VUQUcgJiZcbiAgICAgICAgICAgIGluY2x1ZGVfZXRhZykgfHxcbiAgICAgICAgICAoa2V5ID09XG4gICAgICAgICAgICBPRGF0YUhlbHBlcltwYXJzZXJPcHRpb25zPy52ZXJzaW9uIHx8IERFRkFVTFRfVkVSU0lPTl0uT0RBVEFfSUQgJiZcbiAgICAgICAgICAgIGluY2x1ZGVfaWQpLFxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjLCBrZXkpID0+IE9iamVjdC5hc3NpZ24oYWNjLCB7IFtrZXldOiBhdHRyc1trZXldIH0pLCB7fSk7XG4gIH1cblxuICByZXNvbHZlS2V5KFxuICAgIHZhbHVlOiBhbnksXG4gICAge1xuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgICBzaW5nbGUgPSB0cnVlLFxuICAgIH06IHsgcmVzb2x2ZT86IGJvb2xlYW47IHNpbmdsZT86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBhbnkge1xuICAgIGNvbnN0IGtleVR5cGVzID0gdGhpcy5rZXlzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGtleSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgZm9yICh2YXIga3Qgb2Yga2V5VHlwZXMpIHtcbiAgICAgIGxldCB2ID0gdmFsdWUgYXMgYW55O1xuICAgICAgbGV0IHN0cnVjdHVyZWQgPSB0aGlzIGFzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PiB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBmaWVsZDogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGxldCBuYW1lIG9mIGt0Lm5hbWUuc3BsaXQoJy8nKSkge1xuICAgICAgICBpZiAoc3RydWN0dXJlZCA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgZmllbGQgPSBzdHJ1Y3R1cmVkXG4gICAgICAgICAgLmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbjogZmFsc2UsIGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KVxuICAgICAgICAgIC5maW5kKChmOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8YW55PikgPT4gZi5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2ID0gVHlwZXMuaXNQbGFpbk9iamVjdCh2KSA/IHZbZmllbGQubmFtZV0gOiB2O1xuICAgICAgICAgIHN0cnVjdHVyZWQgPSBmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKClcbiAgICAgICAgICAgID8gZmllbGQuc3RydWN0dXJlZFR5cGUoKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZCAhPT0gdW5kZWZpbmVkICYmIHYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBrZXkuc2V0KGt0LmFsaWFzIHx8IGZpZWxkLm5hbWUsIGZpZWxkLmVuY29kZSh2KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChrZXkuc2l6ZSA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZVxuICAgICAgPyBPYmplY3RzLnJlc29sdmVLZXkoa2V5LCB7IHNpbmdsZSB9KVxuICAgICAgOiBPYmplY3QuZnJvbUVudHJpZXMoa2V5KTtcbiAgfVxuXG4gIGRlZmF1bHRzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBsZXQgZmllbGRzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBmYWxzZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KS5maWx0ZXIoKGYpID0+IGYuZGVmYXVsdCAhPT0gdW5kZWZpbmVkIHx8IGYuaXNTdHJ1Y3R1cmVkVHlwZSgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZmllbGRzLnJlZHVjZSgoYWNjLCBmKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZTogYW55ID0gZi5pc1N0cnVjdHVyZWRUeXBlKClcbiAgICAgICAgICA/IGYuc3RydWN0dXJlZFR5cGUoKS5kZWZhdWx0cygpXG4gICAgICAgICAgOiBmLmRlZmF1bHQ7XG4gICAgICAgIHJldHVybiBUeXBlcy5pc0VtcHR5KHZhbHVlKSA/IGFjYyA6IHsgLi4uYWNjLCBbZi5uYW1lXTogdmFsdWUgfTtcbiAgICAgIH0sIHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLy8gSnNvbiBTY2hlbWFcbiAgdG9Kc29uU2NoZW1hKG9wdGlvbnM6IEpzb25TY2hlbWFPcHRpb25zPFQ+ID0ge30pIHtcbiAgICBsZXQgc2NoZW1hOiBhbnkgPSB7XG4gICAgICAkc2NoZW1hOiAnaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjJyxcbiAgICAgICRpZDogYCR7dGhpcy5uYW1lc3BhY2V9LiR7dGhpcy5uYW1lfWAsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZWl6ZShERVNDUklQVElPTiksXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5hbm5vdGF0ZWRWYWx1ZShMT05HX0RFU0NSSVBUSU9OKSxcbiAgICAgIHR5cGU6IEpzb25TY2hlbWFUeXBlLm9iamVjdCxcbiAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgcmVxdWlyZWQ6IFtdLFxuICAgIH07XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgIH0pLmZpbHRlcihcbiAgICAgIChmKSA9PlxuICAgICAgICAoIWYubmF2aWdhdGlvbiB8fCAob3B0aW9ucy5leHBhbmQgJiYgZi5uYW1lIGluIG9wdGlvbnMuZXhwYW5kKSkgJiZcbiAgICAgICAgKCFvcHRpb25zLnNlbGVjdCB8fCAoPHN0cmluZ1tdPm9wdGlvbnMuc2VsZWN0KS5pbmRleE9mKGYubmFtZSkgIT09IC0xKSxcbiAgICApO1xuICAgIHNjaGVtYS5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgc2NoZW1hLnByb3BlcnRpZXMsXG4gICAgICBmaWVsZHNcbiAgICAgICAgLm1hcCgoZikgPT4ge1xuICAgICAgICAgIGxldCBleHBhbmQgPVxuICAgICAgICAgICAgb3B0aW9ucy5leHBhbmQgJiYgZi5uYW1lIGluIG9wdGlvbnMuZXhwYW5kXG4gICAgICAgICAgICAgID8gKG9wdGlvbnMuZXhwYW5kIGFzIGFueSlbZi5uYW1lXVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBsZXQgc2NoZW1hID0gZi50b0pzb25TY2hlbWEoZXhwYW5kKTtcbiAgICAgICAgICBpZiAob3B0aW9ucy5jdXN0b20gJiYgZi5uYW1lIGluIG9wdGlvbnMuY3VzdG9tKVxuICAgICAgICAgICAgc2NoZW1hID0gKFxuICAgICAgICAgICAgICBvcHRpb25zLmN1c3RvbVtmLm5hbWUgYXMga2V5b2YgVF0gYXMgKFxuICAgICAgICAgICAgICAgIHNjaGVtYTogYW55LFxuICAgICAgICAgICAgICAgIGZpZWxkOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8YW55PixcbiAgICAgICAgICAgICAgKSA9PiBhbnlcbiAgICAgICAgICAgICkoc2NoZW1hLCBmKTtcbiAgICAgICAgICByZXR1cm4geyBbZi5uYW1lXTogc2NoZW1hIH07XG4gICAgICAgIH0pXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgdikgPT4gT2JqZWN0LmFzc2lnbihhY2MsIHYpLCB7fSksXG4gICAgKTtcbiAgICBzY2hlbWEucmVxdWlyZWQgPSBbXG4gICAgICAuLi5zY2hlbWEucmVxdWlyZWQsXG4gICAgICAuLi5maWVsZHNcbiAgICAgICAgLmZpbHRlcigoZikgPT5cbiAgICAgICAgICBvcHRpb25zLnJlcXVpcmVkICYmIGYubmFtZSBpbiBvcHRpb25zLnJlcXVpcmVkXG4gICAgICAgICAgICA/IG9wdGlvbnMucmVxdWlyZWRbZi5uYW1lIGFzIGtleW9mIFRdXG4gICAgICAgICAgICA6ICFmLm51bGxhYmxlLFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGYpID0+IGYubmFtZSksXG4gICAgXTtcbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgYXR0cnM6IGFueSxcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgY3JlYXRlPzogYm9vbGVhbjtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVycm9ycyA9IHt9IGFzIHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KS5maWx0ZXIoKGYpID0+ICFmLm5hdmlnYXRpb24gfHwgbmF2aWdhdGlvbik7XG4gICAgZm9yICh2YXIgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF0dHJzW2ZpZWxkLm5hbWUgYXMga2V5b2YgVF07XG4gICAgICBjb25zdCBlcnJzID0gZmllbGQudmFsaWRhdGUodmFsdWUsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pO1xuICAgICAgaWYgKGVycnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcnNbZmllbGQubmFtZV0gPSBlcnJzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZXJyb3JzKSA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|