angular-odata
Version:
Client side OData typescript library for Angular
180 lines • 25.9 kB
JavaScript
import { HttpHeaders, HttpResponse } from '@angular/common/http';
import { ODataEntityAnnotations, ODataEntitiesAnnotations, ODataPropertyAnnotations, } from '../annotations';
import { Types } from '../utils/types';
import { APPLICATION_JSON, ODATA_VERSION_HEADERS, CONTENT_TYPE, CACHE_CONTROL, LOCATION_HEADER, ETAG_HEADERS, ODATA_ENTITYID_HEADERS, PREFERENCE_APPLIED, } from '../constants';
import { Http } from '../utils/http';
import { ODataResponseOptions } from './options';
/**
* OData Response
*/
export class ODataResponse extends HttpResponse {
api;
resource;
constructor(init) {
super(init);
this.api = init.api;
this.resource = init.resource;
}
static fromHttpResponse(req, res) {
return new ODataResponse({
api: req.api,
resource: req.resource,
body: res.body,
headers: res.headers,
status: res.status,
statusText: res.statusText,
url: res.url || undefined,
});
}
static fromJson(req, json) {
return new ODataResponse({
api: req.api,
resource: req.resource,
body: json.body,
headers: new HttpHeaders(json.headers),
status: json.status,
statusText: json.statusText,
url: json.url || undefined,
});
}
toJson() {
return {
body: this.body,
headers: this.headers
.keys()
.map((name) => ({ [name]: this.headers.getAll(name) || [] }))
.reduce((acc, header) => Object.assign(acc, header), {}),
status: this.status,
statusText: this.statusText,
url: this.url,
};
}
_options;
get options() {
if (this._options === undefined) {
this._options = new ODataResponseOptions(this.api.options.parserOptions);
const contentType = this.headers.get(CONTENT_TYPE);
if (contentType && contentType.includes(APPLICATION_JSON)) {
const features = contentType
.split(',')
.find((p) => p.startsWith(APPLICATION_JSON));
this._options.setFeatures(features);
}
const headerKey = Http.resolveHeaderKey(this.headers, ODATA_VERSION_HEADERS);
if (headerKey) {
const version = (this.headers.get(headerKey) || '').replace(/\;/g, '');
this._options.setVersion(version);
}
const preferenceApplied = this.headers.get(PREFERENCE_APPLIED);
if (preferenceApplied) {
this._options.setPreferenceApplied(preferenceApplied);
}
const location = this.headers.get(LOCATION_HEADER);
if (location) {
this._options.setLocation(location);
}
const cacheControl = this.headers.get(CACHE_CONTROL);
if (cacheControl) {
this._options.setCache(cacheControl);
}
}
return this._options;
}
_payload;
get payload() {
if (this._payload === undefined) {
this._payload =
this.body && this.options.version === '2.0'
? this.body['d']
: this.body;
}
return this._payload;
}
_context;
get context() {
if (this._context === undefined) {
this._context = this.options.helper.context(Types.isPlainObject(this.payload) ? this.payload : {});
}
return this._context;
}
_annotations;
get annotations() {
if (this._annotations === undefined) {
const options = this.options;
this._annotations = options.helper.annotations(this.payload || {});
let key = Http.resolveHeaderKey(this.headers, ETAG_HEADERS);
if (key) {
const etag = this.headers.get(key);
if (etag)
this._annotations.set(options.helper.ODATA_ETAG, etag);
}
key = Http.resolveHeaderKey(this.headers, ODATA_ENTITYID_HEADERS);
if (key) {
const entityId = this.headers.get(key);
if (entityId)
this._annotations.set(options.helper.ODATA_ID, entityId);
}
}
return this._annotations;
}
/**
* Handle the response body as an entity
* @returns
*/
entity() {
const options = this.options;
const payload = this.payload;
const annots = new ODataEntityAnnotations(options.helper, this.annotations, this.context);
const data = payload ? annots.data(payload) : null;
let entity = (data !== null && Types.isPlainObject(data)
? options.helper.attributes(data, this.api.options.stripMetadata)
: data);
if (entity !== null)
entity = this.resource.deserialize(entity, options);
return { entity, annots };
}
/**
* Handle the response body as entities
* @returns
*/
entities() {
const options = this.options;
const payload = this.payload;
const annots = new ODataEntitiesAnnotations(options.helper, this.annotations, this.context);
let entities = payload ? annots.data(payload) : null;
if (entities !== null)
entities = this.resource.deserialize(entities, options);
return { entities, annots };
}
/**
* Handle the response body as a property
* @returns
*/
property() {
const options = this.options;
const payload = this.payload;
const annots = new ODataPropertyAnnotations(options.helper, this.annotations, this.context);
const data = payload ? annots.data(payload) : null;
let property = (data !== null && Types.isPlainObject(data)
? options.helper.attributes(data, this.api.options.stripMetadata)
: data);
if (property !== null)
property = this.resource.deserialize(property, options);
return { property, annots };
}
/**
* Handle the response body as a value
* @returns
*/
value() {
const options = this.options;
const payload = this.payload;
let value = (payload !== null && Types.isPlainObject(payload)
? options.helper.attributes(payload, this.api.options.stripMetadata)
: payload);
if (value !== null)
value = this.resource.deserialize(value, options);
return value;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3Jlc3BvbnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakUsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix3QkFBd0IsRUFDeEIsd0JBQXdCLEdBQ3pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFlBQVksRUFDWixhQUFhLEVBQ2IsZUFBZSxFQUNmLFlBQVksRUFDWixzQkFBc0IsRUFDdEIsa0JBQWtCLEdBQ25CLE1BQU0sY0FBYyxDQUFDO0FBR3RCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBaUJqRDs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFpQixTQUFRLFlBQWU7SUFDMUMsR0FBRyxDQUFXO0lBQ2QsUUFBUSxDQUFtQjtJQUVwQyxZQUFZLElBUVg7UUFDQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUksR0FBb0IsRUFBRSxHQUFvQjtRQUNuRSxPQUFPLElBQUksYUFBYSxDQUFJO1lBQzFCLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztZQUNaLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtZQUN0QixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7WUFDZCxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87WUFDcEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1lBQ2xCLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtZQUMxQixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxTQUFTO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUNiLEdBQW9CLEVBQ3BCLElBTUM7UUFFRCxPQUFPLElBQUksYUFBYSxDQUFJO1lBQzFCLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztZQUNaLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtZQUN0QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN0QyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVM7U0FDM0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2lCQUNsQixJQUFJLEVBQUU7aUJBQ04sR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2lCQUM1RCxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUQsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVPLFFBQVEsQ0FBd0I7SUFDeEMsSUFBSSxPQUFPO1FBQ1QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN6RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuRCxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxRQUFRLEdBQUcsV0FBVztxQkFDekIsS0FBSyxDQUFDLEdBQUcsQ0FBQztxQkFDVixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBVyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUNyQyxJQUFJLENBQUMsT0FBTyxFQUNaLHFCQUFxQixDQUN0QixDQUFDO1lBQ0YsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FDekQsS0FBSyxFQUNMLEVBQUUsQ0FDc0IsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsQ0FBQztZQUVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMvRCxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDbkQsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDckQsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVPLFFBQVEsQ0FBTztJQUN2QixJQUFJLE9BQU87UUFDVCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVE7Z0JBQ1gsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxLQUFLO29CQUN6QyxDQUFDLENBQU8sSUFBSSxDQUFDLElBQUssQ0FBQyxHQUFHLENBQUM7b0JBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVPLFFBQVEsQ0FBTztJQUN2QixJQUFJLE9BQU87UUFDVCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ3pDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ3RELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxZQUFZLENBQW9CO0lBQ3hDLElBQUksV0FBVztRQUNiLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNuRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM1RCxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLElBQUk7b0JBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkUsQ0FBQztZQUNELEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1lBQ2xFLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksUUFBUTtvQkFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN6RSxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTTtRQUNKLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDN0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLHNCQUFzQixDQUN2QyxPQUFPLENBQUMsTUFBTSxFQUNkLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxPQUFPLENBQ2IsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25ELElBQUksTUFBTSxHQUFHLENBQ1gsSUFBSSxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztZQUN4QyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUNqRSxDQUFDLENBQUMsSUFBSSxDQUNHLENBQUM7UUFFZCxJQUFJLE1BQU0sS0FBSyxJQUFJO1lBQ2pCLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFNLENBQUM7UUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUTtRQUNOLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDN0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLHdCQUF3QixDQUN6QyxPQUFPLENBQUMsTUFBTSxFQUNkLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxPQUFPLENBQ2IsQ0FBQztRQUNGLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3JELElBQUksUUFBUSxLQUFLLElBQUk7WUFDbkIsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQVEsQ0FBQztRQUNqRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRO1FBQ04sTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksd0JBQXdCLENBQ3pDLE9BQU8sQ0FBQyxNQUFNLEVBQ2QsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FDYixDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUQsSUFBSSxRQUFRLEdBQUcsQ0FDYixJQUFJLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FDdkIsSUFBK0IsRUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUMvQjtZQUNILENBQUMsQ0FBQyxJQUFJLENBQ0csQ0FBQztRQUVkLElBQUksUUFBUSxLQUFLLElBQUk7WUFDbkIsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQU0sQ0FBQztRQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksS0FBSyxHQUFHLENBQ1YsT0FBTyxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUM5QyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUNwRSxDQUFDLENBQUMsT0FBTyxDQUNBLENBQUM7UUFFZCxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQU0sQ0FBQztRQUMzRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1xuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxuICBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMsXG4gIE9EYXRhUHJvcGVydHlBbm5vdGF0aW9ucyxcbn0gZnJvbSAnLi4vYW5ub3RhdGlvbnMnO1xuaW1wb3J0IHsgVHlwZXMgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XG5pbXBvcnQgeyBPRGF0YVJlc291cmNlIH0gZnJvbSAnLi9yZXNvdXJjZSc7XG5pbXBvcnQge1xuICBBUFBMSUNBVElPTl9KU09OLFxuICBPREFUQV9WRVJTSU9OX0hFQURFUlMsXG4gIENPTlRFTlRfVFlQRSxcbiAgQ0FDSEVfQ09OVFJPTCxcbiAgTE9DQVRJT05fSEVBREVSLFxuICBFVEFHX0hFQURFUlMsXG4gIE9EQVRBX0VOVElUWUlEX0hFQURFUlMsXG4gIFBSRUZFUkVOQ0VfQVBQTElFRCxcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhQXBpIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IE9EYXRhUmVxdWVzdCB9IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQgeyBIdHRwIH0gZnJvbSAnLi4vdXRpbHMvaHR0cCc7XG5pbXBvcnQgeyBPRGF0YUNvbnRleHQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgT0RhdGFSZXNwb25zZU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuXG5leHBvcnQgdHlwZSBPRGF0YUVudGl0eTxUPiA9IHtcbiAgZW50aXR5OiBUIHwgbnVsbDtcbiAgYW5ub3RzOiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+O1xufTtcblxuZXhwb3J0IHR5cGUgT0RhdGFFbnRpdGllczxUPiA9IHtcbiAgZW50aXRpZXM6IFRbXSB8IG51bGw7XG4gIGFubm90czogT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPFQ+O1xufTtcblxuZXhwb3J0IHR5cGUgT0RhdGFQcm9wZXJ0eTxUPiA9IHtcbiAgcHJvcGVydHk6IFQgfCBudWxsO1xuICBhbm5vdHM6IE9EYXRhUHJvcGVydHlBbm5vdGF0aW9uczxUPjtcbn07XG5cbi8qKlxuICogT0RhdGEgUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGNsYXNzIE9EYXRhUmVzcG9uc2U8VD4gZXh0ZW5kcyBIdHRwUmVzcG9uc2U8VD4ge1xuICByZWFkb25seSBhcGk6IE9EYXRhQXBpO1xuICByZWFkb25seSByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxUPjtcblxuICBjb25zdHJ1Y3Rvcihpbml0OiB7XG4gICAgYXBpOiBPRGF0YUFwaTtcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxUPjtcbiAgICBib2R5OiBUIHwgbnVsbDtcbiAgICBoZWFkZXJzOiBIdHRwSGVhZGVycztcbiAgICBzdGF0dXM6IG51bWJlcjtcbiAgICBzdGF0dXNUZXh0OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICB9KSB7XG4gICAgc3VwZXIoaW5pdCk7XG4gICAgdGhpcy5hcGkgPSBpbml0LmFwaTtcbiAgICB0aGlzLnJlc291cmNlID0gaW5pdC5yZXNvdXJjZTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSHR0cFJlc3BvbnNlPFQ+KHJlcTogT0RhdGFSZXF1ZXN0PFQ+LCByZXM6IEh0dHBSZXNwb25zZTxUPikge1xuICAgIHJldHVybiBuZXcgT0RhdGFSZXNwb25zZTxUPih7XG4gICAgICBhcGk6IHJlcS5hcGksXG4gICAgICByZXNvdXJjZTogcmVxLnJlc291cmNlLFxuICAgICAgYm9keTogcmVzLmJvZHksXG4gICAgICBoZWFkZXJzOiByZXMuaGVhZGVycyxcbiAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHJlcy5zdGF0dXNUZXh0LFxuICAgICAgdXJsOiByZXMudXJsIHx8IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSnNvbjxUPihcbiAgICByZXE6IE9EYXRhUmVxdWVzdDxUPixcbiAgICBqc29uOiB7XG4gICAgICBib2R5OiBUIHwgbnVsbDtcbiAgICAgIGhlYWRlcnM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH07XG4gICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgIHN0YXR1c1RleHQ6IHN0cmluZztcbiAgICAgIHVybDogc3RyaW5nIHwgbnVsbDtcbiAgICB9LFxuICApIHtcbiAgICByZXR1cm4gbmV3IE9EYXRhUmVzcG9uc2U8VD4oe1xuICAgICAgYXBpOiByZXEuYXBpLFxuICAgICAgcmVzb3VyY2U6IHJlcS5yZXNvdXJjZSxcbiAgICAgIGJvZHk6IGpzb24uYm9keSxcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhqc29uLmhlYWRlcnMpLFxuICAgICAgc3RhdHVzOiBqc29uLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IGpzb24uc3RhdHVzVGV4dCxcbiAgICAgIHVybDoganNvbi51cmwgfHwgdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgdG9Kc29uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBib2R5OiB0aGlzLmJvZHksXG4gICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnNcbiAgICAgICAgLmtleXMoKVxuICAgICAgICAubWFwKChuYW1lKSA9PiAoeyBbbmFtZV06IHRoaXMuaGVhZGVycy5nZXRBbGwobmFtZSkgfHwgW10gfSkpXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgaGVhZGVyKSA9PiBPYmplY3QuYXNzaWduKGFjYywgaGVhZGVyKSwge30pLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHRoaXMuc3RhdHVzVGV4dCxcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX29wdGlvbnM/OiBPRGF0YVJlc3BvbnNlT3B0aW9ucztcbiAgZ2V0IG9wdGlvbnMoKTogT0RhdGFSZXNwb25zZU9wdGlvbnMge1xuICAgIGlmICh0aGlzLl9vcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX29wdGlvbnMgPSBuZXcgT0RhdGFSZXNwb25zZU9wdGlvbnModGhpcy5hcGkub3B0aW9ucy5wYXJzZXJPcHRpb25zKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gdGhpcy5oZWFkZXJzLmdldChDT05URU5UX1RZUEUpO1xuICAgICAgaWYgKGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluY2x1ZGVzKEFQUExJQ0FUSU9OX0pTT04pKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gY29udGVudFR5cGVcbiAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgIC5maW5kKChwKSA9PiBwLnN0YXJ0c1dpdGgoQVBQTElDQVRJT05fSlNPTikpIGFzIHN0cmluZztcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5zZXRGZWF0dXJlcyhmZWF0dXJlcyk7XG4gICAgICB9XG4gICAgICBjb25zdCBoZWFkZXJLZXkgPSBIdHRwLnJlc29sdmVIZWFkZXJLZXkoXG4gICAgICAgIHRoaXMuaGVhZGVycyxcbiAgICAgICAgT0RBVEFfVkVSU0lPTl9IRUFERVJTLFxuICAgICAgKTtcbiAgICAgIGlmIChoZWFkZXJLZXkpIHtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9ICh0aGlzLmhlYWRlcnMuZ2V0KGhlYWRlcktleSkgfHwgJycpLnJlcGxhY2UoXG4gICAgICAgICAgL1xcOy9nLFxuICAgICAgICAgICcnLFxuICAgICAgICApIGFzICcyLjAnIHwgJzMuMCcgfCAnNC4wJztcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5zZXRWZXJzaW9uKHZlcnNpb24pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcmVmZXJlbmNlQXBwbGllZCA9IHRoaXMuaGVhZGVycy5nZXQoUFJFRkVSRU5DRV9BUFBMSUVEKTtcbiAgICAgIGlmIChwcmVmZXJlbmNlQXBwbGllZCkge1xuICAgICAgICB0aGlzLl9vcHRpb25zLnNldFByZWZlcmVuY2VBcHBsaWVkKHByZWZlcmVuY2VBcHBsaWVkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmhlYWRlcnMuZ2V0KExPQ0FUSU9OX0hFQURFUik7XG4gICAgICBpZiAobG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5zZXRMb2NhdGlvbihsb2NhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhY2hlQ29udHJvbCA9IHRoaXMuaGVhZGVycy5nZXQoQ0FDSEVfQ09OVFJPTCk7XG4gICAgICBpZiAoY2FjaGVDb250cm9sKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMuc2V0Q2FjaGUoY2FjaGVDb250cm9sKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIF9wYXlsb2FkPzogYW55O1xuICBnZXQgcGF5bG9hZCgpIHtcbiAgICBpZiAodGhpcy5fcGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wYXlsb2FkID1cbiAgICAgICAgdGhpcy5ib2R5ICYmIHRoaXMub3B0aW9ucy52ZXJzaW9uID09PSAnMi4wJ1xuICAgICAgICAgID8gKDxhbnk+dGhpcy5ib2R5KVsnZCddXG4gICAgICAgICAgOiB0aGlzLmJvZHk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wYXlsb2FkO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29udGV4dD86IGFueTtcbiAgZ2V0IGNvbnRleHQoKTogT0RhdGFDb250ZXh0IHtcbiAgICBpZiAodGhpcy5fY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gdGhpcy5vcHRpb25zLmhlbHBlci5jb250ZXh0KFxuICAgICAgICBUeXBlcy5pc1BsYWluT2JqZWN0KHRoaXMucGF5bG9hZCkgPyB0aGlzLnBheWxvYWQgOiB7fSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBfYW5ub3RhdGlvbnM/OiBNYXA8c3RyaW5nLCBhbnk+O1xuICBnZXQgYW5ub3RhdGlvbnMoKTogTWFwPHN0cmluZywgYW55PiB7XG4gICAgaWYgKHRoaXMuX2Fubm90YXRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IG9wdGlvbnMuaGVscGVyLmFubm90YXRpb25zKHRoaXMucGF5bG9hZCB8fCB7fSk7XG4gICAgICBsZXQga2V5ID0gSHR0cC5yZXNvbHZlSGVhZGVyS2V5KHRoaXMuaGVhZGVycywgRVRBR19IRUFERVJTKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgY29uc3QgZXRhZyA9IHRoaXMuaGVhZGVycy5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGV0YWcpIHRoaXMuX2Fubm90YXRpb25zLnNldChvcHRpb25zLmhlbHBlci5PREFUQV9FVEFHLCBldGFnKTtcbiAgICAgIH1cbiAgICAgIGtleSA9IEh0dHAucmVzb2x2ZUhlYWRlcktleSh0aGlzLmhlYWRlcnMsIE9EQVRBX0VOVElUWUlEX0hFQURFUlMpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IHRoaXMuaGVhZGVycy5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGVudGl0eUlkKSB0aGlzLl9hbm5vdGF0aW9ucy5zZXQob3B0aW9ucy5oZWxwZXIuT0RBVEFfSUQsIGVudGl0eUlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgcmVzcG9uc2UgYm9keSBhcyBhbiBlbnRpdHlcbiAgICogQHJldHVybnNcbiAgICovXG4gIGVudGl0eSgpOiBPRGF0YUVudGl0eTxUPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5wYXlsb2FkO1xuICAgIGNvbnN0IGFubm90cyA9IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+KFxuICAgICAgb3B0aW9ucy5oZWxwZXIsXG4gICAgICB0aGlzLmFubm90YXRpb25zLFxuICAgICAgdGhpcy5jb250ZXh0LFxuICAgICk7XG4gICAgY29uc3QgZGF0YSA9IHBheWxvYWQgPyBhbm5vdHMuZGF0YShwYXlsb2FkKSA6IG51bGw7XG4gICAgbGV0IGVudGl0eSA9IChcbiAgICAgIGRhdGEgIT09IG51bGwgJiYgVHlwZXMuaXNQbGFpbk9iamVjdChkYXRhKVxuICAgICAgICA/IG9wdGlvbnMuaGVscGVyLmF0dHJpYnV0ZXMoZGF0YSwgdGhpcy5hcGkub3B0aW9ucy5zdHJpcE1ldGFkYXRhKVxuICAgICAgICA6IGRhdGFcbiAgICApIGFzIFQgfCBudWxsO1xuXG4gICAgaWYgKGVudGl0eSAhPT0gbnVsbClcbiAgICAgIGVudGl0eSA9IHRoaXMucmVzb3VyY2UuZGVzZXJpYWxpemUoZW50aXR5LCBvcHRpb25zKSBhcyBUO1xuICAgIHJldHVybiB7IGVudGl0eSwgYW5ub3RzIH07XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRoZSByZXNwb25zZSBib2R5IGFzIGVudGl0aWVzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBlbnRpdGllcygpOiBPRGF0YUVudGl0aWVzPFQ+IHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnBheWxvYWQ7XG4gICAgY29uc3QgYW5ub3RzID0gbmV3IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxUPihcbiAgICAgIG9wdGlvbnMuaGVscGVyLFxuICAgICAgdGhpcy5hbm5vdGF0aW9ucyxcbiAgICAgIHRoaXMuY29udGV4dCxcbiAgICApO1xuICAgIGxldCBlbnRpdGllcyA9IHBheWxvYWQgPyBhbm5vdHMuZGF0YShwYXlsb2FkKSA6IG51bGw7XG4gICAgaWYgKGVudGl0aWVzICE9PSBudWxsKVxuICAgICAgZW50aXRpZXMgPSB0aGlzLnJlc291cmNlLmRlc2VyaWFsaXplKGVudGl0aWVzLCBvcHRpb25zKSBhcyBUW107XG4gICAgcmV0dXJuIHsgZW50aXRpZXMsIGFubm90cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgcmVzcG9uc2UgYm9keSBhcyBhIHByb3BlcnR5XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcm9wZXJ0eSgpOiBPRGF0YVByb3BlcnR5PFQ+IHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnBheWxvYWQ7XG4gICAgY29uc3QgYW5ub3RzID0gbmV3IE9EYXRhUHJvcGVydHlBbm5vdGF0aW9uczxUPihcbiAgICAgIG9wdGlvbnMuaGVscGVyLFxuICAgICAgdGhpcy5hbm5vdGF0aW9ucyxcbiAgICAgIHRoaXMuY29udGV4dCxcbiAgICApO1xuICAgIGNvbnN0IGRhdGEgPSBwYXlsb2FkID8gKGFubm90cy5kYXRhKHBheWxvYWQpIGFzIFQpIDogbnVsbDtcbiAgICBsZXQgcHJvcGVydHkgPSAoXG4gICAgICBkYXRhICE9PSBudWxsICYmIFR5cGVzLmlzUGxhaW5PYmplY3QoZGF0YSlcbiAgICAgICAgPyBvcHRpb25zLmhlbHBlci5hdHRyaWJ1dGVzKFxuICAgICAgICAgICAgZGF0YSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICAgICAgICAgIHRoaXMuYXBpLm9wdGlvbnMuc3RyaXBNZXRhZGF0YSxcbiAgICAgICAgICApXG4gICAgICAgIDogZGF0YVxuICAgICkgYXMgVCB8IG51bGw7XG5cbiAgICBpZiAocHJvcGVydHkgIT09IG51bGwpXG4gICAgICBwcm9wZXJ0eSA9IHRoaXMucmVzb3VyY2UuZGVzZXJpYWxpemUocHJvcGVydHksIG9wdGlvbnMpIGFzIFQ7XG4gICAgcmV0dXJuIHsgcHJvcGVydHksIGFubm90cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgcmVzcG9uc2UgYm9keSBhcyBhIHZhbHVlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB2YWx1ZSgpOiBUIHwgbnVsbCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5wYXlsb2FkO1xuICAgIGxldCB2YWx1ZSA9IChcbiAgICAgIHBheWxvYWQgIT09IG51bGwgJiYgVHlwZXMuaXNQbGFpbk9iamVjdChwYXlsb2FkKVxuICAgICAgICA/IG9wdGlvbnMuaGVscGVyLmF0dHJpYnV0ZXMocGF5bG9hZCwgdGhpcy5hcGkub3B0aW9ucy5zdHJpcE1ldGFkYXRhKVxuICAgICAgICA6IHBheWxvYWRcbiAgICApIGFzIFQgfCBudWxsO1xuXG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSB2YWx1ZSA9IHRoaXMucmVzb3VyY2UuZGVzZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpIGFzIFQ7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4iXX0=