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
@@ -0,0 +1,535 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { forkJoin, NEVER, of, throwError } from 'rxjs';
3
+ import { map, tap } from 'rxjs/operators';
4
+ import { ODataEntityResource, ODataNavigationPropertyResource, } from '../resources';
5
+ import { Objects, Strings, Types } from '../utils';
6
+ import { ODataCollection } from './collection';
7
+ import { INCLUDE_DEEP, INCLUDE_SHALLOW, ODataModelEvent, ODataModelOptions, ODataModelEventType, } from './options';
8
+ // @dynamic
9
+ export class ODataModel {
10
+ static buildMeta({ options, schema, }) {
11
+ if (options === undefined) {
12
+ let fields = schema
13
+ .fields({ include_navigation: true, include_parents: true })
14
+ .reduce((acc, field) => {
15
+ let name = field.name;
16
+ // Prevent collision with reserved keywords
17
+ while (RESERVED_FIELD_NAMES.includes(name)) {
18
+ name = name + '_';
19
+ }
20
+ return Object.assign(acc, {
21
+ [name]: {
22
+ field: field.name,
23
+ default: field.default,
24
+ required: !field.nullable,
25
+ },
26
+ });
27
+ }, {});
28
+ options = {
29
+ fields: new Map(Object.entries(fields)),
30
+ };
31
+ }
32
+ this.meta = new ODataModelOptions({ options, schema });
33
+ }
34
+ constructor(data = {}, { parent, resource, annots, reset = false, } = {}) {
35
+ // Parent
36
+ this._parent = null;
37
+ this._resource = null;
38
+ this._resources = [];
39
+ this._attributes = new Map();
40
+ this._reset = false;
41
+ this._reparent = false;
42
+ this._silent = false;
43
+ // Events
44
+ this.events$ = new EventEmitter();
45
+ const Klass = this.constructor;
46
+ if (Klass.meta === undefined)
47
+ throw new Error(`ODataModel: Can't create model without metadata`);
48
+ this._meta = Klass.meta;
49
+ this._meta.bind(this, { parent, resource, annots });
50
+ // Client Id
51
+ this[this._meta.cid] =
52
+ data[this._meta.cid] ||
53
+ Strings.uniqueId({ prefix: `${Klass.meta.schema.name.toLowerCase()}-` });
54
+ let attrs = this.annots().attributes(data, 'full');
55
+ let defaults = this.defaults();
56
+ this.assign(Objects.merge(defaults, attrs), {
57
+ reset,
58
+ });
59
+ }
60
+ //#region Resources
61
+ resource() {
62
+ return ODataModelOptions.resource(this);
63
+ }
64
+ pushResource(resource) {
65
+ // Push current parent and resource
66
+ this._resources.push({ parent: this._parent, resource: this._resource });
67
+ // Replace parent and resource
68
+ this._parent = null;
69
+ this._resource = resource;
70
+ }
71
+ popResource() {
72
+ // Pop parent and resource
73
+ const pop = this._resources.pop();
74
+ if (pop !== undefined) {
75
+ const current = { parent: this._parent, resource: this._resource };
76
+ this._parent = pop.parent;
77
+ this._resource = pop.resource;
78
+ return current;
79
+ }
80
+ return undefined;
81
+ }
82
+ navigationProperty(name) {
83
+ const field = this._meta.field(name);
84
+ if (field === undefined || !field.navigation)
85
+ throw Error(`navigationProperty: Can't find navigation property ${name}`);
86
+ const resource = this.resource();
87
+ if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
88
+ throw Error("navigationProperty: Can't get navigation without ODataEntityResource with key");
89
+ return field.resourceFactory(resource);
90
+ }
91
+ property(name) {
92
+ const field = this._meta.field(name);
93
+ if (field === undefined || field.navigation)
94
+ throw Error(`property: Can't find property ${name}`);
95
+ const resource = this.resource();
96
+ if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
97
+ throw Error("property: Can't get property without ODataEntityResource with key");
98
+ return field.resourceFactory(resource);
99
+ }
100
+ attach(resource) {
101
+ return this._meta.attach(this, resource);
102
+ }
103
+ //#endregion
104
+ schema() {
105
+ return this._meta.schema;
106
+ }
107
+ annots() {
108
+ return this._annotations;
109
+ }
110
+ key({ field_mapping = false, resolve = true, } = {}) {
111
+ return this._meta.resolveKey(this, { field_mapping, resolve });
112
+ }
113
+ isOpenModel() {
114
+ return this._meta.isOpenType();
115
+ }
116
+ isParentOf(child) {
117
+ return (child !== this &&
118
+ ODataModelOptions.chain(child).some((p) => p[0] === this));
119
+ }
120
+ referential(attr, { field_mapping = false, resolve = true, } = {}) {
121
+ return this._meta.resolveReferential(this, attr, {
122
+ field_mapping,
123
+ resolve,
124
+ });
125
+ }
126
+ referenced(attr, { field_mapping = false, resolve = true, } = {}) {
127
+ return this._meta.resolveReferenced(this, attr, {
128
+ field_mapping,
129
+ resolve,
130
+ });
131
+ }
132
+ validate({ method, navigation = false, } = {}) {
133
+ return this._meta.validate(this, { method, navigation });
134
+ }
135
+ isValid({ method, navigation = false, } = {}) {
136
+ this._errors = this.validate({ method, navigation });
137
+ if (this._errors !== undefined)
138
+ this.events$.emit(new ODataModelEvent(ODataModelEventType.Invalid, {
139
+ model: this,
140
+ value: this._errors,
141
+ options: { method },
142
+ }));
143
+ return this._errors === undefined;
144
+ }
145
+ defaults() {
146
+ return this._meta.defaults() || {};
147
+ }
148
+ toEntity({ 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 = [], } = {}) {
149
+ return this._meta.toEntity(this, {
150
+ client_id,
151
+ include_navigation,
152
+ include_concurrency,
153
+ include_computed,
154
+ include_key,
155
+ include_non_field,
156
+ changes_only,
157
+ field_mapping,
158
+ chain,
159
+ });
160
+ }
161
+ toJSON() {
162
+ return this.toEntity();
163
+ }
164
+ set(path, value, { type } = {}) {
165
+ const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
166
+ if (pathArray.length === 0)
167
+ return undefined;
168
+ if (pathArray.length > 1) {
169
+ const model = this[pathArray[0]];
170
+ return model.set(pathArray.slice(1), value, {});
171
+ }
172
+ if (pathArray.length === 1) {
173
+ return this._meta.set(this, pathArray[0], value, { type });
174
+ }
175
+ }
176
+ get(path) {
177
+ const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
178
+ if (pathArray.length === 0)
179
+ return undefined;
180
+ const value = this._meta.get(this, pathArray[0]);
181
+ if (pathArray.length > 1 &&
182
+ (value instanceof ODataModel || value instanceof ODataCollection)) {
183
+ return value.get(pathArray.slice(1));
184
+ }
185
+ return value;
186
+ }
187
+ has(path) {
188
+ const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
189
+ if (pathArray.length === 0)
190
+ return false;
191
+ const value = this._meta.get(this, pathArray[0]);
192
+ if (pathArray.length > 1 &&
193
+ (value instanceof ODataModel || value instanceof ODataCollection)) {
194
+ return value.has(pathArray.slice(1));
195
+ }
196
+ return value !== undefined;
197
+ }
198
+ reset({ path, silent = false, } = {}) {
199
+ const pathArray = (path === undefined
200
+ ? []
201
+ : Types.isArray(path)
202
+ ? path
203
+ : path.match(/([^[.\]])+/g));
204
+ const name = pathArray[0];
205
+ const value = name !== undefined ? this[name] : undefined;
206
+ if (ODataModelOptions.isModel(value) ||
207
+ ODataModelOptions.isCollection(value)) {
208
+ value.reset({ path: pathArray.slice(1), silent });
209
+ }
210
+ else {
211
+ this._meta.reset(this, { name: pathArray[0], silent });
212
+ }
213
+ }
214
+ clear({ silent = false } = {}) {
215
+ this._attributes.clear();
216
+ //this._changes.clear();
217
+ //this._relations.clear();
218
+ if (!silent) {
219
+ this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
220
+ model: this,
221
+ }));
222
+ }
223
+ }
224
+ assign(entity, { reset = false, reparent = false, silent = false, } = {}) {
225
+ return this._meta.assign(this, entity, { reset, silent, reparent });
226
+ }
227
+ clone() {
228
+ let Ctor = this.constructor;
229
+ return new Ctor(this.toEntity(INCLUDE_SHALLOW), {
230
+ resource: this.resource(),
231
+ annots: this.annots(),
232
+ });
233
+ }
234
+ _request(obs$) {
235
+ this.events$.emit(new ODataModelEvent(ODataModelEventType.Request, {
236
+ model: this,
237
+ options: { observable: obs$ },
238
+ }));
239
+ return obs$.pipe(map(({ entity, annots }) => {
240
+ this._annotations = annots;
241
+ this.assign(annots.attributes(entity || {}, 'full'), {
242
+ reset: true,
243
+ });
244
+ this.events$.emit(new ODataModelEvent(ODataModelEventType.Sync, {
245
+ model: this,
246
+ options: { entity, annots },
247
+ }));
248
+ return this;
249
+ }));
250
+ }
251
+ fetch({ ...options } = {}) {
252
+ let resource = this.resource();
253
+ if (resource === undefined)
254
+ return throwError(() => new Error('fetch: Resource is undefined'));
255
+ let obs$;
256
+ if (resource instanceof ODataEntityResource) {
257
+ obs$ = resource.fetch(options);
258
+ }
259
+ else if (resource instanceof ODataNavigationPropertyResource) {
260
+ obs$ = resource.fetch({ responseType: 'entity', ...options });
261
+ }
262
+ else {
263
+ obs$ = resource.fetch({
264
+ responseType: 'entity',
265
+ ...options,
266
+ });
267
+ }
268
+ return this._request(obs$);
269
+ }
270
+ save({ method, navigation = false, validate = true, ...options } = {}) {
271
+ let resource = this.resource();
272
+ if (resource === undefined)
273
+ return throwError(() => new Error('save: Resource is undefined'));
274
+ if (!(resource instanceof ODataEntityResource ||
275
+ resource instanceof ODataNavigationPropertyResource))
276
+ return throwError(() => new Error('save: Resource type ODataEntityResource/ODataNavigationPropertyResource needed'));
277
+ // Resolve method and resource key
278
+ if (method === undefined && this.schema().isCompoundKey())
279
+ return throwError(() => new Error('save: Composite key require a specific method, use create/update/modify'));
280
+ method = method || (!resource.hasKey() ? 'create' : 'update');
281
+ if (resource instanceof ODataEntityResource &&
282
+ (method === 'update' || method === 'modify') &&
283
+ !resource.hasKey())
284
+ return throwError(() => new Error('save: Update/Patch require entity key'));
285
+ if (resource instanceof ODataNavigationPropertyResource ||
286
+ method === 'create')
287
+ resource.clearKey();
288
+ if (validate && !this.isValid({ method, navigation })) {
289
+ return throwError(() => new Error('save: Validation errors'));
290
+ }
291
+ const _entity = this.toEntity({
292
+ changes_only: method === 'modify',
293
+ field_mapping: true,
294
+ include_concurrency: true,
295
+ include_navigation: navigation,
296
+ });
297
+ return this._request((method === 'create'
298
+ ? resource.create(_entity, options)
299
+ : method === 'modify'
300
+ ? resource.modify(_entity, { etag: this.annots().etag, ...options })
301
+ : resource.update(_entity, { etag: this.annots().etag, ...options })).pipe(map(({ entity, annots }) => ({ entity: entity || _entity, annots }))));
302
+ }
303
+ destroy({ ...options } = {}) {
304
+ let resource = this.resource();
305
+ if (resource === undefined)
306
+ return throwError(() => new Error('destroy: Resource is undefined'));
307
+ if (!(resource instanceof ODataEntityResource ||
308
+ resource instanceof ODataNavigationPropertyResource))
309
+ return throwError(() => new Error('destroy: Resource type ODataEntityResource/ODataNavigationPropertyResource needed'));
310
+ if (!resource.hasKey())
311
+ return throwError(() => new Error("destroy: Can't destroy model without key"));
312
+ const _entity = this.toEntity({ field_mapping: true });
313
+ const obs$ = resource
314
+ .destroy({ etag: this.annots().etag, ...options })
315
+ .pipe(map(({ entity, annots }) => ({ entity: entity || _entity, annots })));
316
+ return this._request(obs$).pipe(tap(() => this.events$.emit(new ODataModelEvent(ODataModelEventType.Destroy, { model: this }))));
317
+ }
318
+ /**
319
+ * Create an execution context for change the internal query of a resource
320
+ * @param ctx Function to execute
321
+ */
322
+ query(ctx) {
323
+ return this._meta.query(this, this.resource(), ctx);
324
+ }
325
+ /**
326
+ * Perform a check on the internal state of the model and return true if the model is changed.
327
+ * @param include_navigation Check in navigation properties
328
+ * @returns true if the model has changed, false otherwise
329
+ */
330
+ hasChanged({ include_navigation = false, } = {}) {
331
+ return this._meta.hasChanged(this, { include_navigation });
332
+ }
333
+ encode(name, options) {
334
+ let value = this[name];
335
+ if (value === undefined)
336
+ return undefined;
337
+ let field = this._meta.field(name);
338
+ return field !== undefined ? field.encode(value, options) : value;
339
+ }
340
+ isNew() {
341
+ return !this._meta.hasKey(this);
342
+ }
343
+ withResource(resource, ctx) {
344
+ return this._meta.withResource(this, resource, ctx);
345
+ }
346
+ /**
347
+ * Create an execution context for a given function, where the model is bound to its entity endpoint
348
+ * @param ctx Context function
349
+ * @returns The result of the context
350
+ */
351
+ asEntity(ctx) {
352
+ return this._meta.asEntity(this, ctx);
353
+ }
354
+ //#region Callables
355
+ callFunction(name, params, responseType, { ...options } = {}) {
356
+ const resource = this.resource();
357
+ if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
358
+ return throwError(() => new Error("callFunction: Can't call function without ODataEntityResource with key"));
359
+ const func = resource.function(name).query((q) => q.apply(options));
360
+ switch (responseType) {
361
+ case 'property':
362
+ return func.callProperty(params, options);
363
+ case 'model':
364
+ return func.callModel(params, options);
365
+ case 'collection':
366
+ return func.callCollection(params, options);
367
+ case 'blob':
368
+ return func.callBlob(params, options);
369
+ case 'arraybuffer':
370
+ return func.callArraybuffer(params, options);
371
+ default:
372
+ return func.call(params, { responseType, ...options });
373
+ }
374
+ }
375
+ callAction(name, params, responseType, { ...options } = {}) {
376
+ const resource = this.resource();
377
+ if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
378
+ return throwError(() => new Error("callAction: Can't call action without ODataEntityResource with key"));
379
+ const action = resource.action(name).query((q) => q.apply(options));
380
+ switch (responseType) {
381
+ case 'property':
382
+ return action.callProperty(params, options);
383
+ case 'model':
384
+ return action.callModel(params, options);
385
+ case 'collection':
386
+ return action.callCollection(params, options);
387
+ case 'blob':
388
+ return action.callBlob(params, options);
389
+ case 'arraybuffer':
390
+ return action.callArraybuffer(params, options);
391
+ default:
392
+ return action.call(params, { responseType, ...options });
393
+ }
394
+ }
395
+ //#endregion
396
+ // Cast
397
+ cast(type) {
398
+ //: ODataModel<S> {
399
+ const resource = this.resource();
400
+ if (!(resource instanceof ODataEntityResource))
401
+ throw new Error(`cast: Can't cast to derived model without ODataEntityResource`);
402
+ return resource
403
+ .cast(type)
404
+ .asModel(this.toEntity(INCLUDE_DEEP), {
405
+ annots: this.annots(),
406
+ });
407
+ }
408
+ fetchNavigationProperty(name, responseType, { ...options } = {}) {
409
+ const nav = this.navigationProperty(name);
410
+ nav.query((q) => q.apply(options));
411
+ switch (responseType) {
412
+ case 'model':
413
+ return nav.fetchModel(options);
414
+ case 'collection':
415
+ return nav.fetchCollection(options);
416
+ }
417
+ }
418
+ // Get Value
419
+ getValue(name, options) {
420
+ const field = this._meta.field(name);
421
+ if (field === undefined || field.navigation)
422
+ throw Error(`getValue: Can't find property ${name}`);
423
+ let value = this[name];
424
+ if (value === undefined) {
425
+ const prop = field.resourceFactory(this.resource());
426
+ return field.collection
427
+ ? prop
428
+ .fetchCollection(options)
429
+ .pipe(tap((c) => this.assign({ [name]: c }, { silent: true })))
430
+ : field.isStructuredType()
431
+ ? prop
432
+ .fetchModel(options)
433
+ .pipe(tap((c) => this.assign({ [name]: c }, { silent: true })))
434
+ : prop
435
+ .fetchProperty(options)
436
+ .pipe(tap((c) => this.assign({ [name]: c }, { silent: true })));
437
+ }
438
+ return of(value);
439
+ }
440
+ //#region References
441
+ setReference(name, model, options) {
442
+ const reference = this.navigationProperty(name).reference();
443
+ const etag = this.annots().etag;
444
+ let obs$ = NEVER;
445
+ if (model instanceof ODataModel) {
446
+ obs$ = reference.set(model._meta.entityResource(model), { etag, ...options });
447
+ }
448
+ else if (model instanceof ODataCollection) {
449
+ obs$ = forkJoin(model
450
+ .models()
451
+ .map((m) => reference.add(m._meta.entityResource(m), options)));
452
+ }
453
+ else if (model === null) {
454
+ obs$ = reference.unset({ etag, ...options });
455
+ }
456
+ this.events$.emit(new ODataModelEvent(ODataModelEventType.Request, {
457
+ model: this,
458
+ options: { observable: obs$ },
459
+ }));
460
+ return obs$.pipe(map((model) => {
461
+ this.assign({ [name]: model });
462
+ this.events$.emit(new ODataModelEvent(ODataModelEventType.Sync, { model: this }));
463
+ return this;
464
+ }));
465
+ }
466
+ getReference(name) {
467
+ const field = this._meta.field(name);
468
+ if (field === undefined || !field.navigation)
469
+ throw Error(`getReference: Can't find navigation property ${name}`);
470
+ let model = this[name];
471
+ if (model === null)
472
+ return null;
473
+ if (model === undefined) {
474
+ if (field.collection) {
475
+ model = field.collectionFactory({ parent: this });
476
+ }
477
+ else {
478
+ const value = this.referenced(field);
479
+ model =
480
+ value === null ? null : field.modelFactory({ parent: this, value });
481
+ }
482
+ this[name] = model;
483
+ }
484
+ return model;
485
+ }
486
+ //#endregion
487
+ //#region Model Identity
488
+ get [Symbol.toStringTag]() {
489
+ return 'Model';
490
+ }
491
+ equals(other) {
492
+ if (this === other)
493
+ return true;
494
+ if (typeof this !== typeof other)
495
+ return false;
496
+ const meta = this._meta;
497
+ const thisCid = this[meta.cid];
498
+ const otherCid = other[meta.cid];
499
+ if (thisCid !== undefined &&
500
+ otherCid !== undefined &&
501
+ Types.isEqual(thisCid, otherCid))
502
+ return true;
503
+ if (meta.isEntityType()) {
504
+ const thisKey = this.key();
505
+ const otherKey = other.key();
506
+ if (thisKey !== undefined &&
507
+ otherKey !== undefined &&
508
+ Types.isEqual(thisKey, otherKey))
509
+ return true;
510
+ }
511
+ else if (meta.isComplexType()) {
512
+ const thisJson = this.toJSON();
513
+ const otherJson = other.toJSON();
514
+ if (Types.isEqual(thisJson, otherJson))
515
+ return true;
516
+ }
517
+ return false;
518
+ }
519
+ //#endregion
520
+ //#region Collection Tools
521
+ collection() {
522
+ return this._parent !== null &&
523
+ ODataModelOptions.isCollection(this._parent[0])
524
+ ? this._parent[0]
525
+ : undefined;
526
+ }
527
+ next() {
528
+ return this.collection()?.next(this);
529
+ }
530
+ prev() {
531
+ return this.collection()?.prev(this);
532
+ }
533
+ }
534
+ export const RESERVED_FIELD_NAMES = Object.getOwnPropertyNames(ODataModel.prototype);
535
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvbW9kZWxzL21vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsR0FBRyxFQUFhLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JELE9BQU8sRUFLTCxtQkFBbUIsRUFFbkIsK0JBQStCLEdBT2hDLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFDTCxZQUFZLEVBQ1osZUFBZSxFQUVmLGVBQWUsRUFFZixpQkFBaUIsRUFFakIsbUJBQW1CLEdBRXBCLE1BQU0sV0FBVyxDQUFDO0FBR25CLFdBQVc7QUFDWCxNQUFNLE9BQU8sVUFBVTtJQUlyQixNQUFNLENBQUMsU0FBUyxDQUFJLEVBQ2xCLE9BQU8sRUFDUCxNQUFNLEdBSVA7UUFDQyxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDekIsSUFBSSxNQUFNLEdBQUcsTUFBTTtpQkFDaEIsTUFBTSxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQztpQkFDM0QsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNyQixJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUN0QiwyQ0FBMkM7Z0JBQzNDLE9BQU8sb0JBQW9CLENBQUMsUUFBUSxDQUFD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bWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgTkVWRVIsIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgREVGQVVMVF9WRVJTSU9OIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhSGVscGVyIH0gZnJvbSAnLi4vaGVscGVyJztcbmltcG9ydCB7XG4gIEVudGl0eUtleSxcbiAgT0RhdGFBY3Rpb25PcHRpb25zLFxuICBPRGF0YUVudGl0eSxcbiAgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFGdW5jdGlvbk9wdGlvbnMsXG4gIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhT3B0aW9ucyxcbiAgT0RhdGFQcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YVF1ZXJ5QXJndW1lbnRzT3B0aW9ucyxcbiAgT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyLFxuICBPRGF0YVJlc291cmNlLFxuICBPRGF0YVNpbmdsZXRvblJlc291cmNlLFxufSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgT0RhdGFTdHJ1Y3R1cmVkVHlwZSB9IGZyb20gJy4uL3NjaGVtYSc7XG5pbXBvcnQgeyBPYmplY3RzLCBTdHJpbmdzLCBUeXBlcyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IE9EYXRhQ29sbGVjdGlvbiB9IGZyb20gJy4vY29sbGVjdGlvbic7XG5pbXBvcnQge1xuICBJTkNMVURFX0RFRVAsXG4gIElOQ0xVREVfU0hBTExPVyxcbiAgTW9kZWxPcHRpb25zLFxuICBPRGF0YU1vZGVsRXZlbnQsXG4gIE9EYXRhTW9kZWxGaWVsZCxcbiAgT0RhdGFNb2RlbE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxBdHRyaWJ1dGUsXG4gIE9EYXRhTW9kZWxFdmVudFR5cGUsXG4gIE1vZGVsRmllbGRPcHRpb25zLFxufSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcblxuLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBPRGF0YU1vZGVsPFQ+IHtcbiAgLy8gUHJvcGVydGllc1xuICBzdGF0aWMgb3B0aW9uczogTW9kZWxPcHRpb25zO1xuICBzdGF0aWMgbWV0YTogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgc3RhdGljIGJ1aWxkTWV0YTxUPih7XG4gICAgb3B0aW9ucyxcbiAgICBzY2hlbWEsXG4gIH06IHtcbiAgICBvcHRpb25zPzogTW9kZWxPcHRpb25zO1xuICAgIHNjaGVtYTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPjtcbiAgfSkge1xuICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGxldCBmaWVsZHMgPSBzY2hlbWFcbiAgICAgICAgLmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSwgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgICAgICBsZXQgbmFtZSA9IGZpZWxkLm5hbWU7XG4gICAgICAgICAgLy8gUHJldmVudCBjb2xsaXNpb24gd2l0aCByZXNlcnZlZCBrZXl3b3Jkc1xuICAgICAgICAgIHdoaWxlIChSRVNFUlZFRF9GSUVMRF9OQU1FUy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAnXyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywge1xuICAgICAgICAgICAgW25hbWVdOiB7XG4gICAgICAgICAgICAgIGZpZWxkOiBmaWVsZC5uYW1lLFxuICAgICAgICAgICAgICBkZWZhdWx0OiBmaWVsZC5kZWZhdWx0LFxuICAgICAgICAgICAgICByZXF1aXJlZDogIWZpZWxkLm51bGxhYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwge30pO1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgZmllbGRzOiBuZXcgTWFwPHN0cmluZywgTW9kZWxGaWVsZE9wdGlvbnM+KE9iamVjdC5lbnRyaWVzKGZpZWxkcykpLFxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5tZXRhID0gbmV3IE9EYXRhTW9kZWxPcHRpb25zPFQ+KHsgb3B0aW9ucywgc2NoZW1hIH0pO1xuICB9XG4gIC8vIFBhcmVudFxuICBfcGFyZW50OlxuICAgIHwgW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGwsXG4gICAgICBdXG4gICAgfCBudWxsID0gbnVsbDtcbiAgX3Jlc291cmNlOiBPRGF0YVJlc291cmNlPFQ+IHwgbnVsbCA9IG51bGw7XG4gIF9yZXNvdXJjZXM6IHtcbiAgICBwYXJlbnQ6XG4gICAgICB8IFtcbiAgICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCxcbiAgICAgICAgXVxuICAgICAgfCBudWxsO1xuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPFQ+IHwgbnVsbDtcbiAgfVtdID0gW107XG4gIF9hdHRyaWJ1dGVzOiBNYXA8c3RyaW5nLCBPRGF0YU1vZGVsQXR0cmlidXRlPGFueT4+ID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+XG4gID4oKTtcbiAgX2Fubm90YXRpb25zITogT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxUPjtcbiAgX3Jlc2V0OiBib29sZWFuID0gZmFsc2U7XG4gIF9yZXBhcmVudDogYm9vbGVhbiA9IGZhbHNlO1xuICBfc2lsZW50OiBib29sZWFuID0gZmFsc2U7XG4gIF9tZXRhOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICAvLyBFdmVudHNcbiAgZXZlbnRzJCA9IG5ldyBFdmVudEVtaXR0ZXI8T0RhdGFNb2RlbEV2ZW50PFQ+PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhdGE6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgIHtcbiAgICAgIHBhcmVudCxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYW5ub3RzLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBwYXJlbnQ/OiBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCxcbiAgICAgIF07XG4gICAgICByZXNvdXJjZT86IE9EYXRhUmVzb3VyY2U8VD47XG4gICAgICBhbm5vdHM/OiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+O1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgS2xhc3MgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPRGF0YU1vZGVsO1xuICAgIGlmIChLbGFzcy5tZXRhID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE9EYXRhTW9kZWw6IENhbid0IGNyZWF0ZSBtb2RlbCB3aXRob3V0IG1ldGFkYXRhYCk7XG4gICAgdGhpcy5fbWV0YSA9IEtsYXNzLm1ldGE7XG4gICAgdGhpcy5fbWV0YS5iaW5kKHRoaXMsIHsgcGFyZW50LCByZXNvdXJjZSwgYW5ub3RzIH0pO1xuXG4gICAgLy8gQ2xpZW50IElkXG4gICAgKDxhbnk+dGhpcylbdGhpcy5fbWV0YS5jaWRdID1cbiAgICAgICg8YW55PmRhdGEpW3RoaXMuX21ldGEuY2lkXSB8fFxuICAgICAgU3RyaW5ncy51bmlxdWVJZCh7IHByZWZpeDogYCR7S2xhc3MubWV0YS5zY2hlbWEubmFtZS50b0xvd2VyQ2FzZSgpfS1gIH0pO1xuXG4gICAgbGV0IGF0dHJzID0gdGhpcy5hbm5vdHMoKS5hdHRyaWJ1dGVzKGRhdGEsICdmdWxsJyk7XG4gICAgbGV0IGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0cygpO1xuXG4gICAgdGhpcy5hc3NpZ24oT2JqZWN0cy5tZXJnZShkZWZhdWx0cywgYXR0cnMgYXMgeyBbbmFtZTogc3RyaW5nXTogYW55IH0pLCB7XG4gICAgICByZXNldCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBSZXNvdXJjZXNcbiAgcmVzb3VyY2UoKTpcbiAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPiB7XG4gICAgcmV0dXJuIE9EYXRhTW9kZWxPcHRpb25zLnJlc291cmNlPFQ+KHRoaXMpIGFzXG4gICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPjtcbiAgfVxuXG4gIHB1c2hSZXNvdXJjZShcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+LFxuICApIHtcbiAgICAvLyBQdXNoIGN1cnJlbnQgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIHRoaXMuX3Jlc291cmNlcy5wdXNoKHsgcGFyZW50OiB0aGlzLl9wYXJlbnQsIHJlc291cmNlOiB0aGlzLl9yZXNvdXJjZSB9KTtcbiAgICAvLyBSZXBsYWNlIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICB0aGlzLl9wYXJlbnQgPSBudWxsO1xuICAgIHRoaXMuX3Jlc291cmNlID0gcmVzb3VyY2U7XG4gIH1cblxuICBwb3BSZXNvdXJjZSgpIHtcbiAgICAvLyBQb3AgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIGNvbnN0IHBvcCA9IHRoaXMuX3Jlc291cmNlcy5wb3AoKTtcbiAgICBpZiAocG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB7IHBhcmVudDogdGhpcy5fcGFyZW50LCByZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UgfTtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBvcC5wYXJlbnQ7XG4gICAgICB0aGlzLl9yZXNvdXJjZSA9IHBvcC5yZXNvdXJjZTtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgbmF2aWdhdGlvblByb3BlcnR5PE4+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmcsXG4gICk6IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Tj4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maWVsZChuYW1lKTtcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCAhZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgbmF2aWdhdGlvblByb3BlcnR5OiBDYW4ndCBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHkgJHtuYW1lIGFzIHN0cmluZ31gLFxuICAgICAgKTtcblxuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkgfHwgIXJlc291cmNlLmhhc0tleSgpKVxuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIFwibmF2aWdhdGlvblByb3BlcnR5OiBDYW4ndCBnZXQgbmF2aWdhdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5UmVzb3VyY2Ugd2l0aCBrZXlcIixcbiAgICAgICk7XG5cbiAgICByZXR1cm4gZmllbGQucmVzb3VyY2VGYWN0b3J5PFQsIE4+KFxuICAgICAgcmVzb3VyY2UsXG4gICAgKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPE4+O1xuICB9XG5cbiAgcHJvcGVydHk8Tj4obmFtZTogc3RyaW5nKTogT0RhdGFQcm9wZXJ0eVJlc291cmNlPE4+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmllbGQobmFtZSk7XG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKGBwcm9wZXJ0eTogQ2FuJ3QgZmluZCBwcm9wZXJ0eSAke25hbWV9YCk7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBcInByb3BlcnR5OiBDYW4ndCBnZXQgcHJvcGVydHkgd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlIHdpdGgga2V5XCIsXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGZpZWxkLnJlc291cmNlRmFjdG9yeTxULCBOPihyZXNvdXJjZSkgYXMgT0RhdGFQcm9wZXJ0eVJlc291cmNlPE4+O1xuICB9XG5cbiAgYXR0YWNoKFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD4sXG4gICkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmF0dGFjaCh0aGlzLCByZXNvdXJjZSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgc2NoZW1hKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnNjaGVtYTtcbiAgfVxuXG4gIGFubm90cygpIHtcbiAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnM7XG4gIH1cblxuICBrZXkoe1xuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICByZXNvbHZlID0gdHJ1ZSxcbiAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9KTpcbiAgICB8IEVudGl0eUtleTxUPlxuICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEucmVzb2x2ZUtleSh0aGlzLCB7IGZpZWxkX21hcHBpbmcsIHJlc29sdmUgfSk7XG4gIH1cblxuICBpc09wZW5Nb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5pc09wZW5UeXBlKCk7XG4gIH1cblxuICBpc1BhcmVudE9mKFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hpbGQgIT09IHRoaXMgJiZcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmNoYWluKGNoaWxkKS5zb21lKChwKSA9PiBwWzBdID09PSB0aGlzKVxuICAgICk7XG4gIH1cblxuICByZWZlcmVudGlhbChcbiAgICBhdHRyOiBPRGF0YU1vZGVsQXR0cmlidXRlPGFueT4gfCBPRGF0YU1vZGVsRmllbGQ8YW55PixcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge30sXG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEucmVzb2x2ZVJlZmVyZW50aWFsKHRoaXMsIGF0dHIsIHtcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICByZXNvbHZlLFxuICAgIH0pO1xuICB9XG5cbiAgcmVmZXJlbmNlZChcbiAgICBhdHRyOiBPRGF0YU1vZGVsQXR0cmlidXRlPGFueT4gfCBPRGF0YU1vZGVsRmllbGQ8YW55PixcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge30sXG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEucmVzb2x2ZVJlZmVyZW5jZWQodGhpcywgYXR0ciwge1xuICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgIHJlc29sdmUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBWYWxpZGF0aW9uXG4gIF9lcnJvcnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICB2YWxpZGF0ZSh7XG4gICAgbWV0aG9kLFxuICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgfToge1xuICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEudmFsaWRhdGUodGhpcywgeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gIH1cblxuICBpc1ZhbGlkKHtcbiAgICBtZXRob2QsXG4gICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICB9OiB7XG4gICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICB9ID0ge30pOiBib29sZWFuIHtcbiAgICB0aGlzLl9lcnJvcnMgPSB0aGlzLnZhbGlkYXRlKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pO1xuICAgIGlmICh0aGlzLl9lcnJvcnMgIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuSW52YWxpZCwge1xuICAgICAgICAgIG1vZGVsOiB0aGlzLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLl9lcnJvcnMsXG4gICAgICAgICAgb3B0aW9uczogeyBtZXRob2QgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9lcnJvcnMgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRlZmF1bHRzKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmRlZmF1bHRzKCkgfHwge307XG4gIH1cblxuICB0b0VudGl0eSh7XG4gICAgY2xpZW50X2lkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29tcHV0ZWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2tleSA9IHRydWUsXG4gICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICBjaGFuZ2VzX29ubHkgPSBmYWxzZSxcbiAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgY2hhaW4gPSBbXSxcbiAgfToge1xuICAgIGNsaWVudF9pZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2tleT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9ub25fZmllbGQ/OiBib29sZWFuO1xuICAgIGNoYW5nZXNfb25seT86IGJvb2xlYW47XG4gICAgZmllbGRfbWFwcGluZz86IGJvb2xlYW47XG4gICAgY2hhaW4/OiAoT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PilbXTtcbiAgfSA9IHt9KTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS50b0VudGl0eSh0aGlzLCB7XG4gICAgICBjbGllbnRfaWQsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCxcbiAgICAgIGluY2x1ZGVfa2V5LFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICBjaGFuZ2VzX29ubHksXG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgY2hhaW4sXG4gICAgfSk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9FbnRpdHkoKTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSwgdmFsdWU6IGFueSwgeyB0eXBlIH06IHsgdHlwZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gKDxhbnk+dGhpcylbcGF0aEFycmF5WzBdXTtcbiAgICAgIHJldHVybiBtb2RlbC5zZXQocGF0aEFycmF5LnNsaWNlKDEpLCB2YWx1ZSwge30pO1xuICAgIH1cbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21ldGEuc2V0KHRoaXMsIHBhdGhBcnJheVswXSwgdmFsdWUsIHsgdHlwZSB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQocGF0aDogc3RyaW5nIHwgc3RyaW5nW10pOiBhbnkge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fbWV0YS5nZXQ8YW55Pih0aGlzLCBwYXRoQXJyYXlbMF0pO1xuICAgIGlmIChcbiAgICAgIHBhdGhBcnJheS5sZW5ndGggPiAxICYmXG4gICAgICAodmFsdWUgaW5zdGFuY2VvZiBPRGF0YU1vZGVsIHx8IHZhbHVlIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKVxuICAgICkge1xuICAgICAgcmV0dXJuIHZhbHVlLmdldChwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBoYXMocGF0aDogc3RyaW5nIHwgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fbWV0YS5nZXQ8YW55Pih0aGlzLCBwYXRoQXJyYXlbMF0pO1xuICAgIGlmIChcbiAgICAgIHBhdGhBcnJheS5sZW5ndGggPiAxICYmXG4gICAgICAodmFsdWUgaW5zdGFuY2VvZiBPRGF0YU1vZGVsIHx8IHZhbHVlIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKVxuICAgICkge1xuICAgICAgcmV0dXJuIHZhbHVlLmhhcyhwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJlc2V0KHtcbiAgICBwYXRoLFxuICAgIHNpbGVudCA9IGZhbHNlLFxuICB9OiB7IHBhdGg/OiBzdHJpbmcgfCBzdHJpbmdbXTsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBjb25zdCBwYXRoQXJyYXk6IHN0cmluZ1tdID0gKFxuICAgICAgcGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gW11cbiAgICAgICAgOiBUeXBlcy5pc0FycmF5KHBhdGgpXG4gICAgICAgID8gcGF0aFxuICAgICAgICA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBjb25zdCBuYW1lID0gcGF0aEFycmF5WzBdO1xuICAgIGNvbnN0IHZhbHVlID0gbmFtZSAhPT0gdW5kZWZpbmVkID8gKDxhbnk+dGhpcylbbmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkgfHxcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSlcbiAgICApIHtcbiAgICAgIHZhbHVlLnJlc2V0KHsgcGF0aDogcGF0aEFycmF5LnNsaWNlKDEpLCBzaWxlbnQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21ldGEucmVzZXQodGhpcywgeyBuYW1lOiBwYXRoQXJyYXlbMF0sIHNpbGVudCB9KTtcbiAgICB9XG4gIH1cblxuICBjbGVhcih7IHNpbGVudCA9IGZhbHNlIH06IHsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICB0aGlzLl9hdHRyaWJ1dGVzLmNsZWFyKCk7XG4gICAgLy90aGlzLl9jaGFuZ2VzLmNsZWFyKCk7XG4gICAgLy90aGlzLl9yZWxhdGlvbnMuY2xlYXIoKTtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsIHtcbiAgICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzc2lnbihcbiAgICBlbnRpdHk6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7XG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5hc3NpZ24odGhpcywgZW50aXR5LCB7IHJlc2V0LCBzaWxlbnQsIHJlcGFyZW50IH0pO1xuICB9XG5cbiAgY2xvbmU8TSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KCkge1xuICAgIGxldCBDdG9yID0gPHR5cGVvZiBPRGF0YU1vZGVsPnRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIG5ldyBDdG9yKHRoaXMudG9FbnRpdHkoSU5DTFVERV9TSEFMTE9XKSwge1xuICAgICAgcmVzb3VyY2U6IHRoaXMucmVzb3VyY2UoKSBhcyBPRGF0YVJlc291cmNlPFQ+LFxuICAgICAgYW5ub3RzOiB0aGlzLmFubm90cygpLFxuICAgIH0pIGFzIE07XG4gIH1cblxuICBwcml2YXRlIF9yZXF1ZXN0KG9icyQ6IE9ic2VydmFibGU8T0RhdGFFbnRpdHk8YW55Pj4pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXF1ZXN0LCB7XG4gICAgICAgIG1vZGVsOiB0aGlzLFxuICAgICAgICBvcHRpb25zOiB7IG9ic2VydmFibGU6IG9icyQgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgIG1hcCgoeyBlbnRpdHksIGFubm90cyB9KSA9PiB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgICB0aGlzLmFzc2lnbihhbm5vdHMuYXR0cmlidXRlcyhlbnRpdHkgfHwge30sICdmdWxsJyksIHtcbiAgICAgICAgICByZXNldDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5TeW5jLCB7XG4gICAgICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHsgZW50aXR5LCBhbm5vdHMgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgZmV0Y2goe1xuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnM7XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignZmV0Y2g6IFJlc291cmNlIGlzIHVuZGVmaW5lZCcpKTtcblxuICAgIGxldCBvYnMkOiBPYnNlcnZhYmxlPE9EYXRhRW50aXR5PFQ+PjtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB7XG4gICAgICBvYnMkID0gcmVzb3VyY2UuZmV0Y2gob3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIG9icyQgPSByZXNvdXJjZS5mZXRjaCh7IHJlc3BvbnNlVHlwZTogJ2VudGl0eScsIC4uLm9wdGlvbnMgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9icyQgPSAocmVzb3VyY2UgYXMgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+KS5mZXRjaCh7XG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2VudGl0eScsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCk7XG4gIH1cblxuICBzYXZlKHtcbiAgICBtZXRob2QsXG4gICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIHZhbGlkYXRlID0gdHJ1ZSxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgdmFsaWRhdGU/OiBib29sZWFuO1xuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnM7XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignc2F2ZTogUmVzb3VyY2UgaXMgdW5kZWZpbmVkJykpO1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSB8fFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2VcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnc2F2ZTogUmVzb3VyY2UgdHlwZSBPRGF0YUVudGl0eVJlc291cmNlL09EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgbmVlZGVkJyxcbiAgICAgICAgICApLFxuICAgICAgKTtcblxuICAgIC8vIFJlc29sdmUgbWV0aG9kIGFuZCByZXNvdXJjZSBrZXlcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQgJiYgdGhpcy5zY2hlbWEoKS5pc0NvbXBvdW5kS2V5KCkpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnc2F2ZTogQ29tcG9zaXRlIGtleSByZXF1aXJlIGEgc3BlY2lmaWMgbWV0aG9kLCB1c2UgY3JlYXRlL3VwZGF0ZS9tb2RpZnknLFxuICAgICAgICAgICksXG4gICAgICApO1xuICAgIG1ldGhvZCA9IG1ldGhvZCB8fCAoIXJlc291cmNlLmhhc0tleSgpID8gJ2NyZWF0ZScgOiAndXBkYXRlJyk7XG4gICAgaWYgKFxuICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlICYmXG4gICAgICAobWV0aG9kID09PSAndXBkYXRlJyB8fCBtZXRob2QgPT09ICdtb2RpZnknKSAmJlxuICAgICAgIXJlc291cmNlLmhhc0tleSgpXG4gICAgKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+IG5ldyBFcnJvcignc2F2ZTogVXBkYXRlL1BhdGNoIHJlcXVpcmUgZW50aXR5IGtleScpLFxuICAgICAgKTtcbiAgICBpZiAoXG4gICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgfHxcbiAgICAgIG1ldGhvZCA9PT0gJ2NyZWF0ZSdcbiAgICApXG4gICAgICByZXNvdXJjZS5jbGVhcktleSgpO1xuXG4gICAgaWYgKHZhbGlkYXRlICYmICF0aGlzLmlzVmFsaWQoeyBtZXRob2QsIG5hdmlnYXRpb24gfSkpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignc2F2ZTogVmFsaWRhdGlvbiBlcnJvcnMnKSk7XG4gICAgfVxuICAgIGNvbnN0IF9lbnRpdHkgPSB0aGlzLnRvRW50aXR5KHtcbiAgICAgIGNoYW5nZXNfb25seTogbWV0aG9kID09PSAnbW9kaWZ5JyxcbiAgICAgIGZpZWxkX21hcHBpbmc6IHRydWUsXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5OiB0cnVlLFxuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBuYXZpZ2F0aW9uLFxuICAgIH0pIGFzIFQ7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAobWV0aG9kID09PSAnY3JlYXRlJ1xuICAgICAgICA/IHJlc291cmNlLmNyZWF0ZShfZW50aXR5LCBvcHRpb25zKVxuICAgICAgICA6IG1ldGhvZCA9PT0gJ21vZGlmeSdcbiAgICAgICAgPyByZXNvdXJjZS5tb2RpZnkoX2VudGl0eSwgeyBldGFnOiB0aGlzLmFubm90cygpLmV0YWcsIC4uLm9wdGlvbnMgfSlcbiAgICAgICAgOiByZXNvdXJjZS51cGRhdGUoX2VudGl0eSwgeyBldGFnOiB0aGlzLmFubm90cygpLmV0YWcsIC4uLm9wdGlvbnMgfSlcbiAgICAgICkucGlwZShcbiAgICAgICAgbWFwKCh7IGVudGl0eSwgYW5ub3RzIH0pID0+ICh7IGVudGl0eTogZW50aXR5IHx8IF9lbnRpdHksIGFubm90cyB9KSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBkZXN0cm95KHtcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ2Rlc3Ryb3k6IFJlc291cmNlIGlzIHVuZGVmaW5lZCcpKTtcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgfHxcbiAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlXG4gICAgICApXG4gICAgKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2Rlc3Ryb3k6IFJlc291cmNlIHR5cGUgT0RhdGFFbnRpdHlSZXNvdXJjZS9PRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlIG5lZWRlZCcsXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgaWYgKCFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PiBuZXcgRXJyb3IoXCJkZXN0cm95OiBDYW4ndCBkZXN0cm95IG1vZGVsIHdpdGhvdXQga2V5XCIpLFxuICAgICAgKTtcblxuICAgIGNvbnN0IF9lbnRpdHkgPSB0aGlzLnRvRW50aXR5KHsgZmllbGRfbWFwcGluZzogdHJ1ZSB9KSBhcyBUO1xuICAgIGNvbnN0IG9icyQgPSByZXNvdXJjZVxuICAgICAgLmRlc3Ryb3koeyBldGFnOiB0aGlzLmFubm90cygpLmV0YWcsIC4uLm9wdGlvbnMgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHsgZW50aXR5LCBhbm5vdHMgfSkgPT4gKHsgZW50aXR5OiBlbnRpdHkgfHwgX2VudGl0eSwgYW5ub3RzIH0pKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCkucGlwZShcbiAgICAgIHRhcCgoKSA9PlxuICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuRGVzdHJveSwgeyBtb2RlbDogdGhpcyB9KSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZXhlY3V0aW9uIGNvbnRleHQgZm9yIGNoYW5nZSB0aGUgaW50ZXJuYWwgcXVlcnkgb2YgYSByZXNvdXJjZVxuICAgKiBAcGFyYW0gY3R4IEZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIHF1ZXJ5KFxuICAgIGN0eDogKHE6IE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPiwgcz86IE9EYXRhU3RydWN0dXJlZFR5cGU8VD4pID0+IHZvaWQsXG4gICkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnF1ZXJ5KHRoaXMsIHRoaXMucmVzb3VyY2UoKSwgY3R4KSBhcyB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBjaGVjayBvbiB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIG1vZGVsIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZWwgaXMgY2hhbmdlZC5cbiAgICogQHBhcmFtIGluY2x1ZGVfbmF2aWdhdGlvbiBDaGVjayBpbiBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgbW9kZWwgaGFzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaGFzQ2hhbmdlZCh7XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5oYXNDaGFuZ2VkKHRoaXMsIHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pO1xuICB9XG5cbiAgZW5jb2RlPEU+KG5hbWU6IGtleW9mIFQsIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKSB7XG4gICAgbGV0IHZhbHVlID0gKDxhbnk+dGhpcylbbmFtZV07XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IGZpZWxkID0gdGhpcy5fbWV0YS5maWVsZDxFPihuYW1lKTtcbiAgICByZXR1cm4gZmllbGQgIT09IHVuZGVmaW5lZCA/IGZpZWxkLmVuY29kZSh2YWx1ZSwgb3B0aW9ucykgOiB2YWx1ZTtcbiAgfVxuXG4gIGlzTmV3KCkge1xuICAgIHJldHVybiAhdGhpcy5fbWV0YS5oYXNLZXkodGhpcyk7XG4gIH1cblxuICB3aXRoUmVzb3VyY2U8Uj4ocmVzb3VyY2U6IGFueSwgY3R4OiAobW9kZWw6IHRoaXMpID0+IFIpOiBSIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS53aXRoUmVzb3VyY2UodGhpcywgcmVzb3VyY2UsIGN0eCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGV4ZWN1dGlvbiBjb250ZXh0IGZvciBhIGdpdmVuIGZ1bmN0aW9uLCB3aGVyZSB0aGUgbW9kZWwgaXMgYm91bmQgdG8gaXRzIGVudGl0eSBlbmRwb2ludFxuICAgKiBAcGFyYW0gY3R4IENvbnRleHQgZnVuY3Rpb25cbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgY29udGV4dFxuICAgKi9cbiAgYXNFbnRpdHk8Uj4oY3R4OiAobW9kZWw6IHRoaXMpID0+IFIpOiBSIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5hc0VudGl0eSh0aGlzLCBjdHgpO1xuICB9XG5cbiAgLy8jcmVnaW9uIENhbGxhYmxlc1xuICBjYWxsRnVuY3Rpb248UCwgUj4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgcmVzcG9uc2VUeXBlOlxuICAgICAgfCAncHJvcGVydHknXG4gICAgICB8ICdtb2RlbCdcbiAgICAgIHwgJ2NvbGxlY3Rpb24nXG4gICAgICB8ICdub25lJ1xuICAgICAgfCAnYmxvYidcbiAgICAgIHwgJ2FycmF5YnVmZmVyJyxcbiAgICB7IC4uLm9wdGlvbnMgfToge30gJiBPRGF0YUZ1bmN0aW9uT3B0aW9uczxSPiA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFxuICAgIHwgUlxuICAgIHwgT0RhdGFNb2RlbDxSPlxuICAgIHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+XG4gICAgfCBudWxsXG4gICAgfCBCbG9iXG4gICAgfCBBcnJheUJ1ZmZlclxuICA+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiY2FsbEZ1bmN0aW9uOiBDYW4ndCBjYWxsIGZ1bmN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiLFxuICAgICAgICAgICksXG4gICAgICApO1xuXG4gICAgY29uc3QgZnVuYyA9IHJlc291cmNlLmZ1bmN0aW9uPFAsIFI+KG5hbWUpLnF1ZXJ5KChxKSA9PiBxLmFwcGx5KG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICByZXR1cm4gZnVuYy5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGNhc2UgJ2Jsb2InOlxuICAgICAgICByZXR1cm4gZnVuYy5jYWxsQmxvYihwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnYXJyYXlidWZmZXInOlxuICAgICAgICByZXR1cm4gZnVuYy5jYWxsQXJyYXlidWZmZXIocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KTtcbiAgICB9XG4gIH1cblxuICBjYWxsQWN0aW9uPFAsIFI+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHJlc3BvbnNlVHlwZT86XG4gICAgICB8ICdwcm9wZXJ0eSdcbiAgICAgIHwgJ21vZGVsJ1xuICAgICAgfCAnY29sbGVjdGlvbidcbiAgICAgIHwgJ25vbmUnXG4gICAgICB8ICdibG9iJ1xuICAgICAgfCAnYXJyYXlidWZmZXInLFxuICAgIHsgLi4ub3B0aW9ucyB9OiB7fSAmIE9EYXRhQWN0aW9uT3B0aW9uczxSPiA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFxuICAgIHwgUlxuICAgIHwgT0RhdGFNb2RlbDxSPlxuICAgIHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+XG4gICAgfCBudWxsXG4gICAgfCBCbG9iXG4gICAgfCBBcnJheUJ1ZmZlclxuICA+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiY2FsbEFjdGlvbjogQ2FuJ3QgY2FsbCBhY3Rpb24gd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlIHdpdGgga2V5XCIsXG4gICAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICBjb25zdCBhY3Rpb24gPSByZXNvdXJjZS5hY3Rpb248UCwgUj4obmFtZSkucXVlcnkoKHEpID0+IHEuYXBwbHkob3B0aW9ucykpO1xuICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG4gICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnYmxvYic6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbEJsb2IocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGNhc2UgJ2FycmF5YnVmZmVyJzpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsQXJyYXlidWZmZXIocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlLCAuLi5vcHRpb25zIH0pO1xuICAgIH1cbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyBDYXN0XG4gIGNhc3Q8Uz4odHlwZTogc3RyaW5nKSB7XG4gICAgLy86IE9EYXRhTW9kZWw8Uz4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYXN0OiBDYW4ndCBjYXN0IHRvIGRlcml2ZWQgbW9kZWwgd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlYCxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgIC5jYXN0PFM+KHR5cGUpXG4gICAgICAuYXNNb2RlbCh0aGlzLnRvRW50aXR5KElOQ0xVREVfREVFUCkgYXMgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sIHtcbiAgICAgICAgYW5ub3RzOiB0aGlzLmFubm90cygpIGFzIGFueSxcbiAgICAgIH0pO1xuICB9XG5cbiAgZmV0Y2hOYXZpZ2F0aW9uUHJvcGVydHk8Uz4oXG4gICAgbmFtZToga2V5b2YgVCB8IHN0cmluZyxcbiAgICByZXNwb25zZVR5cGU6ICdtb2RlbCcgfCAnY29sbGVjdGlvbicsXG4gICAgeyAuLi5vcHRpb25zIH06IHt9ICYgT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnM8Uz4gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YU1vZGVsPFM+IHwgT0RhdGFDb2xsZWN0aW9uPFMsIE9EYXRhTW9kZWw8Uz4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IG5hdiA9IHRoaXMubmF2aWdhdGlvblByb3BlcnR5PFM+KFxuICAgICAgbmFtZSxcbiAgICApIGFzIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Uz47XG4gICAgbmF2LnF1ZXJ5KChxKSA9PiBxLmFwcGx5KG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICByZXR1cm4gbmF2LmZldGNoTW9kZWwob3B0aW9ucyk7XG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgcmV0dXJuIG5hdi5mZXRjaENvbGxlY3Rpb24ob3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0IFZhbHVlXG4gIGdldFZhbHVlPFA+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmcsXG4gICAgb3B0aW9ucz86IE9EYXRhT3B0aW9ucyxcbiAgKTogT2JzZXJ2YWJsZTxQIHwgT0RhdGFNb2RlbDxQPiB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PiB8IG51bGw+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmllbGQobmFtZSk7XG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKGBnZXRWYWx1ZTogQ2FuJ3QgZmluZCBwcm9wZXJ0eSAke25hbWUgYXMgc3RyaW5nfWApO1xuXG4gICAgbGV0IHZhbHVlID0gKHRoaXMgYXMgYW55KVtuYW1lXSBhc1xuICAgICAgfCBQXG4gICAgICB8IE9EYXRhTW9kZWw8UD5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPFAsIE9EYXRhTW9kZWw8UD4+O1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwcm9wID0gZmllbGQucmVzb3VyY2VGYWN0b3J5KFxuICAgICAgICB0aGlzLnJlc291cmNlKCksXG4gICAgICApIGFzIE9EYXRhUHJvcGVydHlSZXNvdXJjZTxQPjtcbiAgICAgIHJldHVybiBmaWVsZC5jb2xsZWN0aW9uXG4gICAgICAgID8gcHJvcFxuICAgICAgICAgICAgLmZldGNoQ29sbGVjdGlvbihvcHRpb25zKVxuICAgICAgICAgICAgLnBpcGUodGFwKChjKSA9PiB0aGlzLmFzc2lnbih7IFtuYW1lXTogYyB9LCB7IHNpbGVudDogdHJ1ZSB9KSkpXG4gICAgICAgIDogZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpXG4gICAgICAgID8gcHJvcFxuICAgICAgICAgICAgLmZldGNoTW9kZWwob3B0aW9ucylcbiAgICAgICAgICAgIC5waXBlKHRhcCgoYykgPT4gdGhpcy5hc3NpZ24oeyBbbmFtZV06IGMgfSwgeyBzaWxlbnQ6IHRydWUgfSkpKVxuICAgICAgICA6IHByb3BcbiAgICAgICAgICAgIC5mZXRjaFByb3BlcnR5KG9wdGlvbnMpXG4gICAgICAgICAgICAucGlwZSh0YXAoKGMpID0+IHRoaXMuYXNzaWduKHsgW25hbWVdOiBjIH0sIHsgc2lsZW50OiB0cnVlIH0pKSk7XG4gICAgfVxuICAgIHJldHVybiBvZih2YWx1ZSBhcyBQKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBSZWZlcmVuY2VzXG4gIHNldFJlZmVyZW5jZTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPE4+IHwgT0RhdGFDb2xsZWN0aW9uPE4sIE9EYXRhTW9kZWw8Tj4+IHwgbnVsbCxcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSAoXG4gICAgICB0aGlzLm5hdmlnYXRpb25Qcm9wZXJ0eTxOPihuYW1lKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPE4+XG4gICAgKS5yZWZlcmVuY2UoKTtcblxuICAgIGNvbnN0IGV0YWcgPSB0aGlzLmFubm90cygpLmV0YWc7XG4gICAgbGV0IG9icyQgPSBORVZFUiBhcyBPYnNlcnZhYmxlPGFueT47XG4gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFNb2RlbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS5zZXQoXG4gICAgICAgIG1vZGVsLl9tZXRhLmVudGl0eVJlc291cmNlKG1vZGVsKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPE4+LFxuICAgICAgICB7IGV0YWcsIC4uLm9wdGlvbnMgfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIE9EYXRhQ29sbGVjdGlvbikge1xuICAgICAgb2JzJCA9IGZvcmtKb2luKFxuICAgICAgICBtb2RlbFxuICAgICAgICAgIC5tb2RlbHMoKVxuICAgICAgICAgIC5tYXAoKG0pID0+XG4gICAgICAgICAgICByZWZlcmVuY2UuYWRkKFxuICAgICAgICAgICAgICBtLl9tZXRhLmVudGl0eVJlc291cmNlKG0pIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8Tj4sXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobW9kZWwgPT09IG51bGwpIHtcbiAgICAgIG9icyQgPSByZWZlcmVuY2UudW5zZXQoeyBldGFnLCAuLi5vcHRpb25zIH0pO1xuICAgIH1cbiAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXF1ZXN0LCB7XG4gICAgICAgIG1vZGVsOiB0aGlzLFxuICAgICAgICBvcHRpb25zOiB7IG9ic2VydmFibGU6IG9icyQgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgIG1hcCgobW9kZWwpID0+IHtcbiAgICAgICAgdGhpcy5hc3NpZ24oeyBbbmFtZV06IG1vZGVsIH0pO1xuICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuU3luYywgeyBtb2RlbDogdGhpcyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgZ2V0UmVmZXJlbmNlPFA+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmcsXG4gICk6IE9EYXRhTW9kZWw8UD4gfCBPRGF0YUNvbGxlY3Rpb248UCwgT0RhdGFNb2RlbDxQPj4gfCBudWxsIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmllbGQ8UD4obmFtZSk7XG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgIWZpZWxkLm5hdmlnYXRpb24pXG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYGdldFJlZmVyZW5jZTogQ2FuJ3QgZmluZCBuYXZpZ2F0aW9uIHByb3BlcnR5ICR7bmFtZSBhcyBzdHJpbmd9YCxcbiAgICAgICk7XG5cbiAgICBsZXQgbW9kZWwgPSAodGhpcyBhcyBhbnkpW25hbWVdIGFzXG4gICAgICB8IE9EYXRhTW9kZWw8UD5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPFAsIE9EYXRhTW9kZWw8UD4+XG4gICAgICB8IG51bGw7XG4gICAgaWYgKG1vZGVsID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICBpZiAobW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpZWxkLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgbW9kZWwgPSBmaWVsZC5jb2xsZWN0aW9uRmFjdG9yeSh7IHBhcmVudDogdGhpcyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWZlcmVuY2VkKGZpZWxkKSBhcyBQO1xuICAgICAgICBtb2RlbCA9XG4gICAgICAgICAgdmFsdWUgPT09IG51bGwgPyBudWxsIDogZmllbGQubW9kZWxGYWN0b3J5KHsgcGFyZW50OiB0aGlzLCB2YWx1ZSB9KTtcbiAgICAgIH1cbiAgICAgICh0aGlzIGFzIGFueSlbbmFtZV0gPSBtb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBNb2RlbCBJZGVudGl0eVxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdNb2RlbCc7XG4gIH1cbiAgZXF1YWxzKG90aGVyOiBPRGF0YU1vZGVsPFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMgPT09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIHRoaXMgIT09IHR5cGVvZiBvdGhlcikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9tZXRhO1xuICAgIGNvbnN0IHRoaXNDaWQgPSAoPGFueT50aGlzKVttZXRhLmNpZF07XG4gICAgY29uc3Qgb3RoZXJDaWQgPSAoPGFueT5vdGhlcilbbWV0YS5jaWRdO1xuICAgIGlmIChcbiAgICAgIHRoaXNDaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgb3RoZXJDaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgVHlwZXMuaXNFcXVhbCh0aGlzQ2lkLCBvdGhlckNpZClcbiAgICApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAobWV0YS5pc0VudGl0eVR5cGUoKSkge1xuICAgICAgY29uc3QgdGhpc0tleSA9IHRoaXMua2V5KCk7XG4gICAgICBjb25zdCBvdGhlcktleSA9IG90aGVyLmtleSgpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgb3RoZXJLZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBUeXBlcy5pc0VxdWFsKHRoaXNLZXksIG90aGVyS2V5KVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG1ldGEuaXNDb21wbGV4VHlwZSgpKSB7XG4gICAgICBjb25zdCB0aGlzSnNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICBjb25zdCBvdGhlckpzb24gPSBvdGhlci50b0pTT04oKTtcbiAgICAgIGlmIChUeXBlcy5pc0VxdWFsKHRoaXNKc29uLCBvdGhlckpzb24pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBDb2xsZWN0aW9uIFRvb2xzXG4gIGNvbGxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHRoaXMuX3BhcmVudFswXSlcbiAgICAgID8gKHRoaXMuX3BhcmVudFswXSBhcyBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5leHQoKTogT0RhdGFNb2RlbDxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbigpPy5uZXh0KHRoaXMpO1xuICB9XG5cbiAgcHJldigpOiBPRGF0YU1vZGVsPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uKCk/LnByZXYodGhpcyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG5cbmV4cG9ydCBjb25zdCBSRVNFUlZFRF9GSUVMRF9OQU1FUyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFxuICBPRGF0YU1vZGVsLnByb3RvdHlwZSxcbik7XG4iXX0=