angular-odata
Version:
Client side OData typescript library for Angular
210 lines • 33.2 kB
JavaScript
import { $BATCH, $QUERY, ACCEPT, APPLICATION_JSON, CONTENT_TYPE_ANY, IF_MATCH_HEADER, IF_NONE_MATCH_HEADER, PREFER, TEXT_PLAIN, } from '../constants';
import { Http, Types } from '../utils';
export class ODataRequest {
api;
observe;
context;
reportProgress;
withCredentials;
bodyQueryOptions;
fetchPolicy;
resource;
_responseType;
_method;
_body;
_headers;
_params;
_path;
constructor(init) {
this._method = init.method;
this.resource = init.resource;
this.api = init.api;
this.reportProgress = init.reportProgress;
this.observe = init.observe;
this.context = init.context;
// Response Type
this._responseType = init.responseType;
// The Body
this._body = init.body !== undefined ? init.body : null;
if (this._body !== null)
this._body = this.resource.serialize(this._body, init.parserOptions);
this.withCredentials =
init.withCredentials === undefined
? this.api.options.withCredentials
: init.withCredentials;
this.fetchPolicy = init.fetchPolicy || this.api.options.fetchPolicy;
this.bodyQueryOptions = [
...(this.api.options.bodyQueryOptions || []),
...(init.bodyQueryOptions || []),
];
// The Path and Params from resource
const [resourcePath, resourceParams] = this.resource.pathAndParams(init.parserOptions);
this._path = resourcePath;
//#region Headers
const customHeaders = {};
if (typeof init.etag === 'string') {
if (this.api.options.etag.ifMatch &&
['PUT', 'PATCH', 'DELETE'].indexOf(this._method) !== -1)
customHeaders[IF_MATCH_HEADER] = init.etag;
else if (this.api.options.etag.ifNoneMatch &&
['GET'].indexOf(this._method) !== -1)
customHeaders[IF_NONE_MATCH_HEADER] = init.etag;
}
const accept = [];
// Metadata
if (this.api.options.accept?.metadata !== undefined)
accept.push(`odata.metadata=${this.api.options.accept?.metadata}`);
// IEEE754
if (this.api.options.accept?.ieee754Compatible !== undefined)
accept.push(`IEEE754Compatible=${this.api.options.accept?.ieee754Compatible}`);
// streaming
if (this.api.options.accept?.streaming !== undefined)
accept.push(`streaming=${this.api.options.accept?.streaming}`);
// ExponentialDecimals
if (this.api.options.accept?.exponentialDecimals !== undefined)
accept.push(`ExponentialDecimals=${this.api.options.accept?.exponentialDecimals}`);
if (accept.length > 0)
customHeaders[ACCEPT] = [
`${APPLICATION_JSON};${accept.join(';')}`,
`${TEXT_PLAIN}`,
`${CONTENT_TYPE_ANY}`,
];
const prefer = [];
// Return
if (this.api.options.prefer?.return !== undefined &&
['POST', 'PUT', 'PATCH'].indexOf(this._method) !== -1)
prefer.push(`return=${this.api.options.prefer?.return}`);
// MaxPageSize
if (this.api.options.prefer?.maxPageSize !== undefined &&
['GET'].indexOf(this._method) !== -1)
prefer.push(`odata.maxpagesize=${this.api.options.prefer?.maxPageSize}`);
// Annotations
if (this.api.options.prefer?.includeAnnotations !== undefined &&
['GET'].indexOf(this._method) !== -1)
prefer.push(`odata.include-annotations=${this.api.options.prefer?.includeAnnotations}`);
// Omit Null Values
if (this.api.options.prefer?.omitNullValues === true &&
['GET'].indexOf(this._method) !== -1)
prefer.push(`omit-values=nulls`);
// Continue on Error
if (this.api.options.prefer?.continueOnError === true &&
['POST'].indexOf(this._method) !== -1)
prefer.push(`odata.continue-on-error`);
if (prefer.length > 0)
customHeaders[PREFER] = prefer;
this._headers = Http.mergeHttpHeaders(this.api.options.headers, customHeaders, init.headers || {});
//#endregion
//#region Params
const customParams = {};
if (['POST', 'PUT', 'PATCH'].indexOf(this._method) !== -1 &&
'$select' in resourceParams) {
customParams['$select'] = resourceParams['$select'];
}
if (['POST'].indexOf(this._method) !== -1 && '$expand' in resourceParams) {
customParams['$expand'] = resourceParams['$expand'];
}
if (['GET'].indexOf(this._method) !== -1) {
Object.assign(customParams, resourceParams);
}
const params = Http.mergeHttpParams(this.api.options.params, customParams, init.params || {});
this._params =
this._responseType === 'entity'
? Http.withoutHttpParams(params, [
'$filter',
'$orderby',
'$count',
'$skip',
'$top',
])
: params;
//#endregion
}
static factory(api, method, resource, options) {
const apiOptions = api.options;
let params = options.params || {};
if (options.withCount) {
params = Http.mergeHttpParams(params, apiOptions.helper.countParam());
}
let etag = options.etag;
if (etag === undefined && Types.isPlainObject(options.body)) {
etag = apiOptions.helper.etag(options.body);
}
return new ODataRequest({
method,
etag,
api,
resource,
params,
context: options.context,
body: options.body,
observe: options.observe,
headers: options.headers,
reportProgress: options.reportProgress,
responseType: options.responseType,
fetchPolicy: options.fetchPolicy,
parserOptions: options.parserOptions,
withCredentials: options.withCredentials,
bodyQueryOptions: options.bodyQueryOptions,
});
}
get responseType() {
return this._responseType &&
['property', 'entity', 'entities'].indexOf(this._responseType) !== -1
? 'json'
: this._responseType === 'value'
? 'text'
: this._responseType;
}
get path() {
return this.isQueryBody() ? `${this._path}/${$QUERY}` : this._path;
}
get method() {
return this.isQueryBody() ? 'POST' : this._method;
}
get body() {
return this.isQueryBody()
? Http.splitHttpParams(this._params, this.bodyQueryOptions.map((name) => `$${name}`))[1].toString()
: this._body;
}
get params() {
return this.isQueryBody()
? Http.splitHttpParams(this._params, this.bodyQueryOptions.map((name) => `$${name}`))[0]
: this._params;
}
get headers() {
return this.isQueryBody()
? Http.mergeHttpHeaders(this._headers, { CONTENT_TYPE: TEXT_PLAIN })
: this._headers;
}
get pathWithParams() {
return this.params.keys().length > 0
? `${this.path}?${this.params}`
: this.path;
}
get url() {
return `${this.api.serviceRootUrl}${this.path}`;
}
get urlWithParams() {
return `${this.api.serviceRootUrl}${this.pathWithParams}`;
}
get cacheKey() {
return this._params.keys().length > 0
? `${this._path}?${this._params}`
: this._path;
}
isQueryBody() {
return (this._method === 'GET' &&
this.bodyQueryOptions.length > 0 &&
this.bodyQueryOptions.some((name) => this._params.has(`$${name}`)));
}
isBatch() {
return this.path.endsWith($BATCH);
}
isFetch() {
return ['GET'].indexOf(this._method) !== -1;
}
isMutate() {
return ['PUT', 'PATCH', 'POST', 'DELETE'].indexOf(this._method) !== -1;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9yZXNvdXJjZXMvcmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixlQUFlLEVBQ2Ysb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixVQUFVLEdBQ1gsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJdkMsTUFBTSxPQUFPLFlBQVk7SUFDZCxHQUFHLENBQVc7SUFDZCxPQUFPLENBQXdCO0lBQy9CLE9BQU8sQ0FBZTtJQUN0QixjQUFjLENBQVc7SUFDekIsZUFBZSxDQUFXO0lBQzFCLGdCQUFnQixDQUFnQjtJQUNoQyxXQUFXLENBS0g7SUFDUixRQUFRLENBQW1CO0lBQ25CLGFBQWEsQ0FRZjtJQUNFLE9BQU8sQ0FBUztJQUNoQixLQUFLLENBQWE7SUFDbEIsUUFBUSxDQUFjO0lBQ3RCLE9BQU8sQ0FBYTtJQUNwQixLQUFLLENBQVM7SUFFL0IsWUFBWSxJQWdDWDtRQUNDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMxQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRTVCLGdCQUFnQjtRQUNoQixJQUFJLENBQUMs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Q0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FDbkUsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENvbnRleHQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT0RhdGFBcGkgfSBmcm9tICcuLi9hcGknO1xuaW1wb3J0IHtcbiAgJEJBVENILFxuICAkUVVFUlksXG4gIEFDQ0VQVCxcbiAgQVBQTElDQVRJT05fSlNPTixcbiAgQ09OVEVOVF9UWVBFX0FOWSxcbiAgSUZfTUFUQ0hfSEVBREVSLFxuICBJRl9OT05FX01BVENIX0hFQURFUixcbiAgUFJFRkVSLFxuICBURVhUX1BMQUlOLFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRmV0Y2hQb2xpY3ksIFBhcnNlck9wdGlvbnMsIFF1ZXJ5T3B0aW9uIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgSHR0cCwgVHlwZXMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBPRGF0YVJlc291cmNlIH0gZnJvbSAnLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBPRGF0YU9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIE9EYXRhUmVxdWVzdDxUPiB7XG4gIHJlYWRvbmx5IGFwaTogT0RhdGFBcGk7XG4gIHJlYWRvbmx5IG9ic2VydmU6ICdldmVudHMnIHwgJ3Jlc3BvbnNlJztcbiAgcmVhZG9ubHkgY29udGV4dD86IEh0dHBDb250ZXh0O1xuICByZWFkb25seSByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGJvZHlRdWVyeU9wdGlvbnM6IFF1ZXJ5T3B0aW9uW107XG4gIHJlYWRvbmx5IGZldGNoUG9saWN5OlxuICAgIHwgJ2NhY2hlLWZpcnN0J1xuICAgIHwgJ2NhY2hlLWFuZC1uZXR3b3JrJ1xuICAgIHwgJ25ldHdvcmstb25seSdcbiAgICB8ICduby1jYWNoZSdcbiAgICB8ICdjYWNoZS1vbmx5JztcbiAgcmVhZG9ubHkgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8VD47XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc3BvbnNlVHlwZT86XG4gICAgfCAnYXJyYXlidWZmZXInXG4gICAgfCAnYmxvYidcbiAgICB8ICdqc29uJ1xuICAgIHwgJ3RleHQnXG4gICAgfCAndmFsdWUnXG4gICAgfCAncHJvcGVydHknXG4gICAgfCAnZW50aXR5J1xuICAgIHwgJ2VudGl0aWVzJztcbiAgcHJpdmF0ZSByZWFkb25seSBfbWV0aG9kOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2JvZHk6IGFueSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hlYWRlcnM6IEh0dHBIZWFkZXJzO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wYXJhbXM6IEh0dHBQYXJhbXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihpbml0OiB7XG4gICAgbWV0aG9kOiBzdHJpbmc7XG4gICAgYXBpOiBPRGF0YUFwaTtcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxUPjtcbiAgICBib2R5OiBhbnk7XG4gICAgb2JzZXJ2ZTogJ2V2ZW50cycgfCAncmVzcG9uc2UnO1xuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dDtcbiAgICBldGFnPzogc3RyaW5nO1xuICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyB8IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfTtcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XG4gICAgcGFyYW1zPzpcbiAgICAgIHwgSHR0cFBhcmFtc1xuICAgICAgfCB7XG4gICAgICAgICAgW3BhcmFtOiBzdHJpbmddOlxuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgbnVtYmVyXG4gICAgICAgICAgICB8IGJvb2xlYW5cbiAgICAgICAgICAgIHwgUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgICAgICAgfTtcbiAgICByZXNwb25zZVR5cGU/OlxuICAgICAgfCAnYXJyYXlidWZmZXInXG4gICAgICB8ICdibG9iJ1xuICAgICAgfCAnanNvbidcbiAgICAgIHwgJ3RleHQnXG4gICAgICB8ICd2YWx1ZSdcbiAgICAgIHwgJ3Byb3BlcnR5J1xuICAgICAgfCAnZW50aXR5J1xuICAgICAgfCAnZW50aXRpZXMnO1xuICAgIGZldGNoUG9saWN5PzogRmV0Y2hQb2xpY3k7XG4gICAgcGFyc2VyT3B0aW9ucz86IFBhcnNlck9wdGlvbnM7XG4gICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcbiAgICBib2R5UXVlcnlPcHRpb25zPzogUXVlcnlPcHRpb25bXTtcbiAgfSkge1xuICAgIHRoaXMuX21ldGhvZCA9IGluaXQubWV0aG9kO1xuICAgIHRoaXMucmVzb3VyY2UgPSBpbml0LnJlc291cmNlO1xuXG4gICAgdGhpcy5hcGkgPSBpbml0LmFwaTtcbiAgICB0aGlzLnJlcG9ydFByb2dyZXNzID0gaW5pdC5yZXBvcnRQcm9ncmVzcztcbiAgICB0aGlzLm9ic2VydmUgPSBpbml0Lm9ic2VydmU7XG4gICAgdGhpcy5jb250ZXh0ID0gaW5pdC5jb250ZXh0O1xuXG4gICAgLy8gUmVzcG9uc2UgVHlwZVxuICAgIHRoaXMuX3Jlc3BvbnNlVHlwZSA9IGluaXQucmVzcG9uc2VUeXBlO1xuXG4gICAgLy8gVGhlIEJvZHlcbiAgICB0aGlzLl9ib2R5ID0gaW5pdC5ib2R5ICE9PSB1bmRlZmluZWQgPyBpbml0LmJvZHkgOiBudWxsO1xuICAgIGlmICh0aGlzLl9ib2R5ICE9PSBudWxsKVxuICAgICAgdGhpcy5fYm9keSA9IHRoaXMucmVzb3VyY2Uuc2VyaWFsaXplKHRoaXMuX2JvZHksIGluaXQucGFyc2VyT3B0aW9ucyk7XG5cbiAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9XG4gICAgICBpbml0LndpdGhDcmVkZW50aWFscyA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5hcGkub3B0aW9ucy53aXRoQ3JlZGVudGlhbHNcbiAgICAgICAgOiBpbml0LndpdGhDcmVkZW50aWFscztcbiAgICB0aGlzLmZldGNoUG9saWN5ID0gaW5pdC5mZXRjaFBvbGljeSB8fCB0aGlzLmFwaS5vcHRpb25zLmZldGNoUG9saWN5O1xuICAgIHRoaXMuYm9keVF1ZXJ5T3B0aW9ucyA9IFtcbiAgICAgIC4uLih0aGlzLmFwaS5vcHRpb25zLmJvZHlRdWVyeU9wdGlvbnMgfHwgW10pLFxuICAgICAgLi4uKGluaXQuYm9keVF1ZXJ5T3B0aW9ucyB8fCBbXSksXG4gICAgXTtcblxuICAgIC8vIFRoZSBQYXRoIGFuZCBQYXJhbXMgZnJvbSByZXNvdXJjZVxuICAgIGNvbnN0IFtyZXNvdXJjZVBhdGgsIHJlc291cmNlUGFyYW1zXSA9IHRoaXMucmVzb3VyY2UucGF0aEFuZFBhcmFtcyhcbiAgICAgIGluaXQucGFyc2VyT3B0aW9ucyxcbiAgICApO1xuICAgIHRoaXMuX3BhdGggPSByZXNvdXJjZVBhdGg7XG5cbiAgICAvLyNyZWdpb24gSGVhZGVyc1xuICAgIGNvbnN0IGN1c3RvbUhlYWRlcnM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0gPSB7fTtcbiAgICBpZiAodHlwZW9mIGluaXQuZXRhZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5hcGkub3B0aW9ucy5ldGFnLmlmTWF0Y2ggJiZcbiAgICAgICAgWydQVVQnLCAnUEFUQ0gnLCAnREVMRVRFJ10uaW5kZXhPZih0aGlzLl9tZXRob2QpICE9PSAtMVxuICAgICAgKVxuICAgICAgICBjdXN0b21IZWFkZXJzW0lGX01BVENIX0hFQURFUl0gPSBpbml0LmV0YWc7XG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5hcGkub3B0aW9ucy5ldGFnLmlmTm9uZU1hdGNoICYmXG4gICAgICAgIFsnR0VUJ10uaW5kZXhPZih0aGlzLl9tZXRob2QpICE9PSAtMVxuICAgICAgKVxuICAgICAgICBjdXN0b21IZWFkZXJzW0lGX05PTkVfTUFUQ0hfSEVBREVSXSA9IGluaXQuZXRhZztcbiAgICB9XG5cbiAgICBjb25zdCBhY2NlcHQgPSBbXTtcbiAgICAvLyBNZXRhZGF0YVxuICAgIGlmICh0aGlzLmFwaS5vcHRpb25zLmFjY2VwdD8ubWV0YWRhdGEgIT09IHVuZGVmaW5lZClcbiAgICAgIGFjY2VwdC5wdXNoKGBvZGF0YS5tZXRhZGF0YT0ke3RoaXMuYXBpLm9wdGlvbnMuYWNjZXB0Py5tZXRhZGF0YX1gKTtcbiAgICAvLyBJRUVFNzU0XG4gICAgaWYgKHRoaXMuYXBpLm9wdGlvbnMuYWNjZXB0Py5pZWVlNzU0Q29tcGF0aWJsZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgYWNjZXB0LnB1c2goXG4gICAgICAgIGBJRUVFNzU0Q29tcGF0aWJsZT0ke3RoaXMuYXBpLm9wdGlvbnMuYWNjZXB0Py5pZWVlNzU0Q29tcGF0aWJsZX1gLFxuICAgICAgKTtcbiAgICAvLyBzdHJlYW1pbmdcbiAgICBpZiAodGhpcy5hcGkub3B0aW9ucy5hY2NlcHQ/LnN0cmVhbWluZyAhPT0gdW5kZWZpbmVkKVxuICAgICAgYWNjZXB0LnB1c2goYHN0cmVhbWluZz0ke3RoaXMuYXBpLm9wdGlvbnMuYWNjZXB0Py5zdHJlYW1pbmd9YCk7XG4gICAgLy8gRXhwb25lbnRpYWxEZWNpbWFsc1xuICAgIGlmICh0aGlzLmFwaS5vcHRpb25zLmFjY2VwdD8uZXhwb25lbnRpYWxEZWNpbWFscyAhPT0gdW5kZWZpbmVkKVxuICAgICAgYWNjZXB0LnB1c2goXG4gICAgICAgIGBFeHBvbmVudGlhbERlY2ltYWxzPSR7dGhpcy5hcGkub3B0aW9ucy5hY2NlcHQ/LmV4cG9uZW50aWFsRGVjaW1hbHN9YCxcbiAgICAgICk7XG4gICAgaWYgKGFjY2VwdC5sZW5ndGggPiAwKVxuICAgICAgY3VzdG9tSGVhZGVyc1tBQ0NFUFRdID0gW1xuICAgICAgICBgJHtBUFBMSUNBVElPTl9KU09OfTske2FjY2VwdC5qb2luKCc7Jyl9YCxcbiAgICAgICAgYCR7VEVYVF9QTEFJTn1gLFxuICAgICAgICBgJHtDT05URU5UX1RZUEVfQU5ZfWAsXG4gICAgICBdO1xuXG4gICAgY29uc3QgcHJlZmVyID0gW107XG4gICAgLy8gUmV0dXJuXG4gICAgaWYgKFxuICAgICAgdGhpcy5hcGkub3B0aW9ucy5wcmVmZXI/LnJldHVybiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJ10uaW5kZXhPZih0aGlzLl9tZXRob2QpICE9PSAtMVxuICAgIClcbiAgICAgIHByZWZlci5wdXNoKGByZXR1cm49JHt0aGlzLmFwaS5vcHRpb25zLnByZWZlcj8ucmV0dXJufWApO1xuICAgIC8vIE1heFBhZ2VTaXplXG4gICAgaWYgKFxuICAgICAgdGhpcy5hcGkub3B0aW9ucy5wcmVmZXI/Lm1heFBhZ2VTaXplICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIFsnR0VUJ10uaW5kZXhPZih0aGlzLl9tZXRob2QpICE9PSAtMVxuICAgIClcbiAgICAgIHByZWZlci5wdXNoKGBvZGF0YS5tYXhwYWdlc2l6ZT0ke3RoaXMuYXBpLm9wdGlvbnMucHJlZmVyPy5tYXhQYWdlU2l6ZX1gKTtcbiAgICAvLyBBbm5vdGF0aW9uc1xuICAgIGlmIChcbiAgICAgIHRoaXMuYXBpLm9wdGlvbnMucHJlZmVyPy5pbmNsdWRlQW5ub3RhdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgWydHRVQnXS5pbmRleE9mKHRoaXMuX21ldGhvZCkgIT09IC0xXG4gICAgKVxuICAgICAgcHJlZmVyLnB1c2goXG4gICAgICAgIGBvZGF0YS5pbmNsdWRlLWFubm90YXRpb25zPSR7dGhpcy5hcGkub3B0aW9ucy5wcmVmZXI/LmluY2x1ZGVBbm5vdGF0aW9uc31gLFxuICAgICAgKTtcbiAgICAvLyBPbWl0IE51bGwgVmFsdWVzXG4gICAgaWYgKFxuICAgICAgdGhpcy5hcGkub3B0aW9ucy5wcmVmZXI/Lm9taXROdWxsVmFsdWVzID09PSB0cnVlICYmXG4gICAgICBbJ0dFVCddLmluZGV4T2YodGhpcy5fbWV0aG9kKSAhPT0gLTFcbiAgICApXG4gICAgICBwcmVmZXIucHVzaChgb21pdC12YWx1ZXM9bnVsbHNgKTtcbiAgICAvLyBDb250aW51ZSBvbiBFcnJvclxuICAgIGlmIChcbiAgICAgIHRoaXMuYXBpLm9wdGlvbnMucHJlZmVyPy5jb250aW51ZU9uRXJyb3IgPT09IHRydWUgJiZcbiAgICAgIFsnUE9TVCddLmluZGV4T2YodGhpcy5fbWV0aG9kKSAhPT0gLTFcbiAgICApXG4gICAgICBwcmVmZXIucHVzaChgb2RhdGEuY29udGludWUtb24tZXJyb3JgKTtcbiAgICBpZiAocHJlZmVyLmxlbmd0aCA+IDApIGN1c3RvbUhlYWRlcnNbUFJFRkVSXSA9IHByZWZlcjtcbiAgICB0aGlzLl9oZWFkZXJzID0gSHR0cC5tZXJnZUh0dHBIZWFkZXJzKFxuICAgICAgdGhpcy5hcGkub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgY3VzdG9tSGVhZGVycyxcbiAgICAgIGluaXQuaGVhZGVycyB8fCB7fSxcbiAgICApO1xuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgLy8jcmVnaW9uIFBhcmFtc1xuICAgIGNvbnN0IGN1c3RvbVBhcmFtczogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfSA9IHt9O1xuICAgIGlmIChcbiAgICAgIFsnUE9TVCcsICdQVVQnLCAnUEFUQ0gnXS5pbmRleE9mKHRoaXMuX21ldGhvZCkgIT09IC0xICYmXG4gICAgICAnJHNlbGVjdCcgaW4gcmVzb3VyY2VQYXJhbXNcbiAgICApIHtcbiAgICAgIGN1c3RvbVBhcmFtc1snJHNlbGVjdCddID0gcmVzb3VyY2VQYXJhbXNbJyRzZWxlY3QnXTtcbiAgICB9XG4gICAgaWYgKFsnUE9TVCddLmluZGV4T2YodGhpcy5fbWV0aG9kKSAhPT0gLTEgJiYgJyRleHBhbmQnIGluIHJlc291cmNlUGFyYW1zKSB7XG4gICAgICBjdXN0b21QYXJhbXNbJyRleHBhbmQnXSA9IHJlc291cmNlUGFyYW1zWyckZXhwYW5kJ107XG4gICAgfVxuICAgIGlmIChbJ0dFVCddLmluZGV4T2YodGhpcy5fbWV0aG9kKSAhPT0gLTEpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY3VzdG9tUGFyYW1zLCByZXNvdXJjZVBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zID0gSHR0cC5tZXJnZUh0dHBQYXJhbXMoXG4gICAgICB0aGlzLmFwaS5vcHRpb25zLnBhcmFtcyxcbiAgICAgIGN1c3RvbVBhcmFtcyxcbiAgICAgIGluaXQucGFyYW1zIHx8IHt9LFxuICAgICk7XG5cbiAgICB0aGlzLl9wYXJhbXMgPVxuICAgICAgdGhpcy5fcmVzcG9uc2VUeXBlID09PSAnZW50aXR5J1xuICAgICAgICA/IEh0dHAud2l0aG91dEh0dHBQYXJhbXMocGFyYW1zLCBbXG4gICAgICAgICAgICAnJGZpbHRlcicsXG4gICAgICAgICAgICAnJG9yZGVyYnknLFxuICAgICAgICAgICAgJyRjb3VudCcsXG4gICAgICAgICAgICAnJHNraXAnLFxuICAgICAgICAgICAgJyR0b3AnLFxuICAgICAgICAgIF0pXG4gICAgICAgIDogcGFyYW1zO1xuICAgIC8vI2VuZHJlZ2lvblxuICB9XG5cbiAgc3RhdGljIGZhY3RvcnkoXG4gICAgYXBpOiBPRGF0YUFwaSxcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk/OiBhbnk7XG4gICAgICBldGFnPzogc3RyaW5nO1xuICAgICAgcmVzcG9uc2VUeXBlPzpcbiAgICAgICAgfCAnYXJyYXlidWZmZXInXG4gICAgICAgIHwgJ2Jsb2InXG4gICAgICAgIHwgJ2pzb24nXG4gICAgICAgIHwgJ3RleHQnXG4gICAgICAgIHwgJ3ZhbHVlJ1xuICAgICAgICB8ICdwcm9wZXJ0eSdcbiAgICAgICAgfCAnZW50aXR5J1xuICAgICAgICB8ICdlbnRpdGllcyc7XG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJyB8ICdyZXNwb25zZSc7XG4gICAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICAgICAgYm9keVF1ZXJ5T3B0aW9ucz86IFF1ZXJ5T3B0aW9uW107XG4gICAgfSxcbiAgKSB7XG4gICAgY29uc3QgYXBpT3B0aW9ucyA9IGFwaS5vcHRpb25zO1xuICAgIGxldCBwYXJhbXMgPSBvcHRpb25zLnBhcmFtcyB8fCB7fTtcbiAgICBpZiAob3B0aW9ucy53aXRoQ291bnQpIHtcbiAgICAgIHBhcmFtcyA9IEh0dHAubWVyZ2VIdHRwUGFyYW1zKHBhcmFtcywgYXBpT3B0aW9ucy5oZWxwZXIuY291bnRQYXJhbSgpKTtcbiAgICB9XG5cbiAgICBsZXQgZXRhZyA9IG9wdGlvbnMuZXRhZztcbiAgICBpZiAoZXRhZyA9PT0gdW5kZWZpbmVkICYmIFR5cGVzLmlzUGxhaW5PYmplY3Qob3B0aW9ucy5ib2R5KSkge1xuICAgICAgZXRhZyA9IGFwaU9wdGlvbnMuaGVscGVyLmV0YWcob3B0aW9ucy5ib2R5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE9EYXRhUmVxdWVzdCh7XG4gICAgICBtZXRob2QsXG4gICAgICBldGFnLFxuICAgICAgYXBpLFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBwYXJhbXMsXG4gICAgICBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsXG4gICAgICBib2R5OiBvcHRpb25zLmJvZHksXG4gICAgICBvYnNlcnZlOiBvcHRpb25zLm9ic2VydmUsXG4gICAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMsXG4gICAgICByZXBvcnRQcm9ncmVzczogb3B0aW9ucy5yZXBvcnRQcm9ncmVzcyxcbiAgICAgIHJlc3BvbnNlVHlwZTogb3B0aW9ucy5yZXNwb25zZVR5cGUsXG4gICAgICBmZXRjaFBvbGljeTogb3B0aW9ucy5mZXRjaFBvbGljeSxcbiAgICAgIHBhcnNlck9wdGlvbnM6IG9wdGlvbnMucGFyc2VyT3B0aW9ucyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICBib2R5UXVlcnlPcHRpb25zOiBvcHRpb25zLmJvZHlRdWVyeU9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBnZXQgcmVzcG9uc2VUeXBlKCk6ICdhcnJheWJ1ZmZlcicgfCAnYmxvYicgfCAnanNvbicgfCAndGV4dCcge1xuICAgIHJldHVybiB0aGlzLl9yZXNwb25zZVR5cGUgJiZcbiAgICAgIFsncHJvcGVydHknLCAnZW50aXR5JywgJ2VudGl0aWVzJ10uaW5kZXhPZih0aGlzLl9yZXNwb25zZVR5cGUpICE9PSAtMVxuICAgICAgPyAnanNvbidcbiAgICAgIDogdGhpcy5fcmVzcG9uc2VUeXBlID09PSAndmFsdWUnXG4gICAgICAgID8gJ3RleHQnXG4gICAgICAgIDogPCdhcnJheWJ1ZmZlcicgfCAnYmxvYicgfCAnanNvbicgfCAndGV4dCc+dGhpcy5fcmVzcG9uc2VUeXBlO1xuICB9XG5cbiAgZ2V0IHBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNRdWVyeUJvZHkoKSA/IGAke3RoaXMuX3BhdGh9LyR7JFFVRVJZfWAgOiB0aGlzLl9wYXRoO1xuICB9XG5cbiAgZ2V0IG1ldGhvZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1F1ZXJ5Qm9keSgpID8gJ1BPU1QnIDogdGhpcy5fbWV0aG9kO1xuICB9XG5cbiAgZ2V0IGJvZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNRdWVyeUJvZHkoKVxuICAgICAgPyBIdHRwLnNwbGl0SHR0cFBhcmFtcyhcbiAgICAgICAgICB0aGlzLl9wYXJhbXMsXG4gICAgICAgICAgdGhpcy5ib2R5UXVlcnlPcHRpb25zLm1hcCgobmFtZSkgPT4gYCQke25hbWV9YCksXG4gICAgICAgIClbMV0udG9TdHJpbmcoKVxuICAgICAgOiB0aGlzLl9ib2R5O1xuICB9XG5cbiAgZ2V0IHBhcmFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1F1ZXJ5Qm9keSgpXG4gICAgICA/IEh0dHAuc3BsaXRIdHRwUGFyYW1zKFxuICAgICAgICAgIHRoaXMuX3BhcmFtcyxcbiAgICAgICAgICB0aGlzLmJvZHlRdWVyeU9wdGlvbnMubWFwKChuYW1lKSA9PiBgJCR7bmFtZX1gKSxcbiAgICAgICAgKVswXVxuICAgICAgOiB0aGlzLl9wYXJhbXM7XG4gIH1cblxuICBnZXQgaGVhZGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1F1ZXJ5Qm9keSgpXG4gICAgICA/IEh0dHAubWVyZ2VIdHRwSGVhZGVycyh0aGlzLl9oZWFkZXJzLCB7IENPTlRFTlRfVFlQRTogVEVYVF9QTEFJTiB9KVxuICAgICAgOiB0aGlzLl9oZWFkZXJzO1xuICB9XG5cbiAgZ2V0IHBhdGhXaXRoUGFyYW1zKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5rZXlzKCkubGVuZ3RoID4gMFxuICAgICAgPyBgJHt0aGlzLnBhdGh9PyR7dGhpcy5wYXJhbXN9YFxuICAgICAgOiB0aGlzLnBhdGg7XG4gIH1cblxuICBnZXQgdXJsKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmFwaS5zZXJ2aWNlUm9vdFVybH0ke3RoaXMucGF0aH1gO1xuICB9XG5cbiAgZ2V0IHVybFdpdGhQYXJhbXMoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuYXBpLnNlcnZpY2VSb290VXJsfSR7dGhpcy5wYXRoV2l0aFBhcmFtc31gO1xuICB9XG5cbiAgZ2V0IGNhY2hlS2V5KCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJhbXMua2V5cygpLmxlbmd0aCA+IDBcbiAgICAgID8gYCR7dGhpcy5fcGF0aH0/JHt0aGlzLl9wYXJhbXN9YFxuICAgICAgOiB0aGlzLl9wYXRoO1xuICB9XG5cbiAgaXNRdWVyeUJvZHkoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX21ldGhvZCA9PT0gJ0dFVCcgJiZcbiAgICAgIHRoaXMuYm9keVF1ZXJ5T3B0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLmJvZHlRdWVyeU9wdGlvbnMuc29tZSgobmFtZSkgPT4gdGhpcy5fcGFyYW1zLmhhcyhgJCR7bmFtZX1gKSlcbiAgICApO1xuICB9XG5cbiAgaXNCYXRjaCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXRoLmVuZHNXaXRoKCRCQVRDSCk7XG4gIH1cblxuICBpc0ZldGNoKCkge1xuICAgIHJldHVybiBbJ0dFVCddLmluZGV4T2YodGhpcy5fbWV0aG9kKSAhPT0gLTE7XG4gIH1cblxuICBpc011dGF0ZSgpIHtcbiAgICByZXR1cm4gWydQVVQnLCAnUEFUQ0gnLCAnUE9TVCcsICdERUxFVEUnXS5pbmRleE9mKHRoaXMuX21ldGhvZCkgIT09IC0xO1xuICB9XG59XG4iXX0=