rb-letter-avatar
Version:
Angular letter avatar component
375 lines (369 loc) • 48.4 kB
JavaScript
import { Component, ElementRef, Input, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
var LAmeta = /** @class */ (function () {
function LAmeta() {
this.defaultColors = ["#5A8770", "#B2B7BB", "#6FA9AB", "#F5AF29", "#0088B9", "#F18636", "#D93A37", "#A6B12E", "#5C9BBC", "#F5888D", "#9A89B5", "#407887", "#9A89B5", "#5A8770", "#D33F33", "#A2B01F", "#F0B126", "#0087BF", "#F18636", "#0087BF", "#B2B7BB", "#72ACAE", "#9C8AB4", "#5A8770", "#EEB424", "#407887"];
this.defaultTextColor = '#ffffff';
this.defaultBorder = 'border:5px solid white';
this.defaultTriangleup = 'width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid;';
this.deafultFontsize = '30';
this.defaultHeight = '50';
this.deafultWidth = '50';
this.defaultRadius = 'border-radius:50%;';
this.deafultDynamic = 'false';
this.defaultRotatedeg = '0';
this.defaultAvatarborder = 'false';
this.defaultFontWeight = '400';
this.defaultFontFamily = 'HelveticaNeue-Light,Helvetica Neue Light,Helvetica Neue,Helvetica, Arial,Lucida Grande, sans-serif';
}
return LAmeta;
}());
var Attributes = /** @class */ (function () {
function Attributes() {
this.alphabetcolors = 'avatar-alphabet-colors';
this.textColor = 'avatar-text-color';
this.defaultBorder = 'avatar-default-border';
this.triangleup = 'avatar-triangle-up';
this.fontsize = 'avatar-font-size';
this.height = 'avatar-height';
this.width = 'avatar-width';
this.radius = 'avatar-radius';
this.avatarcustombgcolor = 'avatar-custom-bg-color';
this.dynamic = 'avatar-dynamic';
this.fontWeight = 'avatar-font-weight';
this.fontFamily = 'avatar-font-family';
this.shape = 'avatar-shape';
this.data = 'avatar-data';
this.rotatedeg = 'avatar-rotate-degree';
this.avatarborder = 'avatar-border';
}
return Attributes;
}());
var RbLetterAvatarComponent = /** @class */ (function () {
function RbLetterAvatarComponent(el) {
this._meta = new LAmeta();
this.attribute = new Attributes();
this.base = "data:image/svg+xml;base64,";
this.charCount = "1";
this.letteravatar = el.nativeElement;
}
RbLetterAvatarComponent.prototype.ngAfterViewInit = function () {
if (!this.alphabetcolors) {
this.alphabetcolors = this.getPropertyValue(this.attribute.alphabetcolors) ?
this.getPropertyValue(this.attribute.alphabetcolors) : this._meta.defaultColors;
}
if (!this.textColor) {
this.textColor = this.getPropertyValue(this.attribute.textColor) ?
this.getPropertyValue(this.attribute.textColor) : this._meta.defaultTextColor;
}
if (!this.avatarcustombgcolor) {
this.avatarcustombgcolor = this.getPropertyValue(this.attribute.avatarcustombgcolor);
}
if (!this.avatarborder) {
this.avatarborder = this.getPropertyValue(this.attribute.avatarborder) ?
this.getPropertyValue(this.attribute.avatarborder) : this._meta.defaultAvatarborder;
}
if (!this.defaultBorder) {
this.defaultBorder = this.getPropertyValue(this.attribute.defaultBorder) ?
this.getPropertyValue(this.attribute.defaultBorder) : this._meta.defaultBorder;
}
if (!this.triangleup) {
this.triangleup = this.getPropertyValue(this.attribute.triangleup) ?
this.getPropertyValue(this.attribute.triangleup) : this._meta.defaultTriangleup;
}
if (!this.fontsize) {
this.fontsize = this.getPropertyValue(this.attribute.fontsize) ?
this.getPropertyValue(this.attribute.fontsize) : this._meta.deafultFontsize;
}
if (!this.height) {
this.height = this.getPropertyValue(this.attribute.height) ?
this.getPropertyValue(this.attribute.height) : this._meta.defaultHeight;
}
if (!this.width) {
this.width = this.getPropertyValue(this.attribute.width) ?
this.getPropertyValue(this.attribute.width) : this._meta.deafultWidth;
}
if (!this.radius) {
this.radius = this.getPropertyValue(this.attribute.radius) ?
this.getPropertyValue(this.attribute.radius) : this._meta.defaultRadius;
}
if (!this.dynamic) {
this.dynamic = this.getPropertyValue(this.attribute.dynamic) ?
this.getPropertyValue(this.attribute.dynamic) : false;
}
if (!this.rotatedeg) {
this.rotatedeg = this.getPropertyValue(this.attribute.rotatedeg) ?
this.getPropertyValue(this.attribute.rotatedeg) : this._meta.defaultRotatedeg;
}
if (!this.fontWeight) {
this.fontWeight = this.getPropertyValue(this.attribute.fontWeight) ?
this.getPropertyValue(this.attribute.fontWeight) : this._meta.defaultFontWeight;
}
if (!this.fontFamily) {
this.fontFamily = this.getPropertyValue(this.attribute.fontFamily) ?
this.getPropertyValue(this.attribute.fontFamily) : this._meta.defaultFontFamily;
}
if (!this.shape) {
this.shape = this.getPropertyValue(this.attribute.shape);
}
if (!this.data) {
this.data = this.getPropertyValue(this.attribute.data);
}
this.createAvatar();
};
RbLetterAvatarComponent.prototype.getPropertyValue = function (property) {
var result = "";
result = this.letteravatar.getAttribute(property);
return result;
};
RbLetterAvatarComponent.prototype.createAvatar = function () {
var c = "";
if (this.charCount === "2") {
var _data = this.getFirstAndLastName(this.data.toUpperCase());
if (_data) {
c = _data;
}
else {
c = this.data.substring(0, +this.charCount).toUpperCase();
}
}
else {
c = this.data.substring(0, +this.charCount).toUpperCase();
}
var textTag = this.getCharacterTextTag(c, this.textColor, this.fontFamily, this.fontWeight, this.fontsize);
var colorIndex;
var color = "";
/**
* Populate the colors according to attributes
*/
if (c.charCodeAt(0) < 65) {
color = this.getRandomColors();
}
else {
colorIndex = Math.floor((c.charCodeAt(0) - 65) % this.alphabetcolors.length);
color = this.alphabetcolors[colorIndex];
}
if (this.avatarcustombgcolor) {
color = this.avatarcustombgcolor;
}
this.createSvg(this.width, this.height, color, textTag);
var lvcomponent = this.getLVText();
var svgHtml = window.btoa(unescape(encodeURIComponent(lvcomponent)));
var component;
var base = this.base;
var _style = "";
if (this.avatarBorderStyle) {
_style = this.avatarBorderStyle;
}
else if (this.avatarborder === "true") {
_style = this.defaultBorder;
}
if (this.rotatedeg !== "0") {
// tslint:disable-next-line:max-line-length
_style = "-ms-transform: rotate(" + this.rotatedeg + "deg); -webkit-transform: rotate(" + this.rotatedeg + "deg); transform: rotate(" + this.rotatedeg + "deg)";
}
if (this.shape) {
if (this.shape === "round") {
var round_style = this.radius + _style;
if (this.data.indexOf("http") > -1 || this.data.indexOf("data:image") > -1) {
var img_size = "width:" + this.width + "px;height:" + this.height + "px;";
component = "<img src=" + this.data + " style='" + img_size + round_style + "' />";
}
else {
component = "<img src=" + base + svgHtml + " style='" + round_style + "' title='" + this.data + "' />";
}
}
}
else {
if (this.data.indexOf("http") > -1 || this.data.indexOf("data:image") > -1) {
var img_size = "width:" + this.width + "px;height:" + this.height + "px;";
component = "<img src=" + this.data + " style='" + img_size + _style + "' />";
}
else {
component = "<img src=" + base + svgHtml + " style='" + _style + "' title='" + this.data + "' />";
}
}
this.letteravatar.innerHTML = component;
};
RbLetterAvatarComponent.prototype.getLVText = function () {
var lvTag = document.createElement("div");
lvTag.appendChild(this.imageTag.cloneNode());
return this.imageTag.outerHTML;
};
/**
* Populate the svg tag which will used for the avatar generation
* @param width
* @param height
* @param color
* @returns
*/
/**
* Populate the svg tag which will used for the avatar generation
* @param width
* @param height
* @param color
* @returns
*/
RbLetterAvatarComponent.prototype.createSvg = /**
* Populate the svg tag which will used for the avatar generation
* @param width
* @param height
* @param color
* @returns
*/
function (width, height, color, cobj) {
var svgTag = document.createElement("svg");
svgTag.setAttribute("xmlns", "http://www.w3.org/2000/svg");
svgTag.setAttribute("pointer-events", "none");
svgTag.setAttribute("width", width);
svgTag.setAttribute("height", height);
svgTag.setAttribute("style", "background-color:" + color + ";width:" + width + "px" + ";height:" + height + "px");
svgTag.appendChild(cobj);
this.imageTag = svgTag;
return svgTag.innerHTML;
};
/**
* Generate the Letter tag by using the svg text element
* @param character
* @param textColor
* @param fontFamily
* @param fontWeight
* @param fontsize
* @returns
*/
// tslint:disable-next-line:max-line-length
/**
* Generate the Letter tag by using the svg text element
* @param character
* @param textColor
* @param fontFamily
* @param fontWeight
* @param fontsize
* @returns
*/
// tslint:disable-next-line:max-line-length
RbLetterAvatarComponent.prototype.getCharacterTextTag = /**
* Generate the Letter tag by using the svg text element
* @param character
* @param textColor
* @param fontFamily
* @param fontWeight
* @param fontsize
* @returns
*/
// tslint:disable-next-line:max-line-length
function (character, textColor, fontFamily, fontWeight, fontsize) {
var textTag = document.createElement("text");
textTag.setAttribute("text-anchor", "middle");
textTag.setAttribute("x", "50%");
textTag.setAttribute("y", "50%");
textTag.setAttribute("dy", "0.35em");
textTag.setAttribute("pointer-events", "auto");
textTag.setAttribute("fill", textColor);
textTag.setAttribute("font-family", fontFamily);
textTag.setAttribute("style", "font-weight:" + fontWeight + ";font-size:" + fontsize + "px");
textTag.innerText = character;
return textTag;
};
/**
* Get the random colors
* @returns
*/
/**
* Get the random colors
* @returns
*/
RbLetterAvatarComponent.prototype.getRandomColors = /**
* Get the random colors
* @returns
*/
function () {
var letters = "0123456789ABCDEF".split("");
var _color = "#";
for (var i = 0; i < 6; i++) {
_color += letters[Math.floor(Math.random() * 16)];
}
return _color;
};
/**
* get the first name and last name first letters and combined and form the letter avatar
* @param data
* @returns
*/
/**
* get the first name and last name first letters and combined and form the letter avatar
* @param data
* @returns
*/
RbLetterAvatarComponent.prototype.getFirstAndLastName = /**
* get the first name and last name first letters and combined and form the letter avatar
* @param data
* @returns
*/
function (data) {
var names = data.split(" ");
if (names && names.length >= 2) {
var firstName = names[0];
var lastName = names[1];
if (firstName && lastName) {
var text = firstName.substr(0, 1) + lastName.substr(0, 1);
return text;
}
else {
return data.substr(0, 2);
}
}
};
RbLetterAvatarComponent.decorators = [
{ type: Component, args: [{
selector: "rb-letter-avatar",
template: "<ng-content></ng-content>"
},] },
];
/** @nocollapse */
RbLetterAvatarComponent.ctorParameters = function () { return [
{ type: ElementRef, },
]; };
RbLetterAvatarComponent.propDecorators = {
"alphabetcolors": [{ type: Input, args: ["avatar-alphabet-colors",] },],
"textColor": [{ type: Input, args: ["avatar-text-color",] },],
"defaultBorder": [{ type: Input, args: ["avatar-default-border",] },],
"triangleup": [{ type: Input, args: ["avatar-triangle-up",] },],
"fontsize": [{ type: Input, args: ["avatar-font-size",] },],
"height": [{ type: Input, args: ["avatar-height",] },],
"width": [{ type: Input, args: ["avatar-width",] },],
"fontWeight": [{ type: Input, args: ["avatar-font-weight",] },],
"fontFamily": [{ type: Input, args: ["avatar-font-family",] },],
"radius": [{ type: Input, args: ["avatar-radius",] },],
"dynamic": [{ type: Input, args: ["avatar-dynamic",] },],
"rotatedeg": [{ type: Input, args: ["avatar-rotate-degree",] },],
"charCount": [{ type: Input, args: ["avatar-char-count",] },],
"data": [{ type: Input, args: ["avatar-data",] },],
"avatarBorderStyle": [{ type: Input, args: ["avatar-border-style",] },],
"avatarborder": [{ type: Input, args: ["avatar-border",] },],
"avatarcustomborder": [{ type: Input, args: ["avatar-custom-border",] },],
"shape": [{ type: Input, args: ["avatar-shape",] },],
"avatarcustombgcolor": [{ type: Input, args: ["avatar-custom-bg-color",] },],
};
return RbLetterAvatarComponent;
}());
var RbLetterAvatarModule = /** @class */ (function () {
function RbLetterAvatarModule() {
}
RbLetterAvatarModule.decorators = [
{ type: NgModule, args: [{
imports: [CommonModule],
declarations: [RbLetterAvatarComponent],
providers: [],
exports: [RbLetterAvatarComponent]
},] },
];
/** @nocollapse */
RbLetterAvatarModule.ctorParameters = function () { return []; };
return RbLetterAvatarModule;
}());
/**
* Generated bundle index. Do not edit.
*/
export { RbLetterAvatarComponent as ɵa, RbLetterAvatarModule };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmItbGV0dGVyLWF2YXRhci5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vcmItbGV0dGVyLWF2YXRhci9sZXR0ZXItYXZhdGFyL2xhbWV0YS50cyIsIm5nOi8vcmItbGV0dGVyLWF2YXRhci9sZXR0ZXItYXZhdGFyL3JiLWxldHRlci1hdmF0YXIuY29tcG9uZW50LnRzIiwibmc6Ly9yYi1sZXR0ZXItYXZhdGFyL3JiLWxldHRlci1hdmF0YXIubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBMQW1ldGEge1xyXG4gICAgZGVmYXVsdENvbG9yczogc3RyaW5nW10gPSBbXCIjNUE4NzcwXCIsIFwiI0IyQjdCQlwiLCBcIiM2RkE5QUJcIiwgXCIjRjVBRjI5XCIsIFwiIzAwODhCOVwiLCBcIiNGMTg2MzZcIiwgXCIjRDkzQTM3XCIsIFwiI0E2QjEyRVwiLCBcIiM1QzlCQkNcIiwgXCIjRjU4ODhEXCIsIFwiIzlBODlCNVwiLCBcIiM0MDc4ODdcIiwgXCIjOUE4OUI1XCIsIFwiIzVBODc3MFwiLCBcIiNEMzNGMzNcIiwgXCIjQTJCMDFGXCIsIFwiI0YwQjEyNlwiLCBcIiMwMDg3QkZcIiwgXCIjRjE4NjM2XCIsIFwiIzAwODdCRlwiLCBcIiNCMkI3QkJcIiwgXCIjNzJBQ0FFXCIsIFwiIzlDOEFCNFwiLCBcIiM1QTg3NzBcIiwgXCIjRUVCNDI0XCIsIFwiIzQwNzg4N1wiXTtcclxuICAgIGRlZmF1bHRUZXh0Q29sb3I6IHN0cmluZyA9ICcjZmZmZmZmJztcclxuICAgIGRlZmF1bHRCb3JkZXI6IHN0cmluZyA9ICdib3JkZXI6NXB4IHNvbGlkIHdoaXRlJztcclxuICAgIGRlZmF1bHRUcmlhbmdsZXVwOiBzdHJpbmcgPSAnd2lkdGg6IDA7aGVpZ2h0OiAwO2JvcmRlci1sZWZ0OiA1MHB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDogNTBweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItYm90dG9tOiAxMDBweCBzb2xpZDsnO1xyXG4gICAgZGVhZnVsdEZvbnRzaXplOiBzdHJpbmcgPSAnMzAnO1xyXG4gICAgZGVmYXVsdEhlaWdodDogc3RyaW5nID0gJzUwJztcclxuICAgIGRlYWZ1bHRXaWR0aDogc3RyaW5nID0gJzUwJztcclxuICAgIGRlZmF1bHRSYWRpdXM6IHN0cmluZyA9ICdib3JkZXItcmFkaXVzOjUwJTsnO1xyXG4gICAgZGVhZnVsdER5bmFtaWM6IHN0cmluZyA9ICdmYWxzZSc7XHJcbiAgICBkZWZhdWx0Um90YXRlZGVnOiBzdHJpbmcgPSAnMCc7XHJcbiAgICBkZWZhdWx0QXZhdGFyYm9yZGVyOnN0cmluZyA9ICdmYWxzZSc7XHJcbiAgICBkZWZhdWx0Rm9udFdlaWdodDogc3RyaW5nID0gJzQwMCc7XHJcbiAgICBkZWZhdWx0Rm9udEZhbWlseTogc3RyaW5nID0gJ0hlbHZldGljYU5ldWUtTGlnaHQsSGVsdmV0aWNhIE5ldWUgTGlnaHQsSGVsdmV0aWNhIE5ldWUsSGVsdmV0aWNhLCBBcmlhbCxMdWNpZGEgR3JhbmRlLCBzYW5zLXNlcmlmJztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZXMge1xyXG4gICAgYWxwaGFiZXRjb2xvcnM6IHN0cmluZyA9ICdhdmF0YXItYWxwaGFiZXQtY29sb3JzJztcclxuICAgIHRleHRDb2xvcjogc3RyaW5nID0gJ2F2YXRhci10ZXh0LWNvbG9yJztcclxuICAgIGRlZmF1bHRCb3JkZXI6IHN0cmluZyA9ICdhdmF0YXItZGVmYXVsdC1ib3JkZXInO1xyXG4gICAgdHJpYW5nbGV1cDogc3RyaW5nID0gJ2F2YXRhci10cmlhbmdsZS11cCc7XHJcbiAgICBmb250c2l6ZTogc3RyaW5nID0gJ2F2YXRhci1mb250LXNpemUnO1xyXG4gICAgaGVpZ2h0OiBzdHJpbmcgPSAnYXZhdGFyLWhlaWdodCc7XHJcbiAgICB3aWR0aDogc3RyaW5nID0gJ2F2YXRhci13aWR0aCc7XHJcbiAgICByYWRpdXM6IHN0cmluZyA9ICdhdmF0YXItcmFkaXVzJztcclxuICAgIGF2YXRhcmN1c3RvbWJnY29sb3I6IHN0cmluZyA9ICdhdmF0YXItY3VzdG9tLWJnLWNvbG9yJztcclxuICAgIGR5bmFtaWM6IHN0cmluZyA9ICdhdmF0YXItZHluYW1pYyc7XHJcbiAgICBmb250V2VpZ2h0OiBzdHJpbmcgPSAnYXZhdGFyLWZvbnQtd2VpZ2h0JztcclxuICAgIGZvbnRGYW1pbHk6IHN0cmluZyA9ICdhdmF0YXItZm9udC1mYW1pbHknO1xyXG4gICAgc2hhcGU6IHN0cmluZyA9ICdhdmF0YXItc2hhcGUnO1xyXG4gICAgZGF0YTogc3RyaW5nID0gJ2F2YXRhci1kYXRhJztcclxuICAgIHJvdGF0ZWRlZzogc3RyaW5nID0gJ2F2YXRhci1yb3RhdGUtZGVncmVlJztcclxuICAgIGF2YXRhcmJvcmRlcjpzdHJpbmcgPSAnYXZhdGFyLWJvcmRlcic7XHJcbn1cclxuXHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgSW5wdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuaW1wb3J0IHsgQXR0cmlidXRlcywgTEFtZXRhIH0gZnJvbSBcIi4vbGFtZXRhXCI7XHJcblxyXG5kZWNsYXJlIGZ1bmN0aW9uIHVuZXNjYXBlKHg6IHN0cmluZyk6IHN0cmluZztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwicmItbGV0dGVyLWF2YXRhclwiLFxyXG4gICAgdGVtcGxhdGU6IFwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlwiXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSYkxldHRlckF2YXRhckNvbXBvbmVudCAge1xyXG4gICAgcHJpdmF0ZSBsZXR0ZXJhdmF0YXI6IGFueTtcclxuICAgIHByaXZhdGUgaW1hZ2VUYWc6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfbWV0YTogTEFtZXRhID0gbmV3IExBbWV0YSgpO1xyXG4gICAgcHJpdmF0ZSBhdHRyaWJ1dGU6IEF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlcygpO1xyXG5cclxuICAgIEBJbnB1dChcImF2YXRhci1hbHBoYWJldC1jb2xvcnNcIikgYWxwaGFiZXRjb2xvcnM6IHN0cmluZ1tdO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLXRleHQtY29sb3JcIikgdGV4dENvbG9yOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZGVmYXVsdC1ib3JkZXJcIikgZGVmYXVsdEJvcmRlcjogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLXRyaWFuZ2xlLXVwXCIpIHRyaWFuZ2xldXA6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1mb250LXNpemVcIikgZm9udHNpemU6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1oZWlnaHRcIikgaGVpZ2h0OiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItd2lkdGhcIikgd2lkdGg6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1mb250LXdlaWdodFwiKSBmb250V2VpZ2h0OiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZm9udC1mYW1pbHlcIikgZm9udEZhbWlseTogc3RyaW5nO1xyXG4gICAgYmFzZTogc3RyaW5nID0gXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFwiO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLXJhZGl1c1wiKSByYWRpdXM6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1keW5hbWljXCIpIGR5bmFtaWM6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1yb3RhdGUtZGVncmVlXCIpIHJvdGF0ZWRlZzogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLWNoYXItY291bnRcIikgY2hhckNvdW50OiBzdHJpbmcgPSBcIjFcIjtcclxuICAgIEBJbnB1dChcImF2YXRhci1kYXRhXCIpIGRhdGE6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1ib3JkZXItc3R5bGVcIikgYXZhdGFyQm9yZGVyU3R5bGU6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1ib3JkZXJcIikgYXZhdGFyYm9yZGVyOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItY3VzdG9tLWJvcmRlclwiKSBhdmF0YXJjdXN0b21ib3JkZXI6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1zaGFwZVwiKSBzaGFwZTogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLWN1c3RvbS1iZy1jb2xvclwiKSBhdmF0YXJjdXN0b21iZ2NvbG9yOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZWw6IEVsZW1lbnRSZWYpIHtcclxuICAgICAgICB0aGlzLmxldHRlcmF2YXRhciA9IGVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5hbHBoYWJldGNvbG9ycykge1xyXG4gICAgICAgICAgICB0aGlzLmFscGhhYmV0Y29sb3JzID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmFscGhhYmV0Y29sb3JzKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuYWxwaGFiZXRjb2xvcnMpIDogdGhpcy5fbWV0YS5kZWZhdWx0Q29sb3JzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMudGV4dENvbG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGV4dENvbG9yID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLnRleHRDb2xvcikgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLnRleHRDb2xvcikgOiB0aGlzLl9tZXRhLmRlZmF1bHRUZXh0Q29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCF0aGlzLmF2YXRhcmN1c3RvbWJnY29sb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5hdmF0YXJjdXN0b21iZ2NvbG9yID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmF2YXRhcmN1c3RvbWJnY29sb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmF2YXRhcmJvcmRlcikge1xyXG4gICAgICAgICAgICB0aGlzLmF2YXRhcmJvcmRlciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5hdmF0YXJib3JkZXIpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5hdmF0YXJib3JkZXIpIDogdGhpcy5fbWV0YS5kZWZhdWx0QXZhdGFyYm9yZGVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmRlZmF1bHRCb3JkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0Qm9yZGVyID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmRlZmF1bHRCb3JkZXIpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5kZWZhdWx0Qm9yZGVyKSA6IHRoaXMuX21ldGEuZGVmYXVsdEJvcmRlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnRyaWFuZ2xldXApIHtcclxuICAgICAgICAgICAgdGhpcy50cmlhbmdsZXVwID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLnRyaWFuZ2xldXApID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS50cmlhbmdsZXVwKSA6IHRoaXMuX21ldGEuZGVmYXVsdFRyaWFuZ2xldXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5mb250c2l6ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvbnRzaXplID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmZvbnRzaXplKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZm9udHNpemUpIDogdGhpcy5fbWV0YS5kZWFmdWx0Rm9udHNpemU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5oZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuaGVpZ2h0KSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuaGVpZ2h0KSA6IHRoaXMuX21ldGEuZGVmYXVsdEhlaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLndpZHRoKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUud2lkdGgpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS53aWR0aCkgOiB0aGlzLl9tZXRhLmRlYWZ1bHRXaWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnJhZGl1cykge1xyXG4gICAgICAgICAgICB0aGlzLnJhZGl1cyA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5yYWRpdXMpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5yYWRpdXMpIDogdGhpcy5fbWV0YS5kZWZhdWx0UmFkaXVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuZHluYW1pYykge1xyXG4gICAgICAgICAgICB0aGlzLmR5bmFtaWMgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZHluYW1pYykgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmR5bmFtaWMpIDogZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5yb3RhdGVkZWcpIHtcclxuICAgICAgICAgICAgdGhpcy5yb3RhdGVkZWcgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUucm90YXRlZGVnKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUucm90YXRlZGVnKSA6IHRoaXMuX21ldGEuZGVmYXVsdFJvdGF0ZWRlZztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvbnRXZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5mb250V2VpZ2h0ID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmZvbnRXZWlnaHQpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5mb250V2VpZ2h0KSA6IHRoaXMuX21ldGEuZGVmYXVsdEZvbnRXZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5mb250RmFtaWx5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9udEZhbWlseSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5mb250RmFtaWx5KSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZm9udEZhbWlseSkgOiB0aGlzLl9tZXRhLmRlZmF1bHRGb250RmFtaWx5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuc2hhcGUpIHtcclxuICAgICAgICAgICAgdGhpcy5zaGFwZSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5zaGFwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5kYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5kYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jcmVhdGVBdmF0YXIoKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eTogc3RyaW5nKTogYW55IHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSBcIlwiO1xyXG4gICAgICAgIHJlc3VsdCA9IHRoaXMubGV0dGVyYXZhdGFyLmdldEF0dHJpYnV0ZShwcm9wZXJ0eSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZUF2YXRhcigpOiB2b2lkIHtcclxuICAgICAgICBsZXQgYzogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBpZiAodGhpcy5jaGFyQ291bnQgPT09IFwiMlwiKSB7XHJcbiAgICAgICAgICAgIGxldCBfZGF0YTogc3RyaW5nID0gdGhpcy5nZXRGaXJzdEFuZExhc3ROYW1lKHRoaXMuZGF0YS50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICAgICAgaWYgKF9kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBjID0gX2RhdGE7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjID0gdGhpcy5kYXRhLnN1YnN0cmluZygwLCArdGhpcy5jaGFyQ291bnQpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjID0gdGhpcy5kYXRhLnN1YnN0cmluZygwLCArdGhpcy5jaGFyQ291bnQpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB0ZXh0VGFnOiBIVE1MRWxlbWVudCA9IHRoaXMuZ2V0Q2hhcmFjdGVyVGV4dFRhZyhjLCB0aGlzLnRleHRDb2xvciwgdGhpcy5mb250RmFtaWx5LCB0aGlzLmZvbnRXZWlnaHQsIHRoaXMuZm9udHNpemUpO1xyXG4gICAgICAgIGxldCBjb2xvckluZGV4OiBudW1iZXI7XHJcbiAgICAgICAgbGV0IGNvbG9yOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBQb3B1bGF0ZSB0aGUgY29sb3JzIGFjY29yZGluZyB0byBhdHRyaWJ1dGVzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGMuY2hhckNvZGVBdCgwKSA8IDY1KSB7XHJcbiAgICAgICAgICAgIGNvbG9yID0gdGhpcy5nZXRSYW5kb21Db2xvcnMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb2xvckluZGV4ID0gTWF0aC5mbG9vcigoYy5jaGFyQ29kZUF0KDApIC0gNjUpICUgdGhpcy5hbHBoYWJldGNvbG9ycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBjb2xvciA9IHRoaXMuYWxwaGFiZXRjb2xvcnNbY29sb3JJbmRleF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5hdmF0YXJjdXN0b21iZ2NvbG9yKSB7XHJcbiAgICAgICAgICAgIGNvbG9yID0gdGhpcy5hdmF0YXJjdXN0b21iZ2NvbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdmcodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIGNvbG9yLCB0ZXh0VGFnKTtcclxuICAgICAgICBsZXQgbHZjb21wb25lbnQ6c3RyaW5nID0gdGhpcy5nZXRMVlRleHQoKTtcclxuICAgICAgICBsZXQgc3ZnSHRtbDogc3RyaW5nID0gd2luZG93LmJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGx2Y29tcG9uZW50KSkpO1xyXG4gICAgICAgIGxldCBjb21wb25lbnQ6IHN0cmluZztcclxuICAgICAgICBsZXQgYmFzZTogc3RyaW5nID0gdGhpcy5iYXNlO1xyXG4gICAgICAgIGxldCBfc3R5bGU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHRoaXMuYXZhdGFyQm9yZGVyU3R5bGUpIHtcclxuICAgICAgICAgICAgX3N0eWxlID0gdGhpcy5hdmF0YXJCb3JkZXJTdHlsZTtcclxuICAgICAgICB9IGVsc2UgaWYodGhpcy5hdmF0YXJib3JkZXIgPT09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgIF9zdHlsZSA9IHRoaXMuZGVmYXVsdEJvcmRlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJvdGF0ZWRlZyAhPT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICAgICAgICBfc3R5bGUgPSBcIi1tcy10cmFuc2Zvcm06IHJvdGF0ZShcIiArIHRoaXMucm90YXRlZGVnICsgXCJkZWcpOyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKFwiICsgdGhpcy5yb3RhdGVkZWcgKyBcImRlZyk7IHRyYW5zZm9ybTogcm90YXRlKFwiICsgdGhpcy5yb3RhdGVkZWcgKyBcImRlZylcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNoYXBlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNoYXBlID09PSBcInJvdW5kXCIpIHtcclxuICAgICAgICAgICAgICAgIGxldCByb3VuZF9zdHlsZTogc3RyaW5nID0gdGhpcy5yYWRpdXMgKyBfc3R5bGU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmluZGV4T2YoXCJodHRwXCIpID4gLTEgfHwgdGhpcy5kYXRhLmluZGV4T2YoXCJkYXRhOmltYWdlXCIpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaW1nX3NpemU6IHN0cmluZyA9IFwid2lkdGg6XCIgKyB0aGlzLndpZHRoICsgXCJweDtoZWlnaHQ6XCIgKyB0aGlzLmhlaWdodCArIFwicHg7XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gXCI8aW1nIHNyYz1cIiArIHRoaXMuZGF0YSArIFwiIHN0eWxlPSdcIiArIGltZ19zaXplICsgcm91bmRfc3R5bGUgKyBcIicgIC8+XCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IFwiPGltZyBzcmM9XCIgKyBiYXNlICsgc3ZnSHRtbCArIFwiIHN0eWxlPSdcIiArIHJvdW5kX3N0eWxlICsgXCInIHRpdGxlPSdcIiArIHRoaXMuZGF0YSArIFwiJyAvPlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5pbmRleE9mKFwiaHR0cFwiKSA+IC0xIHx8IHRoaXMuZGF0YS5pbmRleE9mKFwiZGF0YTppbWFnZVwiKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW1nX3NpemU6IHN0cmluZyA9IFwid2lkdGg6XCIgKyB0aGlzLndpZHRoICsgXCJweDtoZWlnaHQ6XCIgKyB0aGlzLmhlaWdodCArIFwicHg7XCI7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBcIjxpbWcgc3JjPVwiICsgdGhpcy5kYXRhICsgXCIgc3R5bGU9J1wiICsgaW1nX3NpemUgKyBfc3R5bGUgKyBcIicgIC8+XCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBcIjxpbWcgc3JjPVwiICsgYmFzZSArIHN2Z0h0bWwgKyBcIiBzdHlsZT0nXCIgKyBfc3R5bGUgKyBcIicgdGl0bGU9J1wiICsgdGhpcy5kYXRhICsgXCInIC8+XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGV0dGVyYXZhdGFyLmlubmVySFRNTCA9IGNvbXBvbmVudDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRMVlRleHQoKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgbHZUYWc6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBsdlRhZy5hcHBlbmRDaGlsZCh0aGlzLmltYWdlVGFnLmNsb25lTm9kZSgpKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZVRhZy5vdXRlckhUTUw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQb3B1bGF0ZSB0aGUgc3ZnIHRhZyB3aGljaCB3aWxsIHVzZWQgZm9yIHRoZSBhdmF0YXIgZ2VuZXJhdGlvblxyXG4gICAgICogQHBhcmFtIHdpZHRoXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0XHJcbiAgICAgKiBAcGFyYW0gY29sb3JcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlU3ZnKHdpZHRoOiBzdHJpbmcsIGhlaWdodDogc3RyaW5nLCBjb2xvcjogc3RyaW5nLCBjb2JqOiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XHJcblxyXG4gICAgICAgIGxldCBzdmdUYWc6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN2Z1wiKTtcclxuICAgICAgICBzdmdUYWcuc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiKTtcclxuICAgICAgICBzdmdUYWcuc2V0QXR0cmlidXRlKFwicG9pbnRlci1ldmVudHNcIiwgXCJub25lXCIpO1xyXG4gICAgICAgIHN2Z1RhZy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCB3aWR0aCk7XHJcbiAgICAgICAgc3ZnVGFnLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBoZWlnaHQpO1xyXG4gICAgICAgIHN2Z1RhZy5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImJhY2tncm91bmQtY29sb3I6XCIgKyBjb2xvciArIFwiO3dpZHRoOlwiICsgd2lkdGggKyBcInB4XCIgKyBcIjtoZWlnaHQ6XCIgKyBoZWlnaHQgKyBcInB4XCIpO1xyXG4gICAgICAgIHN2Z1RhZy5hcHBlbmRDaGlsZChjb2JqKTtcclxuICAgICAgICB0aGlzLmltYWdlVGFnID0gc3ZnVGFnO1xyXG5cclxuICAgICAgICByZXR1cm4gc3ZnVGFnLmlubmVySFRNTDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqICBHZW5lcmF0ZSB0aGUgTGV0dGVyIHRhZyBieSB1c2luZyB0aGUgc3ZnIHRleHQgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIGNoYXJhY3RlclxyXG4gICAgICogQHBhcmFtIHRleHRDb2xvclxyXG4gICAgICogQHBhcmFtIGZvbnRGYW1pbHlcclxuICAgICAqIEBwYXJhbSBmb250V2VpZ2h0XHJcbiAgICAgKiBAcGFyYW0gZm9udHNpemVcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgIHByaXZhdGUgZ2V0Q2hhcmFjdGVyVGV4dFRhZyhjaGFyYWN0ZXI6c3RyaW5nLCB0ZXh0Q29sb3I6IHN0cmluZywgZm9udEZhbWlseTogc3RyaW5nLCBmb250V2VpZ2h0OiBzdHJpbmcsIGZvbnRzaXplOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgbGV0IHRleHRUYWc6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRcIik7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJ0ZXh0LWFuY2hvclwiLCBcIm1pZGRsZVwiKTtcclxuICAgICAgICB0ZXh0VGFnLnNldEF0dHJpYnV0ZShcInhcIiwgXCI1MCVcIik7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiNTAlXCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwiZHlcIiwgXCIwLjM1ZW1cIik7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJwb2ludGVyLWV2ZW50c1wiLCBcImF1dG9cIik7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRleHRDb2xvcik7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJmb250LWZhbWlseVwiLCBmb250RmFtaWx5KTtcclxuICAgICAgICB0ZXh0VGFnLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiZm9udC13ZWlnaHQ6XCIgKyBmb250V2VpZ2h0ICsgXCI7Zm9udC1zaXplOlwiICsgZm9udHNpemUgKyBcInB4XCIpO1xyXG4gICAgICAgIHRleHRUYWcuaW5uZXJUZXh0ID0gY2hhcmFjdGVyO1xyXG4gICAgICAgIHJldHVybiB0ZXh0VGFnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSByYW5kb20gY29sb3JzXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFJhbmRvbUNvbG9ycygpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBsZXR0ZXJzOiBzdHJpbmdbXSA9IFwiMDEyMzQ1Njc4OUFCQ0RFRlwiLnNwbGl0KFwiXCIpO1xyXG4gICAgICAgIGxldCBfY29sb3I6IHN0cmluZyA9IFwiI1wiO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCA2OyBpKyspIHtcclxuICAgICAgICAgICAgX2NvbG9yICs9IGxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTYpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGdldCB0aGUgZmlyc3QgbmFtZSBhbmQgbGFzdCBuYW1lIGZpcnN0IGxldHRlcnMgYW5kIGNvbWJpbmVkIGFuZCBmb3JtIHRoZSBsZXR0ZXIgYXZhdGFyXHJcbiAgICAgKiBAcGFyYW0gZGF0YVxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRGaXJzdEFuZExhc3ROYW1lKGRhdGE6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IG5hbWVzOiBzdHJpbmdbXSA9IGRhdGEuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIGlmIChuYW1lcyAmJiBuYW1lcy5sZW5ndGggPj0gMikge1xyXG4gICAgICAgICAgICBsZXQgZmlyc3ROYW1lOiBzdHJpbmcgPSBuYW1lc1swXTtcclxuICAgICAgICAgICAgbGV0IGxhc3ROYW1lOiBzdHJpbmcgPSBuYW1lc1sxXTtcclxuICAgICAgICAgICAgaWYgKGZpcnN0TmFtZSAmJiBsYXN0TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRleHQ6IHN0cmluZyA9IGZpcnN0TmFtZS5zdWJzdHIoMCwgMSkgKyBsYXN0TmFtZS5zdWJzdHIoMCwgMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLnN1YnN0cigwLCAyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7TmdNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7UmJMZXR0ZXJBdmF0YXJDb21wb25lbnR9IGZyb20gXCIuL2xldHRlci1hdmF0YXIvcmItbGV0dGVyLWF2YXRhci5jb21wb25lbnRcIjtcclxuXHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgICBkZWNsYXJhdGlvbnM6IFtSYkxldHRlckF2YXRhckNvbXBvbmVudF0sXHJcbiAgICBwcm92aWRlcnM6IFtdLFxyXG4gICAgZXhwb3J0czogW1JiTGV0dGVyQXZhdGFyQ29tcG9uZW50XVxyXG59KVxyXG5leHBvcnQg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