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