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,444 @@
1
+ import { Objects, Types } from '../../../utils';
2
+ import { normalizeValue } from '../builder';
3
+ export const FieldFactory = (names = []) => new Proxy({ _names: names }, {
4
+ get(target, key) {
5
+ let names = target['_names'];
6
+ if (key === 'render') {
7
+ return ({ prefix }) => prefix ? `${prefix}/${names.join('/')}` : names.join('/');
8
+ }
9
+ else if (key === 'clone') {
10
+ return () => FieldFactory([...names]);
11
+ }
12
+ else if (key === 'isField') {
13
+ return () => true;
14
+ }
15
+ else if (key === 'toJSON') {
16
+ return () => ({
17
+ $type: 'Field',
18
+ names: names,
19
+ });
20
+ }
21
+ else if (key === 'resolve') {
22
+ return (parser) => names.reduce((acc, name) => acc.field(name), parser);
23
+ }
24
+ else {
25
+ return FieldFactory([...names, key]);
26
+ }
27
+ },
28
+ has(target, key) {
29
+ return (['toJSON', 'isField', 'clone', 'render', 'resolve'].includes(key) ||
30
+ key in target);
31
+ },
32
+ });
33
+ function applyMixins(derivedCtor, constructors) {
34
+ constructors.forEach((baseCtor) => {
35
+ Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {
36
+ Object.defineProperty(derivedCtor.prototype, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||
37
+ Object.create(null));
38
+ });
39
+ });
40
+ }
41
+ export function render(value, { aliases, normalize, escape, prefix, parser, } = {}) {
42
+ if (Types.isFunction(value)) {
43
+ return render(value(syntax), { aliases, normalize, prefix, parser });
44
+ }
45
+ if (Types.isObject(value) && 'render' in value) {
46
+ return render(value.render({ aliases, escape, prefix, parser }), {
47
+ aliases,
48
+ normalize,
49
+ escape,
50
+ prefix,
51
+ parser,
52
+ });
53
+ }
54
+ return normalize ? normalizeValue(value, { aliases, escape }) : value;
55
+ }
56
+ export function resolve(values, parser) {
57
+ if (parser !== undefined) {
58
+ let fields = values.filter((v) => Types.isObject(v) && 'isField' in v && v.isField());
59
+ if (fields.length === 1 && Types.isObject(parser) && 'field' in parser) {
60
+ return fields[0].resolve(parser);
61
+ }
62
+ }
63
+ return parser;
64
+ }
65
+ export function encode(values, parser) {
66
+ if (parser !== undefined) {
67
+ return values.map((v) => Types.isObject(v) || v === null ? v : parser?.encode(v));
68
+ }
69
+ return values;
70
+ }
71
+ export class Function {
72
+ constructor(name, values, normalize, escape = false) {
73
+ this.name = name;
74
+ this.values = values;
75
+ this.normalize = normalize;
76
+ this.escape = escape;
77
+ }
78
+ get [Symbol.toStringTag]() {
79
+ return 'Function';
80
+ }
81
+ toJSON() {
82
+ return {
83
+ $type: Types.rawType(this),
84
+ name: this.name,
85
+ values: this.values.map((v) => Types.isObject(v) && 'toJSON' in v ? v.toJSON() : v),
86
+ normalize: this.normalize,
87
+ };
88
+ }
89
+ render({ aliases, escape, prefix, parser, }) {
90
+ parser = resolve(this.values, parser);
91
+ let [left, ...values] = encode(this.values, parser);
92
+ left = render(left, {
93
+ aliases,
94
+ escape,
95
+ prefix,
96
+ parser,
97
+ normalize: this.normalize === 'all' || this.normalize === 'left',
98
+ });
99
+ const params = [
100
+ left,
101
+ ...values.map((v) => render(v, {
102
+ aliases,
103
+ escape,
104
+ prefix,
105
+ parser,
106
+ normalize: this.normalize === 'all' || this.normalize === 'right',
107
+ })),
108
+ ];
109
+ return `${this.name}(${params.join(', ')})`;
110
+ }
111
+ clone() {
112
+ return new Function(this.name, this.values.map((v) => Objects.clone(v)), this.normalize, this.escape);
113
+ }
114
+ }
115
+ export class StringAndCollectionFunctions {
116
+ concat(left, right, normalize = 'right') {
117
+ return new Function('concat', [left, right], normalize);
118
+ }
119
+ contains(left, right, normalize = 'right') {
120
+ return new Function('contains', [left, right], normalize);
121
+ }
122
+ endsWith(left, right, normalize = 'right') {
123
+ return new Function('endswith', [left, right], normalize);
124
+ }
125
+ indexOf(left, right, normalize = 'right') {
126
+ return new Function('indexof', [left, right], normalize);
127
+ }
128
+ length(left, normalize = 'right') {
129
+ return new Function('length', [left], normalize);
130
+ }
131
+ startsWith(left, right, normalize = 'right') {
132
+ return new Function('startswith', [left, right], normalize);
133
+ }
134
+ subString(left, right, length, normalize = 'none') {
135
+ let values = [left, right];
136
+ if (length !== undefined) {
137
+ values.push(length);
138
+ }
139
+ return new Function('substring', values, normalize);
140
+ }
141
+ }
142
+ export class CollectionFunctions {
143
+ hasSubset(left, right, normalize = 'none') {
144
+ return new Function('hassubset', [left, right], normalize);
145
+ }
146
+ hasSubsequence(left, right, normalize = 'none') {
147
+ return new Function('hassubsequence', [left, right], normalize);
148
+ }
149
+ }
150
+ export class StringFunctions {
151
+ matchesPattern(left, pattern, normalize = 'none') {
152
+ return new Function('matchesPattern', [left, pattern], normalize);
153
+ }
154
+ toLower(left, normalize = 'none') {
155
+ return new Function('tolower', [left], normalize);
156
+ }
157
+ toUpper(left, normalize = 'none') {
158
+ return new Function('toupper', [left], normalize);
159
+ }
160
+ trim(left, normalize = 'none') {
161
+ return new Function('trim', [left], normalize);
162
+ }
163
+ }
164
+ export class DateAndTimeFunctions {
165
+ date(left, normalize = 'none') {
166
+ return new Function('date', [left], normalize);
167
+ }
168
+ day(left, normalize = 'none') {
169
+ return new Function('day', [left], normalize);
170
+ }
171
+ fractionalseconds(left, normalize = 'none') {
172
+ return new Function('fractionalseconds', [left], normalize);
173
+ }
174
+ hour(left, normalize = 'none') {
175
+ return new Function('hour', [left], normalize);
176
+ }
177
+ maxdatetime(left, normalize = 'none') {
178
+ return new Function('maxdatetime', [left], normalize);
179
+ }
180
+ mindatetime(left, normalize = 'none') {
181
+ return new Function('mindatetime', [left], normalize);
182
+ }
183
+ minute(left, normalize = 'none') {
184
+ return new Function('minute', [left], normalize);
185
+ }
186
+ month(left, normalize = 'none') {
187
+ return new Function('month', [left], normalize);
188
+ }
189
+ now() {
190
+ return new Function('now', [], 'none');
191
+ }
192
+ second(left, normalize = 'none') {
193
+ return new Function('second', [left], normalize);
194
+ }
195
+ time(left, normalize = 'none') {
196
+ return new Function('time', [left], normalize);
197
+ }
198
+ totaloffsetminutes(left, normalize = 'none') {
199
+ return new Function('totaloffsetminutes', [left], normalize);
200
+ }
201
+ totalseconds(left, normalize = 'none') {
202
+ return new Function('totalseconds', [left], normalize);
203
+ }
204
+ year(left, normalize = 'none') {
205
+ return new Function('year', [left], normalize);
206
+ }
207
+ }
208
+ export class ArithmeticFunctions {
209
+ ceiling(left, normalize = 'none') {
210
+ return new Function('ceiling', [left], normalize);
211
+ }
212
+ floor(left, normalize = 'none') {
213
+ return new Function('floor', [left], normalize);
214
+ }
215
+ round(left, normalize = 'none') {
216
+ return new Function('round', [left], normalize);
217
+ }
218
+ }
219
+ export class TypeFunctions {
220
+ cast(left, right, normalize = 'right') {
221
+ return new Function('cast', [left, right], normalize);
222
+ }
223
+ isof(left, right, normalize = 'right') {
224
+ return new Function('isof', [left, right], normalize);
225
+ }
226
+ }
227
+ export class GeoFunctions {
228
+ geoDistance(left, right, normalize = 'right') {
229
+ return new Function('geo.distance', [left, right], normalize);
230
+ }
231
+ geoIntersects(left, right, normalize = 'right') {
232
+ return new Function('geo.intersects', [left, right], normalize);
233
+ }
234
+ geoLength(left, normalize = 'none') {
235
+ return new Function('geo.length', [left], normalize);
236
+ }
237
+ }
238
+ export class ConditionalFunctions {
239
+ case(left, right, normalize = 'none') {
240
+ return new Function('case', [left, right], normalize);
241
+ }
242
+ }
243
+ export class Operator {
244
+ constructor(op, values, normalize) {
245
+ this.op = op;
246
+ this.values = values;
247
+ this.normalize = normalize;
248
+ }
249
+ get [Symbol.toStringTag]() {
250
+ return 'Operator';
251
+ }
252
+ toJSON() {
253
+ return {
254
+ $type: Types.rawType(this),
255
+ op: this.op,
256
+ values: this.values.map((v) => Types.isObject(v) && 'toJSON' in v ? v.toJSON() : v),
257
+ normalize: this.normalize,
258
+ };
259
+ }
260
+ render({ aliases, escape, prefix, parser, }) {
261
+ parser = resolve(this.values, parser);
262
+ let [left, right] = encode(this.values, parser);
263
+ left = render(left, {
264
+ aliases,
265
+ escape,
266
+ prefix,
267
+ parser,
268
+ normalize: this.normalize === 'all' || this.normalize === 'left',
269
+ });
270
+ if (right !== undefined) {
271
+ right = Array.isArray(right)
272
+ ? `(${right
273
+ .map((v) => render(v, {
274
+ aliases,
275
+ escape,
276
+ prefix,
277
+ parser,
278
+ normalize: this.normalize === 'all' || this.normalize === 'right',
279
+ }))
280
+ .join(',')})`
281
+ : render(right, {
282
+ aliases,
283
+ escape,
284
+ prefix,
285
+ parser,
286
+ normalize: this.normalize === 'all' || this.normalize === 'right',
287
+ });
288
+ return `${left} ${this.op} ${right}`;
289
+ }
290
+ return `${this.op}(${left})`;
291
+ }
292
+ clone() {
293
+ return new Operator(this.op, this.values.map((v) => Objects.clone(v)), this.normalize);
294
+ }
295
+ }
296
+ export class LogicalOperators {
297
+ eq(left, right, normalize = 'right') {
298
+ return new Operator('eq', [left, right], normalize);
299
+ }
300
+ ne(left, right, normalize = 'right') {
301
+ return new Operator('ne', [left, right], normalize);
302
+ }
303
+ gt(left, right, normalize = 'right') {
304
+ return new Operator('gt', [left, right], normalize);
305
+ }
306
+ ge(left, right, normalize = 'right') {
307
+ return new Operator('ge', [left, right], normalize);
308
+ }
309
+ lt(left, right, normalize = 'right') {
310
+ return new Operator('lt', [left, right], normalize);
311
+ }
312
+ le(left, right, normalize = 'right') {
313
+ return new Operator('le', [left, right], normalize);
314
+ }
315
+ /*
316
+ and(left: any, right: any, normalize: Normalize = 'right') {
317
+ return new Operator('and', [left, right], normalize);
318
+ }
319
+ or(left: any, right: any, normalize: Normalize = 'right') {
320
+ return new Operator('or', [left, right], normalize);
321
+ }
322
+ */
323
+ not(left, normalize = 'none') {
324
+ return new Operator('not', [left], normalize);
325
+ }
326
+ has(left, right, normalize = 'right') {
327
+ return new Operator('has', [left, right], normalize);
328
+ }
329
+ in(left, right, normalize = 'right') {
330
+ return new Operator('in', [left, right], normalize);
331
+ }
332
+ }
333
+ export class ArithmeticOperators {
334
+ add(left, right, normalize = 'right') {
335
+ return new Operator('add', [left, right], normalize);
336
+ }
337
+ sub(left, right, normalize = 'right') {
338
+ return new Operator('sub', [left, right], normalize);
339
+ }
340
+ mul(left, right, normalize = 'right') {
341
+ return new Operator('mul', [left, right], normalize);
342
+ }
343
+ div(left, right, normalize = 'right') {
344
+ return new Operator('div', [left, right], normalize);
345
+ }
346
+ mod(left, right, normalize = 'right') {
347
+ return new Operator('mod', [left, right], normalize);
348
+ }
349
+ neg(value, normalize = 'right') {
350
+ return new Operator('-', [value], normalize);
351
+ }
352
+ }
353
+ export class Grouping {
354
+ constructor(group) {
355
+ this.group = group;
356
+ }
357
+ get [Symbol.toStringTag]() {
358
+ return 'Grouping';
359
+ }
360
+ toJSON() {
361
+ return {
362
+ $type: Types.rawType(this),
363
+ group: this.group.toJSON(),
364
+ };
365
+ }
366
+ render({ aliases, escape, prefix, parser, }) {
367
+ return `(${render(this.group, { aliases, escape, prefix, parser })})`;
368
+ }
369
+ clone() {
370
+ return new Grouping(Objects.clone(this.group));
371
+ }
372
+ }
373
+ export class Lambda {
374
+ constructor(op, values, alias) {
375
+ this.op = op;
376
+ this.values = values;
377
+ this.alias = alias;
378
+ }
379
+ get [Symbol.toStringTag]() {
380
+ return 'Lambda';
381
+ }
382
+ toJSON() {
383
+ return {
384
+ $type: Types.rawType(this),
385
+ op: this.op,
386
+ values: this.values.map((v) => Types.isObject(v) && 'toJSON' in v ? v.toJSON() : v),
387
+ alias: this.alias,
388
+ };
389
+ }
390
+ render({ aliases, escape, prefix, parser, }) {
391
+ parser = resolve(this.values, parser);
392
+ let [left, right] = encode(this.values, parser);
393
+ left = render(left, { aliases, escape, prefix, parser });
394
+ if (right) {
395
+ let alias = this.alias || left.split('/').pop().toLowerCase()[0];
396
+ return `${left}/${this.op}(${alias}:${render(right, {
397
+ aliases,
398
+ escape,
399
+ prefix: alias,
400
+ parser,
401
+ })})`;
402
+ }
403
+ else {
404
+ return `${left}/${this.op}()`;
405
+ }
406
+ }
407
+ clone() {
408
+ return new Lambda(this.op, this.values.map((v) => Objects.clone(v)), this.alias);
409
+ }
410
+ }
411
+ export class LambdaOperators {
412
+ any(left, right, alias) {
413
+ return new Lambda('any', [left, right], alias);
414
+ }
415
+ all(left, right, alias) {
416
+ return new Lambda('all', [left, right], alias);
417
+ }
418
+ }
419
+ export class ODataOperators {
420
+ }
421
+ applyMixins(ODataOperators, [
422
+ LogicalOperators,
423
+ ArithmeticOperators,
424
+ LambdaOperators,
425
+ ]);
426
+ export const operators = new ODataOperators();
427
+ export class ODataFunctions {
428
+ }
429
+ applyMixins(ODataFunctions, [
430
+ StringAndCollectionFunctions,
431
+ CollectionFunctions,
432
+ StringFunctions,
433
+ DateAndTimeFunctions,
434
+ ArithmeticFunctions,
435
+ TypeFunctions,
436
+ GeoFunctions,
437
+ ConditionalFunctions,
438
+ ]);
439
+ export const functions = new ODataFunctions();
440
+ export class ODataSyntax {
441
+ }
442
+ applyMixins(ODataSyntax, [ODataOperators, ODataFunctions]);
443
+ export const syntax = new ODataSyntax();
444
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3Jlc291cmNlcy9xdWVyeS9leHByZXNzaW9ucy9zeW50YXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBcUI1QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBbUIsUUFBa0IsRUFBRSxFQUFPLEVBQUUsQ0FDMUUsSUFBSSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFPLEVBQUU7SUFDaEMsR0FBRyxDQUFDLE1BQVMsRUFBRSxHQUFvQjtRQUNqQyxJQUFJLEtBQUssR0FBSSxNQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsSUFBSSxHQUFHLEtBQUssUUFBUSxFQUFFO1lBQ3BCLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBdUIsRUFBRSxFQUFFLENBQ3pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzdEO2FBQU0sSUFBSSxHQUFHLEtBQUssT0FBTyxFQUFFO1lBQzFCLE9BQU8sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO2FBQU0sSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO1lBQzVCLE9BQU8sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1NBQ25CO2FBQU0sSUFBSSxHQUFHLEtBQUssUUFBUSxFQUFFO1lBQzNCLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFD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QUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFPLEVBQUUsS0FBVSxFQUFFLEtBQWM7UUFDckMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGNBQWM7Q0FBTTtBQU1qQyxXQUFXLENBQUMsY0FBYyxFQUFFO0lBQzFCLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsZUFBZTtDQUNoQixDQUFDLENBQUM7QUFDSCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQXdCLElBQUksY0FBYyxFQUFPLENBQUM7QUFFeEUsTUFBTSxPQUFPLGNBQWM7Q0FBTTtBQVdqQyxXQUFXLENBQUMsY0FBYyxFQUFFO0lBQzFCLDRCQUE0QjtJQUM1QixtQkFBbUI7SUFDbkIsZUFBZTtJQUNmLG9CQUFvQjtJQUNwQixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLFlBQVk7SUFDWixvQkFBb0I7Q0FDckIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUF3QixJQUFJLGNBQWMsRUFBTyxDQUFDO0FBRXhFLE1BQU0sT0FBTyxXQUFXO0NBQU07QUFFOUIsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0FBRTNELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBcUIsSUFBSSxXQUFXLEVBQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhcnNlciB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IE9iamVjdHMsIFR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBRdWVyeUN1c3RvbVR5cGUgfSBmcm9tICcuLi9idWlsZGVyJztcbmltcG9ydCB7IG5vcm1hbGl6ZVZhbHVlIH0gZnJvbSAnLi4vYnVpbGRlcic7XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZSA9ICdhbGwnIHwgJ3JpZ2h0JyB8ICdsZWZ0JyB8ICdub25lJztcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJhYmxlIHtcbiAgcmVuZGVyKHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgICBwcmVmaXgsXG4gICAgcGFyc2VyLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxhbnk+O1xuICB9KTogc3RyaW5nO1xuICB0b1N0cmluZygpOiBzdHJpbmc7XG4gIHRvSlNPTigpOiBhbnk7XG4gIGNsb25lKCk6IGFueTtcbn1cblxuZXhwb3J0IGNvbnN0IEZpZWxkRmFjdG9yeSA9IDxUIGV4dGVuZHMgb2JqZWN0PihuYW1lczogc3RyaW5nW10gPSBbXSk6IGFueSA9PlxuICBuZXcgUHJveHkoeyBfbmFtZXM6IG5hbWVzIH0gYXMgVCwge1xuICAgIGdldCh0YXJnZXQ6IFQsIGtleTogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgICBsZXQgbmFtZXMgPSAodGFyZ2V0IGFzIGFueSlbJ19uYW1lcyddO1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbmRlcicpIHtcbiAgICAgICAgcmV0dXJuICh7IHByZWZpeCB9OiB7IHByZWZpeD86IHN0cmluZyB9KSA9PlxuICAgICAgICAgIHByZWZpeCA/IGAke3ByZWZpeH0vJHtuYW1lcy5qb2luKCcvJyl9YCA6IG5hbWVzLmpvaW4oJy8nKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnY2xvbmUnKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiBGaWVsZEZhY3RvcnkoWy4uLm5hbWVzXSk7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2lzRmllbGQnKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICd0b0pTT04nKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiAoe1xuICAgICAgICAgICR0eXBlOiAnRmllbGQnLFxuICAgICAgICAgIG5hbWVzOiBuYW1lcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3Jlc29sdmUnKSB7XG4gICAgICAgIHJldHVybiAocGFyc2VyOiBhbnkpID0+XG4gICAgICAgICAgbmFtZXMucmVkdWNlKChhY2M6IGFueSwgbmFtZTogc3RyaW5nKSA9PiBhY2MuZmllbGQobmFtZSksIHBhcnNlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gRmllbGRGYWN0b3J5KFsuLi5uYW1lcywga2V5XSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGhhcyh0YXJnZXQ6IFQsIGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIFsndG9KU09OJywgJ2lzRmllbGQnLCAnY2xvbmUnLCAncmVuZGVyJywgJ3Jlc29sdmUnXS5pbmNsdWRlcyhrZXkpIHx8XG4gICAgICAgIGtleSBpbiB0YXJnZXRcbiAgICAgICk7XG4gICAgfSxcbiAgfSk7XG5cbmZ1bmN0aW9uIGFwcGx5TWl4aW5zKGRlcml2ZWRDdG9yOiBhbnksIGNvbnN0cnVjdG9yczogYW55W10pIHtcbiAgY29uc3RydWN0b3JzLmZvckVhY2goKGJhc2VDdG9yKSA9PiB7XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYmFzZUN0b3IucHJvdG90eXBlKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgIGRlcml2ZWRDdG9yLnByb3RvdHlwZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlQ3Rvci5wcm90b3R5cGUsIG5hbWUpIHx8XG4gICAgICAgICAgT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyKFxuICB2YWx1ZTogYW55LFxuICB7XG4gICAgYWxpYXNlcyxcbiAgICBub3JtYWxpemUsXG4gICAgZXNjYXBlLFxuICAgIHByZWZpeCxcbiAgICBwYXJzZXIsXG4gIH06IHtcbiAgICBhbGlhc2VzPzogUXVlcnlDdXN0b21UeXBlW107XG4gICAgbm9ybWFsaXplPzogYm9vbGVhbjtcbiAgICBlc2NhcGU/OiBib29sZWFuO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICBwYXJzZXI/OiBQYXJzZXI8YW55PjtcbiAgfSA9IHt9LFxuKTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwge1xuICBpZiAoVHlwZXMuaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICByZXR1cm4gcmVuZGVyKHZhbHVlKHN5bnRheCksIHsgYWxpYXNlcywgbm9ybWFsaXplLCBwcmVmaXgsIHBhcnNlciB9KTtcbiAgfVxuICBpZiAoVHlwZXMuaXNPYmplY3QodmFsdWUpICYmICdyZW5kZXInIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHJlbmRlcih2YWx1ZS5yZW5kZXIoeyBhbGlhc2VzLCBlc2NhcGUsIHByZWZpeCwgcGFyc2VyIH0pLCB7XG4gICAgICBhbGlhc2VzLFxuICAgICAgbm9ybWFsaXplLFxuICAgICAgZXNjYXBlLFxuICAgICAgcHJlZml4LFxuICAgICAgcGFyc2VyLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBub3JtYWxpemUgPyBub3JtYWxpemVWYWx1ZSh2YWx1ZSwgeyBhbGlhc2VzLCBlc2NhcGUgfSkgOiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUodmFsdWVzOiBhbnksIHBhcnNlcj86IFBhcnNlcjxhbnk+KSB7XG4gIGlmIChwYXJzZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBmaWVsZHMgPSB2YWx1ZXMuZmlsdGVyKFxuICAgICAgKHY6IGFueSkgPT4gVHlwZXMuaXNPYmplY3QodikgJiYgJ2lzRmllbGQnIGluIHYgJiYgdi5pc0ZpZWxkKCksXG4gICAgKTtcbiAgICBpZiAoZmllbGRzLmxlbmd0aCA9PT0gMSAmJiBUeXBlcy5pc09iamVjdChwYXJzZXIpICYmICdmaWVsZCcgaW4gcGFyc2VyKSB7XG4gICAgICByZXR1cm4gZmllbGRzWzBdLnJlc29sdmUocGFyc2VyKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhcnNlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZSh2YWx1ZXM6IGFueSwgcGFyc2VyPzogUGFyc2VyPGFueT4pIHtcbiAgaWYgKHBhcnNlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHZhbHVlcy5tYXAoKHY6IGFueSkgPT5cbiAgICAgIFR5cGVzLmlzT2JqZWN0KHYpIHx8IHYgPT09IG51bGwgPyB2IDogcGFyc2VyPy5lbmNvZGUodiksXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb248VD4gaW1wbGVtZW50cyBSZW5kZXJhYmxlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgdmFsdWVzOiBhbnlbXSxcbiAgICBwcm90ZWN0ZWQgbm9ybWFsaXplOiBOb3JtYWxpemUsXG4gICAgcHJvdGVjdGVkIGVzY2FwZTogYm9vbGVhbiA9IGZhbHNlLFxuICApIHt9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnRnVuY3Rpb24nO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkdHlwZTogVHlwZXMucmF3VHlwZSh0aGlzKSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHZhbHVlczogdGhpcy52YWx1ZXMubWFwKCh2KSA9PlxuICAgICAgICBUeXBlcy5pc09iamVjdCh2KSAmJiAndG9KU09OJyBpbiB2ID8gdi50b0pTT04oKSA6IHYsXG4gICAgICApLFxuICAgICAgbm9ybWFsaXplOiB0aGlzLm5vcm1hbGl6ZSxcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyKHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgICBwcmVmaXgsXG4gICAgcGFyc2VyLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxUPjtcbiAgfSk6IHN0cmluZyB7XG4gICAgcGFyc2VyID0gcmVzb2x2ZSh0aGlzLnZhbHVlcywgcGFyc2VyKTtcbiAgICBsZXQgW2xlZnQsIC4uLnZhbHVlc10gPSBlbmNvZGUodGhpcy52YWx1ZXMsIHBhcnNlcik7XG5cbiAgICBsZWZ0ID0gcmVuZGVyKGxlZnQsIHtcbiAgICAgIGFsaWFzZXMsXG4gICAgICBlc2NhcGUsXG4gICAgICBwcmVmaXgsXG4gICAgICBwYXJzZXIsXG4gICAgICBub3JtYWxpemU6IHRoaXMubm9ybWFsaXplID09PSAnYWxsJyB8fCB0aGlzLm5vcm1hbGl6ZSA9PT0gJ2xlZnQnLFxuICAgIH0pO1xuICAgIGNvbnN0IHBhcmFtcyA9IFtcbiAgICAgIGxlZnQsXG4gICAgICAuLi52YWx1ZXMubWFwKCh2OiBhbnkpID0+XG4gICAgICAgIHJlbmRlcih2LCB7XG4gICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgcHJlZml4LFxuICAgICAgICAgIHBhcnNlcixcbiAgICAgICAgICBub3JtYWxpemU6IHRoaXMubm9ybWFsaXplID09PSAnYWxsJyB8fCB0aGlzLm5vcm1hbGl6ZSA9PT0gJ3JpZ2h0JyxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgIF07XG4gICAgcmV0dXJuIGAke3RoaXMubmFtZX0oJHtwYXJhbXMuam9pbignLCAnKX0pYDtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oXG4gICAgICB0aGlzLm5hbWUsXG4gICAgICB0aGlzLnZhbHVlcy5tYXAoKHYpID0+IE9iamVjdHMuY2xvbmUodikpLFxuICAgICAgdGhpcy5ub3JtYWxpemUsXG4gICAgICB0aGlzLmVzY2FwZSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdHJpbmdBbmRDb2xsZWN0aW9uRnVuY3Rpb25zPFQ+IHtcbiAgY29uY2F0KGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignY29uY2F0JywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuXG4gIGNvbnRhaW5zKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignY29udGFpbnMnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG5cbiAgZW5kc1dpdGgobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdlbmRzd2l0aCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBpbmRleE9mKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignaW5kZXhvZicsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBsZW5ndGgobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdsZW5ndGgnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBzdGFydHNXaXRoKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignc3RhcnRzd2l0aCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBzdWJTdHJpbmcoXG4gICAgbGVmdDogYW55LFxuICAgIHJpZ2h0OiBudW1iZXIsXG4gICAgbGVuZ3RoPzogbnVtYmVyLFxuICAgIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnLFxuICApIHtcbiAgICBsZXQgdmFsdWVzID0gW2xlZnQsIHJpZ2h0XTtcbiAgICBpZiAobGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlcy5wdXNoKGxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ3N1YnN0cmluZycsIHZhbHVlcywgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkZ1bmN0aW9uczxUPiB7XG4gIGhhc1N1YnNldChsZWZ0OiBULCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2hhc3N1YnNldCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgaGFzU3Vic2VxdWVuY2UobGVmdDogVCwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdoYXNzdWJzZXF1ZW5jZScsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0cmluZ0Z1bmN0aW9uczxUPiB7XG4gIG1hdGNoZXNQYXR0ZXJuKFxuICAgIGxlZnQ6IGFueSB8IHN0cmluZyxcbiAgICBwYXR0ZXJuOiBzdHJpbmcsXG4gICAgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScsXG4gICkge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ21hdGNoZXNQYXR0ZXJuJywgW2xlZnQsIHBhdHRlcm5dLCBub3JtYWxpemUpO1xuICB9XG4gIHRvTG93ZXIobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ3RvbG93ZXInLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgdG9VcHBlcihsZWZ0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPigndG91cHBlcicsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxuICB0cmltKGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCd0cmltJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRlQW5kVGltZUZ1bmN0aW9uczxUPiB7XG4gIGRhdGUobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2RhdGUnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgZGF5KGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdkYXknLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgZnJhY3Rpb25hbHNlY29uZHMobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2ZyYWN0aW9uYWxzZWNvbmRzJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG4gIGhvdXIobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2hvdXInLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgbWF4ZGF0ZXRpbWUobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ21heGRhdGV0aW1lJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG4gIG1pbmRhdGV0aW1lKGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdtaW5kYXRldGltZScsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBtaW51dGUobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ21pbnV0ZScsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBtb250aChsZWZ0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignbW9udGgnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgbm93KCkge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ25vdycsIFtdLCAnbm9uZScpO1xuICB9XG4gIHNlY29uZChsZWZ0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignc2Vjb25kJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG4gIHRpbWUobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ3RpbWUnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgdG90YWxvZmZzZXRtaW51dGVzKGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCd0b3RhbG9mZnNldG1pbnV0ZXMnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgdG90YWxzZWNvbmRzKGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCd0b3RhbHNlY29uZHMnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgeWVhcihsZWZ0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPigneWVhcicsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXJpdGhtZXRpY0Z1bmN0aW9uczxUPiB7XG4gIGNlaWxpbmcobGVmdDogVCB8IHN0cmluZywgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdjZWlsaW5nJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG4gIGZsb29yKGxlZnQ6IFQgfCBzdHJpbmcsIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignZmxvb3InLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgcm91bmQobGVmdDogVCB8IHN0cmluZywgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdyb3VuZCcsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHlwZUZ1bmN0aW9uczxUPiB7XG4gIGNhc3QobGVmdDogVCB8IHN0cmluZywgcmlnaHQ/OiBzdHJpbmcsIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2Nhc3QnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG5cbiAgaXNvZihsZWZ0OiBUIHwgc3RyaW5nLCByaWdodD86IHN0cmluZywgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignaXNvZicsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdlb0Z1bmN0aW9uczxUPiB7XG4gIGdlb0Rpc3RhbmNlKGxlZnQ6IFQsIHJpZ2h0OiBzdHJpbmcsIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2dlby5kaXN0YW5jZScsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgZ2VvSW50ZXJzZWN0cyhsZWZ0OiBULCByaWdodDogc3RyaW5nLCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdnZW8uaW50ZXJzZWN0cycsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgZ2VvTGVuZ3RoKGxlZnQ6IFQsIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignZ2VvLmxlbmd0aCcsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uYWxGdW5jdGlvbnM8VD4ge1xuICBjYXNlKGxlZnQ6IFQgfCBzdHJpbmcsIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignY2FzZScsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9wZXJhdG9yPFQ+IGltcGxlbWVudHMgUmVuZGVyYWJsZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBvcDogc3RyaW5nLFxuICAgIHByb3RlY3RlZCB2YWx1ZXM6IGFueVtdLFxuICAgIHByb3RlY3RlZCBub3JtYWxpemU6IE5vcm1hbGl6ZSxcbiAgKSB7fVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ09wZXJhdG9yJztcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHR5cGU6IFR5cGVzLnJhd1R5cGUodGhpcyksXG4gICAgICBvcDogdGhpcy5vcCxcbiAgICAgIHZhbHVlczogdGhpcy52YWx1ZXMubWFwKCh2KSA9PlxuICAgICAgICBUeXBlcy5pc09iamVjdCh2KSAmJiAndG9KU09OJyBpbiB2ID8gdi50b0pTT04oKSA6IHYsXG4gICAgICApLFxuICAgICAgbm9ybWFsaXplOiB0aGlzLm5vcm1hbGl6ZSxcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyKHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgICBwcmVmaXgsXG4gICAgcGFyc2VyLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxUPjtcbiAgfSk6IHN0cmluZyB7XG4gICAgcGFyc2VyID0gcmVzb2x2ZSh0aGlzLnZhbHVlcywgcGFyc2VyKTtcbiAgICBsZXQgW2xlZnQsIHJpZ2h0XSA9IGVuY29kZSh0aGlzLnZhbHVlcywgcGFyc2VyKTtcblxuICAgIGxlZnQgPSByZW5kZXIobGVmdCwge1xuICAgICAgYWxpYXNlcyxcbiAgICAgIGVzY2FwZSxcbiAgICAgIHByZWZpeCxcbiAgICAgIHBhcnNlcixcbiAgICAgIG5vcm1hbGl6ZTogdGhpcy5ub3JtYWxpemUgPT09ICdhbGwnIHx8IHRoaXMubm9ybWFsaXplID09PSAnbGVmdCcsXG4gICAgfSk7XG4gICAgaWYgKHJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJpZ2h0ID0gQXJyYXkuaXNBcnJheShyaWdodClcbiAgICAgICAgPyBgKCR7cmlnaHRcbiAgICAgICAgICAgIC5tYXAoKHYpID0+XG4gICAgICAgICAgICAgIHJlbmRlcih2LCB7XG4gICAgICAgICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgICAgICAgcHJlZml4LFxuICAgICAgICAgICAgICAgIHBhcnNlcixcbiAgICAgICAgICAgICAgICBub3JtYWxpemU6XG4gICAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZSA9PT0gJ2FsbCcgfHwgdGhpcy5ub3JtYWxpemUgPT09ICdyaWdodCcsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oJywnKX0pYFxuICAgICAgICA6IHJlbmRlcihyaWdodCwge1xuICAgICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICAgIGVzY2FwZSxcbiAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgIHBhcnNlcixcbiAgICAgICAgICAgIG5vcm1hbGl6ZTogdGhpcy5ub3JtYWxpemUgPT09ICdhbGwnIHx8IHRoaXMubm9ybWFsaXplID09PSAncmlnaHQnLFxuICAgICAgICAgIH0pO1xuICAgICAgcmV0dXJuIGAke2xlZnR9ICR7dGhpcy5vcH0gJHtyaWdodH1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5vcH0oJHtsZWZ0fSlgO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcihcbiAgICAgIHRoaXMub3AsXG4gICAgICB0aGlzLnZhbHVlcy5tYXAoKHYpID0+IE9iamVjdHMuY2xvbmUodikpLFxuICAgICAgdGhpcy5ub3JtYWxpemUsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTG9naWNhbE9wZXJhdG9yczxUPiB7XG4gIGVxKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignZXEnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIG5lKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignbmUnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIGd0KGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignZ3QnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIGdlKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignZ2UnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIGx0KGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignbHQnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIGxlKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignbGUnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIC8qXG4gIGFuZChsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ2FuZCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgb3IobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IE9wZXJhdG9yKCdvcicsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgKi9cbiAgbm90KGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IE9wZXJhdG9yPFQ+KCdub3QnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgaGFzKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignaGFzJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBpbihsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ2luJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXJpdGhtZXRpY09wZXJhdG9yczxUPiB7XG4gIGFkZChsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3I8VD4oJ2FkZCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgc3ViKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignc3ViJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBtdWwobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IE9wZXJhdG9yKCdtdWwnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIGRpdihsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ2RpdicsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgbW9kKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignbW9kJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBuZWcodmFsdWU6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignLScsIFt2YWx1ZV0sIG5vcm1hbGl6ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdyb3VwaW5nPFQ+IGltcGxlbWVudHMgUmVuZGVyYWJsZSB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBncm91cDogUmVuZGVyYWJsZSkge31cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdHcm91cGluZyc7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICR0eXBlOiBUeXBlcy5yYXdUeXBlKHRoaXMpLFxuICAgICAgZ3JvdXA6IHRoaXMuZ3JvdXAudG9KU09OKCksXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7XG4gICAgYWxpYXNlcyxcbiAgICBlc2NhcGUsXG4gICAgcHJlZml4LFxuICAgIHBhcnNlcixcbiAgfToge1xuICAgIGFsaWFzZXM/OiBRdWVyeUN1c3RvbVR5cGVbXTtcbiAgICBlc2NhcGU/OiBib29sZWFuO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICBwYXJzZXI/OiBQYXJzZXI8VD47XG4gIH0pOiBzdHJpbmcge1xuICAgIHJldHVybiBgKCR7cmVuZGVyKHRoaXMuZ3JvdXAsIHsgYWxpYXNlcywgZXNjYXBlLCBwcmVmaXgsIHBhcnNlciB9KX0pYDtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgR3JvdXBpbmcoT2JqZWN0cy5jbG9uZSh0aGlzLmdyb3VwKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExhbWJkYTxUPiBpbXBsZW1lbnRzIFJlbmRlcmFibGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgb3A6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgdmFsdWVzOiBhbnlbXSxcbiAgICBwcm90ZWN0ZWQgYWxpYXM/OiBzdHJpbmcsXG4gICkge31cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdMYW1iZGEnO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkdHlwZTogVHlwZXMucmF3VHlwZSh0aGlzKSxcbiAgICAgIG9wOiB0aGlzLm9wLFxuICAgICAgdmFsdWVzOiB0aGlzLnZhbHVlcy5tYXAoKHYpID0+XG4gICAgICAgIFR5cGVzLmlzT2JqZWN0KHYpICYmICd0b0pTT04nIGluIHYgPyB2LnRvSlNPTigpIDogdixcbiAgICAgICksXG4gICAgICBhbGlhczogdGhpcy5hbGlhcyxcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyKHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgICBwcmVmaXgsXG4gICAgcGFyc2VyLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxUPjtcbiAgfSk6IHN0cmluZyB7XG4gICAgcGFyc2VyID0gcmVzb2x2ZSh0aGlzLnZhbHVlcywgcGFyc2VyKTtcbiAgICBsZXQgW2xlZnQsIHJpZ2h0XSA9IGVuY29kZSh0aGlzLnZhbHVlcywgcGFyc2VyKTtcblxuICAgIGxlZnQgPSByZW5kZXIobGVmdCwgeyBhbGlhc2VzLCBlc2NhcGUsIHByZWZpeCwgcGFyc2VyIH0pO1xuICAgIGlmIChyaWdodCkge1xuICAgICAgbGV0IGFsaWFzID0gdGhpcy5hbGlhcyB8fCBsZWZ0LnNwbGl0KCcvJykucG9wKCkudG9Mb3dlckNhc2UoKVswXTtcbiAgICAgIHJldHVybiBgJHtsZWZ0fS8ke3RoaXMub3B9KCR7YWxpYXN9OiR7cmVuZGVyKHJpZ2h0LCB7XG4gICAgICAgIGFsaWFzZXMsXG4gICAgICAgIGVzY2FwZSxcbiAgICAgICAgcHJlZml4OiBhbGlhcyxcbiAgICAgICAgcGFyc2VyLFxuICAgICAgfSl9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHtsZWZ0fS8ke3RoaXMub3B9KClgO1xuICAgIH1cbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgTGFtYmRhKFxuICAgICAgdGhpcy5vcCxcbiAgICAgIHRoaXMudmFsdWVzLm1hcCgodikgPT4gT2JqZWN0cy5jbG9uZSh2KSksXG4gICAgICB0aGlzLmFsaWFzLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExhbWJkYU9wZXJhdG9yczxUPiB7XG4gIGFueShsZWZ0OiBULCByaWdodDogYW55LCBhbGlhcz86IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgTGFtYmRhKCdhbnknLCBbbGVmdCwgcmlnaHRdLCBhbGlhcyk7XG4gIH1cblxuICBhbGwobGVmdDogVCwgcmlnaHQ6IGFueSwgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYSgnYWxsJywgW2xlZnQsIHJpZ2h0XSwgYWxpYXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YU9wZXJhdG9yczxUPiB7fVxuZXhwb3J0IGludGVyZmFjZSBPRGF0YU9wZXJhdG9yczxUPlxuICBleHRlbmRzIExvZ2ljYWxPcGVyYXRvcnM8VD4sXG4gICAgQXJpdGhtZXRpY09wZXJhdG9yczxUPixcbiAgICBMYW1iZGFPcGVyYXRvcnM8VD4ge31cblxuYXBwbHlNaXhpbnMoT0RhdGFPcGVyYXRvcnMsIFtcbiAgTG9naWNhbE9wZXJhdG9ycyxcbiAgQXJpdGhtZXRpY09wZXJhdG9ycyxcbiAgTGFtYmRhT3BlcmF0b3JzLFxuXSk7XG5leHBvcnQgY29uc3Qgb3BlcmF0b3JzOiBPRGF0YU9wZXJhdG9yczxhbnk+ID0gbmV3IE9EYXRhT3BlcmF0b3JzPGFueT4oKTtcblxuZXhwb3J0IGNsYXNzIE9EYXRhRnVuY3Rpb25zPFQ+IHt9XG5leHBvcnQgaW50ZXJmYWNlIE9EYXRhRnVuY3Rpb25zPFQ+XG4gIGV4dGVuZHMgU3RyaW5nQW5kQ29sbGVjdGlvbkZ1bmN0aW9uczxUPixcbiAgICBDb2xsZWN0aW9uRnVuY3Rpb25zPFQ+LFxuICAgIFN0cmluZ0Z1bmN0aW9uczxUPixcbiAgICBEYXRlQW5kVGltZUZ1bmN0aW9uczxUPixcbiAgICBBcml0aG1ldGljRnVuY3Rpb25zPFQ+LFxuICAgIFR5cGVGdW5jdGlvbnM8VD4sXG4gICAgR2VvRnVuY3Rpb25zPFQ+LFxuICAgIENvbmRpdGlvbmFsRnVuY3Rpb25zPFQ+IHt9XG5cbmFwcGx5TWl4aW5zKE9EYXRhRnVuY3Rpb25zLCBbXG4gIFN0cmluZ0FuZENvbGxlY3Rpb25GdW5jdGlvbnMsXG4gIENvbGxlY3Rpb25GdW5jdGlvbnMsXG4gIFN0cmluZ0Z1bmN0aW9ucyxcbiAgRGF0ZUFuZFRpbWVGdW5jdGlvbnMsXG4gIEFyaXRobWV0aWNGdW5jdGlvbnMsXG4gIFR5cGVGdW5jdGlvbnMsXG4gIEdlb0Z1bmN0aW9ucyxcbiAgQ29uZGl0aW9uYWxGdW5jdGlvbnMsXG5dKTtcbmV4cG9ydCBjb25zdCBmdW5jdGlvbnM6IE9EYXRhRnVuY3Rpb25zPGFueT4gPSBuZXcgT0RhdGFGdW5jdGlvbnM8YW55PigpO1xuXG5leHBvcnQgY2xhc3MgT0RhdGFTeW50YXg8VD4ge31cbmV4cG9ydCBpbnRlcmZhY2UgT0RhdGFTeW50YXg8VD4gZXh0ZW5kcyBPRGF0YU9wZXJhdG9yczxUPiwgT0RhdGFGdW5jdGlvbnM8VD4ge31cbmFwcGx5TWl4aW5zKE9EYXRhU3ludGF4LCBbT0RhdGFPcGVyYXRvcnMsIE9EYXRhRnVuY3Rpb25zXSk7XG5cbmV4cG9ydCBjb25zdCBzeW50YXg6IE9EYXRhU3ludGF4PGFueT4gPSBuZXcgT0RhdGFTeW50YXg8YW55PigpO1xuIl19