angular-odata 0.130.0 → 0.131.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/angular-odata.mjs +2298 -2162
- package/fesm2022/angular-odata.mjs.map +1 -1
- package/lib/api.d.ts +10 -11
- package/lib/cache/cache.d.ts +2 -2
- package/lib/cache/memory.d.ts +2 -2
- package/lib/cache/storage.d.ts +2 -2
- package/lib/loaders.d.ts +8 -8
- package/lib/metadata/csdl/csdl-annotation.d.ts +3 -3
- package/lib/metadata/csdl/csdl-entity-container.d.ts +2 -2
- package/lib/metadata/csdl/csdl-entity-set.d.ts +2 -2
- package/lib/metadata/csdl/csdl-enum-type.d.ts +3 -3
- package/lib/metadata/csdl/csdl-function-action.d.ts +4 -4
- package/lib/metadata/csdl/csdl-reference.d.ts +2 -2
- package/lib/metadata/csdl/csdl-schema.d.ts +2 -2
- package/lib/metadata/csdl/csdl-structural-property.d.ts +3 -3
- package/lib/metadata/csdl/csdl-structured-type.d.ts +3 -3
- package/lib/metadata/metadata.d.ts +2 -2
- package/lib/models/options.d.ts +2 -2
- package/lib/module.d.ts +3 -3
- package/lib/options.d.ts +3 -3
- package/lib/resources/query/expressions/apply.d.ts +1 -1
- package/lib/resources/query/expressions/compute.d.ts +1 -1
- package/lib/resources/query/expressions/count.d.ts +1 -1
- package/lib/resources/query/expressions/expand.d.ts +4 -3
- package/lib/resources/query/expressions/filter.d.ts +2 -1
- package/lib/resources/query/expressions/orderby.d.ts +2 -1
- package/lib/resources/query/expressions/search.d.ts +2 -1
- package/lib/resources/query/expressions/select.d.ts +2 -1
- package/lib/resources/query/handlers.d.ts +17 -5
- package/lib/resources/resource.d.ts +5 -5
- package/lib/resources/types/action.d.ts +2 -2
- package/lib/resources/types/entity-set.d.ts +2 -2
- package/lib/resources/types/navigation-property.d.ts +2 -2
- package/lib/resources/types/property.d.ts +2 -2
- package/lib/schema/annotation.d.ts +3 -3
- package/lib/schema/callable.d.ts +3 -3
- package/lib/schema/element.d.ts +3 -3
- package/lib/schema/entity-container.d.ts +2 -2
- package/lib/schema/entity-set.d.ts +2 -2
- package/lib/schema/enum-type.d.ts +2 -2
- package/lib/schema/parsers/callable.d.ts +4 -4
- package/lib/schema/parsers/enum-type.d.ts +3 -3
- package/lib/schema/parsers/structured-type.d.ts +4 -4
- package/lib/schema/schema.d.ts +3 -3
- package/lib/schema/singleton.d.ts +2 -2
- package/lib/schema/structured-type.d.ts +3 -3
- package/lib/services/entity.d.ts +1 -1
- package/lib/settings.d.ts +2 -2
- package/lib/types.d.ts +76 -74
- package/lib/utils/odata.d.ts +2 -2
- package/package.json +3 -5
- package/schematics/apigen/files/api-config/__fileName__.ts +4 -4
- package/esm2022/angular-odata.mjs +0 -5
- package/esm2022/lib/annotations.mjs +0 -146
- package/esm2022/lib/api.mjs +0 -439
- package/esm2022/lib/cache/cache.mjs +0 -177
- package/esm2022/lib/cache/index.mjs +0 -4
- package/esm2022/lib/cache/memory.mjs +0 -30
- package/esm2022/lib/cache/storage.mjs +0 -57
- package/esm2022/lib/client.mjs +0 -215
- package/esm2022/lib/constants.mjs +0 -95
- package/esm2022/lib/helper.mjs +0 -288
- package/esm2022/lib/index.mjs +0 -22
- package/esm2022/lib/loaders.mjs +0 -43
- package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -273
- package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -59
- package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -50
- package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -74
- package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -204
- package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -15
- package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -76
- package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -87
- package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -37
- package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -145
- package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -159
- package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -46
- package/esm2022/lib/metadata/index.mjs +0 -3
- package/esm2022/lib/metadata/metadata.mjs +0 -41
- package/esm2022/lib/metadata/parser.mjs +0 -564
- package/esm2022/lib/models/collection.mjs +0 -816
- package/esm2022/lib/models/index.mjs +0 -4
- package/esm2022/lib/models/model.mjs +0 -577
- package/esm2022/lib/models/options.mjs +0 -1227
- package/esm2022/lib/module.mjs +0 -55
- package/esm2022/lib/options.mjs +0 -91
- package/esm2022/lib/resources/index.mjs +0 -7
- package/esm2022/lib/resources/options.mjs +0 -66
- package/esm2022/lib/resources/path/handlers.mjs +0 -81
- package/esm2022/lib/resources/path/index.mjs +0 -3
- package/esm2022/lib/resources/path/segments.mjs +0 -149
- package/esm2022/lib/resources/query/builder.mjs +0 -645
- package/esm2022/lib/resources/query/expressions/apply.mjs +0 -238
- package/esm2022/lib/resources/query/expressions/base.mjs +0 -26
- package/esm2022/lib/resources/query/expressions/compute.mjs +0 -55
- package/esm2022/lib/resources/query/expressions/count.mjs +0 -118
- package/esm2022/lib/resources/query/expressions/expand.mjs +0 -154
- package/esm2022/lib/resources/query/expressions/filter.mjs +0 -180
- package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
- package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -81
- package/esm2022/lib/resources/query/expressions/search.mjs +0 -144
- package/esm2022/lib/resources/query/expressions/select.mjs +0 -49
- package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -770
- package/esm2022/lib/resources/query/handlers.mjs +0 -423
- package/esm2022/lib/resources/query/index.mjs +0 -5
- package/esm2022/lib/resources/query/options.mjs +0 -140
- package/esm2022/lib/resources/request.mjs +0 -210
- package/esm2022/lib/resources/resource.mjs +0 -316
- package/esm2022/lib/resources/response.mjs +0 -180
- package/esm2022/lib/resources/types/action.mjs +0 -118
- package/esm2022/lib/resources/types/batch.mjs +0 -428
- package/esm2022/lib/resources/types/count.mjs +0 -33
- package/esm2022/lib/resources/types/entity-set.mjs +0 -131
- package/esm2022/lib/resources/types/entity.mjs +0 -112
- package/esm2022/lib/resources/types/function.mjs +0 -149
- package/esm2022/lib/resources/types/index.mjs +0 -15
- package/esm2022/lib/resources/types/media.mjs +0 -44
- package/esm2022/lib/resources/types/metadata.mjs +0 -35
- package/esm2022/lib/resources/types/navigation-property.mjs +0 -246
- package/esm2022/lib/resources/types/options.mjs +0 -2
- package/esm2022/lib/resources/types/property.mjs +0 -187
- package/esm2022/lib/resources/types/reference.mjs +0 -87
- package/esm2022/lib/resources/types/singleton.mjs +0 -125
- package/esm2022/lib/resources/types/value.mjs +0 -48
- package/esm2022/lib/schema/annotation.mjs +0 -44
- package/esm2022/lib/schema/callable.mjs +0 -69
- package/esm2022/lib/schema/element.mjs +0 -70
- package/esm2022/lib/schema/entity-container.mjs +0 -13
- package/esm2022/lib/schema/entity-set.mjs +0 -11
- package/esm2022/lib/schema/enum-type.mjs +0 -69
- package/esm2022/lib/schema/index.mjs +0 -9
- package/esm2022/lib/schema/parsers/callable.mjs +0 -123
- package/esm2022/lib/schema/parsers/edm.mjs +0 -101
- package/esm2022/lib/schema/parsers/enum-type.mjs +0 -148
- package/esm2022/lib/schema/parsers/index.mjs +0 -5
- package/esm2022/lib/schema/parsers/structured-type.mjs +0 -548
- package/esm2022/lib/schema/schema.mjs +0 -52
- package/esm2022/lib/schema/singleton.mjs +0 -11
- package/esm2022/lib/schema/structured-type.mjs +0 -220
- package/esm2022/lib/services/base.mjs +0 -32
- package/esm2022/lib/services/entity-set.mjs +0 -161
- package/esm2022/lib/services/entity.mjs +0 -12
- package/esm2022/lib/services/factory.mjs +0 -39
- package/esm2022/lib/services/index.mjs +0 -5
- package/esm2022/lib/services/singleton.mjs +0 -55
- package/esm2022/lib/settings.mjs +0 -113
- package/esm2022/lib/types.mjs +0 -118
- package/esm2022/lib/utils/arraybuffers.mjs +0 -46
- package/esm2022/lib/utils/arrays.mjs +0 -10
- package/esm2022/lib/utils/dates.mjs +0 -18
- package/esm2022/lib/utils/durations.mjs +0 -40
- package/esm2022/lib/utils/enums.mjs +0 -61
- package/esm2022/lib/utils/http.mjs +0 -95
- package/esm2022/lib/utils/index.mjs +0 -10
- package/esm2022/lib/utils/objects.mjs +0 -204
- package/esm2022/lib/utils/odata.mjs +0 -22
- package/esm2022/lib/utils/strings.mjs +0 -20
- package/esm2022/lib/utils/types.mjs +0 -136
- package/esm2022/lib/utils/urls.mjs +0 -24
- package/esm2022/public-api.mjs +0 -5
|
@@ -1,177 +0,0 @@
|
|
|
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
|
-
timeout;
|
|
7
|
-
entries;
|
|
8
|
-
constructor({ timeout = DEFAULT_TIMEOUT }) {
|
|
9
|
-
this.timeout = timeout;
|
|
10
|
-
this.entries = new Map();
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Using the resource on the request build an array of string to identify the scope of the request
|
|
14
|
-
* @param req The request with the resource to build the scope
|
|
15
|
-
* @returns Array of string to identify the scope of the request
|
|
16
|
-
*/
|
|
17
|
-
scope(req) {
|
|
18
|
-
const segments = req.resource.cloneSegments();
|
|
19
|
-
return segments.segments({ key: true }).reduce((acc, s) => {
|
|
20
|
-
if (s.name === PathSegment.entitySet)
|
|
21
|
-
acc = [...acc, s.path()];
|
|
22
|
-
return acc;
|
|
23
|
-
}, ['request']);
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Using the odata context on the response build an array of string to identify the tags of the response
|
|
27
|
-
* @param res The response to build the tags
|
|
28
|
-
* @returns Array of string to identify the tags of the response
|
|
29
|
-
*/
|
|
30
|
-
tags(res) {
|
|
31
|
-
const tags = [];
|
|
32
|
-
const context = res.context;
|
|
33
|
-
if (context.entitySet) {
|
|
34
|
-
tags.push(context.key
|
|
35
|
-
? `${context.entitySet}(${context.key})`
|
|
36
|
-
: context.entitySet);
|
|
37
|
-
}
|
|
38
|
-
if (context.type)
|
|
39
|
-
tags.push(context.type);
|
|
40
|
-
return tags;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Build an entry from a payload and some options
|
|
44
|
-
* @param payload The payload to store in the cache
|
|
45
|
-
* @param timeout The timeout for the entry
|
|
46
|
-
* @param tags The tags for the entry
|
|
47
|
-
* @returns The entry to store in the cache
|
|
48
|
-
*/
|
|
49
|
-
buildEntry(payload, { timeout, tags }) {
|
|
50
|
-
return {
|
|
51
|
-
payload,
|
|
52
|
-
lastRead: Date.now(),
|
|
53
|
-
timeout: timeout || this.timeout,
|
|
54
|
-
tags: tags || [],
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Build a key from store an entry in the cache
|
|
59
|
-
* @param names The names of the entry
|
|
60
|
-
* @returns The key for the entry
|
|
61
|
-
*/
|
|
62
|
-
buildKey(names) {
|
|
63
|
-
return names.join(CACHE_KEY_SEPARATOR);
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Put some payload in the cache
|
|
67
|
-
* @param name The name for the entry
|
|
68
|
-
* @param payload The payload to store in the cache
|
|
69
|
-
* @param timeout The timeout for the entry
|
|
70
|
-
* @param scope The scope for the entry
|
|
71
|
-
* @param tags The tags for the entry
|
|
72
|
-
*/
|
|
73
|
-
put(name, payload, { timeout, scope, tags, } = {}) {
|
|
74
|
-
const entry = this.buildEntry(payload, { timeout, tags });
|
|
75
|
-
const key = this.buildKey([...(scope || []), name]);
|
|
76
|
-
this.entries.set(key, entry);
|
|
77
|
-
this.forget();
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Return the payload from the cache if it exists and is not expired
|
|
81
|
-
* @param name The name of the entry
|
|
82
|
-
* @param scope The scope of the entry
|
|
83
|
-
* @returns The payload of the entry
|
|
84
|
-
*/
|
|
85
|
-
get(name, { scope } = {}) {
|
|
86
|
-
const key = this.buildKey([...(scope || []), name]);
|
|
87
|
-
const entry = this.entries.get(key);
|
|
88
|
-
return entry !== undefined && !this.isExpired(entry)
|
|
89
|
-
? entry.payload
|
|
90
|
-
: undefined;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Remove all cache entries that are matching with the given options
|
|
94
|
-
* @param options The options to forget
|
|
95
|
-
*/
|
|
96
|
-
forget({ name, scope = [], tags = [], } = {}) {
|
|
97
|
-
if (name !== undefined)
|
|
98
|
-
scope.push(name);
|
|
99
|
-
const key = scope.length > 0 ? this.buildKey(scope) : undefined;
|
|
100
|
-
this.entries.forEach((entry, k) => {
|
|
101
|
-
if (this.isExpired(entry) || // Expired
|
|
102
|
-
(key !== undefined && k.startsWith(key)) || // Key
|
|
103
|
-
(tags.length > 0 && tags.some((t) => entry.tags.indexOf(t) !== -1)) // Tags
|
|
104
|
-
) {
|
|
105
|
-
this.entries.delete(k);
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Remove all cache entries
|
|
111
|
-
*/
|
|
112
|
-
flush() {
|
|
113
|
-
this.entries = new Map();
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Check if the entry is expired
|
|
117
|
-
* @param entry The cache entry
|
|
118
|
-
* @returns Boolean indicating if the entry is expired
|
|
119
|
-
*/
|
|
120
|
-
isExpired(entry) {
|
|
121
|
-
return entry.lastRead < Date.now() - (entry.timeout || this.timeout) * 1000;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Using the request, handle the fetching of the response
|
|
125
|
-
* @param req The request to fetch
|
|
126
|
-
* @param res$ Observable of the response
|
|
127
|
-
* @returns
|
|
128
|
-
*/
|
|
129
|
-
handleRequest(req, res$) {
|
|
130
|
-
return req.isFetch()
|
|
131
|
-
? this.handleFetch(req, res$)
|
|
132
|
-
: req.isMutate()
|
|
133
|
-
? this.handleMutate(req, res$)
|
|
134
|
-
: res$;
|
|
135
|
-
}
|
|
136
|
-
handleFetch(req, res$) {
|
|
137
|
-
const policy = req.fetchPolicy;
|
|
138
|
-
const cached = this.getResponse(req);
|
|
139
|
-
if (policy === 'no-cache') {
|
|
140
|
-
return res$;
|
|
141
|
-
}
|
|
142
|
-
if (policy === 'cache-only') {
|
|
143
|
-
if (cached) {
|
|
144
|
-
return of(cached);
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
return throwError(() => new Error('No Cached'));
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
if (policy === 'cache-first' ||
|
|
151
|
-
policy === 'cache-and-network' ||
|
|
152
|
-
policy === 'network-only') {
|
|
153
|
-
res$ = res$.pipe(tap((res) => {
|
|
154
|
-
if (res.options.cacheability !== 'no-store')
|
|
155
|
-
this.putResponse(req, res);
|
|
156
|
-
}));
|
|
157
|
-
}
|
|
158
|
-
return cached !== undefined && policy !== 'network-only'
|
|
159
|
-
? policy === 'cache-and-network'
|
|
160
|
-
? res$.pipe(startWith(cached))
|
|
161
|
-
: of(cached)
|
|
162
|
-
: res$;
|
|
163
|
-
}
|
|
164
|
-
handleMutate(req, res$) {
|
|
165
|
-
const requests = req.isBatch()
|
|
166
|
-
? req.resource
|
|
167
|
-
.requests()
|
|
168
|
-
.filter((r) => r.isMutate())
|
|
169
|
-
: [req];
|
|
170
|
-
for (var r of requests) {
|
|
171
|
-
const scope = this.scope(r);
|
|
172
|
-
this.forget({ scope });
|
|
173
|
-
}
|
|
174
|
-
return res$;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvY2FjaGUvY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXBFLE9BQU8sRUFBUyxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFnQjlDLE1BQU0sT0FBZ0IsVUFBVTtJQUM5QixPQUFPLENBQVM7SUFDaEIsT0FBTyxDQUFvQztJQUUzQyxZQUFZLEVBQUUsT0FBTyxHQUFHLGVBQWUsRUFBd0I7UUFDN0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUN6RCxDQUFDO0lBS0Q7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxHQUFzQjtRQUMxQixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlDLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FDNUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDVCxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLFNBQVM7Z0JBQ2xDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQVksQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUNELENBQUMsU0FBUyxDQUFDLENBQ1osQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUFDLEdBQXVCO1FBQzFCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoQixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQzVCLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQ1AsT0FBTyxDQUFDLEdBQUc7Z0JBQ1QsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsR0FBRyxHQUFHO2dCQUN4QyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDdEIsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsVUFBVSxDQUNSLE9BQVUsRUFDVixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQXlDO1FBRXhELE9BQU87WUFDTCxPQUFPO1lBQ1AsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDcEIsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTztZQUNoQyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7U0FDakIsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLEtBQWU7UUFDdEIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxHQUFHLENBQ0QsSUFBWSxFQUNaLE9BQVUsRUFDVixFQUNFLE9BQU8sRUFDUCxLQUFLLEVBQ0wsSUFBSSxNQUN1RCxFQUFFO1FBRS9ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUksT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEdBQUcsQ0FBSSxJQUFZLEVBQUUsRUFBRSxLQUFLLEtBQTJCLEVBQUU7UUFDdkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxPQUFPLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUNsRCxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDZixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsRUFDTCxJQUFJLEVBQ0osS0FBSyxHQUFHLEVBQUUsRUFDVixJQUFJLEdBQUcsRUFBRSxNQUMrQyxFQUFFO1FBQzFELElBQUksSUFBSSxLQUFLLFNBQVM7WUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEMsSUFDRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLFVBQVU7Z0JBQ25DLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTTtnQkFDbEQsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztjQUMzRSxDQUFDO2dCQUNELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFnQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLEtBQTJCO1FBQ25DLE9BQU8sS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDOUUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsYUFBYSxDQUNYLEdBQXNCLEVBQ3RCLElBQW9DO1FBRXBDLE9BQU8sR0FBRyxDQUFDLE9BQU8sRUFBRTtZQUNsQixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO2dCQUNkLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7Z0JBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRU8sV0FBVyxDQUNqQixHQUFzQixFQUN0QixJQUFvQztRQUVwQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDNUIsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNsRCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQ0UsTUFBTSxLQUFLLGFBQWE7WUFDeEIsTUFBTSxLQUFLLG1CQUFtQjtZQUM5QixNQUFNLEtBQUssY0FBYyxFQUN6QixDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQ2QsR0FBRyxDQUFDLENBQUMsR0FBdUIsRUFBRSxFQUFFO2dCQUM5QixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxLQUFLLFVBQVU7b0JBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxjQUFjO1lBQ3RELENBQUMsQ0FBQyxNQUFNLEtBQUssbUJBQW1CO2dCQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzlCLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFFTyxZQUFZLENBQ2xCLEdBQXNCLEVBQ3RCLElBQW9DO1FBRXBDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUU7WUFDNUIsQ0FBQyxDQUFFLEdBQUcsQ0FBQyxRQUErQjtpQkFDakMsUUFBUSxFQUFFO2lCQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsS0FBSyxJQUFJLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzdGFydFdpdGgsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENBQ0hFX0tFWV9TRVBBUkFUT1IsIERFRkFVTFRfVElNRU9VVCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPRGF0YUJhdGNoUmVzb3VyY2UsIE9EYXRhUmVxdWVzdCwgT0RhdGFSZXNwb25zZSB9IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBDYWNoZSwgUGF0aFNlZ21lbnQgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogQSBjYWNoZSBlbnRyeSB0aGF0IGhvbGRzIGEgcGF5bG9hZCwgYSBsYXN0IHJlYWQgdGltZSwgYW5kIGEgdGltZW91dCBmb3IgdGhlIGVudHJ5LlxuICogQHBhcmFtIHBheWxvYWQgVGhlIHBheWxvYWQgdG8gY2FjaGUuXG4gKiBAcGFyYW0gbGFzdFJlYWQgVGhlIGxhc3QgcmVhZCB0aW1lLlxuICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0gdGFncyBTb21lIHRhZ3MgdG8gaWRlbnRpZnkgdGhlIGVudHJ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9EYXRhQ2FjaGVFbnRyeTxUPiB7XG4gIHBheWxvYWQ6IFQ7XG4gIGxhc3RSZWFkOiBudW1iZXI7XG4gIHRpbWVvdXQ6IG51bWJlcjtcbiAgdGFnczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBPRGF0YUNhY2hlIGltcGxlbWVudHMgQ2FjaGUge1xuICB0aW1lb3V0OiBudW1iZXI7XG4gIGVudHJpZXM6IE1hcDxzdHJpbmcsIE9EYXRhQ2FjaGVFbnRyeTxhbnk+PjtcblxuICBjb25zdHJ1Y3Rvcih7IHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQgfTogeyB0aW1lb3V0PzogbnVtYmVyIH0pIHtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBPRGF0YUNhY2hlRW50cnk8YW55Pj4oKTtcbiAgfVxuXG4gIGFic3RyYWN0IGdldFJlc3BvbnNlKHJlcTogT0RhdGFSZXF1ZXN0PGFueT4pOiBPRGF0YVJlc3BvbnNlPGFueT4gfCB1bmRlZmluZWQ7XG4gIGFic3RyYWN0IHB1dFJlc3BvbnNlKHJlcTogT0RhdGFSZXF1ZXN0PGFueT4sIHJlczogT0RhdGFSZXNwb25zZTxhbnk+KTogdm9pZDtcblxuICAvKipcbiAgICogVXNpbmcgdGhlIHJlc291cmNlIG9uIHRoZSByZXF1ZXN0IGJ1aWxkIGFuIGFycmF5IG9mIHN0cmluZyB0byBpZGVudGlmeSB0aGUgc2NvcGUgb2YgdGhlIHJlcXVlc3RcbiAgICogQHBhcmFtIHJlcSBUaGUgcmVxdWVzdCB3aXRoIHRoZSByZXNvdXJjZSB0byBidWlsZCB0aGUgc2NvcGVcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygc3RyaW5nIHRvIGlkZW50aWZ5IHRoZSBzY29wZSBvZiB0aGUgcmVxdWVzdFxuICAgKi9cbiAgc2NvcGUocmVxOiBPRGF0YVJlcXVlc3Q8YW55Pik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHJlcS5yZXNvdXJjZS5jbG9uZVNlZ21lbnRzKCk7XG4gICAgcmV0dXJuIHNlZ21lbnRzLnNlZ21lbnRzKHsga2V5OiB0cnVlIH0pLnJlZHVjZShcbiAgICAgIChhY2MsIHMpID0+IHtcbiAgICAgICAgaWYgKHMubmFtZSA9PT0gUGF0aFNlZ21lbnQuZW50aXR5U2V0KVxuICAgICAgICAgIGFjYyA9IFsuLi5hY2MsIHMucGF0aCgpIGFzIHN0cmluZ107XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgWydyZXF1ZXN0J10sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2luZyB0aGUgb2RhdGEgY29udGV4dCBvbiB0aGUgcmVzcG9uc2UgYnVpbGQgYW4gYXJyYXkgb2Ygc3RyaW5nIHRvIGlkZW50aWZ5IHRoZSB0YWdzIG9mIHRoZSByZXNwb25zZVxuICAgKiBAcGFyYW0gcmVzIFRoZSByZXNwb25zZSB0byBidWlsZCB0aGUgdGFnc1xuICAgKiBAcmV0dXJucyBBcnJheSBvZiBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIHRhZ3Mgb2YgdGhlIHJlc3BvbnNlXG4gICAqL1xuICB0YWdzKHJlczogT0RhdGFSZXNwb25zZTxhbnk+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRhZ3MgPSBbXTtcbiAgICBjb25zdCBjb250ZXh0ID0gcmVzLmNvbnRleHQ7XG4gICAgaWYgKGNvbnRleHQuZW50aXR5U2V0KSB7XG4gICAgICB0YWdzLnB1c2goXG4gICAgICAgIGNvbnRleHQua2V5XG4gICAgICAgICAgPyBgJHtjb250ZXh0LmVudGl0eVNldH0oJHtjb250ZXh0LmtleX0pYFxuICAgICAgICAgIDogY29udGV4dC5lbnRpdHlTZXQsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY29udGV4dC50eXBlKSB0YWdzLnB1c2goY29udGV4dC50eXBlKTtcbiAgICByZXR1cm4gdGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBlbnRyeSBmcm9tIGEgcGF5bG9hZCBhbmQgc29tZSBvcHRpb25zXG4gICAqIEBwYXJhbSBwYXlsb2FkIFRoZSBwYXlsb2FkIHRvIHN0b3JlIGluIHRoZSBjYWNoZVxuICAgKiBAcGFyYW0gdGltZW91dCBUaGUgdGltZW91dCBmb3IgdGhlIGVudHJ5XG4gICAqIEBwYXJhbSB0YWdzIFRoZSB0YWdzIGZvciB0aGUgZW50cnlcbiAgICogQHJldHVybnMgVGhlIGVudHJ5IHRvIHN0b3JlIGluIHRoZSBjYWNoZVxuICAgKi9cbiAgYnVpbGRFbnRyeTxUPihcbiAgICBwYXlsb2FkOiBULFxuICAgIHsgdGltZW91dCwgdGFncyB9OiB7IHRpbWVvdXQ/OiBudW1iZXI7IHRhZ3M/OiBzdHJpbmdbXSB9LFxuICApOiBPRGF0YUNhY2hlRW50cnk8VD4ge1xuICAgIHJldHVybiB7XG4gICAgICBwYXlsb2FkLFxuICAgICAgbGFzdFJlYWQ6IERhdGUubm93KCksXG4gICAgICB0aW1lb3V0OiB0aW1lb3V0IHx8IHRoaXMudGltZW91dCxcbiAgICAgIHRhZ3M6IHRhZ3MgfHwgW10sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGtleSBmcm9tIHN0b3JlIGFuIGVudHJ5IGluIHRoZSBjYWNoZVxuICAgKiBAcGFyYW0gbmFtZXMgVGhlIG5hbWVzIG9mIHRoZSBlbnRyeVxuICAgKiBAcmV0dXJucyBUaGUga2V5IGZvciB0aGUgZW50cnlcbiAgICovXG4gIGJ1aWxkS2V5KG5hbWVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWVzLmpvaW4oQ0FDSEVfS0VZX1NFUEFSQVRPUik7XG4gIH1cblxuICAvKipcbiAgICogUHV0IHNvbWUgcGF5bG9hZCBpbiB0aGUgY2FjaGVcbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgZm9yIHRoZSBlbnRyeVxuICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgcGF5bG9hZCB0byBzdG9yZSBpbiB0aGUgY2FjaGVcbiAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWVvdXQgZm9yIHRoZSBlbnRyeVxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGZvciB0aGUgZW50cnlcbiAgICogQHBhcmFtIHRhZ3MgVGhlIHRhZ3MgZm9yIHRoZSBlbnRyeVxuICAgKi9cbiAgcHV0PFQ+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBULFxuICAgIHtcbiAgICAgIHRpbWVvdXQsXG4gICAgICBzY29wZSxcbiAgICAgIHRhZ3MsXG4gICAgfTogeyB0aW1lb3V0PzogbnVtYmVyOyBzY29wZT86IHN0cmluZ1tdOyB0YWdzPzogc3RyaW5nW10gfSA9IHt9LFxuICApIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuYnVpbGRFbnRyeTxUPihwYXlsb2FkLCB7IHRpbWVvdXQsIHRhZ3MgfSk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5idWlsZEtleShbLi4uKHNjb3BlIHx8IFtdKSwgbmFtZV0pO1xuICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCBlbnRyeSk7XG4gICAgdGhpcy5mb3JnZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHBheWxvYWQgZnJvbSB0aGUgY2FjaGUgaWYgaXQgZXhpc3RzIGFuZCBpcyBub3QgZXhwaXJlZFxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZW50cnlcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBvZiB0aGUgZW50cnlcbiAgICogQHJldHVybnMgVGhlIHBheWxvYWQgb2YgdGhlIGVudHJ5XG4gICAqL1xuICBnZXQ8VD4obmFtZTogc3RyaW5nLCB7IHNjb3BlIH06IHsgc2NvcGU/OiBzdHJpbmdbXSB9ID0ge30pOiBUIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkS2V5KFsuLi4oc2NvcGUgfHwgW10pLCBuYW1lXSk7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSk7XG4gICAgcmV0dXJuIGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuaXNFeHBpcmVkKGVudHJ5KVxuICAgICAgPyBlbnRyeS5wYXlsb2FkXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGNhY2hlIGVudHJpZXMgdGhhdCBhcmUgbWF0Y2hpbmcgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBmb3JnZXRcbiAgICovXG4gIGZvcmdldCh7XG4gICAgbmFtZSxcbiAgICBzY29wZSA9IFtdLFxuICAgIHRhZ3MgPSBbXSxcbiAgfTogeyBuYW1lPzogc3RyaW5nOyBzY29wZT86IHN0cmluZ1tdOyB0YWdzPzogc3RyaW5nW10gfSA9IHt9KSB7XG4gICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkgc2NvcGUucHVzaChuYW1lKTtcbiAgICBjb25zdCBrZXkgPSBzY29wZS5sZW5ndGggPiAwID8gdGhpcy5idWlsZEtleShzY29wZSkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5LCBrKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNFeHBpcmVkKGVudHJ5KSB8fCAvLyBFeHBpcmVkXG4gICAgICAgIChrZXkgIT09IHVuZGVmaW5lZCAmJiBrLnN0YXJ0c1dpdGgoa2V5KSkgfHwgLy8gS2V5XG4gICAgICAgICh0YWdzLmxlbmd0aCA+IDAgJiYgdGFncy5zb21lKCh0KSA9PiBlbnRyeS50YWdzLmluZGV4T2YodCkgIT09IC0xKSkgLy8gVGFnc1xuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoayk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBjYWNoZSBlbnRyaWVzXG4gICAqL1xuICBmbHVzaCgpIHtcbiAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgT0RhdGFDYWNoZUVudHJ5PGFueT4+KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGVudHJ5IGlzIGV4cGlyZWRcbiAgICogQHBhcmFtIGVudHJ5IFRoZSBjYWNoZSBlbnRyeVxuICAgKiBAcmV0dXJucyBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGVudHJ5IGlzIGV4cGlyZWRcbiAgICovXG4gIGlzRXhwaXJlZChlbnRyeTogT0RhdGFDYWNoZUVudHJ5PGFueT4pIHtcbiAgICByZXR1cm4gZW50cnkubGFzdFJlYWQgPCBEYXRlLm5vdygpIC0gKGVudHJ5LnRpbWVvdXQgfHwgdGhpcy50aW1lb3V0KSAqIDEwMDA7XG4gIH1cblxuICAvKipcbiAgICogVXNpbmcgdGhlIHJlcXVlc3QsIGhhbmRsZSB0aGUgZmV0Y2hpbmcgb2YgdGhlIHJlc3BvbnNlXG4gICAqIEBwYXJhbSByZXEgVGhlIHJlcXVlc3QgdG8gZmV0Y2hcbiAgICogQHBhcmFtIHJlcyQgT2JzZXJ2YWJsZSBvZiB0aGUgcmVzcG9uc2VcbiAgICogQHJldHVybnNcbiAgICovXG4gIGhhbmRsZVJlcXVlc3QoXG4gICAgcmVxOiBPRGF0YVJlcXVlc3Q8YW55PixcbiAgICByZXMkOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8YW55Pj4sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxhbnk+PiB7XG4gICAgcmV0dXJuIHJlcS5pc0ZldGNoKClcbiAgICAgID8gdGhpcy5oYW5kbGVGZXRjaChyZXEsIHJlcyQpXG4gICAgICA6IHJlcS5pc011dGF0ZSgpXG4gICAgICAgID8gdGhpcy5oYW5kbGVNdXRhdGUocmVxLCByZXMkKVxuICAgICAgICA6IHJlcyQ7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZldGNoKFxuICAgIHJlcTogT0RhdGFSZXF1ZXN0PGFueT4sXG4gICAgcmVzJDogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPGFueT4+LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8YW55Pj4ge1xuICAgIGNvbnN0IHBvbGljeSA9IHJlcS5mZXRjaFBvbGljeTtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmdldFJlc3BvbnNlKHJlcSk7XG4gICAgaWYgKHBvbGljeSA9PT0gJ25vLWNhY2hlJykge1xuICAgICAgcmV0dXJuIHJlcyQ7XG4gICAgfVxuICAgIGlmIChwb2xpY3kgPT09ICdjYWNoZS1vbmx5Jykge1xuICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICByZXR1cm4gb2YoY2FjaGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignTm8gQ2FjaGVkJykpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBwb2xpY3kgPT09ICdjYWNoZS1maXJzdCcgfHxcbiAgICAgIHBvbGljeSA9PT0gJ2NhY2hlLWFuZC1uZXR3b3JrJyB8fFxuICAgICAgcG9saWN5ID09PSAnbmV0d29yay1vbmx5J1xuICAgICkge1xuICAgICAgcmVzJCA9IHJlcyQucGlwZShcbiAgICAgICAgdGFwKChyZXM6IE9EYXRhUmVzcG9uc2U8YW55PikgPT4ge1xuICAgICAgICAgIGlmIChyZXMub3B0aW9ucy5jYWNoZWFiaWxpdHkgIT09ICduby1zdG9yZScpXG4gICAgICAgICAgICB0aGlzLnB1dFJlc3BvbnNlKHJlcSwgcmVzKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkICE9PSB1bmRlZmluZWQgJiYgcG9saWN5ICE9PSAnbmV0d29yay1vbmx5J1xuICAgICAgPyBwb2xpY3kgPT09ICdjYWNoZS1hbmQtbmV0d29yaydcbiAgICAgICAgPyByZXMkLnBpcGUoc3RhcnRXaXRoKGNhY2hlZCkpXG4gICAgICAgIDogb2YoY2FjaGVkKVxuICAgICAgOiByZXMkO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNdXRhdGUoXG4gICAgcmVxOiBPRGF0YVJlcXVlc3Q8YW55PixcbiAgICByZXMkOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8YW55Pj4sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxhbnk+PiB7XG4gICAgY29uc3QgcmVxdWVzdHMgPSByZXEuaXNCYXRjaCgpXG4gICAgICA/IChyZXEucmVzb3VyY2UgYXMgT0RhdGFCYXRjaFJlc291cmNlKVxuICAgICAgICAgIC5yZXF1ZXN0cygpXG4gICAgICAgICAgLmZpbHRlcigocikgPT4gci5pc011dGF0ZSgpKVxuICAgICAgOiBbcmVxXTtcbiAgICBmb3IgKHZhciByIG9mIHJlcXVlc3RzKSB7XG4gICAgICBjb25zdCBzY29wZSA9IHRoaXMuc2NvcGUocik7XG4gICAgICB0aGlzLmZvcmdldCh7IHNjb3BlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzJDtcbiAgfVxufVxuIl19
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export * from './cache';
|
|
2
|
-
export * from './memory';
|
|
3
|
-
export * from './storage';
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvY2FjaGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vbWVtb3J5JztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZSc7XG4iXX0=
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { ODataCache } from './cache';
|
|
2
|
-
export class ODataInMemoryCache extends ODataCache {
|
|
3
|
-
constructor({ timeout } = {}) {
|
|
4
|
-
super({ timeout });
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* Store the response in the cache
|
|
8
|
-
* @param req The request with the resource to store the response
|
|
9
|
-
* @param res The response to store in the cache
|
|
10
|
-
*/
|
|
11
|
-
putResponse(req, res) {
|
|
12
|
-
let scope = this.scope(req);
|
|
13
|
-
let tags = this.tags(res);
|
|
14
|
-
this.put(req.cacheKey, res, {
|
|
15
|
-
timeout: res.options.maxAge,
|
|
16
|
-
scope,
|
|
17
|
-
tags,
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Restore the response from the cache
|
|
22
|
-
* @param req The request with the resource to get the response
|
|
23
|
-
* @returns The response from the cache
|
|
24
|
-
*/
|
|
25
|
-
getResponse(req) {
|
|
26
|
-
let scope = this.scope(req);
|
|
27
|
-
return this.get(req.cacheKey, { scope });
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL2NhY2hlL21lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXJDLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxVQUFVO0lBQ2hELFlBQVksRUFBRSxPQUFPLEtBQTJCLEVBQUU7UUFDaEQsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxHQUFzQixFQUFFLEdBQXVCO1FBQ3pELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQzFCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDM0IsS0FBSztZQUNMLElBQUk7U0FDTCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxHQUFzQjtRQUNoQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPRGF0YVJlcXVlc3QsIE9EYXRhUmVzcG9uc2UgfSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgT0RhdGFDYWNoZSB9IGZyb20gJy4vY2FjaGUnO1xuXG5leHBvcnQgY2xhc3MgT0RhdGFJbk1lbW9yeUNhY2hlIGV4dGVuZHMgT0RhdGFDYWNoZSB7XG4gIGNvbnN0cnVjdG9yKHsgdGltZW91dCB9OiB7IHRpbWVvdXQ/OiBudW1iZXIgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyB0aW1lb3V0IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIHRoZSByZXNwb25zZSBpbiB0aGUgY2FjaGVcbiAgICogQHBhcmFtIHJlcSBUaGUgcmVxdWVzdCB3aXRoIHRoZSByZXNvdXJjZSB0byBzdG9yZSB0aGUgcmVzcG9uc2VcbiAgICogQHBhcmFtIHJlcyBUaGUgcmVzcG9uc2UgdG8gc3RvcmUgaW4gdGhlIGNhY2hlXG4gICAqL1xuICBwdXRSZXNwb25zZShyZXE6IE9EYXRhUmVxdWVzdDxhbnk+LCByZXM6IE9EYXRhUmVzcG9uc2U8YW55Pikge1xuICAgIGxldCBzY29wZSA9IHRoaXMuc2NvcGUocmVxKTtcbiAgICBsZXQgdGFncyA9IHRoaXMudGFncyhyZXMpO1xuICAgIHRoaXMucHV0KHJlcS5jYWNoZUtleSwgcmVzLCB7XG4gICAgICB0aW1lb3V0OiByZXMub3B0aW9ucy5tYXhBZ2UsXG4gICAgICBzY29wZSxcbiAgICAgIHRhZ3MsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgY2FjaGVcbiAgICogQHBhcmFtIHJlcSBUaGUgcmVxdWVzdCB3aXRoIHRoZSByZXNvdXJjZSB0byBnZXQgdGhlIHJlc3BvbnNlXG4gICAqIEByZXR1cm5zIFRoZSByZXNwb25zZSBmcm9tIHRoZSBjYWNoZVxuICAgKi9cbiAgZ2V0UmVzcG9uc2UocmVxOiBPRGF0YVJlcXVlc3Q8YW55Pik6IE9EYXRhUmVzcG9uc2U8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHNjb3BlID0gdGhpcy5zY29wZShyZXEpO1xuICAgIHJldHVybiB0aGlzLmdldChyZXEuY2FjaGVLZXksIHsgc2NvcGUgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { ODataResponse } from '../resources';
|
|
2
|
-
import { ODataCache } from './cache';
|
|
3
|
-
export class ODataInStorageCache extends ODataCache {
|
|
4
|
-
name;
|
|
5
|
-
storage;
|
|
6
|
-
constructor({ name, storage = sessionStorage, timeout, }) {
|
|
7
|
-
super({ timeout });
|
|
8
|
-
this.name = name;
|
|
9
|
-
this.storage = storage;
|
|
10
|
-
this.restore();
|
|
11
|
-
window.addEventListener('beforeunload', () => this.store());
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Store the cache in the storage
|
|
15
|
-
*/
|
|
16
|
-
store() {
|
|
17
|
-
this.storage.setItem(this.name, JSON.stringify(Array.from(this.entries.entries())));
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Restore the cache from the storage
|
|
21
|
-
*/
|
|
22
|
-
restore() {
|
|
23
|
-
this.entries = new Map(JSON.parse(this.storage.getItem(this.name) || '[]'));
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Flush the cache and clean the storage
|
|
27
|
-
*/
|
|
28
|
-
flush() {
|
|
29
|
-
super.flush();
|
|
30
|
-
this.store();
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Store the response in the cache
|
|
34
|
-
* @param req The request with the resource to store the response
|
|
35
|
-
* @param res The response to store in the cache
|
|
36
|
-
*/
|
|
37
|
-
putResponse(req, res) {
|
|
38
|
-
const scope = this.scope(req);
|
|
39
|
-
const tags = this.tags(res);
|
|
40
|
-
this.put(req.cacheKey, res.toJson(), {
|
|
41
|
-
timeout: res.options.maxAge,
|
|
42
|
-
scope,
|
|
43
|
-
tags,
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Restore the response from the cache
|
|
48
|
-
* @param req The request with the resource to get the response
|
|
49
|
-
* @returns The response from the cache
|
|
50
|
-
*/
|
|
51
|
-
getResponse(req) {
|
|
52
|
-
const scope = this.scope(req);
|
|
53
|
-
const data = this.get(req.cacheKey, { scope });
|
|
54
|
-
return data !== undefined ? ODataResponse.fromJson(req, data) : undefined;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9jYWNoZS9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQW1CLE1BQU0sU0FBUyxDQUFDO0FBVXRELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxVQUFVO0lBQ2pELElBQUksQ0FBUztJQUNiLE9BQU8sQ0FBVTtJQUVqQixZQUFZLEVBQ1YsSUFBSSxFQUNKLE9BQU8sR0FBRyxjQUFjLEVBQ3hCLE9BQU8sR0FLUjtRQUNDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQ2xCLElBQUksQ0FBQyxJQUFJLEVBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUNuRCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUNwRCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ00sS0FBSztRQUNaLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLEdBQXNCLEVBQUUsR0FBdUI7UUFDekQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxHQUFHLENBQWUsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakQsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUMzQixLQUFLO1lBQ0wsSUFBSTtTQUNMLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLEdBQXNCO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBZSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUU3RCxPQUFPLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDNUUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT0RhdGFSZXF1ZXN0LCBPRGF0YVJlc3BvbnNlIH0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IE9EYXRhQ2FjaGUsIE9EYXRhQ2FjaGVFbnRyeSB9IGZyb20gJy4vY2FjaGUnO1xuXG5pbnRlcmZhY2UgUmVzcG9uc2VKc29uIHtcbiAgYm9keTogYW55IHwgbnVsbDtcbiAgaGVhZGVyczogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfTtcbiAgc3RhdHVzOiBudW1iZXI7XG4gIHN0YXR1c1RleHQ6IHN0cmluZztcbiAgdXJsOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFJblN0b3JhZ2VDYWNoZSBleHRlbmRzIE9EYXRhQ2FjaGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIG5hbWUsXG4gICAgc3RvcmFnZSA9IHNlc3Npb25TdG9yYWdlLFxuICAgIHRpbWVvdXQsXG4gIH06IHtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzdG9yYWdlPzogU3RvcmFnZTtcbiAgfSkge1xuICAgIHN1cGVyKHsgdGltZW91dCB9KTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc3RvcmFnZSA9IHN0b3JhZ2U7XG4gICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHRoaXMuc3RvcmUoKSk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgdGhlIGNhY2hlIGluIHRoZSBzdG9yYWdlXG4gICAqL1xuICBzdG9yZSgpIHtcbiAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odGhpcy5lbnRyaWVzLmVudHJpZXMoKSkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSB0aGUgY2FjaGUgZnJvbSB0aGUgc3RvcmFnZVxuICAgKi9cbiAgcmVzdG9yZSgpIHtcbiAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgT0RhdGFDYWNoZUVudHJ5PGFueT4+KFxuICAgICAgSlNPTi5wYXJzZSh0aGlzLnN0b3JhZ2UuZ2V0SXRlbSh0aGlzLm5hbWUpIHx8ICdbXScpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggdGhlIGNhY2hlIGFuZCBjbGVhbiB0aGUgc3RvcmFnZVxuICAgKi9cbiAgb3ZlcnJpZGUgZmx1c2goKSB7XG4gICAgc3VwZXIuZmx1c2goKTtcbiAgICB0aGlzLnN0b3JlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgdGhlIHJlc3BvbnNlIGluIHRoZSBjYWNoZVxuICAgKiBAcGFyYW0gcmVxIFRoZSByZXF1ZXN0IHdpdGggdGhlIHJlc291cmNlIHRvIHN0b3JlIHRoZSByZXNwb25zZVxuICAgKiBAcGFyYW0gcmVzIFRoZSByZXNwb25zZSB0byBzdG9yZSBpbiB0aGUgY2FjaGVcbiAgICovXG4gIHB1dFJlc3BvbnNlKHJlcTogT0RhdGFSZXF1ZXN0PGFueT4sIHJlczogT0RhdGFSZXNwb25zZTxhbnk+KSB7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlKHJlcSk7XG4gICAgY29uc3QgdGFncyA9IHRoaXMudGFncyhyZXMpO1xuICAgIHRoaXMucHV0PFJlc3BvbnNlSnNvbj4ocmVxLmNhY2hlS2V5LCByZXMudG9Kc29uKCksIHtcbiAgICAgIHRpbWVvdXQ6IHJlcy5vcHRpb25zLm1heEFnZSxcbiAgICAgIHNjb3BlLFxuICAgICAgdGFncyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIHRoZSByZXNwb25zZSBmcm9tIHRoZSBjYWNoZVxuICAgKiBAcGFyYW0gcmVxIFRoZSByZXF1ZXN0IHdpdGggdGhlIHJlc291cmNlIHRvIGdldCB0aGUgcmVzcG9uc2VcbiAgICogQHJldHVybnMgVGhlIHJlc3BvbnNlIGZyb20gdGhlIGNhY2hlXG4gICAqL1xuICBnZXRSZXNwb25zZShyZXE6IE9EYXRhUmVxdWVzdDxhbnk+KTogT0RhdGFSZXNwb25zZTxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuc2NvcGUocmVxKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXQ8UmVzcG9uc2VKc29uPihyZXEuY2FjaGVLZXksIHsgc2NvcGUgfSk7XG5cbiAgICByZXR1cm4gZGF0YSAhPT0gdW5kZWZpbmVkID8gT0RhdGFSZXNwb25zZS5mcm9tSnNvbihyZXEsIGRhdGEpIDogdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
|
package/esm2022/lib/client.mjs
DELETED
|
@@ -1,215 +0,0 @@
|
|
|
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
|
-
http;
|
|
23
|
-
loader;
|
|
24
|
-
settings;
|
|
25
|
-
constructor(http, loader) {
|
|
26
|
-
this.http = http;
|
|
27
|
-
this.loader = loader;
|
|
28
|
-
this.loader.loadConfigs().subscribe((configs) => {
|
|
29
|
-
this.settings = new ODataSettings(configs);
|
|
30
|
-
this.settings.configure({
|
|
31
|
-
requester: (req) => this.http.request(req.method, `${req.url}`, {
|
|
32
|
-
body: req.body,
|
|
33
|
-
context: req.context,
|
|
34
|
-
headers: req.headers,
|
|
35
|
-
observe: req.observe,
|
|
36
|
-
params: req.params,
|
|
37
|
-
reportProgress: req.reportProgress,
|
|
38
|
-
responseType: req.responseType,
|
|
39
|
-
withCredentials: req.withCredentials,
|
|
40
|
-
}),
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
//#region Resolve Building Blocks
|
|
45
|
-
/**
|
|
46
|
-
* Resolve the api for the given value.
|
|
47
|
-
* Where value is: string type or an string name or an instance of resource.
|
|
48
|
-
* @param value The value to resolve.
|
|
49
|
-
* @returns The api for the value.
|
|
50
|
-
*/
|
|
51
|
-
apiFor(value) {
|
|
52
|
-
let api = undefined;
|
|
53
|
-
if (value instanceof ODataResource)
|
|
54
|
-
api = this.settings.findApiForTypes(value.types());
|
|
55
|
-
else if (typeof value === 'string')
|
|
56
|
-
api =
|
|
57
|
-
this.settings.findApiByName(value) ||
|
|
58
|
-
this.settings.findApiForType(value);
|
|
59
|
-
return api ?? this.settings.defaultApi();
|
|
60
|
-
}
|
|
61
|
-
defaultApi() {
|
|
62
|
-
return this.settings.defaultApi();
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Resolve the parser for the given string type.
|
|
66
|
-
* @param type The string type of the parser.
|
|
67
|
-
* @returns The parser for the given type.
|
|
68
|
-
*/
|
|
69
|
-
parserForType(type) {
|
|
70
|
-
return this.settings.parserForType(type);
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Resolve the enum type for the given string type.
|
|
74
|
-
* @param type The string type of the enum type.
|
|
75
|
-
* @returns The enum type for the given type.
|
|
76
|
-
*/
|
|
77
|
-
enumTypeForType(type) {
|
|
78
|
-
return this.settings.enumTypeForType(type);
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Resolve the structured type for the given string type.
|
|
82
|
-
* @param type The string type of the structured type.
|
|
83
|
-
* @returns The structured type for the given type.
|
|
84
|
-
*/
|
|
85
|
-
structuredTypeForType(type) {
|
|
86
|
-
return this.settings.structuredTypeForType(type);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Resolve the callable for the given string type.
|
|
90
|
-
* @param type The string type of the callable.
|
|
91
|
-
* @returns The callable for the given type.
|
|
92
|
-
*/
|
|
93
|
-
callableForType(type) {
|
|
94
|
-
return this.settings.callableForType(type);
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Resolve the entity set for the given string type.
|
|
98
|
-
* @param type The string type of the entity set.
|
|
99
|
-
* @returns The entity set for the given type.
|
|
100
|
-
*/
|
|
101
|
-
entitySetForType(type) {
|
|
102
|
-
return this.settings.entitySetForType(type);
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Resolve the model for the given string type.
|
|
106
|
-
* @param type The string type of the model.
|
|
107
|
-
* @returns The model for the given type.
|
|
108
|
-
*/
|
|
109
|
-
modelForType(type) {
|
|
110
|
-
return this.settings.modelForType(type);
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Resolve the collection for the given string type.
|
|
114
|
-
* @param type The string type of the collection.
|
|
115
|
-
* @returns The collection for the given type.
|
|
116
|
-
*/
|
|
117
|
-
collectionForType(type) {
|
|
118
|
-
return this.settings.collectionForType(type);
|
|
119
|
-
}
|
|
120
|
-
fromJson(json, apiNameOrType) {
|
|
121
|
-
return this.apiFor(apiNameOrType).fromJson(json);
|
|
122
|
-
}
|
|
123
|
-
// Requests
|
|
124
|
-
/**
|
|
125
|
-
* Build a resource for the metadata.
|
|
126
|
-
* @param apiName The name of the API.
|
|
127
|
-
* @returns The metadata resource.
|
|
128
|
-
*/
|
|
129
|
-
metadata(apiName) {
|
|
130
|
-
return this.apiFor(apiName).metadata();
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Build a resource for the batch.
|
|
134
|
-
* @param apiName The name of the API.
|
|
135
|
-
* @returns The batch resource.
|
|
136
|
-
*/
|
|
137
|
-
batch(apiName) {
|
|
138
|
-
return this.apiFor(apiName).batch();
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Build a resource for the singleton.
|
|
142
|
-
* @param path The full path to the singleton.
|
|
143
|
-
* @param apiNameOrType The name of the API or the type of the singleton.
|
|
144
|
-
* @returns The singleton resource.
|
|
145
|
-
*/
|
|
146
|
-
singleton(path, apiNameOrType) {
|
|
147
|
-
return this.apiFor(apiNameOrType).singleton(path);
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Build a resource for the entity set.
|
|
151
|
-
* @param path The full path to the entity set.
|
|
152
|
-
* @param apiNameOrType The name of the API or the type of the entity set.
|
|
153
|
-
* @returns The entity set resource.
|
|
154
|
-
*/
|
|
155
|
-
entitySet(path, apiNameOrType) {
|
|
156
|
-
return this.apiFor(apiNameOrType).entitySet(path);
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Build a resource for unbound action.
|
|
160
|
-
* @param path The full path to the action.
|
|
161
|
-
* @param apiNameOrType The name of the API or the type of the entity.
|
|
162
|
-
* @returns The unbound action resource.
|
|
163
|
-
*/
|
|
164
|
-
action(path, apiNameOrType) {
|
|
165
|
-
return this.apiFor(apiNameOrType).action(path);
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Build a resource for unbound function.
|
|
169
|
-
* @param path The full path to the function.
|
|
170
|
-
* @param apiNameOrType The name of the API or the type of the callable.
|
|
171
|
-
* @returns The unbound function resource.
|
|
172
|
-
*/
|
|
173
|
-
function(path, apiNameOrType) {
|
|
174
|
-
return this.apiFor(apiNameOrType).function(path);
|
|
175
|
-
}
|
|
176
|
-
request(method, resource, options) {
|
|
177
|
-
let api = this.apiFor(resource);
|
|
178
|
-
return api.request(method, resource, options);
|
|
179
|
-
}
|
|
180
|
-
delete(resource, options = {}) {
|
|
181
|
-
return this.request('DELETE', resource, addBody(options, null));
|
|
182
|
-
}
|
|
183
|
-
get(resource, options = {}) {
|
|
184
|
-
return this.request('GET', resource, options);
|
|
185
|
-
}
|
|
186
|
-
head(resource, options = {}) {
|
|
187
|
-
return this.request('HEAD', resource, options);
|
|
188
|
-
}
|
|
189
|
-
jsonp(resource, callbackParam) {
|
|
190
|
-
return this.request('JSONP', resource, {
|
|
191
|
-
body: null,
|
|
192
|
-
params: new HttpParams().append(callbackParam, 'JSONP_CALLBACK'),
|
|
193
|
-
observe: 'body',
|
|
194
|
-
responseType: 'json',
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
options(resource, options = {}) {
|
|
198
|
-
return this.request('OPTIONS', resource, options);
|
|
199
|
-
}
|
|
200
|
-
patch(resource, body, options = {}) {
|
|
201
|
-
return this.request('PATCH', resource, addBody(options, body));
|
|
202
|
-
}
|
|
203
|
-
post(resource, body, options = {}) {
|
|
204
|
-
return this.request('POST', resource, addBody(options, body));
|
|
205
|
-
}
|
|
206
|
-
put(resource, body, options = {}) {
|
|
207
|
-
return this.request('PUT', resource, addBody(options, body));
|
|
208
|
-
}
|
|
209
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ODataClient, deps: [{ token: i1.HttpClient }, { token: i2.ODataConfigLoader }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
210
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ODataClient });
|
|
211
|
-
}
|
|
212
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ODataClient, decorators: [{
|
|
213
|
-
type: Injectable
|
|
214
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.ODataConfigLoader }] });
|
|
215
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXlCLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLM0MsT0FBTyxFQVVMLGFBQWEsR0FJZCxNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7QUFFM0MsU0FBUyxPQUFPLENBQ2QsT0FHQyxFQUNELElBQWM7SUFFZCxPQUFPO1FBQ0wsSUFBSTtRQUNKLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7UUFDaEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO1FBQ3RDLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtRQUNsQyxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7S0FDekMsQ0FBQztBQUNKLENBQUM7QUFHRCxNQUFNLE9BQU8sV0FBVztJQUdaO0lBQ0E7SUFIVixRQUFRLENBQWlCO0lBQ3pCLFlBQ1UsSUFBZ0IsRUFDaEIsTUFBeUI7UUFEekIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQUVqQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsSUFBSSxD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QU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUF5SUQsR0FBRyxDQUNELFFBQTRCLEVBQzVCLElBQWdCLEVBQ2hCLFVBR0ksRUFBRTtRQUVOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBTSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO3VHQTV6Q1UsV0FBVzsyR0FBWCxXQUFXOzsyRkFBWCxXQUFXO2tCQUR2QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEV2ZW50LCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT0RhdGFBcGkgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBPRGF0YUNvbmZpZ0xvYWRlciB9IGZyb20gJy4vbG9hZGVycyc7XG5pbXBvcnQgeyBPRGF0YUNvbGxlY3Rpb24sIE9EYXRhTW9kZWwgfSBmcm9tICcuL21vZGVscy9pbmRleCc7XG5pbXBvcnQge1xuICBPRGF0YUFjdGlvblJlc291cmNlLFxuICBPRGF0YUJhdGNoUmVzb3VyY2UsXG4gIE9EYXRhRW50aXR5UmVzb3VyY2UsXG4gIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UsXG4gIE9EYXRhRnVuY3Rpb25SZXNvdXJjZSxcbiAgT0RhdGFNZXRhZGF0YVJlc291cmNlLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YU9wdGlvbnMsXG4gIE9EYXRhUmVxdWVzdCxcbiAgT0RhdGFSZXNvdXJjZSxcbiAgT0RhdGFSZXNwb25zZSxcbiAgT0RhdGFTZWdtZW50LFxuICBPRGF0YVNpbmdsZXRvblJlc291cmNlLFxufSBmcm9tICcuL3Jlc291cmNlcy9pbmRleCc7XG5pbXBvcnQgeyBPRGF0YVNldHRpbmdzIH0gZnJvbSAnLi9zZXR0aW5ncyc7XG5cbmZ1bmN0aW9uIGFkZEJvZHk8VD4oXG4gIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBvYnNlcnZlPzogJ2JvZHknIHwgJ2V2ZW50cycgfCAncmVzcG9uc2UnO1xuICAgIHJlc3BvbnNlVHlwZT86ICdhcnJheWJ1ZmZlcicgfCAnYmxvYicgfCAnanNvbicgfCAndGV4dCc7XG4gIH0sXG4gIGJvZHk6IFQgfCBudWxsLFxuKTogYW55IHtcbiAgcmV0dXJuIHtcbiAgICBib2R5LFxuICAgIGV0YWc6IG9wdGlvbnMuZXRhZyxcbiAgICBmZXRjaFBvbGljeTogb3B0aW9ucy5mZXRjaFBvbGljeSxcbiAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMsXG4gICAgb2JzZXJ2ZTogb3B0aW9ucy5vYnNlcnZlLFxuICAgIHBhcmFtczogb3B0aW9ucy5wYXJhbXMsXG4gICAgcmVwb3J0UHJvZ3Jlc3M6IG9wdGlvbnMucmVwb3J0UHJvZ3Jlc3MsXG4gICAgcmVzcG9uc2VUeXBlOiBvcHRpb25zLnJlc3BvbnNlVHlwZSxcbiAgICB3aXRoQ3JlZGVudGlhbHM6IG9wdGlvbnMud2l0aENyZWRlbnRpYWxzLFxuICB9O1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT0RhdGFDbGllbnQge1xuICBzZXR0aW5ncz86IE9EYXRhU2V0dGluZ3M7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGxvYWRlcjogT0RhdGFDb25maWdMb2FkZXIsXG4gICkge1xuICAgIHRoaXMubG9hZGVyLmxvYWRDb25maWdzKCkuc3Vic2NyaWJlKChjb25maWdzKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzID0gbmV3IE9EYXRhU2V0dGluZ3MoY29uZmlncyk7XG4gICAgICB0aGlzLnNldHRpbmdzLmNvbmZpZ3VyZSh7XG4gICAgICAgIHJlcXVlc3RlcjogKHJlcTogT0RhdGFSZXF1ZXN0PGFueT4pOiBPYnNlcnZhYmxlPGFueT4gPT5cbiAgICAgICAgICB0aGlzLmh0dHAucmVxdWVzdChyZXEubWV0aG9kLCBgJHtyZXEudXJsfWAsIHtcbiAgICAgICAgICAgIGJvZHk6IHJlcS5ib2R5LFxuICAgICAgICAgICAgY29udGV4dDogcmVxLmNvbnRleHQsXG4gICAgICAgICAgICBoZWFkZXJzOiByZXEuaGVhZGVycyxcbiAgICAgICAgICAgIG9ic2VydmU6IHJlcS5vYnNlcnZlLFxuICAgICAgICAgICAgcGFyYW1zOiByZXEucGFyYW1zLFxuICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcS5yZXBvcnRQcm9ncmVzcyxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogcmVxLnJlc3BvbnNlVHlwZSxcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogcmVxLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8jcmVnaW9uIFJlc29sdmUgQnVpbGRpbmcgQmxvY2tzXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBhcGkgZm9yIHRoZSBnaXZlbiB2YWx1ZS5cbiAgICogV2hlcmUgdmFsdWUgaXM6IHN0cmluZyB0eXBlIG9yIGFuIHN0cmluZyBuYW1lIG9yIGFuIGluc3RhbmNlIG9mIHJlc291cmNlLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlc29sdmUuXG4gICAqIEByZXR1cm5zIFRoZSBhcGkgZm9yIHRoZSB2YWx1ZS5cbiAgICovXG4gIGFwaUZvcih2YWx1ZT86IE9EYXRhUmVzb3VyY2U8YW55PiB8IHN0cmluZyk6IE9EYXRhQXBpIHtcbiAgICBsZXQgYXBpOiBPRGF0YUFwaSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPRGF0YVJlc291cmNlKVxuICAgICAgYXBpID0gdGhpcy5zZXR0aW5ncyEuZmluZEFwaUZvclR5cGVzKHZhbHVlLnR5cGVzKCkpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpXG4gICAgICBhcGkgPVxuICAgICAgICB0aGlzLnNldHRpbmdzIS5maW5kQXBpQnlOYW1lKHZhbHVlKSB8fFxuICAgICAgICB0aGlzLnNldHRpbmdzIS5maW5kQXBpRm9yVHlwZSh2YWx1ZSk7XG4gICAgcmV0dXJuIGFwaSA/PyB0aGlzLnNldHRpbmdzIS5kZWZhdWx0QXBpKCk7XG4gIH1cblxuICBkZWZhdWx0QXBpKCkge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzIS5kZWZhdWx0QXBpKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgcGFyc2VyIGZvciB0aGUgZ2l2ZW4gc3RyaW5nIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBzdHJpbmcgdHlwZSBvZiB0aGUgcGFyc2VyLlxuICAgKiBAcmV0dXJucyBUaGUgcGFyc2VyIGZvciB0aGUgZ2l2ZW4gdHlwZS5cbiAgICovXG4gIHBhcnNlckZvclR5cGU8VD4odHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MhLnBhcnNlckZvclR5cGU8VD4odHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgZW51bSB0eXBlIGZvciB0aGUgZ2l2ZW4gc3RyaW5nIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBzdHJpbmcgdHlwZSBvZiB0aGUgZW51bSB0eXBlLlxuICAgKiBAcmV0dXJucyBUaGUgZW51bSB0eXBlIGZvciB0aGUgZ2l2ZW4gdHlwZS5cbiAgICovXG4gIGVudW1UeXBlRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncyEuZW51bVR5cGVGb3JUeXBlPFQ+KHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIHN0cnVjdHVyZWQgdHlwZSBmb3IgdGhlIGdpdmVuIHN0cmluZyB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgc3RyaW5nIHR5cGUgb2YgdGhlIHN0cnVjdHVyZWQgdHlwZS5cbiAgICogQHJldHVybnMgVGhlIHN0cnVjdHVyZWQgdHlwZSBmb3IgdGhlIGdpdmVuIHR5cGUuXG4gICAqL1xuICBzdHJ1Y3R1cmVkVHlwZUZvclR5cGU8VD4odHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MhLnN0cnVjdHVyZWRUeXBlRm9yVHlwZTxUPih0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBjYWxsYWJsZSBmb3IgdGhlIGdpdmVuIHN0cmluZyB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgc3RyaW5nIHR5cGUgb2YgdGhlIGNhbGxhYmxlLlxuICAgKiBAcmV0dXJucyBUaGUgY2FsbGFibGUgZm9yIHRoZSBnaXZlbiB0eXBlLlxuICAgKi9cbiAgY2FsbGFibGVGb3JUeXBlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzIS5jYWxsYWJsZUZvclR5cGU8VD4odHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgZW50aXR5IHNldCBmb3IgdGhlIGdpdmVuIHN0cmluZyB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgc3RyaW5nIHR5cGUgb2YgdGhlIGVudGl0eSBzZXQuXG4gICAqIEByZXR1cm5zIFRoZSBlbnRpdHkgc2V0IGZvciB0aGUgZ2l2ZW4gdHlwZS5cbiAgICovXG4gIGVudGl0eVNldEZvclR5cGUodHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MhLmVudGl0eVNldEZvclR5cGUodHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgbW9kZWwgZm9yIHRoZSBnaXZlbiBzdHJpbmcgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHN0cmluZyB0eXBlIG9mIHRoZSBtb2RlbC5cbiAgICogQHJldHVybnMgVGhlIG1vZGVsIGZvciB0aGUgZ2l2ZW4gdHlwZS5cbiAgICovXG4gIG1vZGVsRm9yVHlwZSh0eXBlOiBzdHJpbmcpOiB0eXBlb2YgT0RhdGFNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MhLm1vZGVsRm9yVHlwZSh0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBjb2xsZWN0aW9uIGZvciB0aGUgZ2l2ZW4gc3RyaW5nIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBzdHJpbmcgdHlwZSBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGNvbGxlY3Rpb24gZm9yIHRoZSBnaXZlbiB0eXBlLlxuICAgKi9cbiAgY29sbGVjdGlvbkZvclR5cGUodHlwZTogc3RyaW5nKTogdHlwZW9mIE9EYXRhQ29sbGVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MhLmNvbGxlY3Rpb25Gb3JUeXBlKHR5cGUpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBBUEkgUmVzb3VyY2UgUHJveHkgTWV0aG9kc1xuICBmcm9tSnNvbjxFPihcbiAgICBqc29uOiB7IHNlZ21lbnRzOiBPRGF0YVNlZ21lbnRbXTsgb3B0aW9uczogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfSxcbiAgICBhcGlOYW1lT3JUeXBlPzogc3RyaW5nLFxuICApOlxuICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxFPlxuICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxFPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxFPlxuICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxFPjtcbiAgZnJvbUpzb24oXG4gICAganNvbjogeyBzZWdtZW50czogT0RhdGFTZWdtZW50W107IG9wdGlvbnM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IH0sXG4gICAgYXBpTmFtZU9yVHlwZT86IHN0cmluZyxcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBpRm9yKGFwaU5hbWVPclR5cGUpLmZyb21Kc29uPGFueT4oanNvbik7XG4gIH1cblxuICAvLyBSZXF1ZXN0c1xuICAvKipcbiAgICogQnVpbGQgYSByZXNvdXJjZSBmb3IgdGhlIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0gYXBpTmFtZSBUaGUgbmFtZSBvZiB0aGUgQVBJLlxuICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgcmVzb3VyY2UuXG4gICAqL1xuICBtZXRhZGF0YShhcGlOYW1lPzogc3RyaW5nKTogT0RhdGFNZXRhZGF0YVJlc291cmNlIHtcbiAgICByZXR1cm4gdGhpcy5hcGlGb3IoYXBpTmFtZSkubWV0YWRhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIHJlc291cmNlIGZvciB0aGUgYmF0Y2guXG4gICAqIEBwYXJhbSBhcGlOYW1lIFRoZSBuYW1lIG9mIHRoZSBBUEkuXG4gICAqIEByZXR1cm5zIFRoZSBiYXRjaCByZXNvdXJjZS5cbiAgICovXG4gIGJhdGNoKGFwaU5hbWU/OiBzdHJpbmcpOiBPRGF0YUJhdGNoUmVzb3VyY2Uge1xuICAgIHJldHVybiB0aGlzLmFwaUZvcihhcGlOYW1lKS5iYXRjaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgcmVzb3VyY2UgZm9yIHRoZSBzaW5nbGV0b24uXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHNpbmdsZXRvbi5cbiAgICogQHBhcmFtIGFwaU5hbWVPclR5cGUgVGhlIG5hbWUgb2YgdGhlIEFQSSBvciB0aGUgdHlwZSBvZiB0aGUgc2luZ2xldG9uLlxuICAgKiBAcmV0dXJucyBUaGUgc2luZ2xldG9uIHJlc291cmNlLlxuICAgKi9cbiAgc2luZ2xldG9uPFQ+KHBhdGg6IHN0cmluZywgYXBpTmFtZU9yVHlwZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmFwaUZvcihhcGlOYW1lT3JUeXBlKS5zaW5nbGV0b248VD4ocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSByZXNvdXJjZSBmb3IgdGhlIGVudGl0eSBzZXQuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGVudGl0eSBzZXQuXG4gICAqIEBwYXJhbSBhcGlOYW1lT3JUeXBlIFRoZSBuYW1lIG9mIHRoZSBBUEkgb3IgdGhlIHR5cGUgb2YgdGhlIGVudGl0eSBzZXQuXG4gICAqIEByZXR1cm5zIFRoZSBlbnRpdHkgc2V0IHJlc291cmNlLlxuICAgKi9cbiAgZW50aXR5U2V0PFQ+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBhcGlOYW1lT3JUeXBlPzogc3RyaW5nLFxuICApOiBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5hcGlGb3IoYXBpTmFtZU9yVHlwZSkuZW50aXR5U2V0PFQ+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgcmVzb3VyY2UgZm9yIHVuYm91bmQgYWN0aW9uLlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBhY3Rpb24uXG4gICAqIEBwYXJhbSBhcGlOYW1lT3JUeXBlIFRoZSBuYW1lIG9mIHRoZSBBUEkgb3IgdGhlIHR5cGUgb2YgdGhlIGVudGl0eS5cbiAgICogQHJldHVybnMgVGhlIHVuYm91bmQgYWN0aW9uIHJlc291cmNlLlxuICAgKi9cbiAgYWN0aW9uPFAsIFI+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBhcGlOYW1lT3JUeXBlPzogc3RyaW5nLFxuICApOiBPRGF0YUFjdGlvblJlc291cmNlPFAsIFI+IHtcbiAgICByZXR1cm4gdGhpcy5hcGlGb3IoYXBpTmFtZU9yVHlwZSkuYWN0aW9uPFAsIFI+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgcmVzb3VyY2UgZm9yIHVuYm91bmQgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZ1bmN0aW9uLlxuICAgKiBAcGFyYW0gYXBpTmFtZU9yVHlwZSBUaGUgbmFtZSBvZiB0aGUgQVBJIG9yIHRoZSB0eXBlIG9mIHRoZSBjYWxsYWJsZS5cbiAgICogQHJldHVybnMgVGhlIHVuYm91bmQgZnVuY3Rpb24gcmVzb3VyY2UuXG4gICAqL1xuICBmdW5jdGlvbjxQLCBSPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYXBpTmFtZU9yVHlwZT86IHN0cmluZyxcbiAgKTogT0RhdGFGdW5jdGlvblJlc291cmNlPFAsIFI+IHtcbiAgICByZXR1cm4gdGhpcy5hcGlGb3IoYXBpTmFtZU9yVHlwZSkuZnVuY3Rpb248UCwgUj4ocGF0aCk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8gUmVxdWVzdCBoZWFkZXJzLCBnZXQsIHBvc3QsIHB1dCwgcGF0Y2guLi4gZXRjXG4gIHJlcXVlc3QoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBib2R5OiBhbnkgfCBudWxsO1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPjtcblxuICByZXF1ZXN0KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keTogYW55IHwgbnVsbDtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEJsb2I+O1xuXG4gIHJlcXVlc3QoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBib2R5OiBhbnkgfCBudWxsO1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICByZXF1ZXN0KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keTogYW55IHwgbnVsbDtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFycmF5QnVmZmVyPj47XG5cbiAgcmVxdWVzdChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk6IGFueSB8IG51bGw7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEJsb2I+PjtcblxuICByZXF1ZXN0KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keTogYW55IHwgbnVsbDtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8c3RyaW5nPj47XG5cbiAgcmVxdWVzdChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk6IGFueSB8IG51bGw7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PjtcblxuICByZXF1ZXN0PFI+KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keTogYW55IHwgbnVsbDtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFI+PjtcblxuICByZXF1ZXN0KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keTogYW55IHwgbnVsbDtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPEFycmF5QnVmZmVyPj47XG5cbiAgcmVxdWVzdChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk6IGFueSB8IG51bGw7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPEJsb2I+PjtcblxuICByZXF1ZXN0KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keTogYW55IHwgbnVsbDtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8c3RyaW5nPj47XG5cbiAgcmVxdWVzdChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk6IGFueSB8IG51bGw7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxPYmplY3Q+PjtcblxuICByZXF1ZXN0PFI+KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keTogYW55IHwgbnVsbDtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPFI+PjtcblxuICByZXF1ZXN0KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keTogYW55IHwgbnVsbDtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPYmplY3Q+O1xuXG4gIHJlcXVlc3Q8Uj4oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBib2R5OiBhbnkgfCBudWxsO1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPFI+O1xuXG4gIHJlcXVlc3QoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBib2R5OiBhbnkgfCBudWxsO1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JyB8ICdldmVudHMnIHwgJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdhcnJheWJ1ZmZlcicgfCAnYmxvYicgfCAnanNvbicgfCAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgYXBpID0gdGhpcy5hcGlGb3IocmVzb3VyY2UpO1xuXG4gICAgcmV0dXJuIGFwaS5yZXF1ZXN0KG1ldGhvZCwgcmVzb3VyY2UsIG9wdGlvbnMpO1xuICB9XG5cbiAgZGVsZXRlKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPjtcblxuICBkZWxldGUoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxCbG9iPjtcblxuICBkZWxldGUoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIGRlbGV0ZShcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFycmF5QnVmZmVyPj47XG5cbiAgZGVsZXRlKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxCbG9iPj47XG5cbiAgZGVsZXRlKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxzdHJpbmc+PjtcblxuICBkZWxldGUoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxPYmplY3Q+PjtcblxuICBkZWxldGU8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUPj47XG5cbiAgZGVsZXRlKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8QXJyYXlCdWZmZXI+PjtcblxuICBkZWxldGUoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPEJsb2I+PjtcblxuICBkZWxldGUoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPHN0cmluZz4+O1xuXG4gIGRlbGV0ZShcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPE9iamVjdD4+O1xuXG4gIGRlbGV0ZTxUPihcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPFQ+PjtcblxuICBkZWxldGUoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T2JqZWN0PjtcblxuICBkZWxldGU8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8VD47XG5cbiAgZGVsZXRlKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JyB8ICdldmVudHMnIHwgJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdhcnJheWJ1ZmZlcicgfCAnYmxvYicgfCAnanNvbicgfCAndGV4dCc7XG4gICAgfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8YW55PignREVMRVRFJywgcmVzb3VyY2UsIGFkZEJvZHk8YW55PihvcHRpb25zLCBudWxsKSk7XG4gIH1cblxuICBnZXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8QXJyYXlCdWZmZXI+O1xuXG4gIGdldChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEJsb2I+O1xuXG4gIGdldChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgZ2V0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXJyYXlCdWZmZXI+PjtcblxuICBnZXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEJsb2I+PjtcblxuICBnZXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PHN0cmluZz4+O1xuXG4gIGdldChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PE9iamVjdD4+O1xuXG4gIGdldDxUPihcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFQ+PjtcblxuICBnZXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxBcnJheUJ1ZmZlcj4+O1xuXG4gIGdldChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8QmxvYj4+O1xuXG4gIGdldChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8c3RyaW5nPj47XG5cbiAgZ2V0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8T2JqZWN0Pj47XG5cbiAgZ2V0PFQ+KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8VD4+O1xuXG4gIGdldChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPYmplY3Q+O1xuXG4gIGdldDxUPihcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxUPjtcblxuICBnZXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknIHwgJ2V2ZW50cycgfCAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2FycmF5YnVmZmVyJyB8ICdibG9iJyB8ICdqc29uJyB8ICd0ZXh0JztcbiAgICB9ID0ge30sXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxhbnk+KCdHRVQnLCByZXNvdXJjZSwgb3B0aW9ucyBhcyBhbnkpO1xuICB9XG5cbiAgaGVhZChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxBcnJheUJ1ZmZlcj47XG5cbiAgaGVhZChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEJsb2I+O1xuXG4gIGhlYWQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIGhlYWQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcnJheUJ1ZmZlcj4+O1xuXG4gIGhlYWQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEJsb2I+PjtcblxuICBoZWFkKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxzdHJpbmc+PjtcblxuICBoZWFkKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8T2JqZWN0Pj47XG5cbiAgaGVhZDxUPihcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFQ+PjtcblxuICBoZWFkKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8QXJyYXlCdWZmZXI+PjtcblxuICBoZWFkKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxCbG9iPj47XG5cbiAgaGVhZChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8c3RyaW5nPj47XG5cbiAgaGVhZChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPE9iamVjdD4+O1xuXG4gIGhlYWQ8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxUPj47XG5cbiAgaGVhZChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPYmplY3Q+O1xuXG4gIGhlYWQ8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8VD47XG5cbiAgaGVhZChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keScgfCAnZXZlbnRzJyB8ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnYXJyYXlidWZmZXInIHwgJ2Jsb2InIHwgJ2pzb24nIHwgJ3RleHQnO1xuICAgIH0gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PGFueT4oJ0hFQUQnLCByZXNvdXJjZSwgb3B0aW9ucyBhcyBhbnkpO1xuICB9XG5cbiAganNvbnAoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBjYWxsYmFja1BhcmFtOiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8T2JqZWN0PjtcblxuICBqc29ucDxUPihyZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LCBjYWxsYmFja1BhcmFtOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+O1xuXG4gIGpzb25wPFQ+KHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sIGNhbGxiYWNrUGFyYW06IHN0cmluZyk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8YW55PignSlNPTlAnLCByZXNvdXJjZSwge1xuICAgICAgYm9keTogbnVsbCxcbiAgICAgIHBhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5hcHBlbmQoY2FsbGJhY2tQYXJhbSwgJ0pTT05QX0NBTExCQUNLJyksXG4gICAgICBvYnNlcnZlOiAnYm9keScsXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICB9KTtcbiAgfVxuXG4gIG9wdGlvbnMoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8QXJyYXlCdWZmZXI+O1xuXG4gIG9wdGlvbnMoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxCbG9iPjtcblxuICBvcHRpb25zKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBvcHRpb25zKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXJyYXlCdWZmZXI+PjtcblxuICBvcHRpb25zKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxCbG9iPj47XG5cbiAgb3B0aW9ucyhcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8c3RyaW5nPj47XG5cbiAgb3B0aW9ucyhcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PE9iamVjdD4+O1xuXG4gIG9wdGlvbnMoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxPYmplY3Q+PjtcblxuICBvcHRpb25zPFQ+KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VD4+O1xuXG4gIG9wdGlvbnMoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxBcnJheUJ1ZmZlcj4+O1xuXG4gIG9wdGlvbnMoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPEJsb2I+PjtcblxuICBvcHRpb25zKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxzdHJpbmc+PjtcblxuICBvcHRpb25zKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8T2JqZWN0Pj47XG5cbiAgb3B0aW9uczxUPihcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPFQ+PjtcblxuICBvcHRpb25zKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9iamVjdD47XG5cbiAgb3B0aW9uczxUPihcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxUPjtcblxuICBvcHRpb25zKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JyB8ICdldmVudHMnIHwgJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdhcnJheWJ1ZmZlcicgfCAnYmxvYicgfCAnanNvbicgfCAndGV4dCc7XG4gICAgfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8YW55PignT1BUSU9OUycsIHJlc291cmNlLCBvcHRpb25zIGFzIGFueSk7XG4gIH1cblxuICBwYXRjaChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPjtcblxuICBwYXRjaChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8QmxvYj47XG5cbiAgcGF0Y2goXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgcGF0Y2goXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFycmF5QnVmZmVyPj47XG5cbiAgcGF0Y2goXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QmxvYj4+O1xuXG4gIHBhdGNoKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PHN0cmluZz4+O1xuXG4gIHBhdGNoKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxPYmplY3Q+PjtcblxuICBwYXRjaDxUPihcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VD4+O1xuXG4gIHBhdGNoKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxBcnJheUJ1ZmZlcj4+O1xuXG4gIHBhdGNoKFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPEJsb2I+PjtcblxuICBwYXRjaChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxzdHJpbmc+PjtcblxuICBwYXRjaChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8T2JqZWN0Pj47XG5cbiAgcGF0Y2g8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPFQ+PjtcblxuICBwYXRjaChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9iamVjdD47XG5cbiAgcGF0Y2g8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxUPjtcblxuICBwYXRjaChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JyB8ICdldmVudHMnIHwgJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdhcnJheWJ1ZmZlcicgfCAnYmxvYicgfCAnanNvbicgfCAndGV4dCc7XG4gICAgfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8YW55PignUEFUQ0gnLCByZXNvdXJjZSwgYWRkQm9keShvcHRpb25zLCBib2R5KSk7XG4gIH1cblxuICBwb3N0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8QXJyYXlCdWZmZXI+O1xuXG4gIHBvc3QoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEJsb2I+O1xuXG4gIHBvc3QoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgcG9zdChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXJyYXlCdWZmZXI+PjtcblxuICBwb3N0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEJsb2I+PjtcblxuICBwb3N0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PHN0cmluZz4+O1xuXG4gIHBvc3QoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PE9iamVjdD4+O1xuXG4gIHBvc3Q8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFQ+PjtcblxuICBwb3N0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxBcnJheUJ1ZmZlcj4+O1xuXG4gIHBvc3QoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8QmxvYj4+O1xuXG4gIHBvc3QoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8c3RyaW5nPj47XG5cbiAgcG9zdChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8T2JqZWN0Pj47XG5cbiAgcG9zdDxUPihcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8VD4+O1xuXG4gIHBvc3QoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPYmplY3Q+O1xuXG4gIHBvc3Q8VD4oXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU/OiAnYm9keSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxUPjtcblxuICBwb3N0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknIHwgJ2V2ZW50cycgfCAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2FycmF5YnVmZmVyJyB8ICdibG9iJyB8ICdqc29uJyB8ICd0ZXh0JztcbiAgICB9ID0ge30sXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxhbnk+KCdQT1NUJywgcmVzb3VyY2UsIGFkZEJvZHkob3B0aW9ucywgYm9keSkpO1xuICB9XG5cbiAgcHV0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8QXJyYXlCdWZmZXI+O1xuXG4gIHB1dChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8QmxvYj47XG5cbiAgcHV0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCc7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIHB1dChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXJyYXlCdWZmZXI+PjtcblxuICBwdXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QmxvYj4+O1xuXG4gIHB1dChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxzdHJpbmc+PjtcblxuICBwdXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdldmVudHMnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PE9iamVjdD4+O1xuXG4gIHB1dDxUPihcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cyc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VD4+O1xuXG4gIHB1dChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8QXJyYXlCdWZmZXI+PjtcblxuICBwdXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8QmxvYj4+O1xuXG4gIHB1dChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxzdHJpbmc+PjtcblxuICBwdXQoXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBib2R5OiBhbnkgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPE9iamVjdD4+O1xuXG4gIHB1dDxUPihcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8VD4+O1xuXG4gIHB1dChcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIGJvZHk6IGFueSB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JztcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPE9iamVjdD47XG5cbiAgcHV0PFQ+KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8VD47XG5cbiAgcHV0KFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgYm9keTogYW55IHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknIHwgJ2V2ZW50cycgfCAncmVzcG9uc2UnO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2FycmF5YnVmZmVyJyB8ICdibG9iJyB8ICdqc29uJyB8ICd0ZXh0JztcbiAgICB9ID0ge30sXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxhbnk+KCdQVVQnLCByZXNvdXJjZSwgYWRkQm9keShvcHRpb25zLCBib2R5KSk7XG4gIH1cbn1cbiJdfQ==
|