@magic-xpa/utils
Version:
magic utils package
630 lines • 50.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() {
/// <summary>
/// JPN: Japanese date picture support
/// Utility Class for Japanese date
/// </summary>
/// <author> Toshiro Nakayoshi (MSJ)
/// </author>
// ---- gengo (the name of an era) ---------------------------------------
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>
/// <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 =
/// <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 {?}
*/
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>
/// <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 =
/// <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 {?}
*/
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;
};
/// <summary>
/// Get the first year (A.D.) of a specified Japanese era
/// This method is modeled after "date_jpn_yr_4_a" function in
/// "\mglocal\jpn\jpndate_jpn.cpp".
/// </summary>
/// <param name = "ucp_str:">name of a specified Japanese era
/// </param>
/// <param name = "s_len:">length (the number of bytes) of ucp_str
/// </param>
/// <returns> year (A.D.)
/// </returns>
/// <summary>
/// Get the first year (A.D.) of a specified Japanese era
/// This method is modeled after "date_jpn_yr_4_a" function in
/// "\mglocal\jpn\jpndate_jpn.cpp".
/// </summary>
/// <param name = "ucp_str:">name of a specified Japanese era
/// </param>
/// <param name = "s_len:">length (the number of bytes) of ucp_str
/// </param>
/// <returns> year (A.D.)
/// </returns>
/**
* @param {?} ucp_str
* @param {?} s_len
* @return {?}
*/
UtilDateJpn.prototype.date_jpn_yr_4_a =
/// <summary>
/// Get the first year (A.D.) of a specified Japanese era
/// This method is modeled after "date_jpn_yr_4_a" function in
/// "\mglocal\jpn\jpndate_jpn.cpp".
/// </summary>
/// <param name = "ucp_str:">name of a specified Japanese era
/// </param>
/// <param name = "s_len:">length (the number of bytes) of ucp_str
/// </param>
/// <returns> year (A.D.)
/// </returns>
/**
* @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;
};
/// <summary>
/// Get the name of an era in date string
/// </summary>
/// <param name = "strDate:">string of input strDate
/// </param>
/// <param name = "strPicture:">string of picture
/// </param>
/// <param name = "intStartPos:">start position to search
/// </param>
/// <returns> name of an era
/// </returns>
/// <summary>
/// Get the name of an era in date string
/// </summary>
/// <param name = "strDate:">string of input strDate
/// </param>
/// <param name = "strPicture:">string of picture
/// </param>
/// <param name = "intStartPos:">start position to search
/// </param>
/// <returns> name of an era
/// </returns>
/**
* @param {?} strDate
* @param {?} strPicture
* @param {?} intStartPos
* @return {?}
*/
UtilDateJpn.getEraNameStrInDate =
/// <summary>
/// Get the name of an era in date string
/// </summary>
/// <param name = "strDate:">string of input strDate
/// </param>
/// <param name = "strPicture:">string of picture
/// </param>
/// <param name = "intStartPos:">start position to search
/// </param>
/// <returns> name of an era
/// </returns>
/**
* @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;
};
/// <summary>
/// Get the length of the name of an era in picture
/// </summary>
/// <param name = "strPicture">string of picture
/// </param>
/// <param name = "intStartPos">start position to search
/// </param>
/// <returns> length of the name (the number of bytes)
/// </returns>
/// <summary>
/// Get the length of the name of an era in picture
/// </summary>
/// <param name = "strPicture">string of picture
/// </param>
/// <param name = "intStartPos">start position to search
/// </param>
/// <returns> length of the name (the number of bytes)
/// </returns>
/**
* @param {?} strPicture
* @param {?} intStartPos
* @return {?}
*/
UtilDateJpn.getEraNameLenInPicture =
/// <summary>
/// Get the length of the name of an era in picture
/// </summary>
/// <param name = "strPicture">string of picture
/// </param>
/// <param name = "intStartPos">start position to search
/// </param>
/// <returns> length of the name (the number of bytes)
/// </returns>
/**
* @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>
/// <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 =
/// <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 {?}
*/
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>
/// <summary> Add extra Gengo data into the Gengo tables</summary>
/// <param name="strExtraGengo:">
/// </param>
/// <returns>
/// </returns>
/**
* @param {?} strExtraGengo
* @return {?}
*/
UtilDateJpn.prototype.addExtraGengo =
/// <summary> Add extra Gengo data into the Gengo tables</summary>
/// <param name="strExtraGengo:">
/// </param>
/// <returns>
/// </returns>
/**
* @param {?} strExtraGengo
* @return {?}
*/
function (strExtraGengo) {
// e.g. strExtraGengo = "2012/04/01,092,AaABCD;2013/04/01,091,WwWXYZ;"
/** @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbERhdGVKcG4uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbWFnaWMteHBhL3V0aWxzLyIsInNvdXJjZXMiOlsic3JjL1V0aWxEYXRlSnBuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBVSxPQUFPLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQzs7SUFFaEQsU0FBUyxHQUFXLENBQUM7O0lBQ3JCLG1CQUFtQixHQUFXLENBQUM7O0lBQy9CLG1CQUFtQixHQUFXLENBQUM7O0lBQy9CLFNBQVMsR0FBVyxDQUFDOztJQUNyQixRQUFRLEdBQVcsQ0FBQzs7SUFDcEIsU0FBUyxHQUFXLENBQUM7O0lBQ3JCLE9BQU8sR0FBVyxDQUFDOztJQUNuQixPQUFPLEdBQVcsQ0FBQztBQUd6QjtJQUFBO1FBQ0UsYUFBYTtRQUNiLHdDQUF3QztRQUN4QyxxQ0FBcUM7UUFDckMsY0FBYztRQUNkLHFDQUFxQztRQUNyQyxhQUFhO1FBMkNiLDJFQUEyRTtRQUNuRSxhQUFRLEdBQVcsU0FBUyxDQUFDO0lBd1J2QyxDQUFDOzs7O0lBdFJRLHVCQUFXOzs7SUFBbEI7UUFDRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkMsV0FBVyxDQUFDLFNBQVMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzVDLENBQUM7UUFDRCxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUMvQixDQUFDOzs7O0lBRU0sdUJBQVc7OztJQUFsQjtRQUNFLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO0lBQzlCLENBQUM7Ozs7O0lBRU0scUJBQVM7Ozs7SUFBaEIsVUFBaUIsTUFBYzs7WUFDekIsSUFBSSxHQUFZLE1BQU0sR0FBRyxDQUFDLElBQUks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QUNELEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSTtTQUNmLEVBQUU7WUFDRCxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUk7U0FDZjtLQUNGLENBQUM7SUFDYSwyQkFBZSxHQUFlO1FBQzNDO1lBQ0UsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztTQUNYLEVBQUU7WUFDRCxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHO1NBQ2hCLEVBQUU7WUFDRCxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHO1NBQ2pCLEVBQUU7WUFDRCxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHO1NBQ2xCLEVBQUU7WUFDRCxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1NBQ2QsRUFBRSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUM7S0FDcEUsQ0FBQztJQTJSSixrQkFBQztDQUFBLEFBMVVELElBMFVDO1NBMVVZLFdBQVc7OztJQVF0QixzQkFBNkM7O0lBRTdDLHFCQUVFOztJQUNGLHNCQUVFOztJQUNGLHFCQWtCRTs7SUFDRiw0QkFZRTs7SUFHRiwrQkFBcUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1BJQ0ludGVyZmFjZX0gZnJvbSBcIi4vUElDSW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7VXRpbFN0ckJ5dGVNb2RlfSBmcm9tIFwiLi9VdGlsU3RyQnl0ZU1vZGVcIjtcclxuaW1wb3J0IHtOU3RyaW5nLCBOTnVtYmVyfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuXHJcbmNvbnN0IE1BWF9HRU5HTzogbnVtYmVyID0gNTtcclxuY29uc3QgSURYX1VQUEVSQ0FTRV9BTFBIQTogbnVtYmVyID0gMDtcclxuY29uc3QgSURYX0xPV0VSQ0FTRV9BTFBIQTogbnVtYmVyID0gMTtcclxuY29uc3QgSURYX0tBTkpJOiBudW1iZXIgPSAyO1xyXG5jb25zdCBJRFhfWUVBUjogbnVtYmVyID0gMDtcclxuY29uc3QgSURYX01PTlRIOiBudW1iZXIgPSAxO1xyXG5jb25zdCBJRFhfREFZOiBudW1iZXIgPSAyO1xyXG5jb25zdCBJRFhfRE9ZOiBudW1iZXIgPSAzO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBVdGlsRGF0ZUpwbiB7XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAvLy8gICBVdGlsaXR5IENsYXNzIGZvciBKYXBhbmVzZSBkYXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPGF1dGhvcj4gIFRvc2hpcm8gTmFrYXlvc2hpIChNU0opXHJcbiAgLy8vIDwvYXV0aG9yPlxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFV0aWxEYXRlSnBuID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgSndlZWtTdHI6IHN0cmluZ1tdID0gW1xyXG4gICAgXCIgICBcIiwgXCLml6Xmm5zml6VcIiwgXCLmnIjmm5zml6VcIiwgXCLngavmm5zml6VcIiwgXCLmsLTmm5zml6VcIiwgXCLmnKjmm5zml6VcIiwgXCLph5Hmm5zml6VcIiwgXCLlnJ/mm5zml6VcIlxyXG4gIF07XHJcbiAgcHJpdmF0ZSBzdGF0aWMgSm1vbnRoU3RyOiBzdHJpbmdbXSA9IFtcclxuICAgIFwiXCIsIFwiIDHmnIhcIiwgXCIgMuaciFwiLCBcIiAz5pyIXCIsIFwiIDTmnIhcIiwgXCIgNeaciFwiLCBcIiA25pyIXCIsIFwiIDfmnIhcIiwgXCIgOOaciFwiLCBcIiA55pyIXCIsIFwiMTDmnIhcIiwgXCIxMeaciFwiLCBcIjEy5pyIXCJcclxuICBdO1xyXG4gIHByaXZhdGUgc3RhdGljIEdlbmdvU3RyOiBzdHJpbmdbXVtdID0gW1xyXG4gICAgW1xyXG4gICAgICBcIj9cIiwgXCI/XCIsIFwiPz8/P1wiXHJcbiAgICBdLCBbXHJcbiAgICAgIFwiTVwiLCBcIm1cIiwgXCLmmI7msrtcIlxyXG4gICAgXSwgW1xyXG4gICAgICBcIlRcIiwgXCJ0XCIsIFwi5aSn5q2jXCJcclxuICAgIF0sIFtcclxuICAgICAgXCJTXCIsIFwic1wiLCBcIuaYreWSjFwiXHJcbiAgICBdLCBbXHJcbiAgICAgIFwiSFwiLCBcImhcIiwgXCLlubPmiJBcIlxyXG4gICAgXSwgW1xyXG4gICAgICBcIj9cIiwgXCI/XCIsIFwi77yf77yfXCJcclxuICAgIF0sIFtcclxuICAgICAgXCI/XCIsIFwiP1wiLCBcIu+8n++8n1wiXHJcbiAgICBdLCBbXHJcbiAgICAgIFwiP1wiLCBcIj9cIiwgXCLvvJ/vvJ9cIlxyXG4gICAgXVxyXG4gIF07XHJcbiAgcHJpdmF0ZSBzdGF0aWMgU3RhcnREYXlPZkdlbmdvOiBudW1iZXJbXVtdID0gW1xyXG4gICAgW1xyXG4gICAgICAxLCAxLCAxLCAxXHJcbiAgICBdLCBbXHJcbiAgICAgIDE4NjgsIDksIDgsIDI1MlxyXG4gICAgXSwgW1xyXG4gICAgICAxOTEyLCA2LCAzMCwgMjEyXHJcbiAgICBdLCBbXHJcbiAgICAgIDE5MjYsIDEyLCAyNSwgMzU5XHJcbiAgICBdLCBbXHJcbiAgICAgIDE5ODksIDEsIDgsIDhcclxuICAgIF0sIG5ldyBBcnJheTxudW1iZXI+KDQpLCBuZXcgQXJyYXk8bnVtYmVyPig0KSwgbmV3IEFycmF5PG51bWJlcj4oNClcclxuICBdO1xyXG5cclxuICAvLyAtLS0tIGdlbmdvICh0aGUgbmFtZSBvZiBhbiBlcmEpICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICBwcml2YXRlIE1heEdlbmdvOiBudW1iZXIgPSBNQVhfR0VOR087XHJcblxyXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBVdGlsRGF0ZUpwbiB7XHJcbiAgICBpZiAoVXRpbERhdGVKcG4uX2luc3RhbmNlID09PSBudWxsKSB7XHJcbiAgICAgIFV0aWxEYXRlSnBuLl9pbnN0YW5jZSA9IG5ldyBVdGlsRGF0ZUpwbigpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFV0aWxEYXRlSnBuLl9pbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRBcnJheURvdygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gVXRpbERhdGVKcG4uSndlZWtTdHI7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0U3RyRG93KGludElkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBmbGFnOiBib29sZWFuID0gaW50SWR4IDwgMCB8fCA3IDwgaW50SWR4O1xyXG4gICAgaWYgKGZsYWcpIHtcclxuICAgICAgaW50SWR4ID0gMDtcclxuICAgIH1cclxuICAgIHJldHVybiBVdGlsRGF0ZUpwbi5Kd2Vla1N0cltpbnRJZHhdO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNvbnZlcnRTdHJNb250aChtb250aDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBmbGFnOiBib29sZWFuID0gbW9udGggPCAwIHx8IDEyIDwgbW9udGg7XHJcbiAgICBpZiAoZmxhZykge1xyXG4gICAgICBtb250aCA9IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVXRpbERhdGVKcG4uSm1vbnRoU3RyW21vbnRoXTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IGEgeWVhciAoQS5ELikgaW50byBKYXBhbmVzZSB5ZWFyIG9mIGFuIGVyYVxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIGlzIG1vZGVsZWQgYWZ0ZXIgXCJkYXRlX2pwbl95ZWFyX29mc1wiIGZ1bmN0aW9uIGluXHJcbiAgLy8vICAgXCJcXG1nbG9jYWxcXGpwblxcanBuZGF0ZV9qcG4uY3BwXCIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludFllYXI6XCI+eWVhciAoQS5ELilcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludERveTpcIj5ET1lcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHllYXIgb2YgYW4gZXJhLlxyXG4gIC8vLyAgIGlmIGVpdGhlciBwYXJhbSBpcyBpbnZhbGlkLCBpdCByZXR1cm5zIDAuXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBkYXRlX2pwbl95ZWFyX29mcyhpbnRZZWFyOiBudW1iZXIsIGludERveTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlcjtcclxuICAgIGlmIChpbnRZZWFyIDwgMSB8fCBpbnREb3kgPCAxKSB7XHJcbiAgICAgIHJlc3VsdCA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IG51bTogbnVtYmVyID0gdGhpcy5NYXhHZW5nbyAtIDE7XHJcbiAgICAgIHdoaWxlIChpbnRZZWFyIDwgVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvW251bV1bMF0pIHtcclxuICAgICAgICBudW0gPSBudW0gLSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpbnRZZWFyID09PSBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bbnVtXVswXSAmJiBpbnREb3kgPCBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bbnVtXVszXSkge1xyXG4gICAgICAgIG51bSA9IG51bSAtIDE7XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0ID0gaW50WWVhciAtIFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1tudW1dWzBdICsgMTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBhIHllYXIgKEEuRC4pIGludG8gYSBuYW1lIG9mIGEgSmFwYW5lc2UgZXJhXHJcbiAgLy8vICAgVGhpcyBtZXRob2QgaXMgbW9kZWxlZCBhZnRlciBcImRhdGVfanBuX3lyXzJfYVwiIGZ1bmN0aW9uIGluXHJcbiAgLy8vICAgXCJcXG1nbG9jYWxcXGpwblxcanBuZGF0ZV9qcG4uY3BwXCIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludFllYXI6XCI+eWVhciAoQS5ELilcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludERveTpcIj5ET1lcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzS2Fuamk6XCI+cmV0dXJuIGEgZnVsbCBuYW1lICh0cnVlKSBvciB0aGUgZmlyc3QgbGV0dGVyIChmYWxzZSkuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBuYW1lIG9mIGFuIGVyYVxyXG4gIC8vLyAgIGlmIGVpdGhlciBwYXJhbSBpcyBpbnZhbGlkLCBpdCByZXR1cm5zIFwiP1wiLlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZGF0ZV9qcG5feXJfMl9hKGludFllYXI6IG51bWJlciwgaW50RG95OiBudW1iZXIsIGlzS2Fuamk6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IG51bTogbnVtYmVyO1xyXG4gICAgaWYgKGludFllYXIgPCAxIHx8IGludERveSA8IDEpIHtcclxuICAgICAgbnVtID0gMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBudW0gPSB0aGlzLk1heEdlbmdvIC0gMTtcclxuICAgICAgd2hpbGUgKGludFllYXIgPCBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bbnVtXVswXSkge1xyXG4gICAgICAgIG51bSA9IG51bSAtIDE7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGludFllYXIgPT09IFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1tudW1dWzBdICYmIGludERveSA8IFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1tudW1dWzNdKSB7XHJcbiAgICAgICAgbnVtID0gbnVtIC0gMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nO1xyXG4gICAgaWYgKGlzS2FuamkpIHtcclxuICAgICAgcmVzdWx0ID0gVXRpbERhdGVKcG4uR2VuZ29TdHJbbnVtXVsyXTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSBVdGlsRGF0ZUpwbi5HZW5nb1N0cltudW1dWzBdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIGZpcnN0IHllYXIgKEEuRC4pIG9mIGEgc3BlY2lmaWVkIEphcGFuZXNlIGVyYVxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIGlzIG1vZGVsZWQgYWZ0ZXIgXCJkYXRlX2pwbl95cl80X2FcIiBmdW5jdGlvbiBpblxyXG4gIC8vLyAgIFwiXFxtZ2xvY2FsXFxqcG5cXGpwbmRhdGVfanBuLmNwcFwiLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ1Y3Bfc3RyOlwiPm5hbWUgb2YgYSBzcGVjaWZpZWQgSmFwYW5lc2UgZXJhXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzX2xlbjpcIj5sZW5ndGggKHRoZSBudW1iZXIgb2YgYnl0ZXMpIG9mIHVjcF9zdHJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHllYXIgKEEuRC4pXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGRhdGVfanBuX3lyXzRfYSh1Y3Bfc3RyOiBzdHJpbmcsIHNfbGVuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGk6IG51bWJlciA9IHRoaXMuTWF4R2VuZ28gLSAxO1xyXG4gICAgaWYgKHNfbGVuID4gMCkge1xyXG4gICAgICBpZiAoc19sZW4gPiAxKSB7XHJcbiAgICAgICAgdWNwX3N0ciA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0Qih1Y3Bfc3RyLCBzX2xlbik7XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKGkgPiAwKSB7XHJcbiAgICAgICAgaWYgKHNfbGVuID09PSAxKSB7XHJcbiAgICAgICAgICBpZiAodWNwX3N0ciA9PT0gVXRpbERhdGVKcG4uR2VuZ29TdHJbaV1bMF0gfHwgdWNwX3N0ciA9PT0gVXRpbERhdGVKcG4uR2VuZ29TdHJbaV1bMV0pIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHNfbGVuID4gMSkge1xyXG4gICAgICAgICAgICBsZXQgdGV4dDogc3RyaW5nID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKFV0aWxEYXRlSnBuLkdlbmdvU3RyW2ldWzJdLCBzX2xlbik7XHJcbiAgICAgICAgICAgIGlmICh1Y3Bfc3RyID09PSB0ZXh0KSB7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaSA9IGkgLSAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXI7XHJcbiAgICBpZiAoaSA+IDApIHtcclxuICAgICAgcmVzdWx0ID0gVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvW2ldWzBdO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRleHQ6IHN0cmluZyA9IHVjcF9zdHIuc3Vic3RyKDAsIDEpO1xyXG4gICAgICBpZiAodGV4dCA9PT0gXCIgXCIgfHwgdGV4dCA9PT0gXCI/XCIpIHtcclxuICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdCA9IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBuYW1lIG9mIGFuIGVyYSBpbiBkYXRlIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJEYXRlOlwiPnN0cmluZyBvZiBpbnB1dCBzdHJEYXRlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJQaWN0dXJlOlwiPnN0cmluZyBvZiBwaWN0dXJlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRTdGFydFBvczpcIj5zdGFydCBwb3NpdGlvbiB0byBzZWFyY2hcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG5hbWUgb2YgYW4gZXJhXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRFcmFOYW1lU3RySW5EYXRlKHN0ckRhdGU6IHN0cmluZywgc3RyUGljdHVyZTogc3RyaW5nLCBpbnRTdGFydFBvczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgaW50UGljSWR4T2ZzOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IGludFN0YXJ0UG9zO1xyXG4gICAgd2hpbGUgKGkgKyBpbnRQaWNJZHhPZnMgPCBzdHJQaWN0dXJlLmxlbmd0aCkge1xyXG4gICAgICBsZXQgaW50TGV0dGVyczogbnVtYmVyO1xyXG4gICAgICBpZiAoc3RyUGljdHVyZS5jaGFyQ29kZUF0KGkgKyBpbnRQaWNJZHhPZnMpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMSkge1xyXG4gICAgICAgIGludExldHRlcnMgPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChzdHJQaWN0dXJlLmNoYXJDb2RlQXQoaSArIGludFBpY0lkeE9mcykgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkyKSB7XHJcbiAgICAgICAgICBpbnRMZXR0ZXJzID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAoc3RyUGljdHVyZS5jaGFyQ29kZUF0KGkgKyBpbnRQaWNJZHhPZnMpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZNCkge1xyXG4gICAgICAgICAgICBpbnRMZXR0ZXJzID0gMjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIElmIFwic3RyRGF0ZVwiIGNvbnRhaW5zIERCQ1MsIHRoZSBwb3NpdGlvbiBvZiBcInN0clBpY3R1cmVcIiBoYXMgdG8gc2tpcCBuZXh0IGluZGV4LlxyXG4gICAgICAgICAgICBpZiAoaSA8IHN0ckRhdGUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoc3RyRGF0ZVtpXSkgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKHN0clBpY3R1cmVbaSArIGludFBpY0lkeE9mc10pKSB7XHJcbiAgICAgICAgICAgICAgICBpbnRQaWNJZHhPZnMgPSBpbnRQaWNJZHhPZnMgKyAxO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXN1bHQgPSBzdHJEYXRlLnN1YnN0cihpLCBpbnRMZXR0ZXJzKTtcclxuICAgICAgYnJlYWs7IC8vIGV4aXQgbG9vcFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBvZiBhbiBlcmEgaW4gcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJQaWN0dXJlXCI+c3RyaW5nIG9mIHBpY3R1cmVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludFN0YXJ0UG9zXCI+c3RhcnQgcG9zaXRpb24gdG8gc2VhcmNoXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBsZW5ndGggb2YgdGhlIG5hbWUgKHRoZSBudW1iZXIgb2YgYnl0ZXMpXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRFcmFOYW1lTGVuSW5QaWN0dXJlKHN0clBpY3R1cmU6IHN0cmluZywgaW50U3RhcnRQb3M6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgaW50TGV0dGVyczogbnVtYmVyID0gMDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IGludFN0YXJ0UG9zOyBpIDwgc3RyUGljdHVyZS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBpZiAoc3RyUGljdHVyZS5jaGFyQ29kZUF0KGkpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMSkge1xyXG4gICAgICAgIGludExldHRlcnMgPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChzdHJQaWN0dXJlLmNoYXJDb2RlQXQoaSkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkyKSB7XHJcbiAgICAgICAgICBpbnRMZXR0ZXJzID0gMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAoc3RyUGljdHVyZS5jaGFyQ29kZUF0KGkpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZNCkge1xyXG4gICAgICAgICAgICBpbnRMZXR0ZXJzID0gNDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGludExldHRlcnMgPiAwKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpbnRMZXR0ZXJzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCB0aGUgc3RhcnQgeWVhciBvZiBhbiBlcmEgaW4gcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJEYXRlOlwiPnN0cmluZyBvZiBpbnB1dCBzdHJEYXRlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJQaWN0dXJlOlwiPnN0cmluZyBvZiBwaWN0dXJlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdGFydCB5ZWFyIG9mIHRoZSBlcmFcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldFN0YXJ0WWVhck9mRXJhKHN0ckRhdGU6IHN0cmluZywgc3RyUGljdHVyZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBlcmFOYW1lU3RySW5EYXRlOiBzdHJpbmcgPSBVdGlsRGF0ZUpwbi5nZXRFcmFOYW1lU3RySW5EYXRlKHN0ckRhdGUsIHN0clBpY3R1cmUsIDApO1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyO1xyXG4gICAgaWYgKGVyYU5hbWVTdHJJbkRhdGUgPT09IG51bGwpIHtcclxuICAgICAgcmVzdWx0ID0gMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgZXJhTmFtZUxlbkluUGljdHVyZTogbnVtYmVyID0gVXRpbERhdGVKcG4uZ2V0RXJhTmFtZUxlbkluUGljdHVyZShzdHJQaWN0dXJlLCAwKTtcclxuICAgICAgaWYgKGVyYU5hbWVMZW5JblBpY3R1cmUgPT09IDApIHtcclxuICAgICAgICByZXN1bHQgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBpbnRTdGFydFllYXJPZkVyYTogbnVtYmVyID0gdGhpcy5kYXRlX2pwbl95cl80X2EoZXJhTmFtZVN0ckluRGF0ZSwgZXJhTmFtZUxlbkluUGljdHVyZSk7XHJcbiAgICAgICAgcmVzdWx0ID0gaW50U3RhcnRZZWFyT2ZFcmE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEFkZCBleHRyYSBHZW5nbyBkYXRhIGludG8gdGhlIEdlbmdvIHRhYmxlczwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJFeHRyYUdlbmdvOlwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGFkZEV4dHJhR2VuZ28oc3RyRXh0cmFHZW5nbzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBlLmcuIHN0ckV4dHJhR2VuZ28gPSBcIjIwMTIvMDQvMDEsMDkyLEFhQUJDRDsyMDEzLzA0LzAxLDA5MSxXd1dYWVo7XCJcclxuICAgIGxldCBhcnJheTogc3RyaW5nW10gPSBzdHJFeHRyYUdlbmdvLnNwbGl0KCc7Jyk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDw9IGFycmF5Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGlmIChhcnJheVtpXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IGFycmF5Mjogc3RyaW5nW10gPSBhcnJheVtpXS5zcGxpdCgnLCcpO1xyXG4gICAgICAgIGlmIChhcnJheTIubGVuZ3RoID09PSAyICYmIGFycmF5MlswXS5sZW5ndGggPiAwICYmIGFycmF5MlsxXS5sZW5ndGggPiAwICYmIGFycmF5MlsyXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBsZXQgYXJyYXkzOiBzdHJpbmdbXSA9IGFycmF5MlswXS5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgaWYgKGFycmF5My5sZW5ndGggPT09IDIgJiYgYXJyYXkzWzBdLmxlbmd0aCA+IDAgJiYgYXJyYXkzWzFdLmxlbmd0aCA+IDAgJiYgYXJyYXkzWzJdLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgVXRpbERhdGVKcG4uR2VuZ29TdHJbNSArIGldWzBdID0gYXJyYXkyWzJdLnN1YnN0cigwLCAxKTsgLy8gc3ltYm9sIG5hbWUgKHVwcGVyIGNhc2UpOiBBXHJcbiAgICAgICAgICAgIFV0aWxEYXRlSnBuLkdlbmdvU3RyWzUgKyBpXVsxXSA9IGFycmF5MlsyXS5zdWJzdHIoMSwgMSk7IC8vIHN5bWJvbCBuYW1lIChsb3dlciBjYXNlKTogYVxyXG4gICAgICAgICAgICBVdGlsRGF0ZUpwbi5HZW5nb1N0cls1ICsgaV1bMl0gPSBhcnJheTJbMl0uc3Vic3RyKDIpOyAgICAvLyBnZW5nbyBuYW1lOiBBQkNEXHJcblxyXG4gICAgICAgICAgICBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bNSArIGldWzBdID0gTk51bWJlci5QYXJzZShhcnJheTNbMF0pOyAgICAvLyBzdGFydCB5ZWFyOiAyMDEyXHJcbiAgICAgICAgICAgIFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1s1ICsgaV1bMV0gPSBOTnVtYmVyLlBhcnNlKGFycmF5M1sxXSk7ICAgIC8vIHN0YXJ0IG1vbnRoOiA0XHJcbiAgICAgICAgICAgIFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1s1ICsgaV1bMl0gPSBOTnVtYmVyLlBhcnNlKGFycmF5M1syXSk7ICAgIC8vIHN0YXJ0IGRheTogMVxyXG4gICAgICAgICAgICBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bNSArIGldWzNdID0gTk51bWJlci5QYXJzZShhcnJheTJbMV0pOyAgICAvLyBkYXlzIHNpbmNlIEphbnVhcnkgMTogOTJcclxuICAgICAgICAgICAgdGhpcy5N