(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/util/timetool.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict"; cc._RF.push(module, '3d6deCXZRlBIYTw21ghxclG', 'timetool'); // Scripts/util/timetool.js "use strict"; // -------------------------------------------------------------------- // @author: shiraho@syg.com(必填, 创建模块的人员) // @description: // 时间工具 //
Create: new Date().toISOString() // -------------------------------------------------------------------- var TimeTool = { // 获取时间转换的 //生成时间格式为00:00:00的(时:分:秒) getTimeFormat: function getTimeFormat(less_time) { less_time = Number(less_time) || 0; var hour = Math.floor(less_time / 3600); var min = Math.floor(less_time % 3600 / 60); var sec = less_time % 3600 % 60; hour = hour < 10 && "0" + hour || hour; min = min < 10 && "0" + min || min; sec = sec < 10 && "0" + sec || sec; return hour + ":" + min + ":" + sec; }, //生成时间格式为00:00的(分:秒) getMinSecTime: function getMinSecTime(less_time) { less_time = Number(less_time) || 0; var hour = Math.floor(less_time / 3600); var min = Math.floor(less_time % 3600 / 60); var sec = Math.floor(less_time % 3600 % 60); min = hour * 60 + min; min = min < 10 && "0" + min || min; sec = sec < 10 && "0" + sec || sec; return min + ":" + sec; }, //生成时间格式为00:00:00的(时:分:秒) getTimeFormatII: function getTimeFormatII(less_time) { less_time = Number(less_time) || 0; var hour = Math.floor(less_time / 3600); var min = Math.floor(less_time % 3600 / 60); var sec = Math.floor(less_time % 3600 % 60); if (sec <= 0) { if (min <= 0) { return hour + "小时"; } else { return hour + cc.js.formatStr("小时%s分", min); } } return hour + cc.js.formatStr("小时%s分%s秒", min, sec); }, //生成时间格式为00:00:00的(时:分) GetTimeFormatTwo: function GetTimeFormatTwo(less_time, is_num) { less_time = Number(less_time) || 0; var hour = Math.floor(less_time / 3600); var min = Math.floor(less_time % 3600 / 60); var sec = Math.floor(less_time % 3600 % 60); var str_hour = hour < 10 && "0" + hour || hour; var str_min = min < 10 && "0" + min || min; var str_sec = sec < 10 && "0" + sec || sec; if (hour <= 0) { if (is_num != null) { return str_min + ":" + str_sec; } return str_min + "分" + str_sec + "秒"; } else { if (is_num != null) { return str_hour + ":" + str_min; } return str_hour + "小时" + str_min + "分"; } }, //生成时间格式为00:00的(时:分) getTimeFormatIII: function getTimeFormatIII(less_time) { less_time = Number(less_time) || 0; var hour = Math.floor(less_time / 3600); var min = Math.floor(less_time % 3600 / 60); hour = hour < 10 && "0" + hour || hour; min = min < 10 && "0" + min || min; return hour + ":" + min; }, getTimeMs: function getTimeMs(less_time, isNum) { less_time = Number(less_time) || 0; var hour = Math.floor(less_time / 3600); var min = Math.floor(less_time % 3600 / 60); var sec = Math.floor(less_time % 3600 % 60); if (isNum != null) { sec = sec < 10 && "0" + sec || sec; var max_m = hour * 60 + min; max_m = max_m < 10 && "0" + max_m || max_m; return max_m + ":" + sec; } else { return cc.js.formatStr("%s分%s秒", hour * 60 + min, sec); } }, //传入时间戳,生成时间格式为(年-月-日 时:分:秒) getYMDHMS: function getYMDHMS(less_time) { return this.dateFtt("yyyy-MM-dd hh:mm:ss", less_time); }, //传入时间戳,生成时间格式为(月-日 时:分:秒) getMDHMS: function getMDHMS(less_time) { return this.dateFtt("MM-dd hh:mm:ss", less_time); }, //传入时间戳,生成时间格式为(月-日 ) getMD: function getMD(less_time) { return this.dateFtt("MM.dd", less_time); }, //传入时间戳,生成时间格式为(月-日 时:分) getMDHM: function getMDHM(less_time) { return this.dateFtt("MM-dd hh:mm", less_time); }, //传入时间戳,生成时间格式为(时:分:秒) getHMS: function getHMS(less_time) { return this.dateFtt("hh:mm:ss", less_time); }, //传入时间戳,生成时间格式为(年 时:分:秒) getYDHM: function getYDHM(less_time) { return this.dateFtt("yyyy hh:mm:ss", less_time); }, //传入时间戳,生成时间格式为(时:分) getHM: function getHM(less_time) { return this.dateFtt("hh:mm", less_time); }, //传入时间戳,生成时间格式为(分:秒) getMS: function getMS(less_time) { return this.dateFtt("mm:ss", less_time); }, //传入时间戳,生成时间格式为(年-月-日) getYMD: function getYMD(less_time) { return this.dateFtt("yyyy-MM-dd", less_time); }, //功能:传入时间戳,生成时间格式为(xxxx年xx月xx日) getYMD2: function getYMD2(less_time) { return this.dateFtt("yyyy" + Utils.TI18N("年") + "MM" + Utils.TI18N("月") + "dd" + Utils.TI18N("日"), less_time); }, getMD2: function getMD2(less_time) { var m = this.dateFtt("MM", less_time); var d = this.dateFtt("dd", less_time); return m + "月" + d + "日"; }, //获取距离第二天凌晨0点所剩下的时间 getOneDayLessTime: function getOneDayLessTime() {}, //格式输出 //(格式,时间戳) dateFtt: function dateFtt(fmt, less_time) { if (less_time == null) { return 0; } //需要13位时间戳(也即是毫秒) var date = new Date(less_time * 1000); var o = { "M+": date.getMonth() + 1, //月份 "d+": date.getDate(), //日 "h+": date.getHours(), //小时 "m+": date.getMinutes(), //分 "s+": date.getSeconds(), //秒 "q+": Math.floor((date.getMonth() + 3) / 3), //季度 "S": date.getMilliseconds() //毫秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) { if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)); } return fmt; }, //1天秒数 day2s: function day2s() { return 86400; }, getDayDifference: function getDayDifference(time_tmps) {}, //xx天xx小时xx分xx秒 getTimeFormatDay: function getTimeFormatDay(less_time) { less_time = Number(less_time) || 0; var day = Math.floor(less_time / TimeTool.day2s()); var lessT = Math.floor(less_time % TimeTool.day2s()); var hour = Math.floor(lessT / 3600); var min = Math.floor(lessT % 3600 / 60); var sec = Math.floor(lessT % 3600 % 60); var dayStr = ""; if (day >= 1) { dayStr = day + "天"; } if (day >= 1) { if (hour > 0) return dayStr + hour + "小时";else return dayStr; } else { if (sec <= 0) { if (min <= 0) { if (hour <= 0) return ""; return dayStr + hour + "小时"; } else return dayStr + hour + cc.js.formatStr("小时%s分", min); } return dayStr + hour + cc.js.formatStr("小时%s分", min); } }, //大于1天显示xx天 小于一天显示xx小时xx分xx秒 getTimeDayOrTime: function getTimeDayOrTime(less_time) { less_time = Number(less_time) || 0; var day = Math.floor(less_time / TimeTool.day2s()); var dayStr = ""; if (day >= 1) { dayStr = day + "天"; return dayStr; } if (day < 1) return os.date("%X ", less_time); }, //显示两单位计时 getTimeFormatDayII: function getTimeFormatDayII(less_time) { less_time = Number(less_time) || 0; var day = Math.floor(less_time / 86400); var lessT = Math.floor(less_time % 86400); var hour = Math.floor(lessT / 3600); var min = Math.floor(lessT % 3600 / 60); var sec = Math.floor(lessT % 3600 % 60); var dayStr = ""; var hourStr = ""; var minStr = ""; var secStr = ""; if (sec >= 1) secStr = sec + "秒"; if (min >= 1) minStr = min + "分"; if (hour >= 1) hourStr = hour + "小时"; if (day >= 1) return day + "天" + hourStr;else if (hour >= 1) return hourStr + minStr;else return minStr + secStr; // return hourStr+minStr+secStr }, //显示两单位计时 getTimeFormatDayIII: function getTimeFormatDayIII(less_time) { less_time = Number(less_time) || 0; var day = Math.floor(less_time / 86400); var lessT = Math.floor(less_time % 86400); var hour = Math.floor(lessT / 3600); var min = Math.floor(lessT % 3600 / 60); var sec = Math.floor(lessT % 3600 % 60); var dayStr = ""; var hourStr = ""; var minStr = ""; var secStr = ""; if (day >= 1) { if (hour >= 1) { hourStr = hour + "小时"; dayStr = day + "天"; return dayStr + hourStr; } } else { hourStr = hour + "小时"; minStr = min + "分"; secStr = sec + "秒"; return hourStr + minStr + secStr; } }, //当大于1天时,显示x天,小于一天时,显示x时x分 getTimeFormatDayIV: function getTimeFormatDayIV(less_time) { less_time = Number(less_time) || 0; var day = Math.floor(less_time / 86400); var time_str = ""; if (day >= 1) time_str = day + "天";else { var lessT = Math.floor(less_time % 86400); var hour = Math.floor(lessT / 3600); var min = Math.floor(lessT % 3600 / 60); var sec = Math.floor(lessT % 3600 % 60); if (hour < 10) hour = "0" + hour; if (min < 10) min = "0" + min; if (sec < 10) sec = "0" + sec; time_str = hour + ":" + min + ":" + sec; return time_str; } }, //获得天,小时,分,秒 getTimeName: function getTimeName(less_time) { less_time = Number(less_time) || 0; var day = Math.floor(less_time / TimeTool.day2s()); var lessT = Math.floor(less_time % TimeTool.day2s()); var hour = Math.floor(lessT / 3600); var min = Math.floor(lessT % 3600 / 60); var sec = Math.floor(lessT % 3600 % 60); return day, hour, min, sec; }, //大于1天显示x天x小时,少于一天显示x小时xfen getTimeFormatDayIIIIII: function getTimeFormatDayIIIIII(less_time) { less_time = Number(less_time) || 0; var day = Math.floor(less_time / TimeTool.day2s()); var lessT = Math.floor(less_time % TimeTool.day2s()); var hour = Math.floor(lessT / 3600); var min = Math.floor(lessT % 3600 / 60); var sec = Math.floor(lessT % 3600 % 60); var dayStr = ""; if (day >= 1) dayStr = day + "天"; if (day >= 1) return dayStr + hour + "小时";else { if (sec <= 0) { if (min <= 0) { if (hour <= 0) return ""; return dayStr + hour + "小时"; } else return dayStr + hour + cc.js.formatStr("小时%s分", min); } return dayStr + hour + cc.js.formatStr("小时%s分", min); } }, getTimeFormatDayIIIIIIII: function getTimeFormatDayIIIIIIII(less_time) { less_time = Number(less_time) || 0; var day = Math.floor(less_time / 86400); var lessT = Math.floor(less_time % 86400); var hour = Math.floor(lessT / 3600); var min = Math.floor(lessT % 3600 / 60); var sec = Math.floor(lessT % 3600 % 60); var time_str = ""; if (hour < 10) { hour = "0" + hour; } if (min < 10) { min = "0" + min; } if (sec < 10) { sec = "0" + sec; } if (day >= 1) { time_str = day + "天" + hour + ":" + min + ":" + sec; //cc.js.formatStr("%d天%d:%d:%d",day,hour,min,sec) } else { time_str = hour + ":" + min + ":" + sec; //cc.js.formatStr("%d:%d:%d", hour, min,sec) } return time_str; }, //图标需要的时间显示 getTimeForFunction: function getTimeForFunction(less_time) { less_time = Number(less_time) || 0; var day = Math.floor(less_time / TimeTool.day2s()); var lessT = Math.floor(less_time % TimeTool.day2s()); var hour = Math.floor(lessT / 3600); var min = Math.floor(lessT % 3600 / 60); var sec = Math.floor(lessT % 3600 % 60); if (day >= 1) { return day + "天" + hour + "小时"; } else { var str_hour = hour < 10 && "0" + hour || hour; var str_min = min < 10 && "0" + min || min; var str_sec = sec < 10 && "0" + sec || sec; if (hour >= 1) { return str_hour + ":" + str_min + ":" + str_sec; } else { return str_min + ":" + str_sec; } } }, //邮件用 不满1天显示小时 以此类推 getDayOrHour: function getDayOrHour(less_time) { less_time = Number(less_time) || 0; var day = Math.floor(less_time / TimeTool.day2s()); var lessT = Math.floor(less_time % TimeTool.day2s()); var hour = Math.floor(lessT / 3600); var min = Math.floor(lessT % 3600 / 60); var sec = Math.floor(lessT % 3600 % 60); if (day >= 1) { return day + "天"; } else if (hour >= 1) { return hour + "小时"; } else if (min >= 1) { return min + "分钟"; } else if (sec >= 1) { return sec + "秒"; } }, // 好友列表显示时间 // 1 小于24小时以内,显示“xx小时前”,小时向上取整 // 2 大于24小时以上,显示“xx天前”,天数向上取整 // 3 大于72小时以上,统一显示“3天以上” getTimeFormatFriendShowTime: function getTimeFormatFriendShowTime(less_time) { less_time = Number(less_time) || 0; var day = Math.floor(less_time / TimeTool.day2s()); if (day >= 3) { return Utils.TI18N("3天以上"); } if (day > 0) { return day + Utils.TI18N("天前"); } var lessT = Math.floor(less_time % TimeTool.day2s()); var hour = Math.ceil(lessT / 3600); if (hour <= 0) { hour = 1; } return hour + Utils.TI18N("小时前"); } }; module.exports = TimeTool; cc._RF.pop(); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcdXRpbFxcdGltZXRvb2wuanMiXSwibmFtZXMiOlsiVGltZVRvb2wiLCJnZXRUaW1lRm9ybWF0IiwibGVzc190aW1lIiwiTnVtYmVyIiwiaG91ciIsIk1hdGgiLCJmbG9vciIsIm1pbiIsInNlYyIsImdldE1pblNlY1RpbWUiLCJnZXRUaW1lRm9ybWF0SUkiLCJjYyIsImpzIiwiZm9ybWF0U3RyIiwiR2V0VGltZUZvcm1hdFR3byIsImlzX251bSIsInN0cl9ob3VyIiwic3RyX21pbiIsInN0cl9zZWMiLCJnZXRUaW1lRm9ybWF0SUlJIiwiZ2V0VGltZU1zIiwiaXNOdW0iLCJtYXhfbSIsImdldFlNREhNUyIsImRhdGVGdHQiLCJnZXRNREhNUyIsImdldE1EIiwiZ2V0TURITSIsImdldEhNUyIsImdldFlESE0iLCJnZXRITSIsImdldE1TIiwiZ2V0WU1EIiwiZ2V0WU1EMiIsIlV0aWxzIiwiVEkxOE4iLCJnZXRNRDIiLCJtIiwiZCIsImdldE9uZURheUxlc3NUaW1lIiwiZm10IiwiZGF0ZSIsIkRhdGUiLCJvIiwiZ2V0TW9udGgiLCJnZXREYXRlIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImdldE1pbGxpc2Vjb25kcyIsInRlc3QiLCJyZXBsYWNlIiwiUmVnRXhwIiwiJDEiLCJnZXRGdWxsWWVhciIsInN1YnN0ciIsImxlbmd0aCIsImsiLCJkYXkycyIsImdldERheURpZmZlcmVuY2UiLCJ0aW1lX3RtcHMiLCJnZXRUaW1lRm9ybWF0RGF5IiwiZGF5IiwibGVzc1QiLCJkYXlTdHIiLCJnZXRUaW1lRGF5T3JUaW1lIiwib3MiLCJnZXRUaW1lRm9ybWF0RGF5SUkiLCJob3VyU3RyIiwibWluU3RyIiwic2VjU3RyIiwiZ2V0VGltZUZvcm1hdERheUlJSSIsImdldFRpbWVGb3JtYXREYXlJViIsInRpbWVfc3RyIiwiZ2V0VGltZU5hbWUiLCJnZXRUaW1lRm9ybWF0RGF5SUlJSUlJIiwiZ2V0VGltZUZvcm1hdERheUlJSUlJSUlJIiwiZ2V0VGltZUZvckZ1bmN0aW9uIiwiZ2V0RGF5T3JIb3VyIiwiZ2V0VGltZUZvcm1hdEZyaWVuZFNob3dUaW1lIiwiY2VpbCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsUUFBUSxHQUFHO0FBQ1g7QUFFQTtBQUNBQyxFQUFBQSxhQUFhLEVBQUUsdUJBQVVDLFNBQVYsRUFBcUI7QUFDaENBLElBQUFBLFNBQVMsR0FBR0MsTUFBTSxDQUFDRCxTQUFELENBQU4sSUFBcUIsQ0FBakM7QUFDQSxRQUFJRSxJQUFJLEdBQUdDLElBQUksQ0FBQ0MsS0FBTCxDQUFXSixTQUFTLEdBQUcsSUFBdkIsQ0FBWDtBQUNBLFFBQUlLLEdBQUcsR0FBR0YsSUFBSSxDQUFDQyxLQUFMLENBQVlKLFNBQVMsR0FBRyxJQUFiLEdBQXFCLEVBQWhDLENBQVY7QUFDQSxRQUFJTSxHQUFHLEdBQUdOLFNBQVMsR0FBRyxJQUFaLEdBQW1CLEVBQTdCO0FBQ0FFLElBQUFBLElBQUksR0FBSUEsSUFBSSxHQUFHLEVBQVIsSUFBZSxNQUFNQSxJQUFyQixJQUE2QkEsSUFBcEM7QUFDQUcsSUFBQUEsR0FBRyxHQUFJQSxHQUFHLEdBQUcsRUFBUCxJQUFjLE1BQU1BLEdBQXBCLElBQTJCQSxHQUFqQztBQUNBQyxJQUFBQSxHQUFHLEdBQUlBLEdBQUcsR0FBRyxFQUFQLElBQWMsTUFBTUEsR0FBcEIsSUFBMkJBLEdBQWpDO0FBQ0EsV0FBT0osSUFBSSxHQUFHLEdBQVAsR0FBYUcsR0FBYixHQUFtQixHQUFuQixHQUF5QkMsR0FBaEM7QUFDSCxHQWJVO0FBZVg7QUFDQUMsRUFBQUEsYUFBYSxFQUFFLHVCQUFVUCxTQUFWLEVBQXFCO0FBQ2hDQSxJQUFBQSxTQUFTLEdBQUdDLE1BQU0sQ0FBQ0QsU0FBRCxDQUFOLElBQXFCLENBQWpDO0FBQ0EsUUFBSUUsSUFBSSxHQUFHQyxJQUFJLENBQUNDLEtBQUws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TSxDQUFDRCxTQUFELENBQU4sSUFBcUIsQ0FBakM7QUFDQSxRQUFJNEQsR0FBRyxHQUFHekQsSUFBSSxDQUFDQyxLQUFMLENBQVdKLFNBQVMsR0FBQ0YsUUFBUSxDQUFDMEQsS0FBVCxFQUFyQixDQUFWOztBQUNBLFFBQUdJLEdBQUcsSUFBSSxDQUFWLEVBQVk7QUFDUixhQUFPNUIsS0FBSyxDQUFDQyxLQUFOLENBQVksTUFBWixDQUFQO0FBQ0g7O0FBQ0QsUUFBRzJCLEdBQUcsR0FBRyxDQUFULEVBQVc7QUFDUCxhQUFPQSxHQUFHLEdBQUM1QixLQUFLLENBQUNDLEtBQU4sQ0FBWSxJQUFaLENBQVg7QUFDSDs7QUFFRCxRQUFJNEIsS0FBSyxHQUFHMUQsSUFBSSxDQUFDQyxLQUFMLENBQVdKLFNBQVMsR0FBQ0YsUUFBUSxDQUFDMEQsS0FBVCxFQUFyQixDQUFaO0FBQ0EsUUFBSXRELElBQUksR0FBR0MsSUFBSSxDQUFDMkUsSUFBTCxDQUFVakIsS0FBSyxHQUFHLElBQWxCLENBQVg7O0FBRUEsUUFBRzNELElBQUksSUFBSSxDQUFYLEVBQWE7QUFDVEEsTUFBQUEsSUFBSSxHQUFHLENBQVA7QUFDSDs7QUFDRCxXQUFPQSxJQUFJLEdBQUM4QixLQUFLLENBQUNDLEtBQU4sQ0FBWSxLQUFaLENBQVo7QUFDSDtBQTdhVSxDQUFmO0FBZ2JBOEMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCbEYsUUFBakIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiBzaGlyYWhvQHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOaXtumXtOW3peWFt1xuLy8gPGJyLz5DcmVhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBUaW1lVG9vbCA9IHtcbiAgICAvLyDojrflj5bml7bpl7TovazmjaLnmoRcblxuICAgIC8v55Sf5oiQ5pe26Ze05qC85byP5Li6MDA6MDA6MDDnmoQo5pe277ya5YiG77ya56eSKVxuICAgIGdldFRpbWVGb3JtYXQ6IGZ1bmN0aW9uIChsZXNzX3RpbWUpIHtcbiAgICAgICAgbGVzc190aW1lID0gTnVtYmVyKGxlc3NfdGltZSkgfHwgMDtcbiAgICAgICAgdmFyIGhvdXIgPSBNYXRoLmZsb29yKGxlc3NfdGltZSAvIDM2MDApO1xuICAgICAgICB2YXIgbWluID0gTWF0aC5mbG9vcigobGVzc190aW1lICUgMzYwMCkgLyA2MCk7XG4gICAgICAgIHZhciBzZWMgPSBsZXNzX3RpbWUgJSAzNjAwICUgNjA7XG4gICAgICAgIGhvdXIgPSAoaG91ciA8IDEwKSAmJiBcIjBcIiArIGhvdXIgfHwgaG91cjtcbiAgICAgICAgbWluID0gKG1pbiA8IDEwKSAmJiBcIjBcIiArIG1pbiB8fCBtaW47XG4gICAgICAgIHNlYyA9IChzZWMgPCAxMCkgJiYgXCIwXCIgKyBzZWMgfHwgc2VjO1xuICAgICAgICByZXR1cm4gaG91ciArIFwiOlwiICsgbWluICsgXCI6XCIgKyBzZWNcbiAgICB9LFxuXG4gICAgLy/nlJ/miJDml7bpl7TmoLzlvI/kuLowMDowMOeahCjliIbvvJrnp5IpXG4gICAgZ2V0TWluU2VjVGltZTogZnVuY3Rpb24gKGxlc3NfdGltZSkge1xuICAgICAgICBsZXNzX3RpbWUgPSBOdW1iZXIobGVzc190aW1lKSB8fCAwO1xuICAgICAgICB2YXIgaG91ciA9IE1hdGguZmxvb3IobGVzc190aW1lIC8gMzYwMCk7XG4gICAgICAgIHZhciBtaW4gPSBNYXRoLmZsb29yKChsZXNzX3RpbWUgJSAzNjAwKSAvIDYwKTtcbiAgICAgICAgdmFyIHNlYyA9IE1hdGguZmxvb3IobGVzc190aW1lICUgMzYwMCAlIDYwKTtcbiAgICAgICAgbWluID0gaG91ciAqIDYwICsgbWluO1xuICAgICAgICBtaW4gPSAobWluIDwgMTApICYmIFwiMFwiICsgbWluIHx8IG1pbjtcbiAgICAgICAgc2VjID0gKHNlYyA8IDEwKSAmJiBcIjBcIiArIHNlYyB8fCBzZWM7XG4gICAgICAgIHJldHVybiBtaW4gKyBcIjpcIiArIHNlY1xuICAgIH0sXG5cbiAgICAvL+eUn+aIkOaXtumXtOagvOW8j+S4ujAwOjAwOjAw55qEKOaXtu+8muWIhu+8muenkilcbiAgICBnZXRUaW1lRm9ybWF0SUk6IGZ1bmN0aW9uIChsZXNzX3RpbWUpIHtcbiAgICAgICAgbGVzc190aW1lID0gTnVtYmVyKGxlc3NfdGltZSkgfHwgMDtcbiAgICAgICAgdmFyIGhvdXIgPSBNYXRoLmZsb29yKGxlc3NfdGltZSAvIDM2MDApO1xuICAgICAgICB2YXIgbWluID0gTWF0aC5mbG9vcigobGVzc190aW1lICUgMzYwMCkgLyA2MCk7XG4gICAgICAgIHZhciBzZWMgPSBNYXRoLmZsb29yKGxlc3NfdGltZSAlIDM2MDAgJSA2MCk7XG4gICAgICAgIGlmIChzZWMgPD0gMCkge1xuICAgICAgICAgICAgaWYgKG1pbiA8PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyBcIuWwj+aXtlwiXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgY2MuanMuZm9ybWF0U3RyKFwi5bCP5pe2JXPliIZcIiwgbWluKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBob3VyICsgY2MuanMuZm9ybWF0U3RyKFwi5bCP5pe2JXPliIYlc+enklwiLCBtaW4sIHNlYylcbiAgICB9LFxuXG4gICAgLy/nlJ/miJDml7bpl7TmoLzlvI/kuLowMDowMDowMOeahCjml7bvvJrliIYpXG4gICAgR2V0VGltZUZvcm1hdFR3bzogZnVuY3Rpb24gKGxlc3NfdGltZSwgaXNfbnVtKSB7XG4gICAgICAgIGxlc3NfdGltZSA9IE51bWJlcihsZXNzX3RpbWUpIHx8IDA7XG4gICAgICAgIHZhciBob3VyID0gTWF0aC5mbG9vcihsZXNzX3RpbWUgLyAzNjAwKTtcbiAgICAgICAgdmFyIG1pbiA9IE1hdGguZmxvb3IoKGxlc3NfdGltZSAlIDM2MDApIC8gNjApO1xuICAgICAgICB2YXIgc2VjID0gTWF0aC5mbG9vcihsZXNzX3RpbWUgJSAzNjAwICUgNjApO1xuICAgICAgICB2YXIgc3RyX2hvdXIgPSAoaG91ciA8IDEwKSAmJiBcIjBcIiArIGhvdXIgfHwgaG91cjtcbiAgICAgICAgdmFyIHN0cl9taW4gPSAobWluIDwgMTApICYmIFwiMFwiICsgbWluIHx8IG1pbjtcbiAgICAgICAgdmFyIHN0cl9zZWMgPSAoc2VjIDwgMTApICYmIFwiMFwiICsgc2VjIHx8IHNlYztcbiAgICAgICAgaWYgKGhvdXIgPD0gMCkge1xuICAgICAgICAgICAgaWYgKGlzX251bSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cl9taW4gKyBcIjpcIiArIHN0cl9zZWNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdHJfbWluICsgXCLliIZcIiArIHN0cl9zZWMgKyBcIuenklwiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNfbnVtICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyX2hvdXIgKyBcIjpcIiArIHN0cl9taW5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdHJfaG91ciArIFwi5bCP5pe2XCIgKyBzdHJfbWluICsgXCLliIZcIlxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v55Sf5oiQ5pe26Ze05qC85byP5Li6MDA6MDDnmoQo5pe277ya5YiGKVxuICAgIGdldFRpbWVGb3JtYXRJSUk6IGZ1bmN0aW9uIChsZXNzX3RpbWUpIHtcbiAgICAgICAgbGVzc190aW1lID0gTnVtYmVyKGxlc3NfdGltZSkgfHwgMDtcbiAgICAgICAgdmFyIGhvdXIgPSBNYXRoLmZsb29yKGxlc3NfdGltZSAvIDM2MDApO1xuICAgICAgICB2YXIgbWluID0gTWF0aC5mbG9vcigobGVzc190aW1lICUgMzYwMCkgLyA2MCk7XG4gICAgICAgIGhvdXIgPSAoaG91ciA8IDEwKSAmJiBcIjBcIiArIGhvdXIgfHwgaG91cjtcbiAgICAgICAgbWluID0gKG1pbiA8IDEwKSAmJiBcIjBcIiArIG1pbiB8fCBtaW47XG4gICAgICAgIHJldHVybiBob3VyICsgXCI6XCIgKyBtaW5cbiAgICB9LFxuXG4gICAgZ2V0VGltZU1zOiBmdW5jdGlvbiAobGVzc190aW1lLCBpc051bSkge1xuICAgICAgICBsZXNzX3RpbWUgPSBOdW1iZXIobGVzc190aW1lKSB8fCAwXG4gICAgICAgIHZhciBob3VyID0gTWF0aC5mbG9vcihsZXNzX3RpbWUgLyAzNjAwKVxuICAgICAgICB2YXIgbWluID0gTWF0aC5mbG9vcigobGVzc190aW1lICUgMzYwMCkgLyA2MClcbiAgICAgICAgdmFyIHNlYyA9IE1hdGguZmxvb3IobGVzc190aW1lICUgMzYwMCAlIDYwKVxuICAgICAgICBpZiAoaXNOdW0gIT0gbnVsbCkge1xuICAgICAgICAgICAgc2VjID0gKHNlYyA8IDEwKSAmJiBcIjBcIiArIHNlYyB8fCBzZWNcbiAgICAgICAgICAgIHZhciBtYXhfbSA9IGhvdXIgKiA2MCArIG1pblxuICAgICAgICAgICAgbWF4X20gPSAobWF4X20gPCAxMCkgJiYgXCIwXCIgKyBtYXhfbSB8fCBtYXhfbVxuICAgICAgICAgICAgcmV0dXJuIG1heF9tICsgXCI6XCIgKyBzZWNcbiAgICAgICAgfVxuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNjLmpzLmZvcm1hdFN0cihcIiVz5YiGJXPnp5JcIiwgaG91ciAqIDYwICsgbWluLCBzZWMpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/kvKDlhaXml7bpl7TmiLPvvIznlJ/miJDml7bpl7TmoLzlvI/kuLoo5bm0LeaciC3ml6Ug5pe277ya5YiG77ya56eSKVxuICAgIGdldFlNREhNUzogZnVuY3Rpb24gKGxlc3NfdGltZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlRnR0KFwieXl5eS1NTS1kZCBoaDptbTpzc1wiLCBsZXNzX3RpbWUpXG4gICAgfSxcblxuICAgIC8v5Lyg5YWl5pe26Ze05oiz77yM55Sf5oiQ5pe26Ze05qC85byP5Li6KOaciC3ml6Ug5pe277ya5YiG77ya56eSKVxuICAgIGdldE1ESE1TOiBmdW5jdGlvbiAobGVzc190aW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVGdHQoXCJNTS1kZCBoaDptbTpzc1wiLCBsZXNzX3RpbWUpXG4gICAgfSxcbiAgICAvL+S8oOWFpeaXtumXtOaIs++8jOeUn+aIkOaXtumXtOagvOW8j+S4uijmnIgt5pelIClcbiAgICBnZXRNRDogZnVuY3Rpb24gKGxlc3NfdGltZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlRnR0KFwiTU0uZGRcIiwgbGVzc190aW1lKVxuICAgIH0sXG4gICAgLy/kvKDlhaXml7bpl7TmiLPvvIznlJ/miJDml7bpl7TmoLzlvI/kuLoo5pyILeaXpSDml7bvvJrliIYpXG4gICAgZ2V0TURITTogZnVuY3Rpb24gKGxlc3NfdGltZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlRnR0KFwiTU0tZGQgaGg6bW1cIiwgbGVzc190aW1lKVxuICAgIH0sXG4gICAgLy/kvKDlhaXml7bpl7TmiLPvvIznlJ/miJDml7bpl7TmoLzlvI/kuLoo5pe277ya5YiG77ya56eSKVxuICAgIGdldEhNUzogZnVuY3Rpb24gKGxlc3NfdGltZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlRnR0KFwiaGg6bW06c3NcIiwgbGVzc190aW1lKVxuICAgIH0sXG4gICAgLy/kvKDlhaXml7bpl7TmiLPvvIznlJ/miJDml7bpl7TmoLzlvI/kuLoo5bm0IOaXtu+8muWIhu+8muenkilcbiAgICBnZXRZREhNOiBmdW5jdGlvbiAobGVzc190aW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVGdHQoXCJ5eXl5IGhoOm1tOnNzXCIsIGxlc3NfdGltZSlcbiAgICB9LFxuICAgIC8v5Lyg5YWl5pe26Ze05oiz77yM55Sf5oiQ5pe26Ze05qC85byP5Li6KOaXtu+8muWIhilcbiAgICBnZXRITTogZnVuY3Rpb24gKGxlc3NfdGltZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlRnR0KFwiaGg6bW1cIiwgbGVzc190aW1lKVxuICAgIH0sXG4gICAgLy/kvKDlhaXml7bpl7TmiLPvvIznlJ/miJDml7bpl7TmoLzlvI/kuLoo5YiG77ya56eSKVxuICAgIGdldE1TOiBmdW5jdGlvbiAobGVzc190aW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVGdHQoXCJtbTpzc1wiLCBsZXNzX3RpbWUpXG4gICAgfSxcblxuICAgIC8v5Lyg5YWl5pe26Ze05oiz77yM55Sf5oiQ5pe26Ze05qC85byP5Li6KOW5tC3mnIgt5pelKVxuICAgIGdldFlNRDogZnVuY3Rpb24gKGxlc3NfdGltZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlRnR0KFwieXl5eS1NTS1kZFwiLCBsZXNzX3RpbWUpXG4gICAgfSxcblxuICAgIC8v5Yqf6IO977ya5Lyg5YWl5pe26Ze05oiz77yM55Sf5oiQ5pe26Ze05qC85byP5Li6KHh4eHjlubR4eOaciHh45pelKVxuICAgIGdldFlNRDI6IGZ1bmN0aW9uIChsZXNzX3RpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUZ0dChcInl5eXlcIiArIFV0aWxzLlRJMThOKFwi5bm0XCIpICsgXCJNTVwiICsgVXRpbHMuVEkxOE4oXCLmnIhcIikgKyBcImRkXCIgKyBVdGlscy5USTE4TihcIuaXpVwiKSwgbGVzc190aW1lKVxuICAgIH0sXG5cbiAgICBnZXRNRDI6IGZ1bmN0aW9uIChsZXNzX3RpbWUpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzLmRhdGVGdHQoXCJNTVwiLCBsZXNzX3RpbWUpO1xuICAgICAgICB2YXIgZCA9IHRoaXMuZGF0ZUZ0dChcImRkXCIsIGxlc3NfdGltZSk7XG4gICAgICAgIHJldHVybiBtICsgXCLmnIhcIiArIGQgKyBcIuaXpVwiXG4gICAgfSxcblxuICAgIC8v6I635Y+W6Led56a756ys5LqM5aSp5YeM5pmoMOeCueaJgOWJqeS4i+eahOaXtumXtFxuICAgIGdldE9uZURheUxlc3NUaW1lOiBmdW5jdGlvbiAoKSB7XG5cbiAgICB9LFxuXG4gICAgLy/moLzlvI/ovpPlh7pcbiAgICAvL++8iOagvOW8j++8jOaXtumXtOaIs++8iVxuICAgIGRhdGVGdHQ6IGZ1bmN0aW9uIChmbXQsIGxlc3NfdGltZSkge1xuICAgICAgICBpZiAobGVzc190aW1lID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cbiAgICAgICAgLy/pnIDopoExM+S9jeaXtumXtOaIsyjkuZ/ljbPmmK/mr6vnp5IpXG4gICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUobGVzc190aW1lICogMTAwMCk7XG4gICAgICAgIHZhciBvID0ge1xuICAgICAgICAgICAgXCJNK1wiOiBkYXRlLmdldE1vbnRoKCkgKyAxLCAgICAgICAgICAgICAgICAgLy/mnIjku70gICBcbiAgICAgICAgICAgIFwiZCtcIjogZGF0ZS5nZXREYXRlKCksICAgICAgICAgICAgICAgICAgICAvL+aXpSAgIFxuICAgICAgICAgICAgXCJoK1wiOiBkYXRlLmdldEhvdXJzKCksICAgICAgICAgICAgICAgICAgIC8v5bCP5pe2ICAgXG4gICAgICAgICAgICBcIm0rXCI6IGRhdGUuZ2V0TWludXRlcygpLCAgICAgICAgICAgICAgICAgLy/liIYgICBcbiAgICAgICAgICAgIFwicytcIjogZGF0ZS5nZXRTZWNvbmRzKCksICAgICAgICAgICAgICAgICAvL+enkiAgIFxuICAgICAgICAgICAgXCJxK1wiOiBNYXRoLmZsb29yKChkYXRlLmdldE1vbnRoKCkgKyAzKSAvIDMpLCAvL+Wto+W6piAgIFxuICAgICAgICAgICAgXCJTXCI6IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgICAgICAgICAgICAgLy/mr6vnp5IgICBcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKC8oeSspLy50ZXN0KGZtdCkpXG4gICAgICAgICAgICBmbXQgPSBmbXQucmVwbGFjZShSZWdFeHAuJDEsIChkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIlwiKS5zdWJzdHIoNCAtIFJlZ0V4cC4kMS5sZW5ndGgpKTtcbiAgICAgICAgZm9yICh2YXIgayBpbiBvKVxuICAgICAgICAgICAgaWYgKG5ldyBSZWdFeHAoXCIoXCIgKyBrICsgXCIpXCIpLnRlc3QoZm10KSlcbiAgICAgICAgICAgICAgICBmbXQgPSBmbXQucmVwbGFjZShSZWdFeHAuJDEsIChSZWdFeHAuJDEubGVuZ3RoID09IDEpID8gKG9ba10pIDogKChcIjAwXCIgKyBvW2tdKS5zdWJzdHIoKFwiXCIgKyBvW2tdKS5sZW5ndGgpKSk7XG4gICAgICAgIHJldHVybiBmbXQ7XG4gICAgfSxcblxuXG4gICAgLy8x5aSp56eS5pWwXG4gICAgZGF5MnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDg2NDAwXG4gICAgfSxcblxuICAgIGdldERheURpZmZlcmVuY2U6IGZ1bmN0aW9uICh0aW1lX3RtcHMpIHtcblxuICAgIH0sXG5cbiAgICAvL3h45aSpeHjlsI/ml7Z4eOWIhnh456eSXG4gICAgZ2V0VGltZUZvcm1hdERheTogZnVuY3Rpb24gKGxlc3NfdGltZSkge1xuICAgICAgICBsZXNzX3RpbWUgPSBOdW1iZXIobGVzc190aW1lKSB8fCAwXG4gICAgICAgIHZhciBkYXkgPSBNYXRoLmZsb29yKGxlc3NfdGltZSAvIFRpbWVUb29sLmRheTJzKCkpXG4gICAgICAgIHZhciBsZXNzVCA9IE1hdGguZmxvb3IobGVzc190aW1lICUgVGltZVRvb2wuZGF5MnMoKSlcbiAgICAgICAgdmFyIGhvdXIgPSBNYXRoLmZsb29yKGxlc3NUIC8gMzYwMClcbiAgICAgICAgdmFyIG1pbiA9IE1hdGguZmxvb3IoKGxlc3NUICUgMzYwMCkgLyA2MClcbiAgICAgICAgdmFyIHNlYyA9IE1hdGguZmxvb3IobGVzc1QgJSAzNjAwICUgNjApXG4gICAgICAgIHZhciBkYXlTdHIgPSBcIlwiXG4gICAgICAgIGlmIChkYXkgPj0gMSkge1xuICAgICAgICAgICAgZGF5U3RyID0gZGF5ICsgXCLlpKlcIlxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXkgPj0gMSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBkYXlTdHIgKyBob3VyICsgXCLlsI/ml7ZcIlxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBkYXlTdHJcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzZWMgPD0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaG91ciA8PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheVN0ciArIGhvdXIgKyBcIuWwj+aXtlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheVN0ciArIGhvdXIgKyBjYy5qcy5mb3JtYXRTdHIoXCLlsI/ml7Ylc+WIhlwiLCBtaW4pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGF5U3RyICsgaG91ciArIGNjLmpzLmZvcm1hdFN0cihcIuWwj+aXtiVz5YiGXCIsIG1pbilcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+Wkp+S6jjHlpKnmmL7npLp4eOWkqSDlsI/kuo7kuIDlpKnmmL7npLp4eOWwj+aXtnh45YiGeHjnp5JcbiAgICBnZXRUaW1lRGF5T3JUaW1lOiBmdW5jdGlvbiAobGVzc190aW1lKSB7XG4gICAgICAgIGxlc3NfdGltZSA9IE51bWJlcihsZXNzX3RpbWUpIHx8IDBcbiAgICAgICAgdmFyIGRheSA9IE1hdGguZmxvb3IobGVzc190aW1lIC8gVGltZVRvb2wuZGF5MnMoKSlcbiAgICAgICAgdmFyIGRheVN0ciA9IFwiXCJcbiAgICAgICAgaWYgKGRheSA+PSAxKSB7XG4gICAgICAgICAgICBkYXlTdHIgPSBkYXkgKyBcIuWkqVwiXG4gICAgICAgICAgICByZXR1cm4gZGF5U3RyXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheSA8IDEpXG4gICAgICAgICAgICByZXR1cm4gb3MuZGF0ZShcIiVYIFwiLCBsZXNzX3RpbWUpXG4gICAgfSxcblxuICAgIC8v5pi+56S65Lik5Y2V5L2N6K6h5pe2XG4gICAgZ2V0VGltZUZvcm1hdERheUlJOiBmdW5jdGlvbiAobGVzc190aW1lKSB7XG4gICAgICAgIGxlc3NfdGltZSA9IE51bWJlcihsZXNzX3RpbWUpIHx8IDBcbiAgICAgICAgdmFyIGRheSA9IE1hdGguZmxvb3IobGVzc190aW1lIC8gODY0MDApXG4gICAgICAgIHZhciBsZXNzVCA9IE1hdGguZmxvb3IobGVzc190aW1lICUgODY0MDApXG4gICAgICAgIHZhciBob3VyID0gTWF0aC5mbG9vcihsZXNzVCAvIDM2MDApXG4gICAgICAgIHZhciBtaW4gPSBNYXRoLmZsb29yKChsZXNzVCAlIDM2MDApIC8gNjApXG4gICAgICAgIHZhciBzZWMgPSBNYXRoLmZsb29yKGxlc3NUICUgMzYwMCAlIDYwKVxuICAgICAgICB2YXIgZGF5U3RyID0gXCJcIlxuICAgICAgICB2YXIgaG91clN0ciA9IFwiXCJcbiAgICAgICAgdmFyIG1pblN0ciA9IFwiXCJcbiAgICAgICAgdmFyIHNlY1N0ciA9IFwiXCJcbiAgICAgICAgaWYgKHNlYyA+PSAxKVxuICAgICAgICAgICAgc2VjU3RyID0gc2VjICsgXCLnp5JcIlxuICAgICAgICBpZiAobWluID49IDEpXG4gICAgICAgICAgICBtaW5TdHIgPSBtaW4gKyBcIuWIhlwiXG4gICAgICAgIGlmIChob3VyID49IDEpXG4gICAgICAgICAgICBob3VyU3RyID0gaG91ciArIFwi5bCP5pe2XCJcbiAgICAgICAgaWYgKGRheSA+PSAxKVxuICAgICAgICAgICAgcmV0dXJuIGRheSArIFwi5aSpXCIgKyBob3VyU3RyXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGlmIChob3VyID49IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXJTdHIgKyBtaW5TdHJcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gbWluU3RyICsgc2VjU3RyXG4gICAgICAgIC8vIHJldHVybiBob3VyU3RyK21pblN0citzZWNTdHJcbiAgICB9LFxuXG4gICAgLy/mmL7npLrkuKTljZXkvY3orqHml7ZcbiAgICBnZXRUaW1lRm9ybWF0RGF5SUlJOiBmdW5jdGlvbiAobGVzc190aW1lKSB7XG4gICAgICAgIGxlc3NfdGltZSA9IE51bWJlcihsZXNzX3RpbWUpIHx8IDBcbiAgICAgICAgdmFyIGRheSA9IE1hdGguZmxvb3IobGVzc190aW1lIC8gODY0MDApXG4gICAgICAgIHZhciBsZXNzVCA9IE1hdGguZmxvb3IobGVzc190aW1lICUgODY0MDApXG4gICAgICAgIHZhciBob3VyID0gTWF0aC5mbG9vcihsZXNzVCAvIDM2MDApXG4gICAgICAgIHZhciBtaW4gPSBNYXRoLmZsb29yKChsZXNzVCAlIDM2MDApIC8gNjApXG4gICAgICAgIHZhciBzZWMgPSBNYXRoLmZsb29yKGxlc3NUICUgMzYwMCAlIDYwKVxuICAgICAgICB2YXIgZGF5U3RyID0gXCJcIlxuICAgICAgICB2YXIgaG91clN0ciA9IFwiXCJcbiAgICAgICAgdmFyIG1pblN0ciA9IFwiXCJcbiAgICAgICAgdmFyIHNlY1N0ciA9IFwiXCJcbiAgICAgICAgaWYgKGRheSA+PSAxKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA+PSAxKSB7XG4gICAgICAgICAgICAgICAgaG91clN0ciA9IGhvdXIgKyBcIuWwj+aXtlwiXG5cbiAgICAgICAgICAgICAgICBkYXlTdHIgPSBkYXkgKyBcIuWkqVwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRheVN0ciArIGhvdXJTdHJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhvdXJTdHIgPSBob3VyICsgXCLlsI/ml7ZcIlxuICAgICAgICAgICAgbWluU3RyID0gbWluICsgXCLliIZcIlxuICAgICAgICAgICAgc2VjU3RyID0gc2VjICsgXCLnp5JcIlxuICAgICAgICAgICAgcmV0dXJuIGhvdXJTdHIgKyBtaW5TdHIgKyBzZWNTdHJcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+W9k+Wkp+S6jjHlpKnml7bvvIzmmL7npLp45aSp77yM5bCP5LqO5LiA5aSp5pe277yM5pi+56S6eOaXtnjliIZcbiAgICBnZXRUaW1lRm9ybWF0RGF5SVY6IGZ1bmN0aW9uIChsZXNzX3RpbWUpIHtcbiAgICAgICAgbGVzc190aW1lID0gTnVtYmVyKGxlc3NfdGltZSkgfHwgMFxuICAgICAgICB2YXIgZGF5ID0gTWF0aC5mbG9vcihsZXNzX3RpbWUgLyA4NjQwMClcbiAgICAgICAgdmFyIHRpbWVfc3RyID0gXCJcIlxuICAgICAgICBpZiAoZGF5ID49IDEpXG4gICAgICAgICAgICB0aW1lX3N0ciA9IGRheSArIFwi5aSpXCJcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgbGVzc1QgPSBNYXRoLmZsb29yKGxlc3NfdGltZSAlIDg2NDAwKVxuICAgICAgICAgICAgdmFyIGhvdXIgPSBNYXRoLmZsb29yKGxlc3NUIC8gMzYwMClcbiAgICAgICAgICAgIHZhciBtaW4gPSBNYXRoLmZsb29yKChsZXNzVCAlIDM2MDApIC8gNjApXG4gICAgICAgICAgICB2YXIgc2VjID0gTWF0aC5mbG9vcihsZXNzVCAlIDM2MDAgJSA2MClcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTApIGhvdXIgPSBcIjBcIiArIGhvdXJcbiAgICAgICAgICAgIGlmIChtaW4gPCAxMCkgbWluID0gXCIwXCIgKyBtaW5cbiAgICAgICAgICAgIGlmIChzZWMgPCAxMCkgc2VjID0gXCIwXCIgKyBzZWNcbiAgICAgICAgICAgIHRpbWVfc3RyID0gaG91ciArIFwiOlwiICsgbWluICsgXCI6XCIgKyBzZWNcbiAgICAgICAgICAgIHJldHVybiB0aW1lX3N0clxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6I635b6X5aSp77yM5bCP5pe277yM5YiG77yM56eSXG4gICAgZ2V0VGltZU5hbWU6IGZ1bmN0aW9uIChsZXNzX3RpbWUpIHtcbiAgICAgICAgbGVzc190aW1lID0gTnVtYmVyKGxlc3NfdGltZSkgfHwgMFxuICAgICAgICB2YXIgZGF5ID0gTWF0aC5mbG9vcihsZXNzX3RpbWUgLyBUaW1lVG9vbC5kYXkycygpKVxuICAgICAgICB2YXIgbGVzc1QgPSBNYXRoLmZsb29yKGxlc3NfdGltZSAlIFRpbWVUb29sLmRheTJzKCkpXG4gICAgICAgIHZhciBob3VyID0gTWF0aC5mbG9vcihsZXNzVCAvIDM2MDApXG4gICAgICAgIHZhciBtaW4gPSBNYXRoLmZsb29yKChsZXNzVCAlIDM2MDApIC8gNjApXG4gICAgICAgIHZhciBzZWMgPSBNYXRoLmZsb29yKGxlc3NUICUgMzYwMCAlIDYwKVxuICAgICAgICByZXR1cm4gZGF5LCBob3VyLCBtaW4sIHNlY1xuICAgIH0sXG5cbiAgICAvL+Wkp+S6jjHlpKnmmL7npLp45aSpeOWwj+aXtu+8jOWwkeS6juS4gOWkqeaYvuekunjlsI/ml7Z4ZmVuXG4gICAgZ2V0VGltZUZvcm1hdERheUlJSUlJSTogZnVuY3Rpb24gKGxlc3NfdGltZSkge1xuICAgICAgICBsZXNzX3RpbWUgPSBOdW1iZXIobGVzc190aW1lKSB8fCAwXG4gICAgICAgIHZhciBkYXkgPSBNYXRoLmZsb29yKGxlc3NfdGltZSAvIFRpbWVUb29sLmRheTJzKCkpXG4gICAgICAgIHZhciBsZXNzVCA9IE1hdGguZmxvb3IobGVzc190aW1lICUgVGltZVRvb2wuZGF5MnMoKSlcbiAgICAgICAgdmFyIGhvdXIgPSBNYXRoLmZsb29yKGxlc3NUIC8gMzYwMClcbiAgICAgICAgdmFyIG1pbiA9IE1hdGguZmxvb3IoKGxlc3NUICUgMzYwMCkgLyA2MClcbiAgICAgICAgdmFyIHNlYyA9IE1hdGguZmxvb3IobGVzc1QgJSAzNjAwICUgNjApXG4gICAgICAgIHZhciBkYXlTdHIgPSBcIlwiXG4gICAgICAgIGlmIChkYXkgPj0gMSlcbiAgICAgICAgICAgIGRheVN0ciA9IGRheSArIFwi5aSpXCJcbiAgICAgICAgaWYgKGRheSA+PSAxKVxuICAgICAgICAgICAgcmV0dXJuIGRheVN0ciArIGhvdXIgKyBcIuWwj+aXtlwiXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNlYyA8PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChob3VyIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5U3RyICsgaG91ciArIFwi5bCP5pe2XCJcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheVN0ciArIGhvdXIgKyBjYy5qcy5mb3JtYXRTdHIoXCLlsI/ml7Ylc+WIhlwiLCBtaW4pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGF5U3RyICsgaG91ciArIGNjLmpzLmZvcm1hdFN0cihcIuWwj+aXtiVz5YiGXCIsIG1pbilcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRUaW1lRm9ybWF0RGF5SUlJSUlJSUk6IGZ1bmN0aW9uIChsZXNzX3RpbWUpIHtcbiAgICAgICAgbGVzc190aW1lID0gTnVtYmVyKGxlc3NfdGltZSkgfHwgMDtcbiAgICAgICAgdmFyIGRheSA9IE1hdGguZmxvb3IobGVzc190aW1lIC8gODY0MDApO1xuICAgICAgICB2YXIgbGVzc1QgPSBNYXRoLmZsb29yKGxlc3NfdGltZSAlIDg2NDAwKTtcbiAgICAgICAgdmFyIGhvdXIgPSBNYXRoLmZsb29yKGxlc3NUIC8gMzYwMCk7XG4gICAgICAgIHZhciBtaW4gPSBNYXRoLmZsb29yKChsZXNzVCAlIDM2MDApIC8gNjApO1xuICAgICAgICB2YXIgc2VjID0gTWF0aC5mbG9vcihsZXNzVCAlIDM2MDAgJSA2MCk7XG4gICAgICAgIHZhciB0aW1lX3N0ciA9IFwiXCI7XG4gICAgICAgIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgIGhvdXIgPSBcIjBcIiArIGhvdXJcbiAgICAgICAgfVxuICAgICAgICBpZiAobWluIDwgMTApIHtcbiAgICAgICAgICAgIG1pbiA9IFwiMFwiICsgbWluXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlYyA8IDEwKSB7XG4gICAgICAgICAgICBzZWMgPSBcIjBcIiArIHNlY1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXkgPj0gMSkge1xuICAgICAgICAgICAgdGltZV9zdHIgPSBkYXkgKyBcIuWkqVwiICsgaG91ciArIFwiOlwiICsgbWluICsgXCI6XCIgKyBzZWMgLy9jYy5qcy5mb3JtYXRTdHIoXCIlZOWkqSVkOiVkOiVkXCIsZGF5LGhvdXIsbWluLHNlYylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbWVfc3RyID0gaG91ciArIFwiOlwiICsgbWluICsgXCI6XCIgKyBzZWMvL2NjLmpzLmZvcm1hdFN0cihcIiVkOiVkOiVkXCIsIGhvdXIsIG1pbixzZWMpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpbWVfc3RyO1xuICAgIH0sXG5cbiAgICAvL+Wbvuagh+mcgOimgeeahOaXtumXtOaYvuekulxuICAgIGdldFRpbWVGb3JGdW5jdGlvbihsZXNzX3RpbWUpIHtcbiAgICAgICAgbGVzc190aW1lID0gTnVtYmVyKGxlc3NfdGltZSkgfHwgMFxuICAgICAgICBsZXQgZGF5ID0gTWF0aC5mbG9vcihsZXNzX3RpbWUgLyBUaW1lVG9vbC5kYXkycygpKVxuICAgICAgICBsZXQgbGVzc1QgPSBNYXRoLmZsb29yKGxlc3NfdGltZSAlIFRpbWVUb29sLmRheTJzKCkpXG4gICAgICAgIGxldCBob3VyID0gTWF0aC5mbG9vcihsZXNzVCAvIDM2MDApXG4gICAgICAgIGxldCBtaW4gPSBNYXRoLmZsb29yKChsZXNzVCAlIDM2MDApIC8gNjApXG4gICAgICAgIGxldCBzZWMgPSBNYXRoLmZsb29yKGxlc3NUICUgMzYwMCAlIDYwKVxuICAgICAgICBpZiAoZGF5ID49IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXkgKyBcIuWkqVwiICsgaG91ciArIFwi5bCP5pe2XCJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBzdHJfaG91ciA9IChob3VyIDwgMTApICYmIFwiMFwiICsgaG91ciB8fCBob3VyXG4gICAgICAgICAgICBsZXQgc3RyX21pbiA9IChtaW4gPCAxMCkgJiYgXCIwXCIgKyBtaW4gfHwgbWluXG4gICAgICAgICAgICBsZXQgc3RyX3NlYyA9IChzZWMgPCAxMCkgJiYgXCIwXCIgKyBzZWMgfHwgc2VjXG4gICAgICAgICAgICBpZiAoaG91ciA+PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cl9ob3VyICsgXCI6XCIgKyBzdHJfbWluICsgXCI6XCIgKyBzdHJfc2VjXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdHJfbWluICsgXCI6XCIgKyBzdHJfc2VjXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8v6YKu5Lu255SoIOS4jea7oTHlpKnmmL7npLrlsI/ml7Yg5Lul5q2k57G75o6oXG4gICAgZ2V0RGF5T3JIb3VyOiBmdW5jdGlvbiAobGVzc190aW1lKSB7XG4gICAgICAgIGxlc3NfdGltZSA9IE51bWJlcihsZXNzX3RpbWUpIHx8IDA7XG4gICAgICAgIHZhciBkYXkgPSBNYXRoLmZsb29yKGxlc3NfdGltZSAvIFRpbWVUb29sLmRheTJzKCkpO1xuICAgICAgICB2YXIgbGVzc1QgPSBNYXRoLmZsb29yKGxlc3NfdGltZSAlIFRpbWVUb29sLmRheTJzKCkpO1xuICAgICAgICB2YXIgaG91ciA9IE1hdGguZmxvb3IobGVzc1QgLyAzNjAwKTtcbiAgICAgICAgdmFyIG1pbiA9IE1hdGguZmxvb3IoKGxlc3NUICUgMzYwMCkgLyA2MCk7XG4gICAgICAgIHZhciBzZWMgPSBNYXRoLmZsb29yKGxlc3NUICUgMzYwMCAlIDYwKTtcbiAgICAgICAgaWYgKGRheSA+PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF5ICsgXCLlpKlcIlxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGhvdXIgPj0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyBcIuWwj+aXtlwiXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWluID49IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW4gKyBcIuWIhumSn1wiXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2VjID49IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWMgKyBcIuenklwiXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5aW95Y+L5YiX6KGo5pi+56S65pe26Ze0XG4gICAgLy8gIDEgICDlsI/kuo4yNOWwj+aXtuS7peWGhe+8jOaYvuekuuKAnHh45bCP5pe25YmN4oCd77yM5bCP5pe25ZCR5LiK5Y+W5pW0ICAgXG4gICAgLy8gIDIgICDlpKfkuo4yNOWwj+aXtuS7peS4iu+8jOaYvuekuuKAnHh45aSp5YmN4oCd77yM5aSp5pWw5ZCR5LiK5Y+W5pW0ICAgIFxuICAgIC8vICAzICAg5aSn5LqONzLlsI/ml7bku6XkuIrvvIznu5/kuIDmmL7npLrigJwz5aSp5Lul5LiK4oCdIFxuICAgIGdldFRpbWVGb3JtYXRGcmllbmRTaG93VGltZTpmdW5jdGlvbihsZXNzX3RpbWUpe1xuICAgICAgICBsZXNzX3RpbWUgPSBOdW1iZXIobGVzc190aW1lKSB8fCAwO1xuICAgICAgICBsZXQgZGF5ID0gTWF0aC5mbG9vcihsZXNzX3RpbWUvVGltZVRvb2wuZGF5MnMoKSk7XG4gICAgICAgIGlmKGRheSA+PSAzKXtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5USTE4TihcIjPlpKnku6XkuIpcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZGF5ID4gMCl7XG4gICAgICAgICAgICByZXR1cm4gZGF5K1V0aWxzLlRJMThOKFwi5aSp5YmNXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxlc3NUID0gTWF0aC5mbG9vcihsZXNzX3RpbWUlVGltZVRvb2wuZGF5MnMoKSk7XG4gICAgICAgIGxldCBob3VyID0gTWF0aC5jZWlsKGxlc3NUIC8gMzYwMCk7XG5cbiAgICAgICAgaWYoaG91ciA8PSAwKXtcbiAgICAgICAgICAgIGhvdXIgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBob3VyK1V0aWxzLlRJMThOKFwi5bCP5pe25YmNXCIpO1xuICAgIH0sXG4gICAgXG59O1xubW9kdWxlLmV4cG9ydHMgPSBUaW1lVG9vbDsiXX0=