kipon-xrmservice
Version:
Dynamics 365 CE web api wrapper for angular, making life easier when building angular based web resources
205 lines • 29 kB
JavaScript
export class FetchEntity {
link(prototype, property, condition, attributes = null) {
var res = new FetchEntity();
res.entityPrototype = prototype;
res.name = prototype._logicalName;
res.condition = condition;
res.attributes = attributes;
res.parent = res;
if (this.linkedentities == null) {
this.linkedentities = [];
}
var next = new Link();
next.entity = res;
next.to = property;
next.alias = property;
this.linkedentities.push(next);
return res;
}
innerjoin(prototype, alias, from, property, condition, attributes = null) {
var res = new FetchEntity();
res.entityPrototype = prototype;
res.name = prototype._logicalName;
res.condition = condition;
res.attributes = attributes;
res.parent = res;
if (this.linkedentities == null) {
this.linkedentities = [];
}
var next = new Link();
next.entity = res;
next.to = property;
next.alias = alias;
next.from = from;
next.type = "inner";
this.linkedentities.push(next);
return res;
}
outerjoin(prototype, alias, from, property, condition, attributes = null) {
var res = new FetchEntity();
res.entityPrototype = prototype;
res.name = prototype._logicalName;
res.condition = condition;
res.attributes = attributes;
res.parent = res;
if (this.linkedentities == null) {
this.linkedentities = [];
}
var next = new Link();
next.entity = res;
next.to = property;
next.alias = alias;
next.from = from;
next.type = "outer";
this.linkedentities.push(next);
return res;
}
aliasWithAttributes() {
var result = [];
this.resolveAlias(this.linkedentities, result);
return result;
}
resolveAlias(links, result) {
if (links != null && links.length > 0) {
links.forEach(l => {
if (l.entity.attributes != null && l.entity.attributes.length > 0) {
result.push(l.alias);
}
this.resolveAlias(l.entity.linkedentities, result);
});
}
}
}
export class Link {
toFetchXml(populateAttrib) {
var result = "";
var fromString = "";
if (this.from != null) {
fromString = " alias='" + this.alias + "' from='" + this.from + "' link-type='" + this.type + "'";
}
if (this.from == null && this.alias != null && this.alias != '') {
fromString = " alias='" + this.alias + "'";
}
result += "<link-entity name='" + this.entity.name + "' to='" + this.to + "'" + fromString + ">";
if (populateAttrib) {
if (this.entity.attributes != null && this.entity.attributes.length > 0) {
this.entity.attributes.forEach(a => {
result += "<attribute name='" + a + "'/>";
});
}
}
if (this.entity.condition != null) {
result += this.entity.condition.toFetchXml();
}
if (this.entity.linkedentities != null && this.entity.linkedentities.length > 0) {
this.entity.linkedentities.forEach(l => {
result += l.toFetchXml(populateAttrib);
});
}
result += "</link-entity>";
return result;
}
}
export class Fetchsort {
toFetchXml() {
if (this.descending) {
return "<order attribute='" + this.attribute + "' descending='true' />";
}
return "<order attribute='" + this.attribute + "' />";
}
}
export class Fetchxml {
constructor(prototype, condition) {
this.root = new FetchEntity();
this.root.entityPrototype = prototype;
this.keyname = prototype._keyName;
this.root.name = prototype._logicalName;
this.root.condition = condition;
this.root.attributes = prototype.columns(false);
}
entity() {
return this.root;
}
sort(attribname, descending = false) {
if (this.sorts == null) {
this.sorts = [];
}
let nextsort = new Fetchsort();
nextsort.attribute = attribname;
nextsort.descending = descending;
this.sorts.push(nextsort);
}
toCountFetchXml() {
let result = "";
var distinct = "";
if (this.distinct != null) {
distinct = " distinct='" + this.distinct + "'";
}
var aggr = "count";
var dist = '';
if (this.distinct) {
dist = " distinct='true'";
aggr = "countcolumn";
}
result += "<fetch mapping='logical'" + distinct + " aggregate='true'>";
result += "<entity name='" + this.root.name + "'>";
result += "<attribute name='" + this.keyname + "' aggregate='" + aggr + "' alias='count'" + dist + " />";
if (this.root.condition != null) {
result += this.root.condition.toFetchXml();
}
if (this.root.linkedentities != null && this.root.linkedentities.length > 0) {
this.root.linkedentities.forEach(l => {
result += l.toFetchXml(false);
});
}
result += "</entity>";
result += "</fetch>";
return result;
}
toFetchXml(pageCoocie = null, forPage = null) {
let result = "";
var page = "";
if (this.count != null) {
if (this.page == null) {
this.page = 1;
}
if (forPage == null) {
forPage = this.page;
}
page = " count='" + this.count + "' page='" + forPage + "'";
}
if (pageCoocie != null) {
page += " paging-cookie='" + pageCoocie + "'";
}
else {
page += " paging-cookie=''";
}
var distinct = "";
if (this.distinct != null) {
distinct = " distinct='" + this.distinct + "'";
}
result += "<fetch mapping='logical'" + page + distinct + ">";
result += "<entity name='" + this.root.name + "'>";
result += "<attribute name='" + this.keyname + "' />";
this.root.attributes.forEach(a => {
result += "<attribute name='" + a + "'/>";
});
if (this.root.condition != null) {
result += this.root.condition.toFetchXml();
}
if (this.root.linkedentities != null && this.root.linkedentities.length > 0) {
this.root.linkedentities.forEach(l => {
result += l.toFetchXml(true);
});
}
if (this.sorts != null && this.sorts.length > 0) {
this.sorts.forEach(s => {
result += s.toFetchXml();
});
}
result += "</entity>";
result += "</fetch>";
return result;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2h4bWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9raXBvbi14cm1zZXJ2aWNlL3NyYy9saWIvZmV0Y2h4bWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLFdBQVc7SUFVdEIsSUFBSSxDQUFDLFNBQWlCLEVBQUUsUUFBZ0IsRUFBRSxTQUFvQixFQUFFLGFBQXVCLElBQUk7UUFDekYsSUFBSSxHQUFHLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUM1QixHQUFHLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztRQUNoQyxHQUFHLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUM7UUFDbEMsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDMUIsR0FBRyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7UUFDM0IsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFFakIsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksRUFBRTtZQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBSUQsU0FBUyxDQUFDLFNBQWlCLEVBQUUsS0FBYSxFQUFFLElBQVksRUFBRSxRQUFnQixFQUFFLFNBQW9CLEVBQUUsYUFBdUIsSUFBSTtRQUMzSCxJQUFJLEdBQUcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzVCLEdBQUcs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QUFFO1lBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNyQixNQUFNLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxNQUFNLElBQUksV0FBVyxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxVQUFVLENBQUE7UUFDcEIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBDb25kaXRpb24gfSBmcm9tIFwiLi94cm1jb250ZXh0LnNlcnZpY2VcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgRmV0Y2hFbnRpdHkge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBlbnRpdHlQcm90b3R5cGU6IEVudGl0eTtcclxuICBhdHRyaWJ1dGVzOiBzdHJpbmdbXTtcclxuICBjb25kaXRpb246IENvbmRpdGlvbjtcclxuICBsaW5rZWRlbnRpdGllczogTGlua1tdO1xyXG4gIHBhcmVudDogRmV0Y2hFbnRpdHk7XHJcblxyXG4gIGxpbmsocHJvdG90eXBlOiBFbnRpdHksIHByb3BlcnR5OiBzdHJpbmcsIGNvbmRpdGlvbjogQ29uZGl0aW9uKTogRmV0Y2hFbnRpdHk7XHJcbiAgbGluayhwcm90b3R5cGU6IEVudGl0eSwgcHJvcGVydHk6IHN0cmluZywgY29uZGl0aW9uOiBDb25kaXRpb24sIGF0dHJpYnV0ZXM6IHN0cmluZ1tdKTogRmV0Y2hFbnRpdHk7XHJcbiAgbGluayhwcm90b3R5cGU6IEVudGl0eSwgcHJvcGVydHk6IHN0cmluZywgY29uZGl0aW9uOiBDb25kaXRpb24sIGF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gbnVsbCk6IEZldGNoRW50aXR5IHtcclxuICAgIHZhciByZXMgPSBuZXcgRmV0Y2hFbnRpdHkoKTtcclxuICAgIHJlcy5lbnRpdHlQcm90b3R5cGUgPSBwcm90b3R5cGU7XHJcbiAgICByZXMubmFtZSA9IHByb3RvdHlwZS5fbG9naWNhbE5hbWU7XHJcbiAgICByZXMuY29uZGl0aW9uID0gY29uZGl0aW9uO1xyXG4gICAgcmVzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzXHJcbiAgICByZXMucGFyZW50ID0gcmVzO1xyXG5cclxuICAgIGlmICh0aGlzLmxpbmtlZGVudGl0aWVzID09IG51bGwpIHtcclxuICAgICAgdGhpcy5saW5rZWRlbnRpdGllcyA9IFtdO1xyXG4gICAgfVxyXG4gICAgdmFyIG5leHQgPSBuZXcgTGluaygpO1xyXG4gICAgbmV4dC5lbnRpdHkgPSByZXM7XHJcbiAgICBuZXh0LnRvID0gcHJvcGVydHk7XHJcbiAgICBuZXh0LmFsaWFzID0gcHJvcGVydHk7XHJcbiAgICB0aGlzLmxpbmtlZGVudGl0aWVzLnB1c2gobmV4dCk7XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgaW5uZXJqb2luKHByb3RvdHlwZTogRW50aXR5LCBhbGlhczogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHByb3BlcnR5OiBzdHJpbmcsIGNvbmRpdGlvbjogQ29uZGl0aW9uKTogRmV0Y2hFbnRpdHk7XHJcbiAgaW5uZXJqb2luKHByb3RvdHlwZTogRW50aXR5LCBhbGlhczogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHByb3BlcnR5OiBzdHJpbmcsIGNvbmRpdGlvbjogQ29uZGl0aW9uLCBhdHRyaWJ1dGVzOiBzdHJpbmdbXSk6IEZldGNoRW50aXR5O1xyXG4gIGlubmVyam9pbihwcm90b3R5cGU6IEVudGl0eSwgYWxpYXM6IHN0cmluZywgZnJvbTogc3RyaW5nLCBwcm9wZXJ0eTogc3RyaW5nLCBjb25kaXRpb246IENvbmRpdGlvbiwgYXR0cmlidXRlczogc3RyaW5nW10gPSBudWxsKTogRmV0Y2hFbnRpdHkge1xyXG4gICAgdmFyIHJlcyA9IG5ldyBGZXRjaEVudGl0eSgpO1xyXG4gICAgcmVzLmVudGl0eVByb3RvdHlwZSA9IHByb3RvdHlwZTtcclxuICAgIHJlcy5uYW1lID0gcHJvdG90eXBlLl9sb2dpY2FsTmFtZTtcclxuICAgIHJlcy5jb25kaXRpb24gPSBjb25kaXRpb247XHJcbiAgICByZXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXNcclxuICAgIHJlcy5wYXJlbnQgPSByZXM7XHJcblxyXG4gICAgaWYgKHRoaXMubGlua2VkZW50aXRpZXMgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmxpbmtlZGVudGl0aWVzID0gW107XHJcbiAgICB9XHJcbiAgICB2YXIgbmV4dCA9IG5ldyBMaW5rKCk7XHJcbiAgICBuZXh0LmVudGl0eSA9IHJlcztcclxuICAgIG5leHQudG8gPSBwcm9wZXJ0eTtcclxuICAgIG5leHQuYWxpYXMgPSBhbGlhcztcclxuICAgIG5leHQuZnJvbSA9IGZyb207XHJcbiAgICBuZXh0LnR5cGUgPSBcImlubmVyXCI7XHJcblxyXG4gICAgdGhpcy5saW5rZWRlbnRpdGllcy5wdXNoKG5leHQpO1xyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIG91dGVyam9pbihwcm90b3R5cGU6IEVudGl0eSwgYWxpYXM6IHN0cmluZywgZnJvbTogc3RyaW5nLCBwcm9wZXJ0eTogc3RyaW5nLCBjb25kaXRpb246IENvbmRpdGlvbik6IEZldGNoRW50aXR5O1xyXG4gIG91dGVyam9pbihwcm90b3R5cGU6IEVudGl0eSwgYWxpYXM6IHN0cmluZywgZnJvbTogc3RyaW5nLCBwcm9wZXJ0eTogc3RyaW5nLCBjb25kaXRpb246IENvbmRpdGlvbiwgYXR0cmlidXRlczogc3RyaW5nW10pOiBGZXRjaEVudGl0eTtcclxuICBvdXRlcmpvaW4ocHJvdG90eXBlOiBFbnRpdHksIGFsaWFzOiBzdHJpbmcsIGZyb206IHN0cmluZywgcHJvcGVydHk6IHN0cmluZywgY29uZGl0aW9uOiBDb25kaXRpb24sIGF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gbnVsbCk6IEZldGNoRW50aXR5IHtcclxuICAgIHZhciByZXMgPSBuZXcgRmV0Y2hFbnRpdHkoKTtcclxuICAgIHJlcy5lbnRpdHlQcm90b3R5cGUgPSBwcm90b3R5cGU7XHJcbiAgICByZXMubmFtZSA9IHByb3RvdHlwZS5fbG9naWNhbE5hbWU7XHJcbiAgICByZXMuY29uZGl0aW9uID0gY29uZGl0aW9uO1xyXG4gICAgcmVzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzXHJcbiAgICByZXMucGFyZW50ID0gcmVzO1xyXG5cclxuICAgIGlmICh0aGlzLmxpbmtlZGVudGl0aWVzID09IG51bGwpIHtcclxuICAgICAgdGhpcy5saW5rZWRlbnRpdGllcyA9IFtdO1xyXG4gICAgfVxyXG4gICAgdmFyIG5leHQgPSBuZXcgTGluaygpO1xyXG4gICAgbmV4dC5lbnRpdHkgPSByZXM7XHJcbiAgICBuZXh0LnRvID0gcHJvcGVydHk7XHJcbiAgICBuZXh0LmFsaWFzID0gYWxpYXM7XHJcbiAgICBuZXh0LmZyb20gPSBmcm9tO1xyXG4gICAgbmV4dC50eXBlID0gXCJvdXRlclwiO1xyXG5cclxuICAgIHRoaXMubGlua2VkZW50aXRpZXMucHVzaChuZXh0KTtcclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBhbGlhc1dpdGhBdHRyaWJ1dGVzKCk6IHN0cmluZ1tdIHtcclxuICAgIHZhciByZXN1bHQ6c3RyaW5nW10gPSBbXTtcclxuICAgIHRoaXMucmVzb2x2ZUFsaWFzKHRoaXMubGlua2VkZW50aXRpZXMsIHJlc3VsdCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNvbHZlQWxpYXMobGlua3M6IExpbmtbXSwgcmVzdWx0OiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgaWYgKGxpbmtzICE9IG51bGwgJiYgbGlua3MubGVuZ3RoID4gMCkge1xyXG4gICAgICBsaW5rcy5mb3JFYWNoKGwgPT4ge1xyXG4gICAgICAgIGlmIChsLmVudGl0eS5hdHRyaWJ1dGVzICE9IG51bGwgJiYgbC5lbnRpdHkuYXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaChsLmFsaWFzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZXNvbHZlQWxpYXMobC5lbnRpdHkubGlua2VkZW50aXRpZXMsIHJlc3VsdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIExpbmsge1xyXG4gIGZyb206IHN0cmluZztcclxuICBhbGlhczogc3RyaW5nO1xyXG4gIHR5cGU6IHN0cmluZztcclxuICB0bzogc3RyaW5nO1xyXG5cclxuICBlbnRpdHk6IEZldGNoRW50aXR5O1xyXG5cclxuICB0b0ZldGNoWG1sKHBvcHVsYXRlQXR0cmliOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIHZhciByZXN1bHQ6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgdmFyIGZyb21TdHJpbmcgPSBcIlwiO1xyXG4gICAgaWYgKHRoaXMuZnJvbSAhPSBudWxsKSB7XHJcbiAgICAgIGZyb21TdHJpbmcgPSBcIiBhbGlhcz0nXCIgKyB0aGlzLmFsaWFzICsgXCInIGZyb209J1wiICsgdGhpcy5mcm9tICsgXCInIGxpbmstdHlwZT0nXCIgKyB0aGlzLnR5cGUgKyBcIidcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5mcm9tID09IG51bGwgJiYgdGhpcy5hbGlhcyAhPSBudWxsICYmIHRoaXMuYWxpYXMgIT0gJycpIHtcclxuICAgICAgZnJvbVN0cmluZyA9IFwiIGFsaWFzPSdcIiArIHRoaXMuYWxpYXMgKyBcIidcIjtcclxuICAgIH1cclxuXHJcbiAgICByZXN1bHQgKz0gXCI8bGluay1lbnRpdHkgbmFtZT0nXCIgKyB0aGlzLmVudGl0eS5uYW1lICsgXCInIHRvPSdcIiArIHRoaXMudG8gKyBcIidcIiArIGZyb21TdHJpbmcgKyBcIj5cIjtcclxuXHJcbiAgICBpZiAocG9wdWxhdGVBdHRyaWIpIHtcclxuICAgICAgaWYgKHRoaXMuZW50aXR5LmF0dHJpYnV0ZXMgIT0gbnVsbCAmJiB0aGlzLmVudGl0eS5hdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLmVudGl0eS5hdHRyaWJ1dGVzLmZvckVhY2goYSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQgKz0gXCI8YXR0cmlidXRlIG5hbWU9J1wiICsgYSArIFwiJy8+XCJcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmVudGl0eS5jb25kaXRpb24gIT0gbnVsbCkge1xyXG4gICAgICByZXN1bHQgKz0gdGhpcy5lbnRpdHkuY29uZGl0aW9uLnRvRmV0Y2hYbWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5lbnRpdHkubGlua2VkZW50aXRpZXMgIT0gbnVsbCAmJiB0aGlzLmVudGl0eS5saW5rZWRlbnRpdGllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZW50aXR5LmxpbmtlZGVudGl0aWVzLmZvckVhY2gobCA9PiB7XHJcbiAgICAgICAgcmVzdWx0ICs9IGwudG9GZXRjaFhtbChwb3B1bGF0ZUF0dHJpYik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmVzdWx0ICs9IFwiPC9saW5rLWVudGl0eT5cIjtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRmV0Y2hzb3J0IHtcclxuICBhdHRyaWJ1dGU6IHN0cmluZztcclxuICBkZXNjZW5kaW5nOiBib29sZWFuO1xyXG5cclxuICB0b0ZldGNoWG1sKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5kZXNjZW5kaW5nKSB7XHJcbiAgICAgIHJldHVybiBcIjxvcmRlciBhdHRyaWJ1dGU9J1wiICsgdGhpcy5hdHRyaWJ1dGUgKyBcIicgZGVzY2VuZGluZz0ndHJ1ZScgLz5cIjtcclxuICAgIH1cclxuICAgIHJldHVybiBcIjxvcmRlciBhdHRyaWJ1dGU9J1wiICsgdGhpcy5hdHRyaWJ1dGUgKyBcIicgLz5cIjtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBGZXRjaHhtbCB7XHJcbiAgcHJpdmF0ZSByb290OiBGZXRjaEVudGl0eTtcclxuICBwcml2YXRlIGtleW5hbWU6IHN0cmluZztcclxuXHJcbiAgY291bnQ6IG51bWJlcjtcclxuICBwYWdlOiBudW1iZXI7XHJcbiAgZGlzdGluY3Q6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBzb3J0czogRmV0Y2hzb3J0W107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3RvdHlwZTogRW50aXR5LCBjb25kaXRpb246IENvbmRpdGlvbikge1xyXG4gICAgdGhpcy5yb290ID0gbmV3IEZldGNoRW50aXR5KCk7XHJcbiAgICB0aGlzLnJvb3QuZW50aXR5UHJvdG90eXBlID0gcHJvdG90eXBlO1xyXG4gICAgdGhpcy5rZXluYW1lID0gcHJvdG90eXBlLl9rZXlOYW1lO1xyXG4gICAgdGhpcy5yb290Lm5hbWUgPSBwcm90b3R5cGUuX2xvZ2ljYWxOYW1lO1xyXG4gICAgdGhpcy5yb290LmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcclxuICAgIHRoaXMucm9vdC5hdHRyaWJ1dGVzID0gcHJvdG90eXBlLmNvbHVtbnMoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZW50aXR5KCk6IEZldGNoRW50aXR5IHtcclxuICAgIHJldHVybiB0aGlzLnJvb3Q7XHJcbiAgfVxyXG5cclxuICBzb3J0KGF0dHJpYm5hbWU6IHN0cmluZyk6IHZvaWQ7XHJcbiAgc29ydChhdHRyaWJuYW1lOiBzdHJpbmcsIGRlc2NlbmRpbmc6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIHNvcnQoYXR0cmlibmFtZTogc3RyaW5nLCBkZXNjZW5kaW5nOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNvcnRzID09IG51bGwpIHtcclxuICAgICAgdGhpcy5zb3J0cyA9IFtdIGFzIEZldGNoc29ydFtdO1xyXG4gICAgfVxyXG4gICAgbGV0IG5leHRzb3J0ID0gbmV3IEZldGNoc29ydCgpO1xyXG4gICAgbmV4dHNvcnQuYXR0cmlidXRlID0gYXR0cmlibmFtZTtcclxuICAgIG5leHRzb3J0LmRlc2NlbmRpbmcgPSBkZXNjZW5kaW5nO1xyXG4gICAgdGhpcy5zb3J0cy5wdXNoKG5leHRzb3J0KTtcclxuICB9XHJcblxyXG5cclxuICB0b0NvdW50RmV0Y2hYbWwoKTogc3RyaW5nIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgdmFyIGRpc3RpbmN0ID0gXCJcIjtcclxuICAgIGlmICh0aGlzLmRpc3RpbmN0ICE9IG51bGwpIHtcclxuICAgICAgZGlzdGluY3QgPSBcIiBkaXN0aW5jdD0nXCIgKyB0aGlzLmRpc3RpbmN0ICsgXCInXCJcclxuICAgIH1cclxuXHJcbiAgICB2YXIgYWdnciA9IFwiY291bnRcIjtcclxuXHJcbiAgICB2YXIgZGlzdCA9ICcnO1xyXG4gICAgaWYgKHRoaXMuZGlzdGluY3QpIHtcclxuICAgICAgZGlzdCA9IFwiIGRpc3RpbmN0PSd0cnVlJ1wiO1xyXG4gICAgICBhZ2dyID0gXCJjb3VudGNvbHVtblwiXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJlc3VsdCArPSBcIjxmZXRjaCBtYXBwaW5nPSdsb2dpY2FsJ1wiICsgZGlzdGluY3QgKyBcIiBhZ2dyZWdhdGU9J3RydWUnPlwiXHJcbiAgICByZXN1bHQgKz0gXCI8ZW50aXR5IG5hbWU9J1wiICsgdGhpcy5yb290Lm5hbWUgKyBcIic+XCI7XHJcbiAgICByZXN1bHQgKz0gXCI8YXR0cmlidXRlIG5hbWU9J1wiICsgdGhpcy5rZXluYW1lICsgXCInIGFnZ3JlZ2F0ZT0nXCIrYWdncitcIicgYWxpYXM9J2NvdW50J1wiK2Rpc3QrXCIgIC8+XCI7XHJcblxyXG4gICAgaWYgKHRoaXMucm9vdC5jb25kaXRpb24gIT0gbnVsbCkge1xyXG4gICAgICByZXN1bHQgKz0gdGhpcy5yb290LmNvbmRpdGlvbi50b0ZldGNoWG1sKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucm9vdC5saW5rZWRlbnRpdGllcyAhPSBudWxsICYmIHRoaXMucm9vdC5saW5rZWRlbnRpdGllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMucm9vdC5saW5rZWRlbnRpdGllcy5mb3JFYWNoKGwgPT4ge1xyXG4gICAgICAgIHJlc3VsdCArPSBsLnRvRmV0Y2hYbWwoZmFsc2UpO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJlc3VsdCArPSBcIjwvZW50aXR5PlwiO1xyXG4gICAgcmVzdWx0ICs9IFwiPC9mZXRjaD5cIjtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgdG9GZXRjaFhtbCgpOiBzdHJpbmc7XHJcbiAgdG9GZXRjaFhtbChwYWdlQ29vY2llOiBzdHJpbmcsIGZvclBhZ2U6IG51bWJlcik6IHN0cmluZztcclxuICB0b0ZldGNoWG1sKHBhZ2VDb29jaWU6IHN0cmluZyA9IG51bGwsIGZvclBhZ2U6IG51bWJlciA9IG51bGwpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICB2YXIgcGFnZSA9IFwiXCI7XHJcbiAgICBpZiAodGhpcy5jb3VudCAhPSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLnBhZ2UgPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmb3JQYWdlID09IG51bGwpIHtcclxuICAgICAgICBmb3JQYWdlID0gdGhpcy5wYWdlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwYWdlID0gXCIgY291bnQ9J1wiICsgdGhpcy5jb3VudCArIFwiJyBwYWdlPSdcIiArIGZvclBhZ2UgKyBcIidcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocGFnZUNvb2NpZSAhPSBudWxsKSB7XHJcbiAgICAgIHBhZ2UgKz0gXCIgcGFnaW5nLWNvb2tpZT0nXCIgKyBwYWdlQ29vY2llICsgXCInXCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwYWdlICs9IFwiIHBhZ2luZy1jb29raWU9JydcIjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgZGlzdGluY3QgPSBcIlwiO1xyXG4gICAgaWYgKHRoaXMuZGlzdGluY3QgIT0gbnVsbCkge1xyXG4gICAgICBkaXN0aW5jdCA9IFwiIGRpc3RpbmN0PSdcIiArIHRoaXMuZGlzdGluY3QgKyBcIidcIlxyXG4gICAgfVxyXG5cclxuICAgIHJlc3VsdCArPSBcIjxmZXRjaCBtYXBwaW5nPSdsb2dpY2FsJ1wiICsgcGFnZSArIGRpc3RpbmN0ICsgXCI+XCJcclxuICAgIHJlc3VsdCArPSBcIjxlbnRpdHkgbmFtZT0nXCIgKyB0aGlzLnJvb3QubmFtZSArIFwiJz5cIjtcclxuICAgIHJlc3VsdCArPSBcIjxhdHRyaWJ1dGUgbmFtZT0nXCIgKyB0aGlzLmtleW5hbWUgKyBcIicgLz5cIlxyXG4gICAgdGhpcy5yb290LmF0dHJpYnV0ZXMuZm9yRWFjaChhID0+IHtcclxuICAgICAgcmVzdWx0ICs9IFwiPGF0dHJpYnV0ZSBuYW1lPSdcIithK1wiJy8+XCJcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLnJvb3QuY29uZGl0aW9uICE9IG51bGwpIHtcclxuICAgICAgcmVzdWx0ICs9IHRoaXMucm9vdC5jb25kaXRpb24udG9GZXRjaFhtbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJvb3QubGlua2VkZW50aXRpZXMgIT0gbnVsbCAmJiB0aGlzLnJvb3QubGlua2VkZW50aXRpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnJvb3QubGlua2VkZW50aXRpZXMuZm9yRWFjaChsID0+IHtcclxuICAgICAgICByZXN1bHQgKz0gbC50b0ZldGNoWG1sKHRydWUpO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNvcnRzICE9IG51bGwgJiYgdGhpcy5zb3J0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc29ydHMuZm9yRWFjaChzID0+IHtcclxuICAgICAgICByZXN1bHQgKz0gcy50b0ZldGNoWG1sKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc3VsdCArPSBcIjwvZW50aXR5PlwiO1xyXG4gICAgcmVzdWx0ICs9IFwiPC9mZXRjaD5cIlxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcbn1cclxuIl19