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,175 @@
1
+ import { of, throwError } from 'rxjs';
2
+ import { startWith, tap } from 'rxjs/operators';
3
+ import { CACHE_KEY_SEPARATOR, DEFAULT_TIMEOUT } from '../constants';
4
+ import { PathSegment } from '../types';
5
+ export class ODataCache {
6
+ constructor({ timeout = DEFAULT_TIMEOUT }) {
7
+ this.timeout = timeout;
8
+ this.entries = new Map();
9
+ }
10
+ /**
11
+ * Using the resource on the request build an array of string to identify the scope of the request
12
+ * @param req The request with the resource to build the scope
13
+ * @returns Array of string to identify the scope of the request
14
+ */
15
+ scope(req) {
16
+ const segments = req.resource.cloneSegments();
17
+ return segments.segments({ key: true }).reduce((acc, s) => {
18
+ if (s.name === PathSegment.entitySet)
19
+ acc = [...acc, s.path()];
20
+ return acc;
21
+ }, ['request']);
22
+ }
23
+ /**
24
+ * Using the odata context on the response build an array of string to identify the tags of the response
25
+ * @param res The response to build the tags
26
+ * @returns Array of string to identify the tags of the response
27
+ */
28
+ tags(res) {
29
+ const tags = [];
30
+ const context = res.context;
31
+ if (context.entitySet) {
32
+ tags.push(context.key
33
+ ? `${context.entitySet}(${context.key})`
34
+ : context.entitySet);
35
+ }
36
+ if (context.type)
37
+ tags.push(context.type);
38
+ return tags;
39
+ }
40
+ /**
41
+ * Build an entry from a payload and some options
42
+ * @param payload The payload to store in the cache
43
+ * @param timeout The timeout for the entry
44
+ * @param tags The tags for the entry
45
+ * @returns The entry to store in the cache
46
+ */
47
+ buildEntry(payload, { timeout, tags }) {
48
+ return {
49
+ payload,
50
+ lastRead: Date.now(),
51
+ timeout: timeout || this.timeout,
52
+ tags: tags || [],
53
+ };
54
+ }
55
+ /**
56
+ * Build a key from store an entry in the cache
57
+ * @param names The names of the entry
58
+ * @returns The key for the entry
59
+ */
60
+ buildKey(names) {
61
+ return names.join(CACHE_KEY_SEPARATOR);
62
+ }
63
+ /**
64
+ * Put some payload in the cache
65
+ * @param name The name for the entry
66
+ * @param payload The payload to store in the cache
67
+ * @param timeout The timeout for the entry
68
+ * @param scope The scope for the entry
69
+ * @param tags The tags for the entry
70
+ */
71
+ put(name, payload, { timeout, scope, tags, } = {}) {
72
+ const entry = this.buildEntry(payload, { timeout, tags });
73
+ const key = this.buildKey([...(scope || []), name]);
74
+ this.entries.set(key, entry);
75
+ this.forget();
76
+ }
77
+ /**
78
+ * Return the payload from the cache if it exists and is not expired
79
+ * @param name The name of the entry
80
+ * @param scope The scope of the entry
81
+ * @returns The payload of the entry
82
+ */
83
+ get(name, { scope } = {}) {
84
+ const key = this.buildKey([...(scope || []), name]);
85
+ const entry = this.entries.get(key);
86
+ return entry !== undefined && !this.isExpired(entry)
87
+ ? entry.payload
88
+ : undefined;
89
+ }
90
+ /**
91
+ * Remove all cache entries that are matching with the given options
92
+ * @param options The options to forget
93
+ */
94
+ forget({ name, scope = [], tags = [], } = {}) {
95
+ if (name !== undefined)
96
+ scope.push(name);
97
+ const key = scope.length > 0 ? this.buildKey(scope) : undefined;
98
+ this.entries.forEach((entry, k) => {
99
+ if (this.isExpired(entry) || // Expired
100
+ (key !== undefined && k.startsWith(key)) || // Key
101
+ (tags.length > 0 && tags.some((t) => entry.tags.indexOf(t) !== -1)) // Tags
102
+ ) {
103
+ this.entries.delete(k);
104
+ }
105
+ });
106
+ }
107
+ /**
108
+ * Remove all cache entries
109
+ */
110
+ flush() {
111
+ this.entries = new Map();
112
+ }
113
+ /**
114
+ * Check if the entry is expired
115
+ * @param entry The cache entry
116
+ * @returns Boolean indicating if the entry is expired
117
+ */
118
+ isExpired(entry) {
119
+ return entry.lastRead < Date.now() - (entry.timeout || this.timeout) * 1000;
120
+ }
121
+ /**
122
+ * Using the request, handle the fetching of the response
123
+ * @param req The request to fetch
124
+ * @param res$ Observable of the response
125
+ * @returns
126
+ */
127
+ handleRequest(req, res$) {
128
+ return req.isFetch()
129
+ ? this.handleFetch(req, res$)
130
+ : req.isMutate()
131
+ ? this.handleMutate(req, res$)
132
+ : res$;
133
+ }
134
+ handleFetch(req, res$) {
135
+ const policy = req.fetchPolicy;
136
+ const cached = this.getResponse(req);
137
+ if (policy === 'no-cache') {
138
+ return res$;
139
+ }
140
+ if (policy === 'cache-only') {
141
+ if (cached) {
142
+ return of(cached);
143
+ }
144
+ else {
145
+ return throwError(() => new Error('No Cached'));
146
+ }
147
+ }
148
+ if (policy === 'cache-first' ||
149
+ policy === 'cache-and-network' ||
150
+ policy === 'network-only') {
151
+ res$ = res$.pipe(tap((res) => {
152
+ if (res.options.cacheability !== 'no-store')
153
+ this.putResponse(req, res);
154
+ }));
155
+ }
156
+ return cached !== undefined && policy !== 'network-only'
157
+ ? policy === 'cache-and-network'
158
+ ? res$.pipe(startWith(cached))
159
+ : of(cached)
160
+ : res$;
161
+ }
162
+ handleMutate(req, res$) {
163
+ const requests = req.isBatch()
164
+ ? req.resource
165
+ .requests()
166
+ .filter((r) => r.isMutate())
167
+ : [req];
168
+ for (var r of requests) {
169
+ const scope = this.scope(r);
170
+ this.forget({ scope });
171
+ }
172
+ return res$;
173
+ }
174
+ }
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvY2FjaGUvY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXBFLE9BQU8sRUFBUyxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFnQjlDLE1BQU0sT0FBZ0IsVUFBVTtJQUk5QixZQUFZLEVBQUUsT0FBTyxHQUFHLGVBQWUsRUFBd0I7UUFDN0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUN6RCxDQUFDO0lBS0Q7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxHQUFzQjtRQUMxQixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlDLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FDNUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDVCxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLFNBQVM7Z0JBQ2xDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQVksQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUNELENBQUMsU0FBUyxDQUFDLENBQ1osQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUFDLEdBQXVCO1FBQzFCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoQixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQzVCLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUNyQixJQUFJLENBQUMsSUFBSSxDQUNQLE9BQU8sQ0FBQyxHQUFHO2dCQUNULENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLEdBQUcsR0FBRztnQkFDeEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3RCLENBQUM7U0FDSDtRQUNELElBQUksT0FBTyxDQUFDLElBQUk7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxVQUFVLENBQ1IsT0FBVSxFQUNWLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBeUM7UUFFeEQsT0FBTztZQUNMLE9BQU87WUFDUCxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNwQixPQUFPLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPO1lBQ2hDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtTQUNqQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxRQUFRLENBQUMsS0FBZTtRQUN0QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEdBQUcsQ0FDRCxJQUFZLEVBQ1osT0FBVSxFQUNWLEVBQ0UsT0FBTyxFQUNQLEtBQUssRUFDTCxJQUFJLE1BQ3VELEVBQUU7UUFFL0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBSSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsR0FBRyxDQUFJLElBQVksRUFBRSxFQUFFLEtBQUssS0FBMkIsRUFBRTtRQUN2RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQ2xELENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTztZQUNmLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxFQUNMLElBQUksRUFDSixLQUFLLEdBQUcsRUFBRSxFQUNWLElBQUksR0FBRyxFQUFFLE1BQytDLEVBQUU7UUFDMUQsSUFBSSxJQUFJLEtBQUssU0FBUztZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoQyxJQUNFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksVUFBVTtnQkFDbkMsQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNO2dCQUNsRCxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO2NBQzNFO2dCQUNBLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxLQUEyQjtRQUNuQyxPQUFPLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzlFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGFBQWEsQ0FDWCxHQUFzQixFQUN0QixJQUFvQztRQUVwQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLEVBQUU7WUFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztZQUM3QixDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtnQkFDaEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztnQkFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFFTyxXQUFXLENBQ2pCLEdBQXNCLEVBQ3RCLElBQW9DO1FBRXBDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLE1BQU0sS0FBSyxVQUFVLEVBQUU7WUFDekIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELElBQUksTUFBTSxLQUFLLFlBQVksRUFBRTtZQUMzQixJQUFJLE1BQU0sRUFBRTtnQkFDVixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNuQjtpQkFBTTtnQkFDTCxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2FBQ2pEO1NBQ0Y7UUFDRCxJQUNFLE1BQU0sS0FBSyxhQUFhO1lBQ3hCLE1BQU0sS0FBSyxtQkFBbUI7WUFDOUIsTUFBTSxLQUFLLGNBQWMsRUFDekI7WUFDQSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDZCxHQUFHLENBQUMsQ0FBQyxHQUF1QixFQUFFLEVBQUU7Z0JBQzlCLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEtBQUssVUFBVTtvQkFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztTQUNIO1FBQ0QsT0FBTyxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxjQUFjO1lBQ3RELENBQUMsQ0FBQyxNQUFNLEtBQUssbUJBQW1CO2dCQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzlCLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFFTyxZQUFZLENBQ2xCLEdBQXNCLEVBQ3RCLElBQW9DO1FBRXBDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUU7WUFDNUIsQ0FBQyxDQUFFLEdBQUcsQ0FBQyxRQUErQjtpQkFDakMsUUFBUSxFQUFFO2lCQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsS0FBSyxJQUFJLENBQUMsSUFBSSxRQUFRLEVBQUU7WUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN4QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHN0YXJ0V2l0aCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ0FDSEVfS0VZX1NFUEFSQVRPUiwgREVGQVVMVF9USU1FT1VUIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhQmF0Y2hSZXNvdXJjZSwgT0RhdGFSZXF1ZXN0LCBPRGF0YVJlc3BvbnNlIH0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IENhY2hlLCBQYXRoU2VnbWVudCB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBBIGNhY2hlIGVudHJ5IHRoYXQgaG9sZHMgYSBwYXlsb2FkLCBhIGxhc3QgcmVhZCB0aW1lLCBhbmQgYSB0aW1lb3V0IGZvciB0aGUgZW50cnkuXG4gKiBAcGFyYW0gcGF5bG9hZCBUaGUgcGF5bG9hZCB0byBjYWNoZS5cbiAqIEBwYXJhbSBsYXN0UmVhZCBUaGUgbGFzdCByZWFkIHRpbWUuXG4gKiBAcGFyYW0gdGltZW91dCBUaGUgdGltZW91dC5cbiAqIEBwYXJhbSB0YWdzIFNvbWUgdGFncyB0byBpZGVudGlmeSB0aGUgZW50cnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT0RhdGFDYWNoZUVudHJ5PFQ+IHtcbiAgcGF5bG9hZDogVDtcbiAgbGFzdFJlYWQ6IG51bWJlcjtcbiAgdGltZW91dDogbnVtYmVyO1xuICB0YWdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE9EYXRhQ2FjaGUgaW1wbGVtZW50cyBDYWNoZSB7XG4gIHRpbWVvdXQ6IG51bWJlcjtcbiAgZW50cmllczogTWFwPHN0cmluZywgT0RhdGFDYWNoZUVudHJ5PGFueT4+O1xuXG4gIGNvbnN0cnVjdG9yKHsgdGltZW91dCA9IERFRkFVTFRfVElNRU9VVCB9OiB7IHRpbWVvdXQ/OiBudW1iZXIgfSkge1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIE9EYXRhQ2FjaGVFbnRyeTxhbnk+PigpO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0UmVzcG9uc2UocmVxOiBPRGF0YVJlcXVlc3Q8YW55Pik6IE9EYXRhUmVzcG9uc2U8YW55PiB8IHVuZGVmaW5lZDtcbiAgYWJzdHJhY3QgcHV0UmVzcG9uc2UocmVxOiBPRGF0YVJlcXVlc3Q8YW55PiwgcmVzOiBPRGF0YVJlc3BvbnNlPGFueT4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBVc2luZyB0aGUgcmVzb3VyY2Ugb24gdGhlIHJlcXVlc3QgYnVpbGQgYW4gYXJyYXkgb2Ygc3RyaW5nIHRvIGlkZW50aWZ5IHRoZSBzY29wZSBvZiB0aGUgcmVxdWVzdFxuICAgKiBAcGFyYW0gcmVxIFRoZSByZXF1ZXN0IHdpdGggdGhlIHJlc291cmNlIHRvIGJ1aWxkIHRoZSBzY29wZVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIHNjb3BlIG9mIHRoZSByZXF1ZXN0XG4gICAqL1xuICBzY29wZShyZXE6IE9EYXRhUmVxdWVzdDxhbnk+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gcmVxLnJlc291cmNlLmNsb25lU2VnbWVudHMoKTtcbiAgICByZXR1cm4gc2VnbWVudHMuc2VnbWVudHMoeyBrZXk6IHRydWUgfSkucmVkdWNlKFxuICAgICAgKGFjYywgcykgPT4ge1xuICAgICAgICBpZiAocy5uYW1lID09PSBQYXRoU2VnbWVudC5lbnRpdHlTZXQpXG4gICAgICAgICAgYWNjID0gWy4uLmFjYywgcy5wYXRoKCkgYXMgc3RyaW5nXTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICBbJ3JlcXVlc3QnXSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzaW5nIHRoZSBvZGF0YSBjb250ZXh0IG9uIHRoZSByZXNwb25zZSBidWlsZCBhbiBhcnJheSBvZiBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIHRhZ3Mgb2YgdGhlIHJlc3BvbnNlXG4gICAqIEBwYXJhbSByZXMgVGhlIHJlc3BvbnNlIHRvIGJ1aWxkIHRoZSB0YWdzXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHN0cmluZyB0byBpZGVudGlmeSB0aGUgdGFncyBvZiB0aGUgcmVzcG9uc2VcbiAgICovXG4gIHRhZ3MocmVzOiBPRGF0YVJlc3BvbnNlPGFueT4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdGFncyA9IFtdO1xuICAgIGNvbnN0IGNvbnRleHQgPSByZXMuY29udGV4dDtcbiAgICBpZiAoY29udGV4dC5lbnRpdHlTZXQpIHtcbiAgICAgIHRhZ3MucHVzaChcbiAgICAgICAgY29udGV4dC5rZXlcbiAgICAgICAgICA/IGAke2NvbnRleHQuZW50aXR5U2V0fSgke2NvbnRleHQua2V5fSlgXG4gICAgICAgICAgOiBjb250ZXh0LmVudGl0eVNldCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LnR5cGUpIHRhZ3MucHVzaChjb250ZXh0LnR5cGUpO1xuICAgIHJldHVybiB0YWdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIGVudHJ5IGZyb20gYSBwYXlsb2FkIGFuZCBzb21lIG9wdGlvbnNcbiAgICogQHBhcmFtIHBheWxvYWQgVGhlIHBheWxvYWQgdG8gc3RvcmUgaW4gdGhlIGNhY2hlXG4gICAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lb3V0IGZvciB0aGUgZW50cnlcbiAgICogQHBhcmFtIHRhZ3MgVGhlIHRhZ3MgZm9yIHRoZSBlbnRyeVxuICAgKiBAcmV0dXJucyBUaGUgZW50cnkgdG8gc3RvcmUgaW4gdGhlIGNhY2hlXG4gICAqL1xuICBidWlsZEVudHJ5PFQ+KFxuICAgIHBheWxvYWQ6IFQsXG4gICAgeyB0aW1lb3V0LCB0YWdzIH06IHsgdGltZW91dD86IG51bWJlcjsgdGFncz86IHN0cmluZ1tdIH0sXG4gICk6IE9EYXRhQ2FjaGVFbnRyeTxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBheWxvYWQsXG4gICAgICBsYXN0UmVhZDogRGF0ZS5ub3coKSxcbiAgICAgIHRpbWVvdXQ6IHRpbWVvdXQgfHwgdGhpcy50aW1lb3V0LFxuICAgICAgdGFnczogdGFncyB8fCBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEga2V5IGZyb20gc3RvcmUgYW4gZW50cnkgaW4gdGhlIGNhY2hlXG4gICAqIEBwYXJhbSBuYW1lcyBUaGUgbmFtZXMgb2YgdGhlIGVudHJ5XG4gICAqIEByZXR1cm5zIFRoZSBrZXkgZm9yIHRoZSBlbnRyeVxuICAgKi9cbiAgYnVpbGRLZXkobmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZXMuam9pbihDQUNIRV9LRVlfU0VQQVJBVE9SKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgc29tZSBwYXlsb2FkIGluIHRoZSBjYWNoZVxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBmb3IgdGhlIGVudHJ5XG4gICAqIEBwYXJhbSBwYXlsb2FkIFRoZSBwYXlsb2FkIHRvIHN0b3JlIGluIHRoZSBjYWNoZVxuICAgKiBAcGFyYW0gdGltZW91dCBUaGUgdGltZW91dCBmb3IgdGhlIGVudHJ5XG4gICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgZm9yIHRoZSBlbnRyeVxuICAgKiBAcGFyYW0gdGFncyBUaGUgdGFncyBmb3IgdGhlIGVudHJ5XG4gICAqL1xuICBwdXQ8VD4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IFQsXG4gICAge1xuICAgICAgdGltZW91dCxcbiAgICAgIHNjb3BlLFxuICAgICAgdGFncyxcbiAgICB9OiB7IHRpbWVvdXQ/OiBudW1iZXI7IHNjb3BlPzogc3RyaW5nW107IHRhZ3M/OiBzdHJpbmdbXSB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5idWlsZEVudHJ5PFQ+KHBheWxvYWQsIHsgdGltZW91dCwgdGFncyB9KTtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkS2V5KFsuLi4oc2NvcGUgfHwgW10pLCBuYW1lXSk7XG4gICAgdGhpcy5lbnRyaWVzLnNldChrZXksIGVudHJ5KTtcbiAgICB0aGlzLmZvcmdldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcGF5bG9hZCBmcm9tIHRoZSBjYWNoZSBpZiBpdCBleGlzdHMgYW5kIGlzIG5vdCBleHBpcmVkXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBlbnRyeVxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIG9mIHRoZSBlbnRyeVxuICAgKiBAcmV0dXJucyBUaGUgcGF5bG9hZCBvZiB0aGUgZW50cnlcbiAgICovXG4gIGdldDxUPihuYW1lOiBzdHJpbmcsIHsgc2NvcGUgfTogeyBzY29wZT86IHN0cmluZ1tdIH0gPSB7fSk6IFQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuYnVpbGRLZXkoWy4uLihzY29wZSB8fCBbXSksIG5hbWVdKTtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KTtcbiAgICByZXR1cm4gZW50cnkgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pc0V4cGlyZWQoZW50cnkpXG4gICAgICA/IGVudHJ5LnBheWxvYWRcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgY2FjaGUgZW50cmllcyB0aGF0IGFyZSBtYXRjaGluZyB3aXRoIHRoZSBnaXZlbiBvcHRpb25zXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGZvcmdldFxuICAgKi9cbiAgZm9yZ2V0KHtcbiAgICBuYW1lLFxuICAgIHNjb3BlID0gW10sXG4gICAgdGFncyA9IFtdLFxuICB9OiB7IG5hbWU/OiBzdHJpbmc7IHNjb3BlPzogc3RyaW5nW107IHRhZ3M/OiBzdHJpbmdbXSB9ID0ge30pIHtcbiAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSBzY29wZS5wdXNoKG5hbWUpO1xuICAgIGNvbnN0IGtleSA9IHNjb3BlLmxlbmd0aCA+IDAgPyB0aGlzLmJ1aWxkS2V5KHNjb3BlKSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnksIGspID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc0V4cGlyZWQoZW50cnkpIHx8IC8vIEV4cGlyZWRcbiAgICAgICAgKGtleSAhPT0gdW5kZWZpbmVkICYmIGsuc3RhcnRzV2l0aChrZXkpKSB8fCAvLyBLZXlcbiAgICAgICAgKHRhZ3MubGVuZ3RoID4gMCAmJiB0YWdzLnNvbWUoKHQpID0+IGVudHJ5LnRhZ3MuaW5kZXhPZih0KSAhPT0gLTEpKSAvLyBUYWdzXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGNhY2hlIGVudHJpZXNcbiAgICovXG4gIGZsdXNoKCkge1xuICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBPRGF0YUNhY2hlRW50cnk8YW55Pj4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgZW50cnkgaXMgZXhwaXJlZFxuICAgKiBAcGFyYW0gZW50cnkgVGhlIGNhY2hlIGVudHJ5XG4gICAqIEByZXR1cm5zIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgZW50cnkgaXMgZXhwaXJlZFxuICAgKi9cbiAgaXNFeHBpcmVkKGVudHJ5OiBPRGF0YUNhY2hlRW50cnk8YW55Pikge1xuICAgIHJldHVybiBlbnRyeS5sYXN0UmVhZCA8IERhdGUubm93KCkgLSAoZW50cnkudGltZW91dCB8fCB0aGlzLnRpbWVvdXQpICogMTAwMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2luZyB0aGUgcmVxdWVzdCwgaGFuZGxlIHRoZSBmZXRjaGluZyBvZiB0aGUgcmVzcG9uc2VcbiAgICogQHBhcmFtIHJlcSBUaGUgcmVxdWVzdCB0byBmZXRjaFxuICAgKiBAcGFyYW0gcmVzJCBPYnNlcnZhYmxlIG9mIHRoZSByZXNwb25zZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgaGFuZGxlUmVxdWVzdChcbiAgICByZXE6IE9EYXRhUmVxdWVzdDxhbnk+LFxuICAgIHJlcyQ6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxhbnk+PixcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPGFueT4+IHtcbiAgICByZXR1cm4gcmVxLmlzRmV0Y2goKVxuICAgICAgPyB0aGlzLmhhbmRsZUZldGNoKHJlcSwgcmVzJClcbiAgICAgIDogcmVxLmlzTXV0YXRlKClcbiAgICAgID8gdGhpcy5oYW5kbGVNdXRhdGUocmVxLCByZXMkKVxuICAgICAgOiByZXMkO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGZXRjaChcbiAgICByZXE6IE9EYXRhUmVxdWVzdDxhbnk+LFxuICAgIHJlcyQ6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxhbnk+PixcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPGFueT4+IHtcbiAgICBjb25zdCBwb2xpY3kgPSByZXEuZmV0Y2hQb2xpY3k7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5nZXRSZXNwb25zZShyZXEpO1xuICAgIGlmIChwb2xpY3kgPT09ICduby1jYWNoZScpIHtcbiAgICAgIHJldHVybiByZXMkO1xuICAgIH1cbiAgICBpZiAocG9saWN5ID09PSAnY2FjaGUtb25seScpIHtcbiAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgcmV0dXJuIG9mKGNhY2hlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ05vIENhY2hlZCcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgcG9saWN5ID09PSAnY2FjaGUtZmlyc3QnIHx8XG4gICAgICBwb2xpY3kgPT09ICdjYWNoZS1hbmQtbmV0d29yaycgfHxcbiAgICAgIHBvbGljeSA9PT0gJ25ldHdvcmstb25seSdcbiAgICApIHtcbiAgICAgIHJlcyQgPSByZXMkLnBpcGUoXG4gICAgICAgIHRhcCgocmVzOiBPRGF0YVJlc3BvbnNlPGFueT4pID0+IHtcbiAgICAgICAgICBpZiAocmVzLm9wdGlvbnMuY2FjaGVhYmlsaXR5ICE9PSAnbm8tc3RvcmUnKVxuICAgICAgICAgICAgdGhpcy5wdXRSZXNwb25zZShyZXEsIHJlcyk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZCAhPT0gdW5kZWZpbmVkICYmIHBvbGljeSAhPT0gJ25ldHdvcmstb25seSdcbiAgICAgID8gcG9saWN5ID09PSAnY2FjaGUtYW5kLW5ldHdvcmsnXG4gICAgICAgID8gcmVzJC5waXBlKHN0YXJ0V2l0aChjYWNoZWQpKVxuICAgICAgICA6IG9mKGNhY2hlZClcbiAgICAgIDogcmVzJDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTXV0YXRlKFxuICAgIHJlcTogT0RhdGFSZXF1ZXN0PGFueT4sXG4gICAgcmVzJDogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPGFueT4+LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8YW55Pj4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gcmVxLmlzQmF0Y2goKVxuICAgICAgPyAocmVxLnJlc291cmNlIGFzIE9EYXRhQmF0Y2hSZXNvdXJjZSlcbiAgICAgICAgICAucmVxdWVzdHMoKVxuICAgICAgICAgIC5maWx0ZXIoKHIpID0+IHIuaXNNdXRhdGUoKSlcbiAgICAgIDogW3JlcV07XG4gICAgZm9yICh2YXIgciBvZiByZXF1ZXN0cykge1xuICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlKHIpO1xuICAgICAgdGhpcy5mb3JnZXQoeyBzY29wZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcyQ7XG4gIH1cbn1cbiJdfQ==
@@ -52,4 +52,4 @@ export class ODataInStorageCache extends ODataCache {
52
52
  return data !== undefined ? ODataResponse.fromJSON(req, data) : undefined;
53
53
  }
54
54
  }
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9jYWNoZS9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQW1CLE1BQU0sU0FBUyxDQUFDO0FBVXRELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxVQUFVO0lBSWpELFlBQVksRUFDVixJQUFJLEVBQ0osT0FBTyxHQUFHLGNBQWMsRUFDeEIsT0FBTyxHQUtSO1FBQ0MsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixNQUFNLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDbEIsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQ25ELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQ3BELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDTSxLQUFLO1FBQ1osS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsR0FBc0IsRUFBRSxHQUF1QjtRQUN6RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBZSxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNqRCxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQzNCLEtBQUs7WUFDTCxJQUFJO1NBQ0wsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsR0FBc0I7UUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFlLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRTdELE9BQU8sSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM1RSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPRGF0YVJlcXVlc3QsIE9EYXRhUmVzcG9uc2UgfSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgT0RhdGFDYWNoZSwgT0RhdGFDYWNoZUVudHJ5IH0gZnJvbSAnLi9jYWNoZSc7XG5cbmludGVyZmFjZSBSZXNwb25zZUpzb24ge1xuICBib2R5OiBhbnkgfCBudWxsO1xuICBoZWFkZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9O1xuICBzdGF0dXM6IG51bWJlcjtcbiAgc3RhdHVzVGV4dDogc3RyaW5nO1xuICB1cmw6IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUluU3RvcmFnZUNhY2hlIGV4dGVuZHMgT0RhdGFDYWNoZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgc3RvcmFnZTogU3RvcmFnZTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgbmFtZSxcbiAgICBzdG9yYWdlID0gc2Vzc2lvblN0b3JhZ2UsXG4gICAgdGltZW91dCxcbiAgfToge1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHN0b3JhZ2U/OiBTdG9yYWdlO1xuICB9KSB7XG4gICAgc3VwZXIoeyB0aW1lb3V0IH0pO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdG9yYWdlID0gc3RvcmFnZTtcbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKCkgPT4gdGhpcy5zdG9yZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSB0aGUgY2FjaGUgaW4gdGhlIHN0b3JhZ2VcbiAgICovXG4gIHN0b3JlKCkge1xuICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKFxuICAgICAgdGhpcy5uYW1lLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMuZW50cmllcygpKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmUgdGhlIGNhY2hlIGZyb20gdGhlIHN0b3JhZ2VcbiAgICovXG4gIHJlc3RvcmUoKSB7XG4gICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIE9EYXRhQ2FjaGVFbnRyeTxhbnk+PihcbiAgICAgIEpTT04ucGFyc2UodGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy5uYW1lKSB8fCAnW10nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggdGhlIGNhY2hlIGFuZCBjbGVhbiB0aGUgc3RvcmFnZVxuICAgKi9cbiAgb3ZlcnJpZGUgZmx1c2goKSB7XG4gICAgc3VwZXIuZmx1c2goKTtcbiAgICB0aGlzLnN0b3JlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgdGhlIHJlc3BvbnNlIGluIHRoZSBjYWNoZVxuICAgKiBAcGFyYW0gcmVxIFRoZSByZXF1ZXN0IHdpdGggdGhlIHJlc291cmNlIHRvIHN0b3JlIHRoZSByZXNwb25zZVxuICAgKiBAcGFyYW0gcmVzIFRoZSByZXNwb25zZSB0byBzdG9yZSBpbiB0aGUgY2FjaGVcbiAgICovXG4gIHB1dFJlc3BvbnNlKHJlcTogT0RhdGFSZXF1ZXN0PGFueT4sIHJlczogT0RhdGFSZXNwb25zZTxhbnk+KSB7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlKHJlcSk7XG4gICAgY29uc3QgdGFncyA9IHRoaXMudGFncyhyZXMpO1xuICAgIHRoaXMucHV0PFJlc3BvbnNlSnNvbj4ocmVxLmNhY2hlS2V5LCByZXMudG9KU09OKCksIHtcbiAgICAgIHRpbWVvdXQ6IHJlcy5vcHRpb25zLm1heEFnZSxcbiAgICAgIHNjb3BlLFxuICAgICAgdGFncyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIHRoZSByZXNwb25zZSBmcm9tIHRoZSBjYWNoZVxuICAgKiBAcGFyYW0gcmVxIFRoZSByZXF1ZXN0IHdpdGggdGhlIHJlc291cmNlIHRvIGdldCB0aGUgcmVzcG9uc2VcbiAgICogQHJldHVybnMgVGhlIHJlc3BvbnNlIGZyb20gdGhlIGNhY2hlXG4gICAqL1xuICBnZXRSZXNwb25zZShyZXE6IE9EYXRhUmVxdWVzdDxhbnk+KTogT0RhdGFSZXNwb25zZTxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuc2NvcGUocmVxKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXQ8UmVzcG9uc2VKc29uPihyZXEuY2FjaGVLZXksIHsgc2NvcGUgfSk7XG5cbiAgICByZXR1cm4gZGF0YSAhPT0gdW5kZWZpbmVkID8gT0RhdGFSZXNwb25zZS5mcm9tSlNPTihyZXEsIGRhdGEpIDogdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9jYWNoZS9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQW1CLE1BQU0sU0FBUyxDQUFDO0FBVXRELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxVQUFVO0lBSWpELFlBQVksRUFDVixJQUFJLEVBQ0osT0FBTyxHQUFHLGNBQWMsRUFDeEIsT0FBTyxHQUtSO1FBQ0MsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixNQUFNLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDbEIsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQ25ELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQ3BELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDTSxLQUFLO1FBQ1osS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsR0FBc0IsRUFBRSxHQUF1QjtRQUN6RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBZSxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNqRCxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQzNCLEtBQUs7WUFDTCxJQUFJO1NBQ0wsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsR0FBc0I7UUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFlLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRTdELE9BQU8sSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM1RSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPRGF0YVJlcXVlc3QsIE9EYXRhUmVzcG9uc2UgfSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgT0RhdGFDYWNoZSwgT0RhdGFDYWNoZUVudHJ5IH0gZnJvbSAnLi9jYWNoZSc7XG5cbmludGVyZmFjZSBSZXNwb25zZUpzb24ge1xuICBib2R5OiBhbnkgfCBudWxsO1xuICBoZWFkZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9O1xuICBzdGF0dXM6IG51bWJlcjtcbiAgc3RhdHVzVGV4dDogc3RyaW5nO1xuICB1cmw6IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUluU3RvcmFnZUNhY2hlIGV4dGVuZHMgT0RhdGFDYWNoZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgc3RvcmFnZTogU3RvcmFnZTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgbmFtZSxcbiAgICBzdG9yYWdlID0gc2Vzc2lvblN0b3JhZ2UsXG4gICAgdGltZW91dCxcbiAgfToge1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHN0b3JhZ2U/OiBTdG9yYWdlO1xuICB9KSB7XG4gICAgc3VwZXIoeyB0aW1lb3V0IH0pO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdG9yYWdlID0gc3RvcmFnZTtcbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKCkgPT4gdGhpcy5zdG9yZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSB0aGUgY2FjaGUgaW4gdGhlIHN0b3JhZ2VcbiAgICovXG4gIHN0b3JlKCkge1xuICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKFxuICAgICAgdGhpcy5uYW1lLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMuZW50cmllcygpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIHRoZSBjYWNoZSBmcm9tIHRoZSBzdG9yYWdlXG4gICAqL1xuICByZXN0b3JlKCkge1xuICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBPRGF0YUNhY2hlRW50cnk8YW55Pj4oXG4gICAgICBKU09OLnBhcnNlKHRoaXMuc3RvcmFnZS5nZXRJdGVtKHRoaXMubmFtZSkgfHwgJ1tdJyksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCB0aGUgY2FjaGUgYW5kIGNsZWFuIHRoZSBzdG9yYWdlXG4gICAqL1xuICBvdmVycmlkZSBmbHVzaCgpIHtcbiAgICBzdXBlci5mbHVzaCgpO1xuICAgIHRoaXMuc3RvcmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSB0aGUgcmVzcG9uc2UgaW4gdGhlIGNhY2hlXG4gICAqIEBwYXJhbSByZXEgVGhlIHJlcXVlc3Qgd2l0aCB0aGUgcmVzb3VyY2UgdG8gc3RvcmUgdGhlIHJlc3BvbnNlXG4gICAqIEBwYXJhbSByZXMgVGhlIHJlc3BvbnNlIHRvIHN0b3JlIGluIHRoZSBjYWNoZVxuICAgKi9cbiAgcHV0UmVzcG9uc2UocmVxOiBPRGF0YVJlcXVlc3Q8YW55PiwgcmVzOiBPRGF0YVJlc3BvbnNlPGFueT4pIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuc2NvcGUocmVxKTtcbiAgICBjb25zdCB0YWdzID0gdGhpcy50YWdzKHJlcyk7XG4gICAgdGhpcy5wdXQ8UmVzcG9uc2VKc29uPihyZXEuY2FjaGVLZXksIHJlcy50b0pTT04oKSwge1xuICAgICAgdGltZW91dDogcmVzLm9wdGlvbnMubWF4QWdlLFxuICAgICAgc2NvcGUsXG4gICAgICB0YWdzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmUgdGhlIHJlc3BvbnNlIGZyb20gdGhlIGNhY2hlXG4gICAqIEBwYXJhbSByZXEgVGhlIHJlcXVlc3Qgd2l0aCB0aGUgcmVzb3VyY2UgdG8gZ2V0IHRoZSByZXNwb25zZVxuICAgKiBAcmV0dXJucyBUaGUgcmVzcG9uc2UgZnJvbSB0aGUgY2FjaGVcbiAgICovXG4gIGdldFJlc3BvbnNlKHJlcTogT0RhdGFSZXF1ZXN0PGFueT4pOiBPRGF0YVJlc3BvbnNlPGFueT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5zY29wZShyZXEpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldDxSZXNwb25zZUpzb24+KHJlcS5jYWNoZUtleSwgeyBzY29wZSB9KTtcblxuICAgIHJldHVybiBkYXRhICE9PSB1bmRlZmluZWQgPyBPRGF0YVJlc3BvbnNlLmZyb21KU09OKHJlcSwgZGF0YSkgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,252 @@
1
+ import { HttpParams } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+ import { ODataResource, } from './resources/index';
4
+ import { ODataSettings } from './settings';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common/http";
7
+ import * as i2 from "./loaders";
8
+ function addBody(options, body) {
9
+ return {
10
+ body,
11
+ etag: options.etag,
12
+ fetchPolicy: options.fetchPolicy,
13
+ headers: options.headers,
14
+ observe: options.observe,
15
+ params: options.params,
16
+ reportProgress: options.reportProgress,
17
+ responseType: options.responseType,
18
+ withCredentials: options.withCredentials,
19
+ };
20
+ }
21
+ export class ODataClient {
22
+ constructor(http, loader) {
23
+ this.http = http;
24
+ this.loader = loader;
25
+ this.loader.loadConfigs().subscribe((config) => {
26
+ this.settings = new ODataSettings(config);
27
+ this.settings.configure({
28
+ requester: (req) => this.http.request(req.method, `${req.url}`, {
29
+ body: req.body,
30
+ context: req.context,
31
+ headers: req.headers,
32
+ observe: req.observe,
33
+ params: req.params,
34
+ reportProgress: req.reportProgress,
35
+ responseType: req.responseType,
36
+ withCredentials: req.withCredentials,
37
+ }),
38
+ });
39
+ });
40
+ }
41
+ //#region Resolve Building Blocks
42
+ /**
43
+ * Resolve the api for the given value.
44
+ * Where value is: string type or an string name or an instance of resource.
45
+ * @param value The value to resolve.
46
+ * @returns The api for the value.
47
+ */
48
+ apiFor(value) {
49
+ let api = undefined;
50
+ if (value instanceof ODataResource)
51
+ api = this.settings.findApiForTypes(value.types());
52
+ else if (typeof value === 'string')
53
+ api =
54
+ this.settings.findApiByName(value) ||
55
+ this.settings.findApiForType(value);
56
+ return api || this.settings.defaultApi();
57
+ }
58
+ defaultApi() {
59
+ return this.settings.defaultApi();
60
+ }
61
+ /**
62
+ * Resolve the parser for the given string type.
63
+ * @param type The string type of the parser.
64
+ * @returns The parser for the given type.
65
+ */
66
+ parserForType(type) {
67
+ return this.settings.parserForType(type);
68
+ }
69
+ /**
70
+ * Resolve the enum type for the given string type.
71
+ * @param type The string type of the enum type.
72
+ * @returns The enum type for the given type.
73
+ */
74
+ enumTypeForType(type) {
75
+ return this.settings.enumTypeForType(type);
76
+ }
77
+ /**
78
+ * Resolve the structured type for the given string type.
79
+ * @param type The string type of the structured type.
80
+ * @returns The structured type for the given type.
81
+ */
82
+ structuredTypeForType(type) {
83
+ return this.settings.structuredTypeForType(type);
84
+ }
85
+ /**
86
+ * Resolve the callable for the given string type.
87
+ * @param type The string type of the callable.
88
+ * @returns The callable for the given type.
89
+ */
90
+ callableForType(type) {
91
+ return this.settings.callableForType(type);
92
+ }
93
+ /**
94
+ * Resolve the entity set for the given string type.
95
+ * @param type The string type of the entity set.
96
+ * @returns The entity set for the given type.
97
+ */
98
+ entitySetForType(type) {
99
+ return this.settings.entitySetForType(type);
100
+ }
101
+ /**
102
+ * Resolve the model for the given string type.
103
+ * @param type The string type of the model.
104
+ * @returns The model for the given type.
105
+ */
106
+ modelForType(type) {
107
+ return this.settings.modelForType(type);
108
+ }
109
+ /**
110
+ * Resolve the collection for the given string type.
111
+ * @param type The string type of the collection.
112
+ * @returns The collection for the given type.
113
+ */
114
+ collectionForType(type) {
115
+ return this.settings.collectionForType(type);
116
+ }
117
+ /**
118
+ * Resolve the service for the given string type.
119
+ * @param type The string type of the service.
120
+ * @returns The service for the given type.
121
+ */
122
+ serviceForType(type) {
123
+ //return this.injector.get(this.settings!.serviceForType(type));
124
+ return undefined;
125
+ }
126
+ /**
127
+ * Resolve the service for the given string entity type.
128
+ * @param type The string entity type binding to the service.
129
+ * @returns The service for the given entity type.
130
+ */
131
+ serviceForEntityType(type) {
132
+ //return this.injector.get(this.settings!.serviceForEntityType(type));
133
+ return undefined;
134
+ }
135
+ enumTypeByName(name) {
136
+ return this.settings.enumTypeByName(name);
137
+ }
138
+ structuredTypeByName(name) {
139
+ return this.settings.structuredTypeByName(name);
140
+ }
141
+ callableByName(name) {
142
+ return this.settings.callableByName(name);
143
+ }
144
+ entitySetByName(name) {
145
+ return this.settings.entitySetByName(name);
146
+ }
147
+ modelByName(name) {
148
+ return this.settings.modelByName(name);
149
+ }
150
+ collectionByName(name) {
151
+ return this.settings.collectionByName(name);
152
+ }
153
+ serviceByName(name) {
154
+ //return this.injector.get(this.settings!.serviceByName(name));
155
+ return undefined;
156
+ }
157
+ fromJSON(json, apiNameOrType) {
158
+ return this.apiFor(apiNameOrType).fromJSON(json);
159
+ }
160
+ // Requests
161
+ /**
162
+ * Build a resource for the metadata.
163
+ * @param apiName The name of the API.
164
+ * @returns The metadata resource.
165
+ */
166
+ metadata(apiName) {
167
+ return this.apiFor(apiName).metadata();
168
+ }
169
+ /**
170
+ * Build a resource for the batch.
171
+ * @param apiName The name of the API.
172
+ * @returns The batch resource.
173
+ */
174
+ batch(apiName) {
175
+ return this.apiFor(apiName).batch();
176
+ }
177
+ /**
178
+ * Build a resource for the singleton.
179
+ * @param path The full path to the singleton.
180
+ * @param apiNameOrType The name of the API or the type of the singleton.
181
+ * @returns The singleton resource.
182
+ */
183
+ singleton(path, apiNameOrType) {
184
+ return this.apiFor(apiNameOrType).singleton(path);
185
+ }
186
+ /**
187
+ * Build a resource for the entity set.
188
+ * @param path The full path to the entity set.
189
+ * @param apiNameOrType The name of the API or the type of the entity set.
190
+ * @returns The entity set resource.
191
+ */
192
+ entitySet(path, apiNameOrType) {
193
+ return this.apiFor(apiNameOrType).entitySet(path);
194
+ }
195
+ /**
196
+ * Build a resource for unbound action.
197
+ * @param path The full path to the action.
198
+ * @param apiNameOrType The name of the API or the type of the entity.
199
+ * @returns The unbound action resource.
200
+ */
201
+ action(path, apiNameOrType) {
202
+ return this.apiFor(apiNameOrType).action(path);
203
+ }
204
+ /**
205
+ * Build a resource for unbound function.
206
+ * @param path The full path to the function.
207
+ * @param apiNameOrType The name of the API or the type of the callable.
208
+ * @returns The unbound function resource.
209
+ */
210
+ function(path, apiNameOrType) {
211
+ return this.apiFor(apiNameOrType).function(path);
212
+ }
213
+ request(method, resource, options) {
214
+ let api = this.apiFor(resource);
215
+ return api.request(method, resource, options);
216
+ }
217
+ delete(resource, options = {}) {
218
+ return this.request('DELETE', resource, addBody(options, null));
219
+ }
220
+ get(resource, options = {}) {
221
+ return this.request('GET', resource, options);
222
+ }
223
+ head(resource, options = {}) {
224
+ return this.request('HEAD', resource, options);
225
+ }
226
+ jsonp(resource, callbackParam) {
227
+ return this.request('JSONP', resource, {
228
+ body: null,
229
+ params: new HttpParams().append(callbackParam, 'JSONP_CALLBACK'),
230
+ observe: 'body',
231
+ responseType: 'json',
232
+ });
233
+ }
234
+ options(resource, options = {}) {
235
+ return this.request('OPTIONS', resource, options);
236
+ }
237
+ patch(resource, body, options = {}) {
238
+ return this.request('PATCH', resource, addBody(options, body));
239
+ }
240
+ post(resource, body, options = {}) {
241
+ return this.request('POST', resource, addBody(options, body));
242
+ }
243
+ put(resource, body, options = {}) {
244
+ return this.request('PUT', resource, addBody(options, body));
245
+ }
246
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.3", ngImport: i0, type: ODataClient, deps: [{ token: i1.HttpClient }, { token: i2.ODataConfigLoader }], target: i0.ɵɵFactoryTarget.Injectable }); }
247
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.3", ngImport: i0, type: ODataClient }); }
248
+ }
249
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.3", ngImport: i0, type: ODataClient, decorators: [{
250
+ type: Injectable
251
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ODataConfigLoader }]; } });
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXlCLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLM0MsT0FBTyxFQVVMLGFBQWEsR0FJZCxNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7QUFFM0MsU0FBUyxPQUFPLENBQ2QsT0FHQyxFQUNELElBQWM7SUFFZCxPQUFPO1FBQ0wsSUFBSTtRQUNKLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7UUFDaEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO1FBQ3RDLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtRQUNsQyxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7S0FDekMsQ0FBQztBQUNKLENBQUM7QUFHRCxNQUFNLE9BQU8sV0FBVztJQUV0QixZQUNVLElBQWdCLEVBQ2hCLE1BQXlCO1FBRHpCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUFFakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO2dC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LENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQzs4R0F2MkNVLFdBQVc7a0hBQVgsV0FBVzs7MkZBQVgsV0FBVztrQkFEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFdmVudCwgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9EYXRhQXBpIH0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgT0RhdGFDb25maWdMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMnO1xuaW1wb3J0IHsgT0RhdGFDb2xsZWN0aW9uLCBPRGF0YU1vZGVsIH0gZnJvbSAnLi9tb2RlbHMvaW5kZXgnO1xuaW1wb3J0IHtcbiAgT0RhdGFBY3Rpb25SZXNvdXJjZSxcbiAgT0RhdGFCYXRjaFJlc291cmNlLFxuICBPRGF0YUVudGl0eVJlc291cmNlLFxuICBPRGF0YUVudGl0eVNldFJlc291cmNlLFxuICBPRGF0YUZ1bmN0aW9uUmVzb3VyY2UsXG4gIE9EYXRhTWV0YWRhdGFSZXNvdXJjZSxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFPcHRpb25zLFxuICBPRGF0YVJlcXVlc3QsXG4gIE9EYXRhUmVzb3VyY2UsXG4gIE9EYXRhUmVzcG9uc2UsXG4gIE9EYXRhU2VnbWVudCxcbiAgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSxcbn0gZnJvbSAnLi9yZXNvdXJjZXMvaW5kZXgnO1xuaW1wb3J0IHsgT0RhdGFFbnRpdHlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9lbnRpdHknO1xuaW1wb3J0IHsgT0RhdGFTZXR0aW5ncyB9IGZyb20gJy4vc2V0dGluZ3MnO1xuXG5mdW5jdGlvbiBhZGRCb2R5PFQ+KFxuICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgb2JzZXJ2ZT86ICdib2R5JyB8ICdldmVudHMnIHwgJ3Jlc3BvbnNlJztcbiAgICByZXNwb25zZVR5cGU/OiAnYXJyYXlidWZmZXInIHwgJ2Jsb2InIHwgJ2pzb24nIHwgJ3RleHQnO1xuICB9LFxuICBib2R5OiBUIHwgbnVsbCxcbik6IGFueSB7XG4gIHJldHVybiB7XG4gICAgYm9keSxcbiAgICBldGFnOiBvcHRpb25zLmV0YWcsXG4gICAgZmV0Y2hQb2xpY3k6IG9wdGlvbnMuZmV0Y2hQb2xpY3ksXG4gICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzLFxuICAgIG9ic2VydmU6IG9wdGlvbnMub2JzZXJ2ZSxcbiAgICBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLFxuICAgIHJlcG9ydFByb2dyZXNzOiBvcHRpb25zLnJlcG9ydFByb2dyZXNzLFxuICAgIHJlc3BvbnNlVHlwZTogb3B0aW9ucy5yZXNwb25zZVR5cGUsXG4gICAgd2l0aENyZWRlbnRpYWxzOiBvcHRpb25zLndpdGhDcmVkZW50aWFscyxcbiAgfTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9EYXRhQ2xpZW50IHtcbiAgc2V0dGluZ3M/OiBPRGF0YVNldHRpbmdzO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBsb2FkZXI6IE9EYXRhQ29uZmlnTG9hZGVyLFxuICApIHtcbiAgICB0aGlzLmxvYWRlci5sb2FkQ29uZmlncygpLnN1YnNjcmliZSgoY29uZmlnKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzID0gbmV3IE9EYXRhU2V0dGluZ3MoY29uZmlnKTtcbiAgICAgIHRoaXMuc2V0dGluZ3MuY29uZmlndXJlKHtcbiAgICAgICAgcmVxdWVzdGVyOiAocmVxOiBPRGF0YVJlcXVlc3Q8YW55Pik6IE9ic2VydmFibGU8YW55PiA9PlxuICAgICAgICAgIHRoaXMuaHR0cC5yZXF1ZXN0KHJlcS5tZXRob2QsIGAke3JlcS51cmx9YCwge1xuICAgICAgICAgICAgYm9keTogcmVxLmJvZHksXG4gICAgICAgICAgICBjb250ZXh0OiByZXEuY29udGV4dCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLFxuICAgICAgICAgICAgb2JzZXJ2ZTogcmVxLm9ic2VydmUsXG4gICAgICAgICAgICBwYXJhbXM6IHJlcS5wYXJhbXMsXG4gICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVxLnJlcG9ydFByb2dyZXNzLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiByZXEucmVzcG9uc2VUeXBlLFxuICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiByZXEud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyNyZWdpb24gUmVzb2x2ZSBCdWlsZGluZyBCbG9ja3NcbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGFwaSBmb3IgdGhlIGdpdmVuIHZhbHVlLlxuICAgKiBXaGVyZSB2YWx1ZSBpczogc3RyaW5nIHR5cGUgb3IgYW4gc3RyaW5nIG5hbWUgb3IgYW4gaW5zdGFuY2Ugb2YgcmVzb3VyY2UuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVzb2x2ZS5cbiAgICogQHJldHVybnMgVGhlIGFwaSBmb3IgdGhlIHZhbHVlLlxuICAgKi9cbiAgYXBpRm9yKHZhbHVlPzogT0RhdGFSZXNvdXJjZTxhbnk+IHwgc3RyaW5nKTogT0RhdGFBcGkge1xuICAgIGxldCBhcGk6IE9EYXRhQXBpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9EYXRhUmVzb3VyY2UpXG4gICAgICBhcGkgPSB0aGlzLnNldHRpbmdzIS5maW5kQXBpRm9yVHlwZXModmFsdWUudHlwZXMoKSk7XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJylcbiAgICAgIGFwaSA9XG4gICAgICAgIHRoaXMuc2V0dGluZ3MhLmZpbmRBcGlCeU5hbWUodmFsdWUpIHx8XG4gICAgICAgIHRoaXMuc2V0dGluZ3MhLmZpbmRBcGlGb3JUeXBlKHZhbHVlKTtcbiAgICByZXR1cm4gYXBpIHx8IHRoaXMuc2V0dGluZ3MhLmRlZmF1bHRBcGkoKTtcbiAgfVxuXG4gIGRlZmF1bHRBcGkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MhLmRlZmF1bHRBcGkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBwYXJzZXIgZm9yIHRoZSBnaXZlbiBzdHJpbmcgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHN0cmluZyB0eXBlIG9mIHRoZSBwYXJzZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwYXJzZXIgZm9yIHRoZSBnaXZlbiB0eXBlLlxuICAgKi9cbiAgcGFyc2VyRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncyEucGFyc2VyRm9yVHlwZTxUPih0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBlbnVtIHR5cGUgZm9yIHRoZSBnaXZlbiBzdHJpbmcgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHN0cmluZyB0eXBlIG9mIHRoZSBlbnVtIHR5cGUuXG4gICAqIEByZXR1cm5zIFRoZSBlbnVtIHR5cGUgZm9yIHRoZSBnaXZlbiB0eXBlLlxuICAgKi9cbiAgZW51bVR5cGVGb3JUeXBlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzIS5lbnVtVHlwZUZvclR5cGU8VD4odHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgc3RydWN0dXJlZCB0eXBlIGZvciB0aGUgZ2l2ZW4gc3RyaW5nIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBzdHJpbmcgdHlwZSBvZiB0aGUgc3RydWN0dXJlZCB0eXBlLlxuICAgKiBAcmV0dXJucyBUaGUgc3RydWN0dXJlZCB0eXBlIGZvciB0aGUgZ2l2ZW4gdHlwZS5cbiAgICovXG4gIHN0cnVjdHVyZWRUeXBlRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncyEuc3RydWN0dXJlZFR5cGVGb3JUeXBlPFQ+KHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGNhbGxhYmxlIGZvciB0aGUgZ2l2ZW4gc3RyaW5nIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBzdHJpbmcgdHlwZSBvZiB0aGUgY2FsbGFibGUuXG4gICAqIEByZXR1cm5zIFRoZSBjYWxsYWJsZSBmb3IgdGhlIGdpdmVuIHR5cGUuXG4gICAqL1xuICBjYWxsYWJsZUZvclR5cGU8VD4odHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MhLmNhbGxhYmxlRm9yVHlwZTxUPih0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBlbnRpdHkgc2V0IGZvciB0aGUgZ2l2ZW4gc3RyaW5nIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBzdHJpbmcgdHlwZSBvZiB0aGUgZW50aXR5IHNldC5cbiAgICogQHJldHVybnMgVGhlIGVudGl0eSBzZXQgZm9yIHRoZSBnaXZlbiB0eXBlLlxuICAgKi9cbiAgZW50aXR5U2V0Rm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncyEuZW50aXR5U2V0Rm9yVHlwZSh0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBtb2RlbCBmb3IgdGhlIGdpdmVuIHN0cmluZyB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgc3RyaW5nIHR5cGUgb2YgdGhlIG1vZGVsLlxuICAgKiBAcmV0dXJucyBUaGUgbW9kZWwgZm9yIHRoZSBnaXZlbiB0eXBlLlxuICAgKi9cbiAgbW9kZWxGb3JUeXBlKHR5cGU6IHN0cmluZyk6IHR5cGVvZiBPRGF0YU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncyEubW9kZWxGb3JUeXBlKHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGNvbGxlY3Rpb24gZm9yIHRoZSBnaXZlbiBzdHJpbmcgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHN0cmluZyB0eXBlIG9mIHRoZSBjb2xsZWN0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgY29sbGVjdGlvbiBmb3IgdGhlIGdpdmVuIHR5cGUuXG4gICAqL1xuICBjb2xsZWN0aW9uRm9yVHlwZSh0eXBlOiBzdHJpbmcpOiB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncyEuY29sbGVjdGlvbkZvclR5cGUodHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgc2VydmljZSBmb3IgdGhlIGdpdmVuIHN0cmluZyB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgc3RyaW5nIHR5cGUgb2YgdGhlIHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIFRoZSBzZXJ2aWNlIGZvciB0aGUgZ2l2ZW4gdHlwZS5cbiAgICovXG4gIHNlcnZpY2VGb3JUeXBlKHR5cGU6IHN0cmluZyk6IE9EYXRhRW50aXR5U2VydmljZTxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICAvL3JldHVybiB0aGlzLmluamVjdG9yLmdldCh0aGlzLnNldHRpbmdzIS5zZXJ2aWNlRm9yVHlwZSh0eXBlKSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBzZXJ2aWNlIGZvciB0aGUgZ2l2ZW4gc3RyaW5nIGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgc3RyaW5nIGVudGl0eSB0eXBlIGJpbmRpbmcgdG8gdGhlIHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIFRoZSBzZXJ2aWNlIGZvciB0aGUgZ2l2ZW4gZW50aXR5IHR5cGUuXG4gICAqL1xuICBzZXJ2aWNlRm9yRW50aXR5VHlwZSh0eXBlOiBzdHJpbmcpOiBPRGF0YUVudGl0eVNlcnZpY2U8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgLy9yZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQodGhpcy5zZXR0aW5ncyEuc2VydmljZUZvckVudGl0eVR5cGUodHlwZSkpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBlbnVtVHlwZUJ5TmFtZTxUPihuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncyEuZW51bVR5cGVCeU5hbWU8VD4obmFtZSk7XG4gIH1cbiAgc3RydWN0dXJlZFR5cGVCeU5hbWU8VD4obmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MhLnN0cnVjdHVyZWRUeXBlQnlOYW1lPFQ+KG5hbWUpO1xuICB9XG4gIGNhbGxhYmxlQnlOYW1lPFQ+KG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzIS5jYWxsYWJsZUJ5TmFtZTxUPihuYW1lKTtcbiAgfVxuICBlbnRpdHlTZXRCeU5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MhLmVudGl0eVNldEJ5TmFtZShuYW1lKTtcbiAgfVxuICBtb2RlbEJ5TmFtZShuYW1lOiBzdHJpbmcpOiB0eXBlb2YgT0RhdGFNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MhLm1vZGVsQnlOYW1lKG5hbWUpO1xuICB9XG4gIGNvbGxlY3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKTogdHlwZW9mIE9EYXRhQ29sbGVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MhLmNvbGxlY3Rpb25CeU5hbWUobmFtZSk7XG4gIH1cbiAgc2VydmljZUJ5TmFtZShuYW1lOiBzdHJpbmcpOiBPRGF0YUVudGl0eVNlcnZpY2U8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgLy9yZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQodGhpcy5zZXR0aW5ncyEuc2VydmljZUJ5TmFtZShuYW1lKSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gQVBJIFJlc291cmNlIFByb3h5IE1ldGhvZHNcbiAgZnJvbUpTT048RT4oXG4gICAganNvbjogeyBzZWdtZW50czogT0RhdGFTZWdtZW50W107IG9wdGlvbnM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IH0sXG4gICAgYXBpTmFtZU9yVHlwZT86IHN0cmluZyxcbiAgKTpcbiAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8RT47XG4gIGZyb21KU09OKFxuICAgIGpzb246IHsgc2VnbWVudHM6IE9EYXRhU2VnbWVudFtdOyBvcHRpb25zOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB9LFxuICAgIGFwaU5hbWVPclR5cGU/OiBzdHJpbmcsXG4gICkge1xuICAgIHJldHVybiB0aGlzLmFwaUZvcihhcGlOYW1lT3JUeXBlKS5mcm9tSlNPTjxhbnk+KGpzb24pO1xuICB9XG5cbiAgLy8gUmVxdWVzdHNcbiAgLyoqXG4gICAqIEJ1aWxkIGEgcmVzb3VyY2UgZm9yIHRoZSBtZXRhZGF0YS5cbiAgICogQHBhcmFtIGFwaU5hbWUgVGhlIG5hbWUgb2YgdGhlIEFQSS5cbiAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHJlc291cmNlLlxuICAgKi9cbiAgbWV0YWRhdGEoYXBpTmFtZT86IHN0cmluZyk6IE9EYXRhTWV0YWRhdGFSZXNvdXJjZSB7XG4gICAgcmV0dXJuIHRoaXMuYXBpRm9yKGFwaU5hbWUpLm1ldGFkYXRhKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSByZXNvdXJjZSBmb3IgdGhlIGJhdGNoLlxuICAgKiBAcGFyYW0gYXBpTmFtZSBUaGUgbmFtZSBvZiB0aGUgQVBJLlxuICAgKiBAcmV0dXJucyBUaGUgYmF0Y2ggcmVzb3VyY2UuXG4gICAqL1xuICBiYXRjaChhcGlOYW1lPzogc3RyaW5nKTogT0RhdGFCYXRjaFJlc291cmNlIHtcbiAgICByZXR1cm4gdGhpcy5hcGlGb3IoYXBpTmFtZSkuYmF0Y2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIHJlc291cmNlIGZvciB0aGUgc2luZ2xldG9uLlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBzaW5nbGV0b24uXG4gICAqIEBwYXJhbSBhcGlOYW1lT3JUeXBlIFRoZSBuYW1lIG9mIHRoZSBBUEkgb3IgdGhlIHR5cGUgb2YgdGhlIHNpbmdsZXRvbi5cbiAgICogQHJldHVybnMgVGhlIHNpbmdsZXRvbiByZXNvdXJjZS5cbiAgICovXG4gIHNpbmdsZXRvbjxUPihwYXRoOiBzdHJpbmcsIGFwaU5hbWVPclR5cGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5hcGlGb3IoYXBpTmFtZU9yVHlwZSkuc2luZ2xldG9uPFQ+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgcmVzb3VyY2UgZm9yIHRoZSBlbnRpdHkgc2V0LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBlbnRpdHkgc2V0LlxuICAgKiBAcGFyYW0gYXBpTmFtZU9yVHlwZSBUaGUgbmFtZSBvZiB0aGUgQVBJIG9yIHRoZSB0eXBlIG9mIHRoZSBlbnRpdHkgc2V0LlxuICAgKiBAcmV0dXJucyBUaGUgZW50aXR5IHNldCByZXNvdXJjZS5cbiAgICovXG4gIGVudGl0eVNldDxUPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYXBpTmFtZU9yVHlwZT86IHN0cmluZyxcbiAgKTogT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuYXBpRm9yKGFwaU5hbWVPclR5cGUpLmVudGl0eVNldDxUPihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIHJlc291cmNlIGZvciB1bmJvdW5kIGFjdGlvbi5cbiAgICogQHBhcmFtIHBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgYWN0aW9uLlxuICAgKiBAcGFyYW0gYXBpTmFtZU9yVHlwZSBUaGUgbmFtZSBvZiB0aGUgQVBJIG9yIHRoZSB0eXBlIG9mIHRoZSBlbnRpdHkuXG4gICAqIEByZXR1cm5zIFRoZSB1bmJvdW5kIGFjdGlvbiByZXNvdXJjZS5cbiAgICovXG4gIGFjdGlvbjxQLCBSPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYXBpTmFtZU9yVHlwZT86IHN0cmluZyxcbiAgKTogT0RhdGFBY3Rpb25SZXNvdXJjZTxQLCBSPiB7XG4gICAgcmV0dXJuIHRoaXMuYXBpRm9yKGFwaU5hbWVPclR5cGUpLmFjdGlvbjxQLCBSPihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIHJlc291cmNlIGZvciB1bmJvdW5kIGZ1bmN0aW9uLlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBmdW5jdGlvbi5cbiAgICogQHBhcmFtIGFwaU5hbWVPclR5cGUgVGhlIG5hbWUgb2YgdGhlIEFQSSBvciB0aGUgdHlwZSBvZiB0aGUgY2FsbGFibGUuXG4gICAqIEByZXR1cm5zIFRoZSB1bmJvdW5kIGZ1bmN0aW9uIHJlc291cmNlLlxuICAgKi9cbiAgZnVuY3Rpb248UCwgUj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGFwaU5hbWVPclR5cGU/OiBzdHJpbmcsXG4gICk6IE9EYXRhRnVuY3Rpb25SZXNvdXJjZTxQLCBSPiB7XG4gICAgcmV0dXJuIHRoaXMuYXBpRm9yKGFwaU5hbWVPclR5cGUpLmZ1bmN0aW9uPFAsIFI+KHBhdGgpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vIFJlcXVlc3QgaGVhZGVycywgZ2V0LCBwb3N0LCBwdXQsIHBhdGNoLi4uIGV0Y1xuICByZXF1ZXN0KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keTogYW55IHwgbnVsbDtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxBcnJheUJ1ZmZlcj47XG5cbiAgcmVxdWVzdChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk6IGFueSB8IG51bGw7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxCbG9iPjtcblxuICByZXF1ZXN0KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keTogYW55IHwgbnVsbDtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgcmVxdWVzdChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk6IGFueSB8IG51bGw7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcnJheUJ1ZmZlcj4+O1xuXG4gIHJlcXVlc3QoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBib2R5OiBhbnkgfCBudWxsO1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxCbG9iPj47XG5cbiAgcmVxdWVzdChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk6IGFueSB8IG51bGw7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PHN0cmluZz4+O1xuXG4gIHJlcXVlc3QoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBib2R5OiBhbnkgfCBudWxsO1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj47XG5cbiAgcmVxdWVzdDxSPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk6IGFueSB8IG51bGw7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxSPj47XG5cbiAgcmVxdWVzdChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk6IGFueSB8IG51bGw7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxBcnJheUJ1ZmZlcj4+O1xuXG4gIHJlcXVlc3QoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBib2R5OiBhbnkgfCBudWxsO1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxCbG9iPj47XG5cbiAgcmVxdWVzdChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk6IGFueSB8IG51bGw7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPHN0cmluZz4+O1xuXG4gIHJlcXVlc3QoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBib2R5OiBhbnkgfCBudWxsO1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8T2JqZWN0Pj47XG5cbiAgcmVxdWVzdDxSPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk6IGFueSB8IG51bGw7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxSPj47XG5cbiAgcmVxdWVzdChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk6IGFueSB8IG51bGw7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T2JqZWN0PjtcblxuICByZXF1ZXN0PFI+KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keTogYW55IHwgbnVsbDtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxSPjtcblxuICByZXF1ZXN0KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keTogYW55IHwgbnVsbDtcbiAgICAgIG9ic2VydmU/OiAnYm9keScgfCAnZXZlbnRzJyB8ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnYXJyYXlidWZmZXInIHwgJ2Jsb2InIHwgJ2pzb24nIHwgJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IGFwaSA9IHRoaXMuYXBpRm9yKHJlc291cmNlKTtcblxuICAgIHJldHVybiBhcGkucmVxdWVzdChtZXRob2QsIHJlc291cmNlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGRlbGV0ZShcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxBcnJheUJ1ZmZlcj47XG5cbiAgZGVsZXRlKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8QmxvYj47XG5cbiAgZGVsZXRlKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBkZWxldGUoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcnJheUJ1ZmZlcj4+O1xuXG4gIGRlbGV0ZShcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QmxvYj4+O1xuXG4gIGRlbGV0ZShcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8c3RyaW5nPj47XG5cbiAgZGVsZXRlKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8T2JqZWN0Pj47XG5cbiAgZGVsZXRlPFQ+KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VD4+O1xuXG4gIGRlbGV0ZShcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPEFycmF5QnVmZmVyPj47XG5cbiAgZGVsZXRlKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxCbG9iPj47XG5cbiAgZGVsZXRlKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxzdHJpbmc+PjtcblxuICBkZWxldGUoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxPYmplY3Q+PjtcblxuICBkZWxldGU8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxUPj47XG5cbiAgZGVsZXRlKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9iamVjdD47XG5cbiAgZGVsZXRlPFQ+KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPFQ+O1xuXG4gIGRlbGV0ZShcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keScgfCAnZXZlbnRzJyB8ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnYXJyYXlidWZmZXInIHwgJ2Jsb2InIHwgJ2pzb24nIHwgJ3RleHQnO1xuICAgIH0gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PGFueT4oJ0RFTEVURScsIHJlc291cmNlLCBhZGRCb2R5PGFueT4ob3B0aW9ucywgbnVsbCkpO1xuICB9XG5cbiAgZ2V0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPjtcblxuICBnZXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxCbG9iPjtcblxuICBnZXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIGdldChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFycmF5QnVmZmVyPj47XG5cbiAgZ2V0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxCbG9iPj47XG5cbiAgZ2V0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxzdHJpbmc+PjtcblxuICBnZXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxPYmplY3Q+PjtcblxuICBnZXQ8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUPj47XG5cbiAgZ2V0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8QXJyYXlCdWZmZXI+PjtcblxuICBnZXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPEJsb2I+PjtcblxuICBnZXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPHN0cmluZz4+O1xuXG4gIGdldChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPE9iamVjdD4+O1xuXG4gIGdldDxUPihcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPFQ+PjtcblxuICBnZXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T2JqZWN0PjtcblxuICBnZXQ8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8VD47XG5cbiAgZ2V0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JyB8ICdldmVudHMnIHwgJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdhcnJheWJ1ZmZlcicgfCAnYmxvYicgfCAnanNvbicgfCAndGV4dCc7XG4gICAgfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8YW55PignR0VUJywgcmVzb3VyY2UsIG9wdGlvbnMgYXMgYW55KTtcbiAgfVxuXG4gIGhlYWQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8QXJyYXlCdWZmZXI+O1xuXG4gIGhlYWQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxCbG9iPjtcblxuICBoZWFkKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBoZWFkKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXJyYXlCdWZmZXI+PjtcblxuICBoZWFkKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxCbG9iPj47XG5cbiAgaGVhZChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8c3RyaW5nPj47XG5cbiAgaGVhZChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PE9iamVjdD4+O1xuXG4gIGhlYWQ8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUPj47XG5cbiAgaGVhZChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPEFycmF5QnVmZmVyPj47XG5cbiAgaGVhZChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8QmxvYj4+O1xuXG4gIGhlYWQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPHN0cmluZz4+O1xuXG4gIGhlYWQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxPYmplY3Q+PjtcblxuICBoZWFkPFQ+KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8VD4+O1xuXG4gIGhlYWQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T2JqZWN0PjtcblxuICBoZWFkPFQ+KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPFQ+O1xuXG4gIGhlYWQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknIHwgJ2V2ZW50cycgfCAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2FycmF5YnVmZmVyJyB8ICdibG9iJyB8ICdqc29uJyB8ICd0ZXh0JztcbiAgICB9ID0ge30sXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxhbnk+KCdIRUFEJywgcmVzb3VyY2UsIG9wdGlvbnMgYXMgYW55KTtcbiAgfVxuXG4gIGpzb25wKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgY2FsbGJhY2tQYXJhbTogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPE9iamVjdD47XG5cbiAganNvbnA8VD4ocmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PiwgY2FsbGJhY2tQYXJhbTogc3RyaW5nKTogT2JzZXJ2YWJsZTxUPjtcblxuICBqc29ucDxUPihyZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LCBjYWxsYmFja1BhcmFtOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PGFueT4oJ0pTT05QJywgcmVzb3VyY2UsIHtcbiAgICAgIGJvZHk6IG51bGwsXG4gICAgICBwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuYXBwZW5kKGNhbGxiYWNrUGFyYW0sICdKU09OUF9DQUxMQkFDSycpLFxuICAgICAgb2JzZXJ2ZTogJ2JvZHknLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgfSk7XG4gIH1cblxuICBvcHRpb25zKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPjtcblxuICBvcHRpb25zKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8QmxvYj47XG5cbiAgb3B0aW9ucyhcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgb3B0aW9ucyhcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFycmF5QnVmZmVyPj47XG5cbiAgb3B0aW9ucyhcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QmxvYj4+O1xuXG4gIG9wdGlvbnMoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PHN0cmluZz4+O1xuXG4gIG9wdGlvbnMoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxPYmplY3Q+PjtcblxuICBvcHRpb25zKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8T2JqZWN0Pj47XG5cbiAgb3B0aW9uczxUPihcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFQ+PjtcblxuICBvcHRpb25zKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8QXJyYXlCdWZmZXI+PjtcblxuICBvcHRpb25zKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxCbG9iPj47XG5cbiAgb3B0aW9ucyhcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8c3RyaW5nPj47XG5cbiAgb3B0aW9ucyhcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPE9iamVjdD4+O1xuXG4gIG9wdGlvbnM8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxUPj47XG5cbiAgb3B0aW9ucyhcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPYmplY3Q+O1xuXG4gIG9wdGlvbnM8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8VD47XG5cbiAgb3B0aW9ucyhcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keScgfCAnZXZlbnRzJyB8ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnYXJyYXlidWZmZXInIHwgJ2Jsb2InIHwgJ2pzb24nIHwgJ3RleHQnO1xuICAgIH0gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PGFueT4oJ09QVElPTlMnLCByZXNvdXJjZSwgb3B0aW9ucyBhcyBhbnkpO1xuICB9XG5cbiAgcGF0Y2goXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxBcnJheUJ1ZmZlcj47XG5cbiAgcGF0Y2goXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEJsb2I+O1xuXG4gIHBhdGNoKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIHBhdGNoKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcnJheUJ1ZmZlcj4+O1xuXG4gIHBhdGNoKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEJsb2I+PjtcblxuICBwYXRjaChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxzdHJpbmc+PjtcblxuICBwYXRjaChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8T2JqZWN0Pj47XG5cbiAgcGF0Y2g8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFQ+PjtcblxuICBwYXRjaChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8QXJyYXlCdWZmZXI+PjtcblxuICBwYXRjaChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxCbG9iPj47XG5cbiAgcGF0Y2goXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8c3RyaW5nPj47XG5cbiAgcGF0Y2goXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPE9iamVjdD4+O1xuXG4gIHBhdGNoPFQ+KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxUPj47XG5cbiAgcGF0Y2goXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPYmplY3Q+O1xuXG4gIHBhdGNoPFQ+KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8VD47XG5cbiAgcGF0Y2goXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keScgfCAnZXZlbnRzJyB8ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnYXJyYXlidWZmZXInIHwgJ2Jsb2InIHwgJ2pzb24nIHwgJ3RleHQnO1xuICAgIH0gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PGFueT4oJ1BBVENIJywgcmVzb3VyY2UsIGFkZEJvZHkob3B0aW9ucywgYm9keSkpO1xuICB9XG5cbiAgcG9zdChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPjtcblxuICBwb3N0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxCbG9iPjtcblxuICBwb3N0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIHBvc3QoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFycmF5QnVmZmVyPj47XG5cbiAgcG9zdChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxCbG9iPj47XG5cbiAgcG9zdChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxzdHJpbmc+PjtcblxuICBwb3N0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxPYmplY3Q+PjtcblxuICBwb3N0PFQ+KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUPj47XG5cbiAgcG9zdChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8QXJyYXlCdWZmZXI+PjtcblxuICBwb3N0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPEJsb2I+PjtcblxuICBwb3N0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPHN0cmluZz4+O1xuXG4gIHBvc3QoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPE9iamVjdD4+O1xuXG4gIHBvc3Q8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPFQ+PjtcblxuICBwb3N0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T2JqZWN0PjtcblxuICBwb3N0PFQ+KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8VD47XG5cbiAgcG9zdChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JyB8ICdldmVudHMnIHwgJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdhcnJheWJ1ZmZlcicgfCAnYmxvYicgfCAnanNvbicgfCAndGV4dCc7XG4gICAgfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8YW55PignUE9TVCcsIHJlc291cmNlLCBhZGRCb2R5KG9wdGlvbnMsIGJvZHkpKTtcbiAgfVxuXG4gIHB1dChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPjtcblxuICBwdXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEJsb2I+O1xuXG4gIHB1dChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBwdXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFycmF5QnVmZmVyPj47XG5cbiAgcHV0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEJsb2I+PjtcblxuICBwdXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8c3RyaW5nPj47XG5cbiAgcHV0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxPYmplY3Q+PjtcblxuICBwdXQ8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFQ+PjtcblxuICBwdXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPEFycmF5QnVmZmVyPj47XG5cbiAgcHV0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPEJsb2I+PjtcblxuICBwdXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8c3RyaW5nPj47XG5cbiAgcHV0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxPYmplY3Q+PjtcblxuICBwdXQ8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPFQ+PjtcblxuICBwdXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPYmplY3Q+O1xuXG4gIHB1dDxUPihcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPFQ+O1xuXG4gIHB1dChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JyB8ICdldmVudHMnIHwgJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdhcnJheWJ1ZmZlcicgfCAnYmxvYicgfCAnanNvbicgfCAndGV4dCc7XG4gICAgfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8YW55PignUFVUJywgcmVzb3VyY2UsIGFkZEJvZHkob3B0aW9ucywgYm9keSkpO1xuICB9XG59XG4iXX0=