angular-odata
Version:
Client side OData typescript library for Angular
548 lines • 76.2 kB
JavaScript
import { COMPUTED, DEFAULT_VERSION, DESCRIPTION, LONG_DESCRIPTION, } from '../../constants';
import { ODataHelper } from '../../helper';
import { raw } from '../../resources/query';
import { NONE_PARSER, EdmType, JsonType as JsonSchemaType, } from '../../types';
import { Objects, Strings, Types } from '../../utils';
import { ODataAnnotatable } from '../annotation';
import { ODataEnumTypeParser } from './enum-type';
export class ODataEntityTypeKey {
name;
alias;
constructor({ name, alias }) {
this.name = name;
this.alias = alias;
}
}
export class ODataReferential {
property;
referencedProperty;
constructor({ property, referencedProperty, }) {
this.property = property;
this.referencedProperty = referencedProperty;
}
}
export class ODataStructuredTypeFieldParser extends ODataAnnotatable {
name;
structured;
type;
parser;
collection;
navigation;
nullable;
default;
maxLength;
precision;
scale;
referentials;
parserOptions;
constructor(name, structured, field) {
super(field);
this.name = name;
this.structured = structured;
this.type = field.type;
this.parser = NONE_PARSER;
this.referentials = (field.referentials || []).map((referential) => new ODataReferential(referential));
this.default = field.default;
this.maxLength = field.maxLength;
this.nullable = field.nullable ?? true;
this.collection = Boolean(field.collection);
this.navigation = Boolean(field.navigation);
this.precision = field.precision;
this.scale = field.scale;
}
validate(value, { method, navigation = false, } = {}) {
let errors;
if (this.collection && Array.isArray(value)) {
errors = value.map((v) => this.validate(v, { method, navigation }));
}
else if ((this.isStructuredType() &&
typeof value === 'object' &&
value !== null) ||
(this.navigation && value !== undefined)) {
errors =
this.structuredType().validate(value, { method, navigation }) ||
{};
}
else if (this.isEnumType() &&
(typeof value === 'string' || typeof value === 'number')) {
errors = this.enumType().validate(value, { method, navigation });
}
else {
// IsEdmType
const computed = this.annotatedValue(COMPUTED);
errors = [];
if (!this.nullable &&
(value === null || (value === undefined && method !== 'modify')) && // Is null or undefined without patch?
!(computed && method === 'create') // Not (Is Computed field and create) ?
) {
errors.push(`required`);
}
if (this.maxLength !== undefined &&
typeof value === 'string' &&
value.length > this.maxLength) {
errors.push(`maxlength`);
}
}
return !Types.isEmpty(errors) ? errors : undefined;
}
//#region Deserialize
parse(parser, value, options) {
const type = options !== undefined && Types.isPlainObject(value)
? ODataHelper[options?.version || DEFAULT_VERSION].type(value)
: undefined;
if (type !== undefined) {
return parser
.childParser((c) => c.isTypeOf(type))
.deserialize(value, options);
}
return parser.deserialize(value, options);
}
deserialize(value, options) {
const parserOptions = { ...this.parserOptions, ...options };
if (this.parser instanceof ODataStructuredTypeParser) {
const parser = this.parser;
return Array.isArray(value)
? value.map((v) => this.parse(parser, v, parserOptions))
: this.parse(parser, value, parserOptions);
}
return this.parser.deserialize(value, {
field: this,
...parserOptions,
});
}
//#endregion
//#region Serialize
toJson(parser, value, options) {
const type = options !== undefined && Types.isPlainObject(value)
? ODataHelper[options?.version || DEFAULT_VERSION].type(value)
: undefined;
if (type !== undefined) {
return parser
.childParser((c) => c.isTypeOf(type))
.serialize(value, options);
}
return parser.serialize(value, options);
}
serialize(value, options) {
const parserOptions = { ...this.parserOptions, ...options };
if (this.parser instanceof ODataStructuredTypeParser) {
const parser = this.parser;
return Array.isArray(value)
? value.map((v) => this.toJson(parser, v, parserOptions))
: this.toJson(parser, value, parserOptions);
}
return this.parser.serialize(value, {
field: this,
...parserOptions,
});
}
//#endregion
//#region Encode
encode(value, options) {
const parserOptions = { ...this.parserOptions, ...options };
return this.parser.encode(value, {
field: this,
...parserOptions,
});
}
//#endregion
configure({ options, parserForType, }) {
this.parserOptions = options;
this.parser = parserForType(this.type);
if (this.default !== undefined) {
this.default = this.deserialize(this.default, options);
}
}
//#region Json Schema
// https://json-schema.org/
toJsonSchema(options = {}) {
let schema = this.parser instanceof ODataStructuredTypeFieldParser ||
this.parser instanceof ODataStructuredTypeParser ||
this.parser instanceof ODataEnumTypeParser
? this.parser.toJsonSchema(options)
: { title: this.name, type: JsonSchemaType.object };
switch (this.type) {
case EdmType.String:
schema.type = JsonSchemaType.string;
break;
case EdmType.Guid:
schema.type = JsonSchemaType.string;
schema.pattern =
'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$';
break;
case EdmType.Binary:
schema.type = JsonSchemaType.string;
schema.contentEncoding = 'base64';
break;
case EdmType.Date:
schema.type = JsonSchemaType.string;
schema.format = 'date';
break;
case EdmType.TimeOfDay:
schema.type = JsonSchemaType.string;
schema.format = 'time';
break;
case EdmType.DateTimeOffset:
schema.type = JsonSchemaType.string;
schema.format = 'date-time';
break;
case EdmType.Duration:
schema.type = JsonSchemaType.string;
schema.format = 'duration';
break;
case EdmType.Byte:
case EdmType.SByte:
case EdmType.Int16:
case EdmType.Int32:
case EdmType.Int64:
//TODO: Range
schema.type = JsonSchemaType.integer;
break;
case EdmType.Single:
case EdmType.Double:
case EdmType.Decimal:
schema.type = JsonSchemaType.number;
break;
case EdmType.Boolean:
schema.type = JsonSchemaType.boolean;
break;
}
if (this.maxLength)
schema.maxLength = this.maxLength;
if (this.default)
schema.default = this.default;
if (this.nullable)
schema.type = [schema.type, JsonSchemaType.null];
if (this.collection)
schema = {
type: JsonSchemaType.array,
items: schema,
additionalItems: false,
};
return schema;
}
//#endregion
isKey() {
return this.structured
.keys({ include_parents: true })
.some((k) => k.name === this.name);
}
hasReferentials() {
return this.referentials.length !== 0;
}
isEdmType() {
return this.type.startsWith('Edm.');
}
isEnumType() {
return this.parser instanceof ODataEnumTypeParser;
}
enumType() {
if (!this.isEnumType())
throw new Error('Field are not EnumType');
return this.parser;
}
isStructuredType() {
return this.parser instanceof ODataStructuredTypeParser;
}
structuredType() {
if (!this.isStructuredType())
throw new Error('Field are not StrucuturedType');
return this.parser;
}
field(name) {
if (this.isStructuredType())
return this.parser.field(name);
throw new Error(`The field ${this.name} is not related to a StructuredType`);
}
}
export class ODataStructuredTypeParser extends ODataAnnotatable {
name;
namespace;
open;
children = [];
alias;
base;
parent;
_keys;
_fields = [];
parserOptions;
constructor(config, namespace, alias) {
super(config);
this.name = config.name;
this.base = config.base;
this.open = config.open || false;
this.namespace = namespace;
this.alias = alias;
if (Array.isArray(config.keys))
this._keys = config.keys.map((key) => new ODataEntityTypeKey(key));
Object.entries((config.fields ?? {})).forEach(([name, config]) => this.addField(name, config));
}
addField(name, config) {
const field = new ODataStructuredTypeFieldParser(name, this, config);
this._fields.push(field);
return field;
}
/**
* Create a nicer looking title.
* Titleize is meant for creating pretty output.
* @param term The term of the annotation to find.
* @returns The titleized string.
*/
titleize(term) {
return (term && this.annotatedValue(term)) || Strings.titleCase(this.name);
}
isTypeOf(type) {
var names = [`${this.namespace}.${this.name}`];
if (this.alias)
names.push(`${this.alias}.${this.name}`);
return names.indexOf(type) !== -1;
}
isSubtypeOf(type) {
if (this.isTypeOf(type))
return true;
if (this.parent)
return this.parent.isSubtypeOf(type);
return false;
}
isSupertypeOf(type) {
return (this.isTypeOf(type) || this.children.some((c) => c.isSupertypeOf(type)));
}
isOpenType() {
return this.open;
}
findChildParser(predicate) {
if (predicate(this))
return this;
let match;
for (let ch of this.children) {
match = ch.findChildParser(predicate);
if (match !== undefined)
break;
}
return match;
}
childParser(predicate) {
return this.findChildParser(predicate) || NONE_PARSER;
}
// Deserialize
deserialize(value, options) {
const parserOptions = { ...this.parserOptions, ...options };
const fields = this.fields({
include_navigation: true,
include_parents: true,
}).filter((f) => f.name in value &&
value[f.name] !== undefined &&
value[f.name] !== null);
return {
...value,
...fields.reduce((acc, f) => ({
...acc,
[f.name]: f.deserialize(value[f.name], parserOptions),
}), {}),
};
}
// Serialize
serialize(value, options) {
const parserOptions = { ...this.parserOptions, ...options };
const fields = this.fields({
include_navigation: true,
include_parents: true,
}).filter((f) => f.name in value &&
value[f.name] !== undefined &&
value[f.name] !== null);
return {
...value,
...fields.reduce((acc, f) => ({
...acc,
[f.name]: f.serialize(value[f.name], parserOptions),
}), {}),
};
}
// Encode
encode(value, options) {
const parserOptions = { ...this.parserOptions, ...options };
return raw(JSON.stringify(this.serialize(value, parserOptions)));
}
configure({ options, parserForType, }) {
this.parserOptions = options;
if (this.base) {
const parent = parserForType(this.base);
parent.children.push(this);
this.parent = parent;
}
this._fields.forEach((f) => f.configure({ options, parserForType }));
}
/**
* Returns all fields of the structured type.
* @param include_navigation Include navigation properties in the result.
* @param include_parents Include the parent types in the result.
* @returns All fields of the structured type.
*/
fields({ include_navigation, include_parents, }) {
return [
...(include_parents && this.parent !== undefined
? this.parent.fields({ include_parents, include_navigation })
: []),
...this._fields.filter((field) => include_navigation || !field.navigation),
];
}
/**
* Returns the keys of the structured type.
* @param include_parents Include the parent fields
* @returns The keys of the structured type
*/
keys({ include_parents, }) {
return [
...(include_parents && this.parent !== undefined
? this.parent.keys({ include_parents })
: []),
...(this._keys || []),
];
}
isEntityType() {
return (this._keys !== undefined ||
(this.parent !== undefined && this.parent.isEntityType()));
}
isComplexType() {
return !this.isEntityType();
}
/**
* Find the field parser for the given field name.
* @param name Name of the field
* @returns The field parser
*/
field(name) {
let field = this.fields({
include_parents: true,
include_navigation: true,
}).find((field) => field.name === name);
//Throw error if not found
if (field === undefined)
throw new Error(`${this.name} has no field named ${String(name)}`);
return field;
}
/**
* Picks the fields from attributes.
* @param attrs
* @param include_parents Include the parent fields
* @param include_navigation Include the navigation fields
* @param include_etag Include the etag field
* @returns The picked fields
*/
pick(attrs, { include_id = true, include_key = true, include_parents = true, include_navigation = false, include_computed = false, include_etag = true, options, } = {}) {
const parserOptions = options ?? this.parserOptions;
let fields = this.fields({ include_parents, include_navigation });
if (!include_key) {
fields = fields.filter((f) => !f.isKey());
}
if (!include_computed) {
fields = fields.filter((f) => !f.annotatedValue(COMPUTED) || (f.isKey() && include_key));
}
return Object.keys(attrs)
.filter((key) => fields.some((f) => f.name === key) ||
(key ==
ODataHelper[parserOptions?.version || DEFAULT_VERSION].ODATA_ETAG &&
include_etag) ||
(key ==
ODataHelper[parserOptions?.version || DEFAULT_VERSION].ODATA_ID &&
include_id))
.reduce((acc, key) => Object.assign(acc, { [key]: attrs[key] }), {});
}
resolveKey(value, { resolve = true, single = true, } = {}) {
const keyTypes = this.keys({ include_parents: true });
const key = new Map();
for (var kt of keyTypes) {
let v = value;
let structured = this;
let field;
for (let name of kt.name.split('/')) {
if (structured === undefined)
break;
field = structured
.fields({ include_navigation: false, include_parents: true })
.find((f) => f.name === name);
if (field !== undefined) {
v = Types.isPlainObject(v) ? v[field.name] : v;
structured = field.isStructuredType()
? field.structuredType()
: undefined;
}
}
if (field !== undefined && v !== undefined) {
key.set(kt.alias || field.name, field.encode(v));
}
}
if (key.size === 0)
return undefined;
return resolve
? Objects.resolveKey(key, { single })
: Object.fromEntries(key);
}
defaults() {
let fields = this.fields({
include_navigation: false,
include_parents: true,
}).filter((f) => f.default !== undefined || f.isStructuredType());
return {
...fields.reduce((acc, f) => {
let value = f.isStructuredType()
? f.structuredType().defaults()
: f.default;
return Types.isEmpty(value) ? acc : { ...acc, [f.name]: value };
}, {}),
};
}
// Json Schema
toJsonSchema(options = {}) {
let schema = {
$schema: 'http://json-schema.org/draft-07/schema#',
$id: `${this.namespace}.${this.name}`,
title: this.titleize(DESCRIPTION),
description: this.annotatedValue(LONG_DESCRIPTION),
type: JsonSchemaType.object,
properties: {},
required: [],
};
const fields = this.fields({
include_navigation: true,
include_parents: true,
}).filter((f) => (!f.navigation || (options.expand && f.name in options.expand)) &&
(!options.select || options.select.indexOf(f.name) !== -1));
schema.properties = Object.assign({}, schema.properties, fields
.map((f) => {
let expand = options.expand && f.name in options.expand
? options.expand[f.name]
: undefined;
let schema = f.toJsonSchema(expand);
if (options.custom && f.name in options.custom)
schema = options.custom[f.name](schema, f);
return { [f.name]: schema };
})
.reduce((acc, v) => Object.assign(acc, v), {}));
schema.required = [
...schema.required,
...fields
.filter((f) => options.required && f.name in options.required
? options.required[f.name]
: !f.nullable)
.map((f) => f.name),
];
return schema;
}
validate(attrs, { method, navigation = false, } = {}) {
const errors = {};
const fields = this.fields({
include_navigation: true,
include_parents: true,
}).filter((f) => !f.navigation || navigation);
for (var field of fields) {
const value = attrs[field.name];
const errs = field.validate(value, { method, navigation });
if (errs !== undefined) {
errors[field.name] = errs;
}
}
return !Types.isEmpty(errors) ? errors : undefined;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJlZC10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3NjaGVtYS9wYXJzZXJzL3N0cnVjdHVyZWQtdHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLGVBQWUsRUFDZixXQUFXLEVBQ1gsZ0JBQWdCLEdBQ2pCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUMsT0FBTyxFQUNMLFdBQVcsRUFPWCxPQUFPLEVBQ1AsUUFBUSxJQUFJLGNBQWMsR0FDM0IsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFtQmxELE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsSUFBSSxDQUFTO0lBQ2IsS0FBSyxDQUFVO0lBQ2YsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQW9DO1FBQzNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsUUFBUSxDQUFTO0lBQ2pCLGtCQUFrQixDQUFTO0lBQzNCLFlBQVksRUFDVixRQUFRLEVBQ1Isa0JBQWtCLEdBSW5CO1FBQ0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixD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Q04sS0FBVSxFQUNWLEVBQ0UsTUFBTSxFQUNOLFVBQVUsR0FBRyxLQUFLLE1BS2hCLEVBQUU7UUFFTixNQUFNLE1BQU0sR0FBRyxFQUE2QixDQUFDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDekIsa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLENBQUM7UUFDOUMsS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN6QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQWUsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3JELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENPTVBVVEVELFxuICBERUZBVUxUX1ZFUlNJT04sXG4gIERFU0NSSVBUSU9OLFxuICBMT05HX0RFU0NSSVBUSU9OLFxufSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFIZWxwZXIgfSBmcm9tICcuLi8uLi9oZWxwZXInO1xuaW1wb3J0IHsgcmF3IH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3F1ZXJ5JztcbmltcG9ydCB7XG4gIE5PTkVfUEFSU0VSLFxuICBQYXJzZXJPcHRpb25zLFxuICBQYXJzZXIsXG4gIFN0cnVjdHVyZWRUeXBlQ29uZmlnLFxuICBTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnLFxuICBTdHJ1Y3R1cmVkVHlwZUZpZWxkT3B0aW9ucyxcbiAgRmllbGRQYXJzZXIsXG4gIEVkbVR5cGUsXG4gIEpzb25UeXBlIGFzIEpzb25TY2hlbWFUeXBlLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBPYmplY3RzLCBTdHJpbmdzLCBUeXBlcyB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IE9EYXRhQW5ub3RhdGFibGUgfSBmcm9tICcuLi9hbm5vdGF0aW9uJztcbmltcG9ydCB7IE9EYXRhRW51bVR5cGVQYXJzZXIgfSBmcm9tICcuL2VudW0tdHlwZSc7XG5cbi8vIEpTT04gU0NIRU1BXG50eXBlIEpzb25TY2hlbWFTZWxlY3Q8VD4gPSBBcnJheTxrZXlvZiBUPjtcbnR5cGUgSnNvblNjaGVtYUN1c3RvbTxUPiA9IHtcbiAgW1AgaW4ga2V5b2YgVF0/OiAoXG4gICAgc2NoZW1hOiBhbnksXG4gICAgZmllbGQ6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxUW1BdPixcbiAgKSA9PiBhbnk7XG59O1xudHlwZSBKc29uU2NoZW1hRXhwYW5kPFQ+ID0geyBbUCBpbiBrZXlvZiBUXT86IEpzb25TY2hlbWFPcHRpb25zPFRbUF0+IH07XG50eXBlIEpzb25TY2hlbWFSZXF1aXJlZDxUPiA9IHsgW1AgaW4ga2V5b2YgVF0/OiBib29sZWFuIH07XG5leHBvcnQgdHlwZSBKc29uU2NoZW1hT3B0aW9uczxUPiA9IHtcbiAgc2VsZWN0PzogSnNvblNjaGVtYVNlbGVjdDxUPjtcbiAgY3VzdG9tPzogSnNvblNjaGVtYUN1c3RvbTxUPjtcbiAgZXhwYW5kPzogSnNvblNjaGVtYUV4cGFuZDxUPjtcbiAgcmVxdWlyZWQ/OiBKc29uU2NoZW1hUmVxdWlyZWQ8VD47XG59O1xuXG5leHBvcnQgY2xhc3MgT0RhdGFFbnRpdHlUeXBlS2V5IHtcbiAgbmFtZTogc3RyaW5nO1xuICBhbGlhcz86IHN0cmluZztcbiAgY29uc3RydWN0b3IoeyBuYW1lLCBhbGlhcyB9OiB7IG5hbWU6IHN0cmluZzsgYWxpYXM/OiBzdHJpbmcgfSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVJlZmVyZW50aWFsIHtcbiAgcHJvcGVydHk6IHN0cmluZztcbiAgcmVmZXJlbmNlZFByb3BlcnR5OiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBwcm9wZXJ0eSxcbiAgICByZWZlcmVuY2VkUHJvcGVydHksXG4gIH06IHtcbiAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgIHJlZmVyZW5jZWRQcm9wZXJ0eTogc3RyaW5nO1xuICB9KSB7XG4gICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgIHRoaXMucmVmZXJlbmNlZFByb3BlcnR5ID0gcmVmZXJlbmNlZFByb3BlcnR5O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8VD5cbiAgZXh0ZW5kcyBPRGF0YUFubm90YXRhYmxlXG4gIGltcGxlbWVudHMgRmllbGRQYXJzZXI8VD5cbntcbiAgbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHN0cnVjdHVyZWQ6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PjtcbiAgdHlwZTogc3RyaW5nIHwgRWRtVHlwZTtcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjxUPjtcbiAgY29sbGVjdGlvbjogYm9vbGVhbjtcbiAgbmF2aWdhdGlvbjogYm9vbGVhbjtcbiAgbnVsbGFibGU/OiBib29sZWFuO1xuICBkZWZhdWx0PzogYW55O1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIHByZWNpc2lvbj86IG51bWJlcjtcbiAgc2NhbGU/OiBudW1iZXIgfCAndmFyaWFibGUnO1xuICByZWZlcmVudGlhbHM6IE9EYXRhUmVmZXJlbnRpYWxbXTtcbiAgcGFyc2VyT3B0aW9ucz86IFBhcnNlck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0cnVjdHVyZWQ6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PixcbiAgICBmaWVsZDogU3RydWN0dXJlZFR5cGVGaWVsZENvbmZpZyxcbiAgKSB7XG4gICAgc3VwZXIoZmllbGQpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdHJ1Y3R1cmVkID0gc3RydWN0dXJlZDtcbiAgICB0aGlzLnR5cGUgPSBmaWVsZC50eXBlO1xuICAgIHRoaXMucGFyc2VyID0gTk9ORV9QQVJTRVI7XG4gICAgdGhpcy5yZWZlcmVudGlhbHMgPSAoZmllbGQucmVmZXJlbnRpYWxzIHx8IFtdKS5tYXAoXG4gICAgICAocmVmZXJlbnRpYWwpID0+IG5ldyBPRGF0YVJlZmVyZW50aWFsKHJlZmVyZW50aWFsKSxcbiAgICApO1xuICAgIHRoaXMuZGVmYXVsdCA9IGZpZWxkLmRlZmF1bHQ7XG4gICAgdGhpcy5tYXhMZW5ndGggPSBmaWVsZC5tYXhMZW5ndGg7XG4gICAgdGhpcy5udWxsYWJsZSA9IGZpZWxkLm51bGxhYmxlID8/IHRydWU7XG4gICAgdGhpcy5jb2xsZWN0aW9uID0gQm9vbGVhbihmaWVsZC5jb2xsZWN0aW9uKTtcbiAgICB0aGlzLm5hdmlnYXRpb24gPSBCb29sZWFuKGZpZWxkLm5hdmlnYXRpb24pO1xuICAgIHRoaXMucHJlY2lzaW9uID0gZmllbGQucHJlY2lzaW9uO1xuICAgIHRoaXMuc2NhbGUgPSBmaWVsZC5zY2FsZTtcbiAgfVxuXG4gIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAge1xuICAgICAgbWV0aG9kLFxuICAgICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKTpcbiAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgfCBzdHJpbmdbXVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgZXJyb3JzO1xuICAgIGlmICh0aGlzLmNvbGxlY3Rpb24gJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgI