angular-odata 0.121.0 → 0.123.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/esm2022/lib/client.mjs +253 -0
- package/esm2022/lib/models/collection.mjs +862 -0
- package/esm2022/lib/models/model.mjs +519 -0
- package/esm2022/lib/models/options.mjs +1110 -0
- package/esm2022/lib/module.mjs +43 -0
- package/esm2022/lib/resources/query/builder.mjs +619 -0
- package/{esm2020 → esm2022}/lib/resources/query/expressions/base.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/query/expressions/compute.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/query/expressions/count.mjs +1 -1
- package/esm2022/lib/resources/query/expressions/expand.mjs +119 -0
- package/esm2022/lib/resources/query/expressions/filter.mjs +161 -0
- package/{esm2020 → esm2022}/lib/resources/query/expressions/orderby.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/query/expressions/search.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/query/expressions/select.mjs +1 -1
- package/esm2022/lib/resources/query/expressions/syntax.mjs +409 -0
- package/{esm2020 → esm2022}/lib/resources/query/handlers.mjs +1 -1
- package/esm2022/lib/resources/query/options.mjs +115 -0
- package/esm2022/lib/resources/responses/metadata.mjs +548 -0
- package/esm2022/lib/schema/parsers/edm.mjs +99 -0
- package/{esm2020 → esm2022}/lib/schema/parsers/enum-type.mjs +2 -2
- package/esm2022/lib/services/factory.mjs +34 -0
- package/esm2022/lib/utils/enums.mjs +61 -0
- package/{fesm2020 → fesm2022}/angular-odata.mjs +643 -614
- package/fesm2022/angular-odata.mjs.map +1 -0
- package/lib/helper.d.ts +1 -1
- package/lib/models/model.d.ts +7 -16
- package/lib/models/options.d.ts +51 -33
- package/lib/resources/path/segments.d.ts +1 -1
- package/lib/resources/query/builder.d.ts +21 -20
- package/lib/resources/query/expressions/base.d.ts +3 -3
- package/lib/resources/query/expressions/compute.d.ts +2 -2
- package/lib/resources/query/expressions/count.d.ts +3 -3
- package/lib/resources/query/expressions/expand.d.ts +13 -12
- package/lib/resources/query/expressions/filter.d.ts +15 -15
- package/lib/resources/query/expressions/orderby.d.ts +3 -3
- package/lib/resources/query/expressions/search.d.ts +3 -3
- package/lib/resources/query/expressions/select.d.ts +2 -2
- package/lib/resources/query/expressions/syntax.d.ts +59 -58
- package/lib/resources/query/handlers.d.ts +2 -2
- package/lib/resources/query/options.d.ts +1 -1
- package/lib/resources/resource.d.ts +1 -1
- package/lib/resources/responses/types.d.ts +3 -3
- package/lib/resources/types/options.d.ts +7 -7
- package/lib/schema/parsers/structured-type.d.ts +5 -5
- package/lib/types.d.ts +15 -15
- package/lib/utils/durations.d.ts +1 -1
- package/lib/utils/enums.d.ts +3 -0
- package/package.json +9 -15
- package/esm2020/lib/client.mjs +0 -252
- package/esm2020/lib/models/collection.mjs +0 -857
- package/esm2020/lib/models/model.mjs +0 -518
- package/esm2020/lib/models/options.mjs +0 -1130
- package/esm2020/lib/module.mjs +0 -42
- package/esm2020/lib/resources/query/builder.mjs +0 -588
- package/esm2020/lib/resources/query/expressions/expand.mjs +0 -115
- package/esm2020/lib/resources/query/expressions/filter.mjs +0 -161
- package/esm2020/lib/resources/query/expressions/syntax.mjs +0 -409
- package/esm2020/lib/resources/query/options.mjs +0 -115
- package/esm2020/lib/resources/responses/metadata.mjs +0 -547
- package/esm2020/lib/schema/parsers/edm.mjs +0 -104
- package/esm2020/lib/services/factory.mjs +0 -33
- package/esm2020/lib/utils/enums.mjs +0 -45
- package/fesm2015/angular-odata.mjs +0 -11841
- package/fesm2015/angular-odata.mjs.map +0 -1
- package/fesm2020/angular-odata.mjs.map +0 -1
- /package/{esm2020 → esm2022}/angular-odata.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/api.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/cache/cache.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/cache/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/cache/memory.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/cache/storage.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/constants.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/helper.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/loaders.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/path/handlers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/path/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/path/segments.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/query/expressions/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/query/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/request.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/resource.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/annotations.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-annotation.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-entity-container.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-entity-set.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-enum-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-function-action.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-reference.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-schema.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-singleton.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-structural-property.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-structured-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-type-definition.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/response.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/types.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/action.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/batch.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/count.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/entity-set.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/entity.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/function.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/media.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/metadata.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/navigation-property.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/property.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/reference.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/singleton.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/value.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/annotation.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/callable.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/element.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/entity-container.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/entity-set.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/enum-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/parsers/callable.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/parsers/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/parsers/structured-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/schema.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/structured-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/base.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/entity-set.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/entity.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/singleton.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/settings.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/types.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/arraybuffers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/arrays.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/dates.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/durations.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/http.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/objects.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/odata.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/strings.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/types.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/urls.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
|
@@ -1,1130 +0,0 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
|
-
import { finalize } from 'rxjs/operators';
|
|
3
|
-
import { CID_FIELD_NAME, COMPUTED, DEFAULT_VERSION, OPTIMISTIC_CONCURRENCY, } from '../constants';
|
|
4
|
-
import { ODataHelper } from '../helper';
|
|
5
|
-
import { ODataEntityAnnotations, ODataEntityResource, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPropertyResource, } from '../resources';
|
|
6
|
-
import { EdmType } from '../types';
|
|
7
|
-
import { Objects, Types } from '../utils';
|
|
8
|
-
export class ODataModelEvent {
|
|
9
|
-
constructor(name, { model, collection, previous, value, field, options, } = {}) {
|
|
10
|
-
this.bubbling = true;
|
|
11
|
-
this.name = name;
|
|
12
|
-
this.model = model;
|
|
13
|
-
this.collection = collection;
|
|
14
|
-
this.previous = previous;
|
|
15
|
-
this.value = value;
|
|
16
|
-
this.options = options;
|
|
17
|
-
this.chain = [
|
|
18
|
-
[
|
|
19
|
-
(this.collection || this.model),
|
|
20
|
-
field || null,
|
|
21
|
-
],
|
|
22
|
-
];
|
|
23
|
-
}
|
|
24
|
-
stopPropagation() {
|
|
25
|
-
this.bubbling = false;
|
|
26
|
-
}
|
|
27
|
-
push(model, field) {
|
|
28
|
-
let event = new ODataModelEvent(this.name, {
|
|
29
|
-
model: this.model,
|
|
30
|
-
collection: this.collection,
|
|
31
|
-
previous: this.previous,
|
|
32
|
-
value: this.value,
|
|
33
|
-
options: this.options,
|
|
34
|
-
});
|
|
35
|
-
event.chain = [...this.chain];
|
|
36
|
-
event.chain.splice(0, 0, [model, field]);
|
|
37
|
-
return event;
|
|
38
|
-
}
|
|
39
|
-
visited(model) {
|
|
40
|
-
return (this.chain.some((c) => c[0] === model) &&
|
|
41
|
-
this.chain[this.chain.length - 1][0] !== model);
|
|
42
|
-
}
|
|
43
|
-
get path() {
|
|
44
|
-
return this.chain
|
|
45
|
-
.map(([, field], index) => typeof field === 'number'
|
|
46
|
-
? `[${field}]`
|
|
47
|
-
: field instanceof ODataModelField
|
|
48
|
-
? index === 0
|
|
49
|
-
? field.name
|
|
50
|
-
: `.${field.name}`
|
|
51
|
-
: '')
|
|
52
|
-
.join('');
|
|
53
|
-
}
|
|
54
|
-
//Identifies the current model for the event
|
|
55
|
-
get currentModel() {
|
|
56
|
-
const link = this.chain.find((c) => ODataModelOptions.isModel(c[0]));
|
|
57
|
-
return link !== undefined ? link[0] : undefined;
|
|
58
|
-
}
|
|
59
|
-
//Identifies the current collection for the event
|
|
60
|
-
get currentCollection() {
|
|
61
|
-
const link = this.chain.find((c) => ODataModelOptions.isCollection(c[0]));
|
|
62
|
-
return link !== undefined
|
|
63
|
-
? link[0]
|
|
64
|
-
: undefined;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
export const BUBBLING = [
|
|
68
|
-
'change',
|
|
69
|
-
'reset',
|
|
70
|
-
'update',
|
|
71
|
-
'destroy',
|
|
72
|
-
'add',
|
|
73
|
-
'remove',
|
|
74
|
-
];
|
|
75
|
-
export const INCLUDE_SHALLOW = {
|
|
76
|
-
include_concurrency: true,
|
|
77
|
-
include_computed: true,
|
|
78
|
-
include_key: true,
|
|
79
|
-
};
|
|
80
|
-
export const INCLUDE_DEEP = {
|
|
81
|
-
include_navigation: true,
|
|
82
|
-
include_non_field: true,
|
|
83
|
-
...INCLUDE_SHALLOW,
|
|
84
|
-
};
|
|
85
|
-
export var ODataModelState;
|
|
86
|
-
(function (ODataModelState) {
|
|
87
|
-
ODataModelState[ODataModelState["Added"] = 0] = "Added";
|
|
88
|
-
ODataModelState[ODataModelState["Removed"] = 1] = "Removed";
|
|
89
|
-
ODataModelState[ODataModelState["Changed"] = 2] = "Changed";
|
|
90
|
-
ODataModelState[ODataModelState["Unchanged"] = 3] = "Unchanged";
|
|
91
|
-
})(ODataModelState || (ODataModelState = {}));
|
|
92
|
-
export function Model({ cid = CID_FIELD_NAME } = {}) {
|
|
93
|
-
return (constructor) => {
|
|
94
|
-
const Klass = constructor;
|
|
95
|
-
if (!Klass.hasOwnProperty('options'))
|
|
96
|
-
Klass.options = { fields: {} };
|
|
97
|
-
Klass.options.cid = cid;
|
|
98
|
-
return constructor;
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
export function ModelField({ name, ...options } = {}) {
|
|
102
|
-
return (target, key) => {
|
|
103
|
-
const Klass = target.constructor;
|
|
104
|
-
if (!Klass.hasOwnProperty('options'))
|
|
105
|
-
Klass.options = { fields: {} };
|
|
106
|
-
options.field = name || key;
|
|
107
|
-
Klass.options.fields[key] = options;
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
export class ODataModelField {
|
|
111
|
-
constructor(options, { name, field, parser, ...opts }) {
|
|
112
|
-
this.options = options;
|
|
113
|
-
this.name = name;
|
|
114
|
-
this.field = field;
|
|
115
|
-
this.parser = parser;
|
|
116
|
-
this.default = opts.default || parser.default;
|
|
117
|
-
this.required = Boolean(opts.required || !parser.nullable);
|
|
118
|
-
this.concurrency = Boolean(opts.concurrency);
|
|
119
|
-
this.maxLength = opts.maxLength || parser.maxLength;
|
|
120
|
-
this.minLength = opts.minLength;
|
|
121
|
-
this.min = opts.min;
|
|
122
|
-
this.max = opts.max;
|
|
123
|
-
this.pattern = opts.pattern;
|
|
124
|
-
}
|
|
125
|
-
get api() {
|
|
126
|
-
return this.options.api;
|
|
127
|
-
}
|
|
128
|
-
get type() {
|
|
129
|
-
return this.parser.type;
|
|
130
|
-
}
|
|
131
|
-
get navigation() {
|
|
132
|
-
return Boolean(this.parser.navigation);
|
|
133
|
-
}
|
|
134
|
-
get collection() {
|
|
135
|
-
return Boolean(this.parser.collection);
|
|
136
|
-
}
|
|
137
|
-
annotatedValue(term) {
|
|
138
|
-
return this.parser.annotatedValue(term);
|
|
139
|
-
}
|
|
140
|
-
configure({ findOptionsForType, concurrency, options, }) {
|
|
141
|
-
this.meta = findOptionsForType(this.parser.type);
|
|
142
|
-
this.parserOptions = options;
|
|
143
|
-
if (concurrency)
|
|
144
|
-
this.concurrency = concurrency;
|
|
145
|
-
if (this.default !== undefined)
|
|
146
|
-
this.default = this.deserialize(this.default, options);
|
|
147
|
-
}
|
|
148
|
-
isKey() {
|
|
149
|
-
return this.parser.isKey();
|
|
150
|
-
}
|
|
151
|
-
hasReferentials() {
|
|
152
|
-
return this.parser.hasReferentials();
|
|
153
|
-
}
|
|
154
|
-
get referentials() {
|
|
155
|
-
return this.parser.referentials;
|
|
156
|
-
}
|
|
157
|
-
isStructuredType() {
|
|
158
|
-
return this.parser.isStructuredType();
|
|
159
|
-
}
|
|
160
|
-
structured() {
|
|
161
|
-
let structuredType = this.api.findStructuredTypeForType(this.parser.type);
|
|
162
|
-
//Throw error if not found
|
|
163
|
-
if (!structuredType)
|
|
164
|
-
throw new Error(`Could not find structured type for ${this.parser.type}`);
|
|
165
|
-
return structuredType;
|
|
166
|
-
}
|
|
167
|
-
isEnumType() {
|
|
168
|
-
return this.parser.isEnumType();
|
|
169
|
-
}
|
|
170
|
-
enum() {
|
|
171
|
-
let enumType = this.api.findEnumTypeForType(this.parser.type);
|
|
172
|
-
//Throw error if not found
|
|
173
|
-
if (!enumType)
|
|
174
|
-
throw new Error(`Could not find enum type for ${this.parser.type}`);
|
|
175
|
-
return enumType;
|
|
176
|
-
}
|
|
177
|
-
validate(value, { method, navigation = false, } = {}) {
|
|
178
|
-
/*
|
|
179
|
-
if ('isValid' in value && typeof value.isValid === 'function') {
|
|
180
|
-
return !value.isValid({ method, navigation }) ? value._errors : undefined;
|
|
181
|
-
} else if ('models' in value && typeof value.models === 'function') {
|
|
182
|
-
*/
|
|
183
|
-
if (ODataModelOptions.isModel(value)) {
|
|
184
|
-
return !value.isValid({ method, navigation }) ? value._errors : undefined;
|
|
185
|
-
}
|
|
186
|
-
else if (ODataModelOptions.isCollection(value)) {
|
|
187
|
-
return value
|
|
188
|
-
.models()
|
|
189
|
-
.some((m) => !m.isValid({ method, navigation }))
|
|
190
|
-
? value.models().map((m) => m._errors)
|
|
191
|
-
: undefined;
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
const computed = this.annotatedValue(COMPUTED);
|
|
195
|
-
let errors = this.parser?.validate(value, { method, navigation }) || [];
|
|
196
|
-
if (this.required &&
|
|
197
|
-
(value === null || (value === undefined && method !== 'modify')) && // Is null or undefined without patch?
|
|
198
|
-
!(computed && method === 'create') // Not (Is Computed field and create) ?
|
|
199
|
-
) {
|
|
200
|
-
errors['push'](`required`);
|
|
201
|
-
}
|
|
202
|
-
if (this.maxLength !== undefined &&
|
|
203
|
-
typeof value === 'string' &&
|
|
204
|
-
value.length > this.maxLength) {
|
|
205
|
-
errors['push'](`maxlength`);
|
|
206
|
-
}
|
|
207
|
-
if (this.minLength !== undefined &&
|
|
208
|
-
typeof value === 'string' &&
|
|
209
|
-
value.length < this.minLength) {
|
|
210
|
-
errors['push'](`minlength`);
|
|
211
|
-
}
|
|
212
|
-
if (this.min !== undefined &&
|
|
213
|
-
typeof value === 'number' &&
|
|
214
|
-
value < this.min) {
|
|
215
|
-
errors['push'](`min`);
|
|
216
|
-
}
|
|
217
|
-
if (this.max !== undefined &&
|
|
218
|
-
typeof value === 'number' &&
|
|
219
|
-
value > this.max) {
|
|
220
|
-
errors['push'](`max`);
|
|
221
|
-
}
|
|
222
|
-
if (this.pattern !== undefined &&
|
|
223
|
-
typeof value === 'string' &&
|
|
224
|
-
!this.pattern.test(value)) {
|
|
225
|
-
errors['push'](`pattern`);
|
|
226
|
-
}
|
|
227
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
defaults() {
|
|
231
|
-
return this.isStructuredType() && this.meta !== undefined
|
|
232
|
-
? this.meta.defaults()
|
|
233
|
-
: this.default;
|
|
234
|
-
}
|
|
235
|
-
deserialize(value, options) {
|
|
236
|
-
const parserOptions = options || this.parserOptions;
|
|
237
|
-
return this.parser.deserialize(value, parserOptions);
|
|
238
|
-
}
|
|
239
|
-
serialize(value, options) {
|
|
240
|
-
const parserOptions = options || this.parserOptions;
|
|
241
|
-
return this.parser.serialize(value, parserOptions);
|
|
242
|
-
}
|
|
243
|
-
encode(value, options) {
|
|
244
|
-
const parserOptions = options || this.parserOptions;
|
|
245
|
-
return this.parser.encode(value, parserOptions);
|
|
246
|
-
}
|
|
247
|
-
resourceFactory(base) {
|
|
248
|
-
if (!(base instanceof ODataEntityResource ||
|
|
249
|
-
base instanceof ODataNavigationPropertyResource ||
|
|
250
|
-
base instanceof ODataPropertyResource))
|
|
251
|
-
throw new Error("Can't build resource for non compatible base type");
|
|
252
|
-
return this.navigation
|
|
253
|
-
? base.navigationProperty(this.parser.name)
|
|
254
|
-
: base.property(this.parser.name);
|
|
255
|
-
}
|
|
256
|
-
annotationsFactory(base) {
|
|
257
|
-
return this.parser.collection
|
|
258
|
-
? base.property(this.parser.name, 'collection')
|
|
259
|
-
: base.property(this.parser.name, 'single');
|
|
260
|
-
}
|
|
261
|
-
schemaFactory(base) {
|
|
262
|
-
return this.api.findStructuredTypeForType(this.parser.type);
|
|
263
|
-
}
|
|
264
|
-
modelFactory({ parent, value, reset, }) {
|
|
265
|
-
// Model
|
|
266
|
-
const annots = this.annotationsFactory(parent.annots());
|
|
267
|
-
let Model = this.api.modelForType(this.parser.type);
|
|
268
|
-
if (Model === undefined)
|
|
269
|
-
throw Error(`No Model type for ${this.name}`);
|
|
270
|
-
if (value !== undefined) {
|
|
271
|
-
annots.update(value);
|
|
272
|
-
}
|
|
273
|
-
if (annots?.type !== undefined && Model.meta !== null) {
|
|
274
|
-
let schema = Model.meta.findChildOptions((o) => o.isTypeOf(annots.type))?.schema;
|
|
275
|
-
if (schema !== undefined && schema.model !== undefined)
|
|
276
|
-
// Change to child model
|
|
277
|
-
Model = schema.model;
|
|
278
|
-
}
|
|
279
|
-
return new Model((value || {}), {
|
|
280
|
-
annots,
|
|
281
|
-
reset,
|
|
282
|
-
parent: [parent, this],
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
collectionFactory({ parent, value, reset, }) {
|
|
286
|
-
// Collection Factory
|
|
287
|
-
const annots = this.annotationsFactory(parent.annots());
|
|
288
|
-
const Collection = this.api.collectionForType(this.parser.type);
|
|
289
|
-
if (Collection === undefined)
|
|
290
|
-
throw Error(`No Collection type for ${this.name}`);
|
|
291
|
-
return new Collection((value || []), {
|
|
292
|
-
annots: annots,
|
|
293
|
-
reset,
|
|
294
|
-
parent: [parent, this],
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
export class ODataModelOptions {
|
|
299
|
-
constructor({ options, schema, }) {
|
|
300
|
-
this._fields = [];
|
|
301
|
-
this.children = [];
|
|
302
|
-
this.tsToEdm = {
|
|
303
|
-
string: EdmType.String,
|
|
304
|
-
number: EdmType.Int32,
|
|
305
|
-
bigint: EdmType.Int64,
|
|
306
|
-
boolean: EdmType.Boolean,
|
|
307
|
-
};
|
|
308
|
-
this.name = schema.name;
|
|
309
|
-
this.base = schema.base;
|
|
310
|
-
this.open = schema.open;
|
|
311
|
-
this.schema = schema;
|
|
312
|
-
this.cid = options?.cid || CID_FIELD_NAME;
|
|
313
|
-
Object.entries(options.fields).forEach(([name, options]) => this.addField(name, options));
|
|
314
|
-
}
|
|
315
|
-
get api() {
|
|
316
|
-
return this.schema.api;
|
|
317
|
-
}
|
|
318
|
-
type({ alias = false } = {}) {
|
|
319
|
-
return this.schema.type({ alias });
|
|
320
|
-
}
|
|
321
|
-
isOpenType() {
|
|
322
|
-
return this.schema.isOpenType();
|
|
323
|
-
}
|
|
324
|
-
isTypeOf(type) {
|
|
325
|
-
return this.schema.isTypeOf(type);
|
|
326
|
-
}
|
|
327
|
-
isModelFor(entity) {
|
|
328
|
-
// Resolve By Type
|
|
329
|
-
let type = this.api.options.helper.type(entity);
|
|
330
|
-
if (type && this.isTypeOf(type))
|
|
331
|
-
return true;
|
|
332
|
-
// Resolve By fields
|
|
333
|
-
let keys = Object.keys(entity);
|
|
334
|
-
let names = this.fields({
|
|
335
|
-
include_navigation: true,
|
|
336
|
-
include_parents: true,
|
|
337
|
-
}).map((f) => f.name);
|
|
338
|
-
return keys.every((key) => names.includes(key));
|
|
339
|
-
}
|
|
340
|
-
findChildOptions(predicate) {
|
|
341
|
-
if (predicate(this))
|
|
342
|
-
return this;
|
|
343
|
-
let match;
|
|
344
|
-
for (let ch of this.children) {
|
|
345
|
-
match = ch.findChildOptions(predicate);
|
|
346
|
-
if (match !== undefined)
|
|
347
|
-
break;
|
|
348
|
-
}
|
|
349
|
-
return match;
|
|
350
|
-
}
|
|
351
|
-
configure({ options, parserForType, findOptionsForType, }) {
|
|
352
|
-
if (this.base) {
|
|
353
|
-
const parent = findOptionsForType(this.base);
|
|
354
|
-
parent.children.push(this);
|
|
355
|
-
this.parent = parent;
|
|
356
|
-
}
|
|
357
|
-
this.entitySet = this.api.findEntitySetForEntityType(this.type());
|
|
358
|
-
let concurrencyFields = [];
|
|
359
|
-
if (this.entitySet !== undefined) {
|
|
360
|
-
concurrencyFields =
|
|
361
|
-
this.entitySet.annotatedValue(OPTIMISTIC_CONCURRENCY) || [];
|
|
362
|
-
}
|
|
363
|
-
this._fields.forEach((field) => {
|
|
364
|
-
let concurrency = concurrencyFields.indexOf(field.field) !== -1;
|
|
365
|
-
field.configure({
|
|
366
|
-
findOptionsForType,
|
|
367
|
-
concurrency,
|
|
368
|
-
options,
|
|
369
|
-
});
|
|
370
|
-
});
|
|
371
|
-
}
|
|
372
|
-
fields({ include_navigation, include_parents, }) {
|
|
373
|
-
return [
|
|
374
|
-
...(include_parents && this.parent !== undefined
|
|
375
|
-
? this.parent.fields({ include_navigation, include_parents })
|
|
376
|
-
: []),
|
|
377
|
-
...this._fields.filter((field) => include_navigation || !field.navigation),
|
|
378
|
-
];
|
|
379
|
-
}
|
|
380
|
-
field(name) {
|
|
381
|
-
let field = this.findField(name);
|
|
382
|
-
//Throw error if not found
|
|
383
|
-
if (field === undefined)
|
|
384
|
-
throw new Error(`No field with name ${name}`);
|
|
385
|
-
return field;
|
|
386
|
-
}
|
|
387
|
-
findField(name) {
|
|
388
|
-
return this.fields({
|
|
389
|
-
include_parents: true,
|
|
390
|
-
include_navigation: true,
|
|
391
|
-
}).find((modelField) => modelField.name === name || modelField.field === name);
|
|
392
|
-
}
|
|
393
|
-
addField(name, options) {
|
|
394
|
-
const { field, parser, ...opts } = options;
|
|
395
|
-
if (field === undefined || name === undefined)
|
|
396
|
-
throw new Error('Model Properties need name and field');
|
|
397
|
-
const fieldParser = parser ?? this.schema.field(field);
|
|
398
|
-
if (fieldParser === undefined)
|
|
399
|
-
throw new Error(`No parser for ${field} with name = ${name}`);
|
|
400
|
-
const modelField = new ODataModelField(this, {
|
|
401
|
-
name,
|
|
402
|
-
field,
|
|
403
|
-
parser: fieldParser,
|
|
404
|
-
...opts,
|
|
405
|
-
});
|
|
406
|
-
this._fields.push(modelField);
|
|
407
|
-
return modelField;
|
|
408
|
-
}
|
|
409
|
-
modelFieldFactory(self, name, type) {
|
|
410
|
-
const structuredFieldParser = this.schema.addField(name, { type });
|
|
411
|
-
structuredFieldParser.configure({
|
|
412
|
-
findOptionsForType: (type) => this.api.findOptionsForType(type),
|
|
413
|
-
parserForType: (type) => this.api.parserForType(type),
|
|
414
|
-
options: this.api.options,
|
|
415
|
-
});
|
|
416
|
-
const modelField = this.addField(name, {
|
|
417
|
-
field: name,
|
|
418
|
-
parser: structuredFieldParser,
|
|
419
|
-
});
|
|
420
|
-
modelField.configure({
|
|
421
|
-
findOptionsForType: (type) => this.api.findOptionsForType(type),
|
|
422
|
-
options: this.api.options,
|
|
423
|
-
concurrency: false,
|
|
424
|
-
});
|
|
425
|
-
Object.defineProperty(self, modelField.name, {
|
|
426
|
-
configurable: true,
|
|
427
|
-
get: () => this.get(self, modelField),
|
|
428
|
-
set: (value) => this.set(self, modelField, value),
|
|
429
|
-
});
|
|
430
|
-
return modelField;
|
|
431
|
-
}
|
|
432
|
-
attach(self, resource) {
|
|
433
|
-
if (self._resource !== null &&
|
|
434
|
-
resource.type() !== self._resource.type() &&
|
|
435
|
-
!self._resource.isSubtypeOf(resource))
|
|
436
|
-
throw new Error(`Can't attach ${resource.type()} to ${self._resource.type()}`);
|
|
437
|
-
const current = self._resource;
|
|
438
|
-
if (current === null || !current.isEqualTo(resource)) {
|
|
439
|
-
self._resource = resource;
|
|
440
|
-
self.events$.emit(new ODataModelEvent('attach', {
|
|
441
|
-
model: self,
|
|
442
|
-
previous: current,
|
|
443
|
-
value: resource,
|
|
444
|
-
}));
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
//# region Resource
|
|
448
|
-
static chain(child) {
|
|
449
|
-
const chain = [];
|
|
450
|
-
let tuple = [child, null];
|
|
451
|
-
while (tuple !== null) {
|
|
452
|
-
const parent = tuple;
|
|
453
|
-
if (chain.some((p) => p[0] === parent[0]))
|
|
454
|
-
break;
|
|
455
|
-
chain.splice(0, 0, parent);
|
|
456
|
-
tuple = tuple[0]._parent;
|
|
457
|
-
}
|
|
458
|
-
return chain;
|
|
459
|
-
}
|
|
460
|
-
static resource(child) {
|
|
461
|
-
let resource = null;
|
|
462
|
-
let prevField = null;
|
|
463
|
-
for (let [model, field] of ODataModelOptions.chain(child)) {
|
|
464
|
-
resource = resource || model._resource;
|
|
465
|
-
if (resource === null)
|
|
466
|
-
break;
|
|
467
|
-
if (ODataModelOptions.isModel(model) &&
|
|
468
|
-
(prevField === null || prevField.collection)) {
|
|
469
|
-
// Resolve key
|
|
470
|
-
let modelKey = model.key({
|
|
471
|
-
field_mapping: true,
|
|
472
|
-
});
|
|
473
|
-
if (modelKey !== undefined)
|
|
474
|
-
resource =
|
|
475
|
-
resource instanceof ODataEntitySetResource
|
|
476
|
-
? resource.entity(modelKey)
|
|
477
|
-
: resource.key(modelKey);
|
|
478
|
-
}
|
|
479
|
-
prevField = field;
|
|
480
|
-
if (field === null) {
|
|
481
|
-
// Apply the query from model to new resource
|
|
482
|
-
const query = model._resource?.cloneQuery().toQueryArguments();
|
|
483
|
-
if (query !== undefined)
|
|
484
|
-
resource.query((q) => q.apply(query));
|
|
485
|
-
continue;
|
|
486
|
-
}
|
|
487
|
-
resource = field.resourceFactory(resource);
|
|
488
|
-
}
|
|
489
|
-
if (resource === null)
|
|
490
|
-
throw new Error(`resource: Can't build resource for ${child}`);
|
|
491
|
-
return resource;
|
|
492
|
-
}
|
|
493
|
-
collectionResourceFactory(query) {
|
|
494
|
-
if (this.entitySet === undefined)
|
|
495
|
-
return undefined;
|
|
496
|
-
return ODataEntitySetResource.factory(this.api, {
|
|
497
|
-
path: this.entitySet.name,
|
|
498
|
-
schema: this.schema,
|
|
499
|
-
query,
|
|
500
|
-
});
|
|
501
|
-
}
|
|
502
|
-
modelResourceFactory(query) {
|
|
503
|
-
const resource = this.collectionResourceFactory(query);
|
|
504
|
-
if (resource instanceof ODataEntitySetResource)
|
|
505
|
-
return resource.entity();
|
|
506
|
-
return resource;
|
|
507
|
-
}
|
|
508
|
-
entityResource(self) {
|
|
509
|
-
let resource = this.modelResourceFactory(self._resource !== null ? self._resource.cloneQuery() : undefined);
|
|
510
|
-
if (resource === undefined)
|
|
511
|
-
throw new Error(`entityResource: Can't build resource for ${self}`);
|
|
512
|
-
const key = self.key({ field_mapping: true });
|
|
513
|
-
if (key !== undefined)
|
|
514
|
-
return resource.key(key);
|
|
515
|
-
return resource;
|
|
516
|
-
}
|
|
517
|
-
//#endregion
|
|
518
|
-
bind(self, { parent, resource, annots, } = {}) {
|
|
519
|
-
// Parent
|
|
520
|
-
if (parent !== undefined) {
|
|
521
|
-
self._parent = parent;
|
|
522
|
-
}
|
|
523
|
-
// Resource
|
|
524
|
-
if (self._parent === null && resource === undefined)
|
|
525
|
-
resource = this.modelResourceFactory();
|
|
526
|
-
if (resource !== undefined) {
|
|
527
|
-
this.attach(self, resource);
|
|
528
|
-
}
|
|
529
|
-
// Annotations
|
|
530
|
-
self._annotations =
|
|
531
|
-
annots || new ODataEntityAnnotations(ODataHelper[DEFAULT_VERSION]);
|
|
532
|
-
const fields = this.fields({
|
|
533
|
-
include_navigation: true,
|
|
534
|
-
include_parents: true,
|
|
535
|
-
});
|
|
536
|
-
for (let field of fields) {
|
|
537
|
-
Object.defineProperty(self, field.name, {
|
|
538
|
-
configurable: true,
|
|
539
|
-
get: () => this.get(self, field),
|
|
540
|
-
set: (value) => this.set(self, field, value),
|
|
541
|
-
});
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
query(self, resource, func) {
|
|
545
|
-
resource.query(func);
|
|
546
|
-
this.attach(self, resource);
|
|
547
|
-
return self;
|
|
548
|
-
}
|
|
549
|
-
resolveKey(value, { field_mapping = false, resolve = true, single = true, } = {}) {
|
|
550
|
-
const keyTypes = this.schema.keys({ include_parents: true });
|
|
551
|
-
const key = new Map();
|
|
552
|
-
for (let kt of keyTypes) {
|
|
553
|
-
let v = value;
|
|
554
|
-
let options = this;
|
|
555
|
-
let field;
|
|
556
|
-
for (let name of kt.name.split('/')) {
|
|
557
|
-
if (options === undefined)
|
|
558
|
-
break;
|
|
559
|
-
field = options
|
|
560
|
-
.fields({ include_navigation: false, include_parents: true })
|
|
561
|
-
.find((field) => field.field === name);
|
|
562
|
-
if (field !== undefined) {
|
|
563
|
-
v =
|
|
564
|
-
Types.isPlainObject(v) || ODataModelOptions.isModel(v)
|
|
565
|
-
? v[field.name]
|
|
566
|
-
: v;
|
|
567
|
-
options = field.meta;
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
if (field === undefined)
|
|
571
|
-
return undefined;
|
|
572
|
-
let name = field_mapping ? field.field : field.name;
|
|
573
|
-
if (kt.alias !== undefined)
|
|
574
|
-
name = kt.alias;
|
|
575
|
-
key.set(name, v);
|
|
576
|
-
}
|
|
577
|
-
if (key.size === 0)
|
|
578
|
-
return undefined;
|
|
579
|
-
return resolve
|
|
580
|
-
? Objects.resolveKey(key, { single })
|
|
581
|
-
: Object.fromEntries(key);
|
|
582
|
-
}
|
|
583
|
-
resolveReferential(value, field, { field_mapping = false, resolve = true, single = false, } = {}) {
|
|
584
|
-
const referential = new Map();
|
|
585
|
-
for (let ref of field.referentials) {
|
|
586
|
-
let from = this.fields({
|
|
587
|
-
include_navigation: false,
|
|
588
|
-
include_parents: true,
|
|
589
|
-
}).find((p) => p.field === ref.referencedProperty);
|
|
590
|
-
let to = field.options
|
|
591
|
-
.fields({ include_navigation: false, include_parents: true })
|
|
592
|
-
.find((field) => field.field === ref.property);
|
|
593
|
-
if (from !== undefined && to !== undefined) {
|
|
594
|
-
let name = field_mapping ? to.field : to.name;
|
|
595
|
-
referential.set(name, value && value[from.name]);
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
if (referential.size === 0)
|
|
599
|
-
return undefined;
|
|
600
|
-
if (referential.size === 1 && Array.from(referential.values())[0] === null)
|
|
601
|
-
return null;
|
|
602
|
-
return resolve
|
|
603
|
-
? Objects.resolveKey(referential, { single })
|
|
604
|
-
: Object.fromEntries(referential);
|
|
605
|
-
}
|
|
606
|
-
resolveReferenced(value, field, { field_mapping = false, resolve = true, single = false, } = {}) {
|
|
607
|
-
const referenced = new Map();
|
|
608
|
-
for (let ref of field.referentials) {
|
|
609
|
-
let from = this.fields({
|
|
610
|
-
include_navigation: false,
|
|
611
|
-
include_parents: true,
|
|
612
|
-
}).find((field) => field.field === ref.property);
|
|
613
|
-
let to = field.meta
|
|
614
|
-
.fields({ include_navigation: false, include_parents: true })
|
|
615
|
-
.find((field) => field.field === ref.referencedProperty);
|
|
616
|
-
if (from !== undefined && to !== undefined) {
|
|
617
|
-
let name = field_mapping ? to.field : to.name;
|
|
618
|
-
referenced.set(name, value && value[from.name]);
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
if (referenced.size === 0)
|
|
622
|
-
return undefined;
|
|
623
|
-
if (referenced.size === 1 && Array.from(referenced.values())[0] === null)
|
|
624
|
-
return null;
|
|
625
|
-
return resolve
|
|
626
|
-
? Objects.resolveKey(referenced, { single })
|
|
627
|
-
: Object.fromEntries(referenced);
|
|
628
|
-
}
|
|
629
|
-
validate(self, { method, navigation = false, } = {}) {
|
|
630
|
-
const errors = this.fields({
|
|
631
|
-
include_parents: true,
|
|
632
|
-
include_navigation: navigation,
|
|
633
|
-
}).reduce((acc, field) => {
|
|
634
|
-
let value = self[field.name];
|
|
635
|
-
let errs = field.validate(value, { method });
|
|
636
|
-
return errs !== undefined
|
|
637
|
-
? Object.assign(acc, { [field.name]: errs })
|
|
638
|
-
: acc;
|
|
639
|
-
}, {});
|
|
640
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
641
|
-
}
|
|
642
|
-
defaults() {
|
|
643
|
-
const defs = this.fields({
|
|
644
|
-
include_navigation: false,
|
|
645
|
-
include_parents: true,
|
|
646
|
-
}).reduce((acc, field) => {
|
|
647
|
-
let value = field.defaults();
|
|
648
|
-
return value !== undefined
|
|
649
|
-
? Object.assign(acc, { [field.name]: value })
|
|
650
|
-
: acc;
|
|
651
|
-
}, {});
|
|
652
|
-
return !Types.isEmpty(defs) ? defs : undefined;
|
|
653
|
-
}
|
|
654
|
-
hasChanged(self, { include_navigation = false } = {}) {
|
|
655
|
-
return (self._changes.size != 0 ||
|
|
656
|
-
[...self._relations.values()]
|
|
657
|
-
.filter(({ field }) => !field.navigation || include_navigation)
|
|
658
|
-
.some(({ field, state, model }) => (!include_navigation || field.navigation) &&
|
|
659
|
-
(state === ODataModelState.Changed ||
|
|
660
|
-
(model != undefined && model.hasChanged({ include_navigation })))));
|
|
661
|
-
}
|
|
662
|
-
hasKey(self) {
|
|
663
|
-
return this.resolveKey(self) !== undefined;
|
|
664
|
-
}
|
|
665
|
-
withResource(self, resource, ctx) {
|
|
666
|
-
// Push
|
|
667
|
-
self.pushResource(resource);
|
|
668
|
-
// Execute function
|
|
669
|
-
const result = ctx(self);
|
|
670
|
-
if (result instanceof Observable) {
|
|
671
|
-
return result.pipe(finalize(() => {
|
|
672
|
-
// Pop
|
|
673
|
-
self.popResource();
|
|
674
|
-
}));
|
|
675
|
-
}
|
|
676
|
-
else {
|
|
677
|
-
// Pop
|
|
678
|
-
self.popResource();
|
|
679
|
-
return result;
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
asEntity(self, ctx) {
|
|
683
|
-
// Build new resource
|
|
684
|
-
const query = self._resource?.cloneQuery();
|
|
685
|
-
let resource = this.modelResourceFactory(query);
|
|
686
|
-
if (resource === undefined)
|
|
687
|
-
throw new Error('Model does not have associated Entity endpoint');
|
|
688
|
-
return this.withResource(self, resource, ctx);
|
|
689
|
-
}
|
|
690
|
-
toEntity(self, { client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
|
|
691
|
-
let attrs = self.attributes({
|
|
692
|
-
changes_only,
|
|
693
|
-
field_mapping,
|
|
694
|
-
include_concurrency,
|
|
695
|
-
include_computed,
|
|
696
|
-
include_non_field,
|
|
697
|
-
});
|
|
698
|
-
let relations = [...self._relations.entries()]
|
|
699
|
-
.filter(
|
|
700
|
-
// Chain
|
|
701
|
-
([, { model }]) => chain.every((c) => c !== model))
|
|
702
|
-
.filter(
|
|
703
|
-
// Changes only
|
|
704
|
-
([, { model, state }]) => !changes_only ||
|
|
705
|
-
(changes_only &&
|
|
706
|
-
(state === ODataModelState.Changed ||
|
|
707
|
-
(model != undefined && model.hasChanged({ include_navigation })))))
|
|
708
|
-
.filter(([, { field, model }]) =>
|
|
709
|
-
// Navigation
|
|
710
|
-
(include_navigation && field.navigation && model !== null) ||
|
|
711
|
-
!field.navigation)
|
|
712
|
-
.map(([k, { model, field, state }]) => {
|
|
713
|
-
let changesOnly = changes_only &&
|
|
714
|
-
state !== ODataModelState.Changed &&
|
|
715
|
-
!!field.navigation;
|
|
716
|
-
let includeKey = include_key && !!field.navigation;
|
|
717
|
-
if (ODataModelOptions.isModel(model)) {
|
|
718
|
-
return [
|
|
719
|
-
k,
|
|
720
|
-
model.toEntity({
|
|
721
|
-
client_id,
|
|
722
|
-
include_navigation,
|
|
723
|
-
include_concurrency,
|
|
724
|
-
include_computed,
|
|
725
|
-
include_non_field,
|
|
726
|
-
field_mapping,
|
|
727
|
-
changes_only: changesOnly,
|
|
728
|
-
include_key: includeKey,
|
|
729
|
-
chain: [self, ...chain],
|
|
730
|
-
}),
|
|
731
|
-
];
|
|
732
|
-
}
|
|
733
|
-
else if (ODataModelOptions.isCollection(model)) {
|
|
734
|
-
return [
|
|
735
|
-
k,
|
|
736
|
-
model.toEntities({
|
|
737
|
-
client_id,
|
|
738
|
-
include_navigation,
|
|
739
|
-
include_concurrency,
|
|
740
|
-
include_computed,
|
|
741
|
-
include_non_field,
|
|
742
|
-
field_mapping,
|
|
743
|
-
changes_only: changesOnly,
|
|
744
|
-
include_key: includeKey,
|
|
745
|
-
chain: [self, ...chain],
|
|
746
|
-
}),
|
|
747
|
-
];
|
|
748
|
-
}
|
|
749
|
-
return [k, model];
|
|
750
|
-
})
|
|
751
|
-
.reduce((acc, [k, v]) => {
|
|
752
|
-
const name = field_mapping
|
|
753
|
-
? this.fields({
|
|
754
|
-
include_navigation: false,
|
|
755
|
-
include_parents: true,
|
|
756
|
-
}).find((field) => field.name === k)?.field ||
|
|
757
|
-
k
|
|
758
|
-
: k;
|
|
759
|
-
return Object.assign(acc, { [name]: v });
|
|
760
|
-
}, {});
|
|
761
|
-
// Create entity
|
|
762
|
-
let entity = { ...attrs, ...relations };
|
|
763
|
-
// Add client_id
|
|
764
|
-
if (client_id) {
|
|
765
|
-
entity[this.cid] = self[this.cid];
|
|
766
|
-
}
|
|
767
|
-
// Add key
|
|
768
|
-
if (include_key) {
|
|
769
|
-
entity = {
|
|
770
|
-
...entity,
|
|
771
|
-
...this.resolveKey(self, { field_mapping, resolve: false }),
|
|
772
|
-
};
|
|
773
|
-
}
|
|
774
|
-
// Add type
|
|
775
|
-
if (self._parent !== null &&
|
|
776
|
-
((ODataModelOptions.isModel(self._parent[0]) &&
|
|
777
|
-
self._parent[1].meta !== self._meta) ||
|
|
778
|
-
(ODataModelOptions.isCollection(self._parent[0]) &&
|
|
779
|
-
self._parent[0]._model
|
|
780
|
-
.meta !== self._meta))) {
|
|
781
|
-
entity[this.api.options.helper.ODATA_TYPE] = `#${this.schema.type()}`;
|
|
782
|
-
}
|
|
783
|
-
return entity;
|
|
784
|
-
}
|
|
785
|
-
attributes(self, { changes_only = false, include_concurrency = false, include_computed = false, include_non_field = false, field_mapping = false, } = {}) {
|
|
786
|
-
// Attributes by fields (attributes for the model type)
|
|
787
|
-
const fieldAttrs = this.fields({
|
|
788
|
-
include_navigation: false,
|
|
789
|
-
include_parents: true,
|
|
790
|
-
}).reduce((acc, f) => {
|
|
791
|
-
const isChanged = self._changes.has(f.name);
|
|
792
|
-
const name = field_mapping ? f.field : f.name;
|
|
793
|
-
const computed = f.annotatedValue(COMPUTED);
|
|
794
|
-
const value = isChanged
|
|
795
|
-
? self._changes.get(f.name)
|
|
796
|
-
: self._attributes.get(f.name);
|
|
797
|
-
if (f.concurrency && include_concurrency) {
|
|
798
|
-
return Object.assign(acc, { [name]: value });
|
|
799
|
-
}
|
|
800
|
-
else if (computed && include_computed) {
|
|
801
|
-
return Object.assign(acc, { [name]: value });
|
|
802
|
-
}
|
|
803
|
-
else if (changes_only && isChanged) {
|
|
804
|
-
return Object.assign(acc, { [name]: value });
|
|
805
|
-
}
|
|
806
|
-
else if (!changes_only && !f.concurrency && !computed) {
|
|
807
|
-
return Object.assign(acc, { [name]: value });
|
|
808
|
-
}
|
|
809
|
-
else {
|
|
810
|
-
return acc;
|
|
811
|
-
}
|
|
812
|
-
}, {});
|
|
813
|
-
if (!include_non_field)
|
|
814
|
-
return fieldAttrs;
|
|
815
|
-
const names = Object.keys(fieldAttrs);
|
|
816
|
-
// Attributes from object (attributes for object)
|
|
817
|
-
const nonFieldAttrs = Object.entries(self)
|
|
818
|
-
.filter(([k]) => names.indexOf(k) === -1 && !k.startsWith('_') && !k.endsWith('$'))
|
|
819
|
-
.reduce((acc, [k, v]) => Object.assign(acc, { [k]: v }), {});
|
|
820
|
-
return { ...fieldAttrs, ...nonFieldAttrs };
|
|
821
|
-
}
|
|
822
|
-
reset(self, { name, silent = false } = {}) {
|
|
823
|
-
let changes = [];
|
|
824
|
-
if (name !== undefined) {
|
|
825
|
-
// Reset value
|
|
826
|
-
const value = self._attributes.get(name);
|
|
827
|
-
const change = self._changes.get(name);
|
|
828
|
-
if (value !== change)
|
|
829
|
-
changes = [name];
|
|
830
|
-
self._relations.delete(name);
|
|
831
|
-
self._changes.delete(name);
|
|
832
|
-
}
|
|
833
|
-
else {
|
|
834
|
-
// reset all
|
|
835
|
-
changes = [...self._changes.keys()];
|
|
836
|
-
self._relations.clear();
|
|
837
|
-
self._changes.clear();
|
|
838
|
-
}
|
|
839
|
-
if (!silent && changes.length > 0) {
|
|
840
|
-
self.events$.emit(new ODataModelEvent('reset', {
|
|
841
|
-
model: self,
|
|
842
|
-
options: { changes },
|
|
843
|
-
}));
|
|
844
|
-
}
|
|
845
|
-
}
|
|
846
|
-
assign(self, entity, { reset = false, reparent = false, silent = false, } = {}) {
|
|
847
|
-
self._reset = reset;
|
|
848
|
-
self._reparent = reparent;
|
|
849
|
-
self._silent = silent;
|
|
850
|
-
const changes = [];
|
|
851
|
-
// Apply entity
|
|
852
|
-
const model = self;
|
|
853
|
-
Object.entries(entity)
|
|
854
|
-
.filter(([, value]) => value !== undefined) // Filter undefined
|
|
855
|
-
.forEach(([key, value]) => {
|
|
856
|
-
const field = this.fields({
|
|
857
|
-
include_parents: true,
|
|
858
|
-
include_navigation: true,
|
|
859
|
-
}).find((field) => (self._reset && field.field === key) || field.name === key);
|
|
860
|
-
if (field !== undefined) {
|
|
861
|
-
// Delegated to private setter
|
|
862
|
-
if (this.set(self, field, value)) {
|
|
863
|
-
changes.push(field.name);
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
else {
|
|
867
|
-
// Basic assignment
|
|
868
|
-
const current = model[key];
|
|
869
|
-
model[key] = value;
|
|
870
|
-
if (current !== value)
|
|
871
|
-
changes.push(key);
|
|
872
|
-
}
|
|
873
|
-
});
|
|
874
|
-
if ((!self._silent && changes.length > 0) || self._reset) {
|
|
875
|
-
self.events$.emit(new ODataModelEvent(self._reset ? 'reset' : 'update', {
|
|
876
|
-
model: self,
|
|
877
|
-
options: { changes },
|
|
878
|
-
}));
|
|
879
|
-
}
|
|
880
|
-
self._reset = false;
|
|
881
|
-
self._reparent = false;
|
|
882
|
-
self._silent = false;
|
|
883
|
-
}
|
|
884
|
-
static isModel(obj) {
|
|
885
|
-
return Types.rawType(obj) === 'Model';
|
|
886
|
-
}
|
|
887
|
-
static isCollection(obj) {
|
|
888
|
-
return Types.rawType(obj) === 'Collection';
|
|
889
|
-
}
|
|
890
|
-
_updateCollection(self, field, collection, value) {
|
|
891
|
-
collection._annotations = field.annotationsFactory(self.annots());
|
|
892
|
-
collection.assign(value, {
|
|
893
|
-
reset: self._reset,
|
|
894
|
-
reparent: self._reparent,
|
|
895
|
-
silent: self._silent,
|
|
896
|
-
});
|
|
897
|
-
return collection.hasChanged();
|
|
898
|
-
}
|
|
899
|
-
_updateModel(self, field, model, value) {
|
|
900
|
-
model._annotations = field.annotationsFactory(self.annots());
|
|
901
|
-
model.assign(value, {
|
|
902
|
-
reset: self._reset,
|
|
903
|
-
reparent: self._reparent,
|
|
904
|
-
silent: self._silent,
|
|
905
|
-
});
|
|
906
|
-
return model.hasChanged();
|
|
907
|
-
}
|
|
908
|
-
get(self, field) {
|
|
909
|
-
const modelField = field instanceof ODataModelField ? field : this.findField(field);
|
|
910
|
-
if (modelField !== undefined && modelField.isStructuredType()) {
|
|
911
|
-
const relation = self._relations.get(modelField.name);
|
|
912
|
-
if (modelField.navigation &&
|
|
913
|
-
(relation?.model === null || ODataModelOptions.isModel(relation?.model))) {
|
|
914
|
-
// Check for reference
|
|
915
|
-
const referenced = this.resolveReferenced(self, modelField);
|
|
916
|
-
if (relation?.model !== null &&
|
|
917
|
-
referenced !== null &&
|
|
918
|
-
referenced !== undefined) {
|
|
919
|
-
relation.model.assign(referenced, {
|
|
920
|
-
silent: true,
|
|
921
|
-
});
|
|
922
|
-
}
|
|
923
|
-
else if (relation?.model !== null && referenced === null) {
|
|
924
|
-
this._unlink(self, relation);
|
|
925
|
-
// New value is null
|
|
926
|
-
relation.model = null;
|
|
927
|
-
}
|
|
928
|
-
else if (relation?.model === null && referenced !== null) {
|
|
929
|
-
// New value is undefined
|
|
930
|
-
relation.model = undefined;
|
|
931
|
-
}
|
|
932
|
-
}
|
|
933
|
-
return relation?.model;
|
|
934
|
-
}
|
|
935
|
-
else {
|
|
936
|
-
return this.attributes(self, {
|
|
937
|
-
include_concurrency: true,
|
|
938
|
-
include_computed: true,
|
|
939
|
-
})[modelField !== undefined ? modelField.name : field];
|
|
940
|
-
}
|
|
941
|
-
}
|
|
942
|
-
_setStructured(self, field, value) {
|
|
943
|
-
let changed = false;
|
|
944
|
-
// Ensures that the relation exists
|
|
945
|
-
if (!self._relations.has(field.name)) {
|
|
946
|
-
self._relations.set(field.name, {
|
|
947
|
-
state: ODataModelState.Unchanged,
|
|
948
|
-
field: field,
|
|
949
|
-
});
|
|
950
|
-
}
|
|
951
|
-
const relation = self._relations.get(field.name);
|
|
952
|
-
const current = relation.model;
|
|
953
|
-
if (value === null) {
|
|
954
|
-
// Unlink old relation
|
|
955
|
-
this._unlink(self, relation);
|
|
956
|
-
// New value is null
|
|
957
|
-
relation.model = value;
|
|
958
|
-
changed = current !== value;
|
|
959
|
-
}
|
|
960
|
-
else if (ODataModelOptions.isCollection(current)) {
|
|
961
|
-
// Current is collection
|
|
962
|
-
let currentCollection = current;
|
|
963
|
-
if (ODataModelOptions.isCollection(value)) {
|
|
964
|
-
// New value is collection
|
|
965
|
-
let newCollection = value;
|
|
966
|
-
if (currentCollection.equals(newCollection)) {
|
|
967
|
-
changed = false;
|
|
968
|
-
}
|
|
969
|
-
else {
|
|
970
|
-
// Unlink old collection
|
|
971
|
-
this._unlink(self, relation);
|
|
972
|
-
relation.model = newCollection;
|
|
973
|
-
// Link new collection
|
|
974
|
-
this._link(self, relation);
|
|
975
|
-
changed = true;
|
|
976
|
-
}
|
|
977
|
-
}
|
|
978
|
-
else if (Types.isArray(value)) {
|
|
979
|
-
// New value is array
|
|
980
|
-
changed = this._updateCollection(self, field, currentCollection, value);
|
|
981
|
-
}
|
|
982
|
-
}
|
|
983
|
-
else if (ODataModelOptions.isModel(current)) {
|
|
984
|
-
// Current is model
|
|
985
|
-
let currentModel = current;
|
|
986
|
-
if (ODataModelOptions.isModel(value)) {
|
|
987
|
-
// New value is model
|
|
988
|
-
let newModel = value;
|
|
989
|
-
if (currentModel.equals(newModel)) {
|
|
990
|
-
changed = false;
|
|
991
|
-
}
|
|
992
|
-
else {
|
|
993
|
-
// Unlink old model
|
|
994
|
-
this._unlink(self, relation);
|
|
995
|
-
relation.model = newModel;
|
|
996
|
-
// Link new model
|
|
997
|
-
this._link(self, relation);
|
|
998
|
-
changed = true;
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
else if (Types.isPlainObject(value)) {
|
|
1002
|
-
changed = this._updateModel(self, field, currentModel, value);
|
|
1003
|
-
}
|
|
1004
|
-
}
|
|
1005
|
-
else {
|
|
1006
|
-
// Current is null or undefined
|
|
1007
|
-
// create new model/collection for given value
|
|
1008
|
-
relation.model =
|
|
1009
|
-
ODataModelOptions.isCollection(value) ||
|
|
1010
|
-
ODataModelOptions.isModel(value)
|
|
1011
|
-
? value
|
|
1012
|
-
: field.collection
|
|
1013
|
-
? field.collectionFactory({
|
|
1014
|
-
parent: self,
|
|
1015
|
-
value: value,
|
|
1016
|
-
reset: self._reset,
|
|
1017
|
-
})
|
|
1018
|
-
: field.modelFactory({
|
|
1019
|
-
parent: self,
|
|
1020
|
-
value: value,
|
|
1021
|
-
reset: self._reset,
|
|
1022
|
-
});
|
|
1023
|
-
// Link new model/collection
|
|
1024
|
-
this._link(self, relation);
|
|
1025
|
-
changed = true;
|
|
1026
|
-
}
|
|
1027
|
-
// Resolve referentials
|
|
1028
|
-
if (!ODataModelOptions.isCollection(relation.model)) {
|
|
1029
|
-
let ref = field.meta?.resolveReferential(relation.model, field);
|
|
1030
|
-
if (ref !== null && ref !== undefined) {
|
|
1031
|
-
Object.assign(self, ref);
|
|
1032
|
-
}
|
|
1033
|
-
}
|
|
1034
|
-
// Update state and emit event
|
|
1035
|
-
relation.state =
|
|
1036
|
-
self._reset || !changed
|
|
1037
|
-
? ODataModelState.Unchanged
|
|
1038
|
-
: ODataModelState.Changed;
|
|
1039
|
-
if (!self._silent && changed) {
|
|
1040
|
-
self.events$.emit(new ODataModelEvent('change', {
|
|
1041
|
-
field: field,
|
|
1042
|
-
model: self,
|
|
1043
|
-
value: relation.model,
|
|
1044
|
-
previous: current,
|
|
1045
|
-
}));
|
|
1046
|
-
}
|
|
1047
|
-
return changed;
|
|
1048
|
-
}
|
|
1049
|
-
_setValue(self, field, value, key) {
|
|
1050
|
-
let changed = false;
|
|
1051
|
-
const attrs = this.attributes(self, {
|
|
1052
|
-
include_concurrency: true,
|
|
1053
|
-
include_computed: true,
|
|
1054
|
-
});
|
|
1055
|
-
const name = field.name;
|
|
1056
|
-
const currentValue = attrs[name];
|
|
1057
|
-
changed = !Types.isEqual(currentValue, value);
|
|
1058
|
-
if (self._reset) {
|
|
1059
|
-
self._changes.delete(name);
|
|
1060
|
-
self._attributes.set(name, value);
|
|
1061
|
-
}
|
|
1062
|
-
else if (Types.isEqual(value, self._attributes.get(name))) {
|
|
1063
|
-
self._changes.delete(name);
|
|
1064
|
-
}
|
|
1065
|
-
else if (changed) {
|
|
1066
|
-
self._changes.set(name, value);
|
|
1067
|
-
}
|
|
1068
|
-
if (!self._silent && changed) {
|
|
1069
|
-
self.events$.emit(new ODataModelEvent('change', {
|
|
1070
|
-
field: field,
|
|
1071
|
-
model: self,
|
|
1072
|
-
value,
|
|
1073
|
-
previous: currentValue,
|
|
1074
|
-
options: { key },
|
|
1075
|
-
}));
|
|
1076
|
-
}
|
|
1077
|
-
return changed;
|
|
1078
|
-
}
|
|
1079
|
-
set(self, field, value, { type } = {}) {
|
|
1080
|
-
let modelField = field instanceof ODataModelField ? field : this.findField(field);
|
|
1081
|
-
if (modelField === undefined &&
|
|
1082
|
-
this.isOpenType() &&
|
|
1083
|
-
typeof field === 'string') {
|
|
1084
|
-
type = type ?? this.tsToEdm[typeof value] ?? '';
|
|
1085
|
-
modelField = this.modelFieldFactory(self, field, type);
|
|
1086
|
-
}
|
|
1087
|
-
if (modelField === undefined)
|
|
1088
|
-
throw new Error(`No field with name ${field}`);
|
|
1089
|
-
return modelField.isStructuredType()
|
|
1090
|
-
? this._setStructured(self, modelField, value)
|
|
1091
|
-
: this._setValue(self, modelField, value, modelField.isKey());
|
|
1092
|
-
}
|
|
1093
|
-
_unlink(self, relation) {
|
|
1094
|
-
if (relation.subscription !== undefined) {
|
|
1095
|
-
relation.subscription.unsubscribe();
|
|
1096
|
-
relation.subscription = undefined;
|
|
1097
|
-
}
|
|
1098
|
-
if (relation.model != null) {
|
|
1099
|
-
relation.model._parent = null;
|
|
1100
|
-
}
|
|
1101
|
-
}
|
|
1102
|
-
_link(self, relation) {
|
|
1103
|
-
if (relation.subscription) {
|
|
1104
|
-
throw new Error('Subscription already exists');
|
|
1105
|
-
}
|
|
1106
|
-
if (relation.model == null) {
|
|
1107
|
-
throw new Error('Subscription model is null');
|
|
1108
|
-
}
|
|
1109
|
-
if (self._reparent)
|
|
1110
|
-
relation.model._parent = [self, relation.field];
|
|
1111
|
-
relation.subscription = relation.model.events$.subscribe((event) => {
|
|
1112
|
-
if (BUBBLING.indexOf(event.name) !== -1 &&
|
|
1113
|
-
event.bubbling &&
|
|
1114
|
-
!event.visited(self)) {
|
|
1115
|
-
if (event.model === relation.model) {
|
|
1116
|
-
if (event.name === 'change' &&
|
|
1117
|
-
relation.field.navigation &&
|
|
1118
|
-
event.options?.key) {
|
|
1119
|
-
let ref = relation.model.referential(relation.field);
|
|
1120
|
-
if (ref !== null && ref !== undefined) {
|
|
1121
|
-
Object.assign(self, ref);
|
|
1122
|
-
}
|
|
1123
|
-
}
|
|
1124
|
-
}
|
|
1125
|
-
self.events$.emit(event.push(self, relation.field));
|
|
1126
|
-
}
|
|
1127
|
-
});
|
|
1128
|
-
}
|
|
1129
|
-
}
|
|
1130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxRQUFRLEVBQ1IsZUFBZSxFQUNmLHNCQUFzQixHQUN2QixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFHTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QiwrQkFBK0IsRUFDL0IscUJBQXFCLEdBS3RCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxPQUFPLEVBQXlCLE1BQU0sVUFBVSxDQUFDO0FBQzFELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBZTFDLE1BQU0sT0FBTyxlQUFlO0lBTTFCLFlBQ0UsSUFBeUIsRUFDekIsRUFDRSxLQUFLLEVBQ0wsVUFBVSxFQUNWLFFBQVEsRUFDUixLQUFLLEVBQ0wsS0FBSyxFQUNMLE9BQU8sTUFRTCxFQUFFO1FBa0JSLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFoQnZCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZC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SUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7NEJBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO3lCQUMxQjtxQkFDRjtpQkFDRjtnQkFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUNyRDtRQUNILENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIENJRF9GSUVMRF9OQU1FLFxuICBDT01QVVRFRCxcbiAgREVGQVVMVF9WRVJTSU9OLFxuICBPUFRJTUlTVElDX0NPTkNVUlJFTkNZLFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHtcbiAgRW50aXR5S2V5LFxuICBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMsXG4gIE9EYXRhRW50aXR5QW5ub3RhdGlvbnMsXG4gIE9EYXRhRW50aXR5UmVzb3VyY2UsXG4gIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UsXG4gIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFRdWVyeU9wdGlvbnMsXG4gIE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcixcbiAgT0RhdGFSZXNvdXJjZSxcbiAgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSxcbn0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7XG4gIE9EYXRhRW50aXR5U2V0LFxuICBPRGF0YVN0cnVjdHVyZWRUeXBlLFxuICBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXIsXG59IGZyb20gJy4uL3NjaGVtYSc7XG5pbXBvcnQgeyBFZG1UeXBlLCBQYXJzZXIsIFBhcnNlck9wdGlvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBPYmplY3RzLCBUeXBlcyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgT0RhdGFDb2xsZWN0aW9uIH0gZnJvbSAnLi9jb2xsZWN0aW9uJztcbmltcG9ydCB0eXBlIHsgT0RhdGFNb2RlbCB9IGZyb20gJy4vbW9kZWwnO1xuXG5leHBvcnQgdHlwZSBPRGF0YU1vZGVsRXZlbnRUeXBlID1cbiAgfCAnY2hhbmdlJ1xuICB8ICdyZXNldCdcbiAgfCAndXBkYXRlJ1xuICB8ICdkZXN0cm95J1xuICB8ICdhZGQnXG4gIHwgJ3JlbW92ZSdcbiAgfCAnaW52YWxpZCdcbiAgfCAncmVxdWVzdCdcbiAgfCAnc3luYydcbiAgfCAnYXR0YWNoJztcbmV4cG9ydCBjbGFzcyBPRGF0YU1vZGVsRXZlbnQ8VD4ge1xuICBuYW1lOiBPRGF0YU1vZGVsRXZlbnRUeXBlO1xuICB2YWx1ZT86IGFueTtcbiAgcHJldmlvdXM/OiBhbnk7XG4gIG9wdGlvbnM/OiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbmFtZTogT0RhdGFNb2RlbEV2ZW50VHlwZSxcbiAgICB7XG4gICAgICBtb2RlbCxcbiAgICAgIGNvbGxlY3Rpb24sXG4gICAgICBwcmV2aW91cyxcbiAgICAgIHZhbHVlLFxuICAgICAgZmllbGQsXG4gICAgICBvcHRpb25zLFxuICAgIH06IHtcbiAgICAgIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgICAgIGNvbGxlY3Rpb24/OiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj47XG4gICAgICBmaWVsZD86IE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVtYmVyO1xuICAgICAgcHJldmlvdXM/OiBhbnk7XG4gICAgICB2YWx1ZT86IGFueTtcbiAgICAgIG9wdGlvbnM/OiBhbnk7XG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gICAgdGhpcy5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuY2hhaW4gPSBbXG4gICAgICBbXG4gICAgICAgICh0aGlzLmNvbGxlY3Rpb24gfHwgdGhpcy5tb2RlbCkgYXNcbiAgICAgICAgICB8IE9EYXRhTW9kZWw8YW55PlxuICAgICAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgZmllbGQgfHwgbnVsbCxcbiAgICAgIF0sXG4gICAgXTtcbiAgfVxuXG4gIGJ1YmJsaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgIHRoaXMuYnViYmxpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGNoYWluOiBbXG4gICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bWJlciB8IG51bGxcbiAgXVtdO1xuXG4gIHB1c2goXG4gICAgbW9kZWw6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVtYmVyXG4gICkge1xuICAgIGxldCBldmVudCA9IG5ldyBPRGF0YU1vZGVsRXZlbnQodGhpcy5uYW1lLCB7XG4gICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgIGNvbGxlY3Rpb246IHRoaXMuY29sbGVjdGlvbixcbiAgICAgIHByZXZpb3VzOiB0aGlzLnByZXZpb3VzLFxuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgfSk7XG4gICAgZXZlbnQuY2hhaW4gPSBbLi4udGhpcy5jaGFpbl07XG4gICAgZXZlbnQuY2hhaW4uc3BsaWNlKDAsIDAsIFttb2RlbCwgZmllbGRdKTtcbiAgICByZXR1cm4gZXZlbnQ7XG4gIH1cblxuICB2aXNpdGVkKG1vZGVsOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY2hhaW4uc29tZSgoYykgPT4gY1swXSA9PT0gbW9kZWwpICYmXG4gICAgICB0aGlzLmNoYWluW3RoaXMuY2hhaW4ubGVuZ3RoIC0gMV1bMF0gIT09IG1vZGVsXG4gICAgKTtcbiAgfVxuXG4gIGdldCBwYXRoKCkge1xuICAgIHJldHVybiB0aGlzLmNoYWluXG4gICAgICAubWFwKChbLCBmaWVsZF0sIGluZGV4KSA9PlxuICAgICAgICB0eXBlb2YgZmllbGQgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBgWyR7ZmllbGR9XWBcbiAgICAgICAgICA6IGZpZWxkIGluc3RhbmNlb2YgT0RhdGFNb2RlbEZpZWxkXG4gICAgICAgICAgPyBpbmRleCA9PT0gMFxuICAgICAgICAgICAgPyBmaWVsZC5uYW1lXG4gICAgICAgICAgICA6IGAuJHtmaWVsZC5uYW1lfWBcbiAgICAgICAgICA6ICcnXG4gICAgICApXG4gICAgICAuam9pbignJyk7XG4gIH1cblxuICAvL1JlZmVyZW5jZSB0byB0aGUgbW9kZWwgd2hpY2ggdGhlIGV2ZW50IHdhcyBkaXNwYXRjaGVkXG4gIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgLy9JZGVudGlmaWVzIHRoZSBjdXJyZW50IG1vZGVsIGZvciB0aGUgZXZlbnRcbiAgZ2V0IGN1cnJlbnRNb2RlbCgpOiBPRGF0YU1vZGVsPGFueT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmNoYWluLmZpbmQoKGMpID0+IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoY1swXSkpO1xuICAgIHJldHVybiBsaW5rICE9PSB1bmRlZmluZWQgPyAobGlua1swXSBhcyBPRGF0YU1vZGVsPGFueT4pIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLy9SZWZlcmVuY2UgdG8gdGhlIGNvbGxlY3Rpb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBkaXNwYXRjaGVkXG4gIGNvbGxlY3Rpb24/OiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj47XG4gIC8vSWRlbnRpZmllcyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIGZvciB0aGUgZXZlbnRcbiAgZ2V0IGN1cnJlbnRDb2xsZWN0aW9uKCk6IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmNoYWluLmZpbmQoKGMpID0+IE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihjWzBdKSk7XG4gICAgcmV0dXJuIGxpbmsgIT09IHVuZGVmaW5lZFxuICAgICAgPyAobGlua1swXSBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEJVQkJMSU5HID0gW1xuICAnY2hhbmdlJyxcbiAgJ3Jlc2V0JyxcbiAgJ3VwZGF0ZScsXG4gICdkZXN0cm95JyxcbiAgJ2FkZCcsXG4gICdyZW1vdmUnLFxuXTtcblxuZXhwb3J0IGNvbnN0IElOQ0xVREVfU0hBTExPVyA9IHtcbiAgaW5jbHVkZV9jb25jdXJyZW5jeTogdHJ1ZSxcbiAgaW5jbHVkZV9jb21wdXRlZDogdHJ1ZSxcbiAgaW5jbHVkZV9rZXk6IHRydWUsXG59O1xuXG5leHBvcnQgY29uc3QgSU5DTFVERV9ERUVQID0ge1xuICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gIGluY2x1ZGVfbm9uX2ZpZWxkOiB0cnVlLFxuICAuLi5JTkNMVURFX1NIQUxMT1csXG59O1xuXG5leHBvcnQgZW51bSBPRGF0YU1vZGVsU3RhdGUge1xuICBBZGRlZCxcbiAgUmVtb3ZlZCxcbiAgQ2hhbmdlZCxcbiAgVW5jaGFuZ2VkLFxufVxuXG5leHBvcnQgdHlwZSBNb2RlbE9wdGlvbnMgPSB7XG4gIGNpZD86IHN0cmluZztcbiAgZmllbGRzOiB7IFtuYW1lOiBzdHJpbmddOiBNb2RlbEZpZWxkT3B0aW9ucyB9O1xufTtcblxuZXhwb3J0IHR5cGUgTW9kZWxGaWVsZE9wdGlvbnMgPSB7XG4gIGZpZWxkPzogc3RyaW5nO1xuICBwYXJzZXI/OiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8YW55PjtcbiAgZGVmYXVsdD86IGFueTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBjb25jdXJyZW5jeT86IGJvb2xlYW47XG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgbWluTGVuZ3RoPzogbnVtYmVyO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgcGF0dGVybj86IFJlZ0V4cDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBNb2RlbCh7IGNpZCA9IENJRF9GSUVMRF9OQU1FIH06IHsgY2lkPzogc3RyaW5nIH0gPSB7fSkge1xuICByZXR1cm4gPFQgZXh0ZW5kcyB7IG5ldyAoLi4uYXJnczogYW55W10pOiB7fSB9Pihjb25zdHJ1Y3RvcjogVCkgPT4ge1xuICAgIGNvbnN0IEtsYXNzID0gPGFueT5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIUtsYXNzLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpXG4gICAgICBLbGFzcy5vcHRpb25zID0geyBmaWVsZHM6IHt9IH0gYXMgTW9kZWxPcHRpb25zO1xuICAgIEtsYXNzLm9wdGlvbnMuY2lkID0gY2lkO1xuICAgIHJldHVybiBjb25zdHJ1Y3RvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsRmllbGQoe1xuICBuYW1lLFxuICAuLi5vcHRpb25zXG59OiB7IG5hbWU/OiBzdHJpbmcgfSAmIE1vZGVsRmllbGRPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBjb25zdCBLbGFzcyA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIUtsYXNzLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpXG4gICAgICBLbGFzcy5vcHRpb25zID0geyBmaWVsZHM6IHt9IH0gYXMgTW9kZWxPcHRpb25zO1xuICAgIG9wdGlvbnMuZmllbGQgPSBuYW1lIHx8IGtleTtcbiAgICBLbGFzcy5vcHRpb25zLmZpZWxkc1trZXldID0gb3B0aW9ucztcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbEZpZWxkT3B0aW9uczxGPiA9IE1vZGVsRmllbGRPcHRpb25zICYge1xuICBuYW1lOiBzdHJpbmc7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHBhcnNlcjogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+O1xufTtcblxuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxGaWVsZDxGPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZmllbGQ6IHN0cmluZztcbiAgcGFyc2VyOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8Rj47XG4gIG9wdGlvbnM6IE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gIG1ldGE/OiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICBkZWZhdWx0PzogYW55O1xuICByZXF1aXJlZDogYm9vbGVhbjtcbiAgY29uY3VycmVuY3k6IGJvb2xlYW47XG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgbWluTGVuZ3RoPzogbnVtYmVyO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgcGF0dGVybj86IFJlZ0V4cDtcbiAgcGFyc2VyT3B0aW9ucz86IFBhcnNlck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogT0RhdGFNb2RlbE9wdGlvbnM8YW55PixcbiAgICB7IG5hbWUsIGZpZWxkLCBwYXJzZXIsIC4uLm9wdHMgfTogT0RhdGFNb2RlbEZpZWxkT3B0aW9uczxGPlxuICApIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5maWVsZCA9IGZpZWxkO1xuICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgIHRoaXMuZGVmYXVsdCA9IG9wdHMuZGVmYXVsdCB8fCBwYXJzZXIuZGVmYXVsdDtcbiAgICB0aGlzLnJlcXVpcmVkID0gQm9vbGVhbihvcHRzLnJlcXVpcmVkIHx8ICFwYXJzZXIubnVsbGFibGUpO1xuICAgIHRoaXMuY29uY3VycmVuY3kgPSBCb29sZWFuKG9wdHMuY29uY3VycmVuY3kpO1xuICAgIHRoaXMubWF4TGVuZ3RoID0gb3B0cy5tYXhMZW5ndGggfHwgcGFyc2VyLm1heExlbmd0aDtcbiAgICB0aGlzLm1pbkxlbmd0aCA9IG9wdHMubWluTGVuZ3RoO1xuICAgIHRoaXMubWluID0gb3B0cy5taW47XG4gICAgdGhpcy5tYXggPSBvcHRzLm1heDtcbiAgICB0aGlzLnBhdHRlcm4gPSBvcHRzLnBhdHRlcm47XG4gIH1cblxuICBnZXQgYXBpKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXBpO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnR5cGU7XG4gIH1cblxuICBnZXQgbmF2aWdhdGlvbigpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnBhcnNlci5uYXZpZ2F0aW9uKTtcbiAgfVxuXG4gIGdldCBjb2xsZWN0aW9uKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMucGFyc2VyLmNvbGxlY3Rpb24pO1xuICB9XG5cbiAgYW5ub3RhdGVkVmFsdWU8VD4odGVybTogc3RyaW5nIHwgUmVnRXhwKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmFubm90YXRlZFZhbHVlPFQ+KHRlcm0pO1xuICB9XG5cbiAgY29uZmlndXJlKHtcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGUsXG4gICAgY29uY3VycmVuY3ksXG4gICAgb3B0aW9ucyxcbiAgfToge1xuICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBjb25jdXJyZW5jeTogYm9vbGVhbjtcbiAgICBvcHRpb25zOiBQYXJzZXJPcHRpb25zO1xuICB9KSB7XG4gICAgdGhpcy5tZXRhID0gZmluZE9wdGlvbnNGb3JUeXBlKHRoaXMucGFyc2VyLnR5cGUpO1xuICAgIHRoaXMucGFyc2VyT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKGNvbmN1cnJlbmN5KSB0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG4gICAgaWYgKHRoaXMuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgdGhpcy5kZWZhdWx0ID0gdGhpcy5kZXNlcmlhbGl6ZSh0aGlzLmRlZmF1bHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaXNLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmlzS2V5KCk7XG4gIH1cblxuICBoYXNSZWZlcmVudGlhbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmhhc1JlZmVyZW50aWFscygpO1xuICB9XG5cbiAgZ2V0IHJlZmVyZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIucmVmZXJlbnRpYWxzO1xuICB9XG5cbiAgaXNTdHJ1Y3R1cmVkVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaXNTdHJ1Y3R1cmVkVHlwZSgpO1xuICB9XG5cbiAgc3RydWN0dXJlZCgpIHtcbiAgICBsZXQgc3RydWN0dXJlZFR5cGUgPSB0aGlzLmFwaS5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPEY+KFxuICAgICAgdGhpcy5wYXJzZXIudHlwZVxuICAgICk7XG4gICAgLy9UaHJvdyBlcnJvciBpZiBub3QgZm91bmRcbiAgICBpZiAoIXN0cnVjdHVyZWRUeXBlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBzdHJ1Y3R1cmVkIHR5cGUgZm9yICR7dGhpcy5wYXJzZXIudHlwZX1gKTtcbiAgICByZXR1cm4gc3RydWN0dXJlZFR5cGU7XG4gIH1cblxuICBpc0VudW1UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5pc0VudW1UeXBlKCk7XG4gIH1cblxuICBlbnVtKCkge1xuICAgIGxldCBlbnVtVHlwZSA9IHRoaXMuYXBpLmZpbmRFbnVtVHlwZUZvclR5cGU8Rj4odGhpcy5wYXJzZXIudHlwZSk7XG4gICAgLy9UaHJvdyBlcnJvciBpZiBub3QgZm91bmRcbiAgICBpZiAoIWVudW1UeXBlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBlbnVtIHR5cGUgZm9yICR7dGhpcy5wYXJzZXIudHlwZX1gKTtcbiAgICByZXR1cm4gZW51bVR5cGU7XG4gIH1cblxuICB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgLypcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5pc1ZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gIXZhbHVlLmlzVmFsaWQoeyBtZXRob2QsIG5hdmlnYXRpb24gfSkgPyB2YWx1ZS5fZXJyb3JzIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoJ21vZGVscycgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLm1vZGVscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgKi9cbiAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAhdmFsdWUuaXNWYWxpZCh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSA/IHZhbHVlLl9lcnJvcnMgOiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgLm1vZGVscygpXG4gICAgICAgIC5zb21lKChtOiBPRGF0YU1vZGVsPGFueT4pID0+ICFtLmlzVmFsaWQoeyBtZXRob2QsIG5hdmlnYXRpb24gfSkpXG4gICAgICAgID8gdmFsdWUubW9kZWxzKCkubWFwKChtOiBPRGF0YU1vZGVsPGFueT4pID0+IG0uX2Vycm9ycylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbXB1dGVkID0gdGhpcy5hbm5vdGF0ZWRWYWx1ZTxib29sZWFuPihDT01QVVRFRCk7XG4gICAgICBsZXQgZXJyb3JzID0gdGhpcy5wYXJzZXI/LnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSB8fCBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5yZXF1aXJlZCAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWV0aG9kICE9PSAnbW9kaWZ5JykpICYmIC8vIElzIG51bGwgb3IgdW5kZWZpbmVkIHdpdGhvdXQgcGF0Y2g/XG4gICAgICAgICEoY29tcHV0ZWQgJiYgbWV0aG9kID09PSAnY3JlYXRlJykgLy8gTm90IChJcyBDb21wdXRlZCBmaWVsZCBhbmQgY3JlYXRlKSA/XG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzWydwdXNoJ10oYHJlcXVpcmVkYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIGVycm9yc1sncHVzaCddKGBtYXhsZW5ndGhgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5taW5MZW5ndGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHZhbHVlLmxlbmd0aCA8IHRoaXMubWluTGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzWydwdXNoJ10oYG1pbmxlbmd0aGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1pbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPCB0aGlzLm1pblxuICAgICAgKSB7XG4gICAgICAgIGVycm9yc1sncHVzaCddKGBtaW5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5tYXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgIHZhbHVlID4gdGhpcy5tYXhcbiAgICAgICkge1xuICAgICAgICBlcnJvcnNbJ3B1c2gnXShgbWF4YCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGF0dGVybiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgIXRoaXMucGF0dGVybi50ZXN0KHZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yc1sncHVzaCddKGBwYXR0ZXJuYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZXJyb3JzKSA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBkZWZhdWx0cygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSAmJiB0aGlzLm1ldGEgIT09IHVuZGVmaW5lZFxuICAgICAgPyB0aGlzLm1ldGEuZGVmYXVsdHMoKVxuICAgICAgOiB0aGlzLmRlZmF1bHQ7XG4gIH1cblxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55LCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IEYge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSBvcHRpb25zIHx8IHRoaXMucGFyc2VyT3B0aW9ucztcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuZGVzZXJpYWxpemUodmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICB9XG5cbiAgc2VyaWFsaXplKHZhbHVlOiBGLCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IG9wdGlvbnMgfHwgdGhpcy5wYXJzZXJPcHRpb25zO1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5zZXJpYWxpemUodmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICB9XG5cbiAgZW5jb2RlKHZhbHVlOiBGLCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IG9wdGlvbnMgfHwgdGhpcy5wYXJzZXJPcHRpb25zO1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5lbmNvZGUodmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICB9XG5cbiAgcmVzb3VyY2VGYWN0b3J5PFQsIEY+KFxuICAgIGJhc2U6IE9EYXRhUmVzb3VyY2U8VD5cbiAgKTogT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxGPiB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxGPiB7XG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgYmFzZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgfHxcbiAgICAgICAgYmFzZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgfHxcbiAgICAgICAgYmFzZSBpbnN0YW5jZW9mIE9EYXRhUHJvcGVydHlSZXNvdXJjZVxuICAgICAgKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGJ1aWxkIHJlc291cmNlIGZvciBub24gY29tcGF0aWJsZSBiYXNlIHR5cGVcIik7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblxuICAgICAgPyAoYmFzZSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KS5uYXZpZ2F0aW9uUHJvcGVydHk8Rj4odGhpcy5wYXJzZXIubmFtZSlcbiAgICAgIDogKGJhc2UgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPikucHJvcGVydHk8Rj4odGhpcy5wYXJzZXIubmFtZSk7XG4gIH1cblxuICBhbm5vdGF0aW9uc0ZhY3Rvcnk8VCwgRj4oXG4gICAgYmFzZTogT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxUPlxuICApOiBPRGF0YUVudGl0eUFubm90YXRpb25zPEY+IHwgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPEY+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuY29sbGVjdGlvblxuICAgICAgPyBiYXNlLnByb3BlcnR5KHRoaXMucGFyc2VyLm5hbWUgYXMga2V5b2YgVCwgJ2NvbGxlY3Rpb24nKVxuICAgICAgOiBiYXNlLnByb3BlcnR5KHRoaXMucGFyc2VyLm5hbWUgYXMga2V5b2YgVCwgJ3NpbmdsZScpO1xuICB9XG5cbiAgc2NoZW1hRmFjdG9yeTxULCBGPihcbiAgICBiYXNlOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+XG4gICk6IE9EYXRhU3RydWN0dXJlZFR5cGU8Rj4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFwaS5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlKHRoaXMucGFyc2VyLnR5cGUpO1xuICB9XG5cbiAgbW9kZWxGYWN0b3J5PEY+KHtcbiAgICBwYXJlbnQsXG4gICAgdmFsdWUsXG4gICAgcmVzZXQsXG4gIH06IHtcbiAgICBwYXJlbnQ6IE9EYXRhTW9kZWw8YW55PjtcbiAgICB2YWx1ZT86IFBhcnRpYWw8Rj4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgICByZXNldD86IGJvb2xlYW47XG4gIH0pOiBPRGF0YU1vZGVsPEY+IHtcbiAgICAvLyBNb2RlbFxuICAgIGNvbnN0IGFubm90cyA9IHRoaXMuYW5ub3RhdGlvbnNGYWN0b3J5KFxuICAgICAgcGFyZW50LmFubm90cygpXG4gICAgKSBhcyBPRGF0YUVudGl0eUFubm90YXRpb25zPEY+O1xuICAgIGxldCBNb2RlbCA9IHRoaXMuYXBpLm1vZGVsRm9yVHlwZSh0aGlzLnBhcnNlci50eXBlKTtcbiAgICBpZiAoTW9kZWwgPT09IHVuZGVmaW5lZCkgdGhyb3cgRXJyb3IoYE5vIE1vZGVsIHR5cGUgZm9yICR7dGhpcy5uYW1lfWApO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbm5vdHMudXBkYXRlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoYW5ub3RzPy50eXBlICE9PSB1bmRlZmluZWQgJiYgTW9kZWwubWV0YSAhPT0gbnVsbCkge1xuICAgICAgbGV0IHNjaGVtYSA9IE1vZGVsLm1ldGEuZmluZENoaWxkT3B0aW9ucygobykgPT5cbiAgICAgICAgby5pc1R5cGVPZihhbm5vdHMudHlwZSBhcyBzdHJpbmcpXG4gICAgICApPy5zY2hlbWE7XG4gICAgICBpZiAoc2NoZW1hICE9PSB1bmRlZmluZWQgJiYgc2NoZW1hLm1vZGVsICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC8vIENoYW5nZSB0byBjaGlsZCBtb2RlbFxuICAgICAgICBNb2RlbCA9IHNjaGVtYS5tb2RlbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1vZGVsKCh2YWx1ZSB8fCB7fSkgYXMgUGFydGlhbDxGPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB7XG4gICAgICBhbm5vdHMsXG4gICAgICByZXNldCxcbiAgICAgIHBhcmVudDogW3BhcmVudCwgdGhpc10sXG4gICAgfSk7XG4gIH1cblxuICBjb2xsZWN0aW9uRmFjdG9yeTxGPih7XG4gICAgcGFyZW50LFxuICAgIHZhbHVlLFxuICAgIHJlc2V0LFxuICB9OiB7XG4gICAgcGFyZW50OiBPRGF0YU1vZGVsPGFueT47XG4gICAgdmFsdWU/OiBQYXJ0aWFsPEY+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdO1xuICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgfSk6IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PiB7XG4gICAgLy8gQ29sbGVjdGlvbiBGYWN0b3J5XG4gICAgY29uc3QgYW5ub3RzID0gdGhpcy5hbm5vdGF0aW9uc0ZhY3RvcnkoXG4gICAgICBwYXJlbnQuYW5ub3RzKClcbiAgICApIGFzIE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxGPjtcbiAgICBjb25zdCBDb2xsZWN0aW9uID0gdGhpcy5hcGkuY29sbGVjdGlvbkZvclR5cGUodGhpcy5wYXJzZXIudHlwZSk7XG4gICAgaWYgKENvbGxlY3Rpb24gPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IEVycm9yKGBObyBDb2xsZWN0aW9uIHR5cGUgZm9yICR7dGhpcy5uYW1lfWApO1xuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbihcbiAgICAgICh2YWx1ZSB8fCBbXSkgYXMgUGFydGlhbDxGPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSxcbiAgICAgIHtcbiAgICAgICAgYW5ub3RzOiBhbm5vdHMsXG4gICAgICAgIHJlc2V0LFxuICAgICAgICBwYXJlbnQ6IFtwYXJlbnQsIHRoaXNdLFxuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbFJlbGF0aW9uPFQ+ID0ge1xuICBzdGF0ZTogT0RhdGFNb2RlbFN0YXRlO1xuICBtb2RlbD86IE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4gfCBudWxsO1xuICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPFQ+O1xuICBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG59O1xuXG5leHBvcnQgdHlwZSBPRGF0YU1vZGVsRW50cnk8VCwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+ID0ge1xuICBzdGF0ZTogT0RhdGFNb2RlbFN0YXRlO1xuICBtb2RlbDogTTtcbiAga2V5PzogRW50aXR5S2V5PFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIHN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPRGF0YU1vZGVsT3B0aW9uczxUPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgY2lkOiBzdHJpbmc7XG4gIGJhc2U/OiBzdHJpbmc7XG4gIG9wZW4/OiBib29sZWFuO1xuICBwcml2YXRlIF9maWVsZHM6IE9EYXRhTW9kZWxGaWVsZDxhbnk+W10gPSBbXTtcbiAgc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+O1xuICBlbnRpdHlTZXQ/OiBPRGF0YUVudGl0eVNldDtcbiAgLy8gSGllcmFyY2h5XG4gIHBhcmVudD86IE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gIGNoaWxkcmVuOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+W10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgb3B0aW9ucyxcbiAgICBzY2hlbWEsXG4gIH06IHtcbiAgICBvcHRpb25zOiBNb2RlbE9wdGlvbnM7XG4gICAgc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+O1xuICB9KSB7XG4gICAgdGhpcy5uYW1lID0gc2NoZW1hLm5hbWU7XG4gICAgdGhpcy5iYXNlID0gc2NoZW1hLmJhc2U7XG4gICAgdGhpcy5vcGVuID0gc2NoZW1hLm9wZW47XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5jaWQgPSBvcHRpb25zPy5jaWQgfHwgQ0lEX0ZJRUxEX05BTUU7XG4gICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5maWVsZHMpLmZvckVhY2goKFtuYW1lLCBvcHRpb25zXSkgPT5cbiAgICAgIHRoaXMuYWRkRmllbGQ8YW55PihuYW1lLCBvcHRpb25zKVxuICAgICk7XG4gIH1cblxuICBnZXQgYXBpKCkge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYS5hcGk7XG4gIH1cblxuICB0eXBlKHsgYWxpYXMgPSBmYWxzZSB9OiB7IGFsaWFzPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEudHlwZSh7IGFsaWFzIH0pO1xuICB9XG5cbiAgaXNPcGVuVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEuaXNPcGVuVHlwZSgpO1xuICB9XG5cbiAgaXNUeXBlT2YodHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLmlzVHlwZU9mKHR5cGUpO1xuICB9XG5cbiAgaXNNb2RlbEZvcihlbnRpdHk6IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSkge1xuICAgIC8vIFJlc29sdmUgQnkgVHlwZVxuICAgIGxldCB0eXBlID0gdGhpcy5hcGkub3B0aW9ucy5oZWxwZXIudHlwZShlbnRpdHkgYXMgeyBbbmFtZTogc3RyaW5nXTogYW55IH0pO1xuICAgIGlmICh0eXBlICYmIHRoaXMuaXNUeXBlT2YodHlwZSkpIHJldHVybiB0cnVlO1xuICAgIC8vIFJlc29sdmUgQnkgZmllbGRzXG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhlbnRpdHkgYXMgeyBbbmFtZTogc3RyaW5nXTogYW55IH0pO1xuICAgIGxldCBuYW1lcyA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KS5tYXAoKGYpID0+IGYubmFtZSk7XG4gICAgcmV0dXJuIGtleXMuZXZlcnkoKGtleSkgPT4gbmFtZXMuaW5jbHVkZXMoa2V5KSk7XG4gIH1cblxuICBmaW5kQ2hpbGRPcHRpb25zKFxuICAgIHByZWRpY2F0ZTogKG9wdGlvbnM6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4pID0+IGJvb2xlYW5cbiAgKTogT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByZWRpY2F0ZSh0aGlzKSkgcmV0dXJuIHRoaXM7XG4gICAgbGV0IG1hdGNoOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IGNoIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIG1hdGNoID0gY2guZmluZENoaWxkT3B0aW9ucyhwcmVkaWNhdGUpO1xuICAgICAgaWYgKG1hdGNoICE9PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH1cblxuICBjb25maWd1cmUoe1xuICAgIG9wdGlvbnMsXG4gICAgcGFyc2VyRm9yVHlwZSxcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGUsXG4gIH06IHtcbiAgICBvcHRpb25zOiBQYXJzZXJPcHRpb25zO1xuICAgIHBhcnNlckZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IFBhcnNlcjxhbnk+O1xuICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZDtcbiAgfSkge1xuICAgIGlmICh0aGlzLmJhc2UpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IGZpbmRPcHRpb25zRm9yVHlwZSh0aGlzLmJhc2UpIGFzIE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICB0aGlzLmVudGl0eVNldCA9IHRoaXMuYXBpLmZpbmRFbnRpdHlTZXRGb3JFbnRpdHlUeXBlKHRoaXMudHlwZSgpKTtcbiAgICBsZXQgY29uY3VycmVuY3lGaWVsZHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHRoaXMuZW50aXR5U2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmN1cnJlbmN5RmllbGRzID1cbiAgICAgICAgdGhpcy5lbnRpdHlTZXQuYW5ub3RhdGVkVmFsdWU8c3RyaW5nW10+KE9QVElNSVNUSUNfQ09OQ1VSUkVOQ1kpIHx8IFtdO1xuICAgIH1cbiAgICB0aGlzLl9maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGxldCBjb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5RmllbGRzLmluZGV4T2YoZmllbGQuZmllbGQpICE9PSAtMTtcbiAgICAgIGZpZWxkLmNvbmZpZ3VyZSh7XG4gICAgICAgIGZpbmRPcHRpb25zRm9yVHlwZSxcbiAgICAgICAgY29uY3VycmVuY3ksXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZpZWxkcyh7XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgIGluY2x1ZGVfcGFyZW50cyxcbiAgfToge1xuICAgIGluY2x1ZGVfcGFyZW50czogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25hdmlnYXRpb246IGJvb2xlYW47XG4gIH0pOiBPRGF0YU1vZGVsRmllbGQ8YW55PltdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4uKGluY2x1ZGVfcGFyZW50cyAmJiB0aGlzLnBhcmVudCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5wYXJlbnQuZmllbGRzKHsgaW5jbHVkZV9uYXZpZ2F0aW9uLCBpbmNsdWRlX3BhcmVudHMgfSlcbiAgICAgICAgOiBbXSksXG4gICAgICAuLi50aGlzLl9maWVsZHMuZmlsdGVyKFxuICAgICAgICAoZmllbGQpID0+IGluY2x1ZGVfbmF2aWdhdGlvbiB8fCAhZmllbGQubmF2aWdhdGlvblxuICAgICAgKSxcbiAgICBdO1xuICB9XG5cbiAgZmllbGQ8Rj4obmFtZToga2V5b2YgVCB8IHN0cmluZykge1xuICAgIGxldCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkPEY+KG5hbWUpO1xuICAgIC8vVGhyb3cgZXJyb3IgaWYgbm90IGZvdW5kXG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGZpZWxkIHdpdGggbmFtZSAke25hbWUgYXMgc3RyaW5nfWApO1xuICAgIHJldHVybiBmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8Rj47XG4gIH1cblxuICBmaW5kRmllbGQ8Rj4obmFtZToga2V5b2YgVCB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgfSkuZmluZChcbiAgICAgIChtb2RlbEZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4pID0+XG4gICAgICAgIG1vZGVsRmllbGQubmFtZSA9PT0gbmFtZSB8fCBtb2RlbEZpZWxkLmZpZWxkID09PSBuYW1lXG4gICAgKSBhcyBPRGF0YU1vZGVsRmllbGQ8Rj4gfCB1bmRlZmluZWQ7XG4gIH1cblxuICBhZGRGaWVsZDxGPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IE1vZGVsRmllbGRPcHRpb25zKSB7XG4gICAgY29uc3QgeyBmaWVsZCwgcGFyc2VyLCAuLi5vcHRzIH0gPSBvcHRpb25zO1xuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5hbWUgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kZWwgUHJvcGVydGllcyBuZWVkIG5hbWUgYW5kIGZpZWxkJyk7XG4gICAgY29uc3QgZmllbGRQYXJzZXIgPSBwYXJzZXIgPz8gdGhpcy5zY2hlbWEuZmllbGQ8Rj4oZmllbGQgYXMga2V5b2YgVCk7XG4gICAgaWYgKGZpZWxkUGFyc2VyID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBhcnNlciBmb3IgJHtmaWVsZH0gd2l0aCBuYW1lID0gJHtuYW1lfWApO1xuICAgIGNvbnN0IG1vZGVsRmllbGQgPSBuZXcgT0RhdGFNb2RlbEZpZWxkPEY+KHRoaXMsIHtcbiAgICAgIG5hbWUsXG4gICAgICBmaWVsZCxcbiAgICAgIHBhcnNlcjogZmllbGRQYXJzZXIsXG4gICAgICAuLi5vcHRzLFxuICAgIH0pO1xuICAgIHRoaXMuX2ZpZWxkcy5wdXNoKG1vZGVsRmllbGQpO1xuICAgIHJldHVybiBtb2RlbEZpZWxkO1xuICB9XG5cbiAgdHNUb0VkbTogUmVjb3JkPHN0cmluZywgRWRtVHlwZT4gPSB7XG4gICAgc3RyaW5nOiBFZG1UeXBlLlN0cmluZyxcbiAgICBudW1iZXI6IEVkbVR5cGUuSW50MzIsXG4gICAgYmlnaW50OiBFZG1UeXBlLkludDY0LFxuICAgIGJvb2xlYW46IEVkbVR5cGUuQm9vbGVhbixcbiAgfTtcbiAgcHJpdmF0ZSBtb2RlbEZpZWxkRmFjdG9yeTxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0eXBlOiBzdHJpbmcgfCBFZG1UeXBlXG4gICkge1xuICAgIGNvbnN0IHN0cnVjdHVyZWRGaWVsZFBhcnNlciA9IHRoaXMuc2NoZW1hLmFkZEZpZWxkPEY+KG5hbWUsIHsgdHlwZSB9KTtcbiAgICBzdHJ1Y3R1cmVkRmllbGRQYXJzZXIuY29uZmlndXJlKHtcbiAgICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gdGhpcy5hcGkuZmluZE9wdGlvbnNGb3JUeXBlKHR5cGUpLFxuICAgICAgcGFyc2VyRm9yVHlwZTogKHR5cGU6IHN0cmluZyB8IEVkbVR5cGUpID0+IHRoaXMuYXBpLnBhcnNlckZvclR5cGUodHlwZSksXG4gICAgICBvcHRpb25zOiB0aGlzLmFwaS5vcHRpb25zLFxuICAgIH0pO1xuICAgIGNvbnN0IG1vZGVsRmllbGQgPSB0aGlzLmFkZEZpZWxkPEY+KG5hbWUsIHtcbiAgICAgIGZpZWxkOiBuYW1lLFxuICAgICAgcGFyc2VyOiBzdHJ1Y3R1cmVkRmllbGRQYXJzZXIsXG4gICAgfSk7XG4gICAgbW9kZWxGaWVsZC5jb25maWd1cmUoe1xuICAgICAgZmluZE9wdGlvbnNGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiB0aGlzLmFwaS5maW5kT3B0aW9uc0ZvclR5cGUodHlwZSksXG4gICAgICBvcHRpb25zOiB0aGlzLmFwaS5vcHRpb25zLFxuICAgICAgY29uY3VycmVuY3k6IGZhbHNlLFxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLCBtb2RlbEZpZWxkLm5hbWUsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogKCkgPT4gdGhpcy5nZXQoc2VsZiwgbW9kZWxGaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PiksXG4gICAgICBzZXQ6ICh2YWx1ZTogYW55KSA9PlxuICAgICAgICB0aGlzLnNldChzZWxmLCBtb2RlbEZpZWxkIGFzIE9EYXRhTW9kZWxGaWVsZDxhbnk+LCB2YWx1ZSksXG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGVsRmllbGQ7XG4gIH1cblxuICBhdHRhY2goXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gICkge1xuICAgIGlmIChcbiAgICAgIHNlbGYuX3Jlc291cmNlICE9PSBudWxsICYmXG4gICAgICByZXNvdXJjZS50eXBlKCkgIT09IHNlbGYuX3Jlc291cmNlLnR5cGUoKSAmJlxuICAgICAgIXNlbGYuX3Jlc291cmNlLmlzU3VidHlwZU9mKHJlc291cmNlKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbid0IGF0dGFjaCAke3Jlc291cmNlLnR5cGUoKX0gdG8gJHtzZWxmLl9yZXNvdXJjZS50eXBlKCl9YFxuICAgICAgKTtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSBzZWxmLl9yZXNvdXJjZTtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCAhY3VycmVudC5pc0VxdWFsVG8ocmVzb3VyY2UpKSB7XG4gICAgICBzZWxmLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2F0dGFjaCcsIHtcbiAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICBwcmV2aW91czogY3VycmVudCxcbiAgICAgICAgICB2YWx1ZTogcmVzb3VyY2UsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIyByZWdpb24gUmVzb3VyY2VcbiAgc3RhdGljIGNoYWluKFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+XG4gICk6IFtcbiAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICBdW10ge1xuICAgIGNvbnN0IGNoYWluID0gW10gYXMgYW55W107XG4gICAgbGV0IHR1cGxlOlxuICAgICAgfCBbXG4gICAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgICAgXVxuICAgICAgfCBudWxsID0gW2NoaWxkLCBudWxsXTtcbiAgICB3aGlsZSAodHVwbGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHR1cGxlIGFzIFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICBdO1xuICAgICAgaWYgKGNoYWluLnNvbWUoKHApID0+IHBbMF0gPT09IHBhcmVudFswXSkpIGJyZWFrO1xuICAgICAgY2hhaW4uc3BsaWNlKDAsIDAsIHBhcmVudCk7XG4gICAgICB0dXBsZSA9IHR1cGxlWzBdLl9wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBjaGFpbjtcbiAgfVxuXG4gIHN0YXRpYyByZXNvdXJjZTxUPihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PlxuICApOiBPRGF0YVJlc291cmNlPFQ+IHtcbiAgICBsZXQgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBwcmV2RmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChsZXQgW21vZGVsLCBmaWVsZF0gb2YgT0RhdGFNb2RlbE9wdGlvbnMuY2hhaW4oY2hpbGQpKSB7XG4gICAgICByZXNvdXJjZSA9IHJlc291cmNlIHx8IChtb2RlbC5fcmVzb3VyY2UgYXMgT0RhdGFSZXNvdXJjZTxUPik7XG4gICAgICBpZiAocmVzb3VyY2UgPT09IG51bGwpIGJyZWFrO1xuICAgICAgaWYgKFxuICAgICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG1vZGVsKSAmJlxuICAgICAgICAocHJldkZpZWxkID09PSBudWxsIHx8IHByZXZGaWVsZC5jb2xsZWN0aW9uKVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlc29sdmUga2V5XG4gICAgICAgIGxldCBtb2RlbEtleSA9IChtb2RlbCBhcyBPRGF0YU1vZGVsPGFueT4pLmtleSh7XG4gICAgICAgICAgZmllbGRfbWFwcGluZzogdHJ1ZSxcbiAgICAgICAgfSkgYXMgRW50aXR5S2V5PGFueT47XG4gICAgICAgIGlmIChtb2RlbEtleSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHJlc291cmNlID1cbiAgICAgICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZVxuICAgICAgICAgICAgICA/IHJlc291cmNlLmVudGl0eShtb2RlbEtleSlcbiAgICAgICAgICAgICAgOiAocmVzb3VyY2UgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPikua2V5KG1vZGVsS2V5KTtcbiAgICAgIH1cbiAgICAgIHByZXZGaWVsZCA9IGZpZWxkO1xuICAgICAgaWYgKGZpZWxkID09PSBudWxsKSB7XG4gICAgICAgIC8vIEFwcGx5IHRoZSBxdWVyeSBmcm9tIG1vZGVsIHRvIG5ldyByZXNvdXJjZVxuICAgICAgICBjb25zdCBxdWVyeSA9IG1vZGVsLl9yZXNvdXJjZT8uY2xvbmVRdWVyeTxUPigpLnRvUXVlcnlBcmd1bWVudHMoKTtcbiAgICAgICAgaWYgKHF1ZXJ5ICE9PSB1bmRlZmluZWQpIHJlc291cmNlLnF1ZXJ5KChxKSA9PiBxLmFwcGx5KHF1ZXJ5KSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzb3VyY2UgPSBmaWVsZC5yZXNvdXJjZUZhY3Rvcnk8YW55LCBhbnk+KHJlc291cmNlKTtcbiAgICB9XG4gICAgaWYgKHJlc291cmNlID09PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGByZXNvdXJjZTogQ2FuJ3QgYnVpbGQgcmVzb3VyY2UgZm9yICR7Y2hpbGR9YCk7XG4gICAgcmV0dXJuIHJlc291cmNlO1xuICB9XG5cbiAgY29sbGVjdGlvblJlc291cmNlRmFjdG9yeShcbiAgICBxdWVyeT86IE9EYXRhUXVlcnlPcHRpb25zPFQ+XG4gICk6XG4gICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZW50aXR5U2V0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UuZmFjdG9yeTxUPih0aGlzLmFwaSwge1xuICAgICAgcGF0aDogdGhpcy5lbnRpdHlTZXQubmFtZSxcbiAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICBxdWVyeSxcbiAgICB9KTtcbiAgfVxuXG4gIG1vZGVsUmVzb3VyY2VGYWN0b3J5KFxuICAgIHF1ZXJ5PzogT0RhdGFRdWVyeU9wdGlvbnM8VD5cbiAgKTpcbiAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPlxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeShxdWVyeSk7XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkgcmV0dXJuIHJlc291cmNlLmVudGl0eSgpO1xuICAgIHJldHVybiByZXNvdXJjZSBhc1xuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgZW50aXR5UmVzb3VyY2Uoc2VsZjogT0RhdGFNb2RlbDxUPik6IE9EYXRhUmVzb3VyY2U8VD4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMubW9kZWxSZXNvdXJjZUZhY3RvcnkoXG4gICAgICBzZWxmLl9yZXNvdXJjZSAhPT0gbnVsbCA/IHNlbGYuX3Jlc291cmNlLmNsb25lUXVlcnkoKSA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGVudGl0eVJlc291cmNlOiBDYW4ndCBidWlsZCByZXNvdXJjZSBmb3IgJHtzZWxmfWApO1xuICAgIGNvbnN0IGtleSA9IHNlbGYua2V5KHsgZmllbGRfbWFwcGluZzogdHJ1ZSB9KSBhcyBFbnRpdHlLZXk8VD47XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcmVzb3VyY2Uua2V5KGtleSk7XG4gICAgcmV0dXJuIHJlc291cmNlIGFzIE9EYXRhUmVzb3VyY2U8VD47XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgYmluZChcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHtcbiAgICAgIHBhcmVudCxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYW5ub3RzLFxuICAgIH06IHtcbiAgICAgIHBhcmVudD86IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICBdO1xuICAgICAgcmVzb3VyY2U/OiBPRGF0YVJlc291cmNlPFQ+O1xuICAgICAgYW5ub3RzPzogT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxUPjtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgLy8gUGFyZW50XG4gICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZWxmLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuXG4gICAgLy8gUmVzb3VyY2VcbiAgICBpZiAoc2VsZi5fcGFyZW50ID09PSBudWxsICYmIHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXNvdXJjZSA9IHRoaXMubW9kZWxSZXNvdXJjZUZhY3RvcnkoKTtcbiAgICBpZiAocmVzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hdHRhY2goXG4gICAgICAgIHNlbGYsXG4gICAgICAgIHJlc291cmNlIGFzXG4gICAgICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQW5ub3RhdGlvbnNcbiAgICBzZWxmLl9hbm5vdGF0aW9ucyA9XG4gICAgICBhbm5vdHMgfHwgbmV3IE9EYXRhRW50aXR5QW5ub3RhdGlvbnMoT0RhdGFIZWxwZXJbREVGQVVMVF9WRVJTSU9OXSk7XG5cbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgfSk7XG4gICAgZm9yIChsZXQgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZiwgZmllbGQubmFtZSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gdGhpcy5nZXQoc2VsZiwgZmllbGQgYXMgT0RhdGFNb2RlbEZpZWxkPGFueT4pLFxuICAgICAgICBzZXQ6ICh2YWx1ZTogYW55KSA9PlxuICAgICAgICAgIHRoaXMuc2V0KHNlbGYsIGZpZWxkIGFzIE9EYXRhTW9kZWxGaWVsZDxhbnk+LCB2YWx1ZSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBxdWVyeShcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD4sXG4gICAgZnVuYzogKHE6IE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPiwgcz86IE9EYXRhU3RydWN0dXJlZFR5cGU8VD4pID0+IHZvaWRcbiAgKSB7XG4gICAgcmVzb3VyY2UucXVlcnkoZnVuYyk7XG4gICAgdGhpcy5hdHRhY2goc2VsZiwgcmVzb3VyY2UpO1xuICAgIHJldHVybiBzZWxmO1xuICB9XG5cbiAgcmVzb2x2ZUtleShcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxUPiB8IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICAgIHNpbmdsZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW47IHNpbmdsZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IEVudGl0eUtleTxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrZXlUeXBlcyA9IHRoaXMuc2NoZW1hLmtleXMoeyBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSk7XG4gICAgY29uc3Qga2V5ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBmb3IgKGxldCBrdCBvZiBrZXlUeXBlcykge1xuICAgICAgbGV0IHYgPSB2YWx1ZSBhcyBhbnk7XG4gICAgICBsZXQgb3B0aW9ucyA9IHRoaXMgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgICAgIGxldCBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGxldCBuYW1lIG9mIGt0Lm5hbWUuc3BsaXQoJy8nKSkge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgZmllbGQgPSBvcHRpb25zXG4gICAgICAgICAgLmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbjogZmFsc2UsIGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KVxuICAgICAgICAgIC5maW5kKChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+IGZpZWxkLmZpZWxkID09PSBuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2ID1cbiAgICAgICAgICAgIFR5cGVzLmlzUGxhaW5PYmplY3QodikgfHwgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2KVxuICAgICAgICAgICAgICA/IHZbZmllbGQubmFtZV1cbiAgICAgICAgICAgICAgOiB2O1xuICAgICAgICAgIG9wdGlvbnMgPSBmaWVsZC5tZXRhIGFzIE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgbGV0IG5hbWUgPSBmaWVsZF9tYXBwaW5nID8gZmllbGQuZmllbGQgOiBmaWVsZC5uYW1lO1xuICAgICAgaWYgKGt0LmFsaWFzICE9PSB1bmRlZmluZWQpIG5hbWUgPSBrdC5hbGlhcztcbiAgICAgIGtleS5zZXQobmFtZSwgdik7XG4gICAgfVxuICAgIGlmIChrZXkuc2l6ZSA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZVxuICAgICAgPyBPYmplY3RzLnJlc29sdmVLZXkoa2V5LCB7IHNpbmdsZSB9KVxuICAgICAgOiBPYmplY3QuZnJvbUVudHJpZXMoa2V5KTtcbiAgfVxuXG4gIHJlc29sdmVSZWZlcmVudGlhbChcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxUPiB8IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwsXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgICAgc2luZ2xlID0gZmFsc2UsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW47IHNpbmdsZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVmZXJlbnRpYWwgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIGZvciAobGV0IHJlZiBvZiBmaWVsZC5yZWZlcmVudGlhbHMpIHtcbiAgICAgIGxldCBmcm9tID0gdGhpcy5maWVsZHMoe1xuICAgICAgICBpbmNsdWRlX25hdmlnYXRpb246IGZhbHNlLFxuICAgICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICB9KS5maW5kKChwOiBhbnkpID0+IHAuZmllbGQgPT09IHJlZi5yZWZlcmVuY2VkUHJvcGVydHkpO1xuICAgICAgbGV0IHRvID0gZmllbGQub3B0aW9uc1xuICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9uYXZpZ2F0aW9uOiBmYWxzZSwgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgIC5maW5kKChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+IGZpZWxkLmZpZWxkID09PSByZWYucHJvcGVydHkpO1xuICAgICAgaWYgKGZyb20gIT09IHVuZGVmaW5lZCAmJiB0byAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmllbGRfbWFwcGluZyA/IHRvLmZpZWxkIDogdG8ubmFtZTtcbiAgICAgICAgcmVmZXJlbnRpYWwuc2V0KG5hbWUsIHZhbHVlICYmICh2YWx1ZSBhcyBhbnkpW2Zyb20ubmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVmZXJlbnRpYWwuc2l6ZSA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocmVmZXJlbnRpYWwuc2l6ZSA9PT0gMSAmJiBBcnJheS5mcm9tKHJlZmVyZW50aWFsLnZhbHVlcygpKVswXSA9PT0gbnVsbClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiByZXNvbHZlXG4gICAgICA/IE9iamVjdHMucmVzb2x2ZUtleShyZWZlcmVudGlhbCwgeyBzaW5nbGUgfSlcbiAgICAgIDogT2JqZWN0LmZyb21FbnRyaWVzKHJlZmVyZW50aWFsKTtcbiAgfVxuXG4gIHJlc29sdmVSZWZlcmVuY2VkKFxuICAgIHZhbHVlOiBPRGF0YU1vZGVsPFQ+IHwgVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCxcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgICBzaW5nbGUgPSBmYWxzZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbjsgc2luZ2xlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWZlcmVuY2VkID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBmb3IgKGxldCByZWYgb2YgZmllbGQucmVmZXJlbnRpYWxzKSB7XG4gICAgICBsZXQgZnJvbSA9IHRoaXMuZmllbGRzKHtcbiAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBmYWxzZSxcbiAgICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgICAgfSkuZmluZCgoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5maWVsZCA9PT0gcmVmLnByb3BlcnR5KTtcbiAgICAgIGxldCB0byA9IChmaWVsZC5tZXRhIGFzIE9EYXRhTW9kZWxPcHRpb25zPGFueT4pXG4gICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX25hdmlnYXRpb246IGZhbHNlLCBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgLmZpbmQoXG4gICAgICAgICAgKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT5cbiAgICAgICAgICAgIGZpZWxkLmZpZWxkID09PSByZWYucmVmZXJlbmNlZFByb3BlcnR5XG4gICAgICAgICk7XG4gICAgICBpZiAoZnJvbSAhPT0gdW5kZWZpbmVkICYmIHRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmaWVsZF9tYXBwaW5nID8gdG8uZmllbGQgOiB0by5uYW1lO1xuICAgICAgICByZWZlcmVuY2VkLnNldChuYW1lLCB2YWx1ZSAmJiAodmFsdWUgYXMgYW55KVtmcm9tLm5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlZmVyZW5jZWQuc2l6ZSA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocmVmZXJlbmNlZC5zaXplID09PSAxICYmIEFycmF5LmZyb20ocmVmZXJlbmNlZC52YWx1ZXMoKSlbMF0gPT09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcmVzb2x2ZVxuICAgICAgPyBPYmplY3RzLnJlc29sdmVLZXkocmVmZXJlbmNlZCwgeyBzaW5nbGUgfSlcbiAgICAgIDogT2JqZWN0LmZyb21FbnRyaWVzKHJlZmVyZW5jZWQpO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogbmF2aWdhdGlvbixcbiAgICB9KS5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IChzZWxmIGFzIGFueSlbZmllbGQubmFtZV07XG4gICAgICBsZXQgZXJycyA9IGZpZWxkLnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCB9KTtcbiAgICAgIHJldHVybiBlcnJzICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBPYmplY3QuYXNzaWduKGFjYywgeyBbZmllbGQubmFtZV06IGVycnMgfSlcbiAgICAgICAgOiBhY2M7XG4gICAgfSwge30pO1xuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZGVmYXVsdHMoKTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkZWZzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBmYWxzZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KS5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRzKCk7XG4gICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IE9iamVjdC5hc3NpZ24oYWNjLCB7IFtmaWVsZC5uYW1lXTogdmFsdWUgfSlcbiAgICAgICAgOiBhY2M7XG4gICAgfSwge30pO1xuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShkZWZzKSA/IGRlZnMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBoYXNDaGFuZ2VkKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgeyBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSB9OiB7IGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW4gfSA9IHt9XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBzZWxmLl9jaGFuZ2VzLnNpemUgIT0gMCB8fFxuICAgICAgWy4uLnNlbGYuX3JlbGF0aW9ucy52YWx1ZXMoKV1cbiAgICAgICAgLmZpbHRlcigoeyBmaWVsZCB9KSA9PiAhZmllbGQubmF2aWdhdGlvbiB8fCBpbmNsdWRlX25hdmlnYXRpb24pXG4gICAgICAgIC5zb21lKFxuICAgICAgICAgICh7IGZpZWxkLCBzdGF0ZSwgbW9kZWwgfSkgPT5cbiAgICAgICAgICAgICghaW5jbHVkZV9uYXZpZ2F0aW9uIHx8IGZpZWxkLm5hdmlnYXRpb24pICYmXG4gICAgICAgICAgICAoc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5DaGFuZ2VkIHx8XG4gICAgICAgICAgICAgIChtb2RlbCAhPSB1bmRlZmluZWQgJiYgbW9kZWwuaGFzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9KSkpXG4gICAgICAgIClcbiAgICApO1xuICB9XG5cbiAgaGFzS2V5KHNlbGY6IE9EYXRhTW9kZWw8VD4pIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlS2V5KHNlbGYpICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICB3aXRoUmVzb3VyY2U8UiwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KFxuICAgIHNlbGY6IE0sXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPixcbiAgICBjdHg6IChtb2RlbDogTSkgPT4gUlxuICApOiBSIHtcbiAgICAvLyBQdXNoXG4gICAgc2VsZi5wdXNoUmVzb3VyY2UocmVzb3VyY2UpO1xuICAgIC8vIEV4ZWN1dGUgZnVuY3Rpb25cbiAgICBjb25zdCByZXN1bHQgPSBjdHgoc2VsZik7XG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIHJldHVybiAocmVzdWx0IGFzIGFueSkucGlwZShcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIC8vIFBvcFxuICAgICAgICAgIHNlbGYucG9wUmVzb3VyY2UoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBvcFxuICAgICAgc2VsZi5wb3BSZXNvdXJjZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgYXNFbnRpdHk8UiwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KHNlbGY6IE0sIGN0eDogKG1vZGVsOiBNKSA9PiBSKTogUiB7XG4gICAgLy8gQnVpbGQgbmV3IHJlc291cmNlXG4gICAgY29uc3QgcXVlcnkgPSBzZWxmLl9yZXNvdXJjZT8uY2xvbmVRdWVyeTxUPigpO1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMubW9kZWxSZXNvdXJjZUZhY3RvcnkocXVlcnkpO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb2RlbCBkb2VzIG5vdCBoYXZlIGFzc29jaWF0ZWQgRW50aXR5IGVuZHBvaW50Jyk7XG4gICAgcmV0dXJuIHRoaXMud2l0aFJlc291cmNlKHNlbGYsIHJlc291cmNlLCBjdHgpO1xuICB9XG5cbiAgdG9FbnRpdHkoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBjbGllbnRfaWQgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgY2hhaW4gPSBbXSxcbiAgICB9OiB7XG4gICAgICBjbGllbnRfaWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2tleT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgICAgZmllbGRfbWFwcGluZz86IGJvb2xlYW47XG4gICAgICBjaGFpbj86IChPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVtdO1xuICAgIH0gPSB7fVxuICApOiBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGxldCBhdHRycyA9IHNlbGYuYXR0cmlidXRlcyh7XG4gICAgICBjaGFuZ2VzX29ubHksXG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICB9KTtcblxuICAgIGxldCByZWxhdGlvbnMgPSBbLi4uc2VsZi5fcmVsYXRpb25zLmVudHJpZXMoKV1cbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIC8vIENoYWluXG4gICAgICAgIChbLCB7IG1vZGVsIH1dKSA9PiBjaGFpbi5ldmVyeSgoYykgPT4gYyAhPT0gbW9kZWwpXG4gICAgICApXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAvLyBDaGFuZ2VzIG9ubHlcbiAgICAgICAgKFssIHsgbW9kZWwsIHN0YXRlIH1dKSA9PlxuICAgICAgICAgICFjaGFuZ2VzX29ubHkgfHxcbiAgICAgICAgICAoY2hhbmdlc19vbmx5ICYmXG4gICAgICAgICAgICAoc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5DaGFuZ2VkIHx8XG4gICAgICAgICAgICAgIChtb2RlbCAhPSB1bmRlZmluZWQgJiYgbW9kZWwuaGFzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9KSkpKVxuICAgICAgKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKFssIHsgZmllbGQsIG1vZGVsIH1dKSA9PlxuICAgICAgICAgIC8vIE5hdmlnYXRpb25cbiAgICAgICAgICAoaW5jbHVkZV9uYXZpZ2F0aW9uICYmIGZpZWxkLm5hdmlnYXRpb24gJiYgbW9kZWwgIT09IG51bGwpIHx8XG4gICAgICAgICAgIWZpZWxkLm5hdmlnYXRpb25cbiAgICAgIClcbiAgICAgIC5tYXAoKFtrLCB7IG1vZGVsLCBmaWVsZCwgc3RhdGUgfV0pID0+IHtcbiAgICAgICAgbGV0IGNoYW5nZXNPbmx5ID1cbiAgICAgICAgICBjaGFuZ2VzX29ubHkgJiZcbiAgICAgICAgICBzdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLkNoYW5nZWQgJiZcbiAgICAgICAgICAhIWZpZWxkLm5hdmlnYXRpb247XG4gICAgICAgIGxldCBpbmNsdWRlS2V5ID0gaW5jbHVkZV9rZXkgJiYgISFmaWVsZC5uYXZpZ2F0aW9uO1xuICAgICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChtb2RlbCkpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgayxcbiAgICAgICAgICAgIChtb2RlbCBhcyBPRGF0YU1vZGVsPGFueT4pLnRvRW50aXR5KHtcbiAgICAgICAgICAgICAgY2xpZW50X2lkLFxuICAgICAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICAgICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICAgICAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICAgICAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgICAgICAgICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgICAgICAgICBjaGFuZ2VzX29ubHk6IGNoYW5nZXNPbmx5LFxuICAgICAgICAgICAgICBpbmNsdWRlX2tleTogaW5jbHVkZUtleSxcbiAgICAgICAgICAgICAgY2hhaW46IFtzZWxmLCAuLi5jaGFpbl0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2UgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihtb2RlbCkpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgayxcbiAgICAgICAgICAgIChtb2RlbCBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KS50b0VudGl0aWVzKHtcbiAgICAgICAgICAgICAgY2xpZW50X2lkLFxuICAgICAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICAgICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICAgICAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICAgICAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgICAgICAgICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgICAgICAgICBjaGFuZ2VzX29ubHk6IGNoYW5nZXNPbmx5LFxuICAgICAgICAgICAgICBpbmNsdWRlX2tleTogaW5jbHVkZUtleSxcbiAgICAgICAgICAgICAgY2hhaW46IFtzZWxmLCAuLi5jaGFpbl0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbaywgbW9kZWxdO1xuICAgICAgfSlcbiAgICAgIC5yZWR1Y2UoKGFjYywgW2ssIHZdKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBmaWVsZF9tYXBwaW5nXG4gICAgICAgICAgPyB0aGlzLmZpZWxkcyh7XG4gICAgICAgICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgICAgICAgIH0pLmZpbmQoKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT4gZmllbGQubmFtZSA9PT0gayk/LmZpZWxkIHx8XG4gICAgICAgICAgICBrXG4gICAgICAgICAgOiBrO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiB2IH0pO1xuICAgICAgfSwge30pO1xuXG4gICAgLy8gQ3JlYXRlIGVudGl0eVxuICAgIGxldCBlbnRpdHk6IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHsgLi4uYXR0cnMsIC4uLnJlbGF0aW9ucyB9O1xuXG4gICAgLy8gQWRkIGNsaWVudF9pZFxuICAgIGlmIChjbGllbnRfaWQpIHtcbiAgICAgICg8YW55PmVudGl0eSlbdGhpcy5jaWRdID0gKDxhbnk+c2VsZilbdGhpcy5jaWRdO1xuICAgIH1cblxuICAgIC8vIEFkZCBrZXlcbiAgICBpZiAoaW5jbHVkZV9rZXkpIHtcbiAgICAgIGVudGl0eSA9IHtcbiAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAuLi4odGhpcy5yZXNvbHZlS2V5KHNlbGYsIHsgZmllbGRfbWFwcGluZywgcmVzb2x2ZTogZmFsc2UgfSkgYXMge30pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdHlwZVxuICAgIGlmIChcbiAgICAgIHNlbGYuX3BhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgKChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHNlbGYuX3BhcmVudFswXSkgJiZcbiAgICAgICAgKHNlbGYuX3BhcmVudFsxXSBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PikubWV0YSAhPT0gc2VsZi5fbWV0YSkgfHxcbiAgICAgICAgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihzZWxmLl9wYXJlbnRbMF0pICYmXG4gICAgICAgICAgKHNlbGYuX3BhcmVudFswXSBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KS5fbW9kZWxcbiAgICAgICAgICAgIC5tZXRhICE9PSBzZWxmLl9tZXRhKSlcbiAgICApIHtcbiAgICAgIGVudGl0eVt0aGlzLmFwaS5vcHRpb25zLmhlbHBlci5PREFUQV9UWVBFXSA9IGAjJHt0aGlzLnNjaGVtYS50eXBlKCl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cbiAgYXR0cmlidXRlcyhcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHtcbiAgICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgLy8gQXR0cmlidXRlcyBieSBmaWVsZHMgKGF0dHJpYnV0ZXMgZm9yIHRoZSBtb2RlbCB0eXBlKVxuICAgIGNvbnN0IGZpZWxkQXR0cnMgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IGZhbHNlLFxuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgIH0pLnJlZHVjZSgoYWNjLCBmKSA9PiB7XG4gICAgICBjb25zdCBpc0NoYW5nZWQgPSBzZWxmLl9jaGFuZ2VzLmhhcyhmLm5hbWUpO1xuICAgICAgY29uc3QgbmFtZSA9IGZpZWxkX21hcHBpbmcgPyBmLmZpZWxkIDogZi5uYW1lO1xuICAgICAgY29uc3QgY29tcHV0ZWQgPSBmLmFubm90YXRlZFZhbHVlPGJvb2xlYW4+KENPTVBVVEVEKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gaXNDaGFuZ2VkXG4gICAgICAgID8gc2VsZi5fY2hhbmdlcy5nZXQoZi5uYW1lKVxuICAgICAgICA6IHNlbGYuX2F0dHJpYnV0ZXMuZ2V0KGYubmFtZSk7XG4gICAgICBpZiAoZi5jb25jdXJyZW5jeSAmJiBpbmNsdWRlX2NvbmN1cnJlbmN5KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgfSBlbHNlIGlmIChjb21wdXRlZCAmJiBpbmNsdWRlX2NvbXB1dGVkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzX29ubHkgJiYgaXNDaGFuZ2VkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgfSBlbHNlIGlmICghY2hhbmdlc19vbmx5ICYmICFmLmNvbmN1cnJlbmN5ICYmICFjb21wdXRlZCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG4gICAgfSwge30pO1xuICAgIGlmICghaW5jbHVkZV9ub25fZmllbGQpIHJldHVybiBmaWVsZEF0dHJzO1xuICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoZmllbGRBdHRycyk7XG4gICAgLy8gQXR0cmlidXRlcyBmcm9tIG9iamVjdCAoYXR0cmlidXRlcyBmb3Igb2JqZWN0KVxuICAgIGNvbnN0IG5vbkZpZWxkQXR0cnMgPSBPYmplY3QuZW50cmllcyhzZWxmKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKFtrXSkgPT5cbiAgICAgICAgICBuYW1lcy5pbmRleE9mKGspID09PSAtMSAmJiAhay5zdGFydHNXaXRoKCdfJykgJiYgIWsuZW5kc1dpdGgoJyQnKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjLCBbaywgdl0pID0+IE9iamVjdC5hc3NpZ24oYWNjLCB7IFtrXTogdiB9KSwge30pO1xuICAgIHJldHVybiB7IC4uLmZpZWxkQXR0cnMsIC4uLm5vbkZpZWxkQXR0cnMgfTtcbiAgfVxuXG4gIHJlc2V0KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgeyBuYW1lLCBzaWxlbnQgPSBmYWxzZSB9OiB7IG5hbWU/OiBzdHJpbmc7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIGxldCBjaGFuZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFJlc2V0IHZhbHVlXG4gICAgICBjb25zdCB2YWx1ZSA9IHNlbGYuX2F0dHJpYnV0ZXMuZ2V0KG5hbWUpO1xuICAgICAgY29uc3QgY2hhbmdlID0gc2VsZi5fY2hhbmdlcy5nZXQobmFtZSk7XG4gICAgICBpZiAodmFsdWUgIT09IGNoYW5nZSkgY2hhbmdlcyA9IFtuYW1lXTtcbiAgICAgIHNlbGYuX3JlbGF0aW9ucy5kZWxldGUobmFtZSk7XG4gICAgICBzZWxmLl9jaGFuZ2VzLmRlbGV0ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVzZXQgYWxsXG4gICAgICBjaGFuZ2VzID0gWy4uLnNlbGYuX2NoYW5nZXMua2V5cygpXTtcbiAgICAgIHNlbGYuX3JlbGF0aW9ucy5jbGVhcigpO1xuICAgICAgc2VsZi5fY2hhbmdlcy5jbGVhcigpO1xuICAgIH1cbiAgICBpZiAoIXNpbGVudCAmJiBjaGFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdyZXNldCcsIHtcbiAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICBvcHRpb25zOiB7IGNoYW5nZXMgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXNzaWduKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZW50aXR5OiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAge1xuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICBzZWxmLl9yZXNldCA9IHJlc2V0O1xuICAgIHNlbGYuX3JlcGFyZW50ID0gcmVwYXJlbnQ7XG4gICAgc2VsZi5fc2lsZW50ID0gc2lsZW50O1xuXG4gICAgY29uc3QgY2hhbmdlczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEFwcGx5IGVudGl0eVxuICAgIGNvbnN0IG1vZGVsID0gc2VsZiBhcyBhbnk7XG4gICAgT2JqZWN0LmVudHJpZXMoZW50aXR5KVxuICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSAvLyBGaWx0ZXIgdW5kZWZpbmVkXG4gICAgICAuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMoe1xuICAgICAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgICAgIH0pLmZpbmQoXG4gICAgICAgICAgKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT5cbiAgICAgICAgICAgIChzZWxmLl9yZXNldCAmJiBmaWVsZC5maWVsZCA9PT0ga2V5KSB8fCBmaWVsZC5uYW1lID09PSBrZXlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIERlbGVnYXRlZCB0byBwcml2YXRlIHNldHRlclxuICAgICAgICAgIGlmICh0aGlzLnNldChzZWxmLCBmaWVsZCwgdmFsdWUpKSB7XG4gICAgICAgICAgICBjaGFuZ2VzLnB1c2goZmllbGQubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEJhc2ljIGFzc2lnbm1lbnRcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gbW9kZWxba2V5XTtcbiAgICAgICAgICBtb2RlbFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IHZhbHVlKSBjaGFuZ2VzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAoKCFzZWxmLl9zaWxlbnQgJiYgY2hhbmdlcy5sZW5ndGggPiAwKSB8fCBzZWxmLl9yZXNldCkge1xuICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoc2VsZi5fcmVzZXQgPyAncmVzZXQnIDogJ3VwZGF0ZScsIHtcbiAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICBvcHRpb25zOiB7IGNoYW5nZXMgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHNlbGYuX3Jlc2V0ID0gZmFsc2U7XG4gICAgc2VsZi5fcmVwYXJlbnQgPSBmYWxzZTtcbiAgICBzZWxmLl9zaWxlbnQgPSBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBpc01vZGVsKG9iajogYW55KSB7XG4gICAgcmV0dXJuIFR5cGVzLnJhd1R5cGUob2JqKSA9PT0gJ01vZGVsJztcbiAgfVxuXG4gIHN0YXRpYyBpc0NvbGxlY3Rpb24ob2JqOiBhbnkpIHtcbiAgICByZXR1cm4gVHlwZXMucmF3VHlwZShvYmopID09PSAnQ29sbGVjdGlvbic7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVDb2xsZWN0aW9uPEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPixcbiAgICBjb2xsZWN0aW9uOiBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4sXG4gICAgdmFsdWU6IFBhcnRpYWw8VD5bXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgKSB7XG4gICAgY29sbGVjdGlvbi5fYW5ub3RhdGlvbnMgPSBmaWVsZC5hbm5vdGF0aW9uc0ZhY3RvcnkoXG4gICAgICBzZWxmLmFubm90cygpXG4gICAgKSBhcyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM8Rj47XG4gICAgY29sbGVjdGlvbi5hc3NpZ24odmFsdWUgYXMgUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSwge1xuICAgICAgcmVzZXQ6IHNlbGYuX3Jlc2V0LFxuICAgICAgcmVwYXJlbnQ6IHNlbGYuX3JlcGFyZW50LFxuICAgICAgc2lsZW50OiBzZWxmLl9zaWxlbnQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uaGFzQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlTW9kZWw8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+LFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPEY+LFxuICAgIHZhbHVlOiBGIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgKSB7XG4gICAgbW9kZWwuX2Fubm90YXRpb25zID0gZmllbGQuYW5ub3RhdGlvbnNGYWN0b3J5KFxuICAgICAgc2VsZi5hbm5vdHMoKVxuICAgICkgYXMgT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxGPjtcbiAgICBtb2RlbC5hc3NpZ24odmFsdWUgYXMgRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB7XG4gICAgICByZXNldDogc2VsZi5fcmVzZXQsXG4gICAgICByZXBhcmVudDogc2VsZi5fcmVwYXJlbnQsXG4gICAgICBzaWxlbnQ6IHNlbGYuX3NpbGVudCxcbiAgICB9KTtcbiAgICByZXR1cm4gbW9kZWwuaGFzQ2hhbmdlZCgpO1xuICB9XG5cbiAgZ2V0PEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPiB8IHN0cmluZ1xuICApOiBGIHwgT0RhdGFNb2RlbDxGPiB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PiB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1vZGVsRmllbGQgPVxuICAgICAgZmllbGQgaW5zdGFuY2VvZiBPRGF0YU1vZGVsRmllbGQgPyBmaWVsZCA6IHRoaXMuZmluZEZpZWxkPEY+KGZpZWxkKTtcbiAgICBpZiAobW9kZWxGaWVsZCAhPT0gdW5kZWZpbmVkICYmIG1vZGVsRmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpKSB7XG4gICAgICBjb25zdCByZWxhdGlvbiA9IHNlbGYuX3JlbGF0aW9ucy5nZXQobW9kZWxGaWVsZC5uYW1lKTtcbiAgICAgIGlmIChcbiAgICAgICAgbW9kZWxGaWVsZC5uYXZpZ2F0aW9uICYmXG4gICAgICAgIChyZWxhdGlvbj8ubW9kZWwgPT09IG51bGwgfHwgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChyZWxhdGlvbj8ubW9kZWwpKVxuICAgICAgKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciByZWZlcmVuY2VcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlZCA9IHRoaXMucmVzb2x2ZVJlZmVyZW5jZWQoc2VsZiwgbW9kZWxGaWVsZCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZWxhdGlvbj8ubW9kZWwgIT09IG51bGwgJiZcbiAgICAgICAgICByZWZlcmVuY2VkICE9PSBudWxsICYmXG4gICAgICAgICAgcmVmZXJlbmNlZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIChyZWxhdGlvbiEubW9kZWwgYXMgT0RhdGFNb2RlbDxGPikuYXNzaWduKHJlZmVyZW5jZWQgYXMgUGFydGlhbDxGPiwge1xuICAgICAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uPy5tb2RlbCAhPT0gbnVsbCAmJiByZWZlcmVuY2VkID09PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fdW5saW5rKHNlbGYsIHJlbGF0aW9uIGFzIE9EYXRhTW9kZWxSZWxhdGlvbjxGPik7XG4gICAgICAgICAgLy8gTmV3IHZhbHVlIGlzIG51bGxcbiAgICAgICAgICAocmVsYXRpb24gYXMgT0RhdGFNb2RlbFJlbGF0aW9uPEY+KS5tb2RlbCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAocmVsYXRpb24/Lm1vZGVsID09PSBudWxsICYmIHJlZmVyZW5jZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBOZXcgdmFsdWUgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgKHJlbGF0aW9uIGFzIE9EYXRhTW9kZWxSZWxhdGlvbjxGPikubW9kZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZWxhdGlvbj8ubW9kZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXMoc2VsZiwge1xuICAgICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5OiB0cnVlLFxuICAgICAgICBpbmNsdWRlX2NvbXB1dGVkOiB0cnVlLFxuICAgICAgfSlbbW9kZWxGaWVsZCAhPT0gdW5kZWZpbmVkID8gbW9kZWxGaWVsZC5uYW1lIDogKGZpZWxkIGFzIHN0cmluZyldO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldFN0cnVjdHVyZWQ8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+LFxuICAgIHZhbHVlOlxuICAgICAgfCBGXG4gICAgICB8IEZbXVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgICB8IE9EYXRhTW9kZWw8Rj5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+XG4gICAgICB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICAvLyBFbnN1cmVzIHRoYXQgdGhlIHJlbGF0aW9uIGV4aXN0c1xuICAgIGlmICghc2VsZi5fcmVsYXRpb25zLmhhcyhmaWVsZC5uYW1lKSkge1xuICAgICAgc2VsZi5fcmVsYXRpb25zLnNldChmaWVsZC5uYW1lLCB7XG4gICAgICAgIHN0YXRlOiBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkLFxuICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGlvbiA9IHNlbGYuX3JlbGF0aW9ucy5nZXQoZmllbGQubmFtZSkhO1xuICAgIGNvbnN0IGN1cnJlbnQgPSByZWxhdGlvbi5tb2RlbDtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gVW5saW5rIG9sZCByZWxhdGlvblxuICAgICAgdGhpcy5fdW5saW5rKHNlbGYsIHJlbGF0aW9uKTtcblxuICAgICAgLy8gTmV3IHZhbHVlIGlzIG51bGxcbiAgICAgIHJlbGF0aW9uLm1vZGVsID0gdmFsdWUgYXMgbnVsbDtcbiAgICAgIGNoYW5nZWQgPSBjdXJyZW50ICE9PSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihjdXJyZW50KSkge1xuICAgICAgLy8gQ3VycmVudCBpcyBjb2xsZWN0aW9uXG4gICAgICBsZXQgY3VycmVudENvbGxlY3Rpb24gPSBjdXJyZW50IGFzIE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PjtcbiAgICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpKSB7XG4gICAgICAgIC8vIE5ldyB2YWx1ZSBpcyBjb2xsZWN0aW9uXG4gICAgICAgIGxldCBuZXdDb2xsZWN0aW9uID0gdmFsdWUgYXMgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+O1xuICAgICAgICBpZiAoY3VycmVudENvbGxlY3Rpb24uZXF1YWxzKG5ld0NvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVubGluayBvbGQgY29sbGVjdGlvblxuICAgICAgICAgIHRoaXMuX3VubGluayhzZWxmLCByZWxhdGlvbik7XG4gICAgICAgICAgcmVsYXRpb24ubW9kZWwgPSBuZXdDb2xsZWN0aW9uO1xuICAgICAgICAgIC8vIExpbmsgbmV3IGNvbGxlY3Rpb25cbiAgICAgICAgICB0aGlzLl9saW5rKHNlbGYsIHJlbGF0aW9uKTtcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChUeXBlcy5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAvLyBOZXcgdmFsdWUgaXMgYXJyYXlcbiAgICAgICAgY2hhbmdlZCA9IHRoaXMuX3VwZGF0ZUNvbGxlY3Rpb248Rj4oXG4gICAgICAgICAgc2VsZixcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBjdXJyZW50Q29sbGVjdGlvbixcbiAgICAgICAgICB2YWx1ZSBhcyBUW10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGN1cnJlbnQpKSB7XG4gICAgICAvLyBDdXJyZW50IGlzIG1vZGVsXG4gICAgICBsZXQgY3VycmVudE1vZGVsID0gY3VycmVudCBhcyBPRGF0YU1vZGVsPEY+O1xuICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICAgIC8vIE5ldyB2YWx1ZSBpcyBtb2RlbFxuICAgICAgICBsZXQgbmV3TW9kZWwgPSB2YWx1ZSBhcyBPRGF0YU1vZGVsPEY+O1xuICAgICAgICBpZiAoY3VycmVudE1vZGVsLmVxdWFscyhuZXdNb2RlbCkpIHtcbiAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVW5saW5rIG9sZCBtb2RlbFxuICAgICAgICAgIHRoaXMuX3VubGluayhzZWxmLCByZWxhdGlvbik7XG4gICAgICAgICAgcmVsYXRpb24ubW9kZWwgPSBuZXdNb2RlbDtcbiAgICAgICAgICAvLyBMaW5rIG5ldyBtb2RlbFxuICAgICAgICAgIHRoaXMuX2xpbmsoc2VsZiwgcmVsYXRpb24pO1xuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFR5cGVzLmlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICAgIGNoYW5nZWQgPSB0aGlzLl91cGRhdGVNb2RlbDxGPihcbiAgICAgICAgICBzZWxmLFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIGN1cnJlbnRNb2RlbCxcbiAgICAgICAgICB2YWx1ZSBhcyBGIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3VycmVudCBpcyBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgLy8gY3JlYXRlIG5ldyBtb2RlbC9jb2xsZWN0aW9uIGZvciBnaXZlbiB2YWx1ZVxuICAgICAgcmVsYXRpb24ubW9kZWwgPVxuICAgICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpIHx8XG4gICAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpXG4gICAgICAgICAgPyAodmFsdWUgYXMgT0RhdGFNb2RlbDxGPiB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PilcbiAgICAgICAgICA6IGZpZWxkLmNvbGxlY3Rpb25cbiAgICAgICAgICA/IGZpZWxkLmNvbGxlY3Rpb25GYWN0b3J5PEY+KHtcbiAgICAgICAgICAgICAgcGFyZW50OiBzZWxmLFxuICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUgYXMgRltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSxcbiAgICAgICAgICAgICAgcmVzZXQ6IHNlbGYuX3Jlc2V0LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IGZpZWxkLm1vZGVsRmFjdG9yeTxGPih7XG4gICAgICAgICAgICAgIHBhcmVudDogc2VsZixcbiAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICByZXNldDogc2VsZi5fcmVzZXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgIC8vIExpbmsgbmV3IG1vZGVsL2NvbGxlY3Rpb25cbiAgICAgIHRoaXMuX2xpbmsoc2VsZiwgcmVsYXRpb24pO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSByZWZlcmVudGlhbHNcbiAgICBpZiAoIU9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihyZWxhdGlvbi5tb2RlbCkpIHtcbiAgICAgIGxldCByZWYgPSBmaWVsZC5tZXRhPy5yZXNvbHZlUmVmZXJlbnRpYWwocmVsYXRpb24ubW9kZWwsIGZpZWxkKTtcbiAgICAgIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZWxmLCByZWYpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzdGF0ZSBhbmQgZW1pdCBldmVudFxuICAgIHJlbGF0aW9uLnN0YXRlID1cbiAgICAgIHNlbGYuX3Jlc2V0IHx8ICFjaGFuZ2VkXG4gICAgICAgID8gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZFxuICAgICAgICA6IE9EYXRhTW9kZWxTdGF0ZS5DaGFuZ2VkO1xuICAgIGlmICghc2VsZi5fc2lsZW50ICYmIGNoYW5nZWQpIHtcbiAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdjaGFuZ2UnLCB7XG4gICAgICAgICAgZmllbGQ6IGZpZWxkLFxuICAgICAgICAgIG1vZGVsOiBzZWxmLFxuICAgICAgICAgIHZhbHVlOiByZWxhdGlvbi5tb2RlbCxcbiAgICAgICAgICBwcmV2aW91czogY3VycmVudCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cblxuICBwcml2YXRlIF9zZXRWYWx1ZTxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4sXG4gICAgdmFsdWU6XG4gICAgICB8IEZcbiAgICAgIHwgRltdXG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgICAgIHwgT0RhdGFNb2RlbDxGPlxuICAgICAgfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj5cbiAgICAgIHwgbnVsbCxcbiAgICBrZXk/OiBib29sZWFuXG4gICk6IGJvb2xlYW4ge1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgY29uc3QgYXR0cnMgPSB0aGlzLmF0dHJpYnV0ZXMoc2VsZiwge1xuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeTogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQ6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgbmFtZSA9IGZpZWxkLm5hbWU7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gYXR0cnNbbmFtZV07XG4gICAgY2hhbmdlZCA9ICFUeXBlcy5pc0VxdWFsKGN1cnJlbnRWYWx1ZSwgdmFsdWUpO1xuICAgIGlmIChzZWxmLl9yZXNldCkge1xuICAgICAgc2VsZi5fY2hhbmdlcy5kZWxldGUobmFtZSk7XG4gICAgICBzZWxmLl9hdHRyaWJ1dGVzLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChUeXBlcy5pc0VxdWFsKHZhbHVlLCBzZWxmLl9hdHRyaWJ1dGVzLmdldChuYW1lKSkpIHtcbiAgICAgIHNlbGYuX2NoYW5nZXMuZGVsZXRlKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlZCkge1xuICAgICAgc2VsZi5fY2hhbmdlcy5zZXQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoIXNlbGYuX3NpbGVudCAmJiBjaGFuZ2VkKSB7XG4gICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnY2hhbmdlJywge1xuICAgICAgICAgIGZpZWxkOiBmaWVsZCxcbiAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBwcmV2aW91czogY3VycmVudFZhbHVlLFxuICAgICAgICAgIG9wdGlvbnM6IHsga2V5IH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIHNldDxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4gfCBzdHJpbmcsXG4gICAgdmFsdWU6XG4gICAgICB8IEZcbiAgICAgIHwgRltdXG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgICAgIHwgT0RhdGFNb2RlbDxGPlxuICAgICAgfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj5cbiAgICAgIHwgbnVsbCxcbiAgICB7IHR5cGUgfTogeyB0eXBlPzogc3RyaW5nIH0gPSB7fVxuICApOiBib29sZWFuIHtcbiAgICBsZXQgbW9kZWxGaWVsZCA9XG4gICAgICBmaWVsZCBpbnN0YW5jZW9mIE9EYXRhTW9kZWxGaWVsZCA/IGZpZWxkIDogdGhpcy5maW5kRmllbGQ8Rj4oZmllbGQpO1xuICAgIGlmIChcbiAgICAgIG1vZGVsRmllbGQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5pc09wZW5UeXBlKCkgJiZcbiAgICAgIHR5cGVvZiBmaWVsZCA9PT0gJ3N0cmluZydcbiAgICApIHtcbiAgICAgIHR5cGUgPSB0eXBlID8/ICh0aGlzLnRzVG9FZG1bdHlwZW9mIHZhbHVlXSBhcyBFZG1UeXBlKSA/PyAnJztcbiAgICAgIG1vZGVsRmllbGQgPSB0aGlzLm1vZGVsRmllbGRGYWN0b3J5PEY+KHNlbGYsIGZpZWxkLCB0eXBlKTtcbiAgICB9XG4gICAgaWYgKG1vZGVsRmllbGQgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZmllbGQgd2l0aCBuYW1lICR7ZmllbGQgYXMgc3RyaW5nfWApO1xuICAgIHJldHVybiBtb2RlbEZpZWxkLmlzU3RydWN0dXJlZFR5cGUoKVxuICAgICAgPyB0aGlzLl9zZXRTdHJ1Y3R1cmVkKHNlbGYsIG1vZGVsRmllbGQsIHZhbHVlKVxuICAgICAgOiB0aGlzLl9zZXRWYWx1ZShzZWxmLCBtb2RlbEZpZWxkLCB2YWx1ZSwgbW9kZWxGaWVsZC5pc0tleSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VubGluazxGPihzZWxmOiBPRGF0YU1vZGVsPFQ+LCByZWxhdGlvbjogT0RhdGFNb2RlbFJlbGF0aW9uPEY+KSB7XG4gICAgaWYgKHJlbGF0aW9uLnN1YnNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZWxhdGlvbi5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHJlbGF0aW9uLnN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHJlbGF0aW9uLm1vZGVsICE9IG51bGwpIHtcbiAgICAgIHJlbGF0aW9uLm1vZGVsLl9wYXJlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xpbms8Rj4oc2VsZjogT0RhdGFNb2RlbDxUPiwgcmVsYXRpb246IE9EYXRhTW9kZWxSZWxhdGlvbjxGPikge1xuICAgIGlmIChyZWxhdGlvbi5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3Vic2NyaXB0aW9uIGFscmVhZHkgZXhpc3RzJyk7XG4gICAgfVxuICAgIGlmIChyZWxhdGlvbi5tb2RlbCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1YnNjcmlwdGlvbiBtb2RlbCBpcyBudWxsJyk7XG4gICAgfVxuXG4gICAgaWYgKHNlbGYuX3JlcGFyZW50KSByZWxhdGlvbi5tb2RlbC5fcGFyZW50ID0gW3NlbGYsIHJlbGF0aW9uLmZpZWxkXTtcblxuICAgIHJlbGF0aW9uLnN1YnNjcmlwdGlvbiA9IHJlbGF0aW9uLm1vZGVsLmV2ZW50cyQuc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50OiBPRGF0YU1vZGVsRXZlbnQ8YW55PikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgQlVCQkxJTkcuaW5kZXhPZihldmVudC5uYW1lKSAhPT0gLTEgJiZcbiAgICAgICAgICBldmVudC5idWJibGluZyAmJlxuICAgICAgICAgICFldmVudC52aXNpdGVkKHNlbGYpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChldmVudC5tb2RlbCA9PT0gcmVsYXRpb24ubW9kZWwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZXZlbnQubmFtZSA9PT0gJ2NoYW5nZScgJiZcbiAgICAgICAgICAgICAgcmVsYXRpb24uZmllbGQubmF2aWdhdGlvbiAmJlxuICAgICAgICAgICAgICBldmVudC5vcHRpb25zPy5rZXlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBsZXQgcmVmID0gKHJlbGF0aW9uLm1vZGVsIGFzIE9EYXRhTW9kZWw8YW55PikucmVmZXJlbnRpYWwoXG4gICAgICAgICAgICAgICAgcmVsYXRpb24uZmllbGRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCAmJiByZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2VsZiwgcmVmKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KGV2ZW50LnB1c2goc2VsZiwgcmVsYXRpb24uZmllbGQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|