@magic-xpa/utils
Version:
magic utils package
456 lines (455 loc) • 59.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Encoding, StringBuilder } from "@magic-xpa/mscorelib";
export class UtilStrByteMode {
/**
* @return {?}
*/
static isLocaleDefLangDBCS() {
return UtilStrByteMode._bLocaleDefLangJPN || UtilStrByteMode._bLocaleDefLangCHN || UtilStrByteMode._bLocaleDefLangKOR;
}
/**
* @return {?}
*/
static isLocaleDefLangJPN() {
return UtilStrByteMode._bLocaleDefLangJPN;
}
/**
* @return {?}
*/
static isLocaleDefLangKOR() {
return UtilStrByteMode._bLocaleDefLangKOR;
}
/**
* @param {?} c
* @return {?}
*/
static isKoreanCharacter(c) {
return (44032 <= /*'가'*/ c && c <= 55203 /*'힣'*/) || (4352 <= /*'ᄀ'*/ c && c <= 4607 /*'ᇿ'*/) || (12592 <= /*''*/ c && c <= 12687 /*''*/) || (43360 <= /*'ꥠ'*/ c && c <= 43391 /*''*/) || (55216 <= /*'ힰ'*/ c && c <= 55295 /*''*/);
}
/**
* @param {?} strVal
* @return {?}
*/
static lenB(strVal) {
// convert to byte[] by default-encoding
return UtilStrByteMode.Encoding.GetByteCount(strVal);
}
/**
* @param {?} strVal
* @param {?} ofs
* @param {?} len
* @return {?}
*/
static midB(strVal, ofs, len) {
/** @type {?} */
let intValidMaxIndex = -1;
/** @type {?} */
let intValidMinIndex = -1;
/** @type {?} */
let bHeadSpace = false;
/** @type {?} */
let bEndSpace = false;
/** @type {?} */
let strRet;
// check and modify ofs & len
if (len <= 0)
return "";
if (ofs <= 0) {
ofs = 0;
intValidMinIndex = 0;
bHeadSpace = false;
}
/** @type {?} */
let intByteLength = UtilStrByteMode.lenB(strVal);
if (intByteLength < ofs)
return "";
/** @type {?} */
let LenMax = intByteLength - ofs;
if (LenMax < len)
len = LenMax;
// set MinIndex and MaxIndex for substring
intByteLength = 0;
for (let intIndex = 0; intIndex < strVal.length; intIndex = intIndex + 1) {
/** @type {?} */
let s = strVal.substr(intIndex, 1);
intByteLength = intByteLength + UtilStrByteMode.Encoding.GetByteCount(s);
if (intValidMinIndex === -1) {
if (intByteLength === ofs) {
intValidMinIndex = intIndex + 1;
bHeadSpace = false;
}
else if (intByteLength > ofs) {
intValidMinIndex = intIndex + 1;
bHeadSpace = true;
}
}
if (intValidMaxIndex === -1) {
if (intByteLength === ofs + len) {
intValidMaxIndex = intIndex;
bEndSpace = false;
break;
}
else if (intByteLength > ofs + len) {
intValidMaxIndex = intIndex - 1;
bEndSpace = true;
break;
}
}
}
/** @type {?} */
let strbufAddingBuf = new StringBuilder(len);
// execute Mid
if (bHeadSpace) {
strbufAddingBuf.Append(' ');
}
if (intValidMinIndex <= intValidMaxIndex) {
strbufAddingBuf.Append(strVal.substr(intValidMinIndex, intValidMaxIndex + 1 - intValidMinIndex));
}
if (bEndSpace) {
strbufAddingBuf.Append(' ');
}
strRet = strbufAddingBuf.ToString();
strbufAddingBuf = null;
return strRet;
}
/**
* @param {?} strVal
* @param {?} len
* @return {?}
*/
static leftB(strVal, len) {
return UtilStrByteMode.midB(strVal, 0, len);
}
/**
* @param {?} strVal
* @param {?} len
* @return {?}
*/
static rightB(strVal, len) {
/** @type {?} */
let byteFldsValLen = UtilStrByteMode.lenB(strVal);
if (len < 0) {
len = 0;
}
/** @type {?} */
let ofs = byteFldsValLen - len;
if (ofs < 0) {
ofs = 0;
}
return UtilStrByteMode.midB(strVal, ofs, len);
}
/**
* @param {?} strTarget
* @param {?} strSource
* @param {?} ofs
* @param {?} len
* @return {?}
*/
static insB(strTarget, strSource, ofs, len) {
if (ofs < 0) {
ofs = 0;
}
else {
if (ofs >= 1) {
ofs = ofs - 1;
}
}
if (len < 0) {
len = 0;
}
/** @type {?} */
let intTargetLenB = UtilStrByteMode.lenB(strTarget);
/** @type {?} */
let intSourceLenB = UtilStrByteMode.lenB(strSource);
/** @type {?} */
let strbufRetVal = new StringBuilder(ofs + len);
strbufRetVal.Append(UtilStrByteMode.leftB(strTarget, ofs));
for (let intAddSpaceLen = ofs - intTargetLenB; intAddSpaceLen > 0; intAddSpaceLen = intAddSpaceLen - 1) {
strbufRetVal.Append(' ');
}
strbufRetVal.Append(UtilStrByteMode.leftB(strSource, len));
for (let i = len - intSourceLenB; i > 0; i = i - 1) {
strbufRetVal.Append(' ');
}
strbufRetVal.Append(UtilStrByteMode.rightB(strTarget, intTargetLenB - ofs));
return strbufRetVal.ToString();
}
/**
* @param {?} strVal
* @param {?} ofs
* @param {?} len
* @return {?}
*/
static delB(strVal, ofs, len) {
if (ofs < 0) {
ofs = 0;
}
else {
if (ofs >= 1) {
ofs = ofs - 1;
}
}
/** @type {?} */
let intValLenB = UtilStrByteMode.lenB(strVal);
if (ofs + len > intValLenB) {
len = intValLenB - ofs;
}
/** @type {?} */
let strRet;
if (len <= 0) {
strRet = strVal;
}
else {
/** @type {?} */
let intRightSideLenB = intValLenB - ofs - len;
if (intRightSideLenB < 0) {
strRet = strVal;
}
else {
/** @type {?} */
let strbufRetVal = new StringBuilder(ofs + intRightSideLenB);
strbufRetVal.Append(UtilStrByteMode.leftB(strVal, ofs));
strbufRetVal.Append(UtilStrByteMode.rightB(strVal, intRightSideLenB));
strRet = strbufRetVal.ToString();
}
}
return strRet;
}
/**
* @param {?} strTarget
* @param {?} strSearch
* @return {?}
*/
static instrB(strTarget, strSearch) {
if (strSearch.length === 0) {
// nothing to look for
return 0;
}
/** @type {?} */
let ofs = strTarget.indexOf(strSearch);
if (ofs < 0) {
// not found
return 0;
}
return UtilStrByteMode.lenB(strTarget.substr(0, ofs)) + 1;
}
/**
* @param {?} strTarget
* @param {?} strOrigin
* @param {?} ofs
* @param {?} len
* @return {?}
*/
static repB(strTarget, strOrigin, ofs, len) {
/** @type {?} */
let strbufAddingBuf = new StringBuilder();
if (ofs < 0) {
ofs = 0;
}
else {
if (ofs >= 1) {
ofs = ofs - 1;
}
}
if (len < 0) {
len = 0;
}
strbufAddingBuf.Append(UtilStrByteMode.leftB(strTarget, ofs));
/** @type {?} */
let intAddSpaceLen = ofs - UtilStrByteMode.lenB(strTarget);
for (; intAddSpaceLen > 0; intAddSpaceLen--)
strbufAddingBuf.Append(' ');
strbufAddingBuf.Append(UtilStrByteMode.leftB(strOrigin, len));
/** @type {?} */
let intRightLen = UtilStrByteMode.lenB(strTarget) - (ofs + len);
if (intRightLen > 0) {
strbufAddingBuf.Append(UtilStrByteMode.rightB(strTarget, intRightLen));
}
// add blanks to the end
intAddSpaceLen = len - UtilStrByteMode.lenB(strOrigin);
for (; intAddSpaceLen > 0; intAddSpaceLen--) {
strbufAddingBuf.Append(' ');
}
return strbufAddingBuf.ToString();
}
/**
* @param {?} strTarget
* @param {?} strOrigin
* @param {?} ofs
* @param {?} len
* @return {?}
*/
static repC(strTarget, strOrigin, ofs, len) {
/** @type {?} */
let strbufAddingBuf = new StringBuilder();
if (ofs < 0) {
ofs = 0;
}
else {
if (ofs >= 1) {
ofs = ofs - 1;
}
}
if (len < 0) {
len = 0;
}
strbufAddingBuf.Append(strTarget.substr(0, ofs));
/** @type {?} */
let intAddSpaceLen = ofs - strTarget.length;
for (; intAddSpaceLen > 0; intAddSpaceLen--)
strbufAddingBuf.Append(' ');
strbufAddingBuf.Append(strOrigin.substr(0, len));
/** @type {?} */
let intRightLen = strTarget.length - (ofs + len);
if (intRightLen > 0) {
strbufAddingBuf.Append(strTarget.substr(ofs + len));
}
for (let i = len - strOrigin.length; i > 0; i = i - 1) {
strbufAddingBuf.Append(' ');
}
return strbufAddingBuf.ToString();
}
/**
* @param {?} str
* @return {?}
*/
static isHalfWidth(str) {
/** @type {?} */
let letter = str.charCodeAt(0);
if (32 <= /*' '*/ letter && letter <= 126 /*'~'*/) {
return true;
}
else {
/** @type {?} */
let len = UtilStrByteMode.lenB(str);
if (len === 1)
return true;
}
return false;
}
/**
* @param {?} letter
* @return {?}
*/
static isDigit(letter) {
return 48 <= /*'0'*/ /*'0'*/ letter.charCodeAt(0) && letter.charCodeAt(0) <= 57 /*'9'*/;
}
/**
* @param {?} letter
* @return {?}
*/
static asNumeric(letter) {
/** @type {?} */
let result;
switch (letter.charCodeAt(0)) {
case 42: /*'*'*/
case 43: /*'+'*/
case 44: /*','*/
case 45: /*'-'*/
case 46: /*'.'*/
case 47:
/*'/'*/
result = true;
break;
default:
result = false;
break;
}
return result;
}
/**
* @param {?} strSource
* @param {?} strDest
* @param {?} pos
* @param {?} isAdvance
* @return {?}
*/
static convPos(strSource, strDest, pos, isAdvance) {
/** @type {?} */
let retPos;
if (pos < 0)
return 0;
if (pos > strSource.length)
pos = strSource.length;
/** @type {?} */
let diffLen = UtilStrByteMode.lenB(strSource) - UtilStrByteMode.lenB(strDest);
if (diffLen > 0) {
/** @type {?} */
let stringBuilder = new StringBuilder(strDest);
for (; diffLen > 0; diffLen--)
stringBuilder.Append(' ');
strDest = stringBuilder.ToString();
}
/** @type {?} */
let byteSource = UtilStrByteMode.Encoding.GetBytes(strSource.substr(0, pos));
/** @type {?} */
let strLeftB = UtilStrByteMode.leftB(strDest, byteSource.length);
retPos = strLeftB.length;
if (!isAdvance && retPos > 0 && strLeftB.charCodeAt(retPos - 1) === 32 /*' '*/ && strDest.charCodeAt(retPos - 1) !== 32 /*' '*/) {
retPos = retPos - 1;
}
return retPos;
}
/**
* @param {?} str
* @param {?} picture
* @return {?}
*/
static getMinLenPicture(str, picture) {
/** @type {?} */
let len = 0;
if (UtilStrByteMode.lenB(picture) - UtilStrByteMode.lenB(str) > 0) {
len = UtilStrByteMode.convPos(str, picture, str.length, false);
}
else
len = picture.length;
return len;
}
/**
* @param {?} str1
* @param {?} str2
* @return {?}
*/
static strcmp(str1, str2) {
/** @type {?} */
let array1 = UtilStrByteMode.Encoding.GetBytes(str1);
/** @type {?} */
let array2 = UtilStrByteMode.Encoding.GetBytes(str2);
for (let i = 0; i < array1.length && i < array2.length; i++) {
if (array1[i] > array2[i]) {
return 1;
}
else if (array1[i] < array2[i]) {
return -1;
}
}
if (array1.length > array2.length)
return 1;
if (array1.length < array2.length)
return -1;
else
return 0;
}
}
UtilStrByteMode.Encoding = Encoding.UTF8;
// TODO : need to check what to do with CultureInfo
UtilStrByteMode.twoLetterISOLanguageName = " ";
UtilStrByteMode._bLocaleDefLangJPN = (UtilStrByteMode.twoLetterISOLanguageName === "ja");
UtilStrByteMode._bLocaleDefLangCHN = (UtilStrByteMode.twoLetterISOLanguageName === "zh");
UtilStrByteMode._bLocaleDefLangKOR = (UtilStrByteMode.twoLetterISOLanguageName === "ko");
if (false) {
/** @type {?} */
UtilStrByteMode.Encoding;
/** @type {?} */
UtilStrByteMode.twoLetterISOLanguageName;
/** @type {?} */
UtilStrByteMode._bLocaleDefLangJPN;
/** @type {?} */
UtilStrByteMode._bLocaleDefLangCHN;
/** @type {?} */
UtilStrByteMode._bLocaleDefLangKOR;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbFN0ckJ5dGVNb2RlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG1hZ2ljLXhwYS91dGlscy8iLCJzb3VyY2VzIjpbInNyYy9VdGlsU3RyQnl0ZU1vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQU1BLE9BQU8sRUFBVSxRQUFRLEVBQUUsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFdEUsTUFBTTs7OztJQWVKLE1BQU0sQ0FBQyxtQkFBbUI7UUFDeEIsTUFBTSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsSUFBSSxlQUFlLENBQUMsa0JBQWtCLElBQUksZUFBZSxDQUFDLGtCQUFrQixDQUFDO0tBQ3ZIOzs7O0lBUUQsTUFBTSxDQUFDLGtCQUFrQjtRQUN2QixNQUFNLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDO0tBQzNDOzs7O0lBUUQsTUFBTSxDQUFDLGtCQUFrQjtRQUN2QixNQUFNLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDO0tBQzNDOzs7OztJQUVELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFTO1FBQ2hDLE1BQU0sQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUEsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVEsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUEsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUEsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUEsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVEsQ0FBQztLQUMvTjs7Ozs7SUFjRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQWM7O1FBRXhCLE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFN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QUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQixNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQ1Y7WUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNYO1NBQ0Y7UUFFSCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDaEMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUVYLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNoQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWixJQUFJO1lBQ0YsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUNaOzsyQkFubkJrQyxRQUFRLENBQUMsSUFBSTs7MkNBRU4sR0FBRztxQ0FDQSxDQUFDLGVBQWUsQ0FBQyx3QkFBd0IsS0FBSyxJQUFJLENBQUM7cUNBQ25ELENBQUMsZUFBZSxDQUFDLHdCQUF3QixLQUFLLElBQUksQ0FBQztxQ0FDbkQsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLEtBQUssSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxzdW1tYXJ5PkpQTjogREJDUyBzdXBwb3J0XHJcbi8vLyBVdGlsaXR5IENsYXNzIGZvciBTdHJpbmdcclxuLy8vIEluIHRoaXMgY2xhc3MsIGNvbnNpZGVyaW5nIERCQ1MsIHN0cmluZ3MgYXJlIGNvdW50ZWQgYnkgdGhlIG51bWJlclxyXG4vLy8gb2YgYnl0ZXMsIG5vdCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8YXV0aG9yPiAgVG9zaGlybyBOYWtheW9zaGkgKE1TSikgPC9hdXRob3I+XHJcbmltcG9ydCB7TlN0cmluZywgRW5jb2RpbmcsIFN0cmluZ0J1aWxkZXJ9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFV0aWxTdHJCeXRlTW9kZSAge1xyXG4gIHB1YmxpYyBzdGF0aWMgRW5jb2Rpbmc6IEVuY29kaW5nID0gRW5jb2RpbmcuVVRGODtcclxuICAgIC8vIFRPRE8gOiBuZWVkIHRvIGNoZWNrIHdoYXQgdG8gZG8gd2l0aCBDdWx0dXJlSW5mb1xyXG4gIHN0YXRpYyB0d29MZXR0ZXJJU09MYW5ndWFnZU5hbWU6IHN0cmluZyA9IFwiIFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIF9iTG9jYWxlRGVmTGFuZ0pQTjogYm9vbGVhbiA9IChVdGlsU3RyQnl0ZU1vZGUudHdvTGV0dGVySVNPTGFuZ3VhZ2VOYW1lID09PSBcImphXCIpO1xyXG4gIHByaXZhdGUgc3RhdGljIF9iTG9jYWxlRGVmTGFuZ0NITjogYm9vbGVhbiA9IChVdGlsU3RyQnl0ZU1vZGUudHdvTGV0dGVySVNPTGFuZ3VhZ2VOYW1lID09PSBcInpoXCIpO1xyXG4gIHByaXZhdGUgc3RhdGljIF9iTG9jYWxlRGVmTGFuZ0tPUjogYm9vbGVhbiA9IChVdGlsU3RyQnl0ZU1vZGUudHdvTGV0dGVySVNPTGFuZ3VhZ2VOYW1lID09PSBcImtvXCIpO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IENoZWNrcyB0aGUgZW52aXJvbm1lbnQgd2hldGhlciBpdCBpcyBydW5uaW5nIG9uIERCQ1MgZW52aXJvbm1lbnRcclxuICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgY3VycmVudCBkZWZhdWx0IExvY2FsZSBpc1xyXG4gIC8vLyBEQkNTIGxhbmd1YWdlIChpbiBub24tVW5pY29kZSBlbmNvZGluZykuXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgREJDUywgb3IgZmFsc2UgaWYgU0JDU1xyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGlzTG9jYWxlRGVmTGFuZ0RCQ1MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gVXRpbFN0ckJ5dGVNb2RlLl9iTG9jYWxlRGVmTGFuZ0pQTiB8fCBVdGlsU3RyQnl0ZU1vZGUuX2JMb2NhbGVEZWZMYW5nQ0hOIHx8IFV0aWxTdHJCeXRlTW9kZS5fYkxvY2FsZURlZkxhbmdLT1I7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENoZWNrcyB3aGV0aGVyIHRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgY3VycmVudCBkZWZhdWx0IExvY2FsZVxyXG4gIC8vLyBpcyBKQVBBTkVTRS5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBKQVBBTkVTRSwgb3IgZmFsc2UgaWYgbm90XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgaXNMb2NhbGVEZWZMYW5nSlBOKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIFV0aWxTdHJCeXRlTW9kZS5fYkxvY2FsZURlZkxhbmdKUE47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENoZWNrcyB3aGV0aGVyIHRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgY3VycmVudCBkZWZhdWx0IExvY2FsZVxyXG4gIC8vLyBpcyBLT1JFQU4uXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgS09SRUFOLCBvciBmYWxzZSBpZiBub3RcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBpc0xvY2FsZURlZkxhbmdLT1IoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gVXRpbFN0ckJ5dGVNb2RlLl9iTG9jYWxlRGVmTGFuZ0tPUjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc0tvcmVhbkNoYXJhY3RlcihjOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoNDQwMzIgPD0gLyon6rCAJyovYyAmJiBjIDw9IDU1MjAzLyon7Z6jJyovKSB8fCAoNDM1MiA8PSAvKifhhIAnKi9jICYmIGMgPD0gNDYwNy8qJ+GHvycqLykgfHwgKDEyNTkyIDw9IC8qJ+OEsCcqL2MgJiYgYyA8PSAxMjY4Ny8qJ+OGjycqLykgfHwgKDQzMzYwIDw9IC8qJ+qloCcqL2MgJiYgYyA8PSA0MzM5MS8qJ+qlvycqLykgfHwgKDU1MjE2IDw9IC8qJ+2esCcqL2MgJiYgYyA8PSA1NTI5NS8qJ+2fvycqLyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IExlbmd0aCBvZiBTdHJpbmdcclxuICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIChpbiBkZWZhdWx0IGVuY29kaW5nKS5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clZhbDpcIj5zdHJpbmcgKGluIFVuaWNvZGUpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbnVtYmVyIG9mIGJ5dGVzIChpbiBkZWZhdWx0IGVuY29kaW5nKVxyXG4gIC8vL1xyXG4gIC8vLyBFeGFtcGxlOiBsZW5CKFwiYWJYWWNcIilcclxuICAvLy8gV2hlcmUgJ2EnLCAnYicgYW5kICAnYycgYXJlIFNCQ1MsIGFuZCAnWCcgYW5kICdZJyBhcmUgREJDUywgaXQgcmV0dXJuc1xyXG4gIC8vLyA3LlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGxlbkIoc3RyVmFsOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgLy8gY29udmVydCB0byBieXRlW10gYnkgZGVmYXVsdC1lbmNvZGluZ1xyXG4gICAgcmV0dXJuIFV0aWxTdHJCeXRlTW9kZS5FbmNvZGluZy5HZXRCeXRlQ291bnQoc3RyVmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gU3Vic3RyaW5nIG9mIFN0cmluZ1xyXG4gIC8vLyBFeHRyYWN0cyBhIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycyAoYSBzdWJzdHJpbmcpIGZyb20gYSBzdHJpbmcuXHJcbiAgLy8vIElmIGEgREJDUyBjaGFyYWN0ZXIgaXMgZGl2aWRlZCBpbiB0d28sIGl0IHdpbGwgYmUgcmVwbGFjZSB0byBhIHNwYWNlLlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyVmFsOlwiPnN0cmluZyAoaW4gVW5pY29kZSlcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvZnM6XCI+c3RhcnRpbmcgcG9zaXRpb24gKGJ5dGUpIG9mIHRoZSBzdWJzdHJpbmdcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZW46XCI+bnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGV4dHJhY3RlZCAoaS5lLiBieXRlcyBvZiBzdWJzdHJpbmcpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdWJzdHJpbmdcclxuICAvLy9cclxuICAvLy8gRXhhbXBsZTogbWlkQihcImFiWFljXCIsIDIsIDQpXHJcbiAgLy8vIFdoZXJlICdhJywgJ2InIGFuZCAgJ2MnIGFyZSBTQkNTLCBhbmQgJ1gnIGFuZCAnWScgYXJlIERCQ1MsIGl0IHJldHVybnNcclxuICAvLy8gXCJiWCBcIi5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBtaWRCKHN0clZhbDogc3RyaW5nLCBvZnM6IG51bWJlciwgbGVuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGludFZhbGlkTWF4SW5kZXg6IG51bWJlciA9IC0xOyAvLyBwYXJhbSAjMSBvZiBzdWJzdHJpbmdcclxuICAgIGxldCBpbnRWYWxpZE1pbkluZGV4OiBudW1iZXIgPSAtMTsgLy8gcGFyYW0gIzIgb2Ygc3Vic3RyaW5nXHJcbiAgICBsZXQgYkhlYWRTcGFjZTogYm9vbGVhbiA9IGZhbHNlOyAgIC8vIGZsYWc6IG5lZWQgdG8gYWRkIHNwYWNlXHJcbiAgICBsZXQgYkVuZFNwYWNlOiBib29sZWFuID0gZmFsc2U7ICAgIC8vIGZsYWc6IG5lZWQgdG8gYWRkIHNwYWNlXHJcblxyXG4gICAgbGV0IHN0clJldDogc3RyaW5nO1xyXG5cclxuICAgIC8vIGNoZWNrIGFuZCBtb2RpZnkgb2ZzICYgbGVuXHJcbiAgICBpZiAobGVuIDw9IDApXHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG5cclxuICAgIGlmIChvZnMgPD0gMCkge1xyXG4gICAgICBvZnMgPSAwO1xyXG4gICAgICBpbnRWYWxpZE1pbkluZGV4ID0gMDtcclxuICAgICAgYkhlYWRTcGFjZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpbnRCeXRlTGVuZ3RoOiBudW1iZXIgPSBVdGlsU3RyQnl0ZU1vZGUubGVuQihzdHJWYWwpO1xyXG5cclxuICAgIGlmIChpbnRCeXRlTGVuZ3RoIDwgb2ZzKVxyXG4gICAgICByZXR1cm4gXCJcIjtcclxuXHJcbiAgICBsZXQgTGVuTWF4OiBudW1iZXIgPSBpbnRCeXRlTGVuZ3RoIC0gb2ZzO1xyXG4gICAgaWYgKExlbk1heCA8IGxlbilcclxuICAgICAgbGVuID0gTGVuTWF4O1xyXG5cclxuICAgIC8vIHNldCBNaW5JbmRleCBhbmQgTWF4SW5kZXggZm9yIHN1YnN0cmluZ1xyXG4gICAgaW50Qnl0ZUxlbmd0aCA9IDA7XHJcblxyXG4gICAgZm9yIChsZXQgaW50SW5kZXg6IG51bWJlciA9IDA7IGludEluZGV4IDwgc3RyVmFsLmxlbmd0aDsgaW50SW5kZXggPSBpbnRJbmRleCArIDEpIHtcclxuICAgICAgbGV0IHM6IHN0cmluZyA9IHN0clZhbC5zdWJzdHIoaW50SW5kZXgsIDEpO1xyXG4gICAgICBpbnRCeXRlTGVuZ3RoID0gaW50Qnl0ZUxlbmd0aCArIFV0aWxTdHJCeXRlTW9kZS5FbmNvZGluZy5HZXRCeXRlQ291bnQocyk7XHJcblxyXG4gICAgICBpZiAoaW50VmFsaWRNaW5JbmRleCA9PT0gLTEpIHtcclxuICAgICAgICBpZiAoaW50Qnl0ZUxlbmd0aCA9PT0gb2ZzKSB7XHJcbiAgICAgICAgICBpbnRWYWxpZE1pbkluZGV4ID0gaW50SW5kZXggKyAxO1xyXG4gICAgICAgICAgYkhlYWRTcGFjZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpbnRCeXRlTGVuZ3RoID4gb2ZzKSB7XHJcbiAgICAgICAgICBpbnRWYWxpZE1pbkluZGV4ID0gaW50SW5kZXggKyAxO1xyXG4gICAgICAgICAgYkhlYWRTcGFjZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaW50VmFsaWRNYXhJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICBpZiAoaW50Qnl0ZUxlbmd0aCA9PT0gb2ZzICsgbGVuKSB7XHJcbiAgICAgICAgICBpbnRWYWxpZE1heEluZGV4ID0gaW50SW5kZXg7XHJcbiAgICAgICAgICBiRW5kU3BhY2UgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpbnRCeXRlTGVuZ3RoID4gb2ZzICsgbGVuKSB7XHJcbiAgICAgICAgICBpbnRWYWxpZE1heEluZGV4ID0gaW50SW5kZXggLSAxO1xyXG4gICAgICAgICAgYkVuZFNwYWNlID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHByZXBhcmUgZm9yIHN1YnN0cmluZ1xyXG4gICAgbGV0IHN0cmJ1ZkFkZGluZ0J1ZjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbik7XHJcblxyXG4gICAgLy8gZXhlY3V0ZSBNaWRcclxuICAgIGlmIChiSGVhZFNwYWNlKSB7XHJcbiAgICAgIHN0cmJ1ZkFkZGluZ0J1Zi5BcHBlbmQoJyAnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaW50VmFsaWRNaW5JbmRleCA8PSBpbnRWYWxpZE1heEluZGV4KSB7XHJcbiAgICAgIHN0cmJ1ZkFkZGluZ0J1Zi5BcHBlbmQoc3RyVmFsLnN1YnN0cihpbnRWYWxpZE1pbkluZGV4LCBpbnRWYWxpZE1heEluZGV4ICsgMSAtIGludFZhbGlkTWluSW5kZXgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYkVuZFNwYWNlKSB7XHJcbiAgICAgIHN0cmJ1ZkFkZGluZ0J1Zi5BcHBlbmQoJyAnKTtcclxuICAgIH1cclxuXHJcbiAgICBzdHJSZXQgPSBzdHJidWZBZGRpbmdCdWYuVG9TdHJpbmcoKTtcclxuICAgIHN0cmJ1ZkFkZGluZ0J1ZiA9IG51bGw7XHJcblxyXG4gICAgcmV0dXJuIHN0clJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gR2V0IENoYXJhY3RlcnMgZnJvbSBMZWZ0IG9mIFN0cmluZ1xyXG4gIC8vLyBSZXR1cm5zIGEgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgYSBzdHJpbmcuXHJcbiAgLy8vIElmIGEgREJDUyBjaGFyYWN0ZXIgaXMgZGl2aWRlZCBpbiB0d28sIGl0IHdpbGwgYmUgcmVwbGFjZSB0byBhIHNwYWNlLlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyVmFsOlwiPnN0cmluZyAoaW4gVW5pY29kZSlcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZW46XCI+bnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJldHVyZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG91dHB1dCBzdHJpbmdcclxuICAvLy9cclxuICAvLy8gRXhhbXBsZTogbGVmdEIoXCJhYlhZY1wiLCA0KVxyXG4gIC8vLyBXaGVyZSAnYScsICdiJyBhbmQgICdjJyBhcmUgU0JDUywgYW5kICdYJyBhbmQgJ1knIGFyZSBEQkNTLCBpdCByZXR1cm5zXHJcbiAgLy8vIFwiYWJYXCIuXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgbGVmdEIoc3RyVmFsOiBzdHJpbmcsIGxlbjogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBVdGlsU3RyQnl0ZU1vZGUubWlkQihzdHJWYWwsIDAsIGxlbik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEdldCBDaGFyYWN0ZXJzIGZyb20gUmlnaHQgb2YgU3RyaW5nXHJcbiAgLy8vIFJldHVybnMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzdHJpbmcuXHJcbiAgLy8vIElmIGEgREJDUyBjaGFyYWN0ZXIgaXMgZGl2aWRlZCBpbiB0d28sIGl0IHdpbGwgYmUgcmVwbGFjZSB0byBhIHNwYWNlLlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyVmFsOlwiPnN0cmluZyAoaW4gVW5pY29kZSlcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZW46XCI+bnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJldHVyZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG91dHB1dCBzdHJpbmdcclxuICAvLy9cclxuICAvLy8gRXhhbXBsZTogcmlnaHRCKFwiYWJYWWNcIiwgNClcclxuICAvLy8gV2hlcmUgJ2EnLCAnYicgYW5kICAnYycgYXJlIFNCQ1MsIGFuZCAnWCcgYW5kICdZJyBhcmUgREJDUywgaXQgcmV0dXJuc1xyXG4gIC8vLyBcIiBZY1wiLlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIHJpZ2h0QihzdHJWYWw6IHN0cmluZywgbGVuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGJ5dGVGbGRzVmFsTGVuOiBudW1iZXIgPSBVdGlsU3RyQnl0ZU1vZGUubGVuQihzdHJWYWwpO1xyXG5cclxuICAgIGlmIChsZW4gPCAwKSB7XHJcbiAgICAgIGxlbiA9IDA7XHJcbiAgICB9XHJcbiAgICBsZXQgb2ZzOiBudW1iZXIgPSBieXRlRmxkc1ZhbExlbiAtIGxlbjtcclxuICAgIGlmIChvZnMgPCAwKSB7XHJcbiAgICAgIG9mcyA9IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVXRpbFN0ckJ5dGVNb2RlLm1pZEIoc3RyVmFsLCBvZnMsIGxlbik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEluc2VydCBTdHJpbmdcclxuICAvLy8gSW5zZXJ0cyBvbmUgc3RyaW5nIGludG8gYW5vdGhlci5cclxuICAvLy8gSWYgYSBEQkNTIGNoYXJhY3RlciBpcyBkaXZpZGVkIGluIHR3bywgaXQgd2lsbCBiZSByZXBsYWNlIHRvIGEgc3BhY2UuXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJUYXJnZXQ6XCI+QSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB0YXJnZXQgc3RyaW5nLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clNvdXJjZTpcIj5BIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHNvdXJjZSBzdHJpbmcuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2ZzOlwiPkEgbnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gKGJ5dGUpIGluXHJcbiAgLy8vIHRoZSB0YXJnZXQuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGVuOlwiPkEgbnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlXHJcbiAgLy8vIHNvdXJjZSB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgdGFyZ2V0LlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gb3V0cHV0IHN0cmluZ1xyXG4gIC8vL1xyXG4gIC8vLyBFeGFtcGxlOiBpbnNCKFwiYWJYWWNcIiwgXCJkZVwiLCA0LCAxKVxyXG4gIC8vLyBXaGVyZSAnYScsICdiJywgJ2MnLCAnZCcgYW5kICdlJyBhcmUgU0JDUywgYW5kICdYJyBhbmQgJ1knIGFyZSBEQkNTLFxyXG4gIC8vLyBpdCByZXR1cm5zIFwiYWIgZCBZY1wiLlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGluc0Ioc3RyVGFyZ2V0OiBzdHJpbmcsIHN0clNvdXJjZTogc3RyaW5nLCBvZnM6IG51bWJlciwgbGVuOiBudW1iZXIpOiBzdHJpbmcge1xyXG5cclxuICAgIGlmIChvZnMgPCAwKSB7XHJcbiAgICAgIG9mcyA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKG9mcyA+PSAxKSB7XHJcbiAgICAgICAgb2ZzID0gb2ZzIC0gMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChsZW4gPCAwKSB7XHJcbiAgICAgIGxlbiA9IDA7XHJcbiAgICB9XHJcbiAgICBsZXQgaW50VGFyZ2V0TGVuQjogbnVtYmVyID0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIoc3RyVGFyZ2V0KTtcclxuICAgIGxldCBpbnRTb3VyY2VMZW5COiBudW1iZXIgPSBVdGlsU3RyQnl0ZU1vZGUubGVuQihzdHJTb3VyY2UpO1xyXG4gICAgbGV0IHN0cmJ1ZlJldFZhbDogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKG9mcyArIGxlbik7XHJcblxyXG4gICAgc3RyYnVmUmV0VmFsLkFwcGVuZChVdGlsU3RyQnl0ZU1vZGUubGVmdEIoc3RyVGFyZ2V0LCBvZnMpKTtcclxuICAgIGZvciAobGV0IGludEFkZFNwYWNlTGVuOiBudW1iZXIgPSBvZnMgLSBpbnRUYXJnZXRMZW5COyBpbnRBZGRTcGFjZUxlbiA+IDA7IGludEFkZFNwYWNlTGVuID0gaW50QWRkU3BhY2VMZW4gLSAxKSB7XHJcbiAgICAgIHN0cmJ1ZlJldFZhbC5BcHBlbmQoJyAnKTtcclxuICAgIH1cclxuICAgIHN0cmJ1ZlJldFZhbC5BcHBlbmQoVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKHN0clNvdXJjZSwgbGVuKSk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBsZW4gLSBpbnRTb3VyY2VMZW5COyBpID4gMDsgaSA9IGkgLSAxKSB7XHJcbiAgICAgIHN0cmJ1ZlJldFZhbC5BcHBlbmQoJyAnKTtcclxuICAgIH1cclxuICAgIHN0cmJ1ZlJldFZhbC5BcHBlbmQoVXRpbFN0ckJ5dGVNb2RlLnJpZ2h0QihzdHJUYXJnZXQsIGludFRhcmdldExlbkIgLSBvZnMpKTtcclxuICAgIHJldHVybiBzdHJidWZSZXRWYWwuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gRGVsZXRlIENoYXJhY3RlcnNcclxuICAvLy8gRGVsZXRlIGNoYXJhY3RlcnMgZnJvbSBhIHN0cmluZy5cclxuICAvLy8gSWYgYSBEQkNTIGNoYXJhY3RlciBpcyBkaXZpZGVkIGluIHR3bywgaXQgd2lsbCBiZSByZXBsYWNlIHRvIGEgc3BhY2UuXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJWYWw6XCI+c3RyaW5nIChpbiBVbmljb2RlKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9mczpcIj5UaGUgcG9zaXRpb24gKGJ5dGUpIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gYmUgZGVsZXRlZC5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZW46XCI+VGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIGRlbGV0ZWQsIGJlZ2lubmluZyB3aXRoXHJcbiAgLy8vIHBvc2l0aW9uIHN0YXJ0IGFuZCBwcm9jZWVkaW5nIHJpZ2h0d2FyZC5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG91dHB1dCBzdHJpbmdcclxuICAvLy9cclxuICAvLy8gRXhhbXBsZTogZGVsQihcImFiWFljXCIsIDIsIDQpXHJcbiAgLy8vIFdoZXJlICdhJywgJ2InIGFuZCAgJ2MnIGFyZSBTQkNTLCBhbmQgJ1gnIGFuZCAnWScgYXJlIERCQ1MsIGl0IHJldHVybnNcclxuICAvLy8gXCJhIGNcIi5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBkZWxCKHN0clZhbDogc3RyaW5nLCBvZnM6IG51bWJlciwgbGVuOiBudW1iZXIpOiBzdHJpbmcge1xyXG5cclxuICAgIGlmIChvZnMgPCAwKSB7XHJcbiAgICAgIG9mcyA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCBvZnMgPj0gMSkge1xyXG4gICAgICAgIG9mcyA9IG9mcyAtIDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBpbnRWYWxMZW5COiBudW1iZXIgPSBVdGlsU3RyQnl0ZU1vZGUubGVuQihzdHJWYWwpO1xyXG4gICAgaWYgKG9mcyArIGxlbiA+IGludFZhbExlbkIpIHtcclxuICAgICAgbGVuID0gaW50VmFsTGVuQiAtIG9mcztcclxuICAgIH1cclxuICAgIGxldCBzdHJSZXQ6IHN0cmluZztcclxuICAgIGlmIChsZW4gPD0gMCkge1xyXG4gICAgICBzdHJSZXQgPSBzdHJWYWw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IGludFJpZ2h0U2lkZUxlbkI6IG51bWJlciA9IGludFZhbExlbkIgLSBvZnMgLSBsZW47XHJcbiAgICAgIGlmIChpbnRSaWdodFNpZGVMZW5CIDwgMCkge1xyXG4gICAgICAgIHN0clJldCA9IHN0clZhbDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgc3RyYnVmUmV0VmFsOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIob2ZzICsgaW50UmlnaHRTaWRlTGVuQik7XHJcbiAgICAgICAgc3RyYnVmUmV0VmFsLkFwcGVuZChVdGlsU3RyQnl0ZU1vZGUubGVmdEIoc3RyVmFsLCBvZnMpKTtcclxuICAgICAgICBzdHJidWZSZXRWYWwuQXBwZW5kKFV0aWxTdHJCeXRlTW9kZS5yaWdodEIoc3RyVmFsLCBpbnRSaWdodFNpZGVMZW5CKSk7XHJcbiAgICAgICAgc3RyUmV0ID0gc3RyYnVmUmV0VmFsLlRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdHJSZXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEluLVN0cmluZyBTZWFyY2hcclxuICAvLy8gUmV0dXJucyBhIG51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIGZpcnN0IHBvc2l0aW9uIChieXRlKSBvZiBhXHJcbiAgLy8vIHN1YnN0cmluZyB3aXRoaW4gYSBzdHJpbmcuXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJUYXJnZXQ6XCI+c3RyaW5nIChpbiBVbmljb2RlKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clNlYXJjaDpcIj5zdHJpbmcgd2hpY2ggd2lsbCBiZSB0aGUgc2VhcmNoIGFyZ3VtZW50IGluIHN0cmluZ1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbnVtYmVyLCAwIGlmIG5vdCBmb3VuZFxyXG4gIC8vL1xyXG4gIC8vLyBFeGFtcGxlOiBpbnN0ckIoXCJhYlhZY1wiLCBcIllcIilcclxuICAvLy8gV2hlcmUgJ2EnLCAnYicgYW5kICAnYycgYXJlIFNCQ1MsIGFuZCAnWCcgYW5kICdZJyBhcmUgREJDUywgaXQgcmV0dXJuc1xyXG4gIC8vLyA1LlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGluc3RyQihzdHJUYXJnZXQ6IHN0cmluZywgc3RyU2VhcmNoOiBzdHJpbmcpOiBudW1iZXIge1xyXG5cclxuICAgIGlmIChzdHJTZWFyY2gubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIC8vIG5vdGhpbmcgdG8gbG9vayBmb3JcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG9mczogbnVtYmVyID0gc3RyVGFyZ2V0LmluZGV4T2Yoc3RyU2VhcmNoKTtcclxuXHJcbiAgICBpZiAob2ZzIDwgMCkge1xyXG4gICAgICAvLyBub3QgZm91bmRcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfVxyXG5cclxuICAgIHJldHVybiBVdGlsU3RyQnl0ZU1vZGUubGVuQihzdHJUYXJnZXQuc3Vic3RyKDAsIG9mcykpICsgMTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gUmVwbGFjZSBTdWJzdHJpbmcgV2l0aGluIGEgU3RyaW5nIChCeXRlIE1vZGUpXHJcbiAgLy8vIFJlcGxhY2VzIGEgc3Vic3RyaW5nIHdpdGhpbiBhIHN0cmluZyB3aXRoIGFub3RoZXIgc3Vic3RyaW5nLlxyXG4gIC8vLyBJZiBhIERCQ1MgY2hhcmFjdGVyIGlzIGRpdmlkZWQgaW4gdHdvLCBpdCB3aWxsIGJlIHJlcGxhY2UgdG8gYSBzcGFjZS5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clRhcmdldDpcIj50YXJnZXQgc3RyaW5nIHdoZXJlIHRoZSByZXBsYWNlbWVudCB3aWxsIHRha2UgcGxhY2UuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyT3JpZ2luOlwiPnN0cmluZyB0aGF0IHByb3ZpZGVzIHRoZSBzdWJzdHJpbmcgdG8gYmUgY29waWVkIHRvXHJcbiAgLy8vIHRhcmdldC5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvZnM6XCI+dGhlIGZpcnN0IHBvc2l0aW9uIChieXRlKSBpbiB0aGUgdGFyZ2V0IHN0cmluZyB0aGF0IHdpbGxcclxuICAvLy8gcmVjZWl2ZSB0aGUgc3Vic3RyaW5nIGZyb20gb3JpZ2luLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxlbjpcIj50aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2lsbCBiZSBtb3ZlZCBmcm9tIG9yaWdpbiB0b1xyXG4gIC8vLyB0YXJnZXQsIHN0YXJ0aW5nIGZyb20gdGhlIGxlZnRtb3N0IGNoYXJhY3RlciBvZiBvcmlnaW4uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdHJpbmcgY29udGFpbmluZyBtb2RpZmllZCB0YXJnZXQgc3RyaW5nXHJcbiAgLy8vXHJcbiAgLy8vIEV4YW1wbGU6IHJlcEIoXCJhYlhZY1wiLCBcImRlXCIsIDQsIDIpXHJcbiAgLy8vIFdoZXJlICdhJywgJ2InLCAnYycsICdkJyBhbmQgJ2UnIGFyZSBTQkNTLCBhbmQgJ1gnIGFuZCAnWScgYXJlIERCQ1MsXHJcbiAgLy8vIGl0IHJldHVybnMgXCJhYiBkZSBjXCIuXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgcmVwQihzdHJUYXJnZXQ6IHN0cmluZywgc3RyT3JpZ2luOiBzdHJpbmcsIG9mczogbnVtYmVyLCBsZW46IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgc3RyYnVmQWRkaW5nQnVmOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICBpZiAob2ZzIDwgMCkge1xyXG4gICAgICBvZnMgPSAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChvZnMgPj0gMSkge1xyXG4gICAgICAgIG9mcyA9IG9mcyAtIDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChsZW4gPCAwKSB7XHJcbiAgICAgIGxlbiA9IDA7XHJcbiAgICB9XHJcbiAgICBzdHJidWZBZGRpbmdCdWYuQXBwZW5kKFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihzdHJUYXJnZXQsIG9mcykpO1xyXG5cclxuICAgIGxldCBpbnRBZGRTcGFjZUxlbjogbnVtYmVyID0gb2ZzIC0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIoc3RyVGFyZ2V0KTtcclxuICAgIGZvciAoOyBpbnRBZGRTcGFjZUxlbiA+IDA7IGludEFkZFNwYWNlTGVuLS0pXHJcbiAgICAgIHN0cmJ1ZkFkZGluZ0J1Zi5BcHBlbmQoJyAnKTtcclxuXHJcblxyXG4gICAgc3RyYnVmQWRkaW5nQnVmLkFwcGVuZChVdGlsU3RyQnl0ZU1vZGUubGVmdEIoc3RyT3JpZ2luLCBsZW4pKTtcclxuXHJcbiAgICBsZXQgaW50UmlnaHRMZW46IG51bWJlciA9IFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0clRhcmdldCkgLSAob2ZzICsgbGVuKTtcclxuICAgIGlmIChpbnRSaWdodExlbiA+IDApIHtcclxuICAgICAgc3RyYnVmQWRkaW5nQnVmLkFwcGVuZChVdGlsU3RyQnl0ZU1vZGUucmlnaHRCKHN0clRhcmdldCwgaW50UmlnaHRMZW4pKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhZGQgYmxhbmtzIHRvIHRoZSBlbmRcclxuICAgIGludEFkZFNwYWNlTGVuID0gbGVuIC0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIoc3RyT3JpZ2luKTtcclxuICAgIGZvciAoOyBpbnRBZGRTcGFjZUxlbiA+IDA7IGludEFkZFNwYWNlTGVuLS0pIHtcclxuICAgICAgc3RyYnVmQWRkaW5nQnVmLkFwcGVuZCgnICcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdHJidWZBZGRpbmdCdWYuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gUmVwbGFjZSBTdWJzdHJpbmcgV2l0aGluIGEgU3RyaW5nIChDaGFyYWN0ZXIgTW9kZSlcclxuICAvLy8gUmVwbGFjZXMgYSBzdWJzdHJpbmcgd2l0aGluIGEgc3RyaW5nIHdpdGggYW5vdGhlciBzdWJzdHJpbmcuXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJUYXJnZXQ6XCI+dGFyZ2V0IHN0cmluZyB3aGVyZSB0aGUgcmVwbGFjZW1lbnQgd2lsbCB0YWtlIHBsYWNlLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0ck9yaWdpbjpcIj5zdHJpbmcgdGhhdCBwcm92aWRlcyB0aGUgc3Vic3RyaW5nIHRvIGJlIGNvcGllZCB0b1xyXG4gIC8vLyB0YXJnZXQuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2ZzOlwiPnRoZSBmaXJzdCBwb3NpdGlvbiAoY2hhcmFjdGVyKSBpbiB0aGUgdGFyZ2V0IHN0cmluZyB0aGF0XHJcbiAgLy8vIHdpbGwgcmVjZWl2ZSB0aGUgc3Vic3RyaW5nIGZyb20gb3JpZ2luLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxlbjpcIj50aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB3aWxsIGJlIG1vdmVkIGZyb20gb3JpZ2luXHJcbiAgLy8vIHRvIHRhcmdldCwgc3RhcnRpbmcgZnJvbSB0aGUgbGVmdG1vc3QgY2hhcmFjdGVyIG9mIG9yaWdpbi5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHN0cmluZyBjb250YWluaW5nIG1vZGlmaWVkIHRhcmdldCBzdHJpbmdcclxuICAvLy9cclxuICAvLy8gRXhhbXBsZTogcmVwQihcImFiWFljXCIsIFwiZGVcIiwgNCwgMilcclxuICAvLy8gV2hldGhlciBlYWNoIGNoYXJhY3RlciBpcyBTQkNTIG9yIERCQ1MsIGl0IHJldHVybnMgXCJhYlhkZVwiLlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIHJlcEMoc3RyVGFyZ2V0OiBzdHJpbmcsIHN0ck9yaWdpbjogc3RyaW5nLCBvZnM6IG51bWJlciwgbGVuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHN0cmJ1ZkFkZGluZ0J