@bluedynamics/cdk8s-plone 0.1.23 → 0.1.25

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.
@@ -0,0 +1,1281 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VinylCacheSpecDirectorShardHealthy = exports.VinylCacheSpecDirectorShardBy = exports.VinylCacheSpecClusterPeerRoutingType = exports.VinylCacheSpecStorageType = exports.VinylCacheSpecStorageSize = exports.VinylCacheSpecServiceType = exports.VinylCacheSpecResourcesRequests = exports.VinylCacheSpecResourcesLimits = exports.VinylCacheSpecDirectorType = exports.VinylCache = void 0;
4
+ exports.toJson_VinylCacheProps = toJson_VinylCacheProps;
5
+ exports.toJson_VinylCacheSpec = toJson_VinylCacheSpec;
6
+ exports.toJson_VinylCacheSpecBackends = toJson_VinylCacheSpecBackends;
7
+ exports.toJson_VinylCacheSpecCluster = toJson_VinylCacheSpecCluster;
8
+ exports.toJson_VinylCacheSpecDebounce = toJson_VinylCacheSpecDebounce;
9
+ exports.toJson_VinylCacheSpecDirector = toJson_VinylCacheSpecDirector;
10
+ exports.toJson_VinylCacheSpecInvalidation = toJson_VinylCacheSpecInvalidation;
11
+ exports.toJson_VinylCacheSpecMonitoring = toJson_VinylCacheSpecMonitoring;
12
+ exports.toJson_VinylCacheSpecPod = toJson_VinylCacheSpecPod;
13
+ exports.toJson_VinylCacheSpecProxyProtocol = toJson_VinylCacheSpecProxyProtocol;
14
+ exports.toJson_VinylCacheSpecResources = toJson_VinylCacheSpecResources;
15
+ exports.toJson_VinylCacheSpecRetry = toJson_VinylCacheSpecRetry;
16
+ exports.toJson_VinylCacheSpecService = toJson_VinylCacheSpecService;
17
+ exports.toJson_VinylCacheSpecStorage = toJson_VinylCacheSpecStorage;
18
+ exports.toJson_VinylCacheSpecVcl = toJson_VinylCacheSpecVcl;
19
+ exports.toJson_VinylCacheSpecBackendsConnectionParameters = toJson_VinylCacheSpecBackendsConnectionParameters;
20
+ exports.toJson_VinylCacheSpecBackendsProbe = toJson_VinylCacheSpecBackendsProbe;
21
+ exports.toJson_VinylCacheSpecBackendsServiceRef = toJson_VinylCacheSpecBackendsServiceRef;
22
+ exports.toJson_VinylCacheSpecClusterPeerRouting = toJson_VinylCacheSpecClusterPeerRouting;
23
+ exports.toJson_VinylCacheSpecDirectorHash = toJson_VinylCacheSpecDirectorHash;
24
+ exports.toJson_VinylCacheSpecDirectorShard = toJson_VinylCacheSpecDirectorShard;
25
+ exports.toJson_VinylCacheSpecInvalidationBan = toJson_VinylCacheSpecInvalidationBan;
26
+ exports.toJson_VinylCacheSpecInvalidationPurge = toJson_VinylCacheSpecInvalidationPurge;
27
+ exports.toJson_VinylCacheSpecInvalidationXkey = toJson_VinylCacheSpecInvalidationXkey;
28
+ exports.toJson_VinylCacheSpecMonitoringPrometheusRules = toJson_VinylCacheSpecMonitoringPrometheusRules;
29
+ exports.toJson_VinylCacheSpecMonitoringServiceMonitor = toJson_VinylCacheSpecMonitoringServiceMonitor;
30
+ exports.toJson_VinylCacheSpecPodAffinity = toJson_VinylCacheSpecPodAffinity;
31
+ exports.toJson_VinylCacheSpecPodTolerations = toJson_VinylCacheSpecPodTolerations;
32
+ exports.toJson_VinylCacheSpecResourcesClaims = toJson_VinylCacheSpecResourcesClaims;
33
+ exports.toJson_VinylCacheSpecVclSnippets = toJson_VinylCacheSpecVclSnippets;
34
+ exports.toJson_VinylCacheSpecPodAffinityNodeAffinity = toJson_VinylCacheSpecPodAffinityNodeAffinity;
35
+ exports.toJson_VinylCacheSpecPodAffinityPodAffinity = toJson_VinylCacheSpecPodAffinityPodAffinity;
36
+ exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinity = toJson_VinylCacheSpecPodAffinityPodAntiAffinity;
37
+ exports.toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution;
38
+ exports.toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution;
39
+ exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution;
40
+ exports.toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution;
41
+ exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution;
42
+ exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution;
43
+ exports.toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference = toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference;
44
+ exports.toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms = toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms;
45
+ exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm;
46
+ exports.toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector = toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector;
47
+ exports.toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector = toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector;
48
+ exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm;
49
+ exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector;
50
+ exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector;
51
+ exports.toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions = toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions;
52
+ exports.toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields = toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields;
53
+ exports.toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions = toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions;
54
+ exports.toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields = toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields;
55
+ exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector;
56
+ exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector;
57
+ exports.toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions;
58
+ exports.toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions;
59
+ exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector;
60
+ exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector;
61
+ exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions;
62
+ exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions;
63
+ exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions;
64
+ exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions;
65
+ exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions;
66
+ exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions;
67
+ // generated by cdk8s
68
+ const cdk8s_1 = require("cdk8s");
69
+ /**
70
+ * VinylCache is the Schema for the vinylcaches API.
71
+ It describes a complete Varnish cache cluster: replicas, backends, VCL configuration,
72
+ clustering, and cache invalidation strategy.
73
+ *
74
+ * @schema VinylCache
75
+ */
76
+ class VinylCache extends cdk8s_1.ApiObject {
77
+ /**
78
+ * Renders a Kubernetes manifest for "VinylCache".
79
+ *
80
+ * This can be used to inline resource manifests inside other objects (e.g. as templates).
81
+ *
82
+ * @param props initialization props
83
+ */
84
+ static manifest(props = {}) {
85
+ return {
86
+ ...VinylCache.GVK,
87
+ ...toJson_VinylCacheProps(props),
88
+ };
89
+ }
90
+ /**
91
+ * Defines a "VinylCache" API object
92
+ * @param scope the scope in which to define this object
93
+ * @param id a scope-local name for the object
94
+ * @param props initialization props
95
+ */
96
+ constructor(scope, id, props = {}) {
97
+ super(scope, id, {
98
+ ...VinylCache.GVK,
99
+ ...props,
100
+ });
101
+ }
102
+ /**
103
+ * Renders the object to Kubernetes JSON.
104
+ */
105
+ toJson() {
106
+ const resolved = super.toJson();
107
+ return {
108
+ ...VinylCache.GVK,
109
+ ...toJson_VinylCacheProps(resolved),
110
+ };
111
+ }
112
+ }
113
+ exports.VinylCache = VinylCache;
114
+ /**
115
+ * Returns the apiVersion and kind for "VinylCache"
116
+ */
117
+ VinylCache.GVK = {
118
+ apiVersion: 'vinyl.bluedynamics.eu/v1alpha1',
119
+ kind: 'VinylCache',
120
+ };
121
+ /**
122
+ * Converts an object of type 'VinylCacheProps' to JSON representation.
123
+ */
124
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
125
+ function toJson_VinylCacheProps(obj) {
126
+ if (obj === undefined) {
127
+ return undefined;
128
+ }
129
+ const result = {
130
+ 'metadata': obj.metadata,
131
+ 'spec': toJson_VinylCacheSpec(obj.spec),
132
+ };
133
+ // filter undefined values
134
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
135
+ }
136
+ /**
137
+ * Converts an object of type 'VinylCacheSpec' to JSON representation.
138
+ */
139
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
140
+ function toJson_VinylCacheSpec(obj) {
141
+ if (obj === undefined) {
142
+ return undefined;
143
+ }
144
+ const result = {
145
+ 'backends': obj.backends?.map(y => toJson_VinylCacheSpecBackends(y)),
146
+ 'cluster': toJson_VinylCacheSpecCluster(obj.cluster),
147
+ 'debounce': toJson_VinylCacheSpecDebounce(obj.debounce),
148
+ 'director': toJson_VinylCacheSpecDirector(obj.director),
149
+ 'image': obj.image,
150
+ 'invalidation': toJson_VinylCacheSpecInvalidation(obj.invalidation),
151
+ 'monitoring': toJson_VinylCacheSpecMonitoring(obj.monitoring),
152
+ 'pod': toJson_VinylCacheSpecPod(obj.pod),
153
+ 'proxyProtocol': toJson_VinylCacheSpecProxyProtocol(obj.proxyProtocol),
154
+ 'replicas': obj.replicas,
155
+ 'resources': toJson_VinylCacheSpecResources(obj.resources),
156
+ 'retry': toJson_VinylCacheSpecRetry(obj.retry),
157
+ 'service': toJson_VinylCacheSpecService(obj.service),
158
+ 'storage': obj.storage?.map(y => toJson_VinylCacheSpecStorage(y)),
159
+ 'varnishParameters': ((obj.varnishParameters) === undefined) ? undefined : (Object.entries(obj.varnishParameters).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
160
+ 'vcl': toJson_VinylCacheSpecVcl(obj.vcl),
161
+ };
162
+ // filter undefined values
163
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
164
+ }
165
+ /**
166
+ * Converts an object of type 'VinylCacheSpecBackends' to JSON representation.
167
+ */
168
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
169
+ function toJson_VinylCacheSpecBackends(obj) {
170
+ if (obj === undefined) {
171
+ return undefined;
172
+ }
173
+ const result = {
174
+ 'connectionParameters': toJson_VinylCacheSpecBackendsConnectionParameters(obj.connectionParameters),
175
+ 'name': obj.name,
176
+ 'port': obj.port,
177
+ 'probe': toJson_VinylCacheSpecBackendsProbe(obj.probe),
178
+ 'serviceRef': toJson_VinylCacheSpecBackendsServiceRef(obj.serviceRef),
179
+ 'weight': obj.weight,
180
+ };
181
+ // filter undefined values
182
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
183
+ }
184
+ /**
185
+ * Converts an object of type 'VinylCacheSpecCluster' to JSON representation.
186
+ */
187
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
188
+ function toJson_VinylCacheSpecCluster(obj) {
189
+ if (obj === undefined) {
190
+ return undefined;
191
+ }
192
+ const result = {
193
+ 'enabled': obj.enabled,
194
+ 'peerRouting': toJson_VinylCacheSpecClusterPeerRouting(obj.peerRouting),
195
+ };
196
+ // filter undefined values
197
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
198
+ }
199
+ /**
200
+ * Converts an object of type 'VinylCacheSpecDebounce' to JSON representation.
201
+ */
202
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
203
+ function toJson_VinylCacheSpecDebounce(obj) {
204
+ if (obj === undefined) {
205
+ return undefined;
206
+ }
207
+ const result = {
208
+ 'duration': obj.duration,
209
+ };
210
+ // filter undefined values
211
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
212
+ }
213
+ /**
214
+ * Converts an object of type 'VinylCacheSpecDirector' to JSON representation.
215
+ */
216
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
217
+ function toJson_VinylCacheSpecDirector(obj) {
218
+ if (obj === undefined) {
219
+ return undefined;
220
+ }
221
+ const result = {
222
+ 'hash': toJson_VinylCacheSpecDirectorHash(obj.hash),
223
+ 'shard': toJson_VinylCacheSpecDirectorShard(obj.shard),
224
+ 'type': obj.type,
225
+ };
226
+ // filter undefined values
227
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
228
+ }
229
+ /**
230
+ * Converts an object of type 'VinylCacheSpecInvalidation' to JSON representation.
231
+ */
232
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
233
+ function toJson_VinylCacheSpecInvalidation(obj) {
234
+ if (obj === undefined) {
235
+ return undefined;
236
+ }
237
+ const result = {
238
+ 'ban': toJson_VinylCacheSpecInvalidationBan(obj.ban),
239
+ 'purge': toJson_VinylCacheSpecInvalidationPurge(obj.purge),
240
+ 'xkey': toJson_VinylCacheSpecInvalidationXkey(obj.xkey),
241
+ };
242
+ // filter undefined values
243
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
244
+ }
245
+ /**
246
+ * Converts an object of type 'VinylCacheSpecMonitoring' to JSON representation.
247
+ */
248
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
249
+ function toJson_VinylCacheSpecMonitoring(obj) {
250
+ if (obj === undefined) {
251
+ return undefined;
252
+ }
253
+ const result = {
254
+ 'enabled': obj.enabled,
255
+ 'prometheusRules': toJson_VinylCacheSpecMonitoringPrometheusRules(obj.prometheusRules),
256
+ 'serviceMonitor': toJson_VinylCacheSpecMonitoringServiceMonitor(obj.serviceMonitor),
257
+ };
258
+ // filter undefined values
259
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
260
+ }
261
+ /**
262
+ * Converts an object of type 'VinylCacheSpecPod' to JSON representation.
263
+ */
264
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
265
+ function toJson_VinylCacheSpecPod(obj) {
266
+ if (obj === undefined) {
267
+ return undefined;
268
+ }
269
+ const result = {
270
+ 'affinity': toJson_VinylCacheSpecPodAffinity(obj.affinity),
271
+ 'annotations': ((obj.annotations) === undefined) ? undefined : (Object.entries(obj.annotations).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
272
+ 'labels': ((obj.labels) === undefined) ? undefined : (Object.entries(obj.labels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
273
+ 'nodeSelector': ((obj.nodeSelector) === undefined) ? undefined : (Object.entries(obj.nodeSelector).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
274
+ 'priorityClassName': obj.priorityClassName,
275
+ 'tolerations': obj.tolerations?.map(y => toJson_VinylCacheSpecPodTolerations(y)),
276
+ };
277
+ // filter undefined values
278
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
279
+ }
280
+ /**
281
+ * Converts an object of type 'VinylCacheSpecProxyProtocol' to JSON representation.
282
+ */
283
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
284
+ function toJson_VinylCacheSpecProxyProtocol(obj) {
285
+ if (obj === undefined) {
286
+ return undefined;
287
+ }
288
+ const result = {
289
+ 'enabled': obj.enabled,
290
+ 'port': obj.port,
291
+ };
292
+ // filter undefined values
293
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
294
+ }
295
+ /**
296
+ * Converts an object of type 'VinylCacheSpecResources' to JSON representation.
297
+ */
298
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
299
+ function toJson_VinylCacheSpecResources(obj) {
300
+ if (obj === undefined) {
301
+ return undefined;
302
+ }
303
+ const result = {
304
+ 'claims': obj.claims?.map(y => toJson_VinylCacheSpecResourcesClaims(y)),
305
+ 'limits': ((obj.limits) === undefined) ? undefined : (Object.entries(obj.limits).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.value }), {})),
306
+ 'requests': ((obj.requests) === undefined) ? undefined : (Object.entries(obj.requests).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.value }), {})),
307
+ };
308
+ // filter undefined values
309
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
310
+ }
311
+ /**
312
+ * Converts an object of type 'VinylCacheSpecRetry' to JSON representation.
313
+ */
314
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
315
+ function toJson_VinylCacheSpecRetry(obj) {
316
+ if (obj === undefined) {
317
+ return undefined;
318
+ }
319
+ const result = {
320
+ 'backoffBase': obj.backoffBase,
321
+ 'backoffMax': obj.backoffMax,
322
+ 'maxAttempts': obj.maxAttempts,
323
+ };
324
+ // filter undefined values
325
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
326
+ }
327
+ /**
328
+ * Converts an object of type 'VinylCacheSpecService' to JSON representation.
329
+ */
330
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
331
+ function toJson_VinylCacheSpecService(obj) {
332
+ if (obj === undefined) {
333
+ return undefined;
334
+ }
335
+ const result = {
336
+ 'annotations': ((obj.annotations) === undefined) ? undefined : (Object.entries(obj.annotations).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
337
+ 'type': obj.type,
338
+ };
339
+ // filter undefined values
340
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
341
+ }
342
+ /**
343
+ * Converts an object of type 'VinylCacheSpecStorage' to JSON representation.
344
+ */
345
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
346
+ function toJson_VinylCacheSpecStorage(obj) {
347
+ if (obj === undefined) {
348
+ return undefined;
349
+ }
350
+ const result = {
351
+ 'name': obj.name,
352
+ 'path': obj.path,
353
+ 'size': obj.size?.value,
354
+ 'type': obj.type,
355
+ };
356
+ // filter undefined values
357
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
358
+ }
359
+ /**
360
+ * Converts an object of type 'VinylCacheSpecVcl' to JSON representation.
361
+ */
362
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
363
+ function toJson_VinylCacheSpecVcl(obj) {
364
+ if (obj === undefined) {
365
+ return undefined;
366
+ }
367
+ const result = {
368
+ 'fullOverride': obj.fullOverride,
369
+ 'snippets': toJson_VinylCacheSpecVclSnippets(obj.snippets),
370
+ };
371
+ // filter undefined values
372
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
373
+ }
374
+ /**
375
+ * Converts an object of type 'VinylCacheSpecBackendsConnectionParameters' to JSON representation.
376
+ */
377
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
378
+ function toJson_VinylCacheSpecBackendsConnectionParameters(obj) {
379
+ if (obj === undefined) {
380
+ return undefined;
381
+ }
382
+ const result = {
383
+ 'betweenBytesTimeout': obj.betweenBytesTimeout,
384
+ 'connectTimeout': obj.connectTimeout,
385
+ 'firstByteTimeout': obj.firstByteTimeout,
386
+ 'idleTimeout': obj.idleTimeout,
387
+ 'maxConnections': obj.maxConnections,
388
+ };
389
+ // filter undefined values
390
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
391
+ }
392
+ /**
393
+ * Converts an object of type 'VinylCacheSpecBackendsProbe' to JSON representation.
394
+ */
395
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
396
+ function toJson_VinylCacheSpecBackendsProbe(obj) {
397
+ if (obj === undefined) {
398
+ return undefined;
399
+ }
400
+ const result = {
401
+ 'expectedResponse': obj.expectedResponse,
402
+ 'interval': obj.interval,
403
+ 'threshold': obj.threshold,
404
+ 'timeout': obj.timeout,
405
+ 'url': obj.url,
406
+ 'window': obj.window,
407
+ };
408
+ // filter undefined values
409
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
410
+ }
411
+ /**
412
+ * Converts an object of type 'VinylCacheSpecBackendsServiceRef' to JSON representation.
413
+ */
414
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
415
+ function toJson_VinylCacheSpecBackendsServiceRef(obj) {
416
+ if (obj === undefined) {
417
+ return undefined;
418
+ }
419
+ const result = {
420
+ 'name': obj.name,
421
+ };
422
+ // filter undefined values
423
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
424
+ }
425
+ /**
426
+ * Converts an object of type 'VinylCacheSpecClusterPeerRouting' to JSON representation.
427
+ */
428
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
429
+ function toJson_VinylCacheSpecClusterPeerRouting(obj) {
430
+ if (obj === undefined) {
431
+ return undefined;
432
+ }
433
+ const result = {
434
+ 'type': obj.type,
435
+ };
436
+ // filter undefined values
437
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
438
+ }
439
+ /**
440
+ * Converts an object of type 'VinylCacheSpecDirectorHash' to JSON representation.
441
+ */
442
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
443
+ function toJson_VinylCacheSpecDirectorHash(obj) {
444
+ if (obj === undefined) {
445
+ return undefined;
446
+ }
447
+ const result = {
448
+ 'header': obj.header,
449
+ };
450
+ // filter undefined values
451
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
452
+ }
453
+ /**
454
+ * Converts an object of type 'VinylCacheSpecDirectorShard' to JSON representation.
455
+ */
456
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
457
+ function toJson_VinylCacheSpecDirectorShard(obj) {
458
+ if (obj === undefined) {
459
+ return undefined;
460
+ }
461
+ const result = {
462
+ 'by': obj.by,
463
+ 'healthy': obj.healthy,
464
+ 'rampup': obj.rampup,
465
+ 'replicas': obj.replicas,
466
+ 'warmup': obj.warmup,
467
+ };
468
+ // filter undefined values
469
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
470
+ }
471
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
472
+ /**
473
+ * type selects the Varnish director algorithm.
474
+ * "shard" (default) provides consistent hashing; "round_robin", "random", and "hash"
475
+ * are also supported.
476
+ *
477
+ * @schema VinylCacheSpecDirectorType
478
+ */
479
+ var VinylCacheSpecDirectorType;
480
+ (function (VinylCacheSpecDirectorType) {
481
+ /** shard */
482
+ VinylCacheSpecDirectorType["SHARD"] = "shard";
483
+ /** round_robin */
484
+ VinylCacheSpecDirectorType["ROUND_UNDERSCORE_ROBIN"] = "round_robin";
485
+ /** random */
486
+ VinylCacheSpecDirectorType["RANDOM"] = "random";
487
+ /** hash */
488
+ VinylCacheSpecDirectorType["HASH"] = "hash";
489
+ })(VinylCacheSpecDirectorType || (exports.VinylCacheSpecDirectorType = VinylCacheSpecDirectorType = {}));
490
+ /**
491
+ * Converts an object of type 'VinylCacheSpecInvalidationBan' to JSON representation.
492
+ */
493
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
494
+ function toJson_VinylCacheSpecInvalidationBan(obj) {
495
+ if (obj === undefined) {
496
+ return undefined;
497
+ }
498
+ const result = {
499
+ 'allowedSources': obj.allowedSources?.map(y => y),
500
+ 'enabled': obj.enabled,
501
+ 'rateLimitPerMinute': obj.rateLimitPerMinute,
502
+ };
503
+ // filter undefined values
504
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
505
+ }
506
+ /**
507
+ * Converts an object of type 'VinylCacheSpecInvalidationPurge' to JSON representation.
508
+ */
509
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
510
+ function toJson_VinylCacheSpecInvalidationPurge(obj) {
511
+ if (obj === undefined) {
512
+ return undefined;
513
+ }
514
+ const result = {
515
+ 'allowedSources': obj.allowedSources?.map(y => y),
516
+ 'enabled': obj.enabled,
517
+ 'soft': obj.soft,
518
+ };
519
+ // filter undefined values
520
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
521
+ }
522
+ /**
523
+ * Converts an object of type 'VinylCacheSpecInvalidationXkey' to JSON representation.
524
+ */
525
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
526
+ function toJson_VinylCacheSpecInvalidationXkey(obj) {
527
+ if (obj === undefined) {
528
+ return undefined;
529
+ }
530
+ const result = {
531
+ 'allowedSources': obj.allowedSources?.map(y => y),
532
+ 'enabled': obj.enabled,
533
+ 'softPurge': obj.softPurge,
534
+ };
535
+ // filter undefined values
536
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
537
+ }
538
+ /**
539
+ * Converts an object of type 'VinylCacheSpecMonitoringPrometheusRules' to JSON representation.
540
+ */
541
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
542
+ function toJson_VinylCacheSpecMonitoringPrometheusRules(obj) {
543
+ if (obj === undefined) {
544
+ return undefined;
545
+ }
546
+ const result = {
547
+ 'enabled': obj.enabled,
548
+ };
549
+ // filter undefined values
550
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
551
+ }
552
+ /**
553
+ * Converts an object of type 'VinylCacheSpecMonitoringServiceMonitor' to JSON representation.
554
+ */
555
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
556
+ function toJson_VinylCacheSpecMonitoringServiceMonitor(obj) {
557
+ if (obj === undefined) {
558
+ return undefined;
559
+ }
560
+ const result = {
561
+ 'enabled': obj.enabled,
562
+ 'interval': obj.interval,
563
+ };
564
+ // filter undefined values
565
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
566
+ }
567
+ /**
568
+ * Converts an object of type 'VinylCacheSpecPodAffinity' to JSON representation.
569
+ */
570
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
571
+ function toJson_VinylCacheSpecPodAffinity(obj) {
572
+ if (obj === undefined) {
573
+ return undefined;
574
+ }
575
+ const result = {
576
+ 'nodeAffinity': toJson_VinylCacheSpecPodAffinityNodeAffinity(obj.nodeAffinity),
577
+ 'podAffinity': toJson_VinylCacheSpecPodAffinityPodAffinity(obj.podAffinity),
578
+ 'podAntiAffinity': toJson_VinylCacheSpecPodAffinityPodAntiAffinity(obj.podAntiAffinity),
579
+ };
580
+ // filter undefined values
581
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
582
+ }
583
+ /**
584
+ * Converts an object of type 'VinylCacheSpecPodTolerations' to JSON representation.
585
+ */
586
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
587
+ function toJson_VinylCacheSpecPodTolerations(obj) {
588
+ if (obj === undefined) {
589
+ return undefined;
590
+ }
591
+ const result = {
592
+ 'effect': obj.effect,
593
+ 'key': obj.key,
594
+ 'operator': obj.operator,
595
+ 'tolerationSeconds': obj.tolerationSeconds,
596
+ 'value': obj.value,
597
+ };
598
+ // filter undefined values
599
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
600
+ }
601
+ /**
602
+ * Converts an object of type 'VinylCacheSpecResourcesClaims' to JSON representation.
603
+ */
604
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
605
+ function toJson_VinylCacheSpecResourcesClaims(obj) {
606
+ if (obj === undefined) {
607
+ return undefined;
608
+ }
609
+ const result = {
610
+ 'name': obj.name,
611
+ 'request': obj.request,
612
+ };
613
+ // filter undefined values
614
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
615
+ }
616
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
617
+ /**
618
+ * @schema VinylCacheSpecResourcesLimits
619
+ */
620
+ class VinylCacheSpecResourcesLimits {
621
+ static fromNumber(value) {
622
+ return new VinylCacheSpecResourcesLimits(value);
623
+ }
624
+ static fromString(value) {
625
+ return new VinylCacheSpecResourcesLimits(value);
626
+ }
627
+ constructor(value) {
628
+ this.value = value;
629
+ }
630
+ }
631
+ exports.VinylCacheSpecResourcesLimits = VinylCacheSpecResourcesLimits;
632
+ /**
633
+ * @schema VinylCacheSpecResourcesRequests
634
+ */
635
+ class VinylCacheSpecResourcesRequests {
636
+ static fromNumber(value) {
637
+ return new VinylCacheSpecResourcesRequests(value);
638
+ }
639
+ static fromString(value) {
640
+ return new VinylCacheSpecResourcesRequests(value);
641
+ }
642
+ constructor(value) {
643
+ this.value = value;
644
+ }
645
+ }
646
+ exports.VinylCacheSpecResourcesRequests = VinylCacheSpecResourcesRequests;
647
+ /**
648
+ * type sets the Kubernetes Service type (ClusterIP, NodePort, LoadBalancer).
649
+ *
650
+ * @schema VinylCacheSpecServiceType
651
+ */
652
+ var VinylCacheSpecServiceType;
653
+ (function (VinylCacheSpecServiceType) {
654
+ /** ClusterIP */
655
+ VinylCacheSpecServiceType["CLUSTER_IP"] = "ClusterIP";
656
+ /** NodePort */
657
+ VinylCacheSpecServiceType["NODE_PORT"] = "NodePort";
658
+ /** LoadBalancer */
659
+ VinylCacheSpecServiceType["LOAD_BALANCER"] = "LoadBalancer";
660
+ })(VinylCacheSpecServiceType || (exports.VinylCacheSpecServiceType = VinylCacheSpecServiceType = {}));
661
+ /**
662
+ * size is the storage allocation as a Kubernetes resource quantity (e.g. "1Gi").
663
+ * The operator converts to bytes for varnishd.
664
+ *
665
+ * @schema VinylCacheSpecStorageSize
666
+ */
667
+ class VinylCacheSpecStorageSize {
668
+ static fromNumber(value) {
669
+ return new VinylCacheSpecStorageSize(value);
670
+ }
671
+ static fromString(value) {
672
+ return new VinylCacheSpecStorageSize(value);
673
+ }
674
+ constructor(value) {
675
+ this.value = value;
676
+ }
677
+ }
678
+ exports.VinylCacheSpecStorageSize = VinylCacheSpecStorageSize;
679
+ /**
680
+ * type is the storage backend type. Only "malloc" and "file" are permitted.
681
+ * "persistent", "umem", and "default" are rejected by the admission webhook.
682
+ *
683
+ * @schema VinylCacheSpecStorageType
684
+ */
685
+ var VinylCacheSpecStorageType;
686
+ (function (VinylCacheSpecStorageType) {
687
+ /** malloc */
688
+ VinylCacheSpecStorageType["MALLOC"] = "malloc";
689
+ /** file */
690
+ VinylCacheSpecStorageType["FILE"] = "file";
691
+ })(VinylCacheSpecStorageType || (exports.VinylCacheSpecStorageType = VinylCacheSpecStorageType = {}));
692
+ /**
693
+ * Converts an object of type 'VinylCacheSpecVclSnippets' to JSON representation.
694
+ */
695
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
696
+ function toJson_VinylCacheSpecVclSnippets(obj) {
697
+ if (obj === undefined) {
698
+ return undefined;
699
+ }
700
+ const result = {
701
+ 'header': obj.header,
702
+ 'vclBackendError': obj.vclBackendError,
703
+ 'vclBackendFetch': obj.vclBackendFetch,
704
+ 'vclBackendResponse': obj.vclBackendResponse,
705
+ 'vclDeliver': obj.vclDeliver,
706
+ 'vclFini': obj.vclFini,
707
+ 'vclHash': obj.vclHash,
708
+ 'vclHit': obj.vclHit,
709
+ 'vclInit': obj.vclInit,
710
+ 'vclMiss': obj.vclMiss,
711
+ 'vclPass': obj.vclPass,
712
+ 'vclPipe': obj.vclPipe,
713
+ 'vclPurge': obj.vclPurge,
714
+ 'vclRecv': obj.vclRecv,
715
+ 'vclSynth': obj.vclSynth,
716
+ };
717
+ // filter undefined values
718
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
719
+ }
720
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
721
+ /**
722
+ * type is the routing strategy between Varnish pods. Only "shard" is supported.
723
+ *
724
+ * @schema VinylCacheSpecClusterPeerRoutingType
725
+ */
726
+ var VinylCacheSpecClusterPeerRoutingType;
727
+ (function (VinylCacheSpecClusterPeerRoutingType) {
728
+ /** shard */
729
+ VinylCacheSpecClusterPeerRoutingType["SHARD"] = "shard";
730
+ })(VinylCacheSpecClusterPeerRoutingType || (exports.VinylCacheSpecClusterPeerRoutingType = VinylCacheSpecClusterPeerRoutingType = {}));
731
+ /**
732
+ * by determines what value is hashed for shard selection. "HASH" uses the Varnish
733
+ * hash (default); "URL" uses the request URL.
734
+ *
735
+ * @schema VinylCacheSpecDirectorShardBy
736
+ */
737
+ var VinylCacheSpecDirectorShardBy;
738
+ (function (VinylCacheSpecDirectorShardBy) {
739
+ /** HASH */
740
+ VinylCacheSpecDirectorShardBy["HASH"] = "HASH";
741
+ /** URL */
742
+ VinylCacheSpecDirectorShardBy["URL"] = "URL";
743
+ })(VinylCacheSpecDirectorShardBy || (exports.VinylCacheSpecDirectorShardBy = VinylCacheSpecDirectorShardBy = {}));
744
+ /**
745
+ * healthy controls which backends the director considers when selecting a shard.
746
+ * "CHOSEN" (default) only considers the chosen backend healthy; "ALL" requires all
747
+ * backends to be healthy.
748
+ *
749
+ * @schema VinylCacheSpecDirectorShardHealthy
750
+ */
751
+ var VinylCacheSpecDirectorShardHealthy;
752
+ (function (VinylCacheSpecDirectorShardHealthy) {
753
+ /** CHOSEN */
754
+ VinylCacheSpecDirectorShardHealthy["CHOSEN"] = "CHOSEN";
755
+ /** ALL */
756
+ VinylCacheSpecDirectorShardHealthy["ALL"] = "ALL";
757
+ })(VinylCacheSpecDirectorShardHealthy || (exports.VinylCacheSpecDirectorShardHealthy = VinylCacheSpecDirectorShardHealthy = {}));
758
+ /**
759
+ * Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinity' to JSON representation.
760
+ */
761
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
762
+ function toJson_VinylCacheSpecPodAffinityNodeAffinity(obj) {
763
+ if (obj === undefined) {
764
+ return undefined;
765
+ }
766
+ const result = {
767
+ 'preferredDuringSchedulingIgnoredDuringExecution': obj.preferredDuringSchedulingIgnoredDuringExecution?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution(y)),
768
+ 'requiredDuringSchedulingIgnoredDuringExecution': toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution(obj.requiredDuringSchedulingIgnoredDuringExecution),
769
+ };
770
+ // filter undefined values
771
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
772
+ }
773
+ /**
774
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAffinity' to JSON representation.
775
+ */
776
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
777
+ function toJson_VinylCacheSpecPodAffinityPodAffinity(obj) {
778
+ if (obj === undefined) {
779
+ return undefined;
780
+ }
781
+ const result = {
782
+ 'preferredDuringSchedulingIgnoredDuringExecution': obj.preferredDuringSchedulingIgnoredDuringExecution?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution(y)),
783
+ 'requiredDuringSchedulingIgnoredDuringExecution': obj.requiredDuringSchedulingIgnoredDuringExecution?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution(y)),
784
+ };
785
+ // filter undefined values
786
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
787
+ }
788
+ /**
789
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinity' to JSON representation.
790
+ */
791
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
792
+ function toJson_VinylCacheSpecPodAffinityPodAntiAffinity(obj) {
793
+ if (obj === undefined) {
794
+ return undefined;
795
+ }
796
+ const result = {
797
+ 'preferredDuringSchedulingIgnoredDuringExecution': obj.preferredDuringSchedulingIgnoredDuringExecution?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution(y)),
798
+ 'requiredDuringSchedulingIgnoredDuringExecution': obj.requiredDuringSchedulingIgnoredDuringExecution?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution(y)),
799
+ };
800
+ // filter undefined values
801
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
802
+ }
803
+ /**
804
+ * Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution' to JSON representation.
805
+ */
806
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
807
+ function toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution(obj) {
808
+ if (obj === undefined) {
809
+ return undefined;
810
+ }
811
+ const result = {
812
+ 'preference': toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference(obj.preference),
813
+ 'weight': obj.weight,
814
+ };
815
+ // filter undefined values
816
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
817
+ }
818
+ /**
819
+ * Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution' to JSON representation.
820
+ */
821
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
822
+ function toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution(obj) {
823
+ if (obj === undefined) {
824
+ return undefined;
825
+ }
826
+ const result = {
827
+ 'nodeSelectorTerms': obj.nodeSelectorTerms?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms(y)),
828
+ };
829
+ // filter undefined values
830
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
831
+ }
832
+ /**
833
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution' to JSON representation.
834
+ */
835
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
836
+ function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution(obj) {
837
+ if (obj === undefined) {
838
+ return undefined;
839
+ }
840
+ const result = {
841
+ 'podAffinityTerm': toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm(obj.podAffinityTerm),
842
+ 'weight': obj.weight,
843
+ };
844
+ // filter undefined values
845
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
846
+ }
847
+ /**
848
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution' to JSON representation.
849
+ */
850
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
851
+ function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution(obj) {
852
+ if (obj === undefined) {
853
+ return undefined;
854
+ }
855
+ const result = {
856
+ 'labelSelector': toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector(obj.labelSelector),
857
+ 'matchLabelKeys': obj.matchLabelKeys?.map(y => y),
858
+ 'mismatchLabelKeys': obj.mismatchLabelKeys?.map(y => y),
859
+ 'namespaceSelector': toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector(obj.namespaceSelector),
860
+ 'namespaces': obj.namespaces?.map(y => y),
861
+ 'topologyKey': obj.topologyKey,
862
+ };
863
+ // filter undefined values
864
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
865
+ }
866
+ /**
867
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution' to JSON representation.
868
+ */
869
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
870
+ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution(obj) {
871
+ if (obj === undefined) {
872
+ return undefined;
873
+ }
874
+ const result = {
875
+ 'podAffinityTerm': toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm(obj.podAffinityTerm),
876
+ 'weight': obj.weight,
877
+ };
878
+ // filter undefined values
879
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
880
+ }
881
+ /**
882
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution' to JSON representation.
883
+ */
884
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
885
+ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution(obj) {
886
+ if (obj === undefined) {
887
+ return undefined;
888
+ }
889
+ const result = {
890
+ 'labelSelector': toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector(obj.labelSelector),
891
+ 'matchLabelKeys': obj.matchLabelKeys?.map(y => y),
892
+ 'mismatchLabelKeys': obj.mismatchLabelKeys?.map(y => y),
893
+ 'namespaceSelector': toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector(obj.namespaceSelector),
894
+ 'namespaces': obj.namespaces?.map(y => y),
895
+ 'topologyKey': obj.topologyKey,
896
+ };
897
+ // filter undefined values
898
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
899
+ }
900
+ /**
901
+ * Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference' to JSON representation.
902
+ */
903
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
904
+ function toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference(obj) {
905
+ if (obj === undefined) {
906
+ return undefined;
907
+ }
908
+ const result = {
909
+ 'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions(y)),
910
+ 'matchFields': obj.matchFields?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields(y)),
911
+ };
912
+ // filter undefined values
913
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
914
+ }
915
+ /**
916
+ * Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms' to JSON representation.
917
+ */
918
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
919
+ function toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms(obj) {
920
+ if (obj === undefined) {
921
+ return undefined;
922
+ }
923
+ const result = {
924
+ 'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions(y)),
925
+ 'matchFields': obj.matchFields?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields(y)),
926
+ };
927
+ // filter undefined values
928
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
929
+ }
930
+ /**
931
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm' to JSON representation.
932
+ */
933
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
934
+ function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm(obj) {
935
+ if (obj === undefined) {
936
+ return undefined;
937
+ }
938
+ const result = {
939
+ 'labelSelector': toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector(obj.labelSelector),
940
+ 'matchLabelKeys': obj.matchLabelKeys?.map(y => y),
941
+ 'mismatchLabelKeys': obj.mismatchLabelKeys?.map(y => y),
942
+ 'namespaceSelector': toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector(obj.namespaceSelector),
943
+ 'namespaces': obj.namespaces?.map(y => y),
944
+ 'topologyKey': obj.topologyKey,
945
+ };
946
+ // filter undefined values
947
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
948
+ }
949
+ /**
950
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector' to JSON representation.
951
+ */
952
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
953
+ function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector(obj) {
954
+ if (obj === undefined) {
955
+ return undefined;
956
+ }
957
+ const result = {
958
+ 'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions(y)),
959
+ 'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
960
+ };
961
+ // filter undefined values
962
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
963
+ }
964
+ /**
965
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector' to JSON representation.
966
+ */
967
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
968
+ function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector(obj) {
969
+ if (obj === undefined) {
970
+ return undefined;
971
+ }
972
+ const result = {
973
+ 'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions(y)),
974
+ 'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
975
+ };
976
+ // filter undefined values
977
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
978
+ }
979
+ /**
980
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm' to JSON representation.
981
+ */
982
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
983
+ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm(obj) {
984
+ if (obj === undefined) {
985
+ return undefined;
986
+ }
987
+ const result = {
988
+ 'labelSelector': toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector(obj.labelSelector),
989
+ 'matchLabelKeys': obj.matchLabelKeys?.map(y => y),
990
+ 'mismatchLabelKeys': obj.mismatchLabelKeys?.map(y => y),
991
+ 'namespaceSelector': toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector(obj.namespaceSelector),
992
+ 'namespaces': obj.namespaces?.map(y => y),
993
+ 'topologyKey': obj.topologyKey,
994
+ };
995
+ // filter undefined values
996
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
997
+ }
998
+ /**
999
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector' to JSON representation.
1000
+ */
1001
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1002
+ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector(obj) {
1003
+ if (obj === undefined) {
1004
+ return undefined;
1005
+ }
1006
+ const result = {
1007
+ 'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions(y)),
1008
+ 'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
1009
+ };
1010
+ // filter undefined values
1011
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1012
+ }
1013
+ /**
1014
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector' to JSON representation.
1015
+ */
1016
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1017
+ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector(obj) {
1018
+ if (obj === undefined) {
1019
+ return undefined;
1020
+ }
1021
+ const result = {
1022
+ 'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions(y)),
1023
+ 'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
1024
+ };
1025
+ // filter undefined values
1026
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1027
+ }
1028
+ /**
1029
+ * Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions' to JSON representation.
1030
+ */
1031
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1032
+ function toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions(obj) {
1033
+ if (obj === undefined) {
1034
+ return undefined;
1035
+ }
1036
+ const result = {
1037
+ 'key': obj.key,
1038
+ 'operator': obj.operator,
1039
+ 'values': obj.values?.map(y => y),
1040
+ };
1041
+ // filter undefined values
1042
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1043
+ }
1044
+ /**
1045
+ * Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields' to JSON representation.
1046
+ */
1047
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1048
+ function toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields(obj) {
1049
+ if (obj === undefined) {
1050
+ return undefined;
1051
+ }
1052
+ const result = {
1053
+ 'key': obj.key,
1054
+ 'operator': obj.operator,
1055
+ 'values': obj.values?.map(y => y),
1056
+ };
1057
+ // filter undefined values
1058
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1059
+ }
1060
+ /**
1061
+ * Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions' to JSON representation.
1062
+ */
1063
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1064
+ function toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions(obj) {
1065
+ if (obj === undefined) {
1066
+ return undefined;
1067
+ }
1068
+ const result = {
1069
+ 'key': obj.key,
1070
+ 'operator': obj.operator,
1071
+ 'values': obj.values?.map(y => y),
1072
+ };
1073
+ // filter undefined values
1074
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1075
+ }
1076
+ /**
1077
+ * Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields' to JSON representation.
1078
+ */
1079
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1080
+ function toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields(obj) {
1081
+ if (obj === undefined) {
1082
+ return undefined;
1083
+ }
1084
+ const result = {
1085
+ 'key': obj.key,
1086
+ 'operator': obj.operator,
1087
+ 'values': obj.values?.map(y => y),
1088
+ };
1089
+ // filter undefined values
1090
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1091
+ }
1092
+ /**
1093
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector' to JSON representation.
1094
+ */
1095
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1096
+ function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector(obj) {
1097
+ if (obj === undefined) {
1098
+ return undefined;
1099
+ }
1100
+ const result = {
1101
+ 'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions(y)),
1102
+ 'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
1103
+ };
1104
+ // filter undefined values
1105
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1106
+ }
1107
+ /**
1108
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector' to JSON representation.
1109
+ */
1110
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1111
+ function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector(obj) {
1112
+ if (obj === undefined) {
1113
+ return undefined;
1114
+ }
1115
+ const result = {
1116
+ 'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions(y)),
1117
+ 'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
1118
+ };
1119
+ // filter undefined values
1120
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1121
+ }
1122
+ /**
1123
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions' to JSON representation.
1124
+ */
1125
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1126
+ function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions(obj) {
1127
+ if (obj === undefined) {
1128
+ return undefined;
1129
+ }
1130
+ const result = {
1131
+ 'key': obj.key,
1132
+ 'operator': obj.operator,
1133
+ 'values': obj.values?.map(y => y),
1134
+ };
1135
+ // filter undefined values
1136
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1137
+ }
1138
+ /**
1139
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions' to JSON representation.
1140
+ */
1141
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1142
+ function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions(obj) {
1143
+ if (obj === undefined) {
1144
+ return undefined;
1145
+ }
1146
+ const result = {
1147
+ 'key': obj.key,
1148
+ 'operator': obj.operator,
1149
+ 'values': obj.values?.map(y => y),
1150
+ };
1151
+ // filter undefined values
1152
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1153
+ }
1154
+ /**
1155
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector' to JSON representation.
1156
+ */
1157
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1158
+ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector(obj) {
1159
+ if (obj === undefined) {
1160
+ return undefined;
1161
+ }
1162
+ const result = {
1163
+ 'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions(y)),
1164
+ 'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
1165
+ };
1166
+ // filter undefined values
1167
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1168
+ }
1169
+ /**
1170
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector' to JSON representation.
1171
+ */
1172
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1173
+ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector(obj) {
1174
+ if (obj === undefined) {
1175
+ return undefined;
1176
+ }
1177
+ const result = {
1178
+ 'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions(y)),
1179
+ 'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
1180
+ };
1181
+ // filter undefined values
1182
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1183
+ }
1184
+ /**
1185
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions' to JSON representation.
1186
+ */
1187
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1188
+ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions(obj) {
1189
+ if (obj === undefined) {
1190
+ return undefined;
1191
+ }
1192
+ const result = {
1193
+ 'key': obj.key,
1194
+ 'operator': obj.operator,
1195
+ 'values': obj.values?.map(y => y),
1196
+ };
1197
+ // filter undefined values
1198
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1199
+ }
1200
+ /**
1201
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions' to JSON representation.
1202
+ */
1203
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1204
+ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions(obj) {
1205
+ if (obj === undefined) {
1206
+ return undefined;
1207
+ }
1208
+ const result = {
1209
+ 'key': obj.key,
1210
+ 'operator': obj.operator,
1211
+ 'values': obj.values?.map(y => y),
1212
+ };
1213
+ // filter undefined values
1214
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1215
+ }
1216
+ /**
1217
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions' to JSON representation.
1218
+ */
1219
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1220
+ function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions(obj) {
1221
+ if (obj === undefined) {
1222
+ return undefined;
1223
+ }
1224
+ const result = {
1225
+ 'key': obj.key,
1226
+ 'operator': obj.operator,
1227
+ 'values': obj.values?.map(y => y),
1228
+ };
1229
+ // filter undefined values
1230
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1231
+ }
1232
+ /**
1233
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions' to JSON representation.
1234
+ */
1235
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1236
+ function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions(obj) {
1237
+ if (obj === undefined) {
1238
+ return undefined;
1239
+ }
1240
+ const result = {
1241
+ 'key': obj.key,
1242
+ 'operator': obj.operator,
1243
+ 'values': obj.values?.map(y => y),
1244
+ };
1245
+ // filter undefined values
1246
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1247
+ }
1248
+ /**
1249
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions' to JSON representation.
1250
+ */
1251
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1252
+ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions(obj) {
1253
+ if (obj === undefined) {
1254
+ return undefined;
1255
+ }
1256
+ const result = {
1257
+ 'key': obj.key,
1258
+ 'operator': obj.operator,
1259
+ 'values': obj.values?.map(y => y),
1260
+ };
1261
+ // filter undefined values
1262
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1263
+ }
1264
+ /**
1265
+ * Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions' to JSON representation.
1266
+ */
1267
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1268
+ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions(obj) {
1269
+ if (obj === undefined) {
1270
+ return undefined;
1271
+ }
1272
+ const result = {
1273
+ 'key': obj.key,
1274
+ 'operator': obj.operator,
1275
+ 'values': obj.values?.map(y => y),
1276
+ };
1277
+ // filter undefined values
1278
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1279
+ }
1280
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlueWwuYmx1ZWR5bmFtaWNzLmV1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydHMvdmlueWwuYmx1ZWR5bmFtaWNzLmV1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNGQSx3REFRQztBQWtJRCxzREFzQkM7QUF3REQsc0VBWUM7QUE0QkQsb0VBUUM7QUF1QkQsc0VBT0M7QUFxQ0Qsc0VBU0M7QUFtQ0QsOEVBU0M7QUFtQ0QsMEVBU0M7QUF3REQsNERBWUM7QUE0QkQsZ0ZBUUM7QUE2Q0Qsd0VBU0M7QUFvQ0QsZ0VBU0M7QUE0QkQsb0VBUUM7QUE0Q0Qsb0VBVUM7QUE4QkQsNERBUUM7QUFrREQsOEdBV0M7QUEwREQsZ0ZBWUM7QUFxQkQsMEZBT0M7QUFxQkQsMEZBT0M7QUFxQkQsOEVBT0M7QUFzREQsZ0ZBV0M7QUFxREQsb0ZBU0M7QUFxQ0Qsd0ZBU0M7QUFtQ0Qsc0ZBU0M7QUFxQkQsd0dBT0M7QUE2QkQsc0dBUUM7QUFtQ0QsNEVBU0M7QUE2REQsa0ZBV0M7QUFnQ0Qsb0ZBUUM7QUFnTUQsNEVBcUJDO0FBNkVELG9HQVFDO0FBMENELGtHQVFDO0FBMENELDBHQVFDO0FBNkJELGtNQVFDO0FBeUJELGdNQU9DO0FBNkJELGdNQVFDO0FBdUZELDhMQVlDO0FBNkJELHdNQVFDO0FBdUZELHNNQVlDO0FBNEJELHNOQVFDO0FBOEJELGtPQVFDO0FBa0ZELDhOQVlDO0FBK0JELHdOQVFDO0FBa0NELGdPQVFDO0FBa0ZELHNPQVlDO0FBK0JELGdPQVFDO0FBa0NELHdPQVFDO0FBeUNELHNQQVNDO0FBeUNELDRPQVNDO0FBeUNELGtRQVNDO0FBeUNELHdQQVNDO0FBK0JELHdQQVFDO0FBa0NELGdRQVFDO0FBd0NELHdQQVNDO0FBd0NELGdRQVNDO0FBK0JELGdRQVFDO0FBa0NELHdRQVFDO0FBd0NELGdRQVNDO0FBd0NELHdRQVNDO0FBd0NELHdSQVNDO0FBd0NELGdTQVNDO0FBd0NELGdTQVNDO0FBd0NELHdT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QUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixVQUFVLEVBQUUsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUMxRCxhQUFhLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUssUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNKLGNBQWMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVks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LENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBb0NEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDhJQUE4SSxDQUFDLEdBQXdKO0lBQ3JULElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQ2QsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3hCLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNsQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFDRCxvRkFBb0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZW5lcmF0ZWQgYnkgY2RrOHNcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBpT2JqZWN0TWV0YWRhdGEsIEdyb3VwVmVyc2lvbktpbmQgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuXG4vKipcbiAqIFZpbnlsQ2FjaGUgaXMgdGhlIFNjaGVtYSBmb3IgdGhlIHZpbnlsY2FjaGVzIEFQSS5cbkl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIFZhcm5pc2ggY2FjaGUgY2x1c3RlcjogcmVwbGljYXMsIGJhY2tlbmRzLCBWQ0wgY29uZmlndXJhdGlvbixcbmNsdXN0ZXJpbmcsIGFuZCBjYWNoZSBpbnZhbGlkYXRpb24gc3RyYXRlZ3kuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlIGV4dGVuZHMgQXBpT2JqZWN0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFwaVZlcnNpb24gYW5kIGtpbmQgZm9yIFwiVmlueWxDYWNoZVwiXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdWSzogR3JvdXBWZXJzaW9uS2luZCA9IHtcbiAgICBhcGlWZXJzaW9uOiAndmlueWwuYmx1ZWR5bmFtaWNzLmV1L3YxYWxwaGExJyxcbiAgICBraW5kOiAnVmlueWxDYWNoZScsXG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIEt1YmVybmV0ZXMgbWFuaWZlc3QgZm9yIFwiVmlueWxDYWNoZVwiLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGlubGluZSByZXNvdXJjZSBtYW5pZmVzdHMgaW5zaWRlIG90aGVyIG9iamVjdHMgKGUuZy4gYXMgdGVtcGxhdGVzKS5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIGluaXRpYWxpemF0aW9uIHByb3BzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1hbmlmZXN0KHByb3BzOiBWaW55bENhY2hlUHJvcHMgPSB7fSk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLlZpbnlsQ2FjaGUuR1ZLLFxuICAgICAgLi4udG9Kc29uX1ZpbnlsQ2FjaGVQcm9wcyhwcm9wcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgXCJWaW55bENhY2hlXCIgQVBJIG9iamVjdFxuICAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIG9iamVjdFxuICAgKiBAcGFyYW0gaWQgYSBzY29wZS1sb2NhbCBuYW1lIGZvciB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSBwcm9wcyBpbml0aWFsaXphdGlvbiBwcm9wc1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWaW55bENhY2hlUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4uVmlueWxDYWNoZS5HVkssXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBvYmplY3QgdG8gS3ViZXJuZXRlcyBKU09OLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHRvSnNvbigpOiBhbnkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gc3VwZXIudG9Kc29uKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uVmlueWxDYWNoZS5HVkssXG4gICAgICAuLi50b0pzb25fVmlueWxDYWNoZVByb3BzKHJlc29sdmVkKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVmlueWxDYWNoZSBpcyB0aGUgU2NoZW1hIGZvciB0aGUgdmlueWxjYWNoZXMgQVBJLlxuICogSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgVmFybmlzaCBjYWNoZSBjbHVzdGVyOiByZXBsaWNhcywgYmFja2VuZHMsIFZDTCBjb25maWd1cmF0aW9uLFxuICogY2x1c3RlcmluZywgYW5kIGNhY2hlIGludmFsaWRhdGlvbiBzdHJhdGVneS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlUHJvcHMge1xuICAvKipcbiAgICogQHNjaGVtYSBWaW55bENhY2hlI21ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IEFwaU9iamVjdE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBzcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgdGhlIFZpbnlsQ2FjaGUgY2x1c3Rlci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlI3NwZWNcbiAgICovXG4gIHJlYWRvbmx5IHNwZWM/OiBWaW55bENhY2hlU3BlYztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVByb3BzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVQcm9wcyhvYmo6IFZpbnlsQ2FjaGVQcm9wcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21ldGFkYXRhJzogb2JqLm1ldGFkYXRhLFxuICAgICdzcGVjJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjKG9iai5zcGVjKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNwZWMgZGVmaW5lcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiB0aGUgVmlueWxDYWNoZSBjbHVzdGVyLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlYyB7XG4gIC8qKlxuICAgKiBiYWNrZW5kcyBkZWZpbmVzIHRoZSB1cHN0cmVhbSBzZXJ2aWNlcyBWYXJuaXNoIHdpbGwgcHJveHkgdG8uXG4gICAqIEF0IGxlYXN0IG9uZSBiYWNrZW5kIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2JhY2tlbmRzXG4gICAqL1xuICByZWFkb25seSBiYWNrZW5kczogVmlueWxDYWNoZVNwZWNCYWNrZW5kc1tdO1xuXG4gIC8qKlxuICAgKiBjbHVzdGVyIGNvbmZpZ3VyZXMgVmFybmlzaCBjbHVzdGVyaW5nIGJldHdlZW4gcG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNjbHVzdGVyXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyPzogVmlueWxDYWNoZVNwZWNDbHVzdGVyO1xuXG4gIC8qKlxuICAgKiBkZWJvdW5jZSBjb25maWd1cmVzIGEgZ3JhY2UgcGVyaW9kIGJlZm9yZSBhcHBseWluZyBlbmRwb2ludCBjaGFuZ2VzIHRvIFZhcm5pc2gsXG4gICAqIHByZXZlbnRpbmcgdGh1bmRlcmluZy1oZXJkIG9uIHJhcGlkIGVuZHBvaW50IGNodXJuLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2RlYm91bmNlXG4gICAqL1xuICByZWFkb25seSBkZWJvdW5jZT86IFZpbnlsQ2FjaGVTcGVjRGVib3VuY2U7XG5cbiAgLyoqXG4gICAqIGRpcmVjdG9yIGNvbmZpZ3VyZXMgaG93IFZhcm5pc2ggZGlzdHJpYnV0ZXMgcmVxdWVzdHMgYWNyb3NzIGJhY2tlbmQgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2RpcmVjdG9yXG4gICAqL1xuICByZWFkb25seSBkaXJlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3I7XG5cbiAgLyoqXG4gICAqIGltYWdlIGlzIHRoZSBjb250YWluZXIgaW1hZ2UgZm9yIHRoZSBWYXJuaXNoIHBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjaW1hZ2VcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGludmFsaWRhdGlvbiBjb25maWd1cmVzIGNhY2hlIGludmFsaWRhdGlvbiBtZXRob2RzIChQVVJHRSwgQkFOLCB4a2V5KS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNpbnZhbGlkYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGludmFsaWRhdGlvbj86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uO1xuXG4gIC8qKlxuICAgKiBtb25pdG9yaW5nIGNvbmZpZ3VyZXMgUHJvbWV0aGV1cyBtZXRyaWNzIGFuZCBhbGVydGluZyBydWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNtb25pdG9yaW5nXG4gICAqL1xuICByZWFkb25seSBtb25pdG9yaW5nPzogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nO1xuXG4gIC8qKlxuICAgKiBwb2QgY29uZmlndXJlcyBwb2QtbGV2ZWwgc2NoZWR1bGluZyBhbmQgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjcG9kXG4gICAqL1xuICByZWFkb25seSBwb2Q/OiBWaW55bENhY2hlU3BlY1BvZDtcblxuICAvKipcbiAgICogcHJveHlQcm90b2NvbCBlbmFibGVzIFBST1hZIHByb3RvY29sIG9uIGEgZGVkaWNhdGVkIHBvcnQgZm9yIHBhc3NpbmcgY2xpZW50IElQLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3Byb3h5UHJvdG9jb2xcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5UHJvdG9jb2w/OiBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2w7XG5cbiAgLyoqXG4gICAqIHJlcGxpY2FzIGlzIHRoZSBkZXNpcmVkIG51bWJlciBvZiBWYXJuaXNoIHBvZHMgaW4gdGhlIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjcmVwbGljYXNcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHJlc291cmNlcyBzZXRzIENQVSBhbmQgbWVtb3J5IHJlcXVlc3RzL2xpbWl0cyBmb3IgdGhlIFZhcm5pc2ggY29udGFpbmVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3Jlc291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VzPzogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXM7XG5cbiAgLyoqXG4gICAqIHJldHJ5IGNvbmZpZ3VyZXMgcmV0cnkgYmVoYXZpb3VyIHdoZW4gVkNMIHVwZGF0ZXMgZmFpbCB0byBhcHBseS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNyZXRyeVxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnk/OiBWaW55bENhY2hlU3BlY1JldHJ5O1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlIGNvbmZpZ3VyZXMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSBjcmVhdGVkIGZvciB0cmFmZmljIGluZ3Jlc3MuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjc2VydmljZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZT86IFZpbnlsQ2FjaGVTcGVjU2VydmljZTtcblxuICAvKipcbiAgICogc3RvcmFnZSBjb25maWd1cmVzIG9uZSBvciBtb3JlIFZhcm5pc2ggc3RvcmFnZSBiYWNrZW5kcyAobWFsbG9jIG9yIGZpbGUpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3N0b3JhZ2VcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2U/OiBWaW55bENhY2hlU3BlY1N0b3JhZ2VbXTtcblxuICAvKipcbiAgICogdmFybmlzaFBhcmFtZXRlcnMgYXJlIHJ1bnRpbWUgcGFyYW1ldGVycyBwYXNzZWQgdG8gdmFybmlzaGQgdmlhIC1wIGZsYWdzLlxuICAgKiBDZXJ0YWluIHNlY3VyaXR5LXNlbnNpdGl2ZSBwYXJhbWV0ZXJzIGFyZSBibG9ja2VkIGJ5IHRoZSBhZG1pc3Npb24gd2ViaG9vay5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyN2YXJuaXNoUGFyYW1ldGVyc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFybmlzaFBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiB2Y2wgY29uZmlndXJlcyBWQ0wgZ2VuZXJhdGlvbjogc25pcHBldHMgaW5qZWN0ZWQgaW50byBnZW5lcmF0ZWQgVkNMIHN1YnJvdXRpbmVzLFxuICAgKiBvciBhIGZ1bGwgVkNMIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3ZjbFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsPzogVmlueWxDYWNoZVNwZWNWY2w7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjKG9iajogVmlueWxDYWNoZVNwZWMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiYWNrZW5kcyc6IG9iai5iYWNrZW5kcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHMoeSkpLFxuICAgICdjbHVzdGVyJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlcihvYmouY2x1c3RlciksXG4gICAgJ2RlYm91bmNlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGVib3VuY2Uob2JqLmRlYm91bmNlKSxcbiAgICAnZGlyZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvcihvYmouZGlyZWN0b3IpLFxuICAgICdpbWFnZSc6IG9iai5pbWFnZSxcbiAgICAnaW52YWxpZGF0aW9uJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uKG9iai5pbnZhbGlkYXRpb24pLFxuICAgICdtb25pdG9yaW5nJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyhvYmoubW9uaXRvcmluZyksXG4gICAgJ3BvZCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZChvYmoucG9kKSxcbiAgICAncHJveHlQcm90b2NvbCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wob2JqLnByb3h5UHJvdG9jb2wpLFxuICAgICdyZXBsaWNhcyc6IG9iai5yZXBsaWNhcyxcbiAgICAncmVzb3VyY2VzJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzKG9iai5yZXNvdXJjZXMpLFxuICAgICdyZXRyeSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1JldHJ5KG9iai5yZXRyeSksXG4gICAgJ3NlcnZpY2UnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNTZXJ2aWNlKG9iai5zZXJ2aWNlKSxcbiAgICAnc3RvcmFnZSc6IG9iai5zdG9yYWdlPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNTdG9yYWdlKHkpKSxcbiAgICAndmFybmlzaFBhcmFtZXRlcnMnOiAoKG9iai52YXJuaXNoUGFyYW1ldGVycykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLnZhcm5pc2hQYXJhbWV0ZXJzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAndmNsJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVmNsKG9iai52Y2wpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQmFja2VuZFNwZWMgZGVzY3JpYmVzIGFuIHVwc3RyZWFtIEt1YmVybmV0ZXMgc2VydmljZSB1c2VkIGFzIGEgVmFybmlzaCBiYWNrZW5kLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMge1xuICAvKipcbiAgICogY29ubmVjdGlvblBhcmFtZXRlcnMgY29uZmlndXJlcyBiYWNrZW5kIGNvbm5lY3Rpb24gcG9vbCB0aW1lb3V0cyBhbmQgbGltaXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjY29ubmVjdGlvblBhcmFtZXRlcnNcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25QYXJhbWV0ZXJzPzogVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzO1xuXG4gIC8qKlxuICAgKiBuYW1lIGlzIHRoZSBWQ0wgaWRlbnRpZmllciBmb3IgdGhpcyBiYWNrZW5kLiBNdXN0IG1hdGNoIF5bYS16QS1aXVthLXpBLVowLTlfXSokLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBwb3J0IG92ZXJyaWRlcyB0aGUgc2VydmljZSBwb3J0IHVzZWQgZm9yIHRoaXMgYmFja2VuZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3BvcnRcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHByb2JlIGNvbmZpZ3VyZXMgdGhlIFZhcm5pc2ggYmFja2VuZCBoZWFsdGggcHJvYmUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kcyNwcm9iZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmU/OiBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmU7XG5cbiAgLyoqXG4gICAqIHNlcnZpY2VSZWYgcmVmZXJlbmNlcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIGluIHRoZSBzYW1lIG5hbWVzcGFjZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3NlcnZpY2VSZWZcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VSZWY6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmO1xuXG4gIC8qKlxuICAgKiB3ZWlnaHQgaXMgdGhlIHJlbGF0aXZlIHdlaWdodCBmb3IgdGhlIGRpcmVjdG9yLiAwIG1lYW5zIHN0YW5kYnkgKGZhbGxiYWNrIGRpcmVjdG9yKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3dlaWdodFxuICAgKi9cbiAgcmVhZG9ubHkgd2VpZ2h0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHMob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29ubmVjdGlvblBhcmFtZXRlcnMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzKG9iai5jb25uZWN0aW9uUGFyYW1ldGVycyksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAncG9ydCc6IG9iai5wb3J0LFxuICAgICdwcm9iZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUob2JqLnByb2JlKSxcbiAgICAnc2VydmljZVJlZic6IHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZihvYmouc2VydmljZVJlZiksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBjbHVzdGVyIGNvbmZpZ3VyZXMgVmFybmlzaCBjbHVzdGVyaW5nIGJldHdlZW4gcG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlciB7XG4gIC8qKlxuICAgKiBlbmFibGVkIGFjdGl2YXRlcyBpbnRlci1wb2QgY2x1c3RlcmluZyB2aWEgYSBzaGFyZCBkaXJlY3Rvci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXIjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHBlZXJSb3V0aW5nIGNvbmZpZ3VyZXMgaG93IHJlcXVlc3RzIGFyZSByb3V0ZWQgYmV0d2VlbiBWYXJuaXNoIHBlZXJzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlciNwZWVyUm91dGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgcGVlclJvdXRpbmc/OiBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNDbHVzdGVyJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlcihvYmo6IFZpbnlsQ2FjaGVTcGVjQ2x1c3RlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncGVlclJvdXRpbmcnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmcob2JqLnBlZXJSb3V0aW5nKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGRlYm91bmNlIGNvbmZpZ3VyZXMgYSBncmFjZSBwZXJpb2QgYmVmb3JlIGFwcGx5aW5nIGVuZHBvaW50IGNoYW5nZXMgdG8gVmFybmlzaCxcbiAqIHByZXZlbnRpbmcgdGh1bmRlcmluZy1oZXJkIG9uIHJhcGlkIGVuZHBvaW50IGNodXJuLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEZWJvdW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjRGVib3VuY2Uge1xuICAvKipcbiAgICogZHVyYXRpb24gaXMgdGhlIHRpbWUgdG8gd2FpdCBhZnRlciB0aGUgbGFzdCBlbmRwb2ludCBjaGFuZ2UgYmVmb3JlIHB1c2hpbmcgYSBWQ0wgdXBkYXRlLlxuICAgKiBUaGlzIHByZXZlbnRzIHRodW5kZXJpbmctaGVyZCBvbiByYXBpZCBlbmRwb2ludCBjaHVybi4gRGVmYXVsdDogNXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEZWJvdW5jZSNkdXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZHVyYXRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGVib3VuY2UnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEZWJvdW5jZShvYmo6IFZpbnlsQ2FjaGVTcGVjRGVib3VuY2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkdXJhdGlvbic6IG9iai5kdXJhdGlvbixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGRpcmVjdG9yIGNvbmZpZ3VyZXMgaG93IFZhcm5pc2ggZGlzdHJpYnV0ZXMgcmVxdWVzdHMgYWNyb3NzIGJhY2tlbmQgZW5kcG9pbnRzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3Ige1xuICAvKipcbiAgICogaGFzaCBjb25maWd1cmVzIHRoZSBoYXNoIGRpcmVjdG9yLiBPbmx5IHVzZWQgd2hlbiB0eXBlIGlzIFwiaGFzaFwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3IjaGFzaFxuICAgKi9cbiAgcmVhZG9ubHkgaGFzaD86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoO1xuXG4gIC8qKlxuICAgKiBzaGFyZCBjb25maWd1cmVzIHRoZSBzaGFyZCBkaXJlY3RvciAoY29uc2lzdGVudC1oYXNoKS4gT25seSB1c2VkIHdoZW4gdHlwZSBpcyBcInNoYXJkXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvciNzaGFyZFxuICAgKi9cbiAgcmVhZG9ubHkgc2hhcmQ/OiBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQ7XG5cbiAgLyoqXG4gICAqIHR5cGUgc2VsZWN0cyB0aGUgVmFybmlzaCBkaXJlY3RvciBhbGdvcml0aG0uXG4gICAqIFwic2hhcmRcIiAoZGVmYXVsdCkgcHJvdmlkZXMgY29uc2lzdGVudCBoYXNoaW5nOyBcInJvdW5kX3JvYmluXCIsIFwicmFuZG9tXCIsIGFuZCBcImhhc2hcIlxuICAgKiBhcmUgYWxzbyBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvciN0eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogVmlueWxDYWNoZVNwZWNEaXJlY3RvclR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoYXNoJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoKG9iai5oYXNoKSxcbiAgICAnc2hhcmQnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkKG9iai5zaGFyZCksXG4gICAgJ3R5cGUnOiBvYmoudHlwZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGludmFsaWRhdGlvbiBjb25maWd1cmVzIGNhY2hlIGludmFsaWRhdGlvbiBtZXRob2RzIChQVVJHRSwgQkFOLCB4a2V5KS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb24ge1xuICAvKipcbiAgICogYmFuIGNvbmZpZ3VyZXMgQkFOLWJhc2VkIGNhY2hlIGludmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbiNiYW5cbiAgICovXG4gIHJlYWRvbmx5IGJhbj86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuO1xuXG4gIC8qKlxuICAgKiBwdXJnZSBjb25maWd1cmVzIEhUVFAgUFVSR0UtYmFzZWQgY2FjaGUgaW52YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uI3B1cmdlXG4gICAqL1xuICByZWFkb25seSBwdXJnZT86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2U7XG5cbiAgLyoqXG4gICAqIHhrZXkgY29uZmlndXJlcyB4a2V5LWJhc2VkIHN1cnJvZ2F0ZSBrZXkgaW52YWxpZGF0aW9uIChyZXF1aXJlcyB2bW9kX3hrZXkpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uI3hrZXlcbiAgICovXG4gIHJlYWRvbmx5IHhrZXk/OiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uKG9iajogVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiYW4nOiB0b0pzb25fVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4ob2JqLmJhbiksXG4gICAgJ3B1cmdlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2Uob2JqLnB1cmdlKSxcbiAgICAneGtleSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkob2JqLnhrZXkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogbW9uaXRvcmluZyBjb25maWd1cmVzIFByb21ldGhldXMgbWV0cmljcyBhbmQgYWxlcnRpbmcgcnVsZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY01vbml0b3Jpbmcge1xuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgUHJvbWV0aGV1cyBtZXRyaWNzIHNjcmFwaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogcHJvbWV0aGV1c1J1bGVzIGNvbmZpZ3VyZXMgUHJvbWV0aGV1c1J1bGUgb2JqZWN0cyBmb3IgYWxlcnRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nI3Byb21ldGhldXNSdWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgcHJvbWV0aGV1c1J1bGVzPzogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzO1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlTW9uaXRvciBjb25maWd1cmVzIGEgU2VydmljZU1vbml0b3IgZm9yIFByb21ldGhldXMgT3BlcmF0b3Igc2NyYXBpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nI3NlcnZpY2VNb25pdG9yXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTW9uaXRvcj86IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY01vbml0b3JpbmcnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nKG9iajogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdwcm9tZXRoZXVzUnVsZXMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzKG9iai5wcm9tZXRoZXVzUnVsZXMpLFxuICAgICdzZXJ2aWNlTW9uaXRvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvcihvYmouc2VydmljZU1vbml0b3IpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcG9kIGNvbmZpZ3VyZXMgcG9kLWxldmVsIHNjaGVkdWxpbmcgYW5kIG1ldGFkYXRhLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZCB7XG4gIC8qKlxuICAgKiBhZmZpbml0eSBjb25maWd1cmVzIHBvZCBhZmZpbml0eSBhbmQgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI2FmZmluaXR5XG4gICAqL1xuICByZWFkb25seSBhZmZpbml0eT86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHk7XG5cbiAgLyoqXG4gICAqIGFubm90YXRpb25zIGFyZSBhZGRlZCB0byBlYWNoIFZhcm5pc2ggcG9kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI2Fubm90YXRpb25zXG4gICAqL1xuICByZWFkb25seSBhbm5vdGF0aW9ucz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIGxhYmVscyBhcmUgYWRkZWQgdG8gZWFjaCBWYXJuaXNoIHBvZCAobWVyZ2VkIHdpdGggb3BlcmF0b3ItbWFuYWdlZCBsYWJlbHMpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI2xhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogbm9kZVNlbGVjdG9yIGNvbnN0cmFpbnMgcG9kcyB0byBub2RlcyBtYXRjaGluZyBhbGwgc3BlY2lmaWVkIGxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZCNub2RlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5vZGVTZWxlY3Rvcj86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIHByaW9yaXR5Q2xhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBQcmlvcml0eUNsYXNzIGZvciBWYXJuaXNoIHBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2QjcHJpb3JpdHlDbGFzc05hbWVcbiAgICovXG4gIHJlYWRvbmx5IHByaW9yaXR5Q2xhc3NOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB0b2xlcmF0aW9ucyBhbGxvdyBwb2RzIHRvIGJlIHNjaGVkdWxlZCBvbiB0YWludGVkIG5vZGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI3RvbGVyYXRpb25zXG4gICAqL1xuICByZWFkb25seSB0b2xlcmF0aW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnNbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2QnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2Qob2JqOiBWaW55bENhY2hlU3BlY1BvZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FmZmluaXR5JzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHkob2JqLmFmZmluaXR5KSxcbiAgICAnYW5ub3RhdGlvbnMnOiAoKG9iai5hbm5vdGF0aW9ucykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmFubm90YXRpb25zKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnbGFiZWxzJzogKChvYmoubGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnbm9kZVNlbGVjdG9yJzogKChvYmoubm9kZVNlbGVjdG9yKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubm9kZVNlbGVjdG9yKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAncHJpb3JpdHlDbGFzc05hbWUnOiBvYmoucHJpb3JpdHlDbGFzc05hbWUsXG4gICAgJ3RvbGVyYXRpb25zJzogb2JqLnRvbGVyYXRpb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyh5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwcm94eVByb3RvY29sIGVuYWJsZXMgUFJPWFkgcHJvdG9jb2wgb24gYSBkZWRpY2F0ZWQgcG9ydCBmb3IgcGFzc2luZyBjbGllbnQgSVAuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2xcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wge1xuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgUFJPWFkgcHJvdG9jb2wgc3VwcG9ydC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHBvcnQgaXMgdGhlIHBvcnQgb24gd2hpY2ggUFJPWFkgcHJvdG9jb2wgY29ubmVjdGlvbnMgYXJlIGFjY2VwdGVkLiBEZWZhdWx0OiA4MDgxLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUHJveHlQcm90b2NvbCNwb3J0XG4gICAqL1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sKG9iajogVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdwb3J0Jzogb2JqLnBvcnQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiByZXNvdXJjZXMgc2V0cyBDUFUgYW5kIG1lbW9yeSByZXF1ZXN0cy9saW1pdHMgZm9yIHRoZSBWYXJuaXNoIGNvbnRhaW5lci5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMge1xuICAvKipcbiAgICogQ2xhaW1zIGxpc3RzIHRoZSBuYW1lcyBvZiByZXNvdXJjZXMsIGRlZmluZWQgaW4gc3BlYy5yZXNvdXJjZUNsYWltcyxcbiAgICogdGhhdCBhcmUgdXNlZCBieSB0aGlzIGNvbnRhaW5lci5cbiAgICpcbiAgICogVGhpcyBmaWVsZCBkZXBlbmRzIG9uIHRoZVxuICAgKiBEeW5hbWljUmVzb3VyY2VBbGxvY2F0aW9uIGZlYXR1cmUgZ2F0ZS5cbiAgICpcbiAgICogVGhpcyBmaWVsZCBpcyBpbW11dGFibGUuIEl0IGNhbiBvbmx5IGJlIHNldCBmb3IgY29udGFpbmVycy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlcyNjbGFpbXNcbiAgICovXG4gIHJlYWRvbmx5IGNsYWltcz86IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zW107XG5cbiAgLyoqXG4gICAqIExpbWl0cyBkZXNjcmliZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGNvbXB1dGUgcmVzb3VyY2VzIGFsbG93ZWQuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvY29uZmlndXJhdGlvbi9tYW5hZ2UtcmVzb3VyY2VzLWNvbnRhaW5lcnMvXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMjbGltaXRzXG4gICAqL1xuICByZWFkb25seSBsaW1pdHM/OiB7IFtrZXk6IHN0cmluZ106IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzTGltaXRzIH07XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIGRlc2NyaWJlcyB0aGUgbWluaW11bSBhbW91bnQgb2YgY29tcHV0ZSByZXNvdXJjZXMgcmVxdWlyZWQuXG4gICAqIElmIFJlcXVlc3RzIGlzIG9taXR0ZWQgZm9yIGEgY29udGFpbmVyLCBpdCBkZWZhdWx0cyB0byBMaW1pdHMgaWYgdGhhdCBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCxcbiAgICogb3RoZXJ3aXNlIHRvIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdmFsdWUuIFJlcXVlc3RzIGNhbm5vdCBleGNlZWQgTGltaXRzLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL2NvbmZpZ3VyYXRpb24vbWFuYWdlLXJlc291cmNlcy1jb250YWluZXJzL1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzI3JlcXVlc3RzXG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0cz86IHsgW2tleTogc3RyaW5nXTogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1Jlc291cmNlcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1Jlc291cmNlcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2xhaW1zJzogb2JqLmNsYWltcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zKHkpKSxcbiAgICAnbGltaXRzJzogKChvYmoubGltaXRzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubGltaXRzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXT8udmFsdWUgfSksIHt9KSksXG4gICAgJ3JlcXVlc3RzJzogKChvYmoucmVxdWVzdHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5yZXF1ZXN0cykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0/LnZhbHVlIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcmV0cnkgY29uZmlndXJlcyByZXRyeSBiZWhhdmlvdXIgd2hlbiBWQ0wgdXBkYXRlcyBmYWlsIHRvIGFwcGx5LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXRyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUmV0cnkge1xuICAvKipcbiAgICogYmFja29mZkJhc2UgaXMgdGhlIGluaXRpYWwgYmFja29mZiBkdXJhdGlvbiBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzLiBEZWZhdWx0OiA1cy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1JldHJ5I2JhY2tvZmZCYXNlXG4gICAqL1xuICByZWFkb25seSBiYWNrb2ZmQmFzZT86IHN0cmluZztcblxuICAvKipcbiAgICogYmFja29mZk1heCBpcyB0aGUgbWF4aW11bSBiYWNrb2ZmIGR1cmF0aW9uIChleHBvbmVudGlhbCBiYWNrb2ZmIGNhcCkuIERlZmF1bHQ6IDVtLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmV0cnkjYmFja29mZk1heFxuICAgKi9cbiAgcmVhZG9ubHkgYmFja29mZk1heD86IHN0cmluZztcblxuICAvKipcbiAgICogbWF4QXR0ZW1wdHMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIFZDTCBwdXNoIGF0dGVtcHRzIGJlZm9yZSB0aGUgb3BlcmF0b3JcbiAgICogdHJhbnNpdGlvbnMgdG8gRXJyb3IgcGhhc2UuIERlZmF1bHQ6IDMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXRyeSNtYXhBdHRlbXB0c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4QXR0ZW1wdHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUmV0cnknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNSZXRyeShvYmo6IFZpbnlsQ2FjaGVTcGVjUmV0cnkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiYWNrb2ZmQmFzZSc6IG9iai5iYWNrb2ZmQmFzZSxcbiAgICAnYmFja29mZk1heCc6IG9iai5iYWNrb2ZmTWF4LFxuICAgICdtYXhBdHRlbXB0cyc6IG9iai5tYXhBdHRlbXB0cyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlcnZpY2UgY29uZmlndXJlcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIGNyZWF0ZWQgZm9yIHRyYWZmaWMgaW5ncmVzcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjU2VydmljZSB7XG4gIC8qKlxuICAgKiBhbm5vdGF0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIFNlcnZpY2Ugb2JqZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZSNhbm5vdGF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYW5ub3RhdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiB0eXBlIHNldHMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSB0eXBlIChDbHVzdGVySVAsIE5vZGVQb3J0LCBMb2FkQmFsYW5jZXIpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZSN0eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogVmlueWxDYWNoZVNwZWNTZXJ2aWNlVHlwZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNTZXJ2aWNlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjU2VydmljZShvYmo6IFZpbnlsQ2FjaGVTcGVjU2VydmljZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Fubm90YXRpb25zJzogKChvYmouYW5ub3RhdGlvbnMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5hbm5vdGF0aW9ucykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ3R5cGUnOiBvYmoudHlwZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFN0b3JhZ2VTcGVjIGNvbmZpZ3VyZXMgYSBWYXJuaXNoIHN0b3JhZ2UgYmFja2VuZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZSB7XG4gIC8qKlxuICAgKiBuYW1lIGlzIHRoZSBpbnRlcm5hbCBzdG9yYWdlIGlkZW50aWZpZXIgdXNlZCBpbiB2YXJuaXNoZCAtcyBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogcGF0aCBpcyB0aGUgZmlsZXN5c3RlbSBwYXRoIGZvciBmaWxlLXR5cGUgc3RvcmFnZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1N0b3JhZ2UjcGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogc2l6ZSBpcyB0aGUgc3RvcmFnZSBhbGxvY2F0aW9uIGFzIGEgS3ViZXJuZXRlcyByZXNvdXJjZSBxdWFudGl0eSAoZS5nLiBcIjFHaVwiKS5cbiAgICogVGhlIG9wZXJhdG9yIGNvbnZlcnRzIHRvIGJ5dGVzIGZvciB2YXJuaXNoZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1N0b3JhZ2Ujc2l6ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2l6ZT86IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemU7XG5cbiAgLyoqXG4gICAqIHR5cGUgaXMgdGhlIHN0b3JhZ2UgYmFja2VuZCB0eXBlLiBPbmx5IFwibWFsbG9jXCIgYW5kIFwiZmlsZVwiIGFyZSBwZXJtaXR0ZWQuXG4gICAqIFwicGVyc2lzdGVudFwiLCBcInVtZW1cIiwgYW5kIFwiZGVmYXVsdFwiIGFyZSByZWplY3RlZCBieSB0aGUgYWRtaXNzaW9uIHdlYmhvb2suXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlI3R5cGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjU3RvcmFnZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1N0b3JhZ2Uob2JqOiBWaW55bENhY2hlU3BlY1N0b3JhZ2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ3BhdGgnOiBvYmoucGF0aCxcbiAgICAnc2l6ZSc6IG9iai5zaXplPy52YWx1ZSxcbiAgICAndHlwZSc6IG9iai50eXBlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogdmNsIGNvbmZpZ3VyZXMgVkNMIGdlbmVyYXRpb246IHNuaXBwZXRzIGluamVjdGVkIGludG8gZ2VuZXJhdGVkIFZDTCBzdWJyb3V0aW5lcyxcbiAqIG9yIGEgZnVsbCBWQ0wgb3ZlcnJpZGUuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjVmNsIHtcbiAgLyoqXG4gICAqIGZ1bGxPdmVycmlkZSByZXBsYWNlcyB0aGUgZW50aXJlIGdlbmVyYXRlZCBWQ0wgd2l0aCBhIGN1c3RvbSBWQ0wgc3RyaW5nLlxuICAgKiBVc2Ugd2l0aCBjYXV0aW9uIOKAlCB0aGlzIGRpc2FibGVzIGFsbCBzdHJ1Y3R1cmVkIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2wjZnVsbE92ZXJyaWRlXG4gICAqL1xuICByZWFkb25seSBmdWxsT3ZlcnJpZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNuaXBwZXRzIHByb3ZpZGVzIFZDTCBjb2RlIGluamVjdGVkIGludG8gZWFjaCBnZW5lcmF0ZWQgc3Vicm91dGluZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbCNzbmlwcGV0c1xuICAgKi9cbiAgcmVhZG9ubHkgc25pcHBldHM/OiBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1ZjbCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1ZjbChvYmo6IFZpbnlsQ2FjaGVTcGVjVmNsIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZnVsbE92ZXJyaWRlJzogb2JqLmZ1bGxPdmVycmlkZSxcbiAgICAnc25pcHBldHMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyhvYmouc25pcHBldHMpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY29ubmVjdGlvblBhcmFtZXRlcnMgY29uZmlndXJlcyBiYWNrZW5kIGNvbm5lY3Rpb24gcG9vbCB0aW1lb3V0cyBhbmQgbGltaXRzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzIHtcbiAgLyoqXG4gICAqIGJldHdlZW5CeXRlc1RpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGJldHdlZW4gYnl0ZXMgb2YgdGhlIHJlc3BvbnNlIGJvZHkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI2JldHdlZW5CeXRlc1RpbWVvdXRcbiAgICovXG4gIHJlYWRvbmx5IGJldHdlZW5CeXRlc1RpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGNvbm5lY3RUaW1lb3V0IGlzIHRoZSBtYXhpbXVtIHRpbWUgdG8gZXN0YWJsaXNoIGEgVENQIGNvbm5lY3Rpb24gdG8gdGhlIGJhY2tlbmQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI2Nvbm5lY3RUaW1lb3V0XG4gICAqL1xuICByZWFkb25seSBjb25uZWN0VGltZW91dD86IHN0cmluZztcblxuICAvKipcbiAgICogZmlyc3RCeXRlVGltZW91dCBpcyB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXNwb25zZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzQ29ubmVjdGlvblBhcmFtZXRlcnMjZmlyc3RCeXRlVGltZW91dFxuICAgKi9cbiAgcmVhZG9ubHkgZmlyc3RCeXRlVGltZW91dD86IHN0cmluZztcblxuICAvKipcbiAgICogaWRsZVRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSBhbiBpZGxlIGNvbm5lY3Rpb24gbWF5IGJlIHJldXNlZC4gU2hvdWxkIGJlIGxlc3NcbiAgICogdGhhbiB0aGUgYmFja2VuZCdzIGtlZXAtYWxpdmUgdGltZW91dCB0byBhdm9pZCA1MDMgcmFjZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI2lkbGVUaW1lb3V0XG4gICAqL1xuICByZWFkb25seSBpZGxlVGltZW91dD86IHN0cmluZztcblxuICAvKipcbiAgICogbWF4Q29ubmVjdGlvbnMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgY29ubmVjdGlvbnMgdG8gdGhlIGJhY2tlbmQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI21heENvbm5lY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBtYXhDb25uZWN0aW9ucz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyhvYmo6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2JldHdlZW5CeXRlc1RpbWVvdXQnOiBvYmouYmV0d2VlbkJ5dGVzVGltZW91dCxcbiAgICAnY29ubmVjdFRpbWVvdXQnOiBvYmouY29ubmVjdFRpbWVvdXQsXG4gICAgJ2ZpcnN0Qnl0ZVRpbWVvdXQnOiBvYmouZmlyc3RCeXRlVGltZW91dCxcbiAgICAnaWRsZVRpbWVvdXQnOiBvYmouaWRsZVRpbWVvdXQsXG4gICAgJ21heENvbm5lY3Rpb25zJzogb2JqLm1heENvbm5lY3Rpb25zLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcHJvYmUgY29uZmlndXJlcyB0aGUgVmFybmlzaCBiYWNrZW5kIGhlYWx0aCBwcm9iZS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSB7XG4gIC8qKlxuICAgKiBleHBlY3RlZFJlc3BvbnNlIGlzIHRoZSBleHBlY3RlZCBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlLiBEZWZhdWx0cyB0byAyMDAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDIwMC5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUjZXhwZWN0ZWRSZXNwb25zZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZWN0ZWRSZXNwb25zZT86IG51bWJlcjtcblxuICAvKipcbiAgICogaW50ZXJ2YWwgaXMgaG93IG9mdGVuIHRvIHByb2JlIHRoZSBiYWNrZW5kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSNpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHRocmVzaG9sZCBpcyB0aGUgbWluaW11bSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCBwcm9iZXMgd2l0aGluIHRoZSB3aW5kb3cgZm9yIHRoZSBiYWNrZW5kXG4gICAqIHRvIGJlIGNvbnNpZGVyZWQgaGVhbHRoeS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUjdGhyZXNob2xkXG4gICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGZvciBhIHByb2JlIHJlc3BvbnNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSN0aW1lb3V0XG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB1cmwgaXMgdGhlIFVSTCB0byBwcm9iZS4gSWYgZW1wdHksIHRoZSBiYWNrZW5kJ3Mgcm9vdCBwYXRoIGlzIHVzZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlI3VybFxuICAgKi9cbiAgcmVhZG9ubHkgdXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB3aW5kb3cgaXMgdGhlIG51bWJlciBvZiBtb3N0IHJlY2VudCBwcm9iZXMgdG8gY29uc2lkZXIgZm9yIHRocmVzaG9sZCBldmFsdWF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSN3aW5kb3dcbiAgICovXG4gIHJlYWRvbmx5IHdpbmRvdz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZShvYmo6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2V4cGVjdGVkUmVzcG9uc2UnOiBvYmouZXhwZWN0ZWRSZXNwb25zZSxcbiAgICAnaW50ZXJ2YWwnOiBvYmouaW50ZXJ2YWwsXG4gICAgJ3RocmVzaG9sZCc6IG9iai50aHJlc2hvbGQsXG4gICAgJ3RpbWVvdXQnOiBvYmoudGltZW91dCxcbiAgICAndXJsJzogb2JqLnVybCxcbiAgICAnd2luZG93Jzogb2JqLndpbmRvdyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlcnZpY2VSZWYgcmVmZXJlbmNlcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIGluIHRoZSBzYW1lIG5hbWVzcGFjZS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWYge1xuICAvKipcbiAgICogbmFtZSBpcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIG5hbWUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWYjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZihvYmo6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcGVlclJvdXRpbmcgY29uZmlndXJlcyBob3cgcmVxdWVzdHMgYXJlIHJvdXRlZCBiZXR3ZWVuIFZhcm5pc2ggcGVlcnMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nIHtcbiAgLyoqXG4gICAqIHR5cGUgaXMgdGhlIHJvdXRpbmcgc3RyYXRlZ3kgYmV0d2VlbiBWYXJuaXNoIHBvZHMuIE9ubHkgXCJzaGFyZFwiIGlzIHN1cHBvcnRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZyN0eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmdUeXBlO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZyhvYmo6IFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAndHlwZSc6IG9iai50eXBlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogaGFzaCBjb25maWd1cmVzIHRoZSBoYXNoIGRpcmVjdG9yLiBPbmx5IHVzZWQgd2hlbiB0eXBlIGlzIFwiaGFzaFwiLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaCB7XG4gIC8qKlxuICAgKiBoZWFkZXIgaXMgdGhlIHJlcXVlc3QgaGVhZGVyIG5hbWUgdXNlZCBhcyB0aGUgaGFzaCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2gjaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBoZWFkZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoKG9iajogVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2ggfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoZWFkZXInOiBvYmouaGVhZGVyLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogc2hhcmQgY29uZmlndXJlcyB0aGUgc2hhcmQgZGlyZWN0b3IgKGNvbnNpc3RlbnQtaGFzaCkuIE9ubHkgdXNlZCB3aGVuIHR5cGUgaXMgXCJzaGFyZFwiLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkIHtcbiAgLyoqXG4gICAqIGJ5IGRldGVybWluZXMgd2hhdCB2YWx1ZSBpcyBoYXNoZWQgZm9yIHNoYXJkIHNlbGVjdGlvbi4gXCJIQVNIXCIgdXNlcyB0aGUgVmFybmlzaFxuICAgKiBoYXNoIChkZWZhdWx0KTsgXCJVUkxcIiB1c2VzIHRoZSByZXF1ZXN0IFVSTC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQjYnlcbiAgICovXG4gIHJlYWRvbmx5IGJ5PzogVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkQnk7XG5cbiAgLyoqXG4gICAqIGhlYWx0aHkgY29udHJvbHMgd2hpY2ggYmFja2VuZHMgdGhlIGRpcmVjdG9yIGNvbnNpZGVycyB3aGVuIHNlbGVjdGluZyBhIHNoYXJkLlxuICAgKiBcIkNIT1NFTlwiIChkZWZhdWx0KSBvbmx5IGNvbnNpZGVycyB0aGUgY2hvc2VuIGJhY2tlbmQgaGVhbHRoeTsgXCJBTExcIiByZXF1aXJlcyBhbGxcbiAgICogYmFja2VuZHMgdG8gYmUgaGVhbHRoeS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQjaGVhbHRoeVxuICAgKi9cbiAgcmVhZG9ubHkgaGVhbHRoeT86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZEhlYWx0aHk7XG5cbiAgLyoqXG4gICAqIHJhbXB1cCBpcyB0aGUgdGltZSBhZnRlciBhZGRpbmcgYSBiYWNrZW5kIGJlZm9yZSBpdCByZWNlaXZlcyBpdHMgZnVsbCBzaGFyZSBvZiB0cmFmZmljLFxuICAgKiBwcmV2ZW50aW5nIHRodW5kZXJpbmctaGVyZC4gRGVmYXVsdDogMzBzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZCNyYW1wdXBcbiAgICovXG4gIHJlYWRvbmx5IHJhbXB1cD86IHN0cmluZztcblxuICAvKipcbiAgICogcmVwbGljYXMgaXMgdGhlIG51bWJlciBvZiBLZXRhbWEgcmVwbGljYXMgcGVyIGJhY2tlbmQgaW4gdGhlIGhhc2ggcmluZy4gRGVmYXVsdDogNjcuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkI3JlcGxpY2FzXG4gICAqL1xuICByZWFkb25seSByZXBsaWNhcz86IG51bWJlcjtcblxuICAvKipcbiAgICogd2FybXVwIGlzIHRoZSBwcm9wb3J0aW9uIG9mIHJlcXVlc3RzICgwLjDigJMxLjApIHNlbnQgdG8gdGhlIGFsdGVybmF0aXZlIGJhY2tlbmRcbiAgICogdG8gcHJlLXBvcHVsYXRlIGl0cyBjYWNoZS4gRGVmYXVsdDogMC4xLiBNdXN0IGJlIGJldHdlZW4gMC4wIGFuZCAxLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkI3dhcm11cFxuICAgKi9cbiAgcmVhZG9ubHkgd2FybXVwPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkKG9iajogVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYnknOiBvYmouYnksXG4gICAgJ2hlYWx0aHknOiBvYmouaGVhbHRoeSxcbiAgICAncmFtcHVwJzogb2JqLnJhbXB1cCxcbiAgICAncmVwbGljYXMnOiBvYmoucmVwbGljYXMsXG4gICAgJ3dhcm11cCc6IG9iai53YXJtdXAsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiB0eXBlIHNlbGVjdHMgdGhlIFZhcm5pc2ggZGlyZWN0b3IgYWxnb3JpdGhtLlxuICogXCJzaGFyZFwiIChkZWZhdWx0KSBwcm92aWRlcyBjb25zaXN0ZW50IGhhc2hpbmc7IFwicm91bmRfcm9iaW5cIiwgXCJyYW5kb21cIiwgYW5kIFwiaGFzaFwiXG4gKiBhcmUgYWxzbyBzdXBwb3J0ZWQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yVHlwZVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY0RpcmVjdG9yVHlwZSB7XG4gIC8qKiBzaGFyZCAqL1xuICBTSEFSRCA9IFwic2hhcmRcIixcbiAgLyoqIHJvdW5kX3JvYmluICovXG4gIFJPVU5EX1VOREVSU0NPUkVfUk9CSU4gPSBcInJvdW5kX3JvYmluXCIsXG4gIC8qKiByYW5kb20gKi9cbiAgUkFORE9NID0gXCJyYW5kb21cIixcbiAgLyoqIGhhc2ggKi9cbiAgSEFTSCA9IFwiaGFzaFwiLFxufVxuXG4vKipcbiAqIGJhbiBjb25maWd1cmVzIEJBTi1iYXNlZCBjYWNoZSBpbnZhbGlkYXRpb24uXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuIHtcbiAgLyoqXG4gICAqIGFsbG93ZWRTb3VyY2VzIGlzIGEgbGlzdCBvZiBDSURSIHJhbmdlcyBwZXJtaXR0ZWQgdG8gc2VuZCBCQU4gcmVxdWVzdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4jYWxsb3dlZFNvdXJjZXNcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRTb3VyY2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIGVuYWJsZWQgYWN0aXZhdGVzIHRoZSBCQU4gaW52YWxpZGF0aW9uIGhhbmRsZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHJhdGVMaW1pdFBlck1pbnV0ZSBsaW1pdHMgQkFOIHJlcXVlc3RzIHBlciBtaW51dGUuIDAgbWVhbnMgbm8gbGltaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4jcmF0ZUxpbWl0UGVyTWludXRlXG4gICAqL1xuICByZWFkb25seSByYXRlTGltaXRQZXJNaW51dGU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuKG9iajogVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbGxvd2VkU291cmNlcyc6IG9iai5hbGxvd2VkU291cmNlcz8ubWFwKHkgPT4geSksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncmF0ZUxpbWl0UGVyTWludXRlJzogb2JqLnJhdGVMaW1pdFBlck1pbnV0ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHB1cmdlIGNvbmZpZ3VyZXMgSFRUUCBQVVJHRS1iYXNlZCBjYWNoZSBpbnZhbGlkYXRpb24uXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZSB7XG4gIC8qKlxuICAgKiBhbGxvd2VkU291cmNlcyBpcyBhIGxpc3Qgb2YgQ0lEUiByYW5nZXMgcGVybWl0dGVkIHRvIHNlbmQgUFVSR0UgcmVxdWVzdHMuXG4gICAqIElmIGVtcHR5LCBubyBzb3VyY2UgcmVzdHJpY3Rpb24gaXMgYXBwbGllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlI2FsbG93ZWRTb3VyY2VzXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkU291cmNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBlbmFibGVkIGFjdGl2YXRlcyB0aGUgUFVSR0UgaW52YWxpZGF0aW9uIGhhbmRsZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZSNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogc29mdCBlbmFibGVzIHNvZnQgcHVyZ2VzLCB3aGljaCBtYXJrIG9iamVjdHMgYXMgZXhwaXJlZCByYXRoZXIgdGhhbiByZW1vdmluZyB0aGVtLlxuICAgKiBUaGlzIGFsbG93cyBWYXJuaXNoIHRvIHNlcnZlIHN0YWxlIGNvbnRlbnQgd2hpbGUgcmV2YWxpZGF0aW5nLiBEZWZhdWx0OiB0cnVlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2Ujc29mdFxuICAgKi9cbiAgcmVhZG9ubHkgc29mdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2UnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZShvYmo6IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbGxvd2VkU291cmNlcyc6IG9iai5hbGxvd2VkU291cmNlcz8ubWFwKHkgPT4geSksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnc29mdCc6IG9iai5zb2Z0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogeGtleSBjb25maWd1cmVzIHhrZXktYmFzZWQgc3Vycm9nYXRlIGtleSBpbnZhbGlkYXRpb24gKHJlcXVpcmVzIHZtb2RfeGtleSkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkge1xuICAvKipcbiAgICogYWxsb3dlZFNvdXJjZXMgaXMgYSBsaXN0IG9mIENJRFIgcmFuZ2VzIHBlcm1pdHRlZCB0byBzZW5kIHhrZXkgaW52YWxpZGF0aW9uIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleSNhbGxvd2VkU291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZFNvdXJjZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgeGtleS1iYXNlZCBpbnZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5I2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBzb2Z0UHVyZ2UgZW5hYmxlcyBzb2Z0IHB1cmdpbmcgdmlhIHhrZXkuIERlZmF1bHQ6IHRydWUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5I3NvZnRQdXJnZVxuICAgKi9cbiAgcmVhZG9ubHkgc29mdFB1cmdlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleShvYmo6IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FsbG93ZWRTb3VyY2VzJzogb2JqLmFsbG93ZWRTb3VyY2VzPy5tYXAoeSA9PiB5KSxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdzb2Z0UHVyZ2UnOiBvYmouc29mdFB1cmdlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcHJvbWV0aGV1c1J1bGVzIGNvbmZpZ3VyZXMgUHJvbWV0aGV1c1J1bGUgb2JqZWN0cyBmb3IgYWxlcnRpbmcuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXMge1xuICAvKipcbiAgICogZW5hYmxlZCBjcmVhdGVzIGEgUHJvbWV0aGV1c1J1bGUgd2l0aCBkZWZhdWx0IGFsZXJ0aW5nIHJ1bGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcyNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcyhvYmo6IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlcnZpY2VNb25pdG9yIGNvbmZpZ3VyZXMgYSBTZXJ2aWNlTW9uaXRvciBmb3IgUHJvbWV0aGV1cyBPcGVyYXRvciBzY3JhcGluZy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3Ige1xuICAvKipcbiAgICogZW5hYmxlZCBjcmVhdGVzIGEgU2VydmljZU1vbml0b3IgdGFyZ2V0aW5nIHRoZSBWYXJuaXNoIG1ldHJpY3MgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3IjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGludGVydmFsIGlzIHRoZSBzY3JhcGUgaW50ZXJ2YWwgKGUuZy4gXCIzMHNcIikuIERlZmF1bHRzIHRvIHRoZSBQcm9tZXRoZXVzIGdsb2JhbCBpbnRlcnZhbC5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIFByb21ldGhldXMgZ2xvYmFsIGludGVydmFsLlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yI2ludGVydmFsXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3Iob2JqOiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnaW50ZXJ2YWwnOiBvYmouaW50ZXJ2YWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBhZmZpbml0eSBjb25maWd1cmVzIHBvZCBhZmZpbml0eSBhbmQgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHkge1xuICAvKipcbiAgICogRGVzY3JpYmVzIG5vZGUgYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcyBmb3IgdGhlIHBvZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5I25vZGVBZmZpbml0eVxuICAgKi9cbiAgcmVhZG9ubHkgbm9kZUFmZmluaXR5PzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eTtcblxuICAvKipcbiAgICogRGVzY3JpYmVzIHBvZCBhZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzIChlLmcuIGNvLWxvY2F0ZSB0aGlzIHBvZCBpbiB0aGUgc2FtZSBub2RlLCB6b25lLCBldGMuIGFzIHNvbWUgb3RoZXIgcG9kKHMpKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5I3BvZEFmZmluaXR5XG4gICAqL1xuICByZWFkb25seSBwb2RBZmZpbml0eT86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eTtcblxuICAvKipcbiAgICogRGVzY3JpYmVzIHBvZCBhbnRpLWFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgKGUuZy4gYXZvaWQgcHV0dGluZyB0aGlzIHBvZCBpbiB0aGUgc2FtZSBub2RlLCB6b25lLCBldGMuIGFzIHNvbWUgb3RoZXIgcG9kKHMpKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5I3BvZEFudGlBZmZpbml0eVxuICAgKi9cbiAgcmVhZG9ubHkgcG9kQW50aUFmZmluaXR5PzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5KG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ25vZGVBZmZpbml0eSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5KG9iai5ub2RlQWZmaW5pdHkpLFxuICAgICdwb2RBZmZpbml0eSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHkob2JqLnBvZEFmZmluaXR5KSxcbiAgICAncG9kQW50aUFmZmluaXR5JzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHkob2JqLnBvZEFudGlBZmZpbml0eSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBUaGUgcG9kIHRoaXMgVG9sZXJhdGlvbiBpcyBhdHRhY2hlZCB0byB0b2xlcmF0ZXMgYW55IHRhaW50IHRoYXQgbWF0Y2hlc1xuICogdGhlIHRyaXBsZSA8a2V5LHZhbHVlLGVmZmVjdD4gdXNpbmcgdGhlIG1hdGNoaW5nIG9wZXJhdG9yIDxvcGVyYXRvcj4uXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyB7XG4gIC8qKlxuICAgKiBFZmZlY3QgaW5kaWNhdGVzIHRoZSB0YWludCBlZmZlY3QgdG8gbWF0Y2guIEVtcHR5IG1lYW5zIG1hdGNoIGFsbCB0YWludCBlZmZlY3RzLlxuICAgKiBXaGVuIHNwZWNpZmllZCwgYWxsb3dlZCB2YWx1ZXMgYXJlIE5vU2NoZWR1bGUsIFByZWZlck5vU2NoZWR1bGUgYW5kIE5vRXhlY3V0ZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zI2VmZmVjdFxuICAgKi9cbiAgcmVhZG9ubHkgZWZmZWN0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZXkgaXMgdGhlIHRhaW50IGtleSB0aGF0IHRoZSB0b2xlcmF0aW9uIGFwcGxpZXMgdG8uIEVtcHR5IG1lYW5zIG1hdGNoIGFsbCB0YWludCBrZXlzLlxuICAgKiBJZiB0aGUga2V5IGlzIGVtcHR5LCBvcGVyYXRvciBtdXN0IGJlIEV4aXN0czsgdGhpcyBjb21iaW5hdGlvbiBtZWFucyB0byBtYXRjaCBhbGwgdmFsdWVzIGFuZCBhbGwga2V5cy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIHRoZSB2YWx1ZS5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBFeGlzdHMsIEVxdWFsLCBMdCwgYW5kIEd0LiBEZWZhdWx0cyB0byBFcXVhbC5cbiAgICogRXhpc3RzIGlzIGVxdWl2YWxlbnQgdG8gd2lsZGNhcmQgZm9yIHZhbHVlLCBzbyB0aGF0IGEgcG9kIGNhblxuICAgKiB0b2xlcmF0ZSBhbGwgdGFpbnRzIG9mIGEgcGFydGljdWxhciBjYXRlZ29yeS5cbiAgICogTHQgYW5kIEd0IHBlcmZvcm0gbnVtZXJpYyBjb21wYXJpc29ucyAocmVxdWlyZXMgZmVhdHVyZSBnYXRlIFRhaW50VG9sZXJhdGlvbkNvbXBhcmlzb25PcGVyYXRvcnMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBFcXVhbC5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcj86IHN0cmluZztcblxuICAvKipcbiAgICogVG9sZXJhdGlvblNlY29uZHMgcmVwcmVzZW50cyB0aGUgcGVyaW9kIG9mIHRpbWUgdGhlIHRvbGVyYXRpb24gKHdoaWNoIG11c3QgYmVcbiAgICogb2YgZWZmZWN0IE5vRXhlY3V0ZSwgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgaWdub3JlZCkgdG9sZXJhdGVzIHRoZSB0YWludC4gQnkgZGVmYXVsdCxcbiAgICogaXQgaXMgbm90IHNldCwgd2hpY2ggbWVhbnMgdG9sZXJhdGUgdGhlIHRhaW50IGZvcmV2ZXIgKGRvIG5vdCBldmljdCkuIFplcm8gYW5kXG4gICAqIG5lZ2F0aXZlIHZhbHVlcyB3aWxsIGJlIHRyZWF0ZWQgYXMgMCAoZXZpY3QgaW1tZWRpYXRlbHkpIGJ5IHRoZSBzeXN0ZW0uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyN0b2xlcmF0aW9uU2Vjb25kc1xuICAgKi9cbiAgcmVhZG9ubHkgdG9sZXJhdGlvblNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFZhbHVlIGlzIHRoZSB0YWludCB2YWx1ZSB0aGUgdG9sZXJhdGlvbiBtYXRjaGVzIHRvLlxuICAgKiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGVtcHR5LCBvdGhlcndpc2UganVzdCBhIHJlZ3VsYXIgc3RyaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMjdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZWZmZWN0Jzogb2JqLmVmZmVjdCxcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3RvbGVyYXRpb25TZWNvbmRzJzogb2JqLnRvbGVyYXRpb25TZWNvbmRzLFxuICAgICd2YWx1ZSc6IG9iai52YWx1ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFJlc291cmNlQ2xhaW0gcmVmZXJlbmNlcyBvbmUgZW50cnkgaW4gUG9kU3BlYy5SZXNvdXJjZUNsYWltcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNDbGFpbXMge1xuICAvKipcbiAgICogTmFtZSBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIG9uZSBlbnRyeSBpbiBwb2Quc3BlYy5yZXNvdXJjZUNsYWltcyBvZlxuICAgKiB0aGUgUG9kIHdoZXJlIHRoaXMgZmllbGQgaXMgdXNlZC4gSXQgbWFrZXMgdGhhdCByZXNvdXJjZSBhdmFpbGFibGVcbiAgICogaW5zaWRlIGEgY29udGFpbmVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogUmVxdWVzdCBpcyB0aGUgbmFtZSBjaG9zZW4gZm9yIGEgcmVxdWVzdCBpbiB0aGUgcmVmZXJlbmNlZCBjbGFpbS5cbiAgICogSWYgZW1wdHksIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgY2xhaW0gaXMgbWFkZSBhdmFpbGFibGUsIG90aGVyd2lzZVxuICAgKiBvbmx5IHRoZSByZXN1bHQgb2YgdGhpcyByZXF1ZXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zI3JlcXVlc3RcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3Q/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zKG9iajogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNDbGFpbXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ3JlcXVlc3QnOiBvYmoucmVxdWVzdCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNMaW1pdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzTGltaXRzIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICB9XG59XG5cbi8qKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzUmVxdWVzdHModmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiB0eXBlIHNldHMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSB0eXBlIChDbHVzdGVySVAsIE5vZGVQb3J0LCBMb2FkQmFsYW5jZXIpLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTZXJ2aWNlVHlwZVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY1NlcnZpY2VUeXBlIHtcbiAgLyoqIENsdXN0ZXJJUCAqL1xuICBDTFVTVEVSX0lQID0gXCJDbHVzdGVySVBcIixcbiAgLyoqIE5vZGVQb3J0ICovXG4gIE5PREVfUE9SVCA9IFwiTm9kZVBvcnRcIixcbiAgLyoqIExvYWRCYWxhbmNlciAqL1xuICBMT0FEX0JBTEFOQ0VSID0gXCJMb2FkQmFsYW5jZXJcIixcbn1cblxuLyoqXG4gKiBzaXplIGlzIHRoZSBzdG9yYWdlIGFsbG9jYXRpb24gYXMgYSBLdWJlcm5ldGVzIHJlc291cmNlIHF1YW50aXR5IChlLmcuIFwiMUdpXCIpLlxuICogVGhlIG9wZXJhdG9yIGNvbnZlcnRzIHRvIGJ5dGVzIGZvciB2YXJuaXNoZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemVcbiAqL1xuZXhwb3J0IGNsYXNzIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemUge1xuICBwdWJsaWMgc3RhdGljIGZyb21OdW1iZXIodmFsdWU6IG51bWJlcik6IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemUge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNTdG9yYWdlU2l6ZSh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemUodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgfVxufVxuXG4vKipcbiAqIHR5cGUgaXMgdGhlIHN0b3JhZ2UgYmFja2VuZCB0eXBlLiBPbmx5IFwibWFsbG9jXCIgYW5kIFwiZmlsZVwiIGFyZSBwZXJtaXR0ZWQuXG4gKiBcInBlcnNpc3RlbnRcIiwgXCJ1bWVtXCIsIGFuZCBcImRlZmF1bHRcIiBhcmUgcmVqZWN0ZWQgYnkgdGhlIGFkbWlzc2lvbiB3ZWJob29rLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlVHlwZVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY1N0b3JhZ2VUeXBlIHtcbiAgLyoqIG1hbGxvYyAqL1xuICBNQUxMT0MgPSBcIm1hbGxvY1wiLFxuICAvKiogZmlsZSAqL1xuICBGSUxFID0gXCJmaWxlXCIsXG59XG5cbi8qKlxuICogc25pcHBldHMgcHJvdmlkZXMgVkNMIGNvZGUgaW5qZWN0ZWQgaW50byBlYWNoIGdlbmVyYXRlZCBzdWJyb3V0aW5lLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMge1xuICAvKipcbiAgICogaGVhZGVyIGlzIGluc2VydGVkIGF0IHRoZSB0b3Agb2YgdGhlIFZDTCBmaWxlLCBiZWZvcmUgYW55IHN1YnJvdXRpbmVzLlxuICAgKiBVc2UgZm9yIGltcG9ydCBzdGF0ZW1lbnRzIGFuZCBnbG9iYWwgZGVjbGFyYXRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBoZWFkZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEJhY2tlbmRFcnJvciBpcyBpbnNlcnRlZCBpbnRvIHZjbF9iYWNrZW5kX2Vycm9yLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsQmFja2VuZEVycm9yXG4gICAqL1xuICByZWFkb25seSB2Y2xCYWNrZW5kRXJyb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEJhY2tlbmRGZXRjaCBpcyBpbnNlcnRlZCBpbnRvIHZjbF9iYWNrZW5kX2ZldGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsQmFja2VuZEZldGNoXG4gICAqL1xuICByZWFkb25seSB2Y2xCYWNrZW5kRmV0Y2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEJhY2tlbmRSZXNwb25zZSBpcyBpbnNlcnRlZCBpbnRvIHZjbF9iYWNrZW5kX3Jlc3BvbnNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsQmFja2VuZFJlc3BvbnNlXG4gICAqL1xuICByZWFkb25seSB2Y2xCYWNrZW5kUmVzcG9uc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbERlbGl2ZXIgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfZGVsaXZlci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbERlbGl2ZXJcbiAgICovXG4gIHJlYWRvbmx5IHZjbERlbGl2ZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEZpbmkgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfZmluaS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEZpbmlcbiAgICovXG4gIHJlYWRvbmx5IHZjbEZpbmk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEhhc2ggaXMgaW5zZXJ0ZWQgaW50byB2Y2xfaGFzaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEhhc2hcbiAgICovXG4gIHJlYWRvbmx5IHZjbEhhc2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEhpdCBpcyBpbnNlcnRlZCBpbnRvIHZjbF9oaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xIaXRcbiAgICovXG4gIHJlYWRvbmx5IHZjbEhpdD86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsSW5pdCBpcyBpbnNlcnRlZCBpbnRvIHRoZSB2Y2xfaW5pdCBzdWJyb3V0aW5lIGFmdGVyIGRpcmVjdG9yIGluaXRpYWxpc2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsSW5pdFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsSW5pdD86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsTWlzcyBpcyBpbnNlcnRlZCBpbnRvIHZjbF9taXNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsTWlzc1xuICAgKi9cbiAgcmVhZG9ubHkgdmNsTWlzcz86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsUGFzcyBpcyBpbnNlcnRlZCBpbnRvIHZjbF9wYXNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsUGFzc1xuICAgKi9cbiAgcmVhZG9ubHkgdmNsUGFzcz86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsUGlwZSBpcyBpbnNlcnRlZCBpbnRvIHZjbF9waXBlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsUGlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdmNsUGlwZT86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsUHVyZ2UgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfcHVyZ2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xQdXJnZVxuICAgKi9cbiAgcmVhZG9ubHkgdmNsUHVyZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbFJlY3YgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfcmVjdiBhZnRlciBnZW5lcmF0ZWQgcm91dGluZyBsb2dpYywgYmVmb3JlIHJldHVybigpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsUmVjdlxuICAgKi9cbiAgcmVhZG9ubHkgdmNsUmVjdj86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsU3ludGggaXMgaW5zZXJ0ZWQgaW50byB2Y2xfc3ludGguXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xTeW50aFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsU3ludGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyhvYmo6IFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoZWFkZXInOiBvYmouaGVhZGVyLFxuICAgICd2Y2xCYWNrZW5kRXJyb3InOiBvYmoudmNsQmFja2VuZEVycm9yLFxuICAgICd2Y2xCYWNrZW5kRmV0Y2gnOiBvYmoudmNsQmFja2VuZEZldGNoLFxuICAgICd2Y2xCYWNrZW5kUmVzcG9uc2UnOiBvYmoudmNsQmFja2VuZFJlc3BvbnNlLFxuICAgICd2Y2xEZWxpdmVyJzogb2JqLnZjbERlbGl2ZXIsXG4gICAgJ3ZjbEZpbmknOiBvYmoudmNsRmluaSxcbiAgICAndmNsSGFzaCc6IG9iai52Y2xIYXNoLFxuICAgICd2Y2xIaXQnOiBvYmoudmNsSGl0LFxuICAgICd2Y2xJbml0Jzogb2JqLnZjbEluaXQsXG4gICAgJ3ZjbE1pc3MnOiBvYmoudmNsTWlzcyxcbiAgICAndmNsUGFzcyc6IG9iai52Y2xQYXNzLFxuICAgICd2Y2xQaXBlJzogb2JqLnZjbFBpcGUsXG4gICAgJ3ZjbFB1cmdlJzogb2JqLnZjbFB1cmdlLFxuICAgICd2Y2xSZWN2Jzogb2JqLnZjbFJlY3YsXG4gICAgJ3ZjbFN5bnRoJzogb2JqLnZjbFN5bnRoLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogdHlwZSBpcyB0aGUgcm91dGluZyBzdHJhdGVneSBiZXR3ZWVuIFZhcm5pc2ggcG9kcy4gT25seSBcInNoYXJkXCIgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmdUeXBlXG4gKi9cbmV4cG9ydCBlbnVtIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nVHlwZSB7XG4gIC8qKiBzaGFyZCAqL1xuICBTSEFSRCA9IFwic2hhcmRcIixcbn1cblxuLyoqXG4gKiBieSBkZXRlcm1pbmVzIHdoYXQgdmFsdWUgaXMgaGFzaGVkIGZvciBzaGFyZCBzZWxlY3Rpb24uIFwiSEFTSFwiIHVzZXMgdGhlIFZhcm5pc2hcbiAqIGhhc2ggKGRlZmF1bHQpOyBcIlVSTFwiIHVzZXMgdGhlIHJlcXVlc3QgVVJMLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkQnlcbiAqL1xuZXhwb3J0IGVudW0gVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkQnkge1xuICAvKiogSEFTSCAqL1xuICBIQVNIID0gXCJIQVNIXCIsXG4gIC8qKiBVUkwgKi9cbiAgVVJMID0gXCJVUkxcIixcbn1cblxuLyoqXG4gKiBoZWFsdGh5IGNvbnRyb2xzIHdoaWNoIGJhY2tlbmRzIHRoZSBkaXJlY3RvciBjb25zaWRlcnMgd2hlbiBzZWxlY3RpbmcgYSBzaGFyZC5cbiAqIFwiQ0hPU0VOXCIgKGRlZmF1bHQpIG9ubHkgY29uc2lkZXJzIHRoZSBjaG9zZW4gYmFja2VuZCBoZWFsdGh5OyBcIkFMTFwiIHJlcXVpcmVzIGFsbFxuICogYmFja2VuZHMgdG8gYmUgaGVhbHRoeS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZEhlYWx0aHlcbiAqL1xuZXhwb3J0IGVudW0gVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkSGVhbHRoeSB7XG4gIC8qKiBDSE9TRU4gKi9cbiAgQ0hPU0VOID0gXCJDSE9TRU5cIixcbiAgLyoqIEFMTCAqL1xuICBBTEwgPSBcIkFMTFwiLFxufVxuXG4vKipcbiAqIERlc2NyaWJlcyBub2RlIGFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgZm9yIHRoZSBwb2QuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eSB7XG4gIC8qKlxuICAgKiBUaGUgc2NoZWR1bGVyIHdpbGwgcHJlZmVyIHRvIHNjaGVkdWxlIHBvZHMgdG8gbm9kZXMgdGhhdCBzYXRpc2Z5XG4gICAqIHRoZSBhZmZpbml0eSBleHByZXNzaW9ucyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCwgYnV0IGl0IG1heSBjaG9vc2VcbiAgICogYSBub2RlIHRoYXQgdmlvbGF0ZXMgb25lIG9yIG1vcmUgb2YgdGhlIGV4cHJlc3Npb25zLiBUaGUgbm9kZSB0aGF0IGlzXG4gICAqIG1vc3QgcHJlZmVycmVkIGlzIHRoZSBvbmUgd2l0aCB0aGUgZ3JlYXRlc3Qgc3VtIG9mIHdlaWdodHMsIGkuZS5cbiAgICogZm9yIGVhY2ggbm9kZSB0aGF0IG1lZXRzIGFsbCBvZiB0aGUgc2NoZWR1bGluZyByZXF1aXJlbWVudHMgKHJlc291cmNlXG4gICAqIHJlcXVlc3QsIHJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZyBhZmZpbml0eSBleHByZXNzaW9ucywgZXRjLiksXG4gICAqIGNvbXB1dGUgYSBzdW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGVsZW1lbnRzIG9mIHRoaXMgZmllbGQgYW5kIGFkZGluZ1xuICAgKiBcIndlaWdodFwiIHRvIHRoZSBzdW0gaWYgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29ycmVzcG9uZGluZyBtYXRjaEV4cHJlc3Npb25zOyB0aGVcbiAgICogbm9kZShzKSB3aXRoIHRoZSBoaWdoZXN0IHN1bSBhcmUgdGhlIG1vc3QgcHJlZmVycmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHkjcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uW107XG5cbiAgLyoqXG4gICAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgYXJlIG5vdCBtZXQgYXRcbiAgICogc2NoZWR1bGluZyB0aW1lLCB0aGUgcG9kIHdpbGwgbm90IGJlIHNjaGVkdWxlZCBvbnRvIHRoZSBub2RlLlxuICAgKiBJZiB0aGUgYWZmaW5pdHkgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkIGNlYXNlIHRvIGJlIG1ldFxuICAgKiBhdCBzb21lIHBvaW50IGR1cmluZyBwb2QgZXhlY3V0aW9uIChlLmcuIGR1ZSB0byBhbiB1cGRhdGUpLCB0aGUgc3lzdGVtXG4gICAqIG1heSBvciBtYXkgbm90IHRyeSB0byBldmVudHVhbGx5IGV2aWN0IHRoZSBwb2QgZnJvbSBpdHMgbm9kZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5I3JlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5KG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKHkpKSxcbiAgICAncmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmoucmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZXNjcmliZXMgcG9kIGFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgKGUuZy4gY28tbG9jYXRlIHRoaXMgcG9kIGluIHRoZSBzYW1lIG5vZGUsIHpvbmUsIGV0Yy4gYXMgc29tZSBvdGhlciBwb2QocykpLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBzY2hlZHVsZXIgd2lsbCBwcmVmZXIgdG8gc2NoZWR1bGUgcG9kcyB0byBub2RlcyB0aGF0IHNhdGlzZnlcbiAgICogdGhlIGFmZmluaXR5IGV4cHJlc3Npb25zIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkLCBidXQgaXQgbWF5IGNob29zZVxuICAgKiBhIG5vZGUgdGhhdCB2aW9sYXRlcyBvbmUgb3IgbW9yZSBvZiB0aGUgZXhwcmVzc2lvbnMuIFRoZSBub2RlIHRoYXQgaXNcbiAgICogbW9zdCBwcmVmZXJyZWQgaXMgdGhlIG9uZSB3aXRoIHRoZSBncmVhdGVzdCBzdW0gb2Ygd2VpZ2h0cywgaS5lLlxuICAgKiBmb3IgZWFjaCBub2RlIHRoYXQgbWVldHMgYWxsIG9mIHRoZSBzY2hlZHVsaW5nIHJlcXVpcmVtZW50cyAocmVzb3VyY2VcbiAgICogcmVxdWVzdCwgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nIGFmZmluaXR5IGV4cHJlc3Npb25zLCBldGMuKSxcbiAgICogY29tcHV0ZSBhIHN1bSBieSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZWxlbWVudHMgb2YgdGhpcyBmaWVsZCBhbmQgYWRkaW5nXG4gICAqIFwid2VpZ2h0XCIgdG8gdGhlIHN1bSBpZiB0aGUgbm9kZSBoYXMgcG9kcyB3aGljaCBtYXRjaGVzIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybTsgdGhlXG4gICAqIG5vZGUocykgd2l0aCB0aGUgaGlnaGVzdCBzdW0gYXJlIHRoZSBtb3N0IHByZWZlcnJlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHkjcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25bXTtcblxuICAvKipcbiAgICogSWYgdGhlIGFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBhcmUgbm90IG1ldCBhdFxuICAgKiBzY2hlZHVsaW5nIHRpbWUsIHRoZSBwb2Qgd2lsbCBub3QgYmUgc2NoZWR1bGVkIG9udG8gdGhlIG5vZGUuXG4gICAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gICAqIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHBvZCBleGVjdXRpb24gKGUuZy4gZHVlIHRvIGEgcG9kIGxhYmVsIHVwZGF0ZSksIHRoZVxuICAgKiBzeXN0ZW0gbWF5IG9yIG1heSBub3QgdHJ5IHRvIGV2ZW50dWFsbHkgZXZpY3QgdGhlIHBvZCBmcm9tIGl0cyBub2RlLlxuICAgKiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cywgdGhlIGxpc3RzIG9mIG5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaFxuICAgKiBwb2RBZmZpbml0eVRlcm0gYXJlIGludGVyc2VjdGVkLCBpLmUuIGFsbCB0ZXJtcyBtdXN0IGJlIHNhdGlzZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHkjcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25bXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24oeSkpLFxuICAgICdyZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIERlc2NyaWJlcyBwb2QgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzIChlLmcuIGF2b2lkIHB1dHRpbmcgdGhpcyBwb2QgaW4gdGhlIHNhbWUgbm9kZSwgem9uZSwgZXRjLiBhcyBzb21lIG90aGVyIHBvZChzKSkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eSB7XG4gIC8qKlxuICAgKiBUaGUgc2NoZWR1bGVyIHdpbGwgcHJlZmVyIHRvIHNjaGVkdWxlIHBvZHMgdG8gbm9kZXMgdGhhdCBzYXRpc2Z5XG4gICAqIHRoZSBhbnRpLWFmZmluaXR5IGV4cHJlc3Npb25zIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkLCBidXQgaXQgbWF5IGNob29zZVxuICAgKiBhIG5vZGUgdGhhdCB2aW9sYXRlcyBvbmUgb3IgbW9yZSBvZiB0aGUgZXhwcmVzc2lvbnMuIFRoZSBub2RlIHRoYXQgaXNcbiAgICogbW9zdCBwcmVmZXJyZWQgaXMgdGhlIG9uZSB3aXRoIHRoZSBncmVhdGVzdCBzdW0gb2Ygd2VpZ2h0cywgaS5lLlxuICAgKiBmb3IgZWFjaCBub2RlIHRoYXQgbWVldHMgYWxsIG9mIHRoZSBzY2hlZHVsaW5nIHJlcXVpcmVtZW50cyAocmVzb3VyY2VcbiAgICogcmVxdWVzdCwgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nIGFudGktYWZmaW5pdHkgZXhwcmVzc2lvbnMsIGV0Yy4pLFxuICAgKiBjb21wdXRlIGEgc3VtIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBlbGVtZW50cyBvZiB0aGlzIGZpZWxkIGFuZCBzdWJ0cmFjdGluZ1xuICAgKiBcIndlaWdodFwiIGZyb20gdGhlIHN1bSBpZiB0aGUgbm9kZSBoYXMgcG9kcyB3aGljaCBtYXRjaGVzIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybTsgdGhlXG4gICAqIG5vZGUocykgd2l0aCB0aGUgaGlnaGVzdCBzdW0gYXJlIHRoZSBtb3N0IHByZWZlcnJlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5I3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gICAqL1xuICByZWFkb25seSBwcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbltdO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgYW50aS1hZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgYXJlIG5vdCBtZXQgYXRcbiAgICogc2NoZWR1bGluZyB0aW1lLCB0aGUgcG9kIHdpbGwgbm90IGJlIHNjaGVkdWxlZCBvbnRvIHRoZSBub2RlLlxuICAgKiBJZiB0aGUgYW50aS1hZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gICAqIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHBvZCBleGVjdXRpb24gKGUuZy4gZHVlIHRvIGEgcG9kIGxhYmVsIHVwZGF0ZSksIHRoZVxuICAgKiBzeXN0ZW0gbWF5IG9yIG1heSBub3QgdHJ5IHRvIGV2ZW50dWFsbHkgZXZpY3QgdGhlIHBvZCBmcm9tIGl0cyBub2RlLlxuICAgKiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cywgdGhlIGxpc3RzIG9mIG5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaFxuICAgKiBwb2RBZmZpbml0eVRlcm0gYXJlIGludGVyc2VjdGVkLCBpLmUuIGFsbCB0ZXJtcyBtdXN0IGJlIHNhdGlzZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5I3JlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbltdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHkob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nOiBvYmoucHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24oeSkpLFxuICAgICdyZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbih5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBbiBlbXB0eSBwcmVmZXJyZWQgc2NoZWR1bGluZyB0ZXJtIG1hdGNoZXMgYWxsIG9iamVjdHMgd2l0aCBpbXBsaWNpdCB3ZWlnaHQgMFxuICogKGkuZS4gaXQncyBhIG5vLW9wKS4gQSBudWxsIHByZWZlcnJlZCBzY2hlZHVsaW5nIHRlcm0gbWF0Y2hlcyBubyBvYmplY3RzIChpLmUuIGlzIGFsc28gYSBuby1vcCkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogQSBub2RlIHNlbGVjdG9yIHRlcm0sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3ByZWZlcmVuY2VcbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcmVuY2U6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdlaWdodCBhc3NvY2lhdGVkIHdpdGggbWF0Y2hpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZVNlbGVjdG9yVGVybSwgaW4gdGhlIHJhbmdlIDEtMTAwLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiN3ZWlnaHRcbiAgICovXG4gIHJlYWRvbmx5IHdlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZmVyZW5jZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlKG9iai5wcmVmZXJlbmNlKSxcbiAgICAnd2VpZ2h0Jzogb2JqLndlaWdodCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgYXJlIG5vdCBtZXQgYXRcbiAqIHNjaGVkdWxpbmcgdGltZSwgdGhlIHBvZCB3aWxsIG5vdCBiZSBzY2hlZHVsZWQgb250byB0aGUgbm9kZS5cbiAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gKiBhdCBzb21lIHBvaW50IGR1cmluZyBwb2QgZXhlY3V0aW9uIChlLmcuIGR1ZSB0byBhbiB1cGRhdGUpLCB0aGUgc3lzdGVtXG4gKiBtYXkgb3IgbWF5IG5vdCB0cnkgdG8gZXZlbnR1YWxseSBldmljdCB0aGUgcG9kIGZyb20gaXRzIG5vZGUuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHtcbiAgLyoqXG4gICAqIFJlcXVpcmVkLiBBIGxpc3Qgb2Ygbm9kZSBzZWxlY3RvciB0ZXJtcy4gVGhlIHRlcm1zIGFyZSBPUmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI25vZGVTZWxlY3RvclRlcm1zXG4gICAqL1xuICByZWFkb25seSBub2RlU2VsZWN0b3JUZXJtczogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbm9kZVNlbGVjdG9yVGVybXMnOiBvYmoubm9kZVNlbGVjdG9yVGVybXM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRoZSB3ZWlnaHRzIG9mIGFsbCBvZiB0aGUgbWF0Y2hlZCBXZWlnaHRlZFBvZEFmZmluaXR5VGVybSBmaWVsZHMgYXJlIGFkZGVkIHBlci1ub2RlIHRvIGZpbmQgdGhlIG1vc3QgcHJlZmVycmVkIG5vZGUocylcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogUmVxdWlyZWQuIEEgcG9kIGFmZmluaXR5IHRlcm0sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jcG9kQWZmaW5pdHlUZXJtXG4gICAqL1xuICByZWFkb25seSBwb2RBZmZpbml0eVRlcm06IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtO1xuXG4gIC8qKlxuICAgKiB3ZWlnaHQgYXNzb2NpYXRlZCB3aXRoIG1hdGNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybSxcbiAgICogaW4gdGhlIHJhbmdlIDEtMTAwLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3dlaWdodFxuICAgKi9cbiAgcmVhZG9ubHkgd2VpZ2h0OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwb2RBZmZpbml0eVRlcm0nOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqLnBvZEFmZmluaXR5VGVybSksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIGEgc2V0IG9mIHBvZHMgKG5hbWVseSB0aG9zZSBtYXRjaGluZyB0aGUgbGFiZWxTZWxlY3RvclxuICogcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZShzKSkgdGhhdCB0aGlzIHBvZCBzaG91bGQgYmVcbiAqIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCxcbiAqIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZSB3aG9zZSB2YWx1ZSBvZlxuICogdGhlIGxhYmVsIHdpdGgga2V5IDx0b3BvbG9neUtleT4gbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoXG4gKiBhIHBvZCBvZiB0aGUgc2V0IG9mIHBvZHMgaXMgcnVubmluZ1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogQSBsYWJlbCBxdWVyeSBvdmVyIGEgc2V0IG9mIHJlc291cmNlcywgaW4gdGhpcyBjYXNlIHBvZHMuXG4gICAqIElmIGl0J3MgbnVsbCwgdGhpcyBQb2RBZmZpbml0eVRlcm0gbWF0Y2hlcyB3aXRoIG5vIFBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIE1hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1pc21hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IG5vdGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtaXNtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWlzbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBuYW1lc3BhY2VzIHNwZWNpZmllcyBhIHN0YXRpYyBsaXN0IG9mIG5hbWVzcGFjZSBuYW1lcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gICAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBzZWxlY3RlZCBieSBuYW1lc3BhY2VTZWxlY3Rvci5cbiAgICogbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgYW5kIG51bGwgbmFtZXNwYWNlU2VsZWN0b3IgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jdG9wb2xvZ3lLZXlcbiAgICovXG4gIHJlYWRvbmx5IHRvcG9sb2d5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsYWJlbFNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yKG9iai5sYWJlbFNlbGVjdG9yKSxcbiAgICAnbWF0Y2hMYWJlbEtleXMnOiBvYmoubWF0Y2hMYWJlbEtleXM/Lm1hcCh5ID0+IHkpLFxuICAgICdtaXNtYXRjaExhYmVsS2V5cyc6IG9iai5taXNtYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ25hbWVzcGFjZVNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRoZSB3ZWlnaHRzIG9mIGFsbCBvZiB0aGUgbWF0Y2hlZCBXZWlnaHRlZFBvZEFmZmluaXR5VGVybSBmaWVsZHMgYXJlIGFkZGVkIHBlci1ub2RlIHRvIGZpbmQgdGhlIG1vc3QgcHJlZmVycmVkIG5vZGUocylcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBSZXF1aXJlZC4gQSBwb2QgYWZmaW5pdHkgdGVybSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHdlaWdodC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jcG9kQWZmaW5pdHlUZXJtXG4gICAqL1xuICByZWFkb25seSBwb2RBZmZpbml0eVRlcm06IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybTtcblxuICAvKipcbiAgICogd2VpZ2h0IGFzc29jaWF0ZWQgd2l0aCBtYXRjaGluZyB0aGUgY29ycmVzcG9uZGluZyBwb2RBZmZpbml0eVRlcm0sXG4gICAqIGluIHRoZSByYW5nZSAxLTEwMC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jd2VpZ2h0XG4gICAqL1xuICByZWFkb25seSB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3BvZEFmZmluaXR5VGVybSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqLnBvZEFmZmluaXR5VGVybSksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIGEgc2V0IG9mIHBvZHMgKG5hbWVseSB0aG9zZSBtYXRjaGluZyB0aGUgbGFiZWxTZWxlY3RvclxuICogcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZShzKSkgdGhhdCB0aGlzIHBvZCBzaG91bGQgYmVcbiAqIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCxcbiAqIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZSB3aG9zZSB2YWx1ZSBvZlxuICogdGhlIGxhYmVsIHdpdGgga2V5IDx0b3BvbG9neUtleT4gbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoXG4gKiBhIHBvZCBvZiB0aGUgc2V0IG9mIHBvZHMgaXMgcnVubmluZ1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBNYXRjaExhYmVsS2V5cyBpcyBhIHNldCBvZiBwb2QgbGFiZWwga2V5cyB0byBzZWxlY3Qgd2hpY2ggcG9kcyB3aWxsXG4gICAqIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIGtleXMgYXJlIHVzZWQgdG8gbG9va3VwIHZhbHVlcyBmcm9tIHRoZVxuICAgKiBpbmNvbWluZyBwb2QgbGFiZWxzLCB0aG9zZSBrZXktdmFsdWUgbGFiZWxzIGFyZSBtZXJnZWQgd2l0aCBgbGFiZWxTZWxlY3RvcmAgYXMgYGtleSBpbiAodmFsdWUpYFxuICAgKiB0byBzZWxlY3QgdGhlIGdyb3VwIG9mIGV4aXN0aW5nIHBvZHMgd2hpY2ggcG9kcyB3aWxsIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgKiBmb3IgdGhlIGluY29taW5nIHBvZCdzIHBvZCAoYW50aSkgYWZmaW5pdHkuIEtleXMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgaW5jb21pbmdcbiAgICogcG9kIGxhYmVscyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBUaGUgc2FtZSBrZXkgaXMgZm9yYmlkZGVuIHRvIGV4aXN0IGluIGJvdGggbWF0Y2hMYWJlbEtleXMgYW5kIGxhYmVsU2VsZWN0b3IuXG4gICAqIEFsc28sIG1hdGNoTGFiZWxLZXlzIGNhbm5vdCBiZSBzZXQgd2hlbiBsYWJlbFNlbGVjdG9yIGlzbid0IHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI25hbWVzcGFjZVNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3RvcG9sb2d5S2V5XG4gICAqL1xuICByZWFkb25seSB0b3BvbG9neUtleTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbGFiZWxTZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbm9kZSBzZWxlY3RvciB0ZXJtLCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgd2VpZ2h0LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2Uge1xuICAvKipcbiAgICogQSBsaXN0IG9mIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnRzIGJ5IG5vZGUncyBsYWJlbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZU1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnRzIGJ5IG5vZGUncyBmaWVsZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSNtYXRjaEZpZWxkc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hGaWVsZHM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHNbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hGaWVsZHMnOiBvYmoubWF0Y2hGaWVsZHM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBudWxsIG9yIGVtcHR5IG5vZGUgc2VsZWN0b3IgdGVybSBtYXRjaGVzIG5vIG9iamVjdHMuIFRoZSByZXF1aXJlbWVudHMgb2ZcbiAqIHRoZW0gYXJlIEFORGVkLlxuICogVGhlIFRvcG9sb2d5U2VsZWN0b3JUZXJtIHR5cGUgaW1wbGVtZW50cyBhIHN1YnNldCBvZiB0aGUgTm9kZVNlbGVjdG9yVGVybS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50cyBieSBub2RlJ3MgbGFiZWxzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50cyBieSBub2RlJ3MgZmllbGRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMjbWF0Y2hGaWVsZHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRmllbGRzPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoRmllbGRzJzogb2JqLm1hdGNoRmllbGRzPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFJlcXVpcmVkLiBBIHBvZCBhZmZpbml0eSB0ZXJtLCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgd2VpZ2h0LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBNYXRjaExhYmVsS2V5cyBpcyBhIHNldCBvZiBwb2QgbGFiZWwga2V5cyB0byBzZWxlY3Qgd2hpY2ggcG9kcyB3aWxsXG4gICAqIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIGtleXMgYXJlIHVzZWQgdG8gbG9va3VwIHZhbHVlcyBmcm9tIHRoZVxuICAgKiBpbmNvbWluZyBwb2QgbGFiZWxzLCB0aG9zZSBrZXktdmFsdWUgbGFiZWxzIGFyZSBtZXJnZWQgd2l0aCBgbGFiZWxTZWxlY3RvcmAgYXMgYGtleSBpbiAodmFsdWUpYFxuICAgKiB0byBzZWxlY3QgdGhlIGdyb3VwIG9mIGV4aXN0aW5nIHBvZHMgd2hpY2ggcG9kcyB3aWxsIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgKiBmb3IgdGhlIGluY29taW5nIHBvZCdzIHBvZCAoYW50aSkgYWZmaW5pdHkuIEtleXMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgaW5jb21pbmdcbiAgICogcG9kIGxhYmVscyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBUaGUgc2FtZSBrZXkgaXMgZm9yYmlkZGVuIHRvIGV4aXN0IGluIGJvdGggbWF0Y2hMYWJlbEtleXMgYW5kIGxhYmVsU2VsZWN0b3IuXG4gICAqIEFsc28sIG1hdGNoTGFiZWxLZXlzIGNhbm5vdCBiZSBzZXQgd2hlbiBsYWJlbFNlbGVjdG9yIGlzbid0IHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI25hbWVzcGFjZVNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI3RvcG9sb2d5S2V5XG4gICAqL1xuICByZWFkb25seSB0b3BvbG9neUtleTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbGFiZWxTZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIG1hdGNoTGFiZWxzIGlzIGEgbWFwIG9mIHtrZXksdmFsdWV9IHBhaXJzLiBBIHNpbmdsZSB7a2V5LHZhbHVlfSBpbiB0aGUgbWF0Y2hMYWJlbHNcbiAgICogbWFwIGlzIGVxdWl2YWxlbnQgdG8gYW4gZWxlbWVudCBvZiBtYXRjaEV4cHJlc3Npb25zLCB3aG9zZSBrZXkgZmllbGQgaXMgXCJrZXlcIiwgdGhlXG4gICAqIG9wZXJhdG9yIGlzIFwiSW5cIiwgYW5kIHRoZSB2YWx1ZXMgYXJyYXkgY29udGFpbnMgb25seSBcInZhbHVlXCIuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIG1hdGNoTGFiZWxzIGlzIGEgbWFwIG9mIHtrZXksdmFsdWV9IHBhaXJzLiBBIHNpbmdsZSB7a2V5LHZhbHVlfSBpbiB0aGUgbWF0Y2hMYWJlbHNcbiAgICogbWFwIGlzIGVxdWl2YWxlbnQgdG8gYW4gZWxlbWVudCBvZiBtYXRjaEV4cHJlc3Npb25zLCB3aG9zZSBrZXkgZmllbGQgaXMgXCJrZXlcIiwgdGhlXG4gICAqIG9wZXJhdG9yIGlzIFwiSW5cIiwgYW5kIHRoZSB2YWx1ZXMgYXJyYXkgY29udGFpbnMgb25seSBcInZhbHVlXCIuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBSZXF1aXJlZC4gQSBwb2QgYWZmaW5pdHkgdGVybSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHdlaWdodC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbGFiZWxTZWxlY3RvclxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIE1hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI21pc21hdGNoTGFiZWxLZXlzXG4gICAqL1xuICByZWFkb25seSBtaXNtYXRjaExhYmVsS2V5cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgc2VsZWN0ZWQgYnkgdGhpcyBmaWVsZFxuICAgKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICAgKiBudWxsIHNlbGVjdG9yIGFuZCBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqIEFuIGVtcHR5IHNlbGVjdG9yICh7fSkgbWF0Y2hlcyBhbGwgbmFtZXNwYWNlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI25hbWVzcGFjZXNcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhpcyBwb2Qgc2hvdWxkIGJlIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCB0aGUgcG9kcyBtYXRjaGluZ1xuICAgKiB0aGUgbGFiZWxTZWxlY3RvciBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZXMsIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZVxuICAgKiB3aG9zZSB2YWx1ZSBvZiB0aGUgbGFiZWwgd2l0aCBrZXkgdG9wb2xvZ3lLZXkgbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoIGFueSBvZiB0aGVcbiAgICogc2VsZWN0ZWQgcG9kcyBpcyBydW5uaW5nLlxuICAgKiBFbXB0eSB0b3BvbG9neUtleSBpcyBub3QgYWxsb3dlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jdG9wb2xvZ3lLZXlcbiAgICovXG4gIHJlYWRvbmx5IHRvcG9sb2d5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsYWJlbFNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3Iob2JqLm5hbWVzcGFjZVNlbGVjdG9yKSxcbiAgICAnbmFtZXNwYWNlcyc6IG9iai5uYW1lc3BhY2VzPy5tYXAoeSA9PiB5KSxcbiAgICAndG9wb2xvZ3lLZXknOiBvYmoudG9wb2xvZ3lLZXksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAqIElmIGl0J3MgbnVsbCwgdGhpcyBQb2RBZmZpbml0eVRlcm0gbWF0Y2hlcyB3aXRoIG5vIFBvZHMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogbWF0Y2hMYWJlbHMgaXMgYSBtYXAgb2Yge2tleSx2YWx1ZX0gcGFpcnMuIEEgc2luZ2xlIHtrZXksdmFsdWV9IGluIHRoZSBtYXRjaExhYmVsc1xuICAgKiBtYXAgaXMgZXF1aXZhbGVudCB0byBhbiBlbGVtZW50IG9mIG1hdGNoRXhwcmVzc2lvbnMsIHdob3NlIGtleSBmaWVsZCBpcyBcImtleVwiLCB0aGVcbiAgICogb3BlcmF0b3IgaXMgXCJJblwiLCBhbmQgdGhlIHZhbHVlcyBhcnJheSBjb250YWlucyBvbmx5IFwidmFsdWVcIi4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgc2VsZWN0ZWQgYnkgdGhpcyBmaWVsZFxuICogYW5kIHRoZSBvbmVzIGxpc3RlZCBpbiB0aGUgbmFtZXNwYWNlcyBmaWVsZC5cbiAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAqIEFuIGVtcHR5IHNlbGVjdG9yICh7fSkgbWF0Y2hlcyBhbGwgbmFtZXNwYWNlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogbWF0Y2hMYWJlbHMgaXMgYSBtYXAgb2Yge2tleSx2YWx1ZX0gcGFpcnMuIEEgc2luZ2xlIHtrZXksdmFsdWV9IGluIHRoZSBtYXRjaExhYmVsc1xuICAgKiBtYXAgaXMgZXF1aXZhbGVudCB0byBhbiBlbGVtZW50IG9mIG1hdGNoRXhwcmVzc2lvbnMsIHdob3NlIGtleSBmaWVsZCBpcyBcImtleVwiLCB0aGVcbiAgICogb3BlcmF0b3IgaXMgXCJJblwiLCBhbmQgdGhlIHZhbHVlcyBhcnJheSBjb250YWlucyBvbmx5IFwidmFsdWVcIi4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3JcbiAqIHRoYXQgcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIFRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cywgRG9lc05vdEV4aXN0LiBHdCwgYW5kIEx0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBHdCBvciBMdCwgdGhlIHZhbHVlc1xuICAgKiBhcnJheSBtdXN0IGhhdmUgYSBzaW5nbGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyLlxuICAgKiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpYyBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3JcbiAqIHRoYXQgcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cywgRG9lc05vdEV4aXN0LiBHdCwgYW5kIEx0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gSWYgdGhlIG9wZXJhdG9yIGlzIEluIG9yIE5vdEluLFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzIG9yIERvZXNOb3RFeGlzdCxcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIGVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgR3Qgb3IgTHQsIHRoZSB2YWx1ZXNcbiAgICogYXJyYXkgbXVzdCBoYXZlIGEgc2luZ2xlIGVsZW1lbnQsIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlci5cbiAgICogVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWMgbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZU1hdGNoRmllbGRzI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvclxuICogdGhhdCByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzLCBEb2VzTm90RXhpc3QuIEd0LCBhbmQgTHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEd0IG9yIEx0LCB0aGUgdmFsdWVzXG4gICAqIGFycmF5IG11c3QgaGF2ZSBhIHNpbmdsZSBlbGVtZW50LCB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuIGludGVnZXIuXG4gICAqIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvclxuICogdGhhdCByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyB7XG4gIC8qKlxuICAgKiBUaGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzLCBEb2VzTm90RXhpc3QuIEd0LCBhbmQgTHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBHdCBvciBMdCwgdGhlIHZhbHVlc1xuICAgKiBhcnJheSBtdXN0IGhhdmUgYSBzaW5nbGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyLlxuICAgKiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpYyBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zTWF0Y2hGaWVsZHMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBtYXRjaEV4cHJlc3Npb25zIGlzIGEgbGlzdCBvZiBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudHMuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3IjbWF0Y2hMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3IgdGhhdFxuICogcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogb3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byBhIHNldCBvZiB2YWx1ZXMuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgSW4sIE5vdEluLCBFeGlzdHMgYW5kIERvZXNOb3RFeGlzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIGEgc2V0IG9mIHJlc291cmNlcywgaW4gdGhpcyBjYXNlIHBvZHMuXG4gKiBJZiBpdCdzIG51bGwsIHRoaXMgUG9kQWZmaW5pdHlUZXJtIG1hdGNoZXMgd2l0aCBubyBQb2RzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIHNlbGVjdGVkIGJ5IHRoaXMgZmllbGRcbiAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gKiBudWxsIHNlbGVjdG9yIGFuZCBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gKiBBbiBlbXB0eSBzZWxlY3RvciAoe30pIG1hdGNoZXMgYWxsIG5hbWVzcGFjZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2YWx1ZXMgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gSWYgdGhlIG9wZXJhdG9yIGlzIEluIG9yIE5vdEluLFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzIG9yIERvZXNOb3RFeGlzdCxcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIGVtcHR5LiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpY1xuICAgKiBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3IgdGhhdFxuICogcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogb3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byBhIHNldCBvZiB2YWx1ZXMuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgSW4sIE5vdEluLCBFeGlzdHMgYW5kIERvZXNOb3RFeGlzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuIl19