UNPKG

stimulsoft-forms

Version:
301 lines (300 loc) 47.2 kB
import { DateTime } from "./DateTime"; import { Enum } from "./Enum"; import List from "./List"; import { StiString } from "./StiObject"; export default class StiJson { static { this.prettyPrint = true; } static dateToJsonDate(date) { let offset = date.date.getTimezoneOffset() * -1; let hoursOffset = Math.abs(Math.floor(offset / 60)).toString(); let minutesOffset = Math.abs(offset % 60).toString(); if (hoursOffset.length == 1) hoursOffset = "0" + hoursOffset; if (minutesOffset.length == 1) minutesOffset = "0" + minutesOffset; return ( /* "/Date(" +*/ Date.parse(date.date.toString()).toString() + (offset >= 0 ? "+" : "-") + hoursOffset + minutesOffset /*+ ")/"*/); } static jsonDateFormatToDate(jsonDate) { let dateStr = jsonDate.split("/Date(").join("").split(")/").join(""); let date = new DateTime(new Date(parseInt(dateStr))); let startOffsetIndex = dateStr.indexOf("+"); if (startOffsetIndex == -1) startOffsetIndex = dateStr.indexOf("-"); let localOffset = date.date.getTimezoneOffset(); if (startOffsetIndex != -1) localOffset = 0; let localHoursOffset = Math.floor(localOffset / 60); let localMinutesOffset = localOffset % 60; let localHoursOffsetString = (Math.abs(localHoursOffset) < 10 ? "0" : "") + Math.abs(localHoursOffset).toString(); let localMinutesOffsetString = (Math.abs(localMinutesOffset) < 10 ? "0" : "") + Math.abs(localMinutesOffset).toString(); let offset = (localOffset >= 0 ? "+" : "-") + localHoursOffsetString + localMinutesOffsetString; let multiple = 1; if (startOffsetIndex != -1) offset = dateStr.substring(startOffsetIndex); if (offset.substr(0, 1) == "-") multiple = -1; date.addHours(localHoursOffset + parseInt(offset.substr(1, 2)) * multiple); date.addMinutes(localMinutesOffset + parseInt(offset.substr(3, 2)) * multiple); return date; } properties() { if (!this.isProperty) { if (this.value instanceof List) return this.value; else return this.value.value; } return new List(); } removeProperty(propertyName) { if (propertyName != null || propertyName != "") { let elements = this.value.value.filter((x) => x.name == propertyName); if (elements.length > 0) { this.value.value.remove(elements[0]); } } } addPropertyNumber(propertyName, value) { if (this.value == null) this.value = new StiJson("", new List()); this.removeProperty(propertyName); this.value.value.push(new StiJson(propertyName, value, true)); } addPropertyNumberNotNull(propertyName, value) { if (value) { this.addPropertyNumber(propertyName, value); } } addPropertyNumberNoDefaultValue(propertyName, value) { if (this.value == null) this.value = new StiJson("", new List()); this.removeProperty(propertyName); this.value.value.push(new StiJson(propertyName, value, true)); } addPropertyJObject(propertyName, value) { if (this.value == null) this.value = new StiJson("", new List()); this.removeProperty(propertyName); if (value == null || value.count == 0) return; this.value.value.push(new StiJson(propertyName, value)); } addPropertyArray(propertyName, elements) { if (this.value == null) this.value = new StiJson("", new List()); this.removeProperty(propertyName); if (elements == null) return; let values = []; elements.forEach((e) => values.push(e?.saveToJsonObject != null ? e.saveToJsonObject(this.options) : typeof e == "string" ? `"${e .replace(/[\\]/g, "\\\\") .replace(/[\"]/g, '\\"') // .replace(/[\/]/g, '\\/') .replace(/[\b]/g, "\\b") .replace(/[\f]/g, "\\f") .replace(/\r\n/g, "\n") .replace(/[\r]/g, "\n") .replace(/[\r\n]/g, "\\r\\n") .replace(/[\t]/g, "\\t") // eslint-disable-next-line no-control-regex .replace(/[\u0001-\u001F]/g, (chr) => "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4))}"` : e)); let json = new StiJson(propertyName, values); json.isArray = true; this.value.value.push(json); } addPropertyIdent(propertyName, value) { if (this.value == null) this.value = new StiJson("", new List()); this.value.value.push(new StiJson(propertyName, value, true)); } addPropertyBool(propertyName, value) { if (this.value == null) this.value = new StiJson("", new List()); this.removeProperty(propertyName); this.value.value.push(new StiJson(propertyName, value, true)); } /*addPropertyDateTime(propertyName: string, value: DateTime) { if (this.value == null) this.value = new StiJson("", new List()); this.removeProperty(propertyName); this.value.value.push(new StiJson(propertyName, StiJson.dateToJsonDate(value), true)); }*/ addPropertyEnum(propertyName, enumType, value, defaultValue = null) { if (this.value == null) this.value = new StiJson("", new List()); this.removeProperty(propertyName); if (typeof defaultValue != "undefined" && value == defaultValue) return; this.value.value.push(new StiJson(propertyName, Enum.getName(enumType, value), true)); } addPropertyColor(propertyName, color, defColor = null) { if (color == null || color.equals(defColor)) return; let value = color.isNamedColor ? color.name.replace(" ", "") : `${color.a},${color.r},${color.g},${color.b}`; this.addPropertyString(propertyName, value); } addPropertyString(propertyName, value, defaultValue) { if (this.value == null) this.value = new StiJson("", new List()); this.removeProperty(propertyName); if (value == defaultValue) return; this.value.value.push(new StiJson(propertyName, value, true)); } addPropertyStringNullOrEmpty(propertyName, value) { if (this.value == null) this.value = new StiJson("", new List()); this.removeProperty(propertyName); if (StiString.isNullOrEmpty(value)) return; this.value.value.push(new StiJson(propertyName, value, true)); } get count() { let count = 0; if (!this.isProperty && this.value != null) { // eslint-disable-next-line @typescript-eslint/no-unused-vars for (let propertyName of this.value.value) { count++; } } return count; } getArray() { let result = []; this.value.forEach((e) => result.push(e.value)); return result; } serialize(indent = 0) { let jsonString = ""; let tabs = StiJson.prettyPrint ? Array(indent + 1).join(" ") : ""; for (let property of this.value.properties()) { let valueString = ""; if (property.isProperty) { if (property.value != null && typeof property.value == "string") valueString = '"' + property.value .replace(/[\\]/g, "\\\\") .replace(/[\"]/g, '\\"') // .replace(/[\/]/g, '\\/') .replace(/[\b]/g, "\\b") .replace(/[\f]/g, "\\f") .replace(/\r\n/g, "\n") .replace(/[\r]/g, "\n") .replace(/[\r\n]/g, "\\r\\n") .replace(/[\t]/g, "\\t") // eslint-disable-next-line no-control-regex .replace(/[\u0001-\u001F]/g, (chr) => "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4)) + '"'; // "\"" + property.value.replace(/\"/gi, "\\\"").replace(/\r\n/gi, "\n").replace(/\r/gi, "\n").replace(/\n/gi, "\\r\\n").replace(/\\/gi, "\\\\") + "\""; else valueString = property.value; } else if (property.isArray) { if (property.value.length == 0) { valueString += "["; } for (let element of property.value) { if (valueString) valueString += ","; else valueString += "["; valueString += element?.serialize != null ? element.serialize(indent + 4) : element; } valueString += "]"; } else { valueString = property.value.serialize(indent + 2); } if (jsonString) jsonString += ","; if (StiJson.prettyPrint) jsonString += "\n" + tabs + " "; jsonString += '"' + property.name + '":'; if (StiJson.prettyPrint) jsonString += " "; jsonString += valueString; } if (!jsonString) return ""; if (StiJson.prettyPrint) return "{" + jsonString + "\n" + tabs + "}"; return "{" + jsonString + "}"; } deserialize(text) { if (typeof text == "string") { let pos = 0; let start = -1; while (pos < text.length) { if (text[pos] == '"' && (pos > 0 && text[pos - 1] != "\\" ? true : pos > 1 && text[pos - 2] == "\\" && pos > 2 && text[pos - 3] != "\\")) { if (start > -1) { let subText = text.substring(start, pos); let modText = subText .replace(/\\\\/gi, "#!!#") .replace(/\\t/gi, "#!t#") .replace(/\\\"/gi, "#!q#") .replace(/\\r\\n/gi, "#!rn#") .replace(/\\r/gi, "#!rn#") .replace(/\\n/gi, "#!rn#"); if (modText.length != subText.length) { // eslint-disable-next-line @typescript-eslint/restrict-plus-operands text = text.substring(0, start) + modText + text.substring(pos); pos += modText.length - subText.length; } start = -1; } else start = pos + 1; } pos++; } } let reportObject = typeof text == "object" ? text : JSON.parse(text); this.deserializeFromObject(reportObject); this.value = this.value.value; } deserializeFromObject(child) { for (let propertyName in child) { if (typeof child[propertyName] == "object") { let jObject = new StiJson(propertyName); if (this.value == null) this.value = new StiJson(null, new List()); this.value.value.push(jObject); jObject.deserializeFromObject(child[propertyName]); } else if (typeof child[propertyName] != "function") { let jObject = new StiJson(propertyName, child[propertyName], true); if (this.value == null) this.value = new StiJson(null, new List()); this.value.value.push(jObject); } } if (child && Array.isArray(child) && child.length == 0) { this.value = new StiJson(null, new List()); } } toString() { return this.name; } constructor(name = null, value = null, isProperty = false, options = {}) { this.isProperty = false; this.isArray = false; this.name = name; if (value != null && typeof value == "string") value = value.replace(/#!rn#/gi, "\r\n").replace(/#!q#/gi, '"').replace(/#!t#/gi, "\t").replace(/#!!#/gi, "\\"); this.value = value; this.isProperty = isProperty; this.options = options; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RpSnNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0aW11bHNvZnQtZm9ybXMvc3JjL2xpYi9zeXN0ZW0vU3RpSnNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQzFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEMsTUFBTSxDQUFDLE9BQU8sT0FBTyxPQUFPO2FBQ25CLGdCQUFXLEdBQUcsSUFBSSxBQUFQLENBQVE7SUFHMUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFjO1FBQ2xDLElBQUksTUFBTSxHQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLFdBQVcsR0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdkUsSUFBSSxhQUFhLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0QsSUFBSSxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUM7WUFBRSxXQUFXLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQztRQUM3RCxJQUFJLGFBQWEsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLGFBQWEsR0FBRyxHQUFHLEdBQUcsYUFBYSxDQUFDO1FBRW5FLE9BQU87UUFDTCxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO1lB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QUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEgsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb2xvciBmcm9tIFwiLi9Db2xvclwiO1xyXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gXCIuL0RhdGVUaW1lXCI7XHJcbmltcG9ydCB7IEVudW0gfSBmcm9tIFwiLi9FbnVtXCI7XHJcbmltcG9ydCBMaXN0IGZyb20gXCIuL0xpc3RcIjtcclxuaW1wb3J0IHsgU3RpU3RyaW5nIH0gZnJvbSBcIi4vU3RpT2JqZWN0XCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGlKc29uIHtcclxuICBzdGF0aWMgcHJldHR5UHJpbnQgPSB0cnVlO1xyXG4gIG9wdGlvbnM6IGFueTtcclxuXHJcbiAgc3RhdGljIGRhdGVUb0pzb25EYXRlKGRhdGU6IERhdGVUaW1lKTogc3RyaW5nIHtcclxuICAgIGxldCBvZmZzZXQ6IG51bWJlciA9IGRhdGUuZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogLTE7XHJcbiAgICBsZXQgaG91cnNPZmZzZXQ6IHN0cmluZyA9IE1hdGguYWJzKE1hdGguZmxvb3Iob2Zmc2V0IC8gNjApKS50b1N0cmluZygpO1xyXG4gICAgbGV0IG1pbnV0ZXNPZmZzZXQ6IHN0cmluZyA9IE1hdGguYWJzKG9mZnNldCAlIDYwKS50b1N0cmluZygpO1xyXG4gICAgaWYgKGhvdXJzT2Zmc2V0Lmxlbmd0aCA9PSAxKSBob3Vyc09mZnNldCA9IFwiMFwiICsgaG91cnNPZmZzZXQ7XHJcbiAgICBpZiAobWludXRlc09mZnNldC5sZW5ndGggPT0gMSkgbWludXRlc09mZnNldCA9IFwiMFwiICsgbWludXRlc09mZnNldDtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAvKiBcIi9EYXRlKFwiICsqLyBEYXRlLnBhcnNlKGRhdGUuZGF0ZS50b1N0cmluZygpKS50b1N0cmluZygpICtcclxuICAgICAgKG9mZnNldCA+PSAwID8gXCIrXCIgOiBcIi1cIikgK1xyXG4gICAgICBob3Vyc09mZnNldCArXHJcbiAgICAgIG1pbnV0ZXNPZmZzZXQgLyorIFwiKS9cIiovXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGpzb25EYXRlRm9ybWF0VG9EYXRlKGpzb25EYXRlOiBzdHJpbmcpOiBEYXRlVGltZSB7XHJcbiAgICBsZXQgZGF0ZVN0ciA9IGpzb25EYXRlLnNwbGl0KFwiL0RhdGUoXCIpLmpvaW4oXCJcIikuc3BsaXQoXCIpL1wiKS5qb2luKFwiXCIpO1xyXG4gICAgbGV0IGRhdGUgPSBuZXcgRGF0ZVRpbWUobmV3IERhdGUocGFyc2VJbnQoZGF0ZVN0cikpKTtcclxuXHJcbiAgICBsZXQgc3RhcnRPZmZzZXRJbmRleDogbnVtYmVyID0gZGF0ZVN0ci5pbmRleE9mKFwiK1wiKTtcclxuICAgIGlmIChzdGFydE9mZnNldEluZGV4ID09IC0xKSBzdGFydE9mZnNldEluZGV4ID0gZGF0ZVN0ci5pbmRleE9mKFwiLVwiKTtcclxuXHJcbiAgICBsZXQgbG9jYWxPZmZzZXQ6IG51bWJlciA9IGRhdGUuZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xyXG4gICAgaWYgKHN0YXJ0T2Zmc2V0SW5kZXggIT0gLTEpIGxvY2FsT2Zmc2V0ID0gMDtcclxuICAgIGxldCBsb2NhbEhvdXJzT2Zmc2V0OiBudW1iZXIgPSBNYXRoLmZsb29yKGxvY2FsT2Zmc2V0IC8gNjApO1xyXG4gICAgbGV0IGxvY2FsTWludXRlc09mZnNldDogbnVtYmVyID0gbG9jYWxPZmZzZXQgJSA2MDtcclxuICAgIGxldCBsb2NhbEhvdXJzT2Zmc2V0U3RyaW5nOiBzdHJpbmcgPVxyXG4gICAgICAoTWF0aC5hYnMobG9jYWxIb3Vyc09mZnNldCkgPCAxMCA/IFwiMFwiIDogXCJcIikgKyBNYXRoLmFicyhsb2NhbEhvdXJzT2Zmc2V0KS50b1N0cmluZygpO1xyXG4gICAgbGV0IGxvY2FsTWludXRlc09mZnNldFN0cmluZzogc3RyaW5nID1cclxuICAgICAgKE1hdGguYWJzKGxvY2FsTWludXRlc09mZnNldCkgPCAxMCA/IFwiMFwiIDogXCJcIikgKyBNYXRoLmFicyhsb2NhbE1pbnV0ZXNPZmZzZXQpLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgbGV0IG9mZnNldDogc3RyaW5nID0gKGxvY2FsT2Zmc2V0ID49IDAgPyBcIitcIiA6IFwiLVwiKSArIGxvY2FsSG91cnNPZmZzZXRTdHJpbmcgKyBsb2NhbE1pbnV0ZXNPZmZzZXRTdHJpbmc7XHJcbiAgICBsZXQgbXVsdGlwbGUgPSAxO1xyXG5cclxuICAgIGlmIChzdGFydE9mZnNldEluZGV4ICE9IC0xKSBvZmZzZXQgPSBkYXRlU3RyLnN1YnN0cmluZyhzdGFydE9mZnNldEluZGV4KTtcclxuICAgIGlmIChvZmZzZXQuc3Vic3RyKDAsIDEpID09IFwiLVwiKSBtdWx0aXBsZSA9IC0xO1xyXG5cclxuICAgIGRhdGUuYWRkSG91cnMobG9jYWxIb3Vyc09mZnNldCArIHBhcnNlSW50KG9mZnNldC5zdWJzdHIoMSwgMikpICogbXVsdGlwbGUpO1xyXG4gICAgZGF0ZS5hZGRNaW51dGVzKGxvY2FsTWludXRlc09mZnNldCArIHBhcnNlSW50KG9mZnNldC5zdWJzdHIoMywgMikpICogbXVsdGlwbGUpO1xyXG5cclxuICAgIHJldHVybiBkYXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5hbWU6IHN0cmluZztcclxuICB2YWx1ZTogYW55O1xyXG4gIHByaXZhdGUgaXNQcm9wZXJ0eSA9IGZhbHNlO1xyXG4gIHByaXZhdGUgaXNBcnJheSA9IGZhbHNlO1xyXG5cclxuICBwcm9wZXJ0aWVzKCk6IExpc3Q8U3RpSnNvbj4ge1xyXG4gICAgaWYgKCF0aGlzLmlzUHJvcGVydHkpIHtcclxuICAgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBMaXN0KSByZXR1cm4gdGhpcy52YWx1ZTtcclxuICAgICAgZWxzZSByZXR1cm4gdGhpcy52YWx1ZS52YWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgTGlzdDxTdGlKc29uPigpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUHJvcGVydHkocHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmIChwcm9wZXJ0eU5hbWUgIT0gbnVsbCB8fCBwcm9wZXJ0eU5hbWUgIT0gXCJcIikge1xyXG4gICAgICBsZXQgZWxlbWVudHM6IFN0aUpzb25bXSA9IHRoaXMudmFsdWUudmFsdWUuZmlsdGVyKCh4KSA9PiB4Lm5hbWUgPT0gcHJvcGVydHlOYW1lKTtcclxuICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnZhbHVlLnZhbHVlLnJlbW92ZShlbGVtZW50c1swXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFByb3BlcnR5TnVtYmVyKHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB0aGlzLnZhbHVlID0gbmV3IFN0aUpzb24oXCJcIiwgbmV3IExpc3QoKSk7XHJcbiAgICB0aGlzLnJlbW92ZVByb3BlcnR5KHByb3BlcnR5TmFtZSk7XHJcblxyXG4gICAgdGhpcy52YWx1ZS52YWx1ZS5wdXNoKG5ldyBTdGlKc29uKHByb3BlcnR5TmFtZSwgdmFsdWUsIHRydWUpKTtcclxuICB9XHJcblxyXG4gIGFkZFByb3BlcnR5TnVtYmVyTm90TnVsbChwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IG51bWJlcikge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuYWRkUHJvcGVydHlOdW1iZXIocHJvcGVydHlOYW1lLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRQcm9wZXJ0eU51bWJlck5vRGVmYXVsdFZhbHVlKHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB0aGlzLnZhbHVlID0gbmV3IFN0aUpzb24oXCJcIiwgbmV3IExpc3QoKSk7XHJcbiAgICB0aGlzLnJlbW92ZVByb3BlcnR5KHByb3BlcnR5TmFtZSk7XHJcblxyXG4gICAgdGhpcy52YWx1ZS52YWx1ZS5wdXNoKG5ldyBTdGlKc29uKHByb3BlcnR5TmFtZSwgdmFsdWUsIHRydWUpKTtcclxuICB9XHJcblxyXG4gIGFkZFByb3BlcnR5Sk9iamVjdChwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IFN0aUpzb24pIHtcclxuICAgIGlmICh0aGlzLnZhbHVlID09IG51bGwpIHRoaXMudmFsdWUgPSBuZXcgU3RpSnNvbihcIlwiLCBuZXcgTGlzdCgpKTtcclxuICAgIHRoaXMucmVtb3ZlUHJvcGVydHkocHJvcGVydHlOYW1lKTtcclxuXHJcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5jb3VudCA9PSAwKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy52YWx1ZS52YWx1ZS5wdXNoKG5ldyBTdGlKc29uKHByb3BlcnR5TmFtZSwgdmFsdWUpKTtcclxuICB9XHJcblxyXG4gIGFkZFByb3BlcnR5QXJyYXkocHJvcGVydHlOYW1lOiBzdHJpbmcsIGVsZW1lbnRzOiBhbnlbXSkge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkgdGhpcy52YWx1ZSA9IG5ldyBTdGlKc29uKFwiXCIsIG5ldyBMaXN0KCkpO1xyXG4gICAgdGhpcy5yZW1vdmVQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xyXG5cclxuICAgIGlmIChlbGVtZW50cyA9PSBudWxsKSByZXR1cm47XHJcbiAgICBsZXQgdmFsdWVzID0gW107XHJcblxyXG4gICAgZWxlbWVudHMuZm9yRWFjaCgoZSkgPT5cclxuICAgICAgdmFsdWVzLnB1c2goXHJcbiAgICAgICAgZT8uc2F2ZVRvSnNvbk9iamVjdCAhPSBudWxsXHJcbiAgICAgICAgICA/IGUuc2F2ZVRvSnNvbk9iamVjdCh0aGlzLm9wdGlvbnMpXHJcbiAgICAgICAgICA6IHR5cGVvZiBlID09IFwic3RyaW5nXCJcclxuICAgICAgICAgID8gYFwiJHtlXHJcbiAgICAgICAgICAgICAgLnJlcGxhY2UoL1tcXFxcXS9nLCBcIlxcXFxcXFxcXCIpXHJcbiAgICAgICAgICAgICAgLnJlcGxhY2UoL1tcXFwiXS9nLCAnXFxcXFwiJylcclxuICAgICAgICAgICAgICAvLyAucmVwbGFjZSgvW1xcL10vZywgJ1xcXFwvJylcclxuICAgICAgICAgICAgICAucmVwbGFjZSgvW1xcYl0vZywgXCJcXFxcYlwiKVxyXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9bXFxmXS9nLCBcIlxcXFxmXCIpXHJcbiAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcclxcbi9nLCBcIlxcblwiKVxyXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9bXFxyXS9nLCBcIlxcblwiKVxyXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9bXFxyXFxuXS9nLCBcIlxcXFxyXFxcXG5cIilcclxuICAgICAgICAgICAgICAucmVwbGFjZSgvW1xcdF0vZywgXCJcXFxcdFwiKVxyXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XHJcbiAgICAgICAgICAgICAgLnJlcGxhY2UoL1tcXHUwMDAxLVxcdTAwMUZdL2csIChjaHIpID0+IFwiXFxcXHVcIiArIChcIjAwMDBcIiArIGNoci5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC00KSl9XCJgXHJcbiAgICAgICAgICA6IGVcclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQganNvbjogU3RpSnNvbiA9IG5ldyBTdGlKc29uKHByb3BlcnR5TmFtZSwgdmFsdWVzKTtcclxuICAgIGpzb24uaXNBcnJheSA9IHRydWU7XHJcbiAgICB0aGlzLnZhbHVlLnZhbHVlLnB1c2goanNvbik7XHJcbiAgfVxyXG5cclxuICBhZGRQcm9wZXJ0eUlkZW50KHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB0aGlzLnZhbHVlID0gbmV3IFN0aUpzb24oXCJcIiwgbmV3IExpc3QoKSk7XHJcbiAgICB0aGlzLnZhbHVlLnZhbHVlLnB1c2gobmV3IFN0aUpzb24ocHJvcGVydHlOYW1lLCB2YWx1ZSwgdHJ1ZSkpO1xyXG4gIH1cclxuXHJcbiAgYWRkUHJvcGVydHlCb29sKHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkgdGhpcy52YWx1ZSA9IG5ldyBTdGlKc29uKFwiXCIsIG5ldyBMaXN0KCkpO1xyXG4gICAgdGhpcy5yZW1vdmVQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xyXG5cclxuICAgIHRoaXMudmFsdWUudmFsdWUucHVzaChuZXcgU3RpSnNvbihwcm9wZXJ0eU5hbWUsIHZhbHVlLCB0cnVlKSk7XHJcbiAgfVxyXG5cclxuICAvKmFkZFByb3BlcnR5RGF0ZVRpbWUocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBEYXRlVGltZSkge1xyXG4gICAgICBpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB0aGlzLnZhbHVlID0gbmV3IFN0aUpzb24oXCJcIiwgbmV3IExpc3QoKSk7XHJcbiAgICAgIHRoaXMucmVtb3ZlUHJvcGVydHkocHJvcGVydHlOYW1lKTtcclxuXHJcbiAgICAgIHRoaXMudmFsdWUudmFsdWUucHVzaChuZXcgU3RpSnNvbihwcm9wZXJ0eU5hbWUsIFN0aUpzb24uZGF0ZVRvSnNvbkRhdGUodmFsdWUpLCB0cnVlKSk7XHJcbiAgfSovXHJcblxyXG4gIGFkZFByb3BlcnR5RW51bShwcm9wZXJ0eU5hbWU6IHN0cmluZywgZW51bVR5cGU6IGFueSwgdmFsdWU6IGFueSwgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsKSB7XHJcbiAgICBpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB0aGlzLnZhbHVlID0gbmV3IFN0aUpzb24oXCJcIiwgbmV3IExpc3QoKSk7XHJcbiAgICB0aGlzLnJlbW92ZVByb3BlcnR5KHByb3BlcnR5TmFtZSk7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBkZWZhdWx0VmFsdWUgIT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSA9PSBkZWZhdWx0VmFsdWUpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnZhbHVlLnZhbHVlLnB1c2gobmV3IFN0aUpzb24ocHJvcGVydHlOYW1lLCBFbnVtLmdldE5hbWUoZW51bVR5cGUsIHZhbHVlKSwgdHJ1ZSkpO1xyXG4gIH1cclxuXHJcbiAgYWRkUHJvcGVydHlDb2xvcihwcm9wZXJ0eU5hbWU6IHN0cmluZywgY29sb3I6IENvbG9yLCBkZWZDb2xvcjogQ29sb3IgPSBudWxsKSB7XHJcbiAgICBpZiAoY29sb3IgPT0gbnVsbCB8fCBjb2xvci5lcXVhbHMoZGVmQ29sb3IpKSByZXR1cm47XHJcblxyXG4gICAgbGV0IHZhbHVlID0gY29sb3IuaXNOYW1lZENvbG9yID8gY29sb3IubmFtZS5yZXBsYWNlKFwiIFwiLCBcIlwiKSA6IGAke2NvbG9yLmF9LCR7Y29sb3Iucn0sJHtjb2xvci5nfSwke2NvbG9yLmJ9YDtcclxuXHJcbiAgICB0aGlzLmFkZFByb3BlcnR5U3RyaW5nKHByb3BlcnR5TmFtZSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgYWRkUHJvcGVydHlTdHJpbmcocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkgdGhpcy52YWx1ZSA9IG5ldyBTdGlKc29uKFwiXCIsIG5ldyBMaXN0KCkpO1xyXG4gICAgdGhpcy5yZW1vdmVQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xyXG5cclxuICAgIGlmICh2YWx1ZSA9PSBkZWZhdWx0VmFsdWUpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnZhbHVlLnZhbHVlLnB1c2gobmV3IFN0aUpzb24ocHJvcGVydHlOYW1lLCB2YWx1ZSwgdHJ1ZSkpO1xyXG4gIH1cclxuXHJcbiAgYWRkUHJvcGVydHlTdHJpbmdOdWxsT3JFbXB0eShwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkgdGhpcy52YWx1ZSA9IG5ldyBTdGlKc29uKFwiXCIsIG5ldyBMaXN0KCkpO1xyXG4gICAgdGhpcy5yZW1vdmVQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xyXG5cclxuICAgIGlmIChTdGlTdHJpbmcuaXNOdWxsT3JFbXB0eSh2YWx1ZSkpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnZhbHVlLnZhbHVlLnB1c2gobmV3IFN0aUpzb24ocHJvcGVydHlOYW1lLCB2YWx1ZSwgdHJ1ZSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvdW50KCk6IG51bWJlciB7XHJcbiAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgaWYgKCF0aGlzLmlzUHJvcGVydHkgJiYgdGhpcy52YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgICAgZm9yIChsZXQgcHJvcGVydHlOYW1lIG9mIHRoaXMudmFsdWUudmFsdWUpIHtcclxuICAgICAgICBjb3VudCsrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvdW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0QXJyYXkoKTogYW55W10ge1xyXG4gICAgbGV0IHJlc3VsdCA9IFtdO1xyXG4gICAgdGhpcy52YWx1ZS5mb3JFYWNoKChlKSA9PiByZXN1bHQucHVzaChlLnZhbHVlKSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgc2VyaWFsaXplKGluZGVudCA9IDApOiBzdHJpbmcge1xyXG4gICAgbGV0IGpzb25TdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IHRhYnMgPSBTdGlKc29uLnByZXR0eVByaW50ID8gQXJyYXkoaW5kZW50ICsgMSkuam9pbihcIiBcIikgOiBcIlwiO1xyXG4gICAgZm9yIChsZXQgcHJvcGVydHkgb2YgdGhpcy52YWx1ZS5wcm9wZXJ0aWVzKCkpIHtcclxuICAgICAgbGV0IHZhbHVlU3RyaW5nID0gXCJcIjtcclxuICAgICAgaWYgKHByb3BlcnR5LmlzUHJvcGVydHkpIHtcclxuICAgICAgICBpZiAocHJvcGVydHkudmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcGVydHkudmFsdWUgPT0gXCJzdHJpbmdcIilcclxuICAgICAgICAgIHZhbHVlU3RyaW5nID1cclxuICAgICAgICAgICAgJ1wiJyArXHJcbiAgICAgICAgICAgICg8c3RyaW5nPnByb3BlcnR5LnZhbHVlKVxyXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9bXFxcXF0vZywgXCJcXFxcXFxcXFwiKVxyXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9bXFxcIl0vZywgJ1xcXFxcIicpXHJcbiAgICAgICAgICAgICAgLy8gLnJlcGxhY2UoL1tcXC9dL2csICdcXFxcLycpXHJcbiAgICAgICAgICAgICAgLnJlcGxhY2UoL1tcXGJdL2csIFwiXFxcXGJcIilcclxuICAgICAgICAgICAgICAucmVwbGFjZSgvW1xcZl0vZywgXCJcXFxcZlwiKVxyXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9cXHJcXG4vZywgXCJcXG5cIilcclxuICAgICAgICAgICAgICAucmVwbGFjZSgvW1xccl0vZywgXCJcXG5cIilcclxuICAgICAgICAgICAgICAucmVwbGFjZSgvW1xcclxcbl0vZywgXCJcXFxcclxcXFxuXCIpXHJcbiAgICAgICAgICAgICAgLnJlcGxhY2UoL1tcXHRdL2csIFwiXFxcXHRcIilcclxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxyXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9bXFx1MDAwMS1cXHUwMDFGXS9nLCAoY2hyKSA9PiBcIlxcXFx1XCIgKyAoXCIwMDAwXCIgKyBjaHIuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnN1YnN0cigtNCkpICtcclxuICAgICAgICAgICAgJ1wiJztcclxuICAgICAgICAvLyBcIlxcXCJcIiArIHByb3BlcnR5LnZhbHVlLnJlcGxhY2UoL1xcXCIvZ2ksIFwiXFxcXFxcXCJcIikucmVwbGFjZSgvXFxyXFxuL2dpLCBcIlxcblwiKS5yZXBsYWNlKC9cXHIvZ2ksIFwiXFxuXCIpLnJlcGxhY2UoL1xcbi9naSwgXCJcXFxcclxcXFxuXCIpLnJlcGxhY2UoL1xcXFwvZ2ksIFwiXFxcXFxcXFxcIikgKyBcIlxcXCJcIjtcclxuICAgICAgICBlbHNlIHZhbHVlU3RyaW5nID0gcHJvcGVydHkudmFsdWU7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuaXNBcnJheSkge1xyXG4gICAgICAgIGlmIChwcm9wZXJ0eS52YWx1ZS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgdmFsdWVTdHJpbmcgKz0gXCJbXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGVsZW1lbnQgb2YgcHJvcGVydHkudmFsdWUpIHtcclxuICAgICAgICAgIGlmICh2YWx1ZVN0cmluZykgdmFsdWVTdHJpbmcgKz0gXCIsXCI7XHJcbiAgICAgICAgICBlbHNlIHZhbHVlU3RyaW5nICs9IFwiW1wiO1xyXG4gICAgICAgICAgdmFsdWVTdHJpbmcgKz0gZWxlbWVudD8uc2VyaWFsaXplICE9IG51bGwgPyBlbGVtZW50LnNlcmlhbGl6ZShpbmRlbnQgKyA0KSA6IGVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhbHVlU3RyaW5nICs9IFwiXVwiO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhbHVlU3RyaW5nID0gcHJvcGVydHkudmFsdWUuc2VyaWFsaXplKGluZGVudCArIDIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoanNvblN0cmluZykganNvblN0cmluZyArPSBcIixcIjtcclxuICAgICAgaWYgKFN0aUpzb24ucHJldHR5UHJpbnQpIGpzb25TdHJpbmcgKz0gXCJcXG5cIiArIHRhYnMgKyBcIiAgXCI7XHJcbiAgICAgIGpzb25TdHJpbmcgKz0gJ1wiJyArIDxzdHJpbmc+cHJvcGVydHkubmFtZSArICdcIjonO1xyXG4gICAgICBpZiAoU3RpSnNvbi5wcmV0dHlQcmludCkganNvblN0cmluZyArPSBcIiBcIjtcclxuICAgICAganNvblN0cmluZyArPSB2YWx1ZVN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWpzb25TdHJpbmcpIHJldHVybiBcIlwiO1xyXG4gICAgaWYgKFN0aUpzb24ucHJldHR5UHJpbnQpIHJldHVybiBcIntcIiArIGpzb25TdHJpbmcgKyBcIlxcblwiICsgdGFicyArIFwifVwiO1xyXG4gICAgcmV0dXJuIFwie1wiICsganNvblN0cmluZyArIFwifVwiO1xyXG4gIH1cclxuXHJcbiAgZGVzZXJpYWxpemUodGV4dDogYW55KSB7XHJcbiAgICBpZiAodHlwZW9mIHRleHQgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICBsZXQgcG9zID0gMDtcclxuICAgICAgbGV0IHN0YXJ0ID0gLTE7XHJcbiAgICAgIHdoaWxlIChwb3MgPCB0ZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRleHRbcG9zXSA9PSAnXCInICYmXHJcbiAgICAgICAgICAocG9zID4gMCAmJiB0ZXh0W3BvcyAtIDFdICE9IFwiXFxcXFwiXHJcbiAgICAgICAgICAgID8gdHJ1ZVxyXG4gICAgICAgICAgICA6IHBvcyA+IDEgJiYgdGV4dFtwb3MgLSAyXSA9PSBcIlxcXFxcIiAmJiBwb3MgPiAyICYmIHRleHRbcG9zIC0gM10gIT0gXCJcXFxcXCIpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBpZiAoc3RhcnQgPiAtMSkge1xyXG4gICAgICAgICAgICBsZXQgc3ViVGV4dDogc3RyaW5nID0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7XHJcbiAgICAgICAgICAgIGxldCBtb2RUZXh0OiBzdHJpbmcgPSBzdWJUZXh0XHJcbiAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcXFxcL2dpLCBcIiMhISNcIilcclxuICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXHQvZ2ksIFwiIyF0I1wiKVxyXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXFxcIi9naSwgXCIjIXEjXCIpXHJcbiAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxyXFxcXG4vZ2ksIFwiIyFybiNcIilcclxuICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXHIvZ2ksIFwiIyFybiNcIilcclxuICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXG4vZ2ksIFwiIyFybiNcIik7XHJcbiAgICAgICAgICAgIGlmIChtb2RUZXh0Lmxlbmd0aCAhPSBzdWJUZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtcGx1cy1vcGVyYW5kc1xyXG4gICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBzdGFydCkgKyBtb2RUZXh0ICsgdGV4dC5zdWJzdHJpbmcocG9zKTtcclxuICAgICAgICAgICAgICBwb3MgKz0gbW9kVGV4dC5sZW5ndGggLSBzdWJUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdGFydCA9IC0xO1xyXG4gICAgICAgICAgfSBlbHNlIHN0YXJ0ID0gcG9zICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcG9zKys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCByZXBvcnRPYmplY3QgPSB0eXBlb2YgdGV4dCA9PSBcIm9iamVjdFwiID8gdGV4dCA6IEpTT04ucGFyc2UodGV4dCk7XHJcbiAgICB0aGlzLmRlc2VyaWFsaXplRnJvbU9iamVjdChyZXBvcnRPYmplY3QpO1xyXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUudmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlc2VyaWFsaXplRnJvbU9iamVjdChjaGlsZDogYW55KSB7XHJcbiAgICBmb3IgKGxldCBwcm9wZXJ0eU5hbWUgaW4gY2hpbGQpIHtcclxuICAgICAgaWYgKHR5cGVvZiBjaGlsZFtwcm9wZXJ0eU5hbWVdID09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICBsZXQgak9iamVjdDogU3RpSnNvbiA9IG5ldyBTdGlKc29uKHByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkgdGhpcy52YWx1ZSA9IG5ldyBTdGlKc29uKG51bGwsIG5ldyBMaXN0KCkpO1xyXG4gICAgICAgIHRoaXMudmFsdWUudmFsdWUucHVzaChqT2JqZWN0KTtcclxuICAgICAgICBqT2JqZWN0LmRlc2VyaWFsaXplRnJvbU9iamVjdChjaGlsZFtwcm9wZXJ0eU5hbWVdKTtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY2hpbGRbcHJvcGVydHlOYW1lXSAhPSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICBsZXQgak9iamVjdDogU3RpSnNvbiA9IG5ldyBTdGlKc29uKHByb3BlcnR5TmFtZSwgY2hpbGRbcHJvcGVydHlOYW1lXSwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkgdGhpcy52YWx1ZSA9IG5ldyBTdGlKc29uKG51bGwsIG5ldyBMaXN0KCkpO1xyXG4gICAgICAgIHRoaXMudmFsdWUudmFsdWUucHVzaChqT2JqZWN0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGNoaWxkICYmIEFycmF5LmlzQXJyYXkoY2hpbGQpICYmIGNoaWxkLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSBuZXcgU3RpSnNvbihudWxsLCBuZXcgTGlzdCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nID0gbnVsbCwgdmFsdWU6IGFueSA9IG51bGwsIGlzUHJvcGVydHkgPSBmYWxzZSwgb3B0aW9uczogYW55ID0ge30pIHtcclxuICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIilcclxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC8jIXJuIy9naSwgXCJcXHJcXG5cIikucmVwbGFjZSgvIyFxIy9naSwgJ1wiJykucmVwbGFjZSgvIyF0Iy9naSwgXCJcXHRcIikucmVwbGFjZSgvIyEhIy9naSwgXCJcXFxcXCIpO1xyXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5pc1Byb3BlcnR5ID0gaXNQcm9wZXJ0eTtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgfVxyXG59XHJcbiJdfQ==