breeze-client 2.1.6-mjs → 2.1.7-mjs
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/LICENSE +1 -1
- package/esm2022/src/abstract-data-service-adapter.mjs +68 -37
- package/esm2022/src/entity-query.mjs +23 -4
- package/fesm2022/breeze-client.mjs +88 -38
- package/fesm2022/breeze-client.mjs.map +1 -1
- package/package.json +1 -1
- package/src/abstract-data-service-adapter.d.ts +20 -0
- package/src/entity-query.d.ts +17 -3
package/LICENSE
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { core } from './core';
|
|
2
2
|
import { config } from './config';
|
|
3
3
|
import { JsonResultsAdapter } from './data-service';
|
|
4
|
-
import { MetadataStore } from './entity-metadata';
|
|
4
|
+
import { EntityType, MetadataStore } from './entity-metadata';
|
|
5
5
|
/** For use by breeze plugin authors only. The class is used as the base class for most [[IDataServiceAdapter]] implementations
|
|
6
6
|
@adapter (see [[IDataServiceAdapter]])
|
|
7
7
|
@hidden
|
|
@@ -57,51 +57,82 @@ export class AbstractDataServiceAdapter {
|
|
|
57
57
|
});
|
|
58
58
|
return promise;
|
|
59
59
|
}
|
|
60
|
+
/** Execute the query in the mappingContext using the ajaxImpl. */
|
|
60
61
|
executeQuery(mappingContext) {
|
|
61
62
|
mappingContext.adapter = this;
|
|
63
|
+
const usePost = mappingContext.query.usePostEnabled;
|
|
64
|
+
const params = usePost ? this._makeQueryPostParams(mappingContext) : this._makeQueryGetParams(mappingContext);
|
|
62
65
|
let promise = new Promise((resolve, reject) => {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
try {
|
|
72
|
-
let rData;
|
|
73
|
-
let results = data && (data.results || data.Results);
|
|
74
|
-
if (results) {
|
|
75
|
-
rData = { results: results, inlineCount: data.inlineCount || data.InlineCount,
|
|
76
|
-
httpResponse: httpResponse, query: mappingContext.query };
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
rData = { results: data, httpResponse: httpResponse, query: mappingContext.query };
|
|
80
|
-
}
|
|
81
|
-
resolve(rData);
|
|
66
|
+
params.success = function (httpResponse) {
|
|
67
|
+
let data = httpResponse.data;
|
|
68
|
+
try {
|
|
69
|
+
let rData;
|
|
70
|
+
let results = data && (data.results || data.Results);
|
|
71
|
+
if (results) {
|
|
72
|
+
rData = { results: results, inlineCount: data.inlineCount || data.InlineCount,
|
|
73
|
+
httpResponse: httpResponse, query: mappingContext.query };
|
|
82
74
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
reject(e);
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
handleHttpError(reject, httpResponse);
|
|
89
|
-
}
|
|
75
|
+
else {
|
|
76
|
+
rData = { results: data, httpResponse: httpResponse, query: mappingContext.query };
|
|
90
77
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
78
|
+
resolve(rData);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
if (e instanceof Error) {
|
|
82
|
+
reject(e);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
handleHttpError(reject, httpResponse);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
params.error = function (httpResponse) {
|
|
90
|
+
handleHttpError(reject, httpResponse);
|
|
96
91
|
};
|
|
97
|
-
if (mappingContext.dataService.useJsonp) {
|
|
98
|
-
params.dataType = 'jsonp';
|
|
99
|
-
params.crossDomain = true;
|
|
100
|
-
}
|
|
101
92
|
this.ajaxImpl.ajax(params);
|
|
102
93
|
});
|
|
103
94
|
return promise;
|
|
104
95
|
}
|
|
96
|
+
/** Set up ajax parameters for query GET. This puts the query into the request querystring in either JSON or OData-style syntax, depending upon the UriBuilder. */
|
|
97
|
+
_makeQueryGetParams(mappingContext) {
|
|
98
|
+
const url = mappingContext.getUrl();
|
|
99
|
+
const params = {
|
|
100
|
+
type: "GET",
|
|
101
|
+
url: url,
|
|
102
|
+
params: mappingContext.query.parameters,
|
|
103
|
+
dataType: 'json',
|
|
104
|
+
crossDomain: false,
|
|
105
|
+
};
|
|
106
|
+
if (mappingContext.dataService.useJsonp) {
|
|
107
|
+
params.dataType = 'jsonp';
|
|
108
|
+
params.crossDomain = true;
|
|
109
|
+
}
|
|
110
|
+
return params;
|
|
111
|
+
}
|
|
112
|
+
/** Set up ajax parameters for query POST. This put the query into the request body as JSON. */
|
|
113
|
+
_makeQueryPostParams(mappingContext) {
|
|
114
|
+
const entityQuery = mappingContext.query;
|
|
115
|
+
const metadataStore = mappingContext.entityManager.metadataStore;
|
|
116
|
+
const url = mappingContext.dataService.qualifyUrl(entityQuery.resourceName);
|
|
117
|
+
let entityType = entityQuery._getFromEntityType(metadataStore, false);
|
|
118
|
+
if (!entityType) {
|
|
119
|
+
entityType = new EntityType(metadataStore);
|
|
120
|
+
}
|
|
121
|
+
const json = entityQuery.toJSONExt({ entityType: entityType, toNameOnServer: true });
|
|
122
|
+
json.from = undefined;
|
|
123
|
+
json.queryOptions = undefined;
|
|
124
|
+
const params = {
|
|
125
|
+
type: "POST",
|
|
126
|
+
url: url,
|
|
127
|
+
params: mappingContext.query.parameters,
|
|
128
|
+
dataType: 'json',
|
|
129
|
+
processData: false,
|
|
130
|
+
contentType: "application/json; charset=UTF-8",
|
|
131
|
+
data: JSON.stringify(json),
|
|
132
|
+
crossDomain: false,
|
|
133
|
+
};
|
|
134
|
+
return params;
|
|
135
|
+
}
|
|
105
136
|
saveChanges(saveContext, saveBundle) {
|
|
106
137
|
let adapter = saveContext.adapter = this;
|
|
107
138
|
let saveBundleSer = adapter._prepareSaveBundle(saveContext, saveBundle);
|
|
@@ -291,4 +322,4 @@ class DefaultChangeRequestInterceptor {
|
|
|
291
322
|
done(requests) {
|
|
292
323
|
}
|
|
293
324
|
}
|
|
294
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZGF0YS1zZXJ2aWNlLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWJzdHJhY3QtZGF0YS1zZXJ2aWNlLWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM5QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBS2xDLE9BQU8sRUFBZSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRDs7O0VBR0U7QUFDRixNQUFNLE9BQWdCLDBCQUEwQjtJQVE5QyxxQkFBcUI7SUFDckIscUJBQXFCLENBQUMsd0JBQTZCO1FBQ2pELElBQUksd0JBQXdCLENBQUMsYUFBYSxLQUFLLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxTQUFTLEVBQUU7WUFDM0YsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO0lBQ0gsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBYyxNQUFNLENBQUcsQ0FBQztRQUVqRSxtSEFBbUg7UUFDbkgsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQ3ZDLE9BQU87U0FDUjtRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3RHLENBQUM7SUFFRCxhQUFhLENBQUMsYUFBNEIsRUFBRSxXQUF3QjtRQUNsRSxJQUFJLFdBQVcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDO1FBQzFDLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFN0MsSUFBSSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFFNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ2pCLElBQUksRUFBRSxLQUFLO2dCQUNYLEdBQUcsRUFBRSxHQUFHO2dCQUNSLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUEwQixFQUFFLEVBQUU7b0JBRXRDLDJDQUEyQztvQkFDM0MsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFO3dCQUM3QyxPQUFPLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3FCQUNuQztvQkFDRCxJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO29CQUM3QixJQUFJLFFBQWEsQ0FBQztvQkFDbEIsSUFBSTt3QkFDRixRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO3dCQUNoRSxhQUFhLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUN4QztvQkFBQyxPQUFPLENBQUMsRUFBRTt3QkFDVixJQUFJLE1BQU0sR0FBRyw2Q0FBNkMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDO3dCQUN2RSxlQUFlLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSw2QkFBNkIsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDO3FCQUM1RjtvQkFFRCwwQ0FBMEM7b0JBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFO3dCQUM5QyxhQUFhLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO3FCQUMzQztvQkFFRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRXBCLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsWUFBMEIsRUFBRSxFQUFFO29CQUNwQyxlQUFlLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSw2QkFBNkIsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDN0UsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFlBQVksQ0FBQyxjQUE4QjtRQUN6QyxjQUFjLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBYyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN6RCxJQUFJLEdBQUcsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFbEMsSUFBSSxNQUFNLEdBQUc7Z0JBQ1gsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsR0FBRyxFQUFFLEdBQUc7Z0JBQ1IsTUFBTSxFQUFHLGNBQWMsQ0FBQyxLQUFxQixDQUFDLFVBQVU7Z0JBQ3hELFFBQVEsRUFBRSxNQUFNO2dCQUNoQixPQUFPLEVBQUUsVUFBVSxZQUEwQjtvQkFDM0MsSUFBSSxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDN0IsSUFBSTt3QkFDRixJQUFJLEtBQWtCLENBQUM7d0JBQ3ZCLElBQUksT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNyRCxJQUFJLE9BQU8sRUFBRTs0QkFDWCxLQUFLLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXO2dDQUMzRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7eUJBQzdEOzZCQUFNOzRCQUNMLEtBQUssR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO3lCQUNwRjt3QkFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ2hCO29CQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUNWLElBQUksQ0FBQyxZQUFZLEtBQUssRUFBRTs0QkFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUNYOzZCQUFNOzRCQUNMLGVBQWUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7eUJBQ3ZDO3FCQUNGO2dCQUVILENBQUM7Z0JBQ0QsS0FBSyxFQUFFLFVBQVUsWUFBMEI7b0JBQ3pDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ3hDLENBQUM7Z0JBQ0QsV0FBVyxFQUFFLEtBQUs7YUFDbkIsQ0FBQztZQUNGLElBQUksY0FBYyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO2dCQUMxQixNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzthQUMzQjtZQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFdBQVcsQ0FBQyxXQUF3QixFQUFFLFVBQXNCO1FBQzFELElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBRXpDLElBQUksYUFBYSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUUzQyxJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkUsSUFBSSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ2pCLElBQUksRUFBRSxNQUFNO2dCQUNaLEdBQUcsRUFBRSxHQUFHO2dCQUNSLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixXQUFXLEVBQUUsa0JBQWtCO2dCQUMvQixJQUFJLEVBQUUsTUFBTTtnQkFDWixPQUFPLEVBQUUsVUFBVSxZQUEwQjtvQkFDM0MsWUFBWSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7b0JBQ3ZDLElBQUksSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUM7b0JBQzdCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUM5QixlQUFlLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO3FCQUN2Qzt5QkFBTTt3QkFDTCxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUMvRCxVQUFVLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQzt3QkFDdkMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUNyQjtnQkFDSCxDQUFDO2dCQUNELEtBQUssRUFBRSxVQUFVLFlBQTBCO29CQUN6QyxZQUFZLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztvQkFDdkMsZUFBZSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDeEMsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOztNQUVFO0lBQ0Ysa0JBQWtCLENBQUMsV0FBd0IsRUFBRSxVQUFzQjtRQUNqRSw4REFBOEQ7UUFDOUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlCRztJQUNILHdCQUF3QixHQUFpQywrQkFBK0IsQ0FBQztJQUV6Rix3QkFBd0I7SUFDeEIsK0JBQStCLENBQUMsV0FBd0IsRUFBRSxVQUFzQjtRQUM5RSxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBUSxDQUFDO1FBQ25DLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztRQUMzQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRTNCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxnREFBZ0QsQ0FBQztZQUMxRSxJQUFJLElBQUksR0FBRyxnQ0FBZ0MsQ0FBQztZQUM1QyxJQUFJLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsQ0FBQzthQUM3QztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUM7YUFDdkM7WUFDRCxPQUFPLFdBQVcsQ0FBQztTQUNwQjthQUFNO1lBQ0wsT0FBTyxJQUFJLCtCQUErQixDQUFDLFdBQVcsRUFBRSxVQUFVLENBQTZCLENBQUM7U0FDakc7SUFDSCxDQUFDO0lBRUQ7O01BRUU7SUFDRixrQkFBa0IsQ0FBQyxXQUF3QixFQUFFLElBQVM7UUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFHRDs7TUFFRTtJQUNGLHFEQUFxRDtJQUNyRCxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBZ0I7UUFDN0MsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRTtZQUMzQyxHQUFHLENBQUMsT0FBTyxHQUFHLDBDQUEwQztnQkFDdEQsa0VBQWtFLENBQUM7U0FDdEU7SUFDSCxDQUFDO0lBRUQsa0JBQWtCLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQztRQUMxQyxJQUFJLEVBQUUsTUFBTTtRQUVaLFNBQVMsRUFBRSxXQUFVLHVDQUF1QztZQUMxRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7S0FDRixDQUFDLENBQUM7Q0FDSjtBQUVELFNBQVMsZUFBZSxDQUFDLE1BQThCLEVBQUUsWUFBMEIsRUFBRSxhQUFzQjtJQUN6RyxJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEMsMEJBQTBCLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEQsSUFBSSxhQUFhLEVBQUU7UUFDakIsR0FBRyxDQUFDLE9BQU8sR0FBRyxhQUFhLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7S0FDbEQ7SUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsWUFBMEI7SUFDN0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQWlCLENBQUM7SUFDckMsR0FBRyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDaEMsR0FBRyxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBRWpDLElBQUksTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFFL0IsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNYLEdBQUcsQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xFLE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFFRCxzR0FBc0c7SUFDdEcscUJBQXFCO0lBQ3JCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1FBQzlCLElBQUk7WUFDRixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM3QjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsK0RBQStEO1lBQy9ELEdBQUcsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLE9BQU8sR0FBRyxDQUFDO1NBQ1o7S0FDRjtJQUVELElBQUksV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUM7SUFFM0MsMkRBQTJEO0lBQzNELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1RixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ3JCLElBQUksT0FBZSxFQUFFLFlBQW1CLENBQUM7SUFDekMsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNiLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3pCLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUM7S0FDckQ7U0FBTTtRQUNMLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQztRQUNqQixHQUFHO1lBQ0QsMEZBQTBGO1lBQzFGLHNDQUFzQztZQUN0QyxPQUFPLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFDOUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUM7U0FDMUIsUUFBUSxHQUFHLEVBQUU7UUFDZCxnSEFBZ0g7UUFDaEgsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQztRQUNwRCxZQUFZLEdBQUcsWUFBWSxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1lBQ3pELE9BQU87Z0JBQ0wsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO2dCQUN0QixjQUFjLEVBQUUsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7Z0JBQ2pFLFNBQVMsRUFBRSxDQUFDLENBQUMsU0FBUztnQkFDdEIsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZO2dCQUM1QixZQUFZLEVBQUUsQ0FBQyxDQUFDLFlBQVk7Z0JBQzVCLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTTthQUNqQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUVELElBQUksV0FBVyxJQUFJLFlBQVksRUFBRTtRQUUvQixJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQztRQUNyRyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUM5QixDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztRQUNGLEdBQTJCLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztLQUMxRDtJQUVELEdBQUcsQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLGlHQUFpRyxDQUFDO0lBQzNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUdELDJFQUEyRTtBQUMzRSxNQUFNLCtCQUErQjtJQUNuQyxZQUFZLFdBQXdCLEVBQUUsVUFBc0I7SUFFNUQsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFZLEVBQUUsTUFBYyxFQUFFLEtBQWE7UUFDcEQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELElBQUksQ0FBQyxRQUFrQjtJQUN2QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3JlIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xyXG5pbXBvcnQgeyBFbnRpdHlRdWVyeSB9IGZyb20gJy4vZW50aXR5LXF1ZXJ5JztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2VBZGFwdGVyLCBBamF4QWRhcHRlciwgQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yQ3RvciwgQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yIH0gZnJvbSAnLi9pbnRlcmZhY2UtcmVnaXN0cnknO1xyXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuL2VudGl0eS1hc3BlY3QnO1xyXG5pbXBvcnQgeyBNYXBwaW5nQ29udGV4dCB9IGZyb20gJy4vbWFwcGluZy1jb250ZXh0JztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2UsIEpzb25SZXN1bHRzQWRhcHRlciB9IGZyb20gJy4vZGF0YS1zZXJ2aWNlJztcclxuaW1wb3J0IHsgSHR0cFJlc3BvbnNlLCBTYXZlQ29udGV4dCwgU2F2ZUJ1bmRsZSwgU2VydmVyRXJyb3IsIFNhdmVSZXN1bHQsIFNhdmVFcnJvckZyb21TZXJ2ZXIsIFF1ZXJ5UmVzdWx0IH0gZnJvbSAnLi9lbnRpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IE1ldGFkYXRhU3RvcmUgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gIFRoZSBjbGFzcyBpcyB1c2VkIGFzIHRoZSBiYXNlIGNsYXNzIGZvciBtb3N0IFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uc1xyXG5AYWRhcHRlciAoc2VlIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlblxyXG4qL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYXRhU2VydmljZUFkYXB0ZXIgaW1wbGVtZW50cyBEYXRhU2VydmljZUFkYXB0ZXIge1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIGRlY2xhcmUgXyRpbXBsPzogYW55O1xyXG4gIC8qKiBUaGUgbmFtZSBvZiB0aGlzIGFkYXB0ZXIuICovXHJcbiAgZGVjbGFyZSBuYW1lOiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBbW0lBamF4QWRhcHRlcl1dIHVzZWQgYnkgdGhpcyBbW0lEYXRhU2VydmljZUFkYXB0ZXJdXS4gKi9cclxuICBkZWNsYXJlIGFqYXhJbXBsOiBBamF4QWRhcHRlcjtcclxuXHJcbiAgLy8gVE9ETyB1c2UgaW50ZXJmYWNlXHJcbiAgY2hlY2tGb3JSZWNvbXBvc2l0aW9uKGludGVyZmFjZUluaXRpYWxpemVkQXJnczogYW55KSB7XHJcbiAgICBpZiAoaW50ZXJmYWNlSW5pdGlhbGl6ZWRBcmdzLmludGVyZmFjZU5hbWUgPT09IFwiYWpheFwiICYmIGludGVyZmFjZUluaXRpYWxpemVkQXJncy5pc0RlZmF1bHQpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplKCkge1xyXG4gICAgdGhpcy5hamF4SW1wbCA9IGNvbmZpZy5nZXRBZGFwdGVySW5zdGFuY2U8QWpheEFkYXB0ZXI+KFwiYWpheFwiKSAhO1xyXG5cclxuICAgIC8vIGRvbid0IGNhY2hlICdhamF4JyBiZWNhdXNlIHRoZW4gd2Ugd291bGQgbmVlZCB0byBcIi5iaW5kXCIgaXQsIGFuZCBkb24ndCB3YW50IHRvIGJlY2F1c2Ugb2YgYnJvd2VyIHN1cHBvcnQgaXNzdWVzLlxyXG4gICAgaWYgKHRoaXMuYWpheEltcGwgJiYgdGhpcy5hamF4SW1wbC5hamF4KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBmaW5kIGFqYXggYWRhcHRlciBmb3IgZGF0YXNlcnZpY2UgYWRhcHRlciAnXCIgKyAodGhpcy5uYW1lIHx8ICcnKSArIFwiJy5cIik7XHJcbiAgfVxyXG5cclxuICBmZXRjaE1ldGFkYXRhKG1ldGFkYXRhU3RvcmU6IE1ldGFkYXRhU3RvcmUsIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSkge1xyXG4gICAgbGV0IHNlcnZpY2VOYW1lID0gZGF0YVNlcnZpY2Uuc2VydmljZU5hbWU7XHJcbiAgICBsZXQgdXJsID0gZGF0YVNlcnZpY2UucXVhbGlmeVVybChcIk1ldGFkYXRhXCIpO1xyXG5cclxuICAgIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5hamF4SW1wbC5hamF4KHtcclxuICAgICAgICB0eXBlOiBcIkdFVFwiLFxyXG4gICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgc3VjY2VzczogKGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlKSA9PiB7XHJcblxyXG4gICAgICAgICAgLy8gbWlnaHQgaGF2ZSBiZWVuIGZldGNoZWQgYnkgYW5vdGhlciBxdWVyeVxyXG4gICAgICAgICAgaWYgKG1ldGFkYXRhU3RvcmUuaGFzTWV0YWRhdGFGb3Ioc2VydmljZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiYWxyZWFkeSBmZXRjaGVkXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IGRhdGEgPSBodHRwUmVzcG9uc2UuZGF0YTtcclxuICAgICAgICAgIGxldCBtZXRhZGF0YTogYW55O1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbWV0YWRhdGEgPSB0eXBlb2YgKGRhdGEpID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGE7XHJcbiAgICAgICAgICAgIG1ldGFkYXRhU3RvcmUuaW1wb3J0TWV0YWRhdGEobWV0YWRhdGEpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsZXQgZXJyTXNnID0gXCJVbmFibGUgdG8gZWl0aGVyIHBhcnNlIG9yIGltcG9ydCBtZXRhZGF0YTogXCIgKyBlLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgIGhhbmRsZUh0dHBFcnJvcihyZWplY3QsIGh0dHBSZXNwb25zZSwgXCJNZXRhZGF0YSBxdWVyeSBmYWlsZWQgZm9yOiBcIiArIHVybCArIFwiLiBcIiArIGVyck1zZyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaW1wb3J0IG1heSBoYXZlIGJyb3VnaHQgaW4gdGhlIHNlcnZpY2UuXHJcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhU3RvcmUuaGFzTWV0YWRhdGFGb3Ioc2VydmljZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIG1ldGFkYXRhU3RvcmUuYWRkRGF0YVNlcnZpY2UoZGF0YVNlcnZpY2UpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJlc29sdmUobWV0YWRhdGEpO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoaHR0cFJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGhhbmRsZUh0dHBFcnJvcihyZWplY3QsIGh0dHBSZXNwb25zZSwgXCJNZXRhZGF0YSBxdWVyeSBmYWlsZWQgZm9yOiBcIiArIHVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHByb21pc2U7XHJcbiAgfVxyXG5cclxuICBleGVjdXRlUXVlcnkobWFwcGluZ0NvbnRleHQ6IE1hcHBpbmdDb250ZXh0KSB7XHJcbiAgICBtYXBwaW5nQ29udGV4dC5hZGFwdGVyID0gdGhpcztcclxuICAgIGxldCBwcm9taXNlID0gbmV3IFByb21pc2U8UXVlcnlSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbGV0IHVybCA9IG1hcHBpbmdDb250ZXh0LmdldFVybCgpO1xyXG5cclxuICAgICAgbGV0IHBhcmFtcyA9IHtcclxuICAgICAgICB0eXBlOiBcIkdFVFwiLFxyXG4gICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgIHBhcmFtczogKG1hcHBpbmdDb250ZXh0LnF1ZXJ5IGFzIEVudGl0eVF1ZXJ5KS5wYXJhbWV0ZXJzLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICBsZXQgZGF0YSA9IGh0dHBSZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJEYXRhOiBRdWVyeVJlc3VsdDtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBkYXRhICYmIChkYXRhLnJlc3VsdHMgfHwgZGF0YS5SZXN1bHRzKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdHMpIHtcclxuICAgICAgICAgICAgICByRGF0YSA9IHsgcmVzdWx0czogcmVzdWx0cywgaW5saW5lQ291bnQ6IGRhdGEuaW5saW5lQ291bnQgfHwgZGF0YS5JbmxpbmVDb3VudCwgXHJcbiAgICAgICAgICAgICAgICBodHRwUmVzcG9uc2U6IGh0dHBSZXNwb25zZSwgcXVlcnk6IG1hcHBpbmdDb250ZXh0LnF1ZXJ5IH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgckRhdGEgPSB7IHJlc3VsdHM6IGRhdGEsIGh0dHBSZXNwb25zZTogaHR0cFJlc3BvbnNlLCBxdWVyeTogbWFwcGluZ0NvbnRleHQucXVlcnkgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzb2x2ZShyRGF0YSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaGFuZGxlSHR0cEVycm9yKHJlamVjdCwgaHR0cFJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbiAoaHR0cFJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpIHtcclxuICAgICAgICAgIGhhbmRsZUh0dHBFcnJvcihyZWplY3QsIGh0dHBSZXNwb25zZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjcm9zc0RvbWFpbjogZmFsc2VcclxuICAgICAgfTtcclxuICAgICAgaWYgKG1hcHBpbmdDb250ZXh0LmRhdGFTZXJ2aWNlLnVzZUpzb25wKSB7XHJcbiAgICAgICAgcGFyYW1zLmRhdGFUeXBlID0gJ2pzb25wJztcclxuICAgICAgICBwYXJhbXMuY3Jvc3NEb21haW4gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYWpheEltcGwuYWpheChwYXJhbXMpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG4gIHNhdmVDaGFuZ2VzKHNhdmVDb250ZXh0OiBTYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZTogU2F2ZUJ1bmRsZSkge1xyXG4gICAgbGV0IGFkYXB0ZXIgPSBzYXZlQ29udGV4dC5hZGFwdGVyID0gdGhpcztcclxuXHJcbiAgICBsZXQgc2F2ZUJ1bmRsZVNlciA9IGFkYXB0ZXIuX3ByZXBhcmVTYXZlQnVuZGxlKHNhdmVDb250ZXh0LCBzYXZlQnVuZGxlKTtcclxuICAgIGxldCBidW5kbGUgPSBKU09OLnN0cmluZ2lmeShzYXZlQnVuZGxlU2VyKTtcclxuXHJcbiAgICBsZXQgdXJsID0gc2F2ZUNvbnRleHQuZGF0YVNlcnZpY2UucXVhbGlmeVVybChzYXZlQ29udGV4dC5yZXNvdXJjZU5hbWUpO1xyXG4gICAgbGV0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxTYXZlUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuYWpheEltcGwuYWpheCh7XHJcbiAgICAgICAgdHlwZTogXCJQT1NUXCIsXHJcbiAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgZGF0YTogYnVuZGxlLFxyXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChodHRwUmVzcG9uc2U6IEh0dHBSZXNwb25zZSkge1xyXG4gICAgICAgICAgaHR0cFJlc3BvbnNlLnNhdmVDb250ZXh0ID0gc2F2ZUNvbnRleHQ7XHJcbiAgICAgICAgICBsZXQgZGF0YSA9IGh0dHBSZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgaWYgKGRhdGEuRXJyb3JzIHx8IGRhdGEuZXJyb3JzKSB7XHJcbiAgICAgICAgICAgIGhhbmRsZUh0dHBFcnJvcihyZWplY3QsIGh0dHBSZXNwb25zZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgc2F2ZVJlc3VsdCA9IGFkYXB0ZXIuX3ByZXBhcmVTYXZlUmVzdWx0KHNhdmVDb250ZXh0LCBkYXRhKTtcclxuICAgICAgICAgICAgc2F2ZVJlc3VsdC5odHRwUmVzcG9uc2UgPSBodHRwUmVzcG9uc2U7XHJcbiAgICAgICAgICAgIHJlc29sdmUoc2F2ZVJlc3VsdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICBodHRwUmVzcG9uc2Uuc2F2ZUNvbnRleHQgPSBzYXZlQ29udGV4dDtcclxuICAgICAgICAgIGhhbmRsZUh0dHBFcnJvcihyZWplY3QsIGh0dHBSZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBwcm9taXNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFic3RyYWN0IG1ldGhvZCB0aGF0IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGluIGFueSBjb25jcmV0ZSBEYXRhU2VydmljZUFkYXB0ZXIgc3ViY2xhc3MuIFxyXG4gIFRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGlzIG1ldGhvZCBzaG91bGQgYmUgYSBzZXJpYWxpemFibGUgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIgYWZ0ZXIgY2FsbGluZyBKU09OLnN0cmluZ2lmeSBvbiBpdC5cclxuICAqL1xyXG4gIF9wcmVwYXJlU2F2ZUJ1bmRsZShzYXZlQ29udGV4dDogU2F2ZUNvbnRleHQsIHNhdmVCdW5kbGU6IFNhdmVCdW5kbGUpOiBhbnkge1xyXG4gICAgLy8gVGhlIGltcGxlbWVudG9yIHNob3VsZCBjYWxsIF9jcmVhdGVDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3JcclxuICAgIHRocm93IG5ldyBFcnJvcihcIk5lZWQgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBfcHJlcGFyZVNhdmVCdW5kbGVcIik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGEgXCJDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3JcIlxyXG4gIHRoYXQgY2FuIHR3ZWFrIHRoZSBzYXZlQnVuZGxlIGJvdGggYXMgaXQgaXMgYnVpbHQgYW5kIHdoZW4gaXQgaXMgY29tcGxldGVkXHJcbiAgYnkgYSBjb25jcmV0ZSBEYXRhU2VydmljZUFkYXBhdGVyLlxyXG5cclxuICBJbml0aWFsaXplZCB3aXRoIGEgZGVmYXVsdCwgbm8tb3AgaW1wbGVtZW50YXRpb24gdGhhdCBkZXZlbG9wZXJzIGNhbiByZXBsYWNlIHdpdGggYVxyXG4gIHN1YnN0YW50aXZlIGltcGxlbWVudGF0aW9uIHRoYXQgY2hhbmdlcyB0aGUgaW5kaXZpZHVhbCBlbnRpdHkgY2hhbmdlIHJlcXVlc3RzXHJcbiAgb3IgYXNwZWN0cyBvZiB0aGUgZW50aXJlICdzYXZlQnVuZGxlJyB3aXRob3V0IGhhdmluZyB0byB3cml0ZSB0aGVpciBvd24gRGF0YVNlcnZpY2UgYWRhcHRlcnMuXHJcbiAgPiAgICAgbGV0IGFkYXB0ZXIgPSBicmVlemUuY29uZmlnLmdldEFkYXB0ZXJJbnN0YW5jZSgnZGF0YVNlcnZpY2UnKTtcclxuICA+ICAgICBhZGFwdGVyLmNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvciA9IGZ1bmN0aW9uIChzYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZSkge1xyXG4gID4gICAgICAgICB0aGlzLmdldFJlcXVlc3QgPSBmdW5jdGlvbiAocmVxdWVzdCwgZW50aXR5LCBpbmRleCkge1xyXG4gID4gICAgICAgICAgICAvLyBhbHRlciB0aGUgcmVxdWVzdCB0aGF0IHRoZSBhZGFwdGVyIHByZXBhcmVkIGZvciB0aGlzIGVudGl0eVxyXG4gID4gICAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUgZW50aXR5LCBzYXZlQ29udGV4dCwgYW5kIHNhdmVCdW5kbGVcclxuICA+ICAgICAgICAgICAgLy8gZS5nLiwgYWRkIGEgY3VzdG9tIGhlYWRlciBvciBwcnVuZSB0aGUgb3JpZ2luYWxWYWx1ZXNNYXBcclxuICA+ICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgPiAgICAgICAgfTtcclxuICA+ICAgICAgICB0aGlzLmRvbmUgPSBmdW5jdGlvbiAocmVxdWVzdHMpIHtcclxuICA+ICAgICAgICAgICAgLy8gYWx0ZXIgdGhlIGFycmF5IG9mIHJlcXVlc3RzIHJlcHJlc2VudGluZyB0aGUgZW50aXJlIGNoYW5nZS1zZXRcclxuICA+ICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIHNhdmVDb250ZXh0IGFuZCBzYXZlQnVuZGxlXHJcbiAgPiAgICAgICAgfTtcclxuICA+ICAgICB9XHJcblxyXG4gIEBwYXJhbSBzYXZlQ29udGV4dCAtIFRoZSBCcmVlemVKUyBcImNvbnRleHRcIiBmb3IgdGhlIHNhdmUgb3BlcmF0aW9uLlxyXG4gIEBwYXJhbSBzYXZlQnVuZGxlIC0gQ29udGFpbnMgdGhlIGFycmF5IG9mIGVudGl0aWVzLXRvLWJlLXNhdmVkIChBS0EsIHRoZSBlbnRpdHkgY2hhbmdlLXNldCkuXHJcbiAgQHJldHVybiBDb25zdHJ1Y3RvciBmb3IgYSBcIkNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvclwiLlxyXG4gICoqL1xyXG4gIGNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvcjogQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yQ3RvciA9IERlZmF1bHRDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3I7XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9jcmVhdGVDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3Ioc2F2ZUNvbnRleHQ6IFNhdmVDb250ZXh0LCBzYXZlQnVuZGxlOiBTYXZlQnVuZGxlKSB7XHJcbiAgICBsZXQgYWRhcHRlciA9IHNhdmVDb250ZXh0LmFkYXB0ZXIhO1xyXG4gICAgbGV0IGNyaSA9IGFkYXB0ZXIuY2hhbmdlUmVxdWVzdEludGVyY2VwdG9yO1xyXG4gICAgbGV0IGlzRm4gPSBjb3JlLmlzRnVuY3Rpb247XHJcblxyXG4gICAgaWYgKGlzRm4oY3JpKSkge1xyXG4gICAgICBsZXQgcHJlID0gYWRhcHRlci5uYW1lICsgXCIgRGF0YVNlcnZpY2VBZGFwdGVyJ3MgQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yXCI7XHJcbiAgICAgIGxldCBwb3N0ID0gXCIgaXMgbWlzc2luZyBvciBub3QgYSBmdW5jdGlvbi5cIjtcclxuICAgICAgbGV0IGludGVyY2VwdG9yID0gbmV3IGNyaShzYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZSk7XHJcbiAgICAgIGlmICghaXNGbihpbnRlcmNlcHRvci5nZXRSZXF1ZXN0KSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcmUgKyAnLmdldFJlcXVlc3QnICsgcG9zdCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpc0ZuKGludGVyY2VwdG9yLmRvbmUpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByZSArICcuZG9uZScgKyBwb3N0KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gaW50ZXJjZXB0b3I7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbmV3IERlZmF1bHRDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3Ioc2F2ZUNvbnRleHQsIHNhdmVCdW5kbGUpIGFzIENoYW5nZVJlcXVlc3RJbnRlcmNlcHRvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBBYnN0cmFjdCBtZXRob2QgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBpbiBhbnkgY29uY3JldGUgRGF0YVNlcnZpY2VBZGFwdGVyIHN1YmxjbGFzcy4gXHJcbiAgVGhpcyBtZXRob2QgbmVlZHMgdG8gdGFrZSB0aGUgcmVzdWx0IHJldHVybmVkIHRoZSBzZXJ2ZXIgYW5kIGNvbnZlcnQgaXQgaW50byBhbiBJU2F2ZVJlc3VsdC4gXHJcbiAgKi9cclxuICBfcHJlcGFyZVNhdmVSZXN1bHQoc2F2ZUNvbnRleHQ6IFNhdmVDb250ZXh0LCBkYXRhOiBhbnkpOiBTYXZlUmVzdWx0IHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcIk5lZWQgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBfcHJlcGFyZVNhdmVSZXN1bHRcIik7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIFV0aWxpdHkgbWV0aG9kIHRoYXQgbWF5IGJlIHVzZWQgaW4gYW55IGNvbmNyZXRlIERhdGFTZXJ2aWNlQWRhcHRlciBzdWJsY2xhc3MgdG8gaGFuZGxlIGFueSBcclxuICBodHRwIGNvbm5lY3Rpb24gaXNzdWVzLiBcclxuICAqL1xyXG4gIC8vIFB1dCB0aGlzIGF0IHRoZSBib3R0b20gb2YgeW91ciBodHRwIGVycm9yIGFuYWx5c2lzXHJcbiAgc3RhdGljIF9jYXRjaE5vQ29ubmVjdGlvbkVycm9yKGVycjogU2VydmVyRXJyb3IpIHtcclxuICAgIGlmIChlcnIuc3RhdHVzID09PSAwICYmIGVyci5tZXNzYWdlID09IG51bGwpIHtcclxuICAgICAgZXJyLm1lc3NhZ2UgPSBcIkhUVFAgcmVzcG9uc2Ugc3RhdHVzIDAgYW5kIG5vIG1lc3NhZ2UuICBcIiArXHJcbiAgICAgICAgXCJMaWtlbHkgZGlkIG5vdCBvciBjb3VsZCBub3QgcmVhY2ggc2VydmVyLiBJcyB0aGUgc2VydmVyIHJ1bm5pbmc/XCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBqc29uUmVzdWx0c0FkYXB0ZXIgPSBuZXcgSnNvblJlc3VsdHNBZGFwdGVyKHtcclxuICAgIG5hbWU6IFwibm9vcFwiLFxyXG5cclxuICAgIHZpc2l0Tm9kZTogZnVuY3Rpb24gKC8qIG5vZGUsIG1hcHBpbmdDb250ZXh0LCBub2RlQ29udGV4dCAqLykge1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZUh0dHBFcnJvcihyZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQsIGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlLCBtZXNzYWdlUHJlZml4Pzogc3RyaW5nKSB7XHJcbiAgbGV0IGVyciA9IGNyZWF0ZUVycm9yKGh0dHBSZXNwb25zZSk7XHJcbiAgQWJzdHJhY3REYXRhU2VydmljZUFkYXB0ZXIuX2NhdGNoTm9Db25uZWN0aW9uRXJyb3IoZXJyKTtcclxuICBpZiAobWVzc2FnZVByZWZpeCkge1xyXG4gICAgZXJyLm1lc3NhZ2UgPSBtZXNzYWdlUHJlZml4ICsgXCI7IFwiICsgZXJyLm1lc3NhZ2U7XHJcbiAgfVxyXG4gIHJlamVjdChlcnIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVFcnJvcihodHRwUmVzcG9uc2U6IEh0dHBSZXNwb25zZSkge1xyXG4gIGxldCBlcnIgPSBuZXcgRXJyb3IoKSBhcyBTZXJ2ZXJFcnJvcjtcclxuICBlcnIuaHR0cFJlc3BvbnNlID0gaHR0cFJlc3BvbnNlO1xyXG4gIGVyci5zdGF0dXMgPSBodHRwUmVzcG9uc2Uuc3RhdHVzO1xyXG5cclxuICBsZXQgZXJyT2JqID0gaHR0cFJlc3BvbnNlLmRhdGE7XHJcblxyXG4gIGlmICghZXJyT2JqKSB7XHJcbiAgICBlcnIubWVzc2FnZSA9IGh0dHBSZXNwb25zZS5lcnJvciAmJiBodHRwUmVzcG9uc2UuZXJyb3IudG9TdHJpbmcoKTtcclxuICAgIHJldHVybiBlcnI7XHJcbiAgfVxyXG5cclxuICAvLyBzb21lIGFqYXggcHJvdmlkZXJzIHdpbGwgY29udmVydCBlcnJhbnQgcmVzdWx0IGludG8gYW4gb2JqZWN0IChhbmd1bGFyanMpLCBvdGhlcnMgd2lsbCBub3QgKGpRdWVyeSlcclxuICAvLyBpZiBub3QgZG8gaXQgaGVyZS5cclxuICBpZiAodHlwZW9mIGVyck9iaiA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgdHJ5IHtcclxuICAgICAgZXJyT2JqID0gSlNPTi5wYXJzZShlcnJPYmopO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyBzb21ldGltZXMgaHR0cFJlc3BvbnNlLmRhdGEgaXMganVzdCB0aGUgZXJyb3IgbWVzc2FnZSBpdHNlbGZcclxuICAgICAgZXJyLm1lc3NhZ2UgPSBlcnJPYmo7XHJcbiAgICAgIHJldHVybiBlcnI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsZXQgc2F2ZUNvbnRleHQgPSBodHRwUmVzcG9uc2Uuc2F2ZUNvbnRleHQ7XHJcblxyXG4gIC8vIGlmIGFueSBvZiB0aGUgZm9sbG93IHByb3BlcnRpZXMgZXhpc3QgdGhlIHNvdXJjZSBpcyAuTkVUXHJcbiAgbGV0IHRtcCA9IGVyck9iai5NZXNzYWdlIHx8IGVyck9iai5FeGNlcHRpb25NZXNzYWdlIHx8IGVyck9iai5FbnRpdHlFcnJvcnMgfHwgZXJyT2JqLkVycm9ycztcclxuICBsZXQgaXNEb3ROZXQgPSAhIXRtcDtcclxuICBsZXQgbWVzc2FnZTogc3RyaW5nLCBlbnRpdHlFcnJvcnM6IGFueVtdO1xyXG4gIGlmICghaXNEb3ROZXQpIHtcclxuICAgIG1lc3NhZ2UgPSBlcnJPYmoubWVzc2FnZTtcclxuICAgIGVudGl0eUVycm9ycyA9IGVyck9iai5lcnJvcnMgfHwgZXJyT2JqLmVudGl0eUVycm9ycztcclxuICB9IGVsc2Uge1xyXG4gICAgbGV0IHRtcCA9IGVyck9iajtcclxuICAgIGRvIHtcclxuICAgICAgLy8gLk5FVCBleGNlcHRpb25zIGNhbiBwcm92aWRlIGJvdGggRXhjZXB0aW9uTWVzc2FnZSBhbmQgTWVzc2FnZSBidXQgRXhjZXB0aW9uTWV0aG9kIGlmIGl0XHJcbiAgICAgIC8vIGV4aXN0cyBoYXMgYSBtb3JlIGRldGFpbGVkIG1lc3NhZ2UuXHJcbiAgICAgIG1lc3NhZ2UgPSB0bXAuRXhjZXB0aW9uTWVzc2FnZSB8fCB0bXAuTWVzc2FnZTtcclxuICAgICAgdG1wID0gdG1wLklubmVyRXhjZXB0aW9uO1xyXG4gICAgfSB3aGlsZSAodG1wKTtcclxuICAgIC8vIC5FbnRpdHlFcnJvcnMgd2lsbCBvbmx5IG9jY3VyIGFzIGEgcmVzdWx0IG9mIGFuIEVudGl0eUVycm9yc0V4Y2VwdGlvbiBiZWluZyBkZWxpYmVyYXRlbHkgdGhyb3duIG9uIHRoZSBzZXJ2ZXJcclxuICAgIGVudGl0eUVycm9ycyA9IGVyck9iai5FcnJvcnMgfHwgZXJyT2JqLkVudGl0eUVycm9ycztcclxuICAgIGVudGl0eUVycm9ycyA9IGVudGl0eUVycm9ycyAmJiBlbnRpdHlFcnJvcnMubWFwKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZXJyb3JOYW1lOiBlLkVycm9yTmFtZSxcclxuICAgICAgICBlbnRpdHlUeXBlTmFtZTogTWV0YWRhdGFTdG9yZS5ub3JtYWxpemVUeXBlTmFtZShlLkVudGl0eVR5cGVOYW1lKSxcclxuICAgICAgICBrZXlWYWx1ZXM6IGUuS2V5VmFsdWVzLFxyXG4gICAgICAgIHByb3BlcnR5TmFtZTogZS5Qcm9wZXJ0eU5hbWUsXHJcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBlLkVycm9yTWVzc2FnZSxcclxuICAgICAgICBjdXN0b206IGUuQ3VzdG9tXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGlmIChzYXZlQ29udGV4dCAmJiBlbnRpdHlFcnJvcnMpIHtcclxuXHJcbiAgICBsZXQgcHJvcE5hbWVGbiA9IHNhdmVDb250ZXh0LmVudGl0eU1hbmFnZXIubWV0YWRhdGFTdG9yZS5uYW1pbmdDb252ZW50aW9uLnNlcnZlclByb3BlcnR5TmFtZVRvQ2xpZW50O1xyXG4gICAgZW50aXR5RXJyb3JzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcclxuICAgICAgZS5wcm9wZXJ0eU5hbWUgPSBlLnByb3BlcnR5TmFtZSAmJiBwcm9wTmFtZUZuKGUucHJvcGVydHlOYW1lKTtcclxuICAgIH0pO1xyXG4gICAgKGVyciBhcyBTYXZlRXJyb3JGcm9tU2VydmVyKS5lbnRpdHlFcnJvcnMgPSBlbnRpdHlFcnJvcnM7XHJcbiAgfVxyXG5cclxuICBlcnIubWVzc2FnZSA9IG1lc3NhZ2UgfHwgXCJTZXJ2ZXIgc2lkZSBlcnJvcnMgZW5jb3VudGVyZWQgLSBzZWUgdGhlIGVudGl0eUVycm9ycyBjb2xsZWN0aW9uIG9uIHRoaXMgb2JqZWN0IGZvciBtb3JlIGRldGFpbFwiO1xyXG4gIHJldHVybiBlcnI7XHJcbn1cclxuXHJcblxyXG4vKiogVGhpcyBpcyBhIGRlZmF1bHQsIG5vLW9wIGltcGxlbWVudGF0aW9uIHRoYXQgZGV2ZWxvcGVycyBjYW4gcmVwbGFjZS4gKi9cclxuY2xhc3MgRGVmYXVsdENoYW5nZVJlcXVlc3RJbnRlcmNlcHRvciB7XHJcbiAgY29uc3RydWN0b3Ioc2F2ZUNvbnRleHQ6IFNhdmVDb250ZXh0LCBzYXZlQnVuZGxlOiBTYXZlQnVuZGxlKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0UmVxdWVzdChyZXF1ZXN0OiBhbnksIGVudGl0eTogRW50aXR5LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gcmVxdWVzdDtcclxuICB9XHJcblxyXG4gIGRvbmUocmVxdWVzdHM6IE9iamVjdFtdKSB7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
325
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZGF0YS1zZXJ2aWNlLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWJzdHJhY3QtZGF0YS1zZXJ2aWNlLWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM5QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBS2xDLE9BQU8sRUFBZSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFOUQ7OztFQUdFO0FBQ0YsTUFBTSxPQUFnQiwwQkFBMEI7SUFROUMscUJBQXFCO0lBQ3JCLHFCQUFxQixDQUFDLHdCQUE2QjtRQUNqRCxJQUFJLHdCQUF3QixDQUFDLGFBQWEsS0FBSyxNQUFNLElBQUksd0JBQXdCLENBQUMsU0FBUyxFQUFFO1lBQzNGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQWMsTUFBTSxDQUFHLENBQUM7UUFFakUsbUhBQW1IO1FBQ25ILElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUN2QyxPQUFPO1NBQ1I7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBRUQsYUFBYSxDQUFDLGFBQTRCLEVBQUUsV0FBd0I7UUFDbEUsSUFBSSxXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUMxQyxJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLFVB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b3JlIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xyXG5pbXBvcnQgeyBFbnRpdHlRdWVyeSB9IGZyb20gJy4vZW50aXR5LXF1ZXJ5JztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2VBZGFwdGVyLCBBamF4QWRhcHRlciwgQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yQ3RvciwgQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yIH0gZnJvbSAnLi9pbnRlcmZhY2UtcmVnaXN0cnknO1xyXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuL2VudGl0eS1hc3BlY3QnO1xyXG5pbXBvcnQgeyBNYXBwaW5nQ29udGV4dCB9IGZyb20gJy4vbWFwcGluZy1jb250ZXh0JztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2UsIEpzb25SZXN1bHRzQWRhcHRlciB9IGZyb20gJy4vZGF0YS1zZXJ2aWNlJztcclxuaW1wb3J0IHsgSHR0cFJlc3BvbnNlLCBTYXZlQ29udGV4dCwgU2F2ZUJ1bmRsZSwgU2VydmVyRXJyb3IsIFNhdmVSZXN1bHQsIFNhdmVFcnJvckZyb21TZXJ2ZXIsIFF1ZXJ5UmVzdWx0IH0gZnJvbSAnLi9lbnRpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IEVudGl0eVR5cGUsIE1ldGFkYXRhU3RvcmUgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gIFRoZSBjbGFzcyBpcyB1c2VkIGFzIHRoZSBiYXNlIGNsYXNzIGZvciBtb3N0IFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uc1xyXG5AYWRhcHRlciAoc2VlIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlblxyXG4qL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYXRhU2VydmljZUFkYXB0ZXIgaW1wbGVtZW50cyBEYXRhU2VydmljZUFkYXB0ZXIge1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIGRlY2xhcmUgXyRpbXBsPzogYW55O1xyXG4gIC8qKiBUaGUgbmFtZSBvZiB0aGlzIGFkYXB0ZXIuICovXHJcbiAgZGVjbGFyZSBuYW1lOiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBbW0lBamF4QWRhcHRlcl1dIHVzZWQgYnkgdGhpcyBbW0lEYXRhU2VydmljZUFkYXB0ZXJdXS4gKi9cclxuICBkZWNsYXJlIGFqYXhJbXBsOiBBamF4QWRhcHRlcjtcclxuXHJcbiAgLy8gVE9ETyB1c2UgaW50ZXJmYWNlXHJcbiAgY2hlY2tGb3JSZWNvbXBvc2l0aW9uKGludGVyZmFjZUluaXRpYWxpemVkQXJnczogYW55KSB7XHJcbiAgICBpZiAoaW50ZXJmYWNlSW5pdGlhbGl6ZWRBcmdzLmludGVyZmFjZU5hbWUgPT09IFwiYWpheFwiICYmIGludGVyZmFjZUluaXRpYWxpemVkQXJncy5pc0RlZmF1bHQpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplKCkge1xyXG4gICAgdGhpcy5hamF4SW1wbCA9IGNvbmZpZy5nZXRBZGFwdGVySW5zdGFuY2U8QWpheEFkYXB0ZXI+KFwiYWpheFwiKSAhO1xyXG5cclxuICAgIC8vIGRvbid0IGNhY2hlICdhamF4JyBiZWNhdXNlIHRoZW4gd2Ugd291bGQgbmVlZCB0byBcIi5iaW5kXCIgaXQsIGFuZCBkb24ndCB3YW50IHRvIGJlY2F1c2Ugb2YgYnJvd2VyIHN1cHBvcnQgaXNzdWVzLlxyXG4gICAgaWYgKHRoaXMuYWpheEltcGwgJiYgdGhpcy5hamF4SW1wbC5hamF4KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBmaW5kIGFqYXggYWRhcHRlciBmb3IgZGF0YXNlcnZpY2UgYWRhcHRlciAnXCIgKyAodGhpcy5uYW1lIHx8ICcnKSArIFwiJy5cIik7XHJcbiAgfVxyXG5cclxuICBmZXRjaE1ldGFkYXRhKG1ldGFkYXRhU3RvcmU6IE1ldGFkYXRhU3RvcmUsIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSkge1xyXG4gICAgbGV0IHNlcnZpY2VOYW1lID0gZGF0YVNlcnZpY2Uuc2VydmljZU5hbWU7XHJcbiAgICBsZXQgdXJsID0gZGF0YVNlcnZpY2UucXVhbGlmeVVybChcIk1ldGFkYXRhXCIpO1xyXG5cclxuICAgIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5hamF4SW1wbC5hamF4KHtcclxuICAgICAgICB0eXBlOiBcIkdFVFwiLFxyXG4gICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgc3VjY2VzczogKGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlKSA9PiB7XHJcblxyXG4gICAgICAgICAgLy8gbWlnaHQgaGF2ZSBiZWVuIGZldGNoZWQgYnkgYW5vdGhlciBxdWVyeVxyXG4gICAgICAgICAgaWYgKG1ldGFkYXRhU3RvcmUuaGFzTWV0YWRhdGFGb3Ioc2VydmljZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiYWxyZWFkeSBmZXRjaGVkXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IGRhdGEgPSBodHRwUmVzcG9uc2UuZGF0YTtcclxuICAgICAgICAgIGxldCBtZXRhZGF0YTogYW55O1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbWV0YWRhdGEgPSB0eXBlb2YgKGRhdGEpID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGE7XHJcbiAgICAgICAgICAgIG1ldGFkYXRhU3RvcmUuaW1wb3J0TWV0YWRhdGEobWV0YWRhdGEpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsZXQgZXJyTXNnID0gXCJVbmFibGUgdG8gZWl0aGVyIHBhcnNlIG9yIGltcG9ydCBtZXRhZGF0YTogXCIgKyBlLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgIGhhbmRsZUh0dHBFcnJvcihyZWplY3QsIGh0dHBSZXNwb25zZSwgXCJNZXRhZGF0YSBxdWVyeSBmYWlsZWQgZm9yOiBcIiArIHVybCArIFwiLiBcIiArIGVyck1zZyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaW1wb3J0IG1heSBoYXZlIGJyb3VnaHQgaW4gdGhlIHNlcnZpY2UuXHJcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhU3RvcmUuaGFzTWV0YWRhdGFGb3Ioc2VydmljZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIG1ldGFkYXRhU3RvcmUuYWRkRGF0YVNlcnZpY2UoZGF0YVNlcnZpY2UpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJlc29sdmUobWV0YWRhdGEpO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoaHR0cFJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGhhbmRsZUh0dHBFcnJvcihyZWplY3QsIGh0dHBSZXNwb25zZSwgXCJNZXRhZGF0YSBxdWVyeSBmYWlsZWQgZm9yOiBcIiArIHVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHByb21pc2U7XHJcbiAgfVxyXG5cclxuICAvKiogRXhlY3V0ZSB0aGUgcXVlcnkgaW4gdGhlIG1hcHBpbmdDb250ZXh0IHVzaW5nIHRoZSBhamF4SW1wbC4gKi9cclxuICBleGVjdXRlUXVlcnkobWFwcGluZ0NvbnRleHQ6IE1hcHBpbmdDb250ZXh0KSB7XHJcbiAgICBtYXBwaW5nQ29udGV4dC5hZGFwdGVyID0gdGhpcztcclxuXHJcbiAgICBjb25zdCB1c2VQb3N0ID0gKG1hcHBpbmdDb250ZXh0LnF1ZXJ5IGFzIEVudGl0eVF1ZXJ5KS51c2VQb3N0RW5hYmxlZDtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVBvc3QgPyB0aGlzLl9tYWtlUXVlcnlQb3N0UGFyYW1zKG1hcHBpbmdDb250ZXh0KSA6IHRoaXMuX21ha2VRdWVyeUdldFBhcmFtcyhtYXBwaW5nQ29udGV4dCkgYXMgYW55O1xyXG5cclxuICAgIGxldCBwcm9taXNlID0gbmV3IFByb21pc2U8UXVlcnlSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgcGFyYW1zLnN1Y2Nlc3MgPSBmdW5jdGlvbiAoaHR0cFJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpIHtcclxuICAgICAgICBsZXQgZGF0YSA9IGh0dHBSZXNwb25zZS5kYXRhO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBsZXQgckRhdGE6IFF1ZXJ5UmVzdWx0O1xyXG4gICAgICAgICAgbGV0IHJlc3VsdHMgPSBkYXRhICYmIChkYXRhLnJlc3VsdHMgfHwgZGF0YS5SZXN1bHRzKTtcclxuICAgICAgICAgIGlmIChyZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIHJEYXRhID0geyByZXN1bHRzOiByZXN1bHRzLCBpbmxpbmVDb3VudDogZGF0YS5pbmxpbmVDb3VudCB8fCBkYXRhLklubGluZUNvdW50LCBcclxuICAgICAgICAgICAgICBodHRwUmVzcG9uc2U6IGh0dHBSZXNwb25zZSwgcXVlcnk6IG1hcHBpbmdDb250ZXh0LnF1ZXJ5IH07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByRGF0YSA9IHsgcmVzdWx0czogZGF0YSwgaHR0cFJlc3BvbnNlOiBodHRwUmVzcG9uc2UsIHF1ZXJ5OiBtYXBwaW5nQ29udGV4dC5xdWVyeSB9O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJlc29sdmUockRhdGEpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaGFuZGxlSHR0cEVycm9yKHJlamVjdCwgaHR0cFJlc3BvbnNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIHBhcmFtcy5lcnJvciA9IGZ1bmN0aW9uIChodHRwUmVzcG9uc2U6IEh0dHBSZXNwb25zZSkge1xyXG4gICAgICAgIGhhbmRsZUh0dHBFcnJvcihyZWplY3QsIGh0dHBSZXNwb25zZSk7XHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuYWpheEltcGwuYWpheChwYXJhbXMpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG4gIC8qKiBTZXQgdXAgYWpheCBwYXJhbWV0ZXJzIGZvciBxdWVyeSBHRVQuICBUaGlzIHB1dHMgdGhlIHF1ZXJ5IGludG8gdGhlIHJlcXVlc3QgcXVlcnlzdHJpbmcgaW4gZWl0aGVyIEpTT04gb3IgT0RhdGEtc3R5bGUgc3ludGF4LCBkZXBlbmRpbmcgdXBvbiB0aGUgVXJpQnVpbGRlci4gKi9cclxuICBfbWFrZVF1ZXJ5R2V0UGFyYW1zKG1hcHBpbmdDb250ZXh0OiBNYXBwaW5nQ29udGV4dCkge1xyXG4gICAgY29uc3QgdXJsID0gbWFwcGluZ0NvbnRleHQuZ2V0VXJsKCk7XHJcblxyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICB0eXBlOiBcIkdFVFwiLFxyXG4gICAgICB1cmw6IHVybCxcclxuICAgICAgcGFyYW1zOiAobWFwcGluZ0NvbnRleHQucXVlcnkgYXMgRW50aXR5UXVlcnkpLnBhcmFtZXRlcnMsXHJcbiAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgIGNyb3NzRG9tYWluOiBmYWxzZSxcclxuICAgIH07XHJcbiAgICBpZiAobWFwcGluZ0NvbnRleHQuZGF0YVNlcnZpY2UudXNlSnNvbnApIHtcclxuICAgICAgcGFyYW1zLmRhdGFUeXBlID0gJ2pzb25wJztcclxuICAgICAgcGFyYW1zLmNyb3NzRG9tYWluID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG5cclxuICAvKiogU2V0IHVwIGFqYXggcGFyYW1ldGVycyBmb3IgcXVlcnkgUE9TVC4gIFRoaXMgcHV0IHRoZSBxdWVyeSBpbnRvIHRoZSByZXF1ZXN0IGJvZHkgYXMgSlNPTi4gKi9cclxuICBfbWFrZVF1ZXJ5UG9zdFBhcmFtcyhtYXBwaW5nQ29udGV4dDogTWFwcGluZ0NvbnRleHQpIHtcclxuICAgIGNvbnN0IGVudGl0eVF1ZXJ5ID0gbWFwcGluZ0NvbnRleHQucXVlcnkgYXMgRW50aXR5UXVlcnk7XHJcbiAgICBjb25zdCBtZXRhZGF0YVN0b3JlID0gbWFwcGluZ0NvbnRleHQuZW50aXR5TWFuYWdlci5tZXRhZGF0YVN0b3JlO1xyXG4gICAgY29uc3QgdXJsID0gbWFwcGluZ0NvbnRleHQuZGF0YVNlcnZpY2UucXVhbGlmeVVybChlbnRpdHlRdWVyeS5yZXNvdXJjZU5hbWUpO1xyXG5cclxuICAgIGxldCBlbnRpdHlUeXBlID0gZW50aXR5UXVlcnkuX2dldEZyb21FbnRpdHlUeXBlKG1ldGFkYXRhU3RvcmUsIGZhbHNlKTtcclxuICAgIGlmICghZW50aXR5VHlwZSkgeyBlbnRpdHlUeXBlID0gbmV3IEVudGl0eVR5cGUobWV0YWRhdGFTdG9yZSk7IH1cclxuICAgIGNvbnN0IGpzb24gPSBlbnRpdHlRdWVyeS50b0pTT05FeHQoeyBlbnRpdHlUeXBlOiBlbnRpdHlUeXBlLCB0b05hbWVPblNlcnZlcjogdHJ1ZX0pIGFzIGFueTtcclxuICAgIGpzb24uZnJvbSA9IHVuZGVmaW5lZDtcclxuICAgIGpzb24ucXVlcnlPcHRpb25zID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgdHlwZTogXCJQT1NUXCIsXHJcbiAgICAgIHVybDogdXJsLFxyXG4gICAgICBwYXJhbXM6IChtYXBwaW5nQ29udGV4dC5xdWVyeSBhcyBFbnRpdHlRdWVyeSkucGFyYW1ldGVycyxcclxuICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLCAvLyBkb24ndCBsZXQgSlF1ZXJ5IGZvcm0tZW5jb2RlIGl0XHJcbiAgICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLThcIixcclxuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoanNvbiksXHJcbiAgICAgIGNyb3NzRG9tYWluOiBmYWxzZSxcclxuICAgIH07XHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgc2F2ZUNoYW5nZXMoc2F2ZUNvbnRleHQ6IFNhdmVDb250ZXh0LCBzYXZlQnVuZGxlOiBTYXZlQnVuZGxlKSB7XHJcbiAgICBsZXQgYWRhcHRlciA9IHNhdmVDb250ZXh0LmFkYXB0ZXIgPSB0aGlzO1xyXG5cclxuICAgIGxldCBzYXZlQnVuZGxlU2VyID0gYWRhcHRlci5fcHJlcGFyZVNhdmVCdW5kbGUoc2F2ZUNvbnRleHQsIHNhdmVCdW5kbGUpO1xyXG4gICAgbGV0IGJ1bmRsZSA9IEpTT04uc3RyaW5naWZ5KHNhdmVCdW5kbGVTZXIpO1xyXG5cclxuICAgIGxldCB1cmwgPSBzYXZlQ29udGV4dC5kYXRhU2VydmljZS5xdWFsaWZ5VXJsKHNhdmVDb250ZXh0LnJlc291cmNlTmFtZSk7XHJcbiAgICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFNhdmVSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5hamF4SW1wbC5hamF4KHtcclxuICAgICAgICB0eXBlOiBcIlBPU1RcIixcclxuICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICBkYXRhOiBidW5kbGUsXHJcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICBodHRwUmVzcG9uc2Uuc2F2ZUNvbnRleHQgPSBzYXZlQ29udGV4dDtcclxuICAgICAgICAgIGxldCBkYXRhID0gaHR0cFJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgICBpZiAoZGF0YS5FcnJvcnMgfHwgZGF0YS5lcnJvcnMpIHtcclxuICAgICAgICAgICAgaGFuZGxlSHR0cEVycm9yKHJlamVjdCwgaHR0cFJlc3BvbnNlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBzYXZlUmVzdWx0ID0gYWRhcHRlci5fcHJlcGFyZVNhdmVSZXN1bHQoc2F2ZUNvbnRleHQsIGRhdGEpO1xyXG4gICAgICAgICAgICBzYXZlUmVzdWx0Lmh0dHBSZXNwb25zZSA9IGh0dHBSZXNwb25zZTtcclxuICAgICAgICAgICAgcmVzb2x2ZShzYXZlUmVzdWx0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbiAoaHR0cFJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpIHtcclxuICAgICAgICAgIGh0dHBSZXNwb25zZS5zYXZlQ29udGV4dCA9IHNhdmVDb250ZXh0O1xyXG4gICAgICAgICAgaGFuZGxlSHR0cEVycm9yKHJlamVjdCwgaHR0cFJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHByb21pc2U7XHJcbiAgfVxyXG5cclxuICAvKiogQWJzdHJhY3QgbWV0aG9kIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gaW4gYW55IGNvbmNyZXRlIERhdGFTZXJ2aWNlQWRhcHRlciBzdWJjbGFzcy4gXHJcbiAgVGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBhIHNlcmlhbGl6YWJsZSBvYmplY3QgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlciBhZnRlciBjYWxsaW5nIEpTT04uc3RyaW5naWZ5IG9uIGl0LlxyXG4gICovXHJcbiAgX3ByZXBhcmVTYXZlQnVuZGxlKHNhdmVDb250ZXh0OiBTYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZTogU2F2ZUJ1bmRsZSk6IGFueSB7XHJcbiAgICAvLyBUaGUgaW1wbGVtZW50b3Igc2hvdWxkIGNhbGwgX2NyZWF0ZUNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvclxyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTmVlZCBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIF9wcmVwYXJlU2F2ZUJ1bmRsZVwiKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgYSBcIkNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvclwiXHJcbiAgdGhhdCBjYW4gdHdlYWsgdGhlIHNhdmVCdW5kbGUgYm90aCBhcyBpdCBpcyBidWlsdCBhbmQgd2hlbiBpdCBpcyBjb21wbGV0ZWRcclxuICBieSBhIGNvbmNyZXRlIERhdGFTZXJ2aWNlQWRhcGF0ZXIuXHJcblxyXG4gIEluaXRpYWxpemVkIHdpdGggYSBkZWZhdWx0LCBuby1vcCBpbXBsZW1lbnRhdGlvbiB0aGF0IGRldmVsb3BlcnMgY2FuIHJlcGxhY2Ugd2l0aCBhXHJcbiAgc3Vic3RhbnRpdmUgaW1wbGVtZW50YXRpb24gdGhhdCBjaGFuZ2VzIHRoZSBpbmRpdmlkdWFsIGVudGl0eSBjaGFuZ2UgcmVxdWVzdHNcclxuICBvciBhc3BlY3RzIG9mIHRoZSBlbnRpcmUgJ3NhdmVCdW5kbGUnIHdpdGhvdXQgaGF2aW5nIHRvIHdyaXRlIHRoZWlyIG93biBEYXRhU2VydmljZSBhZGFwdGVycy5cclxuICA+ICAgICBsZXQgYWRhcHRlciA9IGJyZWV6ZS5jb25maWcuZ2V0QWRhcHRlckluc3RhbmNlKCdkYXRhU2VydmljZScpO1xyXG4gID4gICAgIGFkYXB0ZXIuY2hhbmdlUmVxdWVzdEludGVyY2VwdG9yID0gZnVuY3Rpb24gKHNhdmVDb250ZXh0LCBzYXZlQnVuZGxlKSB7XHJcbiAgPiAgICAgICAgIHRoaXMuZ2V0UmVxdWVzdCA9IGZ1bmN0aW9uIChyZXF1ZXN0LCBlbnRpdHksIGluZGV4KSB7XHJcbiAgPiAgICAgICAgICAgIC8vIGFsdGVyIHRoZSByZXF1ZXN0IHRoYXQgdGhlIGFkYXB0ZXIgcHJlcGFyZWQgZm9yIHRoaXMgZW50aXR5XHJcbiAgPiAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRoZSBlbnRpdHksIHNhdmVDb250ZXh0LCBhbmQgc2F2ZUJ1bmRsZVxyXG4gID4gICAgICAgICAgICAvLyBlLmcuLCBhZGQgYSBjdXN0b20gaGVhZGVyIG9yIHBydW5lIHRoZSBvcmlnaW5hbFZhbHVlc01hcFxyXG4gID4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdDtcclxuICA+ICAgICAgICB9O1xyXG4gID4gICAgICAgIHRoaXMuZG9uZSA9IGZ1bmN0aW9uIChyZXF1ZXN0cykge1xyXG4gID4gICAgICAgICAgICAvLyBhbHRlciB0aGUgYXJyYXkgb2YgcmVxdWVzdHMgcmVwcmVzZW50aW5nIHRoZSBlbnRpcmUgY2hhbmdlLXNldFxyXG4gID4gICAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUgc2F2ZUNvbnRleHQgYW5kIHNhdmVCdW5kbGVcclxuICA+ICAgICAgICB9O1xyXG4gID4gICAgIH1cclxuXHJcbiAgQHBhcmFtIHNhdmVDb250ZXh0IC0gVGhlIEJyZWV6ZUpTIFwiY29udGV4dFwiIGZvciB0aGUgc2F2ZSBvcGVyYXRpb24uXHJcbiAgQHBhcmFtIHNhdmVCdW5kbGUgLSBDb250YWlucyB0aGUgYXJyYXkgb2YgZW50aXRpZXMtdG8tYmUtc2F2ZWQgKEFLQSwgdGhlIGVudGl0eSBjaGFuZ2Utc2V0KS5cclxuICBAcmV0dXJuIENvbnN0cnVjdG9yIGZvciBhIFwiQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yXCIuXHJcbiAgKiovXHJcbiAgY2hhbmdlUmVxdWVzdEludGVyY2VwdG9yOiBDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3JDdG9yID0gRGVmYXVsdENoYW5nZVJlcXVlc3RJbnRlcmNlcHRvcjtcclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX2NyZWF0ZUNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvcihzYXZlQ29udGV4dDogU2F2ZUNvbnRleHQsIHNhdmVCdW5kbGU6IFNhdmVCdW5kbGUpIHtcclxuICAgIGxldCBhZGFwdGVyID0gc2F2ZUNvbnRleHQuYWRhcHRlciE7XHJcbiAgICBsZXQgY3JpID0gYWRhcHRlci5jaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3I7XHJcbiAgICBsZXQgaXNGbiA9IGNvcmUuaXNGdW5jdGlvbjtcclxuXHJcbiAgICBpZiAoaXNGbihjcmkpKSB7XHJcbiAgICAgIGxldCBwcmUgPSBhZGFwdGVyLm5hbWUgKyBcIiBEYXRhU2VydmljZUFkYXB0ZXIncyBDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3JcIjtcclxuICAgICAgbGV0IHBvc3QgPSBcIiBpcyBtaXNzaW5nIG9yIG5vdCBhIGZ1bmN0aW9uLlwiO1xyXG4gICAgICBsZXQgaW50ZXJjZXB0b3IgPSBuZXcgY3JpKHNhdmVDb250ZXh0LCBzYXZlQnVuZGxlKTtcclxuICAgICAgaWYgKCFpc0ZuKGludGVyY2VwdG9yLmdldFJlcXVlc3QpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByZSArICcuZ2V0UmVxdWVzdCcgKyBwb3N0KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWlzRm4oaW50ZXJjZXB0b3IuZG9uZSkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJlICsgJy5kb25lJyArIHBvc3QpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBpbnRlcmNlcHRvcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBuZXcgRGVmYXVsdENoYW5nZVJlcXVlc3RJbnRlcmNlcHRvcihzYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZSkgYXMgQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEFic3RyYWN0IG1ldGhvZCB0aGF0IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGluIGFueSBjb25jcmV0ZSBEYXRhU2VydmljZUFkYXB0ZXIgc3VibGNsYXNzLiBcclxuICBUaGlzIG1ldGhvZCBuZWVkcyB0byB0YWtlIHRoZSByZXN1bHQgcmV0dXJuZWQgdGhlIHNlcnZlciBhbmQgY29udmVydCBpdCBpbnRvIGFuIElTYXZlUmVzdWx0LiBcclxuICAqL1xyXG4gIF9wcmVwYXJlU2F2ZVJlc3VsdChzYXZlQ29udGV4dDogU2F2ZUNvbnRleHQsIGRhdGE6IGFueSk6IFNhdmVSZXN1bHQge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTmVlZCBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIF9wcmVwYXJlU2F2ZVJlc3VsdFwiKTtcclxuICB9XHJcblxyXG5cclxuICAvKiogVXRpbGl0eSBtZXRob2QgdGhhdCBtYXkgYmUgdXNlZCBpbiBhbnkgY29uY3JldGUgRGF0YVNlcnZpY2VBZGFwdGVyIHN1YmxjbGFzcyB0byBoYW5kbGUgYW55IFxyXG4gIGh0dHAgY29ubmVjdGlvbiBpc3N1ZXMuIFxyXG4gICovXHJcbiAgLy8gUHV0IHRoaXMgYXQgdGhlIGJvdHRvbSBvZiB5b3VyIGh0dHAgZXJyb3IgYW5hbHlzaXNcclxuICBzdGF0aWMgX2NhdGNoTm9Db25uZWN0aW9uRXJyb3IoZXJyOiBTZXJ2ZXJFcnJvcikge1xyXG4gICAgaWYgKGVyci5zdGF0dXMgPT09IDAgJiYgZXJyLm1lc3NhZ2UgPT0gbnVsbCkge1xyXG4gICAgICBlcnIubWVzc2FnZSA9IFwiSFRUUCByZXNwb25zZSBzdGF0dXMgMCBhbmQgbm8gbWVzc2FnZS4gIFwiICtcclxuICAgICAgICBcIkxpa2VseSBkaWQgbm90IG9yIGNvdWxkIG5vdCByZWFjaCBzZXJ2ZXIuIElzIHRoZSBzZXJ2ZXIgcnVubmluZz9cIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGpzb25SZXN1bHRzQWRhcHRlciA9IG5ldyBKc29uUmVzdWx0c0FkYXB0ZXIoe1xyXG4gICAgbmFtZTogXCJub29wXCIsXHJcblxyXG4gICAgdmlzaXROb2RlOiBmdW5jdGlvbiAoLyogbm9kZSwgbWFwcGluZ0NvbnRleHQsIG5vZGVDb250ZXh0ICovKSB7XHJcbiAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlSHR0cEVycm9yKHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCwgaHR0cFJlc3BvbnNlOiBIdHRwUmVzcG9uc2UsIG1lc3NhZ2VQcmVmaXg/OiBzdHJpbmcpIHtcclxuICBsZXQgZXJyID0gY3JlYXRlRXJyb3IoaHR0cFJlc3BvbnNlKTtcclxuICBBYnN0cmFjdERhdGFTZXJ2aWNlQWRhcHRlci5fY2F0Y2hOb0Nvbm5lY3Rpb25FcnJvcihlcnIpO1xyXG4gIGlmIChtZXNzYWdlUHJlZml4KSB7XHJcbiAgICBlcnIubWVzc2FnZSA9IG1lc3NhZ2VQcmVmaXggKyBcIjsgXCIgKyBlcnIubWVzc2FnZTtcclxuICB9XHJcbiAgcmVqZWN0KGVycik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUVycm9yKGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlKSB7XHJcbiAgbGV0IGVyciA9IG5ldyBFcnJvcigpIGFzIFNlcnZlckVycm9yO1xyXG4gIGVyci5odHRwUmVzcG9uc2UgPSBodHRwUmVzcG9uc2U7XHJcbiAgZXJyLnN0YXR1cyA9IGh0dHBSZXNwb25zZS5zdGF0dXM7XHJcblxyXG4gIGxldCBlcnJPYmogPSBodHRwUmVzcG9uc2UuZGF0YTtcclxuXHJcbiAgaWYgKCFlcnJPYmopIHtcclxuICAgIGVyci5tZXNzYWdlID0gaHR0cFJlc3BvbnNlLmVycm9yICYmIGh0dHBSZXNwb25zZS5lcnJvci50b1N0cmluZygpO1xyXG4gICAgcmV0dXJuIGVycjtcclxuICB9XHJcblxyXG4gIC8vIHNvbWUgYWpheCBwcm92aWRlcnMgd2lsbCBjb252ZXJ0IGVycmFudCByZXN1bHQgaW50byBhbiBvYmplY3QgKGFuZ3VsYXJqcyksIG90aGVycyB3aWxsIG5vdCAoalF1ZXJ5KVxyXG4gIC8vIGlmIG5vdCBkbyBpdCBoZXJlLlxyXG4gIGlmICh0eXBlb2YgZXJyT2JqID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBlcnJPYmogPSBKU09OLnBhcnNlKGVyck9iaik7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIHNvbWV0aW1lcyBodHRwUmVzcG9uc2UuZGF0YSBpcyBqdXN0IHRoZSBlcnJvciBtZXNzYWdlIGl0c2VsZlxyXG4gICAgICBlcnIubWVzc2FnZSA9IGVyck9iajtcclxuICAgICAgcmV0dXJuIGVycjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxldCBzYXZlQ29udGV4dCA9IGh0dHBSZXNwb25zZS5zYXZlQ29udGV4dDtcclxuXHJcbiAgLy8gaWYgYW55IG9mIHRoZSBmb2xsb3cgcHJvcGVydGllcyBleGlzdCB0aGUgc291cmNlIGlzIC5ORVRcclxuICBsZXQgdG1wID0gZXJyT2JqLk1lc3NhZ2UgfHwgZXJyT2JqLkV4Y2VwdGlvbk1lc3NhZ2UgfHwgZXJyT2JqLkVudGl0eUVycm9ycyB8fCBlcnJPYmouRXJyb3JzO1xyXG4gIGxldCBpc0RvdE5ldCA9ICEhdG1wO1xyXG4gIGxldCBtZXNzYWdlOiBzdHJpbmcsIGVudGl0eUVycm9yczogYW55W107XHJcbiAgaWYgKCFpc0RvdE5ldCkge1xyXG4gICAgbWVzc2FnZSA9IGVyck9iai5tZXNzYWdlO1xyXG4gICAgZW50aXR5RXJyb3JzID0gZXJyT2JqLmVycm9ycyB8fCBlcnJPYmouZW50aXR5RXJyb3JzO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgdG1wID0gZXJyT2JqO1xyXG4gICAgZG8ge1xyXG4gICAgICAvLyAuTkVUIGV4Y2VwdGlvbnMgY2FuIHByb3ZpZGUgYm90aCBFeGNlcHRpb25NZXNzYWdlIGFuZCBNZXNzYWdlIGJ1dCBFeGNlcHRpb25NZXRob2QgaWYgaXRcclxuICAgICAgLy8gZXhpc3RzIGhhcyBhIG1vcmUgZGV0YWlsZWQgbWVzc2FnZS5cclxuICAgICAgbWVzc2FnZSA9IHRtcC5FeGNlcHRpb25NZXNzYWdlIHx8IHRtcC5NZXNzYWdlO1xyXG4gICAgICB0bXAgPSB0bXAuSW5uZXJFeGNlcHRpb247XHJcbiAgICB9IHdoaWxlICh0bXApO1xyXG4gICAgLy8gLkVudGl0eUVycm9ycyB3aWxsIG9ubHkgb2NjdXIgYXMgYSByZXN1bHQgb2YgYW4gRW50aXR5RXJyb3JzRXhjZXB0aW9uIGJlaW5nIGRlbGliZXJhdGVseSB0aHJvd24gb24gdGhlIHNlcnZlclxyXG4gICAgZW50aXR5RXJyb3JzID0gZXJyT2JqLkVycm9ycyB8fCBlcnJPYmouRW50aXR5RXJyb3JzO1xyXG4gICAgZW50aXR5RXJyb3JzID0gZW50aXR5RXJyb3JzICYmIGVudGl0eUVycm9ycy5tYXAoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBlcnJvck5hbWU6IGUuRXJyb3JOYW1lLFxyXG4gICAgICAgIGVudGl0eVR5cGVOYW1lOiBNZXRhZGF0YVN0b3JlLm5vcm1hbGl6ZVR5cGVOYW1lKGUuRW50aXR5VHlwZU5hbWUpLFxyXG4gICAgICAgIGtleVZhbHVlczogZS5LZXlWYWx1ZXMsXHJcbiAgICAgICAgcHJvcGVydHlOYW1lOiBlLlByb3BlcnR5TmFtZSxcclxuICAgICAgICBlcnJvck1lc3NhZ2U6IGUuRXJyb3JNZXNzYWdlLFxyXG4gICAgICAgIGN1c3RvbTogZS5DdXN0b21cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaWYgKHNhdmVDb250ZXh0ICYmIGVudGl0eUVycm9ycykge1xyXG5cclxuICAgIGxldCBwcm9wTmFtZUZuID0gc2F2ZUNvbnRleHQuZW50aXR5TWFuYWdlci5tZXRhZGF0YVN0b3JlLm5hbWluZ0NvbnZlbnRpb24uc2VydmVyUHJvcGVydHlOYW1lVG9DbGllbnQ7XHJcbiAgICBlbnRpdHlFcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xyXG4gICAgICBlLnByb3BlcnR5TmFtZSA9IGUucHJvcGVydHlOYW1lICYmIHByb3BOYW1lRm4oZS5wcm9wZXJ0eU5hbWUpO1xyXG4gICAgfSk7XHJcbiAgICAoZXJyIGFzIFNhdmVFcnJvckZyb21TZXJ2ZXIpLmVudGl0eUVycm9ycyA9IGVudGl0eUVycm9ycztcclxuICB9XHJcblxyXG4gIGVyci5tZXNzYWdlID0gbWVzc2FnZSB8fCBcIlNlcnZlciBzaWRlIGVycm9ycyBlbmNvdW50ZXJlZCAtIHNlZSB0aGUgZW50aXR5RXJyb3JzIGNvbGxlY3Rpb24gb24gdGhpcyBvYmplY3QgZm9yIG1vcmUgZGV0YWlsXCI7XHJcbiAgcmV0dXJuIGVycjtcclxufVxyXG5cclxuXHJcbi8qKiBUaGlzIGlzIGEgZGVmYXVsdCwgbm8tb3AgaW1wbGVtZW50YXRpb24gdGhhdCBkZXZlbG9wZXJzIGNhbiByZXBsYWNlLiAqL1xyXG5jbGFzcyBEZWZhdWx0Q2hhbmdlUmVxdWVzdEludGVyY2VwdG9yIHtcclxuICBjb25zdHJ1Y3RvcihzYXZlQ29udGV4dDogU2F2ZUNvbnRleHQsIHNhdmVCdW5kbGU6IFNhdmVCdW5kbGUpIHtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRSZXF1ZXN0KHJlcXVlc3Q6IGFueSwgZW50aXR5OiBFbnRpdHksIGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiByZXF1ZXN0O1xyXG4gIH1cclxuXHJcbiAgZG9uZShyZXF1ZXN0czogT2JqZWN0W10pIHtcclxuICB9XHJcbn1cclxuIl19
|