@bluedynamics/cdk8s-plone 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +109 -43
- package/API.md +49 -0
- package/README.md +19 -1
- package/lib/httpcache.js +1 -1
- package/lib/imports/monitoring.coreos.com.d.ts +2029 -0
- package/lib/imports/monitoring.coreos.com.js +1042 -0
- package/lib/plone.d.ts +26 -0
- package/lib/plone.js +53 -2
- package/lib/service.d.ts +6 -0
- package/lib/service.js +2 -1
- package/package.json +3 -1
|
@@ -0,0 +1,1042 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion = exports.ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion = exports.ServiceMonitorSpecEndpointsTlsConfigMinVersion = exports.ServiceMonitorSpecEndpointsTlsConfigMaxVersion = exports.ServiceMonitorSpecEndpointsRelabelingsAction = exports.ServiceMonitorSpecEndpointsMetricRelabelingsAction = exports.ServiceMonitorSpecEndpointsTargetPort = exports.ServiceMonitorSpecEndpointsScheme = exports.ServiceMonitorSpecServiceDiscoveryRole = exports.ServiceMonitorSpecSelectorMechanism = exports.ServiceMonitorSpecScrapeProtocols = exports.ServiceMonitorSpecNativeHistogramMinBucketFactor = exports.ServiceMonitorSpecFallbackScrapeProtocol = exports.ServiceMonitor = void 0;
|
|
4
|
+
exports.toJson_ServiceMonitorProps = toJson_ServiceMonitorProps;
|
|
5
|
+
exports.toJson_ServiceMonitorSpec = toJson_ServiceMonitorSpec;
|
|
6
|
+
exports.toJson_ServiceMonitorSpecAttachMetadata = toJson_ServiceMonitorSpecAttachMetadata;
|
|
7
|
+
exports.toJson_ServiceMonitorSpecEndpoints = toJson_ServiceMonitorSpecEndpoints;
|
|
8
|
+
exports.toJson_ServiceMonitorSpecNamespaceSelector = toJson_ServiceMonitorSpecNamespaceSelector;
|
|
9
|
+
exports.toJson_ServiceMonitorSpecSelector = toJson_ServiceMonitorSpecSelector;
|
|
10
|
+
exports.toJson_ServiceMonitorSpecEndpointsAuthorization = toJson_ServiceMonitorSpecEndpointsAuthorization;
|
|
11
|
+
exports.toJson_ServiceMonitorSpecEndpointsBasicAuth = toJson_ServiceMonitorSpecEndpointsBasicAuth;
|
|
12
|
+
exports.toJson_ServiceMonitorSpecEndpointsBearerTokenSecret = toJson_ServiceMonitorSpecEndpointsBearerTokenSecret;
|
|
13
|
+
exports.toJson_ServiceMonitorSpecEndpointsMetricRelabelings = toJson_ServiceMonitorSpecEndpointsMetricRelabelings;
|
|
14
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2 = toJson_ServiceMonitorSpecEndpointsOauth2;
|
|
15
|
+
exports.toJson_ServiceMonitorSpecEndpointsProxyConnectHeader = toJson_ServiceMonitorSpecEndpointsProxyConnectHeader;
|
|
16
|
+
exports.toJson_ServiceMonitorSpecEndpointsRelabelings = toJson_ServiceMonitorSpecEndpointsRelabelings;
|
|
17
|
+
exports.toJson_ServiceMonitorSpecEndpointsTlsConfig = toJson_ServiceMonitorSpecEndpointsTlsConfig;
|
|
18
|
+
exports.toJson_ServiceMonitorSpecSelectorMatchExpressions = toJson_ServiceMonitorSpecSelectorMatchExpressions;
|
|
19
|
+
exports.toJson_ServiceMonitorSpecEndpointsAuthorizationCredentials = toJson_ServiceMonitorSpecEndpointsAuthorizationCredentials;
|
|
20
|
+
exports.toJson_ServiceMonitorSpecEndpointsBasicAuthPassword = toJson_ServiceMonitorSpecEndpointsBasicAuthPassword;
|
|
21
|
+
exports.toJson_ServiceMonitorSpecEndpointsBasicAuthUsername = toJson_ServiceMonitorSpecEndpointsBasicAuthUsername;
|
|
22
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2ClientId = toJson_ServiceMonitorSpecEndpointsOauth2ClientId;
|
|
23
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2ClientSecret = toJson_ServiceMonitorSpecEndpointsOauth2ClientSecret;
|
|
24
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2ProxyConnectHeader = toJson_ServiceMonitorSpecEndpointsOauth2ProxyConnectHeader;
|
|
25
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfig = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfig;
|
|
26
|
+
exports.toJson_ServiceMonitorSpecEndpointsTlsConfigCa = toJson_ServiceMonitorSpecEndpointsTlsConfigCa;
|
|
27
|
+
exports.toJson_ServiceMonitorSpecEndpointsTlsConfigCert = toJson_ServiceMonitorSpecEndpointsTlsConfigCert;
|
|
28
|
+
exports.toJson_ServiceMonitorSpecEndpointsTlsConfigKeySecret = toJson_ServiceMonitorSpecEndpointsTlsConfigKeySecret;
|
|
29
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2ClientIdConfigMap = toJson_ServiceMonitorSpecEndpointsOauth2ClientIdConfigMap;
|
|
30
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2ClientIdSecret = toJson_ServiceMonitorSpecEndpointsOauth2ClientIdSecret;
|
|
31
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCa = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCa;
|
|
32
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCert = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCert;
|
|
33
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigKeySecret = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigKeySecret;
|
|
34
|
+
exports.toJson_ServiceMonitorSpecEndpointsTlsConfigCaConfigMap = toJson_ServiceMonitorSpecEndpointsTlsConfigCaConfigMap;
|
|
35
|
+
exports.toJson_ServiceMonitorSpecEndpointsTlsConfigCaSecret = toJson_ServiceMonitorSpecEndpointsTlsConfigCaSecret;
|
|
36
|
+
exports.toJson_ServiceMonitorSpecEndpointsTlsConfigCertConfigMap = toJson_ServiceMonitorSpecEndpointsTlsConfigCertConfigMap;
|
|
37
|
+
exports.toJson_ServiceMonitorSpecEndpointsTlsConfigCertSecret = toJson_ServiceMonitorSpecEndpointsTlsConfigCertSecret;
|
|
38
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaConfigMap = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaConfigMap;
|
|
39
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaSecret = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaSecret;
|
|
40
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertConfigMap = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertConfigMap;
|
|
41
|
+
exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertSecret = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertSecret;
|
|
42
|
+
// generated by cdk8s
|
|
43
|
+
const cdk8s_1 = require("cdk8s");
|
|
44
|
+
/**
|
|
45
|
+
* The `ServiceMonitor` custom resource definition (CRD) defines how `Prometheus` and `PrometheusAgent` can scrape metrics from a group of services.
|
|
46
|
+
Among other things, it allows to specify:
|
|
47
|
+
* The services to scrape via label selectors.
|
|
48
|
+
* The container ports to scrape.
|
|
49
|
+
* Authentication credentials to use.
|
|
50
|
+
* Target and metric relabeling.
|
|
51
|
+
|
|
52
|
+
`Prometheus` and `PrometheusAgent` objects select `ServiceMonitor` objects using label and namespace selectors.
|
|
53
|
+
*
|
|
54
|
+
* @schema ServiceMonitor
|
|
55
|
+
*/
|
|
56
|
+
class ServiceMonitor extends cdk8s_1.ApiObject {
|
|
57
|
+
/**
|
|
58
|
+
* Renders a Kubernetes manifest for "ServiceMonitor".
|
|
59
|
+
*
|
|
60
|
+
* This can be used to inline resource manifests inside other objects (e.g. as templates).
|
|
61
|
+
*
|
|
62
|
+
* @param props initialization props
|
|
63
|
+
*/
|
|
64
|
+
static manifest(props) {
|
|
65
|
+
return {
|
|
66
|
+
...ServiceMonitor.GVK,
|
|
67
|
+
...toJson_ServiceMonitorProps(props),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Defines a "ServiceMonitor" API object
|
|
72
|
+
* @param scope the scope in which to define this object
|
|
73
|
+
* @param id a scope-local name for the object
|
|
74
|
+
* @param props initialization props
|
|
75
|
+
*/
|
|
76
|
+
constructor(scope, id, props) {
|
|
77
|
+
super(scope, id, {
|
|
78
|
+
...ServiceMonitor.GVK,
|
|
79
|
+
...props,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Renders the object to Kubernetes JSON.
|
|
84
|
+
*/
|
|
85
|
+
toJson() {
|
|
86
|
+
const resolved = super.toJson();
|
|
87
|
+
return {
|
|
88
|
+
...ServiceMonitor.GVK,
|
|
89
|
+
...toJson_ServiceMonitorProps(resolved),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.ServiceMonitor = ServiceMonitor;
|
|
94
|
+
/**
|
|
95
|
+
* Returns the apiVersion and kind for "ServiceMonitor"
|
|
96
|
+
*/
|
|
97
|
+
ServiceMonitor.GVK = {
|
|
98
|
+
apiVersion: 'monitoring.coreos.com/v1',
|
|
99
|
+
kind: 'ServiceMonitor',
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Converts an object of type 'ServiceMonitorProps' to JSON representation.
|
|
103
|
+
*/
|
|
104
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
105
|
+
function toJson_ServiceMonitorProps(obj) {
|
|
106
|
+
if (obj === undefined) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
const result = {
|
|
110
|
+
'metadata': obj.metadata,
|
|
111
|
+
'spec': toJson_ServiceMonitorSpec(obj.spec),
|
|
112
|
+
};
|
|
113
|
+
// filter undefined values
|
|
114
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Converts an object of type 'ServiceMonitorSpec' to JSON representation.
|
|
118
|
+
*/
|
|
119
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
120
|
+
function toJson_ServiceMonitorSpec(obj) {
|
|
121
|
+
if (obj === undefined) {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
const result = {
|
|
125
|
+
'attachMetadata': toJson_ServiceMonitorSpecAttachMetadata(obj.attachMetadata),
|
|
126
|
+
'bodySizeLimit': obj.bodySizeLimit,
|
|
127
|
+
'convertClassicHistogramsToNHCB': obj.convertClassicHistogramsToNhcb,
|
|
128
|
+
'endpoints': obj.endpoints?.map(y => toJson_ServiceMonitorSpecEndpoints(y)),
|
|
129
|
+
'fallbackScrapeProtocol': obj.fallbackScrapeProtocol,
|
|
130
|
+
'jobLabel': obj.jobLabel,
|
|
131
|
+
'keepDroppedTargets': obj.keepDroppedTargets,
|
|
132
|
+
'labelLimit': obj.labelLimit,
|
|
133
|
+
'labelNameLengthLimit': obj.labelNameLengthLimit,
|
|
134
|
+
'labelValueLengthLimit': obj.labelValueLengthLimit,
|
|
135
|
+
'namespaceSelector': toJson_ServiceMonitorSpecNamespaceSelector(obj.namespaceSelector),
|
|
136
|
+
'nativeHistogramBucketLimit': obj.nativeHistogramBucketLimit,
|
|
137
|
+
'nativeHistogramMinBucketFactor': obj.nativeHistogramMinBucketFactor?.value,
|
|
138
|
+
'podTargetLabels': obj.podTargetLabels?.map(y => y),
|
|
139
|
+
'sampleLimit': obj.sampleLimit,
|
|
140
|
+
'scrapeClass': obj.scrapeClass,
|
|
141
|
+
'scrapeClassicHistograms': obj.scrapeClassicHistograms,
|
|
142
|
+
'scrapeProtocols': obj.scrapeProtocols?.map(y => y),
|
|
143
|
+
'selector': toJson_ServiceMonitorSpecSelector(obj.selector),
|
|
144
|
+
'selectorMechanism': obj.selectorMechanism,
|
|
145
|
+
'serviceDiscoveryRole': obj.serviceDiscoveryRole,
|
|
146
|
+
'targetLabels': obj.targetLabels?.map(y => y),
|
|
147
|
+
'targetLimit': obj.targetLimit,
|
|
148
|
+
};
|
|
149
|
+
// filter undefined values
|
|
150
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Converts an object of type 'ServiceMonitorSpecAttachMetadata' to JSON representation.
|
|
154
|
+
*/
|
|
155
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
156
|
+
function toJson_ServiceMonitorSpecAttachMetadata(obj) {
|
|
157
|
+
if (obj === undefined) {
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
const result = {
|
|
161
|
+
'node': obj.node,
|
|
162
|
+
};
|
|
163
|
+
// filter undefined values
|
|
164
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Converts an object of type 'ServiceMonitorSpecEndpoints' to JSON representation.
|
|
168
|
+
*/
|
|
169
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
170
|
+
function toJson_ServiceMonitorSpecEndpoints(obj) {
|
|
171
|
+
if (obj === undefined) {
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
const result = {
|
|
175
|
+
'authorization': toJson_ServiceMonitorSpecEndpointsAuthorization(obj.authorization),
|
|
176
|
+
'basicAuth': toJson_ServiceMonitorSpecEndpointsBasicAuth(obj.basicAuth),
|
|
177
|
+
'bearerTokenFile': obj.bearerTokenFile,
|
|
178
|
+
'bearerTokenSecret': toJson_ServiceMonitorSpecEndpointsBearerTokenSecret(obj.bearerTokenSecret),
|
|
179
|
+
'enableHttp2': obj.enableHttp2,
|
|
180
|
+
'filterRunning': obj.filterRunning,
|
|
181
|
+
'followRedirects': obj.followRedirects,
|
|
182
|
+
'honorLabels': obj.honorLabels,
|
|
183
|
+
'honorTimestamps': obj.honorTimestamps,
|
|
184
|
+
'interval': obj.interval,
|
|
185
|
+
'metricRelabelings': obj.metricRelabelings?.map(y => toJson_ServiceMonitorSpecEndpointsMetricRelabelings(y)),
|
|
186
|
+
'noProxy': obj.noProxy,
|
|
187
|
+
'oauth2': toJson_ServiceMonitorSpecEndpointsOauth2(obj.oauth2),
|
|
188
|
+
'params': ((obj.params) === undefined) ? undefined : (Object.entries(obj.params).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.map(y => y) }), {})),
|
|
189
|
+
'path': obj.path,
|
|
190
|
+
'port': obj.port,
|
|
191
|
+
'proxyConnectHeader': ((obj.proxyConnectHeader) === undefined) ? undefined : (Object.entries(obj.proxyConnectHeader).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.map(y => toJson_ServiceMonitorSpecEndpointsProxyConnectHeader(y)) }), {})),
|
|
192
|
+
'proxyFromEnvironment': obj.proxyFromEnvironment,
|
|
193
|
+
'proxyUrl': obj.proxyUrl,
|
|
194
|
+
'relabelings': obj.relabelings?.map(y => toJson_ServiceMonitorSpecEndpointsRelabelings(y)),
|
|
195
|
+
'scheme': obj.scheme,
|
|
196
|
+
'scrapeTimeout': obj.scrapeTimeout,
|
|
197
|
+
'targetPort': obj.targetPort?.value,
|
|
198
|
+
'tlsConfig': toJson_ServiceMonitorSpecEndpointsTlsConfig(obj.tlsConfig),
|
|
199
|
+
'trackTimestampsStaleness': obj.trackTimestampsStaleness,
|
|
200
|
+
};
|
|
201
|
+
// filter undefined values
|
|
202
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
203
|
+
}
|
|
204
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
205
|
+
/**
|
|
206
|
+
* fallbackScrapeProtocol defines the protocol to use if a scrape returns blank, unparseable, or otherwise invalid Content-Type.
|
|
207
|
+
*
|
|
208
|
+
* It requires Prometheus >= v3.0.0.
|
|
209
|
+
*
|
|
210
|
+
* @schema ServiceMonitorSpecFallbackScrapeProtocol
|
|
211
|
+
*/
|
|
212
|
+
var ServiceMonitorSpecFallbackScrapeProtocol;
|
|
213
|
+
(function (ServiceMonitorSpecFallbackScrapeProtocol) {
|
|
214
|
+
/** PrometheusProto */
|
|
215
|
+
ServiceMonitorSpecFallbackScrapeProtocol["PROMETHEUS_PROTO"] = "PrometheusProto";
|
|
216
|
+
/** OpenMetricsText0.0.1 */
|
|
217
|
+
ServiceMonitorSpecFallbackScrapeProtocol["OPEN_METRICS_TEXT0_0_1"] = "OpenMetricsText0.0.1";
|
|
218
|
+
/** OpenMetricsText1.0.0 */
|
|
219
|
+
ServiceMonitorSpecFallbackScrapeProtocol["OPEN_METRICS_TEXT1_0_0"] = "OpenMetricsText1.0.0";
|
|
220
|
+
/** PrometheusText0.0.4 */
|
|
221
|
+
ServiceMonitorSpecFallbackScrapeProtocol["PROMETHEUS_TEXT0_0_4"] = "PrometheusText0.0.4";
|
|
222
|
+
/** PrometheusText1.0.0 */
|
|
223
|
+
ServiceMonitorSpecFallbackScrapeProtocol["PROMETHEUS_TEXT1_0_0"] = "PrometheusText1.0.0";
|
|
224
|
+
})(ServiceMonitorSpecFallbackScrapeProtocol || (exports.ServiceMonitorSpecFallbackScrapeProtocol = ServiceMonitorSpecFallbackScrapeProtocol = {}));
|
|
225
|
+
/**
|
|
226
|
+
* Converts an object of type 'ServiceMonitorSpecNamespaceSelector' to JSON representation.
|
|
227
|
+
*/
|
|
228
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
229
|
+
function toJson_ServiceMonitorSpecNamespaceSelector(obj) {
|
|
230
|
+
if (obj === undefined) {
|
|
231
|
+
return undefined;
|
|
232
|
+
}
|
|
233
|
+
const result = {
|
|
234
|
+
'any': obj.any,
|
|
235
|
+
'matchNames': obj.matchNames?.map(y => y),
|
|
236
|
+
};
|
|
237
|
+
// filter undefined values
|
|
238
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
239
|
+
}
|
|
240
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
241
|
+
/**
|
|
242
|
+
* nativeHistogramMinBucketFactor defines if the growth factor of one bucket to the next is smaller than this,
|
|
243
|
+
* buckets will be merged to increase the factor sufficiently.
|
|
244
|
+
* It requires Prometheus >= v2.50.0.
|
|
245
|
+
*
|
|
246
|
+
* @schema ServiceMonitorSpecNativeHistogramMinBucketFactor
|
|
247
|
+
*/
|
|
248
|
+
class ServiceMonitorSpecNativeHistogramMinBucketFactor {
|
|
249
|
+
static fromNumber(value) {
|
|
250
|
+
return new ServiceMonitorSpecNativeHistogramMinBucketFactor(value);
|
|
251
|
+
}
|
|
252
|
+
static fromString(value) {
|
|
253
|
+
return new ServiceMonitorSpecNativeHistogramMinBucketFactor(value);
|
|
254
|
+
}
|
|
255
|
+
constructor(value) {
|
|
256
|
+
this.value = value;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
exports.ServiceMonitorSpecNativeHistogramMinBucketFactor = ServiceMonitorSpecNativeHistogramMinBucketFactor;
|
|
260
|
+
/**
|
|
261
|
+
* ScrapeProtocol represents a protocol used by Prometheus for scraping metrics.
|
|
262
|
+
* Supported values are:
|
|
263
|
+
* * `OpenMetricsText0.0.1`
|
|
264
|
+
* * `OpenMetricsText1.0.0`
|
|
265
|
+
* * `PrometheusProto`
|
|
266
|
+
* * `PrometheusText0.0.4`
|
|
267
|
+
* * `PrometheusText1.0.0`
|
|
268
|
+
*
|
|
269
|
+
* @schema ServiceMonitorSpecScrapeProtocols
|
|
270
|
+
*/
|
|
271
|
+
var ServiceMonitorSpecScrapeProtocols;
|
|
272
|
+
(function (ServiceMonitorSpecScrapeProtocols) {
|
|
273
|
+
/** PrometheusProto */
|
|
274
|
+
ServiceMonitorSpecScrapeProtocols["PROMETHEUS_PROTO"] = "PrometheusProto";
|
|
275
|
+
/** OpenMetricsText0.0.1 */
|
|
276
|
+
ServiceMonitorSpecScrapeProtocols["OPEN_METRICS_TEXT0_0_1"] = "OpenMetricsText0.0.1";
|
|
277
|
+
/** OpenMetricsText1.0.0 */
|
|
278
|
+
ServiceMonitorSpecScrapeProtocols["OPEN_METRICS_TEXT1_0_0"] = "OpenMetricsText1.0.0";
|
|
279
|
+
/** PrometheusText0.0.4 */
|
|
280
|
+
ServiceMonitorSpecScrapeProtocols["PROMETHEUS_TEXT0_0_4"] = "PrometheusText0.0.4";
|
|
281
|
+
/** PrometheusText1.0.0 */
|
|
282
|
+
ServiceMonitorSpecScrapeProtocols["PROMETHEUS_TEXT1_0_0"] = "PrometheusText1.0.0";
|
|
283
|
+
})(ServiceMonitorSpecScrapeProtocols || (exports.ServiceMonitorSpecScrapeProtocols = ServiceMonitorSpecScrapeProtocols = {}));
|
|
284
|
+
/**
|
|
285
|
+
* Converts an object of type 'ServiceMonitorSpecSelector' to JSON representation.
|
|
286
|
+
*/
|
|
287
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
288
|
+
function toJson_ServiceMonitorSpecSelector(obj) {
|
|
289
|
+
if (obj === undefined) {
|
|
290
|
+
return undefined;
|
|
291
|
+
}
|
|
292
|
+
const result = {
|
|
293
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_ServiceMonitorSpecSelectorMatchExpressions(y)),
|
|
294
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
295
|
+
};
|
|
296
|
+
// filter undefined values
|
|
297
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
298
|
+
}
|
|
299
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
300
|
+
/**
|
|
301
|
+
* selectorMechanism defines the mechanism used to select the endpoints to scrape.
|
|
302
|
+
* By default, the selection process relies on relabel configurations to filter the discovered targets.
|
|
303
|
+
* Alternatively, you can opt in for role selectors, which may offer better efficiency in large clusters.
|
|
304
|
+
* Which strategy is best for your use case needs to be carefully evaluated.
|
|
305
|
+
*
|
|
306
|
+
* It requires Prometheus >= v2.17.0.
|
|
307
|
+
*
|
|
308
|
+
* @schema ServiceMonitorSpecSelectorMechanism
|
|
309
|
+
*/
|
|
310
|
+
var ServiceMonitorSpecSelectorMechanism;
|
|
311
|
+
(function (ServiceMonitorSpecSelectorMechanism) {
|
|
312
|
+
/** RelabelConfig */
|
|
313
|
+
ServiceMonitorSpecSelectorMechanism["RELABEL_CONFIG"] = "RelabelConfig";
|
|
314
|
+
/** RoleSelector */
|
|
315
|
+
ServiceMonitorSpecSelectorMechanism["ROLE_SELECTOR"] = "RoleSelector";
|
|
316
|
+
})(ServiceMonitorSpecSelectorMechanism || (exports.ServiceMonitorSpecSelectorMechanism = ServiceMonitorSpecSelectorMechanism = {}));
|
|
317
|
+
/**
|
|
318
|
+
* serviceDiscoveryRole defines the service discovery role used to discover targets.
|
|
319
|
+
*
|
|
320
|
+
* If set, the value should be either "Endpoints" or "EndpointSlice".
|
|
321
|
+
* Otherwise it defaults to the value defined in the
|
|
322
|
+
* Prometheus/PrometheusAgent resource.
|
|
323
|
+
*
|
|
324
|
+
* @schema ServiceMonitorSpecServiceDiscoveryRole
|
|
325
|
+
*/
|
|
326
|
+
var ServiceMonitorSpecServiceDiscoveryRole;
|
|
327
|
+
(function (ServiceMonitorSpecServiceDiscoveryRole) {
|
|
328
|
+
/** Endpoints */
|
|
329
|
+
ServiceMonitorSpecServiceDiscoveryRole["ENDPOINTS"] = "Endpoints";
|
|
330
|
+
/** EndpointSlice */
|
|
331
|
+
ServiceMonitorSpecServiceDiscoveryRole["ENDPOINT_SLICE"] = "EndpointSlice";
|
|
332
|
+
})(ServiceMonitorSpecServiceDiscoveryRole || (exports.ServiceMonitorSpecServiceDiscoveryRole = ServiceMonitorSpecServiceDiscoveryRole = {}));
|
|
333
|
+
/**
|
|
334
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsAuthorization' to JSON representation.
|
|
335
|
+
*/
|
|
336
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
337
|
+
function toJson_ServiceMonitorSpecEndpointsAuthorization(obj) {
|
|
338
|
+
if (obj === undefined) {
|
|
339
|
+
return undefined;
|
|
340
|
+
}
|
|
341
|
+
const result = {
|
|
342
|
+
'credentials': toJson_ServiceMonitorSpecEndpointsAuthorizationCredentials(obj.credentials),
|
|
343
|
+
'type': obj.type,
|
|
344
|
+
};
|
|
345
|
+
// filter undefined values
|
|
346
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsBasicAuth' to JSON representation.
|
|
350
|
+
*/
|
|
351
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
352
|
+
function toJson_ServiceMonitorSpecEndpointsBasicAuth(obj) {
|
|
353
|
+
if (obj === undefined) {
|
|
354
|
+
return undefined;
|
|
355
|
+
}
|
|
356
|
+
const result = {
|
|
357
|
+
'password': toJson_ServiceMonitorSpecEndpointsBasicAuthPassword(obj.password),
|
|
358
|
+
'username': toJson_ServiceMonitorSpecEndpointsBasicAuthUsername(obj.username),
|
|
359
|
+
};
|
|
360
|
+
// filter undefined values
|
|
361
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsBearerTokenSecret' to JSON representation.
|
|
365
|
+
*/
|
|
366
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
367
|
+
function toJson_ServiceMonitorSpecEndpointsBearerTokenSecret(obj) {
|
|
368
|
+
if (obj === undefined) {
|
|
369
|
+
return undefined;
|
|
370
|
+
}
|
|
371
|
+
const result = {
|
|
372
|
+
'key': obj.key,
|
|
373
|
+
'name': obj.name,
|
|
374
|
+
'optional': obj.optional,
|
|
375
|
+
};
|
|
376
|
+
// filter undefined values
|
|
377
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsMetricRelabelings' to JSON representation.
|
|
381
|
+
*/
|
|
382
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
383
|
+
function toJson_ServiceMonitorSpecEndpointsMetricRelabelings(obj) {
|
|
384
|
+
if (obj === undefined) {
|
|
385
|
+
return undefined;
|
|
386
|
+
}
|
|
387
|
+
const result = {
|
|
388
|
+
'action': obj.action,
|
|
389
|
+
'modulus': obj.modulus,
|
|
390
|
+
'regex': obj.regex,
|
|
391
|
+
'replacement': obj.replacement,
|
|
392
|
+
'separator': obj.separator,
|
|
393
|
+
'sourceLabels': obj.sourceLabels?.map(y => y),
|
|
394
|
+
'targetLabel': obj.targetLabel,
|
|
395
|
+
};
|
|
396
|
+
// filter undefined values
|
|
397
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2' to JSON representation.
|
|
401
|
+
*/
|
|
402
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
403
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2(obj) {
|
|
404
|
+
if (obj === undefined) {
|
|
405
|
+
return undefined;
|
|
406
|
+
}
|
|
407
|
+
const result = {
|
|
408
|
+
'clientId': toJson_ServiceMonitorSpecEndpointsOauth2ClientId(obj.clientId),
|
|
409
|
+
'clientSecret': toJson_ServiceMonitorSpecEndpointsOauth2ClientSecret(obj.clientSecret),
|
|
410
|
+
'endpointParams': ((obj.endpointParams) === undefined) ? undefined : (Object.entries(obj.endpointParams).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
411
|
+
'noProxy': obj.noProxy,
|
|
412
|
+
'proxyConnectHeader': ((obj.proxyConnectHeader) === undefined) ? undefined : (Object.entries(obj.proxyConnectHeader).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.map(y => toJson_ServiceMonitorSpecEndpointsOauth2ProxyConnectHeader(y)) }), {})),
|
|
413
|
+
'proxyFromEnvironment': obj.proxyFromEnvironment,
|
|
414
|
+
'proxyUrl': obj.proxyUrl,
|
|
415
|
+
'scopes': obj.scopes?.map(y => y),
|
|
416
|
+
'tlsConfig': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfig(obj.tlsConfig),
|
|
417
|
+
'tokenUrl': obj.tokenUrl,
|
|
418
|
+
};
|
|
419
|
+
// filter undefined values
|
|
420
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsProxyConnectHeader' to JSON representation.
|
|
424
|
+
*/
|
|
425
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
426
|
+
function toJson_ServiceMonitorSpecEndpointsProxyConnectHeader(obj) {
|
|
427
|
+
if (obj === undefined) {
|
|
428
|
+
return undefined;
|
|
429
|
+
}
|
|
430
|
+
const result = {
|
|
431
|
+
'key': obj.key,
|
|
432
|
+
'name': obj.name,
|
|
433
|
+
'optional': obj.optional,
|
|
434
|
+
};
|
|
435
|
+
// filter undefined values
|
|
436
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsRelabelings' to JSON representation.
|
|
440
|
+
*/
|
|
441
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
442
|
+
function toJson_ServiceMonitorSpecEndpointsRelabelings(obj) {
|
|
443
|
+
if (obj === undefined) {
|
|
444
|
+
return undefined;
|
|
445
|
+
}
|
|
446
|
+
const result = {
|
|
447
|
+
'action': obj.action,
|
|
448
|
+
'modulus': obj.modulus,
|
|
449
|
+
'regex': obj.regex,
|
|
450
|
+
'replacement': obj.replacement,
|
|
451
|
+
'separator': obj.separator,
|
|
452
|
+
'sourceLabels': obj.sourceLabels?.map(y => y),
|
|
453
|
+
'targetLabel': obj.targetLabel,
|
|
454
|
+
};
|
|
455
|
+
// filter undefined values
|
|
456
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
457
|
+
}
|
|
458
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
459
|
+
/**
|
|
460
|
+
* scheme defines the HTTP scheme to use when scraping the metrics.
|
|
461
|
+
*
|
|
462
|
+
* @schema ServiceMonitorSpecEndpointsScheme
|
|
463
|
+
*/
|
|
464
|
+
var ServiceMonitorSpecEndpointsScheme;
|
|
465
|
+
(function (ServiceMonitorSpecEndpointsScheme) {
|
|
466
|
+
/** http */
|
|
467
|
+
ServiceMonitorSpecEndpointsScheme["HTTP"] = "http";
|
|
468
|
+
/** https */
|
|
469
|
+
ServiceMonitorSpecEndpointsScheme["HTTPS"] = "https";
|
|
470
|
+
})(ServiceMonitorSpecEndpointsScheme || (exports.ServiceMonitorSpecEndpointsScheme = ServiceMonitorSpecEndpointsScheme = {}));
|
|
471
|
+
/**
|
|
472
|
+
* targetPort defines the name or number of the target port of the `Pod` object behind the
|
|
473
|
+
* Service. The port must be specified with the container's port property.
|
|
474
|
+
*
|
|
475
|
+
* @schema ServiceMonitorSpecEndpointsTargetPort
|
|
476
|
+
*/
|
|
477
|
+
class ServiceMonitorSpecEndpointsTargetPort {
|
|
478
|
+
static fromNumber(value) {
|
|
479
|
+
return new ServiceMonitorSpecEndpointsTargetPort(value);
|
|
480
|
+
}
|
|
481
|
+
static fromString(value) {
|
|
482
|
+
return new ServiceMonitorSpecEndpointsTargetPort(value);
|
|
483
|
+
}
|
|
484
|
+
constructor(value) {
|
|
485
|
+
this.value = value;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
exports.ServiceMonitorSpecEndpointsTargetPort = ServiceMonitorSpecEndpointsTargetPort;
|
|
489
|
+
/**
|
|
490
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfig' to JSON representation.
|
|
491
|
+
*/
|
|
492
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
493
|
+
function toJson_ServiceMonitorSpecEndpointsTlsConfig(obj) {
|
|
494
|
+
if (obj === undefined) {
|
|
495
|
+
return undefined;
|
|
496
|
+
}
|
|
497
|
+
const result = {
|
|
498
|
+
'ca': toJson_ServiceMonitorSpecEndpointsTlsConfigCa(obj.ca),
|
|
499
|
+
'caFile': obj.caFile,
|
|
500
|
+
'cert': toJson_ServiceMonitorSpecEndpointsTlsConfigCert(obj.cert),
|
|
501
|
+
'certFile': obj.certFile,
|
|
502
|
+
'insecureSkipVerify': obj.insecureSkipVerify,
|
|
503
|
+
'keyFile': obj.keyFile,
|
|
504
|
+
'keySecret': toJson_ServiceMonitorSpecEndpointsTlsConfigKeySecret(obj.keySecret),
|
|
505
|
+
'maxVersion': obj.maxVersion,
|
|
506
|
+
'minVersion': obj.minVersion,
|
|
507
|
+
'serverName': obj.serverName,
|
|
508
|
+
};
|
|
509
|
+
// filter undefined values
|
|
510
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Converts an object of type 'ServiceMonitorSpecSelectorMatchExpressions' to JSON representation.
|
|
514
|
+
*/
|
|
515
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
516
|
+
function toJson_ServiceMonitorSpecSelectorMatchExpressions(obj) {
|
|
517
|
+
if (obj === undefined) {
|
|
518
|
+
return undefined;
|
|
519
|
+
}
|
|
520
|
+
const result = {
|
|
521
|
+
'key': obj.key,
|
|
522
|
+
'operator': obj.operator,
|
|
523
|
+
'values': obj.values?.map(y => y),
|
|
524
|
+
};
|
|
525
|
+
// filter undefined values
|
|
526
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsAuthorizationCredentials' to JSON representation.
|
|
530
|
+
*/
|
|
531
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
532
|
+
function toJson_ServiceMonitorSpecEndpointsAuthorizationCredentials(obj) {
|
|
533
|
+
if (obj === undefined) {
|
|
534
|
+
return undefined;
|
|
535
|
+
}
|
|
536
|
+
const result = {
|
|
537
|
+
'key': obj.key,
|
|
538
|
+
'name': obj.name,
|
|
539
|
+
'optional': obj.optional,
|
|
540
|
+
};
|
|
541
|
+
// filter undefined values
|
|
542
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsBasicAuthPassword' to JSON representation.
|
|
546
|
+
*/
|
|
547
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
548
|
+
function toJson_ServiceMonitorSpecEndpointsBasicAuthPassword(obj) {
|
|
549
|
+
if (obj === undefined) {
|
|
550
|
+
return undefined;
|
|
551
|
+
}
|
|
552
|
+
const result = {
|
|
553
|
+
'key': obj.key,
|
|
554
|
+
'name': obj.name,
|
|
555
|
+
'optional': obj.optional,
|
|
556
|
+
};
|
|
557
|
+
// filter undefined values
|
|
558
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsBasicAuthUsername' to JSON representation.
|
|
562
|
+
*/
|
|
563
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
564
|
+
function toJson_ServiceMonitorSpecEndpointsBasicAuthUsername(obj) {
|
|
565
|
+
if (obj === undefined) {
|
|
566
|
+
return undefined;
|
|
567
|
+
}
|
|
568
|
+
const result = {
|
|
569
|
+
'key': obj.key,
|
|
570
|
+
'name': obj.name,
|
|
571
|
+
'optional': obj.optional,
|
|
572
|
+
};
|
|
573
|
+
// filter undefined values
|
|
574
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
575
|
+
}
|
|
576
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
577
|
+
/**
|
|
578
|
+
* action to perform based on the regex matching.
|
|
579
|
+
*
|
|
580
|
+
* `Uppercase` and `Lowercase` actions require Prometheus >= v2.36.0.
|
|
581
|
+
* `DropEqual` and `KeepEqual` actions require Prometheus >= v2.41.0.
|
|
582
|
+
*
|
|
583
|
+
* Default: "Replace"
|
|
584
|
+
*
|
|
585
|
+
* @schema ServiceMonitorSpecEndpointsMetricRelabelingsAction
|
|
586
|
+
*/
|
|
587
|
+
var ServiceMonitorSpecEndpointsMetricRelabelingsAction;
|
|
588
|
+
(function (ServiceMonitorSpecEndpointsMetricRelabelingsAction) {
|
|
589
|
+
/** replace */
|
|
590
|
+
ServiceMonitorSpecEndpointsMetricRelabelingsAction["REPLACE"] = "replace";
|
|
591
|
+
/** keep */
|
|
592
|
+
ServiceMonitorSpecEndpointsMetricRelabelingsAction["KEEP"] = "keep";
|
|
593
|
+
/** drop */
|
|
594
|
+
ServiceMonitorSpecEndpointsMetricRelabelingsAction["DROP"] = "drop";
|
|
595
|
+
/** hashmod */
|
|
596
|
+
ServiceMonitorSpecEndpointsMetricRelabelingsAction["HASHMOD"] = "hashmod";
|
|
597
|
+
/** labelmap */
|
|
598
|
+
ServiceMonitorSpecEndpointsMetricRelabelingsAction["LABELMAP"] = "labelmap";
|
|
599
|
+
/** labeldrop */
|
|
600
|
+
ServiceMonitorSpecEndpointsMetricRelabelingsAction["LABELDROP"] = "labeldrop";
|
|
601
|
+
/** labelkeep */
|
|
602
|
+
ServiceMonitorSpecEndpointsMetricRelabelingsAction["LABELKEEP"] = "labelkeep";
|
|
603
|
+
/** lowercase */
|
|
604
|
+
ServiceMonitorSpecEndpointsMetricRelabelingsAction["LOWERCASE"] = "lowercase";
|
|
605
|
+
/** uppercase */
|
|
606
|
+
ServiceMonitorSpecEndpointsMetricRelabelingsAction["UPPERCASE"] = "uppercase";
|
|
607
|
+
/** keepequal */
|
|
608
|
+
ServiceMonitorSpecEndpointsMetricRelabelingsAction["KEEPEQUAL"] = "keepequal";
|
|
609
|
+
/** dropequal */
|
|
610
|
+
ServiceMonitorSpecEndpointsMetricRelabelingsAction["DROPEQUAL"] = "dropequal";
|
|
611
|
+
})(ServiceMonitorSpecEndpointsMetricRelabelingsAction || (exports.ServiceMonitorSpecEndpointsMetricRelabelingsAction = ServiceMonitorSpecEndpointsMetricRelabelingsAction = {}));
|
|
612
|
+
/**
|
|
613
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2ClientId' to JSON representation.
|
|
614
|
+
*/
|
|
615
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
616
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2ClientId(obj) {
|
|
617
|
+
if (obj === undefined) {
|
|
618
|
+
return undefined;
|
|
619
|
+
}
|
|
620
|
+
const result = {
|
|
621
|
+
'configMap': toJson_ServiceMonitorSpecEndpointsOauth2ClientIdConfigMap(obj.configMap),
|
|
622
|
+
'secret': toJson_ServiceMonitorSpecEndpointsOauth2ClientIdSecret(obj.secret),
|
|
623
|
+
};
|
|
624
|
+
// filter undefined values
|
|
625
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2ClientSecret' to JSON representation.
|
|
629
|
+
*/
|
|
630
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
631
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2ClientSecret(obj) {
|
|
632
|
+
if (obj === undefined) {
|
|
633
|
+
return undefined;
|
|
634
|
+
}
|
|
635
|
+
const result = {
|
|
636
|
+
'key': obj.key,
|
|
637
|
+
'name': obj.name,
|
|
638
|
+
'optional': obj.optional,
|
|
639
|
+
};
|
|
640
|
+
// filter undefined values
|
|
641
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
642
|
+
}
|
|
643
|
+
/**
|
|
644
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2ProxyConnectHeader' to JSON representation.
|
|
645
|
+
*/
|
|
646
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
647
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2ProxyConnectHeader(obj) {
|
|
648
|
+
if (obj === undefined) {
|
|
649
|
+
return undefined;
|
|
650
|
+
}
|
|
651
|
+
const result = {
|
|
652
|
+
'key': obj.key,
|
|
653
|
+
'name': obj.name,
|
|
654
|
+
'optional': obj.optional,
|
|
655
|
+
};
|
|
656
|
+
// filter undefined values
|
|
657
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
658
|
+
}
|
|
659
|
+
/**
|
|
660
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfig' to JSON representation.
|
|
661
|
+
*/
|
|
662
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
663
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfig(obj) {
|
|
664
|
+
if (obj === undefined) {
|
|
665
|
+
return undefined;
|
|
666
|
+
}
|
|
667
|
+
const result = {
|
|
668
|
+
'ca': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCa(obj.ca),
|
|
669
|
+
'cert': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCert(obj.cert),
|
|
670
|
+
'insecureSkipVerify': obj.insecureSkipVerify,
|
|
671
|
+
'keySecret': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigKeySecret(obj.keySecret),
|
|
672
|
+
'maxVersion': obj.maxVersion,
|
|
673
|
+
'minVersion': obj.minVersion,
|
|
674
|
+
'serverName': obj.serverName,
|
|
675
|
+
};
|
|
676
|
+
// filter undefined values
|
|
677
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
678
|
+
}
|
|
679
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
680
|
+
/**
|
|
681
|
+
* action to perform based on the regex matching.
|
|
682
|
+
*
|
|
683
|
+
* `Uppercase` and `Lowercase` actions require Prometheus >= v2.36.0.
|
|
684
|
+
* `DropEqual` and `KeepEqual` actions require Prometheus >= v2.41.0.
|
|
685
|
+
*
|
|
686
|
+
* Default: "Replace"
|
|
687
|
+
*
|
|
688
|
+
* @schema ServiceMonitorSpecEndpointsRelabelingsAction
|
|
689
|
+
*/
|
|
690
|
+
var ServiceMonitorSpecEndpointsRelabelingsAction;
|
|
691
|
+
(function (ServiceMonitorSpecEndpointsRelabelingsAction) {
|
|
692
|
+
/** replace */
|
|
693
|
+
ServiceMonitorSpecEndpointsRelabelingsAction["REPLACE"] = "replace";
|
|
694
|
+
/** keep */
|
|
695
|
+
ServiceMonitorSpecEndpointsRelabelingsAction["KEEP"] = "keep";
|
|
696
|
+
/** drop */
|
|
697
|
+
ServiceMonitorSpecEndpointsRelabelingsAction["DROP"] = "drop";
|
|
698
|
+
/** hashmod */
|
|
699
|
+
ServiceMonitorSpecEndpointsRelabelingsAction["HASHMOD"] = "hashmod";
|
|
700
|
+
/** labelmap */
|
|
701
|
+
ServiceMonitorSpecEndpointsRelabelingsAction["LABELMAP"] = "labelmap";
|
|
702
|
+
/** labeldrop */
|
|
703
|
+
ServiceMonitorSpecEndpointsRelabelingsAction["LABELDROP"] = "labeldrop";
|
|
704
|
+
/** labelkeep */
|
|
705
|
+
ServiceMonitorSpecEndpointsRelabelingsAction["LABELKEEP"] = "labelkeep";
|
|
706
|
+
/** lowercase */
|
|
707
|
+
ServiceMonitorSpecEndpointsRelabelingsAction["LOWERCASE"] = "lowercase";
|
|
708
|
+
/** uppercase */
|
|
709
|
+
ServiceMonitorSpecEndpointsRelabelingsAction["UPPERCASE"] = "uppercase";
|
|
710
|
+
/** keepequal */
|
|
711
|
+
ServiceMonitorSpecEndpointsRelabelingsAction["KEEPEQUAL"] = "keepequal";
|
|
712
|
+
/** dropequal */
|
|
713
|
+
ServiceMonitorSpecEndpointsRelabelingsAction["DROPEQUAL"] = "dropequal";
|
|
714
|
+
})(ServiceMonitorSpecEndpointsRelabelingsAction || (exports.ServiceMonitorSpecEndpointsRelabelingsAction = ServiceMonitorSpecEndpointsRelabelingsAction = {}));
|
|
715
|
+
/**
|
|
716
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigCa' to JSON representation.
|
|
717
|
+
*/
|
|
718
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
719
|
+
function toJson_ServiceMonitorSpecEndpointsTlsConfigCa(obj) {
|
|
720
|
+
if (obj === undefined) {
|
|
721
|
+
return undefined;
|
|
722
|
+
}
|
|
723
|
+
const result = {
|
|
724
|
+
'configMap': toJson_ServiceMonitorSpecEndpointsTlsConfigCaConfigMap(obj.configMap),
|
|
725
|
+
'secret': toJson_ServiceMonitorSpecEndpointsTlsConfigCaSecret(obj.secret),
|
|
726
|
+
};
|
|
727
|
+
// filter undefined values
|
|
728
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
729
|
+
}
|
|
730
|
+
/**
|
|
731
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigCert' to JSON representation.
|
|
732
|
+
*/
|
|
733
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
734
|
+
function toJson_ServiceMonitorSpecEndpointsTlsConfigCert(obj) {
|
|
735
|
+
if (obj === undefined) {
|
|
736
|
+
return undefined;
|
|
737
|
+
}
|
|
738
|
+
const result = {
|
|
739
|
+
'configMap': toJson_ServiceMonitorSpecEndpointsTlsConfigCertConfigMap(obj.configMap),
|
|
740
|
+
'secret': toJson_ServiceMonitorSpecEndpointsTlsConfigCertSecret(obj.secret),
|
|
741
|
+
};
|
|
742
|
+
// filter undefined values
|
|
743
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
744
|
+
}
|
|
745
|
+
/**
|
|
746
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigKeySecret' to JSON representation.
|
|
747
|
+
*/
|
|
748
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
749
|
+
function toJson_ServiceMonitorSpecEndpointsTlsConfigKeySecret(obj) {
|
|
750
|
+
if (obj === undefined) {
|
|
751
|
+
return undefined;
|
|
752
|
+
}
|
|
753
|
+
const result = {
|
|
754
|
+
'key': obj.key,
|
|
755
|
+
'name': obj.name,
|
|
756
|
+
'optional': obj.optional,
|
|
757
|
+
};
|
|
758
|
+
// filter undefined values
|
|
759
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
760
|
+
}
|
|
761
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
762
|
+
/**
|
|
763
|
+
* maxVersion defines the maximum acceptable TLS version.
|
|
764
|
+
*
|
|
765
|
+
* It requires Prometheus >= v2.41.0 or Thanos >= v0.31.0.
|
|
766
|
+
*
|
|
767
|
+
* @schema ServiceMonitorSpecEndpointsTlsConfigMaxVersion
|
|
768
|
+
*/
|
|
769
|
+
var ServiceMonitorSpecEndpointsTlsConfigMaxVersion;
|
|
770
|
+
(function (ServiceMonitorSpecEndpointsTlsConfigMaxVersion) {
|
|
771
|
+
/** TLS10 */
|
|
772
|
+
ServiceMonitorSpecEndpointsTlsConfigMaxVersion["TLS10"] = "TLS10";
|
|
773
|
+
/** TLS11 */
|
|
774
|
+
ServiceMonitorSpecEndpointsTlsConfigMaxVersion["TLS11"] = "TLS11";
|
|
775
|
+
/** TLS12 */
|
|
776
|
+
ServiceMonitorSpecEndpointsTlsConfigMaxVersion["TLS12"] = "TLS12";
|
|
777
|
+
/** TLS13 */
|
|
778
|
+
ServiceMonitorSpecEndpointsTlsConfigMaxVersion["TLS13"] = "TLS13";
|
|
779
|
+
})(ServiceMonitorSpecEndpointsTlsConfigMaxVersion || (exports.ServiceMonitorSpecEndpointsTlsConfigMaxVersion = ServiceMonitorSpecEndpointsTlsConfigMaxVersion = {}));
|
|
780
|
+
/**
|
|
781
|
+
* minVersion defines the minimum acceptable TLS version.
|
|
782
|
+
*
|
|
783
|
+
* It requires Prometheus >= v2.35.0 or Thanos >= v0.28.0.
|
|
784
|
+
*
|
|
785
|
+
* @schema ServiceMonitorSpecEndpointsTlsConfigMinVersion
|
|
786
|
+
*/
|
|
787
|
+
var ServiceMonitorSpecEndpointsTlsConfigMinVersion;
|
|
788
|
+
(function (ServiceMonitorSpecEndpointsTlsConfigMinVersion) {
|
|
789
|
+
/** TLS10 */
|
|
790
|
+
ServiceMonitorSpecEndpointsTlsConfigMinVersion["TLS10"] = "TLS10";
|
|
791
|
+
/** TLS11 */
|
|
792
|
+
ServiceMonitorSpecEndpointsTlsConfigMinVersion["TLS11"] = "TLS11";
|
|
793
|
+
/** TLS12 */
|
|
794
|
+
ServiceMonitorSpecEndpointsTlsConfigMinVersion["TLS12"] = "TLS12";
|
|
795
|
+
/** TLS13 */
|
|
796
|
+
ServiceMonitorSpecEndpointsTlsConfigMinVersion["TLS13"] = "TLS13";
|
|
797
|
+
})(ServiceMonitorSpecEndpointsTlsConfigMinVersion || (exports.ServiceMonitorSpecEndpointsTlsConfigMinVersion = ServiceMonitorSpecEndpointsTlsConfigMinVersion = {}));
|
|
798
|
+
/**
|
|
799
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2ClientIdConfigMap' to JSON representation.
|
|
800
|
+
*/
|
|
801
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
802
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2ClientIdConfigMap(obj) {
|
|
803
|
+
if (obj === undefined) {
|
|
804
|
+
return undefined;
|
|
805
|
+
}
|
|
806
|
+
const result = {
|
|
807
|
+
'key': obj.key,
|
|
808
|
+
'name': obj.name,
|
|
809
|
+
'optional': obj.optional,
|
|
810
|
+
};
|
|
811
|
+
// filter undefined values
|
|
812
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
813
|
+
}
|
|
814
|
+
/**
|
|
815
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2ClientIdSecret' to JSON representation.
|
|
816
|
+
*/
|
|
817
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
818
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2ClientIdSecret(obj) {
|
|
819
|
+
if (obj === undefined) {
|
|
820
|
+
return undefined;
|
|
821
|
+
}
|
|
822
|
+
const result = {
|
|
823
|
+
'key': obj.key,
|
|
824
|
+
'name': obj.name,
|
|
825
|
+
'optional': obj.optional,
|
|
826
|
+
};
|
|
827
|
+
// filter undefined values
|
|
828
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
829
|
+
}
|
|
830
|
+
/**
|
|
831
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigCa' to JSON representation.
|
|
832
|
+
*/
|
|
833
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
834
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCa(obj) {
|
|
835
|
+
if (obj === undefined) {
|
|
836
|
+
return undefined;
|
|
837
|
+
}
|
|
838
|
+
const result = {
|
|
839
|
+
'configMap': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaConfigMap(obj.configMap),
|
|
840
|
+
'secret': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaSecret(obj.secret),
|
|
841
|
+
};
|
|
842
|
+
// filter undefined values
|
|
843
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
844
|
+
}
|
|
845
|
+
/**
|
|
846
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigCert' to JSON representation.
|
|
847
|
+
*/
|
|
848
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
849
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCert(obj) {
|
|
850
|
+
if (obj === undefined) {
|
|
851
|
+
return undefined;
|
|
852
|
+
}
|
|
853
|
+
const result = {
|
|
854
|
+
'configMap': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertConfigMap(obj.configMap),
|
|
855
|
+
'secret': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertSecret(obj.secret),
|
|
856
|
+
};
|
|
857
|
+
// filter undefined values
|
|
858
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
859
|
+
}
|
|
860
|
+
/**
|
|
861
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigKeySecret' to JSON representation.
|
|
862
|
+
*/
|
|
863
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
864
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigKeySecret(obj) {
|
|
865
|
+
if (obj === undefined) {
|
|
866
|
+
return undefined;
|
|
867
|
+
}
|
|
868
|
+
const result = {
|
|
869
|
+
'key': obj.key,
|
|
870
|
+
'name': obj.name,
|
|
871
|
+
'optional': obj.optional,
|
|
872
|
+
};
|
|
873
|
+
// filter undefined values
|
|
874
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
875
|
+
}
|
|
876
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
877
|
+
/**
|
|
878
|
+
* maxVersion defines the maximum acceptable TLS version.
|
|
879
|
+
*
|
|
880
|
+
* It requires Prometheus >= v2.41.0 or Thanos >= v0.31.0.
|
|
881
|
+
*
|
|
882
|
+
* @schema ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion
|
|
883
|
+
*/
|
|
884
|
+
var ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion;
|
|
885
|
+
(function (ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion) {
|
|
886
|
+
/** TLS10 */
|
|
887
|
+
ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion["TLS10"] = "TLS10";
|
|
888
|
+
/** TLS11 */
|
|
889
|
+
ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion["TLS11"] = "TLS11";
|
|
890
|
+
/** TLS12 */
|
|
891
|
+
ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion["TLS12"] = "TLS12";
|
|
892
|
+
/** TLS13 */
|
|
893
|
+
ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion["TLS13"] = "TLS13";
|
|
894
|
+
})(ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion || (exports.ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion = ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion = {}));
|
|
895
|
+
/**
|
|
896
|
+
* minVersion defines the minimum acceptable TLS version.
|
|
897
|
+
*
|
|
898
|
+
* It requires Prometheus >= v2.35.0 or Thanos >= v0.28.0.
|
|
899
|
+
*
|
|
900
|
+
* @schema ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion
|
|
901
|
+
*/
|
|
902
|
+
var ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion;
|
|
903
|
+
(function (ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion) {
|
|
904
|
+
/** TLS10 */
|
|
905
|
+
ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion["TLS10"] = "TLS10";
|
|
906
|
+
/** TLS11 */
|
|
907
|
+
ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion["TLS11"] = "TLS11";
|
|
908
|
+
/** TLS12 */
|
|
909
|
+
ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion["TLS12"] = "TLS12";
|
|
910
|
+
/** TLS13 */
|
|
911
|
+
ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion["TLS13"] = "TLS13";
|
|
912
|
+
})(ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion || (exports.ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion = ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion = {}));
|
|
913
|
+
/**
|
|
914
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigCaConfigMap' to JSON representation.
|
|
915
|
+
*/
|
|
916
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
917
|
+
function toJson_ServiceMonitorSpecEndpointsTlsConfigCaConfigMap(obj) {
|
|
918
|
+
if (obj === undefined) {
|
|
919
|
+
return undefined;
|
|
920
|
+
}
|
|
921
|
+
const result = {
|
|
922
|
+
'key': obj.key,
|
|
923
|
+
'name': obj.name,
|
|
924
|
+
'optional': obj.optional,
|
|
925
|
+
};
|
|
926
|
+
// filter undefined values
|
|
927
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
928
|
+
}
|
|
929
|
+
/**
|
|
930
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigCaSecret' to JSON representation.
|
|
931
|
+
*/
|
|
932
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
933
|
+
function toJson_ServiceMonitorSpecEndpointsTlsConfigCaSecret(obj) {
|
|
934
|
+
if (obj === undefined) {
|
|
935
|
+
return undefined;
|
|
936
|
+
}
|
|
937
|
+
const result = {
|
|
938
|
+
'key': obj.key,
|
|
939
|
+
'name': obj.name,
|
|
940
|
+
'optional': obj.optional,
|
|
941
|
+
};
|
|
942
|
+
// filter undefined values
|
|
943
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
944
|
+
}
|
|
945
|
+
/**
|
|
946
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigCertConfigMap' to JSON representation.
|
|
947
|
+
*/
|
|
948
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
949
|
+
function toJson_ServiceMonitorSpecEndpointsTlsConfigCertConfigMap(obj) {
|
|
950
|
+
if (obj === undefined) {
|
|
951
|
+
return undefined;
|
|
952
|
+
}
|
|
953
|
+
const result = {
|
|
954
|
+
'key': obj.key,
|
|
955
|
+
'name': obj.name,
|
|
956
|
+
'optional': obj.optional,
|
|
957
|
+
};
|
|
958
|
+
// filter undefined values
|
|
959
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
960
|
+
}
|
|
961
|
+
/**
|
|
962
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigCertSecret' to JSON representation.
|
|
963
|
+
*/
|
|
964
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
965
|
+
function toJson_ServiceMonitorSpecEndpointsTlsConfigCertSecret(obj) {
|
|
966
|
+
if (obj === undefined) {
|
|
967
|
+
return undefined;
|
|
968
|
+
}
|
|
969
|
+
const result = {
|
|
970
|
+
'key': obj.key,
|
|
971
|
+
'name': obj.name,
|
|
972
|
+
'optional': obj.optional,
|
|
973
|
+
};
|
|
974
|
+
// filter undefined values
|
|
975
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
976
|
+
}
|
|
977
|
+
/**
|
|
978
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigCaConfigMap' to JSON representation.
|
|
979
|
+
*/
|
|
980
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
981
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaConfigMap(obj) {
|
|
982
|
+
if (obj === undefined) {
|
|
983
|
+
return undefined;
|
|
984
|
+
}
|
|
985
|
+
const result = {
|
|
986
|
+
'key': obj.key,
|
|
987
|
+
'name': obj.name,
|
|
988
|
+
'optional': obj.optional,
|
|
989
|
+
};
|
|
990
|
+
// filter undefined values
|
|
991
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
992
|
+
}
|
|
993
|
+
/**
|
|
994
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigCaSecret' to JSON representation.
|
|
995
|
+
*/
|
|
996
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
997
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaSecret(obj) {
|
|
998
|
+
if (obj === undefined) {
|
|
999
|
+
return undefined;
|
|
1000
|
+
}
|
|
1001
|
+
const result = {
|
|
1002
|
+
'key': obj.key,
|
|
1003
|
+
'name': obj.name,
|
|
1004
|
+
'optional': obj.optional,
|
|
1005
|
+
};
|
|
1006
|
+
// filter undefined values
|
|
1007
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1008
|
+
}
|
|
1009
|
+
/**
|
|
1010
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigCertConfigMap' to JSON representation.
|
|
1011
|
+
*/
|
|
1012
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1013
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertConfigMap(obj) {
|
|
1014
|
+
if (obj === undefined) {
|
|
1015
|
+
return undefined;
|
|
1016
|
+
}
|
|
1017
|
+
const result = {
|
|
1018
|
+
'key': obj.key,
|
|
1019
|
+
'name': obj.name,
|
|
1020
|
+
'optional': obj.optional,
|
|
1021
|
+
};
|
|
1022
|
+
// filter undefined values
|
|
1023
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1024
|
+
}
|
|
1025
|
+
/**
|
|
1026
|
+
* Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigCertSecret' to JSON representation.
|
|
1027
|
+
*/
|
|
1028
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1029
|
+
function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertSecret(obj) {
|
|
1030
|
+
if (obj === undefined) {
|
|
1031
|
+
return undefined;
|
|
1032
|
+
}
|
|
1033
|
+
const result = {
|
|
1034
|
+
'key': obj.key,
|
|
1035
|
+
'name': obj.name,
|
|
1036
|
+
'optional': obj.optional,
|
|
1037
|
+
};
|
|
1038
|
+
// filter undefined values
|
|
1039
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1040
|
+
}
|
|
1041
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1042
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvcmluZy5jb3Jlb3MuY29tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydHMvbW9uaXRvcmluZy5jb3Jlb3MuY29tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlHQSxnRUFRQztBQXVPRCw4REE2QkM7QUE0QkQsMEZBT0M7QUFzUEQsZ0ZBK0JDO0FBa0RELGdHQVFDO0FBd0VELDhFQVFDO0FBb0VELDBHQVFDO0FBaUNELGtHQVFDO0FBMkNELGtIQVNDO0FBbUZELGtIQWFDO0FBcUdELDRGQWdCQztBQXVDRCxvSEFTQztBQW1GRCxzR0FhQztBQXFIRCxrR0FnQkM7QUF3Q0QsOEdBU0M7QUF1Q0QsZ0lBU0M7QUF3Q0Qsa0hBU0M7QUF3Q0Qsa0hBU0M7QUFnRUQsNEdBUUM7QUF3Q0Qsb0hBU0M7QUF1Q0QsZ0lBU0M7QUFvRUQsOEdBYUM7QUErREQsc0dBUUM7QUE0QkQsMEdBUUM7QUF1Q0Qsb0hBU0M7QUEyRUQsOEhBU0M7QUF1Q0Qsd0hBU0M7QUE0QkQsa0hBUUM7QUE0QkQsc0hBUUM7QUF1Q0QsZ0lBU0M7QUEyRUQsd0hBU0M7QUF1Q0Qsa0hBU0M7QUF1Q0QsNEhBU0M7QUF1Q0Qsc0hBU0M7QUF1Q0Qsb0lBU0M7QUF1Q0QsOEhBU0M7QUF1Q0Qsd0lBU0M7QUF1Q0Qsa0lBU0M7QUExckZELHFCQUFxQjtBQUNyQixpQ0FBdUU7QUFJdkU7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFhLGNBQWUsU0FBUSxpQkFBUztJQVMzQzs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQTBCO1FBQy9DLE9BQU87WUFDTCxHQUFHLGNBQWMsQ0FBQyxHQUFHO1lBQ3JCLEdBQUcsMEJBQTBCLENBQUMsS0FBSyxDQUFDO1NBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFtQixLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUs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QUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFDRCxvRkFBb0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZW5lcmF0ZWQgYnkgY2RrOHNcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBpT2JqZWN0TWV0YWRhdGEsIEdyb3VwVmVyc2lvbktpbmQgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuXG4vKipcbiAqIFRoZSBgU2VydmljZU1vbml0b3JgIGN1c3RvbSByZXNvdXJjZSBkZWZpbml0aW9uIChDUkQpIGRlZmluZXMgaG93IGBQcm9tZXRoZXVzYCBhbmQgYFByb21ldGhldXNBZ2VudGAgY2FuIHNjcmFwZSBtZXRyaWNzIGZyb20gYSBncm91cCBvZiBzZXJ2aWNlcy5cbkFtb25nIG90aGVyIHRoaW5ncywgaXQgYWxsb3dzIHRvIHNwZWNpZnk6XG4qIFRoZSBzZXJ2aWNlcyB0byBzY3JhcGUgdmlhIGxhYmVsIHNlbGVjdG9ycy5cbiogVGhlIGNvbnRhaW5lciBwb3J0cyB0byBzY3JhcGUuXG4qIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZS5cbiogVGFyZ2V0IGFuZCBtZXRyaWMgcmVsYWJlbGluZy5cblxuYFByb21ldGhldXNgIGFuZCBgUHJvbWV0aGV1c0FnZW50YCBvYmplY3RzIHNlbGVjdCBgU2VydmljZU1vbml0b3JgIG9iamVjdHMgdXNpbmcgbGFiZWwgYW5kIG5hbWVzcGFjZSBzZWxlY3RvcnMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclxuICovXG5leHBvcnQgY2xhc3MgU2VydmljZU1vbml0b3IgZXh0ZW5kcyBBcGlPYmplY3Qge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXBpVmVyc2lvbiBhbmQga2luZCBmb3IgXCJTZXJ2aWNlTW9uaXRvclwiXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdWSzogR3JvdXBWZXJzaW9uS2luZCA9IHtcbiAgICBhcGlWZXJzaW9uOiAnbW9uaXRvcmluZy5jb3Jlb3MuY29tL3YxJyxcbiAgICBraW5kOiAnU2VydmljZU1vbml0b3InLFxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYSBLdWJlcm5ldGVzIG1hbmlmZXN0IGZvciBcIlNlcnZpY2VNb25pdG9yXCIuXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW5saW5lIHJlc291cmNlIG1hbmlmZXN0cyBpbnNpZGUgb3RoZXIgb2JqZWN0cyAoZS5nLiBhcyB0ZW1wbGF0ZXMpLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgaW5pdGlhbGl6YXRpb24gcHJvcHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWFuaWZlc3QocHJvcHM6IFNlcnZpY2VNb25pdG9yUHJvcHMpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5TZXJ2aWNlTW9uaXRvci5HVkssXG4gICAgICAuLi50b0pzb25fU2VydmljZU1vbml0b3JQcm9wcyhwcm9wcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgXCJTZXJ2aWNlTW9uaXRvclwiIEFQSSBvYmplY3RcbiAgICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBvYmplY3RcbiAgICogQHBhcmFtIGlkIGEgc2NvcGUtbG9jYWwgbmFtZSBmb3IgdGhlIG9iamVjdFxuICAgKiBAcGFyYW0gcHJvcHMgaW5pdGlhbGl6YXRpb24gcHJvcHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2VydmljZU1vbml0b3JQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4uU2VydmljZU1vbml0b3IuR1ZLLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgb2JqZWN0IHRvIEt1YmVybmV0ZXMgSlNPTi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSB0b0pzb24oKTogYW55IHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHN1cGVyLnRvSnNvbigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLlNlcnZpY2VNb25pdG9yLkdWSyxcbiAgICAgIC4uLnRvSnNvbl9TZXJ2aWNlTW9uaXRvclByb3BzKHJlc29sdmVkKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVGhlIGBTZXJ2aWNlTW9uaXRvcmAgY3VzdG9tIHJlc291cmNlIGRlZmluaXRpb24gKENSRCkgZGVmaW5lcyBob3cgYFByb21ldGhldXNgIGFuZCBgUHJvbWV0aGV1c0FnZW50YCBjYW4gc2NyYXBlIG1ldHJpY3MgZnJvbSBhIGdyb3VwIG9mIHNlcnZpY2VzLlxuICogQW1vbmcgb3RoZXIgdGhpbmdzLCBpdCBhbGxvd3MgdG8gc3BlY2lmeTpcbiAqICogVGhlIHNlcnZpY2VzIHRvIHNjcmFwZSB2aWEgbGFiZWwgc2VsZWN0b3JzLlxuICogKiBUaGUgY29udGFpbmVyIHBvcnRzIHRvIHNjcmFwZS5cbiAqICogQXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgdG8gdXNlLlxuICogKiBUYXJnZXQgYW5kIG1ldHJpYyByZWxhYmVsaW5nLlxuICpcbiAqIGBQcm9tZXRoZXVzYCBhbmQgYFByb21ldGhldXNBZ2VudGAgb2JqZWN0cyBzZWxlY3QgYFNlcnZpY2VNb25pdG9yYCBvYmplY3RzIHVzaW5nIGxhYmVsIGFuZCBuYW1lc3BhY2Ugc2VsZWN0b3JzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclByb3BzIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3IjbWV0YWRhdGFcbiAgICovXG4gIHJlYWRvbmx5IG1ldGFkYXRhPzogQXBpT2JqZWN0TWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIHNwZWMgZGVmaW5lcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBkZXNpcmVkIFNlcnZpY2Ugc2VsZWN0aW9uIGZvciB0YXJnZXQgZGlzY292ZXJ5IGJ5XG4gICAqIFByb21ldGhldXMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3Ijc3BlY1xuICAgKi9cbiAgcmVhZG9ubHkgc3BlYzogU2VydmljZU1vbml0b3JTcGVjO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclByb3BzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yUHJvcHMob2JqOiBTZXJ2aWNlTW9uaXRvclByb3BzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWV0YWRhdGEnOiBvYmoubWV0YWRhdGEsXG4gICAgJ3NwZWMnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjKG9iai5zcGVjKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNwZWMgZGVmaW5lcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBkZXNpcmVkIFNlcnZpY2Ugc2VsZWN0aW9uIGZvciB0YXJnZXQgZGlzY292ZXJ5IGJ5XG4gKiBQcm9tZXRoZXVzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjIHtcbiAgLyoqXG4gICAqIGF0dGFjaE1ldGFkYXRhIGRlZmluZXMgYWRkaXRpb25hbCBtZXRhZGF0YSB3aGljaCBpcyBhZGRlZCB0byB0aGVcbiAgICogZGlzY292ZXJlZCB0YXJnZXRzLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjM3LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI2F0dGFjaE1ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBhdHRhY2hNZXRhZGF0YT86IFNlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBib2R5U2l6ZUxpbWl0IHdoZW4gZGVmaW5lZCwgYm9keVNpemVMaW1pdCBzcGVjaWZpZXMgYSBqb2IgbGV2ZWwgbGltaXQgb24gdGhlIHNpemVcbiAgICogb2YgdW5jb21wcmVzc2VkIHJlc3BvbnNlIGJvZHkgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGJ5IFByb21ldGhldXMuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMjguMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjYm9keVNpemVMaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgYm9keVNpemVMaW1pdD86IHN0cmluZztcblxuICAvKipcbiAgICogY29udmVydENsYXNzaWNIaXN0b2dyYW1zVG9OSENCIGRlZmluZXMgd2hldGhlciB0byBjb252ZXJ0IGFsbCBzY3JhcGVkIGNsYXNzaWMgaGlzdG9ncmFtcyBpbnRvIGEgbmF0aXZlIGhpc3RvZ3JhbSB3aXRoIGN1c3RvbSBidWNrZXRzLlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYzLjAuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjY29udmVydENsYXNzaWNIaXN0b2dyYW1zVG9OSENCXG4gICAqL1xuICByZWFkb25seSBjb252ZXJ0Q2xhc3NpY0hpc3RvZ3JhbXNUb05oY2I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBlbmRwb2ludHMgZGVmaW5lcyB0aGUgbGlzdCBvZiBlbmRwb2ludHMgcGFydCBvZiB0aGlzIFNlcnZpY2VNb25pdG9yLlxuICAgKiBEZWZpbmVzIGhvdyB0byBzY3JhcGUgbWV0cmljcyBmcm9tIEt1YmVybmV0ZXMgW0VuZHBvaW50c10oaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc2VydmljZXMtbmV0d29ya2luZy9zZXJ2aWNlLyNlbmRwb2ludHMpIG9iamVjdHMuXG4gICAqIEluIG1vc3QgY2FzZXMsIGFuIEVuZHBvaW50cyBvYmplY3QgaXMgYmFja2VkIGJ5IGEgS3ViZXJuZXRlcyBbU2VydmljZV0oaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc2VydmljZXMtbmV0d29ya2luZy9zZXJ2aWNlLykgb2JqZWN0IHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgbGFiZWxzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNlbmRwb2ludHNcbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50czogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzW107XG5cbiAgLyoqXG4gICAqIGZhbGxiYWNrU2NyYXBlUHJvdG9jb2wgZGVmaW5lcyB0aGUgcHJvdG9jb2wgdG8gdXNlIGlmIGEgc2NyYXBlIHJldHVybnMgYmxhbmssIHVucGFyc2VhYmxlLCBvciBvdGhlcndpc2UgaW52YWxpZCBDb250ZW50LVR5cGUuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjMuMC4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNmYWxsYmFja1NjcmFwZVByb3RvY29sXG4gICAqL1xuICByZWFkb25seSBmYWxsYmFja1NjcmFwZVByb3RvY29sPzogU2VydmljZU1vbml0b3JTcGVjRmFsbGJhY2tTY3JhcGVQcm90b2NvbDtcblxuICAvKipcbiAgICogam9iTGFiZWwgc2VsZWN0cyB0aGUgbGFiZWwgZnJvbSB0aGUgYXNzb2NpYXRlZCBLdWJlcm5ldGVzIGBTZXJ2aWNlYFxuICAgKiBvYmplY3Qgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBgam9iYCBsYWJlbCBmb3IgYWxsIG1ldHJpY3MuXG4gICAqXG4gICAqIEZvciBleGFtcGxlIGlmIGBqb2JMYWJlbGAgaXMgc2V0IHRvIGBmb29gIGFuZCB0aGUgS3ViZXJuZXRlcyBgU2VydmljZWBcbiAgICogb2JqZWN0IGlzIGxhYmVsZWQgd2l0aCBgZm9vOiBiYXJgLCB0aGVuIFByb21ldGhldXMgYWRkcyB0aGUgYGpvYj1cImJhclwiYFxuICAgKiBsYWJlbCB0byBhbGwgaW5nZXN0ZWQgbWV0cmljcy5cbiAgICpcbiAgICogSWYgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgZW1wdHkgb3IgaWYgdGhlIGxhYmVsIGRvZXNuJ3QgZXhpc3QgZm9yXG4gICAqIHRoZSBnaXZlbiBTZXJ2aWNlLCB0aGUgYGpvYmAgbGFiZWwgb2YgdGhlIG1ldHJpY3MgZGVmYXVsdHMgdG8gdGhlIG5hbWVcbiAgICogb2YgdGhlIGFzc29jaWF0ZWQgS3ViZXJuZXRlcyBgU2VydmljZWAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI2pvYkxhYmVsXG4gICAqL1xuICByZWFkb25seSBqb2JMYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICoga2VlcERyb3BwZWRUYXJnZXRzIGRlZmluZXMgdGhlIHBlci1zY3JhcGUgbGltaXQgb24gdGhlIG51bWJlciBvZiB0YXJnZXRzIGRyb3BwZWQgYnkgcmVsYWJlbGluZ1xuICAgKiB0aGF0IHdpbGwgYmUga2VwdCBpbiBtZW1vcnkuIDAgbWVhbnMgbm8gbGltaXQuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDcuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMja2VlcERyb3BwZWRUYXJnZXRzXG4gICAqL1xuICByZWFkb25seSBrZWVwRHJvcHBlZFRhcmdldHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIGxhYmVsTGltaXQgZGVmaW5lcyB0aGUgcGVyLXNjcmFwZSBsaW1pdCBvbiBudW1iZXIgb2YgbGFiZWxzIHRoYXQgd2lsbCBiZSBhY2NlcHRlZCBmb3IgYSBzYW1wbGUuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMjcuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjbGFiZWxMaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogbGFiZWxOYW1lTGVuZ3RoTGltaXQgZGVmaW5lcyB0aGUgcGVyLXNjcmFwZSBsaW1pdCBvbiBsZW5ndGggb2YgbGFiZWxzIG5hbWUgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGZvciBhIHNhbXBsZS5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4yNy4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNsYWJlbE5hbWVMZW5ndGhMaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxOYW1lTGVuZ3RoTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIGxhYmVsVmFsdWVMZW5ndGhMaW1pdCBkZWZpbmVzIHRoZSBwZXItc2NyYXBlIGxpbWl0IG9uIGxlbmd0aCBvZiBsYWJlbHMgdmFsdWUgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGZvciBhIHNhbXBsZS5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4yNy4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNsYWJlbFZhbHVlTGVuZ3RoTGltaXRcbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsVmFsdWVMZW5ndGhMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogbmFtZXNwYWNlU2VsZWN0b3IgZGVmaW5lcyBpbiB3aGljaCBuYW1lc3BhY2UocykgUHJvbWV0aGV1cyBzaG91bGQgZGlzY292ZXIgdGhlIHNlcnZpY2VzLlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgc2VydmljZXMgYXJlIGRpc2NvdmVyZWQgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSBgU2VydmljZU1vbml0b3JgIG9iamVjdCBidXQgaXQgaXMgcG9zc2libGUgdG8gc2VsZWN0IHBvZHMgYWNyb3NzIGRpZmZlcmVudC9hbGwgbmFtZXNwYWNlcy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hdGl2ZUhpc3RvZ3JhbUJ1Y2tldExpbWl0IGRlZmluZXMgZmYgdGhlcmUgYXJlIG1vcmUgdGhhbiB0aGlzIG1hbnkgYnVja2V0cyBpbiBhIG5hdGl2ZSBoaXN0b2dyYW0sXG4gICAqIGJ1Y2tldHMgd2lsbCBiZSBtZXJnZWQgdG8gc3RheSB3aXRoaW4gdGhlIGxpbWl0LlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQ1LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI25hdGl2ZUhpc3RvZ3JhbUJ1Y2tldExpbWl0XG4gICAqL1xuICByZWFkb25seSBuYXRpdmVIaXN0b2dyYW1CdWNrZXRMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogbmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yIGRlZmluZXMgaWYgdGhlIGdyb3d0aCBmYWN0b3Igb2Ygb25lIGJ1Y2tldCB0byB0aGUgbmV4dCBpcyBzbWFsbGVyIHRoYW4gdGhpcyxcbiAgICogYnVja2V0cyB3aWxsIGJlIG1lcmdlZCB0byBpbmNyZWFzZSB0aGUgZmFjdG9yIHN1ZmZpY2llbnRseS5cbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi41MC4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNuYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3Rvcj86IFNlcnZpY2VNb25pdG9yU3BlY05hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3RvcjtcblxuICAvKipcbiAgICogcG9kVGFyZ2V0TGFiZWxzIGRlZmluZXMgdGhlIGxhYmVscyB3aGljaCBhcmUgdHJhbnNmZXJyZWQgZnJvbSB0aGVcbiAgICogYXNzb2NpYXRlZCBLdWJlcm5ldGVzIGBQb2RgIG9iamVjdCBvbnRvIHRoZSBpbmdlc3RlZCBtZXRyaWNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNwb2RUYXJnZXRMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IHBvZFRhcmdldExhYmVscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBzYW1wbGVMaW1pdCBkZWZpbmVzIGEgcGVyLXNjcmFwZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHNjcmFwZWQgc2FtcGxlc1xuICAgKiB0aGF0IHdpbGwgYmUgYWNjZXB0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NhbXBsZUxpbWl0XG4gICAqL1xuICByZWFkb25seSBzYW1wbGVMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogc2NyYXBlQ2xhc3MgZGVmaW5lcyB0aGUgc2NyYXBlIGNsYXNzIHRvIGFwcGx5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNzY3JhcGVDbGFzc1xuICAgKi9cbiAgcmVhZG9ubHkgc2NyYXBlQ2xhc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNjcmFwZUNsYXNzaWNIaXN0b2dyYW1zIGRlZmluZXMgd2hldGhlciB0byBzY3JhcGUgYSBjbGFzc2ljIGhpc3RvZ3JhbSB0aGF0IGlzIGFsc28gZXhwb3NlZCBhcyBhIG5hdGl2ZSBoaXN0b2dyYW0uXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDUuMC5cbiAgICpcbiAgICogTm90aWNlOiBgc2NyYXBlQ2xhc3NpY0hpc3RvZ3JhbXNgIGNvcnJlc3BvbmRzIHRvIHRoZSBgYWx3YXlzX3NjcmFwZV9jbGFzc2ljX2hpc3RvZ3JhbXNgIGZpZWxkIGluIHRoZSBQcm9tZXRoZXVzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NjcmFwZUNsYXNzaWNIaXN0b2dyYW1zXG4gICAqL1xuICByZWFkb25seSBzY3JhcGVDbGFzc2ljSGlzdG9ncmFtcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHNjcmFwZVByb3RvY29scyBkZWZpbmVzIHRoZSBwcm90b2NvbHMgdG8gbmVnb3RpYXRlIGR1cmluZyBhIHNjcmFwZS4gSXQgdGVsbHMgY2xpZW50cyB0aGVcbiAgICogcHJvdG9jb2xzIHN1cHBvcnRlZCBieSBQcm9tZXRoZXVzIGluIG9yZGVyIG9mIHByZWZlcmVuY2UgKGZyb20gbW9zdCB0byBsZWFzdCBwcmVmZXJyZWQpLlxuICAgKlxuICAgKiBJZiB1bnNldCwgUHJvbWV0aGV1cyB1c2VzIGl0cyBkZWZhdWx0IHZhbHVlLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQ5LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NjcmFwZVByb3RvY29sc1xuICAgKi9cbiAgcmVhZG9ubHkgc2NyYXBlUHJvdG9jb2xzPzogU2VydmljZU1vbml0b3JTcGVjU2NyYXBlUHJvdG9jb2xzW107XG5cbiAgLyoqXG4gICAqIHNlbGVjdG9yIGRlZmluZXMgdGhlIGxhYmVsIHNlbGVjdG9yIHRvIHNlbGVjdCB0aGUgS3ViZXJuZXRlcyBgRW5kcG9pbnRzYCBvYmplY3RzIHRvIHNjcmFwZSBtZXRyaWNzIGZyb20uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBzZWxlY3RvcjogU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIHNlbGVjdG9yTWVjaGFuaXNtIGRlZmluZXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHNlbGVjdCB0aGUgZW5kcG9pbnRzIHRvIHNjcmFwZS5cbiAgICogQnkgZGVmYXVsdCwgdGhlIHNlbGVjdGlvbiBwcm9jZXNzIHJlbGllcyBvbiByZWxhYmVsIGNvbmZpZ3VyYXRpb25zIHRvIGZpbHRlciB0aGUgZGlzY292ZXJlZCB0YXJnZXRzLlxuICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIG9wdCBpbiBmb3Igcm9sZSBzZWxlY3RvcnMsIHdoaWNoIG1heSBvZmZlciBiZXR0ZXIgZWZmaWNpZW5jeSBpbiBsYXJnZSBjbHVzdGVycy5cbiAgICogV2hpY2ggc3RyYXRlZ3kgaXMgYmVzdCBmb3IgeW91ciB1c2UgY2FzZSBuZWVkcyB0byBiZSBjYXJlZnVsbHkgZXZhbHVhdGVkLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjE3LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NlbGVjdG9yTWVjaGFuaXNtXG4gICAqL1xuICByZWFkb25seSBzZWxlY3Rvck1lY2hhbmlzbT86IFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWVjaGFuaXNtO1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlRGlzY292ZXJ5Um9sZSBkZWZpbmVzIHRoZSBzZXJ2aWNlIGRpc2NvdmVyeSByb2xlIHVzZWQgdG8gZGlzY292ZXIgdGFyZ2V0cy5cbiAgICpcbiAgICogSWYgc2V0LCB0aGUgdmFsdWUgc2hvdWxkIGJlIGVpdGhlciBcIkVuZHBvaW50c1wiIG9yIFwiRW5kcG9pbnRTbGljZVwiLlxuICAgKiBPdGhlcndpc2UgaXQgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIGRlZmluZWQgaW4gdGhlXG4gICAqIFByb21ldGhldXMvUHJvbWV0aGV1c0FnZW50IHJlc291cmNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNzZXJ2aWNlRGlzY292ZXJ5Um9sZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZURpc2NvdmVyeVJvbGU/OiBTZXJ2aWNlTW9uaXRvclNwZWNTZXJ2aWNlRGlzY292ZXJ5Um9sZTtcblxuICAvKipcbiAgICogdGFyZ2V0TGFiZWxzIGRlZmluZXMgdGhlIGxhYmVscyB3aGljaCBhcmUgdHJhbnNmZXJyZWQgZnJvbSB0aGVcbiAgICogYXNzb2NpYXRlZCBLdWJlcm5ldGVzIGBTZXJ2aWNlYCBvYmplY3Qgb250byB0aGUgaW5nZXN0ZWQgbWV0cmljcy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjdGFyZ2V0TGFiZWxzXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRMYWJlbHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogdGFyZ2V0TGltaXQgZGVmaW5lcyBhIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc2NyYXBlZCB0YXJnZXRzIHRoYXQgd2lsbFxuICAgKiBiZSBhY2NlcHRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjdGFyZ2V0TGltaXRcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldExpbWl0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjKG9iajogU2VydmljZU1vbml0b3JTcGVjIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXR0YWNoTWV0YWRhdGEnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEob2JqLmF0dGFjaE1ldGFkYXRhKSxcbiAgICAnYm9keVNpemVMaW1pdCc6IG9iai5ib2R5U2l6ZUxpbWl0LFxuICAgICdjb252ZXJ0Q2xhc3NpY0hpc3RvZ3JhbXNUb05IQ0InOiBvYmouY29udmVydENsYXNzaWNIaXN0b2dyYW1zVG9OaGNiLFxuICAgICdlbmRwb2ludHMnOiBvYmouZW5kcG9pbnRzPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzKHkpKSxcbiAgICAnZmFsbGJhY2tTY3JhcGVQcm90b2NvbCc6IG9iai5mYWxsYmFja1NjcmFwZVByb3RvY29sLFxuICAgICdqb2JMYWJlbCc6IG9iai5qb2JMYWJlbCxcbiAgICAna2VlcERyb3BwZWRUYXJnZXRzJzogb2JqLmtlZXBEcm9wcGVkVGFyZ2V0cyxcbiAgICAnbGFiZWxMaW1pdCc6IG9iai5sYWJlbExpbWl0LFxuICAgICdsYWJlbE5hbWVMZW5ndGhMaW1pdCc6IG9iai5sYWJlbE5hbWVMZW5ndGhMaW1pdCxcbiAgICAnbGFiZWxWYWx1ZUxlbmd0aExpbWl0Jzogb2JqLmxhYmVsVmFsdWVMZW5ndGhMaW1pdCxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3Iob2JqLm5hbWVzcGFjZVNlbGVjdG9yKSxcbiAgICAnbmF0aXZlSGlzdG9ncmFtQnVja2V0TGltaXQnOiBvYmoubmF0aXZlSGlzdG9ncmFtQnVja2V0TGltaXQsXG4gICAgJ25hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3Rvcic6IG9iai5uYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3I/LnZhbHVlLFxuICAgICdwb2RUYXJnZXRMYWJlbHMnOiBvYmoucG9kVGFyZ2V0TGFiZWxzPy5tYXAoeSA9PiB5KSxcbiAgICAnc2FtcGxlTGltaXQnOiBvYmouc2FtcGxlTGltaXQsXG4gICAgJ3NjcmFwZUNsYXNzJzogb2JqLnNjcmFwZUNsYXNzLFxuICAgICdzY3JhcGVDbGFzc2ljSGlzdG9ncmFtcyc6IG9iai5zY3JhcGVDbGFzc2ljSGlzdG9ncmFtcyxcbiAgICAnc2NyYXBlUHJvdG9jb2xzJzogb2JqLnNjcmFwZVByb3RvY29scz8ubWFwKHkgPT4geSksXG4gICAgJ3NlbGVjdG9yJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yKG9iai5zZWxlY3RvciksXG4gICAgJ3NlbGVjdG9yTWVjaGFuaXNtJzogb2JqLnNlbGVjdG9yTWVjaGFuaXNtLFxuICAgICdzZXJ2aWNlRGlzY292ZXJ5Um9sZSc6IG9iai5zZXJ2aWNlRGlzY292ZXJ5Um9sZSxcbiAgICAndGFyZ2V0TGFiZWxzJzogb2JqLnRhcmdldExhYmVscz8ubWFwKHkgPT4geSksXG4gICAgJ3RhcmdldExpbWl0Jzogb2JqLnRhcmdldExpbWl0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYXR0YWNoTWV0YWRhdGEgZGVmaW5lcyBhZGRpdGlvbmFsIG1ldGFkYXRhIHdoaWNoIGlzIGFkZGVkIHRvIHRoZVxuICogZGlzY292ZXJlZCB0YXJnZXRzLlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMzcuMC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEge1xuICAvKipcbiAgICogbm9kZSB3aGVuIHNldCB0byB0cnVlLCBQcm9tZXRoZXVzIGF0dGFjaGVzIG5vZGUgbWV0YWRhdGEgdG8gdGhlIGRpc2NvdmVyZWRcbiAgICogdGFyZ2V0cy5cbiAgICpcbiAgICogVGhlIFByb21ldGhldXMgc2VydmljZSBhY2NvdW50IG11c3QgaGF2ZSB0aGUgYGxpc3RgIGFuZCBgd2F0Y2hgXG4gICAqIHBlcm1pc3Npb25zIG9uIHRoZSBgTm9kZXNgIG9iamVjdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEjbm9kZVxuICAgKi9cbiAgcmVhZG9ubHkgbm9kZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhKG9iajogU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdub2RlJzogb2JqLm5vZGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBFbmRwb2ludCBkZWZpbmVzIGFuIGVuZHBvaW50IHNlcnZpbmcgUHJvbWV0aGV1cyBtZXRyaWNzIHRvIGJlIHNjcmFwZWQgYnlcbiAqIFByb21ldGhldXMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMge1xuICAvKipcbiAgICogYXV0aG9yaXphdGlvbiBjb25maWd1cmVzIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBjcmVkZW50aWFscyB0byB1c2Ugd2hlblxuICAgKiBzY3JhcGluZyB0aGUgdGFyZ2V0LlxuICAgKlxuICAgKiBDYW5ub3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUgYXMgYGJhc2ljQXV0aGAsIG9yIGBvYXV0aDJgLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNhdXRob3JpemF0aW9uXG4gICAqL1xuICByZWFkb25seSBhdXRob3JpemF0aW9uPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbjtcblxuICAvKipcbiAgICogYmFzaWNBdXRoIGRlZmluZXMgdGhlIEJhc2ljIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZSB3aGVuXG4gICAqIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIENhbm5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyBgYXV0aG9yaXphdGlvbmAsIG9yIGBvYXV0aDJgLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNiYXNpY0F1dGhcbiAgICovXG4gIHJlYWRvbmx5IGJhc2ljQXV0aD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aDtcblxuICAvKipcbiAgICogYmVhcmVyVG9rZW5GaWxlIGRlZmluZXMgdGhlIGZpbGUgdG8gcmVhZCBiZWFyZXIgdG9rZW4gZm9yIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIERlcHJlY2F0ZWQ6IHVzZSBgYXV0aG9yaXphdGlvbmAgaW5zdGVhZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjYmVhcmVyVG9rZW5GaWxlXG4gICAqL1xuICByZWFkb25seSBiZWFyZXJUb2tlbkZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGJlYXJlclRva2VuU2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgYmVhcmVyXG4gICAqIHRva2VuIGZvciBzY3JhcGluZyB0YXJnZXRzLiBUaGUgc2VjcmV0IG5lZWRzIHRvIGJlIGluIHRoZSBzYW1lIG5hbWVzcGFjZVxuICAgKiBhcyB0aGUgU2VydmljZU1vbml0b3Igb2JqZWN0IGFuZCByZWFkYWJsZSBieSB0aGUgUHJvbWV0aGV1cyBPcGVyYXRvci5cbiAgICpcbiAgICogRGVwcmVjYXRlZDogdXNlIGBhdXRob3JpemF0aW9uYCBpbnN0ZWFkLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNiZWFyZXJUb2tlblNlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgYmVhcmVyVG9rZW5TZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldDtcblxuICAvKipcbiAgICogZW5hYmxlSHR0cDIgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBIVFRQMiB3aGVuIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzI2VuYWJsZUh0dHAyXG4gICAqL1xuICByZWFkb25seSBlbmFibGVIdHRwMj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGZpbHRlclJ1bm5pbmcgd2hlbiB0cnVlLCB0aGUgcG9kcyB3aGljaCBhcmUgbm90IHJ1bm5pbmcgKGUuZy4gZWl0aGVyIGluIEZhaWxlZCBvclxuICAgKiBTdWNjZWVkZWQgc3RhdGUpIGFyZSBkcm9wcGVkIGR1cmluZyB0aGUgdGFyZ2V0IGRpc2NvdmVyeS5cbiAgICpcbiAgICogSWYgdW5zZXQsIHRoZSBmaWx0ZXJpbmcgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy93b3JrbG9hZHMvcG9kcy9wb2QtbGlmZWN5Y2xlLyNwb2QtcGhhc2VcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjZmlsdGVyUnVubmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyUnVubmluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGZvbGxvd1JlZGlyZWN0cyBkZWZpbmVzIHdoZXRoZXIgdGhlIHNjcmFwZSByZXF1ZXN0cyBzaG91bGQgZm9sbG93IEhUVFBcbiAgICogM3h4IHJlZGlyZWN0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjZm9sbG93UmVkaXJlY3RzXG4gICAqL1xuICByZWFkb25seSBmb2xsb3dSZWRpcmVjdHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBob25vckxhYmVscyBkZWZpbmVzIHdoZW4gdHJ1ZSB0aGUgbWV0cmljJ3MgbGFiZWxzIHdoZW4gdGhleSBjb2xsaWRlXG4gICAqIHdpdGggdGhlIHRhcmdldCdzIGxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjaG9ub3JMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IGhvbm9yTGFiZWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogaG9ub3JUaW1lc3RhbXBzIGRlZmluZXMgd2hldGhlciBQcm9tZXRoZXVzIHByZXNlcnZlcyB0aGUgdGltZXN0YW1wc1xuICAgKiB3aGVuIGV4cG9zZWQgYnkgdGhlIHRhcmdldC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjaG9ub3JUaW1lc3RhbXBzXG4gICAqL1xuICByZWFkb25seSBob25vclRpbWVzdGFtcHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBpbnRlcnZhbCBhdCB3aGljaCBQcm9tZXRoZXVzIHNjcmFwZXMgdGhlIG1ldHJpY3MgZnJvbSB0aGUgdGFyZ2V0LlxuICAgKlxuICAgKiBJZiBlbXB0eSwgUHJvbWV0aGV1cyB1c2VzIHRoZSBnbG9iYWwgc2NyYXBlIGludGVydmFsLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG1ldHJpY1JlbGFiZWxpbmdzIGRlZmluZXMgdGhlIHJlbGFiZWxpbmcgcnVsZXMgdG8gYXBwbHkgdG8gdGhlXG4gICAqIHNhbXBsZXMgYmVmb3JlIGluZ2VzdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjbWV0cmljUmVsYWJlbGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IG1ldHJpY1JlbGFiZWxpbmdzPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NbXTtcblxuICAvKipcbiAgICogbm9Qcm94eSBkZWZpbmVzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyB0aGF0IGNhbiBjb250YWluIElQcywgQ0lEUiBub3RhdGlvbiwgZG9tYWluIG5hbWVzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gcHJveHlpbmcuIElQIGFuZCBkb21haW4gbmFtZXMgY2FuXG4gICAqIGNvbnRhaW4gcG9ydCBudW1iZXJzLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAsIEFsZXJ0bWFuYWdlciA+PSB2MC4yNS4wIG9yIFRoYW5vcyA+PSB2MC4zMi4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNub1Byb3h5XG4gICAqL1xuICByZWFkb25seSBub1Byb3h5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvYXV0aDIgZGVmaW5lcyB0aGUgT0F1dGgyIHNldHRpbmdzIHRvIHVzZSB3aGVuIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gMi4yNy4wLlxuICAgKlxuICAgKiBDYW5ub3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUgYXMgYGF1dGhvcml6YXRpb25gLCBvciBgYmFzaWNBdXRoYC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjb2F1dGgyXG4gICAqL1xuICByZWFkb25seSBvYXV0aDI/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDI7XG5cbiAgLyoqXG4gICAqIHBhcmFtcyBkZWZpbmUgb3B0aW9uYWwgSFRUUCBVUkwgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcGFyYW1zXG4gICAqL1xuICByZWFkb25seSBwYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH07XG5cbiAgLyoqXG4gICAqIHBhdGggZGVmaW5lcyB0aGUgSFRUUCBwYXRoIGZyb20gd2hpY2ggdG8gc2NyYXBlIGZvciBtZXRyaWNzLlxuICAgKlxuICAgKiBJZiBlbXB0eSwgUHJvbWV0aGV1cyB1c2VzIHRoZSBkZWZhdWx0IHZhbHVlIChlLmcuIGAvbWV0cmljc2ApLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNwYXRoXG4gICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBwb3J0IGRlZmluZXMgdGhlIG5hbWUgb2YgdGhlIFNlcnZpY2UgcG9ydCB3aGljaCB0aGlzIGVuZHBvaW50IHJlZmVycyB0by5cbiAgICpcbiAgICogSXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGB0YXJnZXRQb3J0YC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcG9ydFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IHN0cmluZztcblxuICAvKipcbiAgICogcHJveHlDb25uZWN0SGVhZGVyIG9wdGlvbmFsbHkgc3BlY2lmaWVzIGhlYWRlcnMgdG8gc2VuZCB0b1xuICAgKiBwcm94aWVzIGR1cmluZyBDT05ORUNUIHJlcXVlc3RzLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAsIEFsZXJ0bWFuYWdlciA+PSB2MC4yNS4wIG9yIFRoYW5vcyA+PSB2MC4zMi4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNwcm94eUNvbm5lY3RIZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5Q29ubmVjdEhlYWRlcj86IHsgW2tleTogc3RyaW5nXTogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyW10gfTtcblxuICAvKipcbiAgICogcHJveHlGcm9tRW52aXJvbm1lbnQgZGVmaW5lcyB3aGV0aGVyIHRvIHVzZSB0aGUgcHJveHkgY29uZmlndXJhdGlvbiBkZWZpbmVkIGJ5IGVudmlyb25tZW50IHZhcmlhYmxlcyAoSFRUUF9QUk9YWSwgSFRUUFNfUFJPWFksIGFuZCBOT19QUk9YWSkuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDMuMCwgQWxlcnRtYW5hZ2VyID49IHYwLjI1LjAgb3IgVGhhbm9zID49IHYwLjMyLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzI3Byb3h5RnJvbUVudmlyb25tZW50XG4gICAqL1xuICByZWFkb25seSBwcm94eUZyb21FbnZpcm9ubWVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHByb3h5VXJsIGRlZmluZXMgdGhlIEhUVFAgcHJveHkgc2VydmVyIHRvIHVzZS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcHJveHlVcmxcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5VXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiByZWxhYmVsaW5ncyBkZWZpbmVzIHRoZSByZWxhYmVsaW5nIHJ1bGVzIHRvIGFwcGx5IHRoZSB0YXJnZXQnc1xuICAgKiBtZXRhZGF0YSBsYWJlbHMuXG4gICAqXG4gICAqIFRoZSBPcGVyYXRvciBhdXRvbWF0aWNhbGx5IGFkZHMgcmVsYWJlbGluZ3MgZm9yIGEgZmV3IHN0YW5kYXJkIEt1YmVybmV0ZXMgZmllbGRzLlxuICAgKlxuICAgKiBUaGUgb3JpZ2luYWwgc2NyYXBlIGpvYidzIG5hbWUgaXMgYXZhaWxhYmxlIHZpYSB0aGUgYF9fdG1wX3Byb21ldGhldXNfam9iX25hbWVgIGxhYmVsLlxuICAgKlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8vcHJvbWV0aGV1cy5pby9kb2NzL3Byb21ldGhldXMvbGF0ZXN0L2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi8jcmVsYWJlbF9jb25maWdcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcmVsYWJlbGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IHJlbGFiZWxpbmdzPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3NbXTtcblxuICAvKipcbiAgICogc2NoZW1lIGRlZmluZXMgdGhlIEhUVFAgc2NoZW1lIHRvIHVzZSB3aGVuIHNjcmFwaW5nIHRoZSBtZXRyaWNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNzY2hlbWVcbiAgICovXG4gIHJlYWRvbmx5IHNjaGVtZT86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1NjaGVtZTtcblxuICAvKipcbiAgICogc2NyYXBlVGltZW91dCBkZWZpbmVzIHRoZSB0aW1lb3V0IGFmdGVyIHdoaWNoIFByb21ldGhldXMgY29uc2lkZXJzIHRoZSBzY3JhcGUgdG8gYmUgZmFpbGVkLlxuICAgKlxuICAgKiBJZiBlbXB0eSwgUHJvbWV0aGV1cyB1c2VzIHRoZSBnbG9iYWwgc2NyYXBlIHRpbWVvdXQgdW5sZXNzIGl0IGlzIGxlc3NcbiAgICogdGhhbiB0aGUgdGFyZ2V0J3Mgc2NyYXBlIGludGVydmFsIHZhbHVlIGluIHdoaWNoIHRoZSBsYXR0ZXIgaXMgdXNlZC5cbiAgICogVGhlIHZhbHVlIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIHNjcmFwZSBpbnRlcnZhbCBvdGhlcndpc2UgdGhlIG9wZXJhdG9yIHdpbGwgcmVqZWN0IHRoZSByZXNvdXJjZS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjc2NyYXBlVGltZW91dFxuICAgKi9cbiAgcmVhZG9ubHkgc2NyYXBlVGltZW91dD86IHN0cmluZztcblxuICAvKipcbiAgICogdGFyZ2V0UG9ydCBkZWZpbmVzIHRoZSBuYW1lIG9yIG51bWJlciBvZiB0aGUgdGFyZ2V0IHBvcnQgb2YgdGhlIGBQb2RgIG9iamVjdCBiZWhpbmQgdGhlXG4gICAqIFNlcnZpY2UuIFRoZSBwb3J0IG11c3QgYmUgc3BlY2lmaWVkIHdpdGggdGhlIGNvbnRhaW5lcidzIHBvcnQgcHJvcGVydHkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzI3RhcmdldFBvcnRcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBvcnQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0O1xuXG4gIC8qKlxuICAgKiB0bHNDb25maWcgZGVmaW5lcyB0aGUgVExTIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gc2NyYXBpbmcgdGhlIHRhcmdldC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjdGxzQ29uZmlnXG4gICAqL1xuICByZWFkb25seSB0bHNDb25maWc/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWc7XG5cbiAgLyoqXG4gICAqIHRyYWNrVGltZXN0YW1wc1N0YWxlbmVzcyBkZWZpbmVzIHdoZXRoZXIgUHJvbWV0aGV1cyB0cmFja3Mgc3RhbGVuZXNzIG9mXG4gICAqIHRoZSBtZXRyaWNzIHRoYXQgaGF2ZSBhbiBleHBsaWNpdCB0aW1lc3RhbXAgcHJlc2VudCBpbiBzY3JhcGVkIGRhdGEuXG4gICAqIEhhcyBubyBlZmZlY3QgaWYgYGhvbm9yVGltZXN0YW1wc2AgaXMgZmFsc2UuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDguMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjdHJhY2tUaW1lc3RhbXBzU3RhbGVuZXNzXG4gICAqL1xuICByZWFkb25seSB0cmFja1RpbWVzdGFtcHNTdGFsZW5lc3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXV0aG9yaXphdGlvbic6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uKG9iai5hdXRob3JpemF0aW9uKSxcbiAgICAnYmFzaWNBdXRoJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aChvYmouYmFzaWNBdXRoKSxcbiAgICAnYmVhcmVyVG9rZW5GaWxlJzogb2JqLmJlYXJlclRva2VuRmlsZSxcbiAgICAnYmVhcmVyVG9rZW5TZWNyZXQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQob2JqLmJlYXJlclRva2VuU2VjcmV0KSxcbiAgICAnZW5hYmxlSHR0cDInOiBvYmouZW5hYmxlSHR0cDIsXG4gICAgJ2ZpbHRlclJ1bm5pbmcnOiBvYmouZmlsdGVyUnVubmluZyxcbiAgICAnZm9sbG93UmVkaXJlY3RzJzogb2JqLmZvbGxvd1JlZGlyZWN0cyxcbiAgICAnaG9ub3JMYWJlbHMnOiBvYmouaG9ub3JMYWJlbHMsXG4gICAgJ2hvbm9yVGltZXN0YW1wcyc6IG9iai5ob25vclRpbWVzdGFtcHMsXG4gICAgJ2ludGVydmFsJzogb2JqLmludGVydmFsLFxuICAgICdtZXRyaWNSZWxhYmVsaW5ncyc6IG9iai5tZXRyaWNSZWxhYmVsaW5ncz8ubWFwKHkgPT4gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzKHkpKSxcbiAgICAnbm9Qcm94eSc6IG9iai5ub1Byb3h5LFxuICAgICdvYXV0aDInOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyKG9iai5vYXV0aDIpLFxuICAgICdwYXJhbXMnOiAoKG9iai5wYXJhbXMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5wYXJhbXMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdPy5tYXAoeSA9PiB5KSB9KSwge30pKSxcbiAgICAncGF0aCc6IG9iai5wYXRoLFxuICAgICdwb3J0Jzogb2JqLnBvcnQsXG4gICAgJ3Byb3h5Q29ubmVjdEhlYWRlcic6ICgob2JqLnByb3h5Q29ubmVjdEhlYWRlcikgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLnByb3h5Q29ubmVjdEhlYWRlcikucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0/Lm1hcCh5ID0+IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNQcm94eUNvbm5lY3RIZWFkZXIoeSkpIH0pLCB7fSkpLFxuICAgICdwcm94eUZyb21FbnZpcm9ubWVudCc6IG9iai5wcm94eUZyb21FbnZpcm9ubWVudCxcbiAgICAncHJveHlVcmwnOiBvYmoucHJveHlVcmwsXG4gICAgJ3JlbGFiZWxpbmdzJzogb2JqLnJlbGFiZWxpbmdzPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3MoeSkpLFxuICAgICdzY2hlbWUnOiBvYmouc2NoZW1lLFxuICAgICdzY3JhcGVUaW1lb3V0Jzogb2JqLnNjcmFwZVRpbWVvdXQsXG4gICAgJ3RhcmdldFBvcnQnOiBvYmoudGFyZ2V0UG9ydD8udmFsdWUsXG4gICAgJ3Rsc0NvbmZpZyc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWcob2JqLnRsc0NvbmZpZyksXG4gICAgJ3RyYWNrVGltZXN0YW1wc1N0YWxlbmVzcyc6IG9iai50cmFja1RpbWVzdGFtcHNTdGFsZW5lc3MsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBmYWxsYmFja1NjcmFwZVByb3RvY29sIGRlZmluZXMgdGhlIHByb3RvY29sIHRvIHVzZSBpZiBhIHNjcmFwZSByZXR1cm5zIGJsYW5rLCB1bnBhcnNlYWJsZSwgb3Igb3RoZXJ3aXNlIGludmFsaWQgQ29udGVudC1UeXBlLlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjMuMC4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRmFsbGJhY2tTY3JhcGVQcm90b2NvbFxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNGYWxsYmFja1NjcmFwZVByb3RvY29sIHtcbiAgLyoqIFByb21ldGhldXNQcm90byAqL1xuICBQUk9NRVRIRVVTX1BST1RPID0gXCJQcm9tZXRoZXVzUHJvdG9cIixcbiAgLyoqIE9wZW5NZXRyaWNzVGV4dDAuMC4xICovXG4gIE9QRU5fTUVUUklDU19URVhUMF8wXzEgPSBcIk9wZW5NZXRyaWNzVGV4dDAuMC4xXCIsXG4gIC8qKiBPcGVuTWV0cmljc1RleHQxLjAuMCAqL1xuICBPUEVOX01FVFJJQ1NfVEVYVDFfMF8wID0gXCJPcGVuTWV0cmljc1RleHQxLjAuMFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQwLjAuNCAqL1xuICBQUk9NRVRIRVVTX1RFWFQwXzBfNCA9IFwiUHJvbWV0aGV1c1RleHQwLjAuNFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQxLjAuMCAqL1xuICBQUk9NRVRIRVVTX1RFWFQxXzBfMCA9IFwiUHJvbWV0aGV1c1RleHQxLjAuMFwiLFxufVxuXG4vKipcbiAqIG5hbWVzcGFjZVNlbGVjdG9yIGRlZmluZXMgaW4gd2hpY2ggbmFtZXNwYWNlKHMpIFByb21ldGhldXMgc2hvdWxkIGRpc2NvdmVyIHRoZSBzZXJ2aWNlcy5cbiAqIEJ5IGRlZmF1bHQsIHRoZSBzZXJ2aWNlcyBhcmUgZGlzY292ZXJlZCBpbiB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGBTZXJ2aWNlTW9uaXRvcmAgb2JqZWN0IGJ1dCBpdCBpcyBwb3NzaWJsZSB0byBzZWxlY3QgcG9kcyBhY3Jvc3MgZGlmZmVyZW50L2FsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNOYW1lc3BhY2VTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBhbnkgZGVmaW5lcyB0aGUgYm9vbGVhbiBkZXNjcmliaW5nIHdoZXRoZXIgYWxsIG5hbWVzcGFjZXMgYXJlIHNlbGVjdGVkIGluIGNvbnRyYXN0IHRvIGFcbiAgICogbGlzdCByZXN0cmljdGluZyB0aGVtLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY05hbWVzcGFjZVNlbGVjdG9yI2FueVxuICAgKi9cbiAgcmVhZG9ubHkgYW55PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogbWF0Y2hOYW1lcyBkZWZpbmVzIHRoZSBsaXN0IG9mIG5hbWVzcGFjZSBuYW1lcyB0byBzZWxlY3QgZnJvbS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNOYW1lc3BhY2VTZWxlY3RvciNtYXRjaE5hbWVzXG4gICAqL1xuICByZWFkb25seSBtYXRjaE5hbWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY05hbWVzcGFjZVNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY05hbWVzcGFjZVNlbGVjdG9yKG9iajogU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbnknOiBvYmouYW55LFxuICAgICdtYXRjaE5hbWVzJzogb2JqLm1hdGNoTmFtZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogbmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yIGRlZmluZXMgaWYgdGhlIGdyb3d0aCBmYWN0b3Igb2Ygb25lIGJ1Y2tldCB0byB0aGUgbmV4dCBpcyBzbWFsbGVyIHRoYW4gdGhpcyxcbiAqIGJ1Y2tldHMgd2lsbCBiZSBtZXJnZWQgdG8gaW5jcmVhc2UgdGhlIGZhY3RvciBzdWZmaWNpZW50bHkuXG4gKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjUwLjAuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNOYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3JcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VNb25pdG9yU3BlY05hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3RvciB7XG4gIHB1YmxpYyBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZTogbnVtYmVyKTogU2VydmljZU1vbml0b3JTcGVjTmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yIHtcbiAgICByZXR1cm4gbmV3IFNlcnZpY2VNb25pdG9yU3BlY05hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3Rvcih2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBTZXJ2aWNlTW9uaXRvclNwZWNOYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3Ige1xuICAgIHJldHVybiBuZXcgU2VydmljZU1vbml0b3JTcGVjTmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiBTY3JhcGVQcm90b2NvbCByZXByZXNlbnRzIGEgcHJvdG9jb2wgdXNlZCBieSBQcm9tZXRoZXVzIGZvciBzY3JhcGluZyBtZXRyaWNzLlxuICogU3VwcG9ydGVkIHZhbHVlcyBhcmU6XG4gKiAqIGBPcGVuTWV0cmljc1RleHQwLjAuMWBcbiAqICogYE9wZW5NZXRyaWNzVGV4dDEuMC4wYFxuICogKiBgUHJvbWV0aGV1c1Byb3RvYFxuICogKiBgUHJvbWV0aGV1c1RleHQwLjAuNGBcbiAqICogYFByb21ldGhldXNUZXh0MS4wLjBgXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNTY3JhcGVQcm90b2NvbHNcbiAqL1xuZXhwb3J0IGVudW0gU2VydmljZU1vbml0b3JTcGVjU2NyYXBlUHJvdG9jb2xzIHtcbiAgLyoqIFByb21ldGhldXNQcm90byAqL1xuICBQUk9NRVRIRVVTX1BST1RPID0gXCJQcm9tZXRoZXVzUHJvdG9cIixcbiAgLyoqIE9wZW5NZXRyaWNzVGV4dDAuMC4xICovXG4gIE9QRU5fTUVUUklDU19URVhUMF8wXzEgPSBcIk9wZW5NZXRyaWNzVGV4dDAuMC4xXCIsXG4gIC8qKiBPcGVuTWV0cmljc1RleHQxLjAuMCAqL1xuICBPUEVOX01FVFJJQ1NfVEVYVDFfMF8wID0gXCJPcGVuTWV0cmljc1RleHQxLjAuMFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQwLjAuNCAqL1xuICBQUk9NRVRIRVVTX1RFWFQwXzBfNCA9IFwiUHJvbWV0aGV1c1RleHQwLjAuNFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQxLjAuMCAqL1xuICBQUk9NRVRIRVVTX1RFWFQxXzBfMCA9IFwiUHJvbWV0aGV1c1RleHQxLjAuMFwiLFxufVxuXG4vKipcbiAqIHNlbGVjdG9yIGRlZmluZXMgdGhlIGxhYmVsIHNlbGVjdG9yIHRvIHNlbGVjdCB0aGUgS3ViZXJuZXRlcyBgRW5kcG9pbnRzYCBvYmplY3RzIHRvIHNjcmFwZSBtZXRyaWNzIGZyb20uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvcihvYmo6IFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlbGVjdG9yTWVjaGFuaXNtIGRlZmluZXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHNlbGVjdCB0aGUgZW5kcG9pbnRzIHRvIHNjcmFwZS5cbiAqIEJ5IGRlZmF1bHQsIHRoZSBzZWxlY3Rpb24gcHJvY2VzcyByZWxpZXMgb24gcmVsYWJlbCBjb25maWd1cmF0aW9ucyB0byBmaWx0ZXIgdGhlIGRpc2NvdmVyZWQgdGFyZ2V0cy5cbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gb3B0IGluIGZvciByb2xlIHNlbGVjdG9ycywgd2hpY2ggbWF5IG9mZmVyIGJldHRlciBlZmZpY2llbmN5IGluIGxhcmdlIGNsdXN0ZXJzLlxuICogV2hpY2ggc3RyYXRlZ3kgaXMgYmVzdCBmb3IgeW91ciB1c2UgY2FzZSBuZWVkcyB0byBiZSBjYXJlZnVsbHkgZXZhbHVhdGVkLlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMTcuMC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWVjaGFuaXNtXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWVjaGFuaXNtIHtcbiAgLyoqIFJlbGFiZWxDb25maWcgKi9cbiAgUkVMQUJFTF9DT05GSUcgPSBcIlJlbGFiZWxDb25maWdcIixcbiAgLyoqIFJvbGVTZWxlY3RvciAqL1xuICBST0xFX1NFTEVDVE9SID0gXCJSb2xlU2VsZWN0b3JcIixcbn1cblxuLyoqXG4gKiBzZXJ2aWNlRGlzY292ZXJ5Um9sZSBkZWZpbmVzIHRoZSBzZXJ2aWNlIGRpc2NvdmVyeSByb2xlIHVzZWQgdG8gZGlzY292ZXIgdGFyZ2V0cy5cbiAqXG4gKiBJZiBzZXQsIHRoZSB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIFwiRW5kcG9pbnRzXCIgb3IgXCJFbmRwb2ludFNsaWNlXCIuXG4gKiBPdGhlcndpc2UgaXQgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIGRlZmluZWQgaW4gdGhlXG4gKiBQcm9tZXRoZXVzL1Byb21ldGhldXNBZ2VudCByZXNvdXJjZS5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlcnZpY2VEaXNjb3ZlcnlSb2xlXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY1NlcnZpY2VEaXNjb3ZlcnlSb2xlIHtcbiAgLyoqIEVuZHBvaW50cyAqL1xuICBFTkRQT0lOVFMgPSBcIkVuZHBvaW50c1wiLFxuICAvKiogRW5kcG9pbnRTbGljZSAqL1xuICBFTkRQT0lOVF9TTElDRSA9IFwiRW5kcG9pbnRTbGljZVwiLFxufVxuXG4vKipcbiAqIGF1dGhvcml6YXRpb24gY29uZmlndXJlcyB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgY3JlZGVudGlhbHMgdG8gdXNlIHdoZW5cbiAqIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gKlxuICogQ2Fubm90IGJlIHNldCBhdCB0aGUgc2FtZSB0aW1lIGFzIGBiYXNpY0F1dGhgLCBvciBgb2F1dGgyYC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uIHtcbiAgLyoqXG4gICAqIGNyZWRlbnRpYWxzIGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgaW4gdGhlIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIHRoZSBjcmVkZW50aWFscyBmb3IgYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbiNjcmVkZW50aWFsc1xuICAgKi9cbiAgcmVhZG9ubHkgY3JlZGVudGlhbHM/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHM7XG5cbiAgLyoqXG4gICAqIHR5cGUgZGVmaW5lcyB0aGUgYXV0aGVudGljYXRpb24gdHlwZS4gVGhlIHZhbHVlIGlzIGNhc2UtaW5zZW5zaXRpdmUuXG4gICAqXG4gICAqIFwiQmFzaWNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUuXG4gICAqXG4gICAqIERlZmF1bHQ6IFwiQmVhcmVyXCJcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uI3R5cGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbihvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjcmVkZW50aWFscyc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHMob2JqLmNyZWRlbnRpYWxzKSxcbiAgICAndHlwZSc6IG9iai50eXBlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYmFzaWNBdXRoIGRlZmluZXMgdGhlIEJhc2ljIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZSB3aGVuXG4gKiBzY3JhcGluZyB0aGUgdGFyZ2V0LlxuICpcbiAqIENhbm5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyBgYXV0aG9yaXphdGlvbmAsIG9yIGBvYXV0aDJgLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoIHtcbiAgLyoqXG4gICAqIHBhc3N3b3JkIGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgcGFzc3dvcmQgZm9yXG4gICAqIGF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aCNwYXNzd29yZFxuICAgKi9cbiAgcmVhZG9ubHkgcGFzc3dvcmQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhQYXNzd29yZDtcblxuICAvKipcbiAgICogdXNlcm5hbWUgZGVmaW5lcyBhIGtleSBvZiBhIFNlY3JldCBjb250YWluaW5nIHRoZSB1c2VybmFtZSBmb3JcbiAgICogYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoI3VzZXJuYW1lXG4gICAqL1xuICByZWFkb25seSB1c2VybmFtZT86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGgnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncGFzc3dvcmQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQob2JqLnBhc3N3b3JkKSxcbiAgICAndXNlcm5hbWUnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUob2JqLnVzZXJuYW1lKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGJlYXJlclRva2VuU2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgYmVhcmVyXG4gKiB0b2tlbiBmb3Igc2NyYXBpbmcgdGFyZ2V0cy4gVGhlIHNlY3JldCBuZWVkcyB0byBiZSBpbiB0aGUgc2FtZSBuYW1lc3BhY2VcbiAqIGFzIHRoZSBTZXJ2aWNlTW9uaXRvciBvYmplY3QgYW5kIHJlYWRhYmxlIGJ5IHRoZSBQcm9tZXRoZXVzIE9wZXJhdG9yLlxuICpcbiAqIERlcHJlY2F0ZWQ6IHVzZSBgYXV0aG9yaXphdGlvbmAgaW5zdGVhZC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0JlYXJlclRva2VuU2VjcmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldChvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0JlYXJlclRva2VuU2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFJlbGFiZWxDb25maWcgYWxsb3dzIGR5bmFtaWMgcmV3cml0aW5nIG9mIHRoZSBsYWJlbCBzZXQgZm9yIHRhcmdldHMsIGFsZXJ0cyxcbiAqIHNjcmFwZWQgc2FtcGxlcyBhbmQgcmVtb3RlIHdyaXRlIHNhbXBsZXMuXG4gKlxuICogTW9yZSBpbmZvOiBodHRwczovL3Byb21ldGhldXMuaW8vZG9jcy9wcm9tZXRoZXVzL2xhdGVzdC9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24vI3JlbGFiZWxfY29uZmlnXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNNZXRyaWNSZWxhYmVsaW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzIHtcbiAgLyoqXG4gICAqIGFjdGlvbiB0byBwZXJmb3JtIGJhc2VkIG9uIHRoZSByZWdleCBtYXRjaGluZy5cbiAgICpcbiAgICogYFVwcGVyY2FzZWAgYW5kIGBMb3dlcmNhc2VgIGFjdGlvbnMgcmVxdWlyZSBQcm9tZXRoZXVzID49IHYyLjM2LjAuXG4gICAqIGBEcm9wRXF1YWxgIGFuZCBgS2VlcEVxdWFsYCBhY3Rpb25zIHJlcXVpcmUgUHJvbWV0aGV1cyA+PSB2Mi40MS4wLlxuICAgKlxuICAgKiBEZWZhdWx0OiBcIlJlcGxhY2VcIlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzI2FjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NBY3Rpb247XG5cbiAgLyoqXG4gICAqIG1vZHVsdXMgdG8gdGFrZSBvZiB0aGUgaGFzaCBvZiB0aGUgc291cmNlIGxhYmVsIHZhbHVlcy5cbiAgICpcbiAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gdGhlIGFjdGlvbiBpcyBgSGFzaE1vZGAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3MjbW9kdWx1c1xuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWx1cz86IG51bWJlcjtcblxuICAvKipcbiAgICogcmVnZXggZGVmaW5lcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGFnYWluc3Qgd2hpY2ggdGhlIGV4dHJhY3RlZCB2YWx1ZSBpcyBtYXRjaGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzI3JlZ2V4XG4gICAqL1xuICByZWFkb25seSByZWdleD86IHN0cmluZztcblxuICAvKipcbiAgICogcmVwbGFjZW1lbnQgdmFsdWUgYWdhaW5zdCB3aGljaCBhIFJlcGxhY2UgYWN0aW9uIGlzIHBlcmZvcm1lZCBpZiB0aGVcbiAgICogcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXMuXG4gICAqXG4gICAqIFJlZ2V4IGNhcHR1cmUgZ3JvdXBzIGFyZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3MjcmVwbGFjZW1lbnRcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxhY2VtZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBzZXBhcmF0b3IgZGVmaW5lcyB0aGUgc3RyaW5nIGJldHdlZW4gY29uY2F0ZW5hdGVkIFNvdXJjZUxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNNZXRyaWNSZWxhYmVsaW5ncyNzZXBhcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IHNlcGFyYXRvcj86IHN0cmluZztcblxuICAvKipcbiAgICogc291cmNlTGFiZWxzIGRlZmluZXMgdGhlIHNvdXJjZSBsYWJlbHMgc2VsZWN0IHZhbHVlcyBmcm9tIGV4aXN0aW5nIGxhYmVscy4gVGhlaXIgY29udGVudCBpc1xuICAgKiBjb25jYXRlbmF0ZWQgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgU2VwYXJhdG9yIGFuZCBtYXRjaGVkIGFnYWluc3QgdGhlXG4gICAqIGNvbmZpZ3VyZWQgcmVndWxhciBleHByZXNzaW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzI3NvdXJjZUxhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlTGFiZWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIHRhcmdldExhYmVsIGRlZmluZXMgdGhlIGxhYmVsIHRvIHdoaWNoIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIHdyaXR0ZW4gaW4gYSByZXBsYWNlbWVudC5cbiAgICpcbiAgICogSXQgaXMgbWFuZGF0b3J5IGZvciBgUmVwbGFjZWAsIGBIYXNoTW9kYCwgYExvd2VyY2FzZWAsIGBVcHBlcmNhc2VgLFxuICAgKiBgS2VlcEVxdWFsYCBhbmQgYERyb3BFcXVhbGAgYWN0aW9ucy5cbiAgICpcbiAgICogUmVnZXggY2FwdHVyZSBncm91cHMgYXJlIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNNZXRyaWNSZWxhYmVsaW5ncyN0YXJnZXRMYWJlbFxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0TGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3MgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhY3Rpb24nOiBvYmouYWN0aW9uLFxuICAgICdtb2R1bHVzJzogb2JqLm1vZHVsdXMsXG4gICAgJ3JlZ2V4Jzogb2JqLnJlZ2V4LFxuICAgICdyZXBsYWNlbWVudCc6IG9iai5yZXBsYWNlbWVudCxcbiAgICAnc2VwYXJhdG9yJzogb2JqLnNlcGFyYXRvcixcbiAgICAnc291cmNlTGFiZWxzJzogb2JqLnNvdXJjZUxhYmVscz8ubWFwKHkgPT4geSksXG4gICAgJ3RhcmdldExhYmVsJzogb2JqLnRhcmdldExhYmVsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogb2F1dGgyIGRlZmluZXMgdGhlIE9BdXRoMiBzZXR0aW5ncyB0byB1c2Ugd2hlbiBzY3JhcGluZyB0aGUgdGFyZ2V0LlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gMi4yNy4wLlxuICpcbiAqIENhbm5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyBgYXV0aG9yaXphdGlvbmAsIG9yIGBiYXNpY0F1dGhgLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyIHtcbiAgLyoqXG4gICAqIGNsaWVudElkIGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgb3IgQ29uZmlnTWFwIGNvbnRhaW5pbmcgdGhlXG4gICAqIE9BdXRoMiBjbGllbnQncyBJRC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDIjY2xpZW50SWRcbiAgICovXG4gIHJlYWRvbmx5IGNsaWVudElkOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZDtcblxuICAvKipcbiAgICogY2xpZW50U2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgT0F1dGgyXG4gICAqIGNsaWVudCdzIHNlY3JldC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDIjY2xpZW50U2VjcmV0XG4gICAqL1xuICByZWFkb25seSBjbGllbnRTZWNyZXQ6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldDtcblxuICAvKipcbiAgICogZW5kcG9pbnRQYXJhbXMgY29uZmlndXJlcyB0aGUgSFRUUCBwYXJhbWV0ZXJzIHRvIGFwcGVuZCB0byB0aGUgdG9rZW5cbiAgICogVVJMLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMiNlbmRwb2ludFBhcmFtc1xuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRQYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBub1Byb3h5IGRlZmluZXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIHRoYXQgY2FuIGNvbnRhaW4gSVBzLCBDSURSIG5vdGF0aW9uLCBkb21haW4gbmFtZXNcbiAgICogdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBwcm94eWluZy4gSVAgYW5kIGRvbWFpbiBuYW1lcyBjYW5cbiAgICogY29udGFpbiBwb3J0IG51bWJlcnMuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDMuMCwgQWxlcnRtYW5hZ2VyID49IHYwLjI1LjAgb3IgVGhhbm9zID49IHYwLjMyLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI25vUHJveHlcbiAgICovXG4gIHJlYWRvbmx5IG5vUHJveHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHByb3h5Q29ubmVjdEhlYWRlciBvcHRpb25hbGx5IHNwZWNpZmllcyBoZWFkZXJzIHRvIHNlbmQgdG9cbiAgICogcHJveGllcyBkdXJpbmcgQ09OTkVDVCByZXF1ZXN0cy5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi40My4wLCBBbGVydG1hbmFnZXIgPj0gdjAuMjUuMCBvciBUaGFub3MgPj0gdjAuMzIuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDIjcHJveHlDb25uZWN0SGVhZGVyXG4gICAqL1xuICByZWFkb25seSBwcm94eUNvbm5lY3RIZWFkZXI/OiB7IFtrZXk6IHN0cmluZ106IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlByb3h5Q29ubmVjdEhlYWRlcltdIH07XG5cbiAgLyoqXG4gICAqIHByb3h5RnJvbUVudmlyb25tZW50IGRlZmluZXMgd2hldGhlciB0byB1c2UgdGhlIHByb3h5IGNvbmZpZ3VyYXRpb24gZGVmaW5lZCBieSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKEhUVFBfUFJPWFksIEhUVFBTX1BST1hZLCBhbmQgTk9fUFJPWFkpLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAsIEFsZXJ0bWFuYWdlciA+PSB2MC4yNS4wIG9yIFRoYW5vcyA+PSB2MC4zMi4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMiNwcm94eUZyb21FbnZpcm9ubWVudFxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlGcm9tRW52aXJvbm1lbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBwcm94eVVybCBkZWZpbmVzIHRoZSBIVFRQIHByb3h5IHNlcnZlciB0byB1c2UuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Byb3h5VXJsXG4gICAqL1xuICByZWFkb25seSBwcm94eVVybD86IHN0cmluZztcblxuICAvKipcbiAgICogc2NvcGVzIGRlZmluZXMgdGhlIE9BdXRoMiBzY29wZXMgdXNlZCBmb3IgdGhlIHRva2VuIHJlcXVlc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Njb3Blc1xuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIHRsc0NvbmZpZyBkZWZpbmVzIHRoZSBUTFMgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBPQXV0aDIgc2VydmVyLlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Rsc0NvbmZpZ1xuICAgKi9cbiAgcmVhZG9ubHkgdGxzQ29uZmlnPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnO1xuXG4gIC8qKlxuICAgKiB0b2tlblVybCBkZWZpbmVzIHRoZSBVUkwgdG8gZmV0Y2ggdGhlIHRva2VuIGZyb20uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Rva2VuVXJsXG4gICAqL1xuICByZWFkb25seSB0b2tlblVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDInIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2xpZW50SWQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQob2JqLmNsaWVudElkKSxcbiAgICAnY2xpZW50U2VjcmV0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldChvYmouY2xpZW50U2VjcmV0KSxcbiAgICAnZW5kcG9pbnRQYXJhbXMnOiAoKG9iai5lbmRwb2ludFBhcmFtcykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmVuZHBvaW50UGFyYW1zKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnbm9Qcm94eSc6IG9iai5ub1Byb3h5LFxuICAgICdwcm94eUNvbm5lY3RIZWFkZXInOiAoKG9iai5wcm94eUNvbm5lY3RIZWFkZXIpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5wcm94eUNvbm5lY3RIZWFkZXIpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyKHkpKSB9KSwge30pKSxcbiAgICAncHJveHlGcm9tRW52aXJvbm1lbnQnOiBvYmoucHJveHlGcm9tRW52aXJvbm1lbnQsXG4gICAgJ3Byb3h5VXJsJzogb2JqLnByb3h5VXJsLFxuICAgICdzY29wZXMnOiBvYmouc2NvcGVzPy5tYXAoeSA9PiB5KSxcbiAgICAndGxzQ29uZmlnJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZyhvYmoudGxzQ29uZmlnKSxcbiAgICAndG9rZW5VcmwnOiBvYmoudG9rZW5VcmwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTZWNyZXRLZXlTZWxlY3RvciBzZWxlY3RzIGEga2V5IG9mIGEgU2VjcmV0LlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Byb3h5Q29ubmVjdEhlYWRlciNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNQcm94eUNvbm5lY3RIZWFkZXIjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNQcm94eUNvbm5lY3RIZWFkZXIjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Byb3h5Q29ubmVjdEhlYWRlcihvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Byb3h5Q29ubmVjdEhlYWRlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBSZWxhYmVsQ29uZmlnIGFsbG93cyBkeW5hbWljIHJld3JpdGluZyBvZiB0aGUgbGFiZWwgc2V0IGZvciB0YXJnZXRzLCBhbGVydHMsXG4gKiBzY3JhcGVkIHNhbXBsZXMgYW5kIHJlbW90ZSB3cml0ZSBzYW1wbGVzLlxuICpcbiAqIE1vcmUgaW5mbzogaHR0cHM6Ly9wcm9tZXRoZXVzLmlvL2RvY3MvcHJvbWV0aGV1cy9sYXRlc3QvY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLyNyZWxhYmVsX2NvbmZpZ1xuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyB7XG4gIC8qKlxuICAgKiBhY3Rpb24gdG8gcGVyZm9ybSBiYXNlZCBvbiB0aGUgcmVnZXggbWF0Y2hpbmcuXG4gICAqXG4gICAqIGBVcHBlcmNhc2VgIGFuZCBgTG93ZXJjYXNlYCBhY3Rpb25zIHJlcXVpcmUgUHJvbWV0aGV1cyA+PSB2Mi4zNi4wLlxuICAgKiBgRHJvcEVxdWFsYCBhbmQgYEtlZXBFcXVhbGAgYWN0aW9ucyByZXF1aXJlIFByb21ldGhldXMgPj0gdjIuNDEuMC5cbiAgICpcbiAgICogRGVmYXVsdDogXCJSZXBsYWNlXCJcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyNhY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbj86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzQWN0aW9uO1xuXG4gIC8qKlxuICAgKiBtb2R1bHVzIHRvIHRha2Ugb2YgdGhlIGhhc2ggb2YgdGhlIHNvdXJjZSBsYWJlbCB2YWx1ZXMuXG4gICAqXG4gICAqIE9ubHkgYXBwbGljYWJsZSB3aGVuIHRoZSBhY3Rpb24gaXMgYEhhc2hNb2RgLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzI21vZHVsdXNcbiAgICovXG4gIHJlYWRvbmx5IG1vZHVsdXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHJlZ2V4IGRlZmluZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhZ2FpbnN0IHdoaWNoIHRoZSBleHRyYWN0ZWQgdmFsdWUgaXMgbWF0Y2hlZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyNyZWdleFxuICAgKi9cbiAgcmVhZG9ubHkgcmVnZXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHJlcGxhY2VtZW50IHZhbHVlIGFnYWluc3Qgd2hpY2ggYSBSZXBsYWNlIGFjdGlvbiBpcyBwZXJmb3JtZWQgaWYgdGhlXG4gICAqIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzLlxuICAgKlxuICAgKiBSZWdleCBjYXB0dXJlIGdyb3VwcyBhcmUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzI3JlcGxhY2VtZW50XG4gICAqL1xuICByZWFkb25seSByZXBsYWNlbWVudD86IHN0cmluZztcblxuICAvKipcbiAgICogc2VwYXJhdG9yIGRlZmluZXMgdGhlIHN0cmluZyBiZXR3ZWVuIGNvbmNhdGVuYXRlZCBTb3VyY2VMYWJlbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3Mjc2VwYXJhdG9yXG4gICAqL1xuICByZWFkb25seSBzZXBhcmF0b3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNvdXJjZUxhYmVscyBkZWZpbmVzIHRoZSBzb3VyY2UgbGFiZWxzIHNlbGVjdCB2YWx1ZXMgZnJvbSBleGlzdGluZyBsYWJlbHMuIFRoZWlyIGNvbnRlbnQgaXNcbiAgICogY29uY2F0ZW5hdGVkIHVzaW5nIHRoZSBjb25maWd1cmVkIFNlcGFyYXRvciBhbmQgbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICAgKiBjb25maWd1cmVkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyNzb3VyY2VMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUxhYmVscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiB0YXJnZXRMYWJlbCBkZWZpbmVzIHRoZSBsYWJlbCB0byB3aGljaCB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyB3cml0dGVuIGluIGEgcmVwbGFjZW1lbnQuXG4gICAqXG4gICAqIEl0IGlzIG1hbmRhdG9yeSBmb3IgYFJlcGxhY2VgLCBgSGFzaE1vZGAsIGBMb3dlcmNhc2VgLCBgVXBwZXJjYXNlYCxcbiAgICogYEtlZXBFcXVhbGAgYW5kIGBEcm9wRXF1YWxgIGFjdGlvbnMuXG4gICAqXG4gICAqIFJlZ2V4IGNhcHR1cmUgZ3JvdXBzIGFyZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3MjdGFyZ2V0TGFiZWxcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldExhYmVsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyhvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWN0aW9uJzogb2JqLmFjdGlvbixcbiAgICAnbW9kdWx1cyc6IG9iai5tb2R1bHVzLFxuICAgICdyZWdleCc6IG9iai5yZWdleCxcbiAgICAncmVwbGFjZW1lbnQnOiBvYmoucmVwbGFjZW1lbnQsXG4gICAgJ3NlcGFyYXRvcic6IG9iai5zZXBhcmF0b3IsXG4gICAgJ3NvdXJjZUxhYmVscyc6IG9iai5zb3VyY2VMYWJlbHM/Lm1hcCh5ID0+IHkpLFxuICAgICd0YXJnZXRMYWJlbCc6IG9iai50YXJnZXRMYWJlbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNjaGVtZSBkZWZpbmVzIHRoZSBIVFRQIHNjaGVtZSB0byB1c2Ugd2hlbiBzY3JhcGluZyB0aGUgbWV0cmljcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1NjaGVtZVxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNTY2hlbWUge1xuICAvKiogaHR0cCAqL1xuICBIVFRQID0gXCJodHRwXCIsXG4gIC8qKiBodHRwcyAqL1xuICBIVFRQUyA9IFwiaHR0cHNcIixcbn1cblxuLyoqXG4gKiB0YXJnZXRQb3J0IGRlZmluZXMgdGhlIG5hbWUgb3IgbnVtYmVyIG9mIHRoZSB0YXJnZXQgcG9ydCBvZiB0aGUgYFBvZGAgb2JqZWN0IGJlaGluZCB0aGVcbiAqIFNlcnZpY2UuIFRoZSBwb3J0IG11c3QgYmUgc3BlY2lmaWVkIHdpdGggdGhlIGNvbnRhaW5lcidzIHBvcnQgcHJvcGVydHkuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0IHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0IHtcbiAgICByZXR1cm4gbmV3IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1RhcmdldFBvcnQodmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGFyZ2V0UG9ydCB7XG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiB0bHNDb25maWcgZGVmaW5lcyB0aGUgVExTIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gc2NyYXBpbmcgdGhlIHRhcmdldC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyB7XG4gIC8qKlxuICAgKiBjYSBkZWZpbmVzIHRoZSBDZXJ0aWZpY2F0ZSBhdXRob3JpdHkgdXNlZCB3aGVuIHZlcmlmeWluZyBzZXJ2ZXIgY2VydGlmaWNhdGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNjYVxuICAgKi9cbiAgcmVhZG9ubHkgY2E/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYTtcblxuICAvKipcbiAgICogY2FGaWxlIGRlZmluZXMgdGhlIHBhdGggdG8gdGhlIENBIGNlcnQgaW4gdGhlIFByb21ldGhldXMgY29udGFpbmVyIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnI2NhRmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBjZXJ0IGRlZmluZXMgdGhlIENsaWVudCBjZXJ0aWZpY2F0ZSB0byBwcmVzZW50IHdoZW4gZG9pbmcgY2xpZW50LWF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNjZXJ0XG4gICAqL1xuICByZWFkb25seSBjZXJ0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydDtcblxuICAvKipcbiAgICogY2VydEZpbGUgZGVmaW5lcyB0aGUgcGF0aCB0byB0aGUgY2xpZW50IGNlcnQgZmlsZSBpbiB0aGUgUHJvbWV0aGV1cyBjb250YWluZXIgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNjZXJ0RmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2VydEZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGluc2VjdXJlU2tpcFZlcmlmeSBkZWZpbmVzIGhvdyB0byBkaXNhYmxlIHRhcmdldCBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNpbnNlY3VyZVNraXBWZXJpZnlcbiAgICovXG4gIHJlYWRvbmx5IGluc2VjdXJlU2tpcFZlcmlmeT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGtleUZpbGUgZGVmaW5lcyB0aGUgcGF0aCB0byB0aGUgY2xpZW50IGtleSBmaWxlIGluIHRoZSBQcm9tZXRoZXVzIGNvbnRhaW5lciBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnI2tleUZpbGVcbiAgICovXG4gIHJlYWRvbmx5IGtleUZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGtleVNlY3JldCBkZWZpbmVzIHRoZSBTZWNyZXQgY29udGFpbmluZyB0aGUgY2xpZW50IGtleSBmaWxlIGZvciB0aGUgdGFyZ2V0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWcja2V5U2VjcmV0XG4gICAqL1xuICByZWFkb25seSBrZXlTZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdLZXlTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIG1heFZlcnNpb24gZGVmaW5lcyB0aGUgbWF4aW11bSBhY2NlcHRhYmxlIFRMUyB2ZXJzaW9uLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQxLjAgb3IgVGhhbm9zID49IHYwLjMxLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnI21heFZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IG1heFZlcnNpb24/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdNYXhWZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBtaW5WZXJzaW9uIGRlZmluZXMgdGhlIG1pbmltdW0gYWNjZXB0YWJsZSBUTFMgdmVyc2lvbi5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4zNS4wIG9yIFRoYW5vcyA+PSB2MC4yOC4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNtaW5WZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBtaW5WZXJzaW9uPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnTWluVmVyc2lvbjtcblxuICAvKipcbiAgICogc2VydmVyTmFtZSBpcyB1c2VkIHRvIHZlcmlmeSB0aGUgaG9zdG5hbWUgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNzZXJ2ZXJOYW1lXG4gICAqL1xuICByZWFkb25seSBzZXJ2ZXJOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWcnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2EnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2Eob2JqLmNhKSxcbiAgICAnY2FGaWxlJzogb2JqLmNhRmlsZSxcbiAgICAnY2VydCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0KG9iai5jZXJ0KSxcbiAgICAnY2VydEZpbGUnOiBvYmouY2VydEZpbGUsXG4gICAgJ2luc2VjdXJlU2tpcFZlcmlmeSc6IG9iai5pbnNlY3VyZVNraXBWZXJpZnksXG4gICAgJ2tleUZpbGUnOiBvYmoua2V5RmlsZSxcbiAgICAna2V5U2VjcmV0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldChvYmoua2V5U2VjcmV0KSxcbiAgICAnbWF4VmVyc2lvbic6IG9iai5tYXhWZXJzaW9uLFxuICAgICdtaW5WZXJzaW9uJzogb2JqLm1pblZlcnNpb24sXG4gICAgJ3NlcnZlck5hbWUnOiBvYmouc2VydmVyTmFtZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBjcmVkZW50aWFscyBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IGluIHRoZSBuYW1lc3BhY2UgdGhhdCBjb250YWlucyB0aGUgY3JlZGVudGlhbHMgZm9yIGF1dGhlbnRpY2F0aW9uLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbkNyZWRlbnRpYWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbkNyZWRlbnRpYWxzIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25DcmVkZW50aWFscyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHMjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHMjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbkNyZWRlbnRpYWxzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25DcmVkZW50aWFscyhvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25DcmVkZW50aWFscyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwYXNzd29yZCBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IGNvbnRhaW5pbmcgdGhlIHBhc3N3b3JkIGZvclxuICogYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhQYXNzd29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFBhc3N3b3JkIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFBhc3N3b3JkI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFBhc3N3b3JkI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhQYXNzd29yZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiB1c2VybmFtZSBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lIGZvclxuICogYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhVc2VybmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhVc2VybmFtZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBhY3Rpb24gdG8gcGVyZm9ybSBiYXNlZCBvbiB0aGUgcmVnZXggbWF0Y2hpbmcuXG4gKlxuICogYFVwcGVyY2FzZWAgYW5kIGBMb3dlcmNhc2VgIGFjdGlvbnMgcmVxdWlyZSBQcm9tZXRoZXVzID49IHYyLjM2LjAuXG4gKiBgRHJvcEVxdWFsYCBhbmQgYEtlZXBFcXVhbGAgYWN0aW9ucyByZXF1aXJlIFByb21ldGhldXMgPj0gdjIuNDEuMC5cbiAqXG4gKiBEZWZhdWx0OiBcIlJlcGxhY2VcIlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NBY3Rpb25cbiAqL1xuZXhwb3J0IGVudW0gU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NBY3Rpb24ge1xuICAvKiogcmVwbGFjZSAqL1xuICBSRVBMQUNFID0gXCJyZXBsYWNlXCIsXG4gIC8qKiBrZWVwICovXG4gIEtFRVAgPSBcImtlZXBcIixcbiAgLyoqIGRyb3AgKi9cbiAgRFJPUCA9IFwiZHJvcFwiLFxuICAvKiogaGFzaG1vZCAqL1xuICBIQVNITU9EID0gXCJoYXNobW9kXCIsXG4gIC8qKiBsYWJlbG1hcCAqL1xuICBMQUJFTE1BUCA9IFwibGFiZWxtYXBcIixcbiAgLyoqIGxhYmVsZHJvcCAqL1xuICBMQUJFTERST1AgPSBcImxhYmVsZHJvcFwiLFxuICAvKiogbGFiZWxrZWVwICovXG4gIExBQkVMS0VFUCA9IFwibGFiZWxrZWVwXCIsXG4gIC8qKiBsb3dlcmNhc2UgKi9cbiAgTE9XRVJDQVNFID0gXCJsb3dlcmNhc2VcIixcbiAgLyoqIHVwcGVyY2FzZSAqL1xuICBVUFBFUkNBU0UgPSBcInVwcGVyY2FzZVwiLFxuICAvKioga2VlcGVxdWFsICovXG4gIEtFRVBFUVVBTCA9IFwia2VlcGVxdWFsXCIsXG4gIC8qKiBkcm9wZXF1YWwgKi9cbiAgRFJPUEVRVUFMID0gXCJkcm9wZXF1YWxcIixcbn1cblxuLyoqXG4gKiBjbGllbnRJZCBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IG9yIENvbmZpZ01hcCBjb250YWluaW5nIHRoZVxuICogT0F1dGgyIGNsaWVudCdzIElELlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZCB7XG4gIC8qKlxuICAgKiBjb25maWdNYXAgZGVmaW5lcyB0aGUgQ29uZmlnTWFwIGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkI2NvbmZpZ01hcFxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnTWFwPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXA7XG5cbiAgLyoqXG4gICAqIHNlY3JldCBkZWZpbmVzIHRoZSBTZWNyZXQgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2NvbmZpZ01hcCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZENvbmZpZ01hcChvYmouY29uZmlnTWFwKSxcbiAgICAnc2VjcmV0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0KG9iai5zZWNyZXQpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY2xpZW50U2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgT0F1dGgyXG4gKiBjbGllbnQncyBzZWNyZXQuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRTZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50U2VjcmV0I2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRTZWNyZXQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50U2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50U2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNlY3JldEtleVNlbGVjdG9yIHNlbGVjdHMgYSBrZXkgb2YgYSBTZWNyZXQuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJQcm94eUNvbm5lY3RIZWFkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJQcm94eUNvbm5lY3RIZWFkZXIge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlByb3h5Q29ubmVjdEhlYWRlciNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlByb3h5Q29ubmVjdEhlYWRlciNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJQcm94eUNvbm5lY3RIZWFkZXInIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHRsc0NvbmZpZyBkZWZpbmVzIHRoZSBUTFMgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBPQXV0aDIgc2VydmVyLlxuICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi40My4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnIHtcbiAgLyoqXG4gICAqIGNhIGRlZmluZXMgdGhlIENlcnRpZmljYXRlIGF1dGhvcml0eSB1c2VkIHdoZW4gdmVyaWZ5aW5nIHNlcnZlciBjZXJ0aWZpY2F0ZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI2NhXG4gICAqL1xuICByZWFkb25seSBjYT86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhO1xuXG4gIC8qKlxuICAgKiBjZXJ0IGRlZmluZXMgdGhlIENsaWVudCBjZXJ0aWZpY2F0ZSB0byBwcmVzZW50IHdoZW4gZG9pbmcgY2xpZW50LWF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZyNjZXJ0XG4gICAqL1xuICByZWFkb25seSBjZXJ0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydDtcblxuICAvKipcbiAgICogaW5zZWN1cmVTa2lwVmVyaWZ5IGRlZmluZXMgaG93IHRvIGRpc2FibGUgdGFyZ2V0IGNlcnRpZmljYXRlIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI2luc2VjdXJlU2tpcFZlcmlmeVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zZWN1cmVTa2lwVmVyaWZ5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICoga2V5U2VjcmV0IGRlZmluZXMgdGhlIFNlY3JldCBjb250YWluaW5nIHRoZSBjbGllbnQga2V5IGZpbGUgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZyNrZXlTZWNyZXRcbiAgICovXG4gIHJlYWRvbmx5IGtleVNlY3JldD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldDtcblxuICAvKipcbiAgICogbWF4VmVyc2lvbiBkZWZpbmVzIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgVExTIHZlcnNpb24uXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDEuMCBvciBUaGFub3MgPj0gdjAuMzEuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWcjbWF4VmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgbWF4VmVyc2lvbj86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ01heFZlcnNpb247XG5cbiAgLyoqXG4gICAqIG1pblZlcnNpb24gZGVmaW5lcyB0aGUgbWluaW11bSBhY2NlcHRhYmxlIFRMUyB2ZXJzaW9uLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjM1LjAgb3IgVGhhbm9zID49IHYwLjI4LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI21pblZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IG1pblZlcnNpb24/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdNaW5WZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBzZXJ2ZXJOYW1lIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSBob3N0bmFtZSBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI3NlcnZlck5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZlck5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWcob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWcgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjYSc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYShvYmouY2EpLFxuICAgICdjZXJ0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQob2JqLmNlcnQpLFxuICAgICdpbnNlY3VyZVNraXBWZXJpZnknOiBvYmouaW5zZWN1cmVTa2lwVmVyaWZ5LFxuICAgICdrZXlTZWNyZXQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0KG9iai5rZXlTZWNyZXQpLFxuICAgICdtYXhWZXJzaW9uJzogb2JqLm1heFZlcnNpb24sXG4gICAgJ21pblZlcnNpb24nOiBvYmoubWluVmVyc2lvbixcbiAgICAnc2VydmVyTmFtZSc6IG9iai5zZXJ2ZXJOYW1lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYWN0aW9uIHRvIHBlcmZvcm0gYmFzZWQgb24gdGhlIHJlZ2V4IG1hdGNoaW5nLlxuICpcbiAqIGBVcHBlcmNhc2VgIGFuZCBgTG93ZXJjYXNlYCBhY3Rpb25zIHJlcXVpcmUgUHJvbWV0aGV1cyA+PSB2Mi4zNi4wLlxuICogYERyb3BFcXVhbGAgYW5kIGBLZWVwRXF1YWxgIGFjdGlvbnMgcmVxdWlyZSBQcm9tZXRoZXVzID49IHYyLjQxLjAuXG4gKlxuICogRGVmYXVsdDogXCJSZXBsYWNlXCJcbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzQWN0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzQWN0aW9uIHtcbiAgLyoqIHJlcGxhY2UgKi9cbiAgUkVQTEFDRSA9IFwicmVwbGFjZVwiLFxuICAvKioga2VlcCAqL1xuICBLRUVQID0gXCJrZWVwXCIsXG4gIC8qKiBkcm9wICovXG4gIERST1AgPSBcImRyb3BcIixcbiAgLyoqIGhhc2htb2QgKi9cbiAgSEFTSE1PRCA9IFwiaGFzaG1vZFwiLFxuICAvKiogbGFiZWxtYXAgKi9cbiAgTEFCRUxNQVAgPSBcImxhYmVsbWFwXCIsXG4gIC8qKiBsYWJlbGRyb3AgKi9cbiAgTEFCRUxEUk9QID0gXCJsYWJlbGRyb3BcIixcbiAgLyoqIGxhYmVsa2VlcCAqL1xuICBMQUJFTEtFRVAgPSBcImxhYmVsa2VlcFwiLFxuICAvKiogbG93ZXJjYXNlICovXG4gIExPV0VSQ0FTRSA9IFwibG93ZXJjYXNlXCIsXG4gIC8qKiB1cHBlcmNhc2UgKi9cbiAgVVBQRVJDQVNFID0gXCJ1cHBlcmNhc2VcIixcbiAgLyoqIGtlZXBlcXVhbCAqL1xuICBLRUVQRVFVQUwgPSBcImtlZXBlcXVhbFwiLFxuICAvKiogZHJvcGVxdWFsICovXG4gIERST1BFUVVBTCA9IFwiZHJvcGVxdWFsXCIsXG59XG5cbi8qKlxuICogY2EgZGVmaW5lcyB0aGUgQ2VydGlmaWNhdGUgYXV0aG9yaXR5IHVzZWQgd2hlbiB2ZXJpZnlpbmcgc2VydmVyIGNlcnRpZmljYXRlcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2Ege1xuICAvKipcbiAgICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYSNjb25maWdNYXBcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ01hcD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhI3NlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FTZWNyZXQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2EgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb25maWdNYXAnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldChvYmouc2VjcmV0KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNlcnQgZGVmaW5lcyB0aGUgQ2xpZW50IGNlcnRpZmljYXRlIHRvIHByZXNlbnQgd2hlbiBkb2luZyBjbGllbnQtYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydCB7XG4gIC8qKlxuICAgKiBjb25maWdNYXAgZGVmaW5lcyB0aGUgQ29uZmlnTWFwIGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnQjY29uZmlnTWFwXG4gICAqL1xuICByZWFkb25seSBjb25maWdNYXA/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0Q29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnQjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29uZmlnTWFwJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0KG9iai5zZWNyZXQpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICoga2V5U2VjcmV0IGRlZmluZXMgdGhlIFNlY3JldCBjb250YWluaW5nIHRoZSBjbGllbnQga2V5IGZpbGUgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnS2V5U2VjcmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnS2V5U2VjcmV0IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdLZXlTZWNyZXQjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdLZXlTZWNyZXQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnS2V5U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldChvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBtYXhWZXJzaW9uIGRlZmluZXMgdGhlIG1heGltdW0gYWNjZXB0YWJsZSBUTFMgdmVyc2lvbi5cbiAqXG4gKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQxLjAgb3IgVGhhbm9zID49IHYwLjMxLjAuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdNYXhWZXJzaW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ01heFZlcnNpb24ge1xuICAvKiogVExTMTAgKi9cbiAgVExTMTAgPSBcIlRMUzEwXCIsXG4gIC8qKiBUTFMxMSAqL1xuICBUTFMxMSA9IFwiVExTMTFcIixcbiAgLyoqIFRMUzEyICovXG4gIFRMUzEyID0gXCJUTFMxMlwiLFxuICAvKiogVExTMTMgKi9cbiAgVExTMTMgPSBcIlRMUzEzXCIsXG59XG5cbi8qKlxuICogbWluVmVyc2lvbiBkZWZpbmVzIHRoZSBtaW5pbXVtIGFjY2VwdGFibGUgVExTIHZlcnNpb24uXG4gKlxuICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4zNS4wIG9yIFRoYW5vcyA+PSB2MC4yOC4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnTWluVmVyc2lvblxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdNaW5WZXJzaW9uIHtcbiAgLyoqIFRMUzEwICovXG4gIFRMUzEwID0gXCJUTFMxMFwiLFxuICAvKiogVExTMTEgKi9cbiAgVExTMTEgPSBcIlRMUzExXCIsXG4gIC8qKiBUTFMxMiAqL1xuICBUTFMxMiA9IFwiVExTMTJcIixcbiAgLyoqIFRMUzEzICovXG4gIFRMUzEzID0gXCJUTFMxM1wiLFxufVxuXG4vKipcbiAqIGNvbmZpZ01hcCBkZWZpbmVzIHRoZSBDb25maWdNYXAgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZENvbmZpZ01hcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkQ29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkQ29uZmlnTWFwI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkQ29uZmlnTWFwI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXAnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXAob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZENvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IG9mIHRoZSBzZWNyZXQgdG8gc2VsZWN0IGZyb20uICBNdXN0IGJlIGEgdmFsaWQgc2VjcmV0IGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0I29wdGlvbmFsXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRTZWNyZXQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ29wdGlvbmFsJzogb2JqLm9wdGlvbmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY2EgZGVmaW5lcyB0aGUgQ2VydGlmaWNhdGUgYXV0aG9yaXR5IHVzZWQgd2hlbiB2ZXJpZnlpbmcgc2VydmVyIGNlcnRpZmljYXRlcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2Ege1xuICAvKipcbiAgICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYSNjb25maWdNYXBcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ01hcD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhI3NlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FTZWNyZXQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2EgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb25maWdNYXAnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldChvYmouc2VjcmV0KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNlcnQgZGVmaW5lcyB0aGUgQ2xpZW50IGNlcnRpZmljYXRlIHRvIHByZXNlbnQgd2hlbiBkb2luZyBjbGllbnQtYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydCB7XG4gIC8qKlxuICAgKiBjb25maWdNYXAgZGVmaW5lcyB0aGUgQ29uZmlnTWFwIGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQjY29uZmlnTWFwXG4gICAqL1xuICByZWFkb25seSBjb25maWdNYXA/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0Q29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29uZmlnTWFwJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0KG9iai5zZWNyZXQpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICoga2V5U2VjcmV0IGRlZmluZXMgdGhlIFNlY3JldCBjb250YWluaW5nIHRoZSBjbGllbnQga2V5IGZpbGUgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdLZXlTZWNyZXQjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdLZXlTZWNyZXQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldChvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBtYXhWZXJzaW9uIGRlZmluZXMgdGhlIG1heGltdW0gYWNjZXB0YWJsZSBUTFMgdmVyc2lvbi5cbiAqXG4gKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQxLjAgb3IgVGhhbm9zID49IHYwLjMxLjAuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdNYXhWZXJzaW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ01heFZlcnNpb24ge1xuICAvKiogVExTMTAgKi9cbiAgVExTMTAgPSBcIlRMUzEwXCIsXG4gIC8qKiBUTFMxMSAqL1xuICBUTFMxMSA9IFwiVExTMTFcIixcbiAgLyoqIFRMUzEyICovXG4gIFRMUzEyID0gXCJUTFMxMlwiLFxuICAvKiogVExTMTMgKi9cbiAgVExTMTMgPSBcIlRMUzEzXCIsXG59XG5cbi8qKlxuICogbWluVmVyc2lvbiBkZWZpbmVzIHRoZSBtaW5pbXVtIGFjY2VwdGFibGUgVExTIHZlcnNpb24uXG4gKlxuICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4zNS4wIG9yIFRoYW5vcyA+PSB2MC4yOC4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnTWluVmVyc2lvblxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdNaW5WZXJzaW9uIHtcbiAgLyoqIFRMUzEwICovXG4gIFRMUzEwID0gXCJUTFMxMFwiLFxuICAvKiogVExTMTEgKi9cbiAgVExTMTEgPSBcIlRMUzExXCIsXG4gIC8qKiBUTFMxMiAqL1xuICBUTFMxMiA9IFwiVExTMTJcIixcbiAgLyoqIFRMUzEzICovXG4gIFRMUzEzID0gXCJUTFMxM1wiLFxufVxuXG4vKipcbiAqIGNvbmZpZ01hcCBkZWZpbmVzIHRoZSBDb25maWdNYXAgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYUNvbmZpZ01hcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYUNvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IG9mIHRoZSBzZWNyZXQgdG8gc2VsZWN0IGZyb20uICBNdXN0IGJlIGEgdmFsaWQgc2VjcmV0IGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhU2VjcmV0I29wdGlvbmFsXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhU2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhU2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FTZWNyZXQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ29wdGlvbmFsJzogb2JqLm9wdGlvbmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0Q29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXAja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydENvbmZpZ01hcCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIENvbmZpZ01hcCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydENvbmZpZ01hcCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0Q29uZmlnTWFwKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydENvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydFNlY3JldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRTZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydFNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0I25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydFNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRTZWNyZXQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNvbmZpZ01hcCBkZWZpbmVzIHRoZSBDb25maWdNYXAgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYUNvbmZpZ01hcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYUNvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IG9mIHRoZSBzZWNyZXQgdG8gc2VsZWN0IGZyb20uICBNdXN0IGJlIGEgdmFsaWQgc2VjcmV0IGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhU2VjcmV0I29wdGlvbmFsXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhU2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhU2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FTZWNyZXQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ29wdGlvbmFsJzogb2JqLm9wdGlvbmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0Q29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXAja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydENvbmZpZ01hcCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIENvbmZpZ01hcCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydENvbmZpZ01hcCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0Q29uZmlnTWFwKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydENvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydFNlY3JldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRTZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydFNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0I25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydFNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRTZWNyZXQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4iXX0=
|