com.phloxui
Version:
PhloxUI Ng2+ Framework
326 lines (325 loc) • 33.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ColorUtils = /** @class */ (function () {
function ColorUtils() {
}
/**
* @param {?} value
* @return {?}
*/
ColorUtils.isHexValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
var /** @type {?} */ isHexValue = /^#[0-9A-F]{6}$/i.test(value);
return isHexValue;
};
/**
* @param {?} hex
* @return {?}
*/
ColorUtils.hexToRGB = /**
* @param {?} hex
* @return {?}
*/
function (hex) {
var /** @type {?} */ c = [];
if (!hex.startsWith("#")) {
c = ("#" + hex).substring(1).split('');
}
else {
c = hex.substring(1).split('');
}
if (c.length == 3) {
c = [c[0], c[0], c[1], c[1], c[2], c[2]];
}
c = '0x' + c.join('');
return 'rgb(' + [(c >> 16) & 255, (c >> 8) & 255, c & 255].join(',') + ')';
};
/**
* @param {?} value
* @return {?}
*/
ColorUtils.componentToHex = /**
* @param {?} value
* @return {?}
*/
function (value) {
var /** @type {?} */ hex = value.toString(16);
return hex.length == 1 ? "0" + hex : hex;
};
/**
* @param {?} r
* @param {?} g
* @param {?} b
* @return {?}
*/
ColorUtils.rgbToHex = /**
* @param {?} r
* @param {?} g
* @param {?} b
* @return {?}
*/
function (r, g, b) {
return "#" + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b);
};
/**
* @param {?} hex
* @param {?} percentage
* @return {?}
*/
ColorUtils.shadeHexColor = /**
* @param {?} hex
* @param {?} percentage
* @return {?}
*/
function (hex, percentage) {
var /** @type {?} */ hexString = hex;
if (hex.startsWith("#")) {
hexString = hex.substr(1);
}
var /** @type {?} */ num = parseInt(hexString, 16);
var /** @type {?} */ amt = Math.round(2.55 * percentage);
var /** @type {?} */ R = (num >> 16) + amt;
var /** @type {?} */ G = (num >> 8 & 0x00FF) + amt;
var /** @type {?} */ B = (num & 0x0000FF) + amt;
return '#' + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 + (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 + (B < 255 ? B < 1 ? 0 : B : 255)).toString(16).slice(1);
};
/**
* @param {?} r
* @param {?} g
* @param {?} b
* @param {?} percentage
* @return {?}
*/
ColorUtils.shadeRGBColor = /**
* @param {?} r
* @param {?} g
* @param {?} b
* @param {?} percentage
* @return {?}
*/
function (r, g, b, percentage) {
// let f = color.split(",");
var /** @type {?} */ t = percentage < 0 ? 0 : 255;
var /** @type {?} */ p = percentage < 0 ? percentage * -1 : percentage;
var /** @type {?} */ R = (Math.round((t - r) * p) + r);
var /** @type {?} */ RString = R + "";
if (RString.length > 3) {
RString = RString.substr(0, 3);
}
var /** @type {?} */ G = (Math.round((t - g) * p) + g);
var /** @type {?} */ GString = G + "";
if (GString.length > 3) {
GString = GString.substr(0, 3);
}
var /** @type {?} */ B = (Math.round((t - b) * p) + b);
var /** @type {?} */ BString = B + "";
if (BString.length > 3) {
BString = BString.substr(0, 3);
}
return "rgb(" + RString + "," + GString + "," + BString + ")";
};
/**
* @param {?} color1
* @param {?} color2
* @param {?} point
* @return {?}
*/
ColorUtils.blendHexColors = /**
* @param {?} color1
* @param {?} color2
* @param {?} point
* @return {?}
*/
function (color1, color2, point) {
if (color1.length == 4) {
color1 = color1[1] + color1[1] + color1[2] + color1[2] + color1[3] + color1[3];
}
else {
color1 = color1.substring(1);
}
if (color2.length == 4) {
color2 = color2[1] + color2[1] + color2[2] + color2[2] + color2[3] + color2[3];
}
else {
color2 = color2.substring(1);
}
// we have valid input, convert colors to rgb
var /** @type {?} */ color1Array = [parseInt(color1[0] + color1[1], 16), parseInt(color1[2] + color1[3], 16), parseInt(color1[4] + color1[5], 16)];
var /** @type {?} */ color2Array = [parseInt(color2[0] + color2[1], 16), parseInt(color2[2] + color2[3], 16), parseInt(color2[4] + color2[5], 16)];
// blend
var /** @type {?} */ color3 = [
(1 - point) * color1Array[0] + point * color2Array[0],
(1 - point) * color1Array[1] + point * color2Array[1],
(1 - point) * color1Array[2] + point * color2Array[2]
];
// convert to hex
return '#' + this.componentToHex(Math.round(color3[0])) + this.componentToHex(Math.round(color3[1])) + this.componentToHex(Math.round(color3[2]));
};
/**
* @param {?} hueDegree
* @param {?} saturation
* @param {?} brightness
* @return {?}
*/
ColorUtils.hsbToRGB = /**
* @param {?} hueDegree
* @param {?} saturation
* @param {?} brightness
* @return {?}
*/
function (hueDegree, saturation, brightness) {
if (hueDegree < 0) {
hueDegree = 0;
}
if (hueDegree >= 360) {
hueDegree = 359;
}
if (saturation < 0) {
saturation = 0;
}
if (saturation > 100) {
saturation = 100;
}
if (brightness < 0) {
brightness = 0;
}
if (brightness > 100) {
brightness = 100;
}
hueDegree /= 360;
saturation /= 100;
brightness /= 100;
var /** @type {?} */ r, /** @type {?} */ g, /** @type {?} */ b;
if (saturation === 0) {
r = g = b = brightness; // achromatic
}
else {
var /** @type {?} */ hue2rgb = function (p, q, t) {
if (t < 0)
t += 1;
if (t > 1)
t -= 1;
if (t < 1 / 6)
return p + (q - p) * 6 * t;
if (t < 1 / 2)
return q;
if (t < 2 / 3)
return p + (q - p) * (2 / 3 - t) * 6;
return p;
};
var /** @type {?} */ q = brightness < 0.5 ? brightness * (1 + saturation) : brightness + saturation - brightness * saturation;
var /** @type {?} */ p = 2 * brightness - q;
r = hue2rgb(p, q, hueDegree + 1 / 3);
g = hue2rgb(p, q, hueDegree);
b = hue2rgb(p, q, hueDegree - 1 / 3);
}
var /** @type {?} */ rgbArray = [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
return "rgb(" + rgbArray[0] + "," + rgbArray[1] + "," + rgbArray[2] + ")";
};
/**
* @param {?} hueDegree
* @param {?} saturation
* @param {?} brightness
* @return {?}
*/
ColorUtils.hsbToHex = /**
* @param {?} hueDegree
* @param {?} saturation
* @param {?} brightness
* @return {?}
*/
function (hueDegree, saturation, brightness) {
var /** @type {?} */ rgbString = this.hsbToRGB(hueDegree, saturation, brightness);
var /** @type {?} */ rgb = rgbString.substring(4, rgbString.length - 1).replace(/ /g, '').split(',');
return this.rgbToHex(parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2]));
};
/**
* @param {?} r
* @param {?} g
* @param {?} b
* @return {?}
*/
ColorUtils.rgbToHsl = /**
* @param {?} r
* @param {?} g
* @param {?} b
* @return {?}
*/
function (r, g, b) {
r /= 255;
g /= 255;
b /= 255;
var /** @type {?} */ max = Math.max(r, g, b);
var /** @type {?} */ min = Math.min(r, g, b);
var /** @type {?} */ h, /** @type {?} */ s, /** @type {?} */ l = (max + min) / 2;
if (max == min) {
h = s = 0; // achromatic
}
else {
var /** @type {?} */ d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) {
case r:
h = (g - b) / d + (g < b ? 6 : 0);
break;
case g:
h = (b - r) / d + 2;
break;
case b:
h = (r - g) / d + 4;
break;
}
h /= 6;
}
return [h, s, l];
};
/**
* @param {?} hex
* @return {?}
*/
ColorUtils.hexToHsl = /**
* @param {?} hex
* @return {?}
*/
function (hex) {
var /** @type {?} */ rgbString = this.hexToRGB(hex);
var /** @type {?} */ rgb = rgbString.substring(4, rgbString.length - 1).replace(/ /g, '').split(',');
return this.rgbToHsl(parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2]));
};
/**
* @param {?} r
* @param {?} g
* @param {?} b
* @return {?}
*/
ColorUtils.rgbToHue = /**
* @param {?} r
* @param {?} g
* @param {?} b
* @return {?}
*/
function (r, g, b) {
return Math.round(this.rgbToHsl(r, g, b)[0] * 360);
};
/**
* @param {?} hex
* @return {?}
*/
ColorUtils.hexToHue = /**
* @param {?} hex
* @return {?}
*/
function (hex) {
var /** @type {?} */ rgbString = this.hexToRGB(hex);
var /** @type {?} */ rgb = rgbString.substring(4, rgbString.length - 1).replace(/ /g, '').split(',');
return this.rgbToHue(parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2]));
};
return ColorUtils;
}());
export { ColorUtils };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sb3JVdGlscy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL3NoYXJlL3V0aWxzL0NvbG9yVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUE7Ozs7Ozs7SUFDa0IscUJBQVU7Ozs7Y0FBQyxLQUFhO1FBQ2xDLHFCQUFJLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFL0MsTUFBTSxDQUFDLFVBQVUsQ0FBQzs7Ozs7O0lBR1IsbUJBQVE7Ozs7Y0FBQyxHQUFXO1FBQzlCLHFCQUFJLENBQUMsR0FBUSxFQUFFLENBQUM7UUFDaEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMxQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osQ0FBQyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUM7UUFDRCxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Ozs7OztJQUdqRSx5QkFBYzs7OztjQUFDLEtBQVU7UUFDbkMscUJBQUksR0FBRyxHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Ozs7Ozs7O0lBRy9CLG1CQUFROzs7Ozs7Y0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7UUFDbEQsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7OztJQUk1RSx3QkFBYTs7Ozs7Y0FBQyxHQUFXLEVBQUUsVUFBa0I7UUFDdkQscUJBQUksU0FBUyxHQUFXLEdBQUcsQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3QjtRQUVELHFCQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLHFCQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQztRQUN4QyxxQkFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzFCLHFCQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xDLHFCQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7O0lBSTdKLHdCQUFhOzs7Ozs7O2NBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsVUFBa0I7O1FBRTNFLHFCQUFJLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNqQyxxQkFBSSxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDdEQscUJBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxxQkFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QscUJBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxxQkFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QscUJBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxxQkFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQzs7Ozs7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QUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Ozs7OztJQUdQLG1CQUFROzs7O2NBQUMsR0FBVztRQUM5QixxQkFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxxQkFBSSxHQUFHLEdBQWEsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU5RixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7OztJQUdqRSxtQkFBUTs7Ozs7O2NBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTO1FBQ2xELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQzs7Ozs7O0lBR3pDLG1CQUFROzs7O2NBQUMsR0FBVztRQUM5QixxQkFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxxQkFBSSxHQUFHLEdBQWEsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU5RixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztxQkF2TW5GO0lBeU1DLENBQUE7QUF6TUQsc0JBeU1DIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIENvbG9yVXRpbHMge1xuICAgIHB1YmxpYyBzdGF0aWMgaXNIZXhWYWx1ZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpc0hleFZhbHVlID0gL14jWzAtOUEtRl17Nn0kL2kudGVzdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGlzSGV4VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoZXhUb1JHQihoZXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBjOiBhbnkgPSBbXTtcbiAgICAgICAgaWYgKCFoZXguc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgICAgICAgIGMgPSAoXCIjXCIgKyBoZXgpLnN1YnN0cmluZygxKS5zcGxpdCgnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjID0gaGV4LnN1YnN0cmluZygxKS5zcGxpdCgnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYy5sZW5ndGggPT0gMykge1xuICAgICAgICAgICAgYyA9IFtjWzBdLCBjWzBdLCBjWzFdLCBjWzFdLCBjWzJdLCBjWzJdXTtcbiAgICAgICAgfVxuICAgICAgICBjID0gJzB4JyArIGMuam9pbignJyk7XG5cbiAgICAgICAgcmV0dXJuICdyZ2IoJyArIFsoYyA+PiAxNikgJiAyNTUsIChjID4+IDgpICYgMjU1LCBjICYgMjU1XS5qb2luKCcsJykgKyAnKSc7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb21wb25lbnRUb0hleCh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGhleDogc3RyaW5nID0gdmFsdWUudG9TdHJpbmcoMTYpO1xuXG4gICAgICAgIHJldHVybiBoZXgubGVuZ3RoID09IDEgPyBcIjBcIiArIGhleCA6IGhleDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJnYlRvSGV4KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCIjXCIgKyB0aGlzLmNvbXBvbmVudFRvSGV4KHIpICsgdGhpcy5jb21wb25lbnRUb0hleChnKSArIHRoaXMuY29tcG9uZW50VG9IZXgoYik7XG4gICAgfVxuXG4gICAgLy8gcGVyY2VudGFnZSA9PiBhcyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMFxuICAgIHB1YmxpYyBzdGF0aWMgc2hhZGVIZXhDb2xvcihoZXg6IHN0cmluZywgcGVyY2VudGFnZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGhleFN0cmluZzogc3RyaW5nID0gaGV4O1xuICAgICAgICBpZiAoaGV4LnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICAgICAgICBoZXhTdHJpbmcgPSBoZXguc3Vic3RyKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG51bSA9IHBhcnNlSW50KGhleFN0cmluZywgMTYpO1xuICAgICAgICBsZXQgYW10ID0gTWF0aC5yb3VuZCgyLjU1ICogcGVyY2VudGFnZSk7XG4gICAgICAgIGxldCBSID0gKG51bSA+PiAxNikgKyBhbXQ7XG4gICAgICAgIGxldCBHID0gKG51bSA+PiA4ICYgMHgwMEZGKSArIGFtdDtcbiAgICAgICAgbGV0IEIgPSAobnVtICYgMHgwMDAwRkYpICsgYW10O1xuICAgICAgICByZXR1cm4gJyMnICsgKDB4MTAwMDAwMCArIChSIDwgMjU1ID8gUiA8IDEgPyAwIDogUiA6IDI1NSkgKiAweDEwMDAwICsgKEcgPCAyNTUgPyBHIDwgMSA/IDAgOiBHIDogMjU1KSAqIDB4MTAwICsgKEIgPCAyNTUgPyBCIDwgMSA/IDAgOiBCIDogMjU1KSkudG9TdHJpbmcoMTYpLnNsaWNlKDEpO1xuICAgIH1cblxuICAgIC8vIHBlcmNlbnRhZ2UgPT4gYXMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDBcbiAgICBwdWJsaWMgc3RhdGljIHNoYWRlUkdCQ29sb3IocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgcGVyY2VudGFnZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgLy8gbGV0IGYgPSBjb2xvci5zcGxpdChcIixcIik7XG4gICAgICAgIGxldCB0ID0gcGVyY2VudGFnZSA8IDAgPyAwIDogMjU1O1xuICAgICAgICBsZXQgcCA9IHBlcmNlbnRhZ2UgPCAwID8gcGVyY2VudGFnZSAqIC0xIDogcGVyY2VudGFnZTtcbiAgICAgICAgbGV0IFIgPSAoTWF0aC5yb3VuZCgodCAtIHIpICogcCkgKyByKTtcbiAgICAgICAgbGV0IFJTdHJpbmcgPSBSICsgXCJcIjtcbiAgICAgICAgaWYgKFJTdHJpbmcubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgUlN0cmluZyA9IFJTdHJpbmcuc3Vic3RyKDAsIDMpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBHID0gKE1hdGgucm91bmQoKHQgLSBnKSAqIHApICsgZyk7XG4gICAgICAgIGxldCBHU3RyaW5nID0gRyArIFwiXCI7XG4gICAgICAgIGlmIChHU3RyaW5nLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgIEdTdHJpbmcgPSBHU3RyaW5nLnN1YnN0cigwLCAzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgQiA9IChNYXRoLnJvdW5kKCh0IC0gYikgKiBwKSArIGIpO1xuICAgICAgICBsZXQgQlN0cmluZyA9IEIgKyBcIlwiO1xuICAgICAgICBpZiAoQlN0cmluZy5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICBCU3RyaW5nID0gQlN0cmluZy5zdWJzdHIoMCwgMyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJyZ2IoXCIgKyBSU3RyaW5nICsgXCIsXCIgKyBHU3RyaW5nICsgXCIsXCIgKyBCU3RyaW5nICsgXCIpXCI7XG4gICAgfVxuXG4gICAgLy8gcG9pbnQgPT4gdGhlIGRpc3RhbmNlIGZyb20gdGhlIGZpcnN0IGNvbG9yLCBhcyBhIGRlY2ltYWwgYmV0d2VlbiAwIGFuZCAxXG4gICAgcHVibGljIHN0YXRpYyBibGVuZEhleENvbG9ycyhjb2xvcjE6IHN0cmluZywgY29sb3IyOiBzdHJpbmcsIHBvaW50OiBudW1iZXIpOiBzdHJpbmcge1xuXG4gICAgICAgIGlmIChjb2xvcjEubGVuZ3RoID09IDQpIHtcbiAgICAgICAgICAgIGNvbG9yMSA9IGNvbG9yMVsxXSArIGNvbG9yMVsxXSArIGNvbG9yMVsyXSArIGNvbG9yMVsyXSArIGNvbG9yMVszXSArIGNvbG9yMVszXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbG9yMSA9IGNvbG9yMS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH0gaWYgKGNvbG9yMi5sZW5ndGggPT0gNCkge1xuICAgICAgICAgICAgY29sb3IyID0gY29sb3IyWzFdICsgY29sb3IyWzFdICsgY29sb3IyWzJdICsgY29sb3IyWzJdICsgY29sb3IyWzNdICsgY29sb3IyWzNdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sb3IyID0gY29sb3IyLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdlIGhhdmUgdmFsaWQgaW5wdXQsIGNvbnZlcnQgY29sb3JzIHRvIHJnYlxuICAgICAgICBsZXQgY29sb3IxQXJyYXkgPSBbcGFyc2VJbnQoY29sb3IxWzBdICsgY29sb3IxWzFdLCAxNiksIHBhcnNlSW50KGNvbG9yMVsyXSArIGNvbG9yMVszXSwgMTYpLCBwYXJzZUludChjb2xvcjFbNF0gKyBjb2xvcjFbNV0sIDE2KV07XG4gICAgICAgIGxldCBjb2xvcjJBcnJheSA9IFtwYXJzZUludChjb2xvcjJbMF0gKyBjb2xvcjJbMV0sIDE2KSwgcGFyc2VJbnQoY29sb3IyWzJdICsgY29sb3IyWzNdLCAxNiksIHBhcnNlSW50KGNvbG9yMls0XSArIGNvbG9yMls1XSwgMTYpXTtcblxuICAgICAgICAvLyBibGVuZFxuICAgICAgICBsZXQgY29sb3IzID0gW1xuICAgICAgICAgICAgKDEgLSBwb2ludCkgKiBjb2xvcjFBcnJheVswXSArIHBvaW50ICogY29sb3IyQXJyYXlbMF0sXG4gICAgICAgICAgICAoMSAtIHBvaW50KSAqIGNvbG9yMUFycmF5WzFdICsgcG9pbnQgKiBjb2xvcjJBcnJheVsxXSxcbiAgICAgICAgICAgICgxIC0gcG9pbnQpICogY29sb3IxQXJyYXlbMl0gKyBwb2ludCAqIGNvbG9yMkFycmF5WzJdXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gY29udmVydCB0byBoZXhcbiAgICAgICAgcmV0dXJuICcjJyArIHRoaXMuY29tcG9uZW50VG9IZXgoTWF0aC5yb3VuZChjb2xvcjNbMF0pKSArIHRoaXMuY29tcG9uZW50VG9IZXgoTWF0aC5yb3VuZChjb2xvcjNbMV0pKSArIHRoaXMuY29tcG9uZW50VG9IZXgoTWF0aC5yb3VuZChjb2xvcjNbMl0pKTtcbiAgICB9XG5cbiAgICAvLyBodWUgLT4gZGVncmVlIG51bWJlciBiZXR3ZWVuIDAgLSAzNTlcbiAgICAvLyBzYXR1cmF0aW9uIC0+IHBlcmNlbnRhZ2UgbnVtYmVyIGJldHdlZW4gMCAtIDEwMFxuICAgIC8vIGJyaWdodG5lc3MgLT4gcGVyY2VudGFnZSBudW1iZXIgYmV0d2VlbiAwIC0gMTAwXG4gICAgcHVibGljIHN0YXRpYyBoc2JUb1JHQihodWVEZWdyZWU6IG51bWJlciwgc2F0dXJhdGlvbjogbnVtYmVyLCBicmlnaHRuZXNzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBpZiAoaHVlRGVncmVlIDwgMCkge1xuICAgICAgICAgICAgaHVlRGVncmVlID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaHVlRGVncmVlID49IDM2MCkge1xuICAgICAgICAgICAgaHVlRGVncmVlID0gMzU5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYXR1cmF0aW9uIDwgMCkge1xuICAgICAgICAgICAgc2F0dXJhdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNhdHVyYXRpb24gPiAxMDApIHtcbiAgICAgICAgICAgIHNhdHVyYXRpb24gPSAxMDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJyaWdodG5lc3MgPCAwKSB7XG4gICAgICAgICAgICBicmlnaHRuZXNzID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnJpZ2h0bmVzcyA+IDEwMCkge1xuICAgICAgICAgICAgYnJpZ2h0bmVzcyA9IDEwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGh1ZURlZ3JlZSAvPSAzNjA7XG4gICAgICAgIHNhdHVyYXRpb24gLz0gMTAwO1xuICAgICAgICBicmlnaHRuZXNzIC89IDEwMDtcblxuICAgICAgICBsZXQgciwgZywgYjtcbiAgICAgICAgaWYgKHNhdHVyYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgIHIgPSBnID0gYiA9IGJyaWdodG5lc3M7IC8vIGFjaHJvbWF0aWNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGh1ZTJyZ2IgPSAocDogYW55LCBxOiBhbnksIHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0IDwgMCkgdCArPSAxO1xuICAgICAgICAgICAgICAgIGlmICh0ID4gMSkgdCAtPSAxO1xuICAgICAgICAgICAgICAgIGlmICh0IDwgMSAvIDYpIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0O1xuICAgICAgICAgICAgICAgIGlmICh0IDwgMSAvIDIpIHJldHVybiBxO1xuICAgICAgICAgICAgICAgIGlmICh0IDwgMiAvIDMpIHJldHVybiBwICsgKHEgLSBwKSAqICgyIC8gMyAtIHQpICogNjtcbiAgICAgICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHEgPSBicmlnaHRuZXNzIDwgMC41ID8gYnJpZ2h0bmVzcyAqICgxICsgc2F0dXJhdGlvbikgOiBicmlnaHRuZXNzICsgc2F0dXJhdGlvbiAtIGJyaWdodG5lc3MgKiBzYXR1cmF0aW9uO1xuICAgICAgICAgICAgY29uc3QgcCA9IDIgKiBicmlnaHRuZXNzIC0gcTtcbiAgICAgICAgICAgIHIgPSBodWUycmdiKHAsIHEsIGh1ZURlZ3JlZSArIDEgLyAzKTtcbiAgICAgICAgICAgIGcgPSBodWUycmdiKHAsIHEsIGh1ZURlZ3JlZSk7XG4gICAgICAgICAgICBiID0gaHVlMnJnYihwLCBxLCBodWVEZWdyZWUgLSAxIC8gMyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmdiQXJyYXkgPSBbTWF0aC5yb3VuZChyICogMjU1KSwgTWF0aC5yb3VuZChnICogMjU1KSwgTWF0aC5yb3VuZChiICogMjU1KV07XG5cbiAgICAgICAgcmV0dXJuIFwicmdiKFwiICsgcmdiQXJyYXlbMF0gKyBcIixcIiArIHJnYkFycmF5WzFdICsgXCIsXCIgKyByZ2JBcnJheVsyXSArIFwiKVwiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaHNiVG9IZXgoaHVlRGVncmVlOiBudW1iZXIsIHNhdHVyYXRpb246IG51bWJlciwgYnJpZ2h0bmVzczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJnYlN0cmluZyA9IHRoaXMuaHNiVG9SR0IoaHVlRGVncmVlLCBzYXR1cmF0aW9uLCBicmlnaHRuZXNzKTtcbiAgICAgICAgbGV0IHJnYjogc3RyaW5nW10gPSByZ2JTdHJpbmcuc3Vic3RyaW5nKDQsIHJnYlN0cmluZy5sZW5ndGggLSAxKS5yZXBsYWNlKC8gL2csICcnKS5zcGxpdCgnLCcpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJnYlRvSGV4KHBhcnNlSW50KHJnYlswXSksIHBhcnNlSW50KHJnYlsxXSksIHBhcnNlSW50KHJnYlsyXSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmdiVG9Ic2wocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICAgICAgciAvPSAyNTU7XG4gICAgICAgIGcgLz0gMjU1O1xuICAgICAgICBiIC89IDI1NTtcblxuICAgICAgICBsZXQgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XG4gICAgICAgIGxldCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgICAgICAgbGV0IGgsIHMsIGwgPSAobWF4ICsgbWluKSAvIDI7XG5cbiAgICAgICAgaWYgKG1heCA9PSBtaW4pIHtcbiAgICAgICAgICAgIGggPSBzID0gMDsgLy8gYWNocm9tYXRpY1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGQgPSBtYXggLSBtaW47XG4gICAgICAgICAgICBzID0gbCA+IDAuNSA/IGQgLyAoMiAtIG1heCAtIG1pbikgOiBkIC8gKG1heCArIG1pbik7XG4gICAgICAgICAgICBzd2l0Y2ggKG1heCkge1xuICAgICAgICAgICAgICAgIGNhc2UgcjogaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGc6IGggPSAoYiAtIHIpIC8gZCArIDI7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgYjogaCA9IChyIC0gZykgLyBkICsgNDsgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoIC89IDY7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2gsIHMsIGxdO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGV4VG9Ic2woaGV4OiBzdHJpbmcpOiBudW1iZXJbXSB7XG4gICAgICAgIGxldCByZ2JTdHJpbmcgPSB0aGlzLmhleFRvUkdCKGhleCk7XG4gICAgICAgIGxldCByZ2I6IHN0cmluZ1tdID0gcmdiU3RyaW5nLnN1YnN0cmluZyg0LCByZ2JTdHJpbmcubGVuZ3RoIC0gMSkucmVwbGFjZSgvIC9nLCAnJykuc3BsaXQoJywnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZ2JUb0hzbChwYXJzZUludChyZ2JbMF0pLCBwYXJzZUludChyZ2JbMV0pLCBwYXJzZUludChyZ2JbMl0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJnYlRvSHVlKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLnJnYlRvSHNsKHIsIGcsIGIpWzBdICogMzYwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhleFRvSHVlKGhleDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHJnYlN0cmluZyA9IHRoaXMuaGV4VG9SR0IoaGV4KTtcbiAgICAgICAgbGV0IHJnYjogc3RyaW5nW10gPSByZ2JTdHJpbmcuc3Vic3RyaW5nKDQsIHJnYlN0cmluZy5sZW5ndGggLSAxKS5yZXBsYWNlKC8gL2csICcnKS5zcGxpdCgnLCcpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJnYlRvSHVlKHBhcnNlSW50KHJnYlswXSksIHBhcnNlSW50KHJnYlsxXSksIHBhcnNlSW50KHJnYlsyXSkpO1xuICAgIH1cbn1cbiJdfQ==