@magic-xpa/utils
Version:
magic utils package
443 lines (442 loc) • 42.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { PICInterface } from "./PICInterface";
import { UtilStrByteMode } from "./UtilStrByteMode";
import { NNumber } from "@magic-xpa/mscorelib";
/** @type {?} */
var MAX_GENGO = 5;
/** @type {?} */
var IDX_UPPERCASE_ALPHA = 0;
/** @type {?} */
var IDX_LOWERCASE_ALPHA = 1;
/** @type {?} */
var IDX_KANJI = 2;
/** @type {?} */
var IDX_YEAR = 0;
/** @type {?} */
var IDX_MONTH = 1;
/** @type {?} */
var IDX_DAY = 2;
/** @type {?} */
var IDX_DOY = 3;
var UtilDateJpn = /** @class */ (function () {
function UtilDateJpn() {
this.MaxGengo = MAX_GENGO;
}
/**
* @return {?}
*/
UtilDateJpn.getInstance = /**
* @return {?}
*/
function () {
if (UtilDateJpn._instance === null) {
UtilDateJpn._instance = new UtilDateJpn();
}
return UtilDateJpn._instance;
};
/**
* @return {?}
*/
UtilDateJpn.getArrayDow = /**
* @return {?}
*/
function () {
return UtilDateJpn.JweekStr;
};
/**
* @param {?} intIdx
* @return {?}
*/
UtilDateJpn.getStrDow = /**
* @param {?} intIdx
* @return {?}
*/
function (intIdx) {
/** @type {?} */
var flag = intIdx < 0 || 7 < intIdx;
if (flag) {
intIdx = 0;
}
return UtilDateJpn.JweekStr[intIdx];
};
/**
* @param {?} month
* @return {?}
*/
UtilDateJpn.convertStrMonth = /**
* @param {?} month
* @return {?}
*/
function (month) {
/** @type {?} */
var flag = month < 0 || 12 < month;
if (flag) {
month = 0;
}
return UtilDateJpn.JmonthStr[month];
};
/// <summary>
/// Convert a year (A.D.) into Japanese year of an era
/// This method is modeled after "date_jpn_year_ofs" function in
/// "\mglocal\jpn\jpndate_jpn.cpp".
/// </summary>
/// <param name = "intYear:">year (A.D.)
/// </param>
/// <param name = "intDoy:">DOY
/// </param>
/// <returns> year of an era.
/// if either param is invalid, it returns 0.
/// </returns>
/**
* @param {?} intYear
* @param {?} intDoy
* @return {?}
*/
UtilDateJpn.prototype.date_jpn_year_ofs = /**
* @param {?} intYear
* @param {?} intDoy
* @return {?}
*/
function (intYear, intDoy) {
/** @type {?} */
var result;
if (intYear < 1 || intDoy < 1) {
result = 0;
}
else {
/** @type {?} */
var num = this.MaxGengo - 1;
while (intYear < UtilDateJpn.StartDayOfGengo[num][0]) {
num = num - 1;
}
if (intYear === UtilDateJpn.StartDayOfGengo[num][0] && intDoy < UtilDateJpn.StartDayOfGengo[num][3]) {
num = num - 1;
}
result = intYear - UtilDateJpn.StartDayOfGengo[num][0] + 1;
}
return result;
};
/// <summary>
/// Convert a year (A.D.) into a name of a Japanese era
/// This method is modeled after "date_jpn_yr_2_a" function in
/// "\mglocal\jpn\jpndate_jpn.cpp".
/// </summary>
/// <param name = "intYear:">year (A.D.)
/// </param>
/// <param name = "intDoy:">DOY
/// </param>
/// <param name = "isKanji:">return a full name (true) or the first letter (false).
/// </param>
/// <returns> name of an era
/// if either param is invalid, it returns "?".
/// </returns>
/**
* @param {?} intYear
* @param {?} intDoy
* @param {?} isKanji
* @return {?}
*/
UtilDateJpn.prototype.date_jpn_yr_2_a = /**
* @param {?} intYear
* @param {?} intDoy
* @param {?} isKanji
* @return {?}
*/
function (intYear, intDoy, isKanji) {
/** @type {?} */
var num;
if (intYear < 1 || intDoy < 1) {
num = 0;
}
else {
num = this.MaxGengo - 1;
while (intYear < UtilDateJpn.StartDayOfGengo[num][0]) {
num = num - 1;
}
if (intYear === UtilDateJpn.StartDayOfGengo[num][0] && intDoy < UtilDateJpn.StartDayOfGengo[num][3]) {
num = num - 1;
}
}
/** @type {?} */
var result;
if (isKanji) {
result = UtilDateJpn.GengoStr[num][2];
}
else {
result = UtilDateJpn.GengoStr[num][0];
}
return result;
};
/**
* @param {?} ucp_str
* @param {?} s_len
* @return {?}
*/
UtilDateJpn.prototype.date_jpn_yr_4_a = /**
* @param {?} ucp_str
* @param {?} s_len
* @return {?}
*/
function (ucp_str, s_len) {
/** @type {?} */
var i = this.MaxGengo - 1;
if (s_len > 0) {
if (s_len > 1) {
ucp_str = UtilStrByteMode.leftB(ucp_str, s_len);
}
while (i > 0) {
if (s_len === 1) {
if (ucp_str === UtilDateJpn.GengoStr[i][0] || ucp_str === UtilDateJpn.GengoStr[i][1]) {
break;
}
}
else {
if (s_len > 1) {
/** @type {?} */
var text = UtilStrByteMode.leftB(UtilDateJpn.GengoStr[i][2], s_len);
if (ucp_str === text) {
break;
}
}
}
i = i - 1;
}
}
/** @type {?} */
var result;
if (i > 0) {
result = UtilDateJpn.StartDayOfGengo[i][0];
}
else {
/** @type {?} */
var text = ucp_str.substr(0, 1);
if (text === " " || text === "?") {
result = 1;
}
else {
result = 0;
}
}
return result;
};
/**
* @param {?} strDate
* @param {?} strPicture
* @param {?} intStartPos
* @return {?}
*/
UtilDateJpn.getEraNameStrInDate = /**
* @param {?} strDate
* @param {?} strPicture
* @param {?} intStartPos
* @return {?}
*/
function (strDate, strPicture, intStartPos) {
/** @type {?} */
var result = null;
/** @type {?} */
var intPicIdxOfs = 0;
/** @type {?} */
var i = intStartPos;
while (i + intPicIdxOfs < strPicture.length) {
/** @type {?} */
var intLetters = void 0;
if (strPicture.charCodeAt(i + intPicIdxOfs) === PICInterface.PIC_JY1) {
intLetters = 1;
}
else {
if (strPicture.charCodeAt(i + intPicIdxOfs) === PICInterface.PIC_JY2) {
intLetters = 1;
}
else {
if (strPicture.charCodeAt(i + intPicIdxOfs) === PICInterface.PIC_JY4) {
intLetters = 2;
}
else {
// If "strDate" contains DBCS, the position of "strPicture" has to skip next index.
if (i < strDate.length) {
if (!UtilStrByteMode.isHalfWidth(strDate[i]) && UtilStrByteMode.isHalfWidth(strPicture[i + intPicIdxOfs])) {
intPicIdxOfs = intPicIdxOfs + 1;
}
}
i = i + 1;
continue;
}
}
}
result = strDate.substr(i, intLetters);
break; // exit loop
}
return result;
};
/**
* @param {?} strPicture
* @param {?} intStartPos
* @return {?}
*/
UtilDateJpn.getEraNameLenInPicture = /**
* @param {?} strPicture
* @param {?} intStartPos
* @return {?}
*/
function (strPicture, intStartPos) {
/** @type {?} */
var intLetters = 0;
for (var i = intStartPos; i < strPicture.length; i = i + 1) {
if (strPicture.charCodeAt(i) === PICInterface.PIC_JY1) {
intLetters = 1;
}
else {
if (strPicture.charCodeAt(i) === PICInterface.PIC_JY2) {
intLetters = 2;
}
else {
if (strPicture.charCodeAt(i) === PICInterface.PIC_JY4) {
intLetters = 4;
}
}
}
if (intLetters > 0) {
break;
}
}
return intLetters;
};
/// <summary>
/// Get the start year of an era in picture
/// </summary>
/// <param name = "strDate:">string of input strDate
/// </param>
/// <param name = "strPicture:">string of picture
/// </param>
/// <returns> start year of the era
/// </returns>
/**
* @param {?} strDate
* @param {?} strPicture
* @return {?}
*/
UtilDateJpn.prototype.getStartYearOfEra = /**
* @param {?} strDate
* @param {?} strPicture
* @return {?}
*/
function (strDate, strPicture) {
/** @type {?} */
var eraNameStrInDate = UtilDateJpn.getEraNameStrInDate(strDate, strPicture, 0);
/** @type {?} */
var result;
if (eraNameStrInDate === null) {
result = 0;
}
else {
/** @type {?} */
var eraNameLenInPicture = UtilDateJpn.getEraNameLenInPicture(strPicture, 0);
if (eraNameLenInPicture === 0) {
result = 0;
}
else {
/** @type {?} */
var intStartYearOfEra = this.date_jpn_yr_4_a(eraNameStrInDate, eraNameLenInPicture);
result = intStartYearOfEra;
}
}
return result;
};
/// <summary> Add extra Gengo data into the Gengo tables</summary>
/// <param name="strExtraGengo:">
/// </param>
/// <returns>
/// </returns>
/**
* @param {?} strExtraGengo
* @return {?}
*/
UtilDateJpn.prototype.addExtraGengo = /**
* @param {?} strExtraGengo
* @return {?}
*/
function (strExtraGengo) {
/** @type {?} */
var array = strExtraGengo.split(';');
for (var i = 0; i <= array.length; i = i + 1) {
if (array[i].length > 0) {
/** @type {?} */
var array2 = array[i].split(',');
if (array2.length === 2 && array2[0].length > 0 && array2[1].length > 0 && array2[2].length > 0) {
/** @type {?} */
var array3 = array2[0].split('/');
if (array3.length === 2 && array3[0].length > 0 && array3[1].length > 0 && array3[2].length > 0) {
UtilDateJpn.GengoStr[5 + i][0] = array2[2].substr(0, 1); // symbol name (upper case): A
UtilDateJpn.GengoStr[5 + i][1] = array2[2].substr(1, 1); // symbol name (lower case): a
UtilDateJpn.GengoStr[5 + i][2] = array2[2].substr(2); // gengo name: ABCD
UtilDateJpn.StartDayOfGengo[5 + i][0] = NNumber.Parse(array3[0]); // start year: 2012
UtilDateJpn.StartDayOfGengo[5 + i][1] = NNumber.Parse(array3[1]); // start month: 4
UtilDateJpn.StartDayOfGengo[5 + i][2] = NNumber.Parse(array3[2]); // start day: 1
UtilDateJpn.StartDayOfGengo[5 + i][3] = NNumber.Parse(array2[1]); // days since January 1: 92
this.MaxGengo = this.MaxGengo + 1;
}
}
}
}
};
UtilDateJpn._instance = null;
UtilDateJpn.JweekStr = [
" ", "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"
];
UtilDateJpn.JmonthStr = [
"", " 1月", " 2月", " 3月", " 4月", " 5月", " 6月", " 7月", " 8月", " 9月", "10月", "11月", "12月"
];
UtilDateJpn.GengoStr = [
[
"?", "?", "????"
], [
"M", "m", "明治"
], [
"T", "t", "大正"
], [
"S", "s", "昭和"
], [
"H", "h", "平成"
], [
"?", "?", "??"
], [
"?", "?", "??"
], [
"?", "?", "??"
]
];
UtilDateJpn.StartDayOfGengo = [
[
1, 1, 1, 1
], [
1868, 9, 8, 252
], [
1912, 6, 30, 212
], [
1926, 12, 25, 359
], [
1989, 1, 8, 8
], new Array(4), new Array(4), new Array(4)
];
return UtilDateJpn;
}());
export { UtilDateJpn };
if (false) {
/** @type {?} */
UtilDateJpn._instance;
/** @type {?} */
UtilDateJpn.JweekStr;
/** @type {?} */
UtilDateJpn.JmonthStr;
/** @type {?} */
UtilDateJpn.GengoStr;
/** @type {?} */
UtilDateJpn.StartDayOfGengo;
/** @type {?} */
UtilDateJpn.prototype.MaxGengo;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbERhdGVKcG4uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbWFnaWMteHBhL3V0aWxzLyIsInNvdXJjZXMiOlsic3JjL1V0aWxEYXRlSnBuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBVSxPQUFPLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQzs7QUFFdEQsSUFBTSxTQUFTLEdBQVcsQ0FBQyxDQUFDOztBQUM1QixJQUFNLG1CQUFtQixHQUFXLENBQUMsQ0FBQzs7QUFDdEMsSUFBTSxtQkFBbUIsR0FBVyxDQUFDLENBQUM7O0FBQ3RDLElBQU0sU0FBUyxHQUFXLENBQUMsQ0FBQzs7QUFDNUIsSUFBTSxRQUFRLEdBQVcsQ0FBQyxDQUFDOztBQUMzQixJQUFNLFNBQVMsR0FBVyxDQUFDLENBQUM7O0FBQzVCLElBQU0sT0FBTyxHQUFXLENBQUMsQ0FBQzs7QUFDMUIsSUFBTSxPQUFPLEdBQVcsQ0FBQyxDQUFDOzs7d0JBcURHLFNBQVM7Ozs7O0lBRTdCLHVCQUFXOzs7SUFBbEI7UUFDRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkMsV0FBVyxDQUFDLFNBQVMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1NBQzNDO1FBQ0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7S0FDOUI7Ozs7SUFFTSx1QkFBVzs7O0lBQWxCO1FBQ0UsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7S0FDN0I7Ozs7O0lBRU0scUJBQVM7Ozs7SUFBaEIsVUFBaUIsTUFBYzs7UUFDN0IsSUFBSSxJQUFJLEdBQVksTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQzdDLEVBQUUsQ0FBQyxDQUFDLElBQUks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Q0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7b0JBQ2hHLElBQUksTUFBTSxHQUFhLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzVDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDaEcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3hELFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUN4RCxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUVyRCxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNqRSxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNqRSxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNqRSxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNqRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO3FCQUNuQztpQkFDRjthQUNGO1NBQ0Y7S0FDRjs0QkFqVXVDLElBQUk7MkJBRVI7UUFDbEMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7S0FDdkQ7NEJBQ29DO1FBQ25DLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7S0FDdkY7MkJBQ3FDO1FBQ3BDO1lBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNO1NBQ2pCLEVBQUU7WUFDRCxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUk7U0FDZixFQUFFO1lBQ0QsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO1NBQ2YsRUFBRTtZQUNELEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSTtTQUNmLEVBQUU7WUFDRCxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUk7U0FDZixFQUFFO1lBQ0QsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO1NBQ2YsRUFBRTtZQUNELEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSTtTQUNmLEVBQUU7WUFDRCxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUk7U0FDZjtLQUNGO2tDQUM0QztRQUMzQztZQUNFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDWCxFQUFFO1lBQ0QsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRztTQUNoQixFQUFFO1lBQ0QsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRztTQUNqQixFQUFFO1lBQ0QsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRztTQUNsQixFQUFFO1lBQ0QsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztTQUNkLEVBQUUsSUFBSSxLQUFLLENBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQVMsQ0FBQyxDQUFDO0tBQ3BFO3NCQTdESDs7U0FjYSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQSUNJbnRlcmZhY2V9IGZyb20gXCIuL1BJQ0ludGVyZmFjZVwiO1xyXG5pbXBvcnQge1V0aWxTdHJCeXRlTW9kZX0gZnJvbSBcIi4vVXRpbFN0ckJ5dGVNb2RlXCI7XHJcbmltcG9ydCB7TlN0cmluZywgTk51bWJlcn0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcblxyXG5jb25zdCBNQVhfR0VOR086IG51bWJlciA9IDU7XHJcbmNvbnN0IElEWF9VUFBFUkNBU0VfQUxQSEE6IG51bWJlciA9IDA7XHJcbmNvbnN0IElEWF9MT1dFUkNBU0VfQUxQSEE6IG51bWJlciA9IDE7XHJcbmNvbnN0IElEWF9LQU5KSTogbnVtYmVyID0gMjtcclxuY29uc3QgSURYX1lFQVI6IG51bWJlciA9IDA7XHJcbmNvbnN0IElEWF9NT05USDogbnVtYmVyID0gMTtcclxuY29uc3QgSURYX0RBWTogbnVtYmVyID0gMjtcclxuY29uc3QgSURYX0RPWTogbnVtYmVyID0gMztcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgVXRpbERhdGVKcG4ge1xyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgLy8vICAgVXRpbGl0eSBDbGFzcyBmb3IgSmFwYW5lc2UgZGF0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxhdXRob3I+ICBUb3NoaXJvIE5ha2F5b3NoaSAoTVNKKVxyXG4gIC8vLyA8L2F1dGhvcj5cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBVdGlsRGF0ZUpwbiA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIEp3ZWVrU3RyOiBzdHJpbmdbXSA9IFtcclxuICAgIFwiICAgXCIsIFwi5pel5puc5pelXCIsIFwi5pyI5puc5pelXCIsIFwi54Gr5puc5pelXCIsIFwi5rC05puc5pelXCIsIFwi5pyo5puc5pelXCIsIFwi6YeR5puc5pelXCIsIFwi5Zyf5puc5pelXCJcclxuICBdO1xyXG4gIHByaXZhdGUgc3RhdGljIEptb250aFN0cjogc3RyaW5nW10gPSBbXHJcbiAgICBcIlwiLCBcIiAx5pyIXCIsIFwiIDLmnIhcIiwgXCIgM+aciFwiLCBcIiA05pyIXCIsIFwiIDXmnIhcIiwgXCIgNuaciFwiLCBcIiA35pyIXCIsIFwiIDjmnIhcIiwgXCIgOeaciFwiLCBcIjEw5pyIXCIsIFwiMTHmnIhcIiwgXCIxMuaciFwiXHJcbiAgXTtcclxuICBwcml2YXRlIHN0YXRpYyBHZW5nb1N0cjogc3RyaW5nW11bXSA9IFtcclxuICAgIFtcclxuICAgICAgXCI/XCIsIFwiP1wiLCBcIj8/Pz9cIlxyXG4gICAgXSwgW1xyXG4gICAgICBcIk1cIiwgXCJtXCIsIFwi5piO5rK7XCJcclxuICAgIF0sIFtcclxuICAgICAgXCJUXCIsIFwidFwiLCBcIuWkp+ato1wiXHJcbiAgICBdLCBbXHJcbiAgICAgIFwiU1wiLCBcInNcIiwgXCLmmK3lkoxcIlxyXG4gICAgXSwgW1xyXG4gICAgICBcIkhcIiwgXCJoXCIsIFwi5bmz5oiQXCJcclxuICAgIF0sIFtcclxuICAgICAgXCI/XCIsIFwiP1wiLCBcIu+8n++8n1wiXHJcbiAgICBdLCBbXHJcbiAgICAgIFwiP1wiLCBcIj9cIiwgXCLvvJ/vvJ9cIlxyXG4gICAgXSwgW1xyXG4gICAgICBcIj9cIiwgXCI/XCIsIFwi77yf77yfXCJcclxuICAgIF1cclxuICBdO1xyXG4gIHByaXZhdGUgc3RhdGljIFN0YXJ0RGF5T2ZHZW5nbzogbnVtYmVyW11bXSA9IFtcclxuICAgIFtcclxuICAgICAgMSwgMSwgMSwgMVxyXG4gICAgXSwgW1xyXG4gICAgICAxODY4LCA5LCA4LCAyNTJcclxuICAgIF0sIFtcclxuICAgICAgMTkxMiwgNiwgMzAsIDIxMlxyXG4gICAgXSwgW1xyXG4gICAgICAxOTI2LCAxMiwgMjUsIDM1OVxyXG4gICAgXSwgW1xyXG4gICAgICAxOTg5LCAxLCA4LCA4XHJcbiAgICBdLCBuZXcgQXJyYXk8bnVtYmVyPig0KSwgbmV3IEFycmF5PG51bWJlcj4oNCksIG5ldyBBcnJheTxudW1iZXI+KDQpXHJcbiAgXTtcclxuXHJcbiAgLy8gLS0tLSBnZW5nbyAodGhlIG5hbWUgb2YgYW4gZXJhKSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgcHJpdmF0ZSBNYXhHZW5nbzogbnVtYmVyID0gTUFYX0dFTkdPO1xyXG5cclxuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVXRpbERhdGVKcG4ge1xyXG4gICAgaWYgKFV0aWxEYXRlSnBuLl9pbnN0YW5jZSA9PT0gbnVsbCkge1xyXG4gICAgICBVdGlsRGF0ZUpwbi5faW5zdGFuY2UgPSBuZXcgVXRpbERhdGVKcG4oKTtcclxuICAgIH1cclxuICAgIHJldHVybiBVdGlsRGF0ZUpwbi5faW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0QXJyYXlEb3coKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFV0aWxEYXRlSnBuLkp3ZWVrU3RyO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFN0ckRvdyhpbnRJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgZmxhZzogYm9vbGVhbiA9IGludElkeCA8IDAgfHwgNyA8IGludElkeDtcclxuICAgIGlmIChmbGFnKSB7XHJcbiAgICAgIGludElkeCA9IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVXRpbERhdGVKcG4uSndlZWtTdHJbaW50SWR4XTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjb252ZXJ0U3RyTW9udGgobW9udGg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgZmxhZzogYm9vbGVhbiA9IG1vbnRoIDwgMCB8fCAxMiA8IG1vbnRoO1xyXG4gICAgaWYgKGZsYWcpIHtcclxuICAgICAgbW9udGggPSAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFV0aWxEYXRlSnBuLkptb250aFN0clttb250aF07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBhIHllYXIgKEEuRC4pIGludG8gSmFwYW5lc2UgeWVhciBvZiBhbiBlcmFcclxuICAvLy8gICBUaGlzIG1ldGhvZCBpcyBtb2RlbGVkIGFmdGVyIFwiZGF0ZV9qcG5feWVhcl9vZnNcIiBmdW5jdGlvbiBpblxyXG4gIC8vLyAgIFwiXFxtZ2xvY2FsXFxqcG5cXGpwbmRhdGVfanBuLmNwcFwiLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRZZWFyOlwiPnllYXIgKEEuRC4pXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnREb3k6XCI+RE9ZXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB5ZWFyIG9mIGFuIGVyYS5cclxuICAvLy8gICBpZiBlaXRoZXIgcGFyYW0gaXMgaW52YWxpZCwgaXQgcmV0dXJucyAwLlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZGF0ZV9qcG5feWVhcl9vZnMoaW50WWVhcjogbnVtYmVyLCBpbnREb3k6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXI7XHJcbiAgICBpZiAoaW50WWVhciA8IDEgfHwgaW50RG95IDwgMSkge1xyXG4gICAgICByZXN1bHQgPSAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBudW06IG51bWJlciA9IHRoaXMuTWF4R2VuZ28gLSAxO1xyXG4gICAgICB3aGlsZSAoaW50WWVhciA8IFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1tudW1dWzBdKSB7XHJcbiAgICAgICAgbnVtID0gbnVtIC0gMTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaW50WWVhciA9PT0gVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvW251bV1bMF0gJiYgaW50RG95IDwgVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvW251bV1bM10pIHtcclxuICAgICAgICBudW0gPSBudW0gLSAxO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc3VsdCA9IGludFllYXIgLSBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bbnVtXVswXSArIDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbnZlcnQgYSB5ZWFyIChBLkQuKSBpbnRvIGEgbmFtZSBvZiBhIEphcGFuZXNlIGVyYVxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIGlzIG1vZGVsZWQgYWZ0ZXIgXCJkYXRlX2pwbl95cl8yX2FcIiBmdW5jdGlvbiBpblxyXG4gIC8vLyAgIFwiXFxtZ2xvY2FsXFxqcG5cXGpwbmRhdGVfanBuLmNwcFwiLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRZZWFyOlwiPnllYXIgKEEuRC4pXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnREb3k6XCI+RE9ZXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0thbmppOlwiPnJldHVybiBhIGZ1bGwgbmFtZSAodHJ1ZSkgb3IgdGhlIGZpcnN0IGxldHRlciAoZmFsc2UpLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbmFtZSBvZiBhbiBlcmFcclxuICAvLy8gICBpZiBlaXRoZXIgcGFyYW0gaXMgaW52YWxpZCwgaXQgcmV0dXJucyBcIj9cIi5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGRhdGVfanBuX3lyXzJfYShpbnRZZWFyOiBudW1iZXIsIGludERveTogbnVtYmVyLCBpc0thbmppOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBudW06IG51bWJlcjtcclxuICAgIGlmIChpbnRZZWFyIDwgMSB8fCBpbnREb3kgPCAxKSB7XHJcbiAgICAgIG51bSA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbnVtID0gdGhpcy5NYXhHZW5nbyAtIDE7XHJcbiAgICAgIHdoaWxlIChpbnRZZWFyIDwgVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvW251bV1bMF0pIHtcclxuICAgICAgICBudW0gPSBudW0gLSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpbnRZZWFyID09PSBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bbnVtXVswXSAmJiBpbnREb3kgPCBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bbnVtXVszXSkge1xyXG4gICAgICAgIG51bSA9IG51bSAtIDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuICAgIGlmIChpc0thbmppKSB7XHJcbiAgICAgIHJlc3VsdCA9IFV0aWxEYXRlSnBuLkdlbmdvU3RyW251bV1bMl07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gVXRpbERhdGVKcG4uR2VuZ29TdHJbbnVtXVswXTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBmaXJzdCB5ZWFyIChBLkQuKSBvZiBhIHNwZWNpZmllZCBKYXBhbmVzZSBlcmFcclxuICAvLy8gICBUaGlzIG1ldGhvZCBpcyBtb2RlbGVkIGFmdGVyIFwiZGF0ZV9qcG5feXJfNF9hXCIgZnVuY3Rpb24gaW5cclxuICAvLy8gICBcIlxcbWdsb2NhbFxcanBuXFxqcG5kYXRlX2pwbi5jcHBcIi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidWNwX3N0cjpcIj5uYW1lIG9mIGEgc3BlY2lmaWVkIEphcGFuZXNlIGVyYVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic19sZW46XCI+bGVuZ3RoICh0aGUgbnVtYmVyIG9mIGJ5dGVzKSBvZiB1Y3Bfc3RyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB5ZWFyIChBLkQuKVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBkYXRlX2pwbl95cl80X2EodWNwX3N0cjogc3RyaW5nLCBzX2xlbjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBpOiBudW1iZXIgPSB0aGlzLk1heEdlbmdvIC0gMTtcclxuICAgIGlmIChzX2xlbiA+IDApIHtcclxuICAgICAgaWYgKHNfbGVuID4gMSkge1xyXG4gICAgICAgIHVjcF9zdHIgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIodWNwX3N0ciwgc19sZW4pO1xyXG4gICAgICB9XHJcbiAgICAgIHdoaWxlIChpID4gMCkge1xyXG4gICAgICAgIGlmIChzX2xlbiA9PT0gMSkge1xyXG4gICAgICAgICAgaWYgKHVjcF9zdHIgPT09IFV0aWxEYXRlSnBuLkdlbmdvU3RyW2ldWzBdIHx8IHVjcF9zdHIgPT09IFV0aWxEYXRlSnBuLkdlbmdvU3RyW2ldWzFdKSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmIChzX2xlbiA+IDEpIHtcclxuICAgICAgICAgICAgbGV0IHRleHQ6IHN0cmluZyA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihVdGlsRGF0ZUpwbi5HZW5nb1N0cltpXVsyXSwgc19sZW4pO1xyXG4gICAgICAgICAgICBpZiAodWNwX3N0ciA9PT0gdGV4dCkge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGkgPSBpIC0gMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyO1xyXG4gICAgaWYgKGkgPiAwKSB7XHJcbiAgICAgIHJlc3VsdCA9IFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1tpXVswXTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zdCB0ZXh0OiBzdHJpbmcgPSB1Y3Bfc3RyLnN1YnN0cigwLCAxKTtcclxuICAgICAgaWYgKHRleHQgPT09IFwiIFwiIHx8IHRleHQgPT09IFwiP1wiKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXN1bHQgPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCB0aGUgbmFtZSBvZiBhbiBlcmEgaW4gZGF0ZSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyRGF0ZTpcIj5zdHJpbmcgb2YgaW5wdXQgc3RyRGF0ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyUGljdHVyZTpcIj5zdHJpbmcgb2YgcGljdHVyZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW50U3RhcnRQb3M6XCI+c3RhcnQgcG9zaXRpb24gdG8gc2VhcmNoXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBuYW1lIG9mIGFuIGVyYVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RXJhTmFtZVN0ckluRGF0ZShzdHJEYXRlOiBzdHJpbmcsIHN0clBpY3R1cmU6IHN0cmluZywgaW50U3RhcnRQb3M6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IGludFBpY0lkeE9mczogbnVtYmVyID0gMDtcclxuICAgIGxldCBpOiBudW1iZXIgPSBpbnRTdGFydFBvcztcclxuICAgIHdoaWxlIChpICsgaW50UGljSWR4T2ZzIDwgc3RyUGljdHVyZS5sZW5ndGgpIHtcclxuICAgICAgbGV0IGludExldHRlcnM6IG51bWJlcjtcclxuICAgICAgaWYgKHN0clBpY3R1cmUuY2hhckNvZGVBdChpICsgaW50UGljSWR4T2ZzKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTEpIHtcclxuICAgICAgICBpbnRMZXR0ZXJzID0gMTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoc3RyUGljdHVyZS5jaGFyQ29kZUF0KGkgKyBpbnRQaWNJZHhPZnMpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMikge1xyXG4gICAgICAgICAgaW50TGV0dGVycyA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHN0clBpY3R1cmUuY2hhckNvZGVBdChpICsgaW50UGljSWR4T2ZzKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTQpIHtcclxuICAgICAgICAgICAgaW50TGV0dGVycyA9IDI7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJZiBcInN0ckRhdGVcIiBjb250YWlucyBEQkNTLCB0aGUgcG9zaXRpb24gb2YgXCJzdHJQaWN0dXJlXCIgaGFzIHRvIHNraXAgbmV4dCBpbmRleC5cclxuICAgICAgICAgICAgaWYgKGkgPCBzdHJEYXRlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGlmICghVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKHN0ckRhdGVbaV0pICYmIFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChzdHJQaWN0dXJlW2kgKyBpbnRQaWNJZHhPZnNdKSkge1xyXG4gICAgICAgICAgICAgICAgaW50UGljSWR4T2ZzID0gaW50UGljSWR4T2ZzICsgMTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0ID0gc3RyRGF0ZS5zdWJzdHIoaSwgaW50TGV0dGVycyk7XHJcbiAgICAgIGJyZWFrOyAvLyBleGl0IGxvb3BcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgb2YgYW4gZXJhIGluIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyUGljdHVyZVwiPnN0cmluZyBvZiBwaWN0dXJlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRTdGFydFBvc1wiPnN0YXJ0IHBvc2l0aW9uIHRvIHNlYXJjaFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbGVuZ3RoIG9mIHRoZSBuYW1lICh0aGUgbnVtYmVyIG9mIGJ5dGVzKVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RXJhTmFtZUxlbkluUGljdHVyZShzdHJQaWN0dXJlOiBzdHJpbmcsIGludFN0YXJ0UG9zOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGludExldHRlcnM6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBpbnRTdGFydFBvczsgaSA8IHN0clBpY3R1cmUubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgaWYgKHN0clBpY3R1cmUuY2hhckNvZGVBdChpKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTEpIHtcclxuICAgICAgICBpbnRMZXR0ZXJzID0gMTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoc3RyUGljdHVyZS5jaGFyQ29kZUF0KGkpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMikge1xyXG4gICAgICAgICAgaW50TGV0dGVycyA9IDI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHN0clBpY3R1cmUuY2hhckNvZGVBdChpKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTQpIHtcclxuICAgICAgICAgICAgaW50TGV0dGVycyA9IDQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChpbnRMZXR0ZXJzID4gMCkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW50TGV0dGVycztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIHN0YXJ0IHllYXIgb2YgYW4gZXJhIGluIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyRGF0ZTpcIj5zdHJpbmcgb2YgaW5wdXQgc3RyRGF0ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyUGljdHVyZTpcIj5zdHJpbmcgb2YgcGljdHVyZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gc3RhcnQgeWVhciBvZiB0aGUgZXJhXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXRTdGFydFllYXJPZkVyYShzdHJEYXRlOiBzdHJpbmcsIHN0clBpY3R1cmU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgZXJhTmFtZVN0ckluRGF0ZTogc3RyaW5nID0gVXRpbERhdGVKcG4uZ2V0RXJhTmFtZVN0ckluRGF0ZShzdHJEYXRlLCBzdHJQaWN0dXJlLCAwKTtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlcjtcclxuICAgIGlmIChlcmFOYW1lU3RySW5EYXRlID09PSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IGVyYU5hbWVMZW5JblBpY3R1cmU6IG51bWJlciA9IFV0aWxEYXRlSnBuLmdldEVyYU5hbWVMZW5JblBpY3R1cmUoc3RyUGljdHVyZSwgMCk7XHJcbiAgICAgIGlmIChlcmFOYW1lTGVuSW5QaWN0dXJlID09PSAwKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gMDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgaW50U3RhcnRZZWFyT2ZFcmE6IG51bWJlciA9IHRoaXMuZGF0ZV9qcG5feXJfNF9hKGVyYU5hbWVTdHJJbkRhdGUsIGVyYU5hbWVMZW5JblBpY3R1cmUpO1xyXG4gICAgICAgIHJlc3VsdCA9IGludFN0YXJ0WWVhck9mRXJhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBBZGQgZXh0cmEgR2VuZ28gZGF0YSBpbnRvIHRoZSBHZW5nbyB0YWJsZXM8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyRXh0cmFHZW5nbzpcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBhZGRFeHRyYUdlbmdvKHN0ckV4dHJhR2VuZ286IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gZS5nLiBzdHJFeHRyYUdlbmdvID0gXCIyMDEyLzA0LzAxLDA5MixBYUFCQ0Q7MjAxMy8wNC8wMSwwOTEsV3dXWFlaO1wiXHJcbiAgICBsZXQgYXJyYXk6IHN0cmluZ1tdID0gc3RyRXh0cmFHZW5nby5zcGxpdCgnOycpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8PSBhcnJheS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBpZiAoYXJyYXlbaV0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBhcnJheTI6IHN0cmluZ1tdID0gYXJyYXlbaV0uc3BsaXQoJywnKTtcclxuICAgICAgICBpZiAoYXJyYXkyLmxlbmd0aCA9PT0gMiAmJiBhcnJheTJbMF0ubGVuZ3RoID4gMCAmJiBhcnJheTJbMV0ubGVuZ3RoID4gMCAmJiBhcnJheTJbMl0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IGFycmF5Mzogc3RyaW5nW10gPSBhcnJheTJbMF0uc3BsaXQoJy8nKTtcclxuICAgICAgICAgIGlmIChhcnJheTMubGVuZ3RoID09PSAyICYmIGFycmF5M1swXS5sZW5ndGggPiAwICYmIGFycmF5M1sxXS5sZW5ndGggPiAwICYmIGFycmF5M1syXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIFV0aWxEYXRlSnBuLkdlbmdvU3RyWzUgKyBpXVswXSA9IGFycmF5MlsyXS5zdWJzdHIoMCwgMSk7IC8vIHN5bWJvbCBuYW1lICh1cHBlciBjYXNlKTogQVxyXG4gICAgICAgICAgICBVdGlsRGF0ZUpwbi5HZW5nb1N0cls1ICsgaV1bMV0gPSBhcnJheTJbMl0uc3Vic3RyKDEsIDEpOyAvLyBzeW1ib2wgbmFtZSAobG93ZXIgY2FzZSk6IGFcclxuICAgICAgICAgICAgVXRpbERhdGVKcG4uR2VuZ29TdHJbNSArIGldWzJdID0gYXJyYXkyWzJdLnN1YnN0cigyKTsgICAgLy8gZ2VuZ28gbmFtZTogQUJDRFxyXG5cclxuICAgICAgICAgICAgVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvWzUgKyBpXVswXSA9IE5OdW1iZXIuUGFyc2UoYXJyYXkzWzBdKTsgICAgLy8gc3RhcnQgeWVhcjogMjAxMlxyXG4gICAgICAgICAgICBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bNSArIGldWzFdID0gTk51bWJlci5QYXJzZShhcnJheTNbMV0pOyAgICAvLyBzdGFydCBtb250aDogNFxyXG4gICAgICAgICAgICBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bNSArIGldWzJdID0gTk51bWJlci5QYXJzZShhcnJheTNbMl0pOyAgICAvLyBzdGFydCBkYXk6IDFcclxuICAgICAgICAgICAgVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvWzUgKyBpXVszXSA9IE5OdW1iZXIuUGFyc2UoYXJyYXkyWzFdKTsgICAgLy8gZGF5cyBzaW5jZSBKYW51YXJ5IDE6IDkyXHJcbiAgICAgICAgICAgIHRoaXMuTWF4R2VuZ28gPSB0aGlzLk1heEdlbmdvICsgMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19