Formula.js 99 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/utils/Formula.js';
  5. var __require = nodeEnv ? function (request) {
  6. return cc.require(request);
  7. } : function (request) {
  8. return __quick_compile_project__.require(request, __filename);
  9. };
  10. function __define (exports, require, module) {
  11. if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
  12. cc._RF.push(module, '8916fgg2eBBHqta/JtBPEGC', 'Formula');
  13. // script/utils/Formula.ts
  14. "use strict";
  15. Object.defineProperty(exports, "__esModule", { value: true });
  16. exports.chineseByNumber = exports.FormulaCom = exports.IsSameDay = exports.showTimeWord = exports.showTimeYMD = exports.showTime = exports.stringFormat = exports.localized = void 0;
  17. // import GameMath from './GameMath';
  18. // import { gameMethod } from '../cfg/gameMethod';
  19. // import { gameCfg } from '../cfg/GameCfg';
  20. // import Config from '../Config';
  21. // import { Hdcid } from '../cfg/XyS';
  22. var gameMethod_1 = require("../common/gameMethod");
  23. var GameMath_1 = require("./GameMath");
  24. var I18nUtil_1 = require("./I18nUtil");
  25. // import { WorkType } from '../cfg/XyWork';
  26. // 本地化,格式化文字
  27. function localized(key) {
  28. var args = [];
  29. for (var _i = 1; _i < arguments.length; _i++) {
  30. args[_i - 1] = arguments[_i];
  31. }
  32. return stringFormat(key, args);
  33. // if (key == null || key.length == 0) {
  34. // return stringFormat(key, args)
  35. // }
  36. // let _lang = Config.lang
  37. // let data = GameCfg.lang.getItem(key)
  38. // if (data == null) {
  39. // return stringFormat(key, args)
  40. // }
  41. // let result = data[_lang]
  42. // if (result == null) {
  43. // return stringFormat(key, args)
  44. // }
  45. // return stringFormat(result, args)
  46. }
  47. exports.localized = localized;
  48. // // 获取client配置表
  49. // export function getWord(str: string, ...args): string {
  50. // if (gameMethod.isEmpty(gameCfg.langClient.getItem(str))) {
  51. // return str
  52. // }
  53. // let result = gameCfg.langClient.getItem(str)[Config.lang]
  54. // return stringFormat(result, args)
  55. // }
  56. // // 获取 clientText.csv配置表文字
  57. // export function getText(str: string, ...args) {
  58. // let result = gameCfg.langClientText.getItem(str)[Config.lang]
  59. // return stringFormat(result, args)
  60. // }
  61. function stringFormat(str, list) {
  62. if (str == null) {
  63. return "";
  64. }
  65. var result = str;
  66. list.forEach(function (element, index) {
  67. result = result.replace("%{" + index + "}", element);
  68. });
  69. return result;
  70. }
  71. exports.stringFormat = stringFormat;
  72. // /**
  73. // * 显示倒计时
  74. // * @param time 倒计时结束时间戳
  75. // * @param act 活动key
  76. // * @param hdcid 活动Hdcid
  77. // * @param type 倒计时展示类型
  78. // * @returns
  79. // */
  80. // export function showCdTime(time: number, act: WorkType, hdcid: string, type: string = '1') {
  81. // let cdTime: number = 0
  82. // cdTime = time - GameDataCenter.timeModel.sevTime
  83. // if (cdTime >= 0) {
  84. // return this.showTime(cdTime, type)
  85. // } else {
  86. // // 防止延迟会一直重复发送请求
  87. // if (GameDataCenter.timeModel.getIsKeyAdok(act)) {
  88. // GameDataCenter.timeModel.sendAdokKey(time, act, hdcid)
  89. // }
  90. // }
  91. // }
  92. /**
  93. * 秒级别(10位数)
  94. * @param time 时间戳
  95. * @param type 类型
  96. * 1: 大于一天,显示x天x时;小于一天,显示00:00:00(天数不足,补0)
  97. * 2: 1天36分(只显示最前面的两位)
  98. * 3: 小于一小时,显示xx:xx(分秒)
  99. * 4: 只显示最高单位 大于1天 显示1天 大于1小时 显示1时
  100. * @returns
  101. */
  102. function showTime(time, type) {
  103. if (type === void 0) { type = "1"; }
  104. if (time.toString().length == 13) {
  105. time = Math.floor(time / 1000);
  106. }
  107. if (time <= 0) {
  108. return type == "3" ? "00:00" : "00:00:00";
  109. }
  110. var tTime = '';
  111. var day = 0;
  112. var hour = 0;
  113. var minute = 0;
  114. var second = 0;
  115. day = Math.floor(time / (24 * 60 * 60));
  116. hour = Math.floor((time % (24 * 60 * 60)) / (60 * 60));
  117. minute = Math.floor((time % (60 * 60)) / 60);
  118. second = Math.floor(time % 60);
  119. if (type == "1") {
  120. if (day > 0) {
  121. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dh', day, hour);
  122. }
  123. else if (hour > 0) {
  124. tTime = GameMath_1.default.addZero(day * 24 + hour) + ":" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
  125. // tTime = `${GameMath.addZero(day * 24 + hour)}时${GameMath.addZero(minute)}分`
  126. }
  127. else if (minute > 0) {
  128. tTime = "00:" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
  129. // tTime = `${GameMath.addZero(minute)}分${GameMath.addZero(second)}秒`
  130. }
  131. else {
  132. tTime = "00:00:" + GameMath_1.default.addZero(second);
  133. // tTime = `${GameMath.addZero(second)}秒`
  134. }
  135. }
  136. else if (type == "2") {
  137. if (day > 0) {
  138. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dh', day, hour);
  139. }
  140. else if (hour > 0) {
  141. tTime = GameMath_1.default.addZero(day * 24 + hour) + "\u65F6" + GameMath_1.default.addZero(minute) + "\u5206";
  142. }
  143. else if (minute > 0) {
  144. tTime = GameMath_1.default.addZero(minute) + "\u5206" + GameMath_1.default.addZero(second) + "\u79D2";
  145. }
  146. else {
  147. tTime = GameMath_1.default.addZero(second) + "\u79D2";
  148. }
  149. }
  150. else if (type == '3') {
  151. if (day > 0) {
  152. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dh', day, hour);
  153. }
  154. else if (hour > 0) {
  155. tTime = GameMath_1.default.addZero(day * 24 + hour) + ":" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
  156. // tTime = `${GameMath.addZero(day * 24 + hour)}时${GameMath.addZero(minute)}分`
  157. }
  158. else if (minute > 0) {
  159. tTime = GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
  160. // tTime = `${GameMath.addZero(minute)}分${GameMath.addZero(second)}秒`
  161. }
  162. else {
  163. tTime = "00:" + GameMath_1.default.addZero(second);
  164. // tTime = `${GameMath.addZero(second)}秒`
  165. }
  166. }
  167. else if (type == '4') {
  168. if (day > 1) {
  169. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_d', day);
  170. }
  171. else if (day > 0 || hour > 0) {
  172. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_h', day * 24 + hour);
  173. }
  174. else if (minute > 0) {
  175. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_m', minute);
  176. }
  177. else {
  178. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_s', second);
  179. }
  180. }
  181. else if (type == '5') {
  182. if (day > 0) {
  183. tTime = GameMath_1.default.addZero(day * 24 + hour) + ":" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
  184. }
  185. else if (hour > 0) {
  186. tTime = GameMath_1.default.addZero(day * 24 + hour) + ":" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
  187. }
  188. else if (minute > 0) {
  189. tTime = "00:" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
  190. }
  191. else {
  192. tTime = "00:00:" + GameMath_1.default.addZero(second);
  193. }
  194. }
  195. else if (type == '6') {
  196. if (day > 0) {
  197. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dhms', day, hour, minute, second); // x天x小时x分x秒
  198. }
  199. else if (hour > 0) {
  200. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_hms', hour, minute, second); // x小时x分x秒
  201. }
  202. else if (minute > 0) {
  203. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_ms', minute, second); // x分x秒
  204. }
  205. else {
  206. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_s', second); // x秒
  207. }
  208. }
  209. else if (type == '7') {
  210. if (day > 0) {
  211. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dhms_2', day, GameMath_1.default.addZero(hour), GameMath_1.default.addZero(minute), GameMath_1.default.addZero(second));
  212. }
  213. else if (hour > 0) {
  214. tTime = GameMath_1.default.addZero(hour) + ":" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
  215. }
  216. else if (minute > 0) {
  217. tTime = "00:" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
  218. }
  219. else {
  220. tTime = "00:00:" + GameMath_1.default.addZero(second);
  221. }
  222. }
  223. else if (type == '8') { // 显示两个单位
  224. if (day > 0) {
  225. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dh', day, hour);
  226. }
  227. else if (hour > 0) {
  228. tTime = GameMath_1.default.addZero(day * 24 + hour) + ":" + GameMath_1.default.addZero(minute);
  229. }
  230. else if (minute > 0) {
  231. tTime = GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
  232. }
  233. else {
  234. tTime = "00:" + GameMath_1.default.addZero(second);
  235. }
  236. }
  237. return tTime;
  238. }
  239. exports.showTime = showTime;
  240. function showTimeYMD(shijianchuo, type) {
  241. if (type === void 0) { type = 0; }
  242. if (shijianchuo.toString().length == 10) {
  243. shijianchuo = shijianchuo * 1000;
  244. }
  245. var time = new Date(shijianchuo);
  246. var y = time.getFullYear();
  247. var m = time.getMonth() + 1;
  248. var d = time.getDate();
  249. var h = time.getHours();
  250. var mm = time.getMinutes();
  251. var s = time.getSeconds();
  252. if (type == 0) {
  253. return y + "-" + GameMath_1.default.addZero(m) + "-" + GameMath_1.default.addZero(d) + " " + GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm) + ":" + GameMath_1.default.addZero(s);
  254. }
  255. else if (type == 1) {
  256. return GameMath_1.default.addZero(y) + "-" + GameMath_1.default.addZero(m) + "-" + GameMath_1.default.addZero(d);
  257. }
  258. else if (type == 2) {
  259. return GameMath_1.default.addZero(y) + "." + GameMath_1.default.addZero(m) + "." + GameMath_1.default.addZero(d);
  260. }
  261. else if (type == 3) {
  262. return GameMath_1.default.addZero(m) + "-" + GameMath_1.default.addZero(d) + " " + GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm);
  263. }
  264. else if (type == 4) {
  265. return GameMath_1.default.addZero(m) + "/" + GameMath_1.default.addZero(d);
  266. }
  267. else if (type == 5) {
  268. return GameMath_1.default.addZero(y) + "/" + GameMath_1.default.addZero(m) + "/" + GameMath_1.default.addZero(d);
  269. }
  270. else if (type == 6) { //设置界面时间显示
  271. return GameMath_1.default.addZero(y) + "-" + GameMath_1.default.addZero(m) + "-" + GameMath_1.default.addZero(d) + " " + GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm) + ":" + GameMath_1.default.addZero(s);
  272. }
  273. else if (type == 7) {
  274. return GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm);
  275. }
  276. else if (type == 8) {
  277. return I18nUtil_1.I18n.getI18nText('common_timeformat_ymd', y, m, d);
  278. }
  279. else if (type == 9) {
  280. return I18nUtil_1.I18n.getI18nText('common_timeformat_md', m, d);
  281. }
  282. else if (type == 10) {
  283. return y + "/" + m + "/" + d;
  284. }
  285. else if (type == 11) { // 00:00:00格式
  286. return GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm) + ":" + GameMath_1.default.addZero(s);
  287. }
  288. else if (type == 12) {
  289. return GameMath_1.default.addZero(y) + "/" + GameMath_1.default.addZero(m) + "/" + GameMath_1.default.addZero(d) + " " + GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm) + ":" + GameMath_1.default.addZero(s);
  290. }
  291. else if (type == 13) {
  292. return GameMath_1.default.addZero(m) + "/" + GameMath_1.default.addZero(d) + " " + GameMath_1.default.addZero(h) + ":" + GameMath_1.default.addZero(mm) + ":" + GameMath_1.default.addZero(s);
  293. }
  294. }
  295. exports.showTimeYMD = showTimeYMD;
  296. function showTimeWord(time, type) {
  297. if (type === void 0) { type = "1"; }
  298. var tTime = '';
  299. var month = 0;
  300. var day = 0;
  301. var hour = 0;
  302. var minute = 0;
  303. var second = 0;
  304. month = Math.floor(time / (30 * 24 * 60 * 60));
  305. day = Math.floor(time / (24 * 60 * 60));
  306. hour = Math.floor((time % (24 * 60 * 60)) / (60 * 60));
  307. minute = Math.floor((time % (60 * 60)) / 60);
  308. second = Math.floor(time % 60);
  309. if (type == "1") {
  310. if (month > 0) {
  311. tTime = I18nUtil_1.I18n.getI18nText('common_timeword_4', month);
  312. }
  313. else if (day > 0) {
  314. tTime = I18nUtil_1.I18n.getI18nText('common_timeword_3', day);
  315. }
  316. else if (hour > 0) {
  317. tTime = I18nUtil_1.I18n.getI18nText('common_timeword_2', hour);
  318. }
  319. else if (minute > 0) {
  320. tTime = I18nUtil_1.I18n.getI18nText('common_timeword_1', minute);
  321. }
  322. else {
  323. tTime = I18nUtil_1.I18n.getI18nText('common_timeword_5');
  324. }
  325. }
  326. else if (type == "2") {
  327. if (month > 0) {
  328. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_mdhms_2', month, day, GameMath_1.default.addZero(hour), GameMath_1.default.addZero(minute), GameMath_1.default.addZero(second));
  329. }
  330. else if (day > 0) {
  331. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_dhms_2', day, GameMath_1.default.addZero(hour), GameMath_1.default.addZero(minute), GameMath_1.default.addZero(second));
  332. }
  333. else if (hour > 0) {
  334. tTime = hour + ":" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
  335. }
  336. else if (minute > 0) {
  337. tTime = "00:" + GameMath_1.default.addZero(minute) + ":" + GameMath_1.default.addZero(second);
  338. }
  339. else if (second > 0) {
  340. tTime = "00:00:" + GameMath_1.default.addZero(second);
  341. }
  342. else {
  343. tTime = "00:00:00";
  344. }
  345. }
  346. else {
  347. tTime = I18nUtil_1.I18n.getI18nText('common_timeformat_unknowtype');
  348. }
  349. return tTime;
  350. }
  351. exports.showTimeWord = showTimeWord;
  352. function IsSameDay(timestamp1, timestamp2) {
  353. var date1 = new Date(timestamp1 * 1000); // 转化为毫秒时间戳
  354. var date2 = new Date(timestamp2 * 1000);
  355. return (date1.getFullYear() === date2.getFullYear() &&
  356. date1.getMonth() === date2.getMonth() &&
  357. date1.getDate() === date2.getDate());
  358. }
  359. exports.IsSameDay = IsSameDay;
  360. // 阿拉伯数字转中文
  361. // export function chineseByNumber(number: number): string {
  362. // const chineseNumbers = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十'];
  363. // const chineseUnits = ['', '十', '百', '千', '万'];
  364. // if (number <= 10) {
  365. // return chineseNumbers[number];
  366. // } else {
  367. // const numberString = number.toString();
  368. // let result = ' ';
  369. // for (let i = 0; i < numberString.length; i++) {
  370. // const digit = parseInt(numberString[i]);
  371. // if (digit !== 0) {
  372. // if (numberString.length === 2 && i === 0 && digit === 1) {
  373. // result += chineseUnits[numberString.length - i - 1];
  374. // } else {
  375. // result += chineseNumbers[digit] + chineseUnits[numberString.length - i - 1];
  376. // }
  377. // } else {
  378. // if (i === 0 || numberString[i - 1] !== '0') {
  379. // result += chineseNumbers[digit];
  380. // }
  381. // }
  382. // }
  383. // return result;
  384. // }
  385. // }
  386. var FormulaCom = /** @class */ (function () {
  387. function FormulaCom() {
  388. }
  389. // return random int [min,max]
  390. FormulaCom.random = function (min, max) {
  391. return Math.floor(Math.random() * (max - min + 1) + min);
  392. };
  393. FormulaCom.uuid = function (len1, len2) {
  394. var timestamp = (new Date()).valueOf();
  395. return FormulaCom.random(Math.pow(10, len1 - 1) - 1, Math.pow(10, len1)).toString() + timestamp % (Math.pow(10, len2));
  396. };
  397. FormulaCom.costTime = function (type) {
  398. if (type == 1) {
  399. this.time = Date.now();
  400. }
  401. else if (type == 2) {
  402. console.log("cost " + (Date.now() - this.time) + "ms");
  403. }
  404. };
  405. //随机抽取元素不重复
  406. FormulaCom.getRandomArrayElements = function (arr, count) {
  407. count = Math.min(count, arr.length);
  408. var shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index;
  409. while (i-- > min) {
  410. index = Math.floor((i + 1) * Math.random());
  411. temp = shuffled[index];
  412. shuffled[index] = shuffled[i];
  413. shuffled[i] = temp;
  414. }
  415. return shuffled.slice(min);
  416. };
  417. // /**
  418. // * 一个时间点 距离今天相差几天 以1开始算 今天算1天 今天之后的算0天
  419. // * @param str
  420. // */
  421. // static passDay(str: number): number {
  422. // let Dates = new Date(GameDataCenter.timeModel.sevTime * 1000).setHours(0, 0, 0, 0);//获取今天0点0分0秒0毫秒。
  423. // let checkTime = new Date(str * 1000).setHours(0, 0, 0, 0);//获取当天0点0分0秒0毫秒。
  424. // if (Dates < checkTime) {
  425. // return 0
  426. // }
  427. // return Math.abs(Math.floor((Dates - checkTime) / 86400000)) + 1;
  428. // }
  429. // a>b则返回>0 a=b则返回0 a<b则返回<0
  430. FormulaCom.compareVersion = function (versionA, versionB) {
  431. var vA = versionA.split('.');
  432. var vB = versionB.split('.');
  433. for (var i = 0; i < vA.length; ++i) {
  434. var a = parseInt(vA[i]);
  435. var b = 0; //parseInt(vB[i] || 0)
  436. if (vB[i]) {
  437. b = parseInt(vB[i]);
  438. }
  439. if (a === b) {
  440. continue;
  441. }
  442. else {
  443. return a - b;
  444. }
  445. }
  446. if (vB.length > vA.length) {
  447. return -1;
  448. }
  449. else {
  450. return 0;
  451. }
  452. };
  453. FormulaCom.getStrLength = function (str) {
  454. var a = 0;
  455. for (var i = 0; i < str.length; i++) {
  456. if (str.charCodeAt(i) > 255)
  457. a += 2; //按照预期计数增加2
  458. else
  459. a++;
  460. }
  461. return a;
  462. };
  463. // 限制(默认16个字符) 中文2 英文1
  464. FormulaCom.getLimitStr = function (str, limit) {
  465. if (limit === void 0) { limit = 16; }
  466. var a = 0;
  467. for (var i = 0; i < str.length; i++) {
  468. if (str.charCodeAt(i) > 255)
  469. a += 2; //按照预期计数增加2
  470. else
  471. a++;
  472. if (a > limit) {
  473. return str.slice(0, i);
  474. }
  475. }
  476. return str;
  477. };
  478. FormulaCom.isOverLimit = function (str, limit) {
  479. if (limit === void 0) { limit = 16; }
  480. var a = 0;
  481. for (var i = 0; i < str.length; i++) {
  482. if (str.charCodeAt(i) > 255)
  483. a += 2; //按照预期计数增加2
  484. else
  485. a++;
  486. if (a > limit) {
  487. return true;
  488. }
  489. }
  490. return false;
  491. };
  492. // 多个对象在界面上的居中展示,需要box的锚点在中心 example: 3个道具 就是 -50 0 50
  493. // index以0为初始
  494. FormulaCom.getPosInBox = function (index, total, bgWidth, itemWidth) {
  495. var space = total == 1 ? 0 : (((bgWidth - itemWidth * total) / (total - 1) + itemWidth));
  496. var posx = 0;
  497. posx = -((total - 1) * (space / 2)) + index * (space);
  498. return posx;
  499. };
  500. // static isMinGan(str: string): boolean {
  501. // str = str.replace("\\u00A0", "") //去空
  502. // if (GameCfg.words.minGan.pool != null && str.length > 0) {
  503. // for (let i in GameCfg.words.minGan.pool) {
  504. // let _name = GameCfg.words.minGan.pool[i].name
  505. // if (str.toLowerCase().indexOf(_name.toLowerCase()) != -1) {
  506. // return true
  507. // }
  508. // }
  509. // }
  510. // return false
  511. // }
  512. // 提取包含 <%t>格式的字段
  513. FormulaCom.getExecStrs = function (str) {
  514. // var reg = /\<\%(.+?)\>/g
  515. var reg = /\<(.+?)\>/g;
  516. var list = [];
  517. var result = null;
  518. do {
  519. result = reg.exec(str);
  520. result && list.push(result[1]);
  521. } while (result);
  522. return list;
  523. };
  524. // // 将文字中的<%t12648673123> 转化为时间
  525. // // 返回 [解析后的字符串,时间戳,时间戳...]
  526. // static textAnalysis(text: string): string[] {
  527. // // list列表 ["t12323451514","t145132154"]
  528. // let list = FormulaCom.getExecStrs(text)
  529. // let timeList = []
  530. // let result = []
  531. // let resultText = text
  532. // list.forEach(element => {
  533. // if (element[0] == "t") {
  534. // // 去除英文,保留数字
  535. // timeList.push(element.replace(/[^\d]/g, ''))
  536. // }
  537. // });
  538. // timeList.forEach(time => {
  539. // let tag = "<%t" + time + ">"
  540. // // resultText = resultText.replace(tag, new Date(time).toTimeString())
  541. // resultText = resultText.replace(tag, showTimeYMD(time))
  542. // })
  543. // result.push(resultText)
  544. // timeList.forEach(time => {
  545. // result.push(time)
  546. // });
  547. // return result
  548. // }
  549. /** 让动画在指定区间内循环 */
  550. FormulaCom.loopAtFrame = function (te, sFrame, eFrame) {
  551. if (te.animationStart === 0) {
  552. te.animationStart = sFrame / 30; // 30是Spine动画的帧率
  553. te.animationEnd = eFrame / 30;
  554. }
  555. };
  556. /**
  557. * 停止在指定帧。1是开始,-1是最后
  558. * @param frame 帧数
  559. */
  560. FormulaCom.stopAtFrame = function (spineComp, frame) {
  561. var te = spineComp.getCurrent(0);
  562. // 算出帧对应的时间
  563. var time;
  564. if (frame === -1) {
  565. time = te.animation.duration; // 最后一帧
  566. }
  567. else if (frame > 1) {
  568. time = (frame - 1) / 30; // 根据帧率算出对应时间,spine帧率是30
  569. }
  570. else {
  571. time = 0; // 首帧
  572. }
  573. // 对time作限制
  574. if (time < 0)
  575. time = 0;
  576. if (time >= te.animation.duration)
  577. time = te.animation.duration - 0.01; // 太精确的话,动画会停在首帧,所以要减一点
  578. te.timeScale = 0; // 让动画停止
  579. te.trackTime = time;
  580. };
  581. /**
  582. * 把服务器时间戳 改为本地时间戳
  583. * @param time 需要转换的时间戳
  584. * @param utcMin 服务器时区(按分钟计)
  585. // -300 西5区美国 -5*60 GMT-5
  586. // 0
  587. // 480 东8区北京 8*60
  588. */
  589. FormulaCom.getUtcTime = function (time, utcHour) {
  590. var utcMin = utcHour * 60;
  591. //本地时间类
  592. var localtime = new Date();
  593. //本地时区针对标准时区的偏移
  594. var pym = localtime.getTimezoneOffset();
  595. //时间转换为指定时区时间
  596. time += (pym + utcMin) * 60;
  597. return time;
  598. };
  599. FormulaCom.getRandomTag = function () {
  600. var outString = '';
  601. var inOptions = 'abcdefghijklmnopqrstuvwxyz0123456789';
  602. for (var i = 0; i < 16; i++) {
  603. outString += inOptions.charAt(Math.floor(Math.random() * inOptions.length));
  604. }
  605. return outString;
  606. };
  607. FormulaCom.getDistance = function (x1, y1, x2, y2) {
  608. var a = x2 - x1;
  609. var b = y2 - y1;
  610. return Math.sqrt(a * a + b * b);
  611. };
  612. /**
  613. * 根据锚点重新计算中心点世界坐标坐标
  614. * @param pos 锚点的世界坐标
  615. * @param node 节点
  616. * @returns
  617. */
  618. FormulaCom.fixAnchor = function (pos, node) {
  619. var x = pos.x - node.anchorX * node.width + node.width / 2;
  620. var y = pos.y - node.anchorY * node.height + node.height / 2;
  621. return new cc.Vec2(x, y);
  622. };
  623. /**
  624. * 获得某个节点中心点的世界坐标
  625. * @param node
  626. * @returns
  627. */
  628. FormulaCom.getWorldCenterPos = function (node) {
  629. return this.fixAnchor(this.getWorldPos(node), node);
  630. };
  631. FormulaCom.getWorldPos = function (node) {
  632. if (gameMethod_1.gameMethod.isEmpty(node))
  633. return cc.v2(0, 0);
  634. return node.convertToWorldSpaceAR(cc.Vec2.ZERO);
  635. };
  636. FormulaCom.setPosByWorldPos = function (node, pos) {
  637. if (gameMethod_1.gameMethod.isEmpty(node))
  638. return;
  639. var _pos = node.parent.convertToNodeSpaceAR(pos);
  640. node.x = _pos.x;
  641. node.y = _pos.y;
  642. };
  643. //获取node位于target的坐标相对坐标
  644. FormulaCom.getPositionInView = function (node, target) {
  645. var worldPos = node.parent.convertToWorldSpaceAR(node.position);
  646. var viewPos = target.convertToNodeSpaceAR(worldPos);
  647. return viewPos;
  648. };
  649. // 获取玩家最后一次登录时间
  650. FormulaCom.getUserState = function (lastadok, sevTime) {
  651. var userState = '';
  652. var time = Math.floor((sevTime - lastadok) / 60);
  653. if (time < 6) {
  654. userState = I18nUtil_1.I18n.getI18nText('common_userLoginState_1');
  655. }
  656. else if (time < 60) {
  657. userState = I18nUtil_1.I18n.getI18nText('common_timeword_1', time);
  658. }
  659. else if (time < 24 * 60) {
  660. userState = I18nUtil_1.I18n.getI18nText('common_timeword_2', Math.floor(time / 60));
  661. }
  662. else {
  663. userState = I18nUtil_1.I18n.getI18nText('common_timeword_3', Math.floor((time / 60) / 24));
  664. }
  665. return userState;
  666. };
  667. // 已知圆心,半径,角度,求坐标
  668. FormulaCom.getPosbyAngle = function (centerX, centerY, range, angle) {
  669. var radians = this.getRadiansByAngle(angle);
  670. var dx = Math.cos(radians) * range;
  671. var dy = Math.sin(radians) * range;
  672. return { x: centerX + dx, y: centerY + dy };
  673. };
  674. // 已知坐标求角度
  675. FormulaCom.getAngleByPos = function (x1, y1, x2, y2) {
  676. if (x1 == x2 && y1 == y2) {
  677. return 0;
  678. }
  679. var degree = Math.atan2(y2 - y1, x2 - x1);
  680. return degree * 180 / Math.PI;
  681. };
  682. //求两个点的角度
  683. FormulaCom.getAngle = function (startPos, endPos) {
  684. //计算出朝向
  685. var dx = endPos.x - startPos.x;
  686. var dy = endPos.y - startPos.y;
  687. var dir = cc.v2(dx, dy);
  688. //根据朝向计算出夹角弧度
  689. var angle = dir.signAngle(cc.v2(1, 0));
  690. //将弧度转换为欧拉角
  691. var degree = angle / Math.PI * 180;
  692. return -degree;
  693. };
  694. // 根据角度获取弧度
  695. FormulaCom.getRadiansByAngle = function (angle) {
  696. return angle / 180 * Math.PI;
  697. };
  698. // 根据弧度获取角度
  699. FormulaCom.getAngleByRadians = function (radians) {
  700. return radians * 180 / Math.PI;
  701. };
  702. FormulaCom.obj2Array = function (object) {
  703. if (typeof object != "object") {
  704. return [];
  705. }
  706. return Object.values(object);
  707. // let array = []
  708. // for (const key in object) {
  709. // array.push(object[key])
  710. // }
  711. // return array
  712. };
  713. FormulaCom.strDLength = function (str) {
  714. var rStr = str.replace(/[^\x00-\xff]/g, ''); //双字节字符:(包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
  715. return str.length - rStr.length;
  716. };
  717. // 首字母大写
  718. FormulaCom.firstUpCase = function (str) {
  719. return str[0].toUpperCase() + str.substring(1);
  720. };
  721. // 判断字符长度
  722. FormulaCom.getStrCharacterLength = function (str) {
  723. var patternChinese = new RegExp("[\u4E00-\u9FA5]+"); // 中文
  724. var leng = 0;
  725. for (var index = 0; index < str.length; index++) {
  726. if (patternChinese.test(str[index])) {
  727. leng += 2;
  728. }
  729. else {
  730. leng += 1;
  731. }
  732. }
  733. return leng;
  734. };
  735. //根据索引获取当前行列数
  736. // index 当前索引值(从0开始) elementsPerRow 一行有几个
  737. FormulaCom.getRowAndColumnFromIndex = function (index, columnCount) {
  738. if (columnCount < 1) {
  739. throw new Error('Column count must be a positive integer.');
  740. }
  741. var rowIndex = Math.floor(index / columnCount);
  742. var columnIndex = index % columnCount;
  743. return { rowIndex: rowIndex, columnIndex: columnIndex };
  744. };
  745. // 对数组按数量分组
  746. FormulaCom.groupTwoByTwo = function (input, count) {
  747. var result = [];
  748. for (var i = 0; i < input.length; i += count) {
  749. if (gameMethod_1.gameMethod.isEmpty(input[i]) || gameMethod_1.gameMethod.isEmpty(input[i + 1])) {
  750. console.error("该数组分配不足,检查数组长度");
  751. }
  752. result.push([input[i], input[i + 1]]);
  753. }
  754. return result;
  755. };
  756. FormulaCom.time = 0;
  757. return FormulaCom;
  758. }());
  759. exports.FormulaCom = FormulaCom;
  760. // 阿拉伯数字转中文
  761. function chineseByNumber(number) {
  762. var chineseNumbers = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十'];
  763. var chineseUnits = ['', '十', '百', '千', '万'];
  764. if (number <= 10) {
  765. return chineseNumbers[number];
  766. }
  767. else {
  768. var numberString = number.toString();
  769. var result = ' ';
  770. for (var i = 0; i < numberString.length; i++) {
  771. var digit = parseInt(numberString[i]);
  772. if (digit !== 0) {
  773. if (numberString.length === 2 && i === 0 && digit === 1) {
  774. result += chineseUnits[numberString.length - i - 1];
  775. }
  776. else {
  777. result += chineseNumbers[digit] + chineseUnits[numberString.length - i - 1];
  778. }
  779. }
  780. else {
  781. if (i === 0 || numberString[i - 1] !== '0') {
  782. result += chineseNumbers[digit];
  783. }
  784. }
  785. }
  786. return result;
  787. }
  788. }
  789. exports.chineseByNumber = chineseByNumber;
  790. cc._RF.pop();
  791. }
  792. if (nodeEnv) {
  793. __define(__module.exports, __require, __module);
  794. }
  795. else {
  796. __quick_compile_project__.registerModuleFunc(__filename, function () {
  797. __define(__module.exports, __require, __module);
  798. });
  799. }
  800. })();
  801. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvdXRpbHMvRm9ybXVsYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBcUM7QUFDckMsa0RBQWtEO0FBQ2xELDRDQUE0QztBQUM1QyxrQ0FBa0M7QUFDbEMsc0NBQXNDO0FBQ3RDLG1EQUFrRDtBQUNsRCx1Q0FBa0M7QUFDbEMsdUNBQWtDO0FBQ2xDLDRDQUE0QztBQUU1QyxZQUFZO0FBQ1osU0FBZ0IsU0FBUyxDQUFDLEdBQVc7SUFBRSxjQUFPO1NBQVAsVUFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTztRQUFQLDZCQUFPOztJQUMxQyxPQUFPLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDOUIsd0NBQXdDO0lBQ3hDLHFDQUFxQztJQUNyQyxJQUFJO0lBQ0osMEJBQTBCO0lBQzFCLHVDQUF1QztJQUN2QyxzQkFBc0I7SUFDdEIscUNBQXFDO0lBQ3JDLElBQUk7SUFDSiwyQkFBMkI7SUFDM0Isd0JBQXdCO0lBQ3hCLHFDQUFxQztJQUNyQyxJQUFJO0lBQ0osb0NBQW9DO0FBQ3hDLENBQUM7QUFmRCw4QkFlQztBQUNELGlCQUFpQjtBQUNqQiwwREFBMEQ7QUFDMUQsaUVBQWlFO0FBQ2pFLHFCQUFxQjtBQUNyQixRQUFRO0FBQ1IsZ0VBQWdFO0FBQ2hFLHdDQUF3QztBQUN4QyxJQUFJO0FBQ0osNEJBQTRCO0FBQzVCLGtEQUFrRDtBQUNsRCxvRUFBb0U7QUFDcEUsd0NBQXdDO0FBQ3hDLElBQUk7QUFDSixTQUFnQixZQUFZLENBQUMsR0FBVyxFQUFFLElBQVc7SUFDakQsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUE7S0FBRTtJQUM5QixJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUE7SUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxLQUFLO1FBQ3hCLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9B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TSxJQUFJLEVBQUUsRUFBRTtRQUNkLE9BQU8sY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ2pDO1NBQU07UUFDSCxJQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdkMsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBRWpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV4QyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7Z0JBQ2IsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7b0JBQ3JELE1BQU0sSUFBSSxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZEO3FCQUFNO29CQUNILE1BQU0sSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUMvRTthQUNKO2lCQUFNO2dCQUNILElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtvQkFDeEMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbkM7YUFDSjtTQUNKO1FBQ0QsT0FBTyxNQUFNLENBQUM7S0FDakI7QUFDTCxDQUFDO0FBMUJELDBDQTBCQyIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCBHYW1lTWF0aCBmcm9tICcuL0dhbWVNYXRoJztcbi8vIGltcG9ydCB7IGdhbWVNZXRob2QgfSBmcm9tICcuLi9jZmcvZ2FtZU1ldGhvZCc7XG4vLyBpbXBvcnQgeyBnYW1lQ2ZnIH0gZnJvbSAnLi4vY2ZnL0dhbWVDZmcnO1xuLy8gaW1wb3J0IENvbmZpZyBmcm9tICcuLi9Db25maWcnO1xuLy8gaW1wb3J0IHsgSGRjaWQgfSBmcm9tICcuLi9jZmcvWHlTJztcbmltcG9ydCB7IGdhbWVNZXRob2QgfSBmcm9tICcuLi9jb21tb24vZ2FtZU1ldGhvZCc7XG5pbXBvcnQgR2FtZU1hdGggZnJvbSAnLi9HYW1lTWF0aCc7XG5pbXBvcnQgeyBJMThuIH0gZnJvbSAnLi9JMThuVXRpbCc7XG4vLyBpbXBvcnQgeyBXb3JrVHlwZSB9IGZyb20gJy4uL2NmZy9YeVdvcmsnO1xuXG4vLyDmnKzlnLDljJYs5qC85byP5YyW5paH5a2XXG5leHBvcnQgZnVuY3Rpb24gbG9jYWxpemVkKGtleTogc3RyaW5nLCAuLi5hcmdzKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyaW5nRm9ybWF0KGtleSwgYXJncylcbiAgICAvLyBpZiAoa2V5ID09IG51bGwgfHwga2V5Lmxlbmd0aCA9PSAwKSB7XG4gICAgLy8gICAgIHJldHVybiBzdHJpbmdGb3JtYXQoa2V5LCBhcmdzKVxuICAgIC8vIH1cbiAgICAvLyBsZXQgX2xhbmcgPSBDb25maWcubGFuZ1xuICAgIC8vIGxldCBkYXRhID0gR2FtZUNmZy5sYW5nLmdldEl0ZW0oa2V5KVxuICAgIC8vIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAvLyAgICAgcmV0dXJuIHN0cmluZ0Zvcm1hdChrZXksIGFyZ3MpXG4gICAgLy8gfVxuICAgIC8vIGxldCByZXN1bHQgPSBkYXRhW19sYW5nXVxuICAgIC8vIGlmIChyZXN1bHQgPT0gbnVsbCkge1xuICAgIC8vICAgICByZXR1cm4gc3RyaW5nRm9ybWF0KGtleSwgYXJncylcbiAgICAvLyB9XG4gICAgLy8gcmV0dXJuIHN0cmluZ0Zvcm1hdChyZXN1bHQsIGFyZ3MpXG59XG4vLyAvLyDojrflj5ZjbGllbnTphY3nva7ooahcbi8vIGV4cG9ydCBmdW5jdGlvbiBnZXRXb3JkKHN0cjogc3RyaW5nLCAuLi5hcmdzKTogc3RyaW5nIHtcbi8vICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGdhbWVDZmcubGFuZ0NsaWVudC5nZXRJdGVtKHN0cikpKSB7XG4vLyAgICAgICAgIHJldHVybiBzdHJcbi8vICAgICB9XG4vLyAgICAgbGV0IHJlc3VsdCA9IGdhbWVDZmcubGFuZ0NsaWVudC5nZXRJdGVtKHN0cilbQ29uZmlnLmxhbmddXG4vLyAgICAgcmV0dXJuIHN0cmluZ0Zvcm1hdChyZXN1bHQsIGFyZ3MpXG4vLyB9XG4vLyAvLyDojrflj5YgY2xpZW50VGV4dC5jc3bphY3nva7ooajmloflrZdcbi8vIGV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0KHN0cjogc3RyaW5nLCAuLi5hcmdzKSB7XG4vLyAgICAgbGV0IHJlc3VsdCA9IGdhbWVDZmcubGFuZ0NsaWVudFRleHQuZ2V0SXRlbShzdHIpW0NvbmZpZy5sYW5nXVxuLy8gICAgIHJldHVybiBzdHJpbmdGb3JtYXQocmVzdWx0LCBhcmdzKVxuLy8gfVxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0Zvcm1hdChzdHI6IHN0cmluZywgbGlzdDogYW55W10pOiBzdHJpbmcge1xuICAgIGlmIChzdHIgPT0gbnVsbCkgeyByZXR1cm4gXCJcIiB9XG4gICAgbGV0IHJlc3VsdCA9IHN0clxuICAgIGxpc3QuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoYCV7JHtpbmRleH19YCwgZWxlbWVudClcbiAgICB9KVxuICAgIHJldHVybiByZXN1bHRcbn1cbi8vIC8qKlxuLy8gICog5pi+56S65YCS6K6h5pe2XG4vLyAgKiBAcGFyYW0gdGltZSDlgJLorqHml7bnu5PmnZ/ml7bpl7TmiLNcbi8vICAqIEBwYXJhbSBhY3Qg5rS75Yqoa2V5XG4vLyAgKiBAcGFyYW0gaGRjaWQg5rS75YqoSGRjaWRcbi8vICAqIEBwYXJhbSB0eXBlIOWAkuiuoeaXtuWxleekuuexu+WeiyAgICAgXG4vLyAgKiBAcmV0dXJucyBcbi8vICAqL1xuLy8gZXhwb3J0IGZ1bmN0aW9uIHNob3dDZFRpbWUodGltZTogbnVtYmVyLCBhY3Q6IFdvcmtUeXBlLCBoZGNpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcgPSAnMScpIHtcbi8vICAgICBsZXQgY2RUaW1lOiBudW1iZXIgPSAwXG4vLyAgICAgY2RUaW1lID0gdGltZSAtIEdhbWVEYXRhQ2VudGVyLnRpbWVNb2RlbC5zZXZUaW1lXG4vLyAgICAgaWYgKGNkVGltZSA+PSAwKSB7XG4vLyAgICAgICAgIHJldHVybiB0aGlzLnNob3dUaW1lKGNkVGltZSwgdHlwZSlcbi8vICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAvLyDpmLLmraLlu7bov5/kvJrkuIDnm7Tph43lpI3lj5HpgIHor7fmsYJcbi8vICAgICAgICAgaWYgKEdhbWVEYXRhQ2VudGVyLnRpbWVNb2RlbC5nZXRJc0tleUFkb2soYWN0KSkge1xuLy8gICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIudGltZU1vZGVsLnNlbmRBZG9rS2V5KHRpbWUsIGFjdCwgaGRjaWQpXG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyB9XG4vKipcbiAqIOenkue6p+WIqygxMOS9jeaVsClcbiAqIEBwYXJhbSB0aW1lIOaXtumXtOaIs1xuICogQHBhcmFtIHR5cGUg57G75Z6LIFxuICogICAgICAgICAgICAgIDE6IOWkp+S6juS4gOWkqSzmmL7npLp45aSpeOaXtjvlsI/kuo7kuIDlpKks5pi+56S6MDA6MDA6MDAo5aSp5pWw5LiN6LazLOihpTApICAgIFxuICogICAgICAgICAgICAgIDI6IDHlpKkzNuWIhijlj6rmmL7npLrmnIDliY3pnaLnmoTkuKTkvY0pXG4gKiAgICAgICAgICAgICAgMzog5bCP5LqO5LiA5bCP5pe277yM5pi+56S6eHg6eHgo5YiG56eSKVxuICogICAgICAgICAgICAgIDQ6IOWPquaYvuekuuacgOmrmOWNleS9jSDlpKfkuo4x5aSpIOaYvuekujHlpKkg5aSn5LqOMeWwj+aXtiDmmL7npLox5pe2XG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dUaW1lKHRpbWU6IG51bWJlciwgdHlwZTogc3RyaW5nID0gXCIxXCIpOiBzdHJpbmcge1xuICAgIGlmICh0aW1lLnRvU3RyaW5nKCkubGVuZ3RoID09IDEzKSB7XG4gICAgICAgIHRpbWUgPSBNYXRoLmZsb29yKHRpbWUgLyAxMDAwKVxuICAgIH1cbiAgICBpZiAodGltZSA8PSAwKSB7XG4gICAgICAgIHJldHVybiB0eXBlID09IFwiM1wiID8gXCIwMDowMFwiIDogXCIwMDowMDowMFwiXG4gICAgfVxuICAgIGxldCB0VGltZSA9ICcnXG4gICAgbGV0IGRheTogbnVtYmVyID0gMFxuICAgIGxldCBob3VyOiBudW1iZXIgPSAwXG4gICAgbGV0IG1pbnV0ZTogbnVtYmVyID0gMFxuICAgIGxldCBzZWNvbmQ6IG51bWJlciA9IDBcbiAgICBkYXkgPSBNYXRoLmZsb29yKHRpbWUgLyAoMjQgKiA2MCAqIDYwKSlcbiAgICBob3VyID0gTWF0aC5mbG9vcigodGltZSAlICgyNCAqIDYwICogNjApKSAvICg2MCAqIDYwKSlcbiAgICBtaW51dGUgPSBNYXRoLmZsb29yKCh0aW1lICUgKDYwICogNjApKSAvIDYwKVxuICAgIHNlY29uZCA9IE1hdGguZmxvb3IodGltZSAlIDYwKVxuXG4gICAgaWYgKHR5cGUgPT0gXCIxXCIpIHtcbiAgICAgICAgaWYgKGRheSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfZGgnLCBkYXksIGhvdXIpXG4gICAgICAgIH0gZWxzZSBpZiAoaG91ciA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gYCR7R2FtZU1hdGguYWRkWmVybyhkYXkgKiAyNCArIGhvdXIpfToke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX06JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICAgICAgLy8gdFRpbWUgPSBgJHtHYW1lTWF0aC5hZGRaZXJvKGRheSAqIDI0ICsgaG91cil95pe2JHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl95YiGYFxuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gYDAwOiR7R2FtZU1hdGguYWRkWmVybyhtaW51dGUpfToke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX1gXG4gICAgICAgICAgICAvLyB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX3liIYke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX3np5JgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0VGltZSA9IGAwMDowMDoke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX1gXG4gICAgICAgICAgICAvLyB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX3np5JgXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCIyXCIpIHtcbiAgICAgICAgaWYgKGRheSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfZGgnLCBkYXksIGhvdXIpXG4gICAgICAgIH0gZWxzZSBpZiAoaG91ciA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gYCR7R2FtZU1hdGguYWRkWmVybyhkYXkgKiAyNCArIGhvdXIpfeaXtiR7R2FtZU1hdGguYWRkWmVybyhtaW51dGUpfeWIhmBcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX3liIYke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX3np5JgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX3np5JgXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJzMnKSB7XG4gICAgICAgIGlmIChkYXkgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1lZm9ybWF0X2RoJywgZGF5LCBob3VyKVxuICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8oZGF5ICogMjQgKyBob3VyKX06JHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl9OiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgICAgIC8vIHRUaW1lID0gYCR7R2FtZU1hdGguYWRkWmVybyhkYXkgKiAyNCArIGhvdXIpfeaXtiR7R2FtZU1hdGguYWRkWmVybyhtaW51dGUpfeWIhmBcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX06JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICAgICAgLy8gdFRpbWUgPSBgJHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl95YiGJHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl956eSYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdFRpbWUgPSBgMDA6JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICAgICAgLy8gdFRpbWUgPSBgJHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl956eSYFxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09ICc0Jykge1xuICAgICAgICBpZiAoZGF5ID4gMSkge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZWZvcm1hdF9kJywgZGF5KVxuICAgICAgICB9IGVsc2UgaWYgKGRheSA+IDAgfHwgaG91ciA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfaCcsIGRheSAqIDI0ICsgaG91cilcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1lZm9ybWF0X20nLCBtaW51dGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0VGltZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1lZm9ybWF0X3MnLCBzZWNvbmQpXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJzUnKSB7XG4gICAgICAgIGlmIChkYXkgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IGAke0dhbWVNYXRoLmFkZFplcm8oZGF5ICogMjQgKyBob3VyKX06JHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl9OiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgfSBlbHNlIGlmIChob3VyID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBgJHtHYW1lTWF0aC5hZGRaZXJvKGRheSAqIDI0ICsgaG91cil9OiR7R2FtZU1hdGguYWRkWmVybyhtaW51dGUpfToke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX1gXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBgMDA6JHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl9OiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRUaW1lID0gYDAwOjAwOiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnNicpIHtcbiAgICAgICAgaWYgKGRheSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfZGhtcycsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpOy8vIHjlpKl45bCP5pe2eOWIhnjnp5JcbiAgICAgICAgfSBlbHNlIGlmIChob3VyID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZWZvcm1hdF9obXMnLCBob3VyLCBtaW51dGUsIHNlY29uZCk7Ly8geOWwj+aXtnjliIZ456eSXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZWZvcm1hdF9tcycsIG1pbnV0ZSwgc2Vjb25kKTsvLyB45YiGeOenklxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZWZvcm1hdF9zJywgc2Vjb25kKTsvLyB456eSXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJzcnKSB7XG4gICAgICAgIGlmIChkYXkgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1lZm9ybWF0X2RobXNfMicsIGRheSwgR2FtZU1hdGguYWRkWmVybyhob3VyKSwgR2FtZU1hdGguYWRkWmVybyhtaW51dGUpLCBHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCkpXG4gICAgICAgIH0gZWxzZSBpZiAoaG91ciA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gYCR7R2FtZU1hdGguYWRkWmVybyhob3VyKX06JHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl9OiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IGAwMDoke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX06JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdFRpbWUgPSBgMDA6MDA6JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09ICc4JykgeyAvLyDmmL7npLrkuKTkuKrljZXkvY1cbiAgICAgICAgaWYgKGRheSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfZGgnLCBkYXksIGhvdXIpXG4gICAgICAgIH0gZWxzZSBpZiAoaG91ciA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gYCR7R2FtZU1hdGguYWRkWmVybyhkYXkgKiAyNCArIGhvdXIpfToke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX1gXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBgJHtHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSl9OiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRUaW1lID0gYDAwOiR7R2FtZU1hdGguYWRkWmVybyhzZWNvbmQpfWBcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdFRpbWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3dUaW1lWU1EKHNoaWppYW5jaHVvOiBudW1iZXIsIHR5cGU6IG51bWJlciA9IDApOiBzdHJpbmcge1xuICAgIGlmIChzaGlqaWFuY2h1by50b1N0cmluZygpLmxlbmd0aCA9PSAxMCkge1xuICAgICAgICBzaGlqaWFuY2h1byA9IHNoaWppYW5jaHVvICogMTAwMFxuICAgIH1cbiAgICB2YXIgdGltZSA9IG5ldyBEYXRlKHNoaWppYW5jaHVvKTtcbiAgICB2YXIgeSA9IHRpbWUuZ2V0RnVsbFllYXIoKVxuICAgIHZhciBtID0gdGltZS5nZXRNb250aCgpICsgMVxuICAgIHZhciBkID0gdGltZS5nZXREYXRlKClcbiAgICB2YXIgaCA9IHRpbWUuZ2V0SG91cnMoKVxuICAgIHZhciBtbSA9IHRpbWUuZ2V0TWludXRlcygpXG4gICAgdmFyIHMgPSB0aW1lLmdldFNlY29uZHMoKVxuICAgIGlmICh0eXBlID09IDApIHtcbiAgICAgICAgcmV0dXJuIGAke3l9LSR7R2FtZU1hdGguYWRkWmVybyhtKX0tJHtHYW1lTWF0aC5hZGRaZXJvKGQpfSAke0dhbWVNYXRoLmFkZFplcm8oaCl9OiR7R2FtZU1hdGguYWRkWmVybyhtbSl9OiR7R2FtZU1hdGguYWRkWmVybyhzKX1gXG4gICAgfSBlbHNlIGlmICh0eXBlID09IDEpIHtcbiAgICAgICAgcmV0dXJuIGAke0dhbWVNYXRoLmFkZFplcm8oeSl9LSR7R2FtZU1hdGguYWRkWmVybyhtKX0tJHtHYW1lTWF0aC5hZGRaZXJvKGQpfWBcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMikge1xuICAgICAgICByZXR1cm4gYCR7R2FtZU1hdGguYWRkWmVybyh5KX0uJHtHYW1lTWF0aC5hZGRaZXJvKG0pfS4ke0dhbWVNYXRoLmFkZFplcm8oZCl9YFxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSAzKSB7XG4gICAgICAgIHJldHVybiBgJHtHYW1lTWF0aC5hZGRaZXJvKG0pfS0ke0dhbWVNYXRoLmFkZFplcm8oZCl9ICR7R2FtZU1hdGguYWRkWmVybyhoKX06JHtHYW1lTWF0aC5hZGRaZXJvKG1tKX1gXG4gICAgfSBlbHNlIGlmICh0eXBlID09IDQpIHtcbiAgICAgICAgcmV0dXJuIGAke0dhbWVNYXRoLmFkZFplcm8obSl9LyR7R2FtZU1hdGguYWRkWmVybyhkKX1gXG4gICAgfSBlbHNlIGlmICh0eXBlID09IDUpIHtcbiAgICAgICAgcmV0dXJuIGAke0dhbWVNYXRoLmFkZFplcm8oeSl9LyR7R2FtZU1hdGguYWRkWmVybyhtKX0vJHtHYW1lTWF0aC5hZGRaZXJvKGQpfWBcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gNikgey8v6K6+572u55WM6Z2i5pe26Ze05pi+56S6XG4gICAgICAgIHJldHVybiBgJHtHYW1lTWF0aC5hZGRaZXJvKHkpfS0ke0dhbWVNYXRoLmFkZFplcm8obSl9LSR7R2FtZU1hdGguYWRkWmVybyhkKX0gJHtHYW1lTWF0aC5hZGRaZXJvKGgpfToke0dhbWVNYXRoLmFkZFplcm8obW0pfToke0dhbWVNYXRoLmFkZFplcm8ocyl9YFxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSA3KSB7XG4gICAgICAgIHJldHVybiBgJHtHYW1lTWF0aC5hZGRaZXJvKGgpfToke0dhbWVNYXRoLmFkZFplcm8obW0pfWBcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gOCkge1xuICAgICAgICByZXR1cm4gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfeW1kJywgeSwgbSwgZClcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gOSkge1xuICAgICAgICByZXR1cm4gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfbWQnLCBtLCBkKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSAxMCkge1xuICAgICAgICByZXR1cm4gYCR7eX0vJHttfS8ke2R9YFxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSAxMSkgeyAvLyAwMDowMDowMOagvOW8j1xuICAgICAgICByZXR1cm4gYCR7R2FtZU1hdGguYWRkWmVybyhoKX06JHtHYW1lTWF0aC5hZGRaZXJvKG1tKX06JHtHYW1lTWF0aC5hZGRaZXJvKHMpfWBcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMTIpIHsgXG4gICAgICAgIHJldHVybiBgJHtHYW1lTWF0aC5hZGRaZXJvKHkpfS8ke0dhbWVNYXRoLmFkZFplcm8obSl9LyR7R2FtZU1hdGguYWRkWmVybyhkKX0gJHtHYW1lTWF0aC5hZGRaZXJvKGgpfToke0dhbWVNYXRoLmFkZFplcm8obW0pfToke0dhbWVNYXRoLmFkZFplcm8ocyl9YFxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSAxMykgeyBcbiAgICAgICAgcmV0dXJuIGAke0dhbWVNYXRoLmFkZFplcm8obSl9LyR7R2FtZU1hdGguYWRkWmVybyhkKX0gJHtHYW1lTWF0aC5hZGRaZXJvKGgpfToke0dhbWVNYXRoLmFkZFplcm8obW0pfToke0dhbWVNYXRoLmFkZFplcm8ocyl9YFxuICAgIH0gXG59XG5leHBvcnQgZnVuY3Rpb24gc2hvd1RpbWVXb3JkKHRpbWU6IG51bWJlciwgdHlwZTogc3RyaW5nID0gXCIxXCIpOiBzdHJpbmcge1xuICAgIGxldCB0VGltZSA9ICcnXG4gICAgbGV0IG1vbnRoOiBudW1iZXIgPSAwXG4gICAgbGV0IGRheTogbnVtYmVyID0gMFxuICAgIGxldCBob3VyOiBudW1iZXIgPSAwXG4gICAgbGV0IG1pbnV0ZTogbnVtYmVyID0gMFxuICAgIGxldCBzZWNvbmQ6IG51bWJlciA9IDBcbiAgICBtb250aCA9IE1hdGguZmxvb3IodGltZSAvICgzMCAqIDI0ICogNjAgKiA2MCkpXG4gICAgZGF5ID0gTWF0aC5mbG9vcih0aW1lIC8gKDI0ICogNjAgKiA2MCkpXG4gICAgaG91ciA9IE1hdGguZmxvb3IoKHRpbWUgJSAoMjQgKiA2MCAqIDYwKSkgLyAoNjAgKiA2MCkpXG4gICAgbWludXRlID0gTWF0aC5mbG9vcigodGltZSAlICg2MCAqIDYwKSkgLyA2MClcbiAgICBzZWNvbmQgPSBNYXRoLmZsb29yKHRpbWUgJSA2MClcbiAgICBpZiAodHlwZSA9PSBcIjFcIikge1xuICAgICAgICBpZiAobW9udGggPiAwKSB7XG4gICAgICAgICAgICB0VGltZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1ld29yZF80JywgbW9udGgpXG4gICAgICAgIH0gZWxzZSBpZiAoZGF5ID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZXdvcmRfMycsIGRheSlcbiAgICAgICAgfSBlbHNlIGlmIChob3VyID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZXdvcmRfMicsIGhvdXIpXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZXdvcmRfMScsIG1pbnV0ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWV3b3JkXzUnKVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiMlwiKSB7XG4gICAgICAgIGlmIChtb250aCA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfbWRobXNfMicsIG1vbnRoLCBkYXksIEdhbWVNYXRoLmFkZFplcm8oaG91ciksIEdhbWVNYXRoLmFkZFplcm8obWludXRlKSwgR2FtZU1hdGguYWRkWmVybyhzZWNvbmQpKVxuICAgICAgICB9IGVsc2UgaWYgKGRheSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWVmb3JtYXRfZGhtc18yJywgZGF5LCBHYW1lTWF0aC5hZGRaZXJvKGhvdXIpLCBHYW1lTWF0aC5hZGRaZXJvKG1pbnV0ZSksIEdhbWVNYXRoLmFkZFplcm8oc2Vjb25kKSlcbiAgICAgICAgfSBlbHNlIGlmIChob3VyID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBgJHtob3VyfToke0dhbWVNYXRoLmFkZFplcm8obWludXRlKX06JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA+IDApIHtcbiAgICAgICAgICAgIHRUaW1lID0gYDAwOiR7R2FtZU1hdGguYWRkWmVybyhtaW51dGUpfToke0dhbWVNYXRoLmFkZFplcm8oc2Vjb25kKX1gXG4gICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kID4gMCkge1xuICAgICAgICAgICAgdFRpbWUgPSBgMDA6MDA6JHtHYW1lTWF0aC5hZGRaZXJvKHNlY29uZCl9YFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdFRpbWUgPSBgMDA6MDA6MDBgXG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0VGltZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1lZm9ybWF0X3Vua25vd3R5cGUnKVxuICAgIH1cblxuICAgIHJldHVybiB0VGltZVxufVxuZXhwb3J0IGZ1bmN0aW9uIElzU2FtZURheSh0aW1lc3RhbXAxOiBudW1iZXIsIHRpbWVzdGFtcDI6IG51bWJlcikge1xuICAgIGNvbnN0IGRhdGUxID0gbmV3IERhdGUodGltZXN0YW1wMSAqIDEwMDApOyAvLyDovazljJbkuLrmr6vnp5Lml7bpl7TmiLNcbiAgICBjb25zdCBkYXRlMiA9IG5ldyBEYXRlKHRpbWVzdGFtcDIgKiAxMDAwKTtcbiAgICByZXR1cm4gKFxuICAgICAgICBkYXRlMS5nZXRGdWxsWWVhcigpID09PSBkYXRlMi5nZXRGdWxsWWVhcigpICYmXG4gICAgICAgIGRhdGUxLmdldE1vbnRoKCkgPT09IGRhdGUyLmdldE1vbnRoKCkgJiZcbiAgICAgICAgZGF0ZTEuZ2V0RGF0ZSgpID09PSBkYXRlMi5nZXREYXRlKClcbiAgICApO1xufVxuXG4vLyDpmL/mi4nkvK/mlbDlrZfovazkuK3mlodcbi8vIGV4cG9ydCBmdW5jdGlvbiBjaGluZXNlQnlOdW1iZXIobnVtYmVyOiBudW1iZXIpOiBzdHJpbmcge1xuLy8gICAgIGNvbnN0IGNoaW5lc2VOdW1iZXJzID0gWyfpm7YnLCAn5LiAJywgJ+S6jCcsICfkuIknLCAn5ZubJywgJ+S6lCcsICflha0nLCAn5LiDJywgJ+WFqycsICfkuZ0nLCAn5Y2BJ107XG4vLyAgICAgY29uc3QgY2hpbmVzZVVuaXRzID0gWycnLCAn5Y2BJywgJ+eZvicsICfljYMnLCAn5LiHJ107XG4vLyAgICAgaWYgKG51bWJlciA8PSAxMCkge1xuLy8gICAgICAgICByZXR1cm4gY2hpbmVzZU51bWJlcnNbbnVtYmVyXTtcbi8vICAgICB9IGVsc2Uge1xuLy8gICAgICAgICBjb25zdCBudW1iZXJTdHJpbmcgPSBudW1iZXIudG9TdHJpbmcoKTtcbi8vICAgICAgICAgbGV0IHJlc3VsdCA9ICcgJztcblxuLy8gICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlclN0cmluZy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgY29uc3QgZGlnaXQgPSBwYXJzZUludChudW1iZXJTdHJpbmdbaV0pO1xuXG4vLyAgICAgICAgICAgICBpZiAoZGlnaXQgIT09IDApIHtcbi8vICAgICAgICAgICAgICAgICBpZiAobnVtYmVyU3RyaW5nLmxlbmd0aCA9PT0gMiAmJiBpID09PSAwICYmIGRpZ2l0ID09PSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjaGluZXNlVW5pdHNbbnVtYmVyU3RyaW5nLmxlbmd0aCAtIGkgLSAxXTtcbi8vICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2hpbmVzZU51bWJlcnNbZGlnaXRdICsgY2hpbmVzZVVuaXRzW251bWJlclN0cmluZy5sZW5ndGggLSBpIC0gMV07XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCB8fCBudW1iZXJTdHJpbmdbaSAtIDFdICE9PSAnMCcpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNoaW5lc2VOdW1iZXJzW2RpZ2l0XTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbi8vICAgICB9XG4vLyB9XG5cbmV4cG9ydCBjbGFzcyBGb3JtdWxhQ29tIHtcbiAgICAvLyByZXR1cm4gcmFuZG9tIGludCBbbWluLG1heF1cbiAgICBzdGF0aWMgcmFuZG9tKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluKVxuICAgIH1cbiAgICBzdGF0aWMgdXVpZChsZW4xLCBsZW4yKSB7XG4gICAgICAgIGxldCB0aW1lc3RhbXAgPSAobmV3IERhdGUoKSkudmFsdWVPZigpO1xuICAgICAgICByZXR1cm4gRm9ybXVsYUNvbS5yYW5kb20oTWF0aC5wb3coMTAsIGxlbjEgLSAxKSAtIDEsIE1hdGgucG93KDEwLCBsZW4xKSkudG9TdHJpbmcoKSArIHRpbWVzdGFtcCAlIChNYXRoLnBvdygxMCwgbGVuMikpXG4gICAgfVxuICAgIHN0YXRpYyB0aW1lOiBudW1iZXIgPSAwXG4gICAgc3RhdGljIGNvc3RUaW1lKHR5cGU6IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZSA9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgY29zdCAke0RhdGUubm93KCkgLSB0aGlzLnRpbWV9bXNgKVxuICAgICAgICB9XG4gICAgfVxuICAgIC8v6ZqP5py65oq95Y+W5YWD57Sg5LiN6YeN5aSNXG4gICAgc3RhdGljIGdldFJhbmRvbUFycmF5RWxlbWVudHM8VD4oYXJyOiBBcnJheTxUPiwgY291bnQ6IG51bWJlcik6IEFycmF5PFQ+IHtcbiAgICAgICAgY291bnQgPSBNYXRoLm1pbihjb3VudCwgYXJyLmxlbmd0aClcbiAgICAgICAgdmFyIHNodWZmbGVkID0gYXJyLnNsaWNlKDApLCBpID0gYXJyLmxlbmd0aCwgbWluID0gaSAtIGNvdW50LCB0ZW1wLCBpbmRleDtcbiAgICAgICAgd2hpbGUgKGktLSA+IG1pbikge1xuICAgICAgICAgICAgaW5kZXggPSBNYXRoLmZsb29yKChpICsgMSkgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgICAgIHRlbXAgPSBzaHVmZmxlZFtpbmRleF07XG4gICAgICAgICAgICBzaHVmZmxlZFtpbmRleF0gPSBzaHVmZmxlZFtpXTtcbiAgICAgICAgICAgIHNodWZmbGVkW2ldID0gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2h1ZmZsZWQuc2xpY2UobWluKTtcbiAgICB9XG4gICAgLy8gLyoqXG4gICAgLy8gICog5LiA5Liq5pe26Ze054K5IOi3neemu+S7iuWkqeebuOW3ruWHoOWkqSAgICDku6Ux5byA5aeL566XICDku4rlpKnnrpcx5aSpICAg5LuK5aSp5LmL5ZCO55qE566XMOWkqVxuICAgIC8vICAqIEBwYXJhbSBzdHIgXG4gICAgLy8gICovXG4gICAgLy8gc3RhdGljIHBhc3NEYXkoc3RyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vICAgICBsZXQgRGF0ZXMgPSBuZXcgRGF0ZShHYW1lRGF0YUNlbnRlci50aW1lTW9kZWwuc2V2VGltZSAqIDEwMDApLnNldEhvdXJzKDAsIDAsIDAsIDApOy8v6I635Y+W5LuK5aSpMOeCuTDliIYw56eSMOavq+enkuOAglxuICAgIC8vICAgICBsZXQgY2hlY2tUaW1lID0gbmV3IERhdGUoc3RyICogMTAwMCkuc2V0SG91cnMoMCwgMCwgMCwgMCk7Ly/ojrflj5blvZPlpKkw54K5MOWIhjDnp5Iw5q+r56eS44CCXG4gICAgLy8gICAgIGlmIChEYXRlcyA8IGNoZWNrVGltZSkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIDBcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICByZXR1cm4gTWF0aC5hYnMoTWF0aC5mbG9vcigoRGF0ZXMgLSBjaGVja1RpbWUpIC8gODY0MDAwMDApKSArIDE7XG4gICAgLy8gfVxuXG4gICAgLy8gYT5i5YiZ6L+U5ZuePjAgYT1i5YiZ6L+U5ZueMCBhPGLliJnov5Tlm548MFxuICAgIHN0YXRpYyBjb21wYXJlVmVyc2lvbih2ZXJzaW9uQTogc3RyaW5nLCB2ZXJzaW9uQjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgdmFyIHZBID0gdmVyc2lvbkEuc3BsaXQoJy4nKVxuICAgICAgICB2YXIgdkIgPSB2ZXJzaW9uQi5zcGxpdCgnLicpXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdkEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBhID0gcGFyc2VJbnQodkFbaV0pXG4gICAgICAgICAgICB2YXIgYiA9IDAgLy9wYXJzZUludCh2QltpXSB8fCAwKVxuICAgICAgICAgICAgaWYgKHZCW2ldKSB7XG4gICAgICAgICAgICAgICAgYiA9IHBhcnNlSW50KHZCW2ldKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEgLSBiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZCLmxlbmd0aCA+IHZBLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFN0ckxlbmd0aChzdHI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGxldCBhID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChzdHIuY2hhckNvZGVBdChpKSA+IDI1NSlcbiAgICAgICAgICAgICAgICBhICs9IDI7Ly/mjInnhafpooTmnJ/orqHmlbDlop7liqAyXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIC8vIOmZkOWItijpu5jorqQxNuS4quWtl+espikgIOS4reaWhzIg6Iux5paHMVxuICAgIHN0YXRpYyBnZXRMaW1pdFN0cihzdHI6IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDE2KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGEgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KGkpID4gMjU1KVxuICAgICAgICAgICAgICAgIGEgKz0gMjsvL+aMieeFp+mihOacn+iuoeaVsOWinuWKoDJcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhKys7XG4gICAgICAgICAgICBpZiAoYSA+IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5zbGljZSgwLCBpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJcbiAgICB9XG4gICAgc3RhdGljIGlzT3ZlckxpbWl0KHN0cjogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMTYpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGEgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KGkpID4gMjU1KVxuICAgICAgICAgICAgICAgIGEgKz0gMjsvL+aMieeFp+mihOacn+iuoeaVsOWinuWKoDJcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhKys7XG4gICAgICAgICAgICBpZiAoYSA+IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyDlpJrkuKrlr7nosaHlnKjnlYzpnaLkuIrnmoTlsYXkuK3lsZXnpLos6ZyA6KaBYm9455qE6ZSa54K55Zyo5Lit5b+DIGV4YW1wbGU6ICAz5Liq6YGT5YW3IOWwseaYryAgIC01MCAwIDUwXG4gICAgLy8gaW5kZXjku6Uw5Li65Yid5aeLXG4gICAgc3RhdGljIGdldFBvc0luQm94KGluZGV4OiBudW1iZXIsIHRvdGFsOiBudW1iZXIsIGJnV2lkdGg6IG51bWJlciwgaXRlbVdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgc3BhY2UgPSB0b3RhbCA9PSAxID8gMCA6ICgoKGJnV2lkdGggLSBpdGVtV2lkdGggKiB0b3RhbCkgLyAodG90YWwgLSAxKSArIGl0ZW1XaWR0aCkpXG4gICAgICAgIGxldCBwb3N4ID0gMFxuICAgICAgICBwb3N4ID0gLSgodG90YWwgLSAxKSAqIChzcGFjZSAvIDIpKSArIGluZGV4ICogKHNwYWNlKVxuICAgICAgICByZXR1cm4gcG9zeFxuICAgIH1cblxuICAgIC8vIHN0YXRpYyBpc01pbkdhbihzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vICAgICBzdHIgPSBzdHIucmVwbGFjZShcIlxcXFx1MDBBMFwiLCBcIlwiKSAvL+WOu+epulxuICAgIC8vICAgICBpZiAoR2FtZUNmZy53b3Jkcy5taW5HYW4ucG9vbCAhPSBudWxsICYmIHN0ci5sZW5ndGggPiAwKSB7XG4gICAgLy8gICAgICAgICBmb3IgKGxldCBpIGluIEdhbWVDZmcud29yZHMubWluR2FuLnBvb2wpIHtcbiAgICAvLyAgICAgICAgICAgICBsZXQgX25hbWUgPSBHYW1lQ2ZnLndvcmRzLm1pbkdhbi5wb29sW2ldLm5hbWVcbiAgICAvLyAgICAgICAgICAgICBpZiAoc3RyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihfbmFtZS50b0xvd2VyQ2FzZSgpKSAhPSAtMSkge1xuICAgIC8vICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vICAgICByZXR1cm4gZmFsc2VcbiAgICAvLyB9XG5cbiAgICAvLyDmj5Dlj5bljIXlkKsgPCV0PuagvOW8j+eahOWtl+autVxuICAgIHN0YXRpYyBnZXRFeGVjU3RycyhzdHIpOiBzdHJpbmdbXSB7XG4gICAgICAgIC8vIHZhciByZWcgPSAvXFw8XFwlKC4rPylcXD4vZ1xuICAgICAgICB2YXIgcmVnID0gL1xcPCguKz8pXFw+L2dcbiAgICAgICAgdmFyIGxpc3QgPSBbXVxuICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbFxuICAgICAgICBkbyB7XG4gICAgICAgICAgICByZXN1bHQgPSByZWcuZXhlYyhzdHIpXG4gICAgICAgICAgICByZXN1bHQgJiYgbGlzdC5wdXNoKHJlc3VsdFsxXSlcbiAgICAgICAgfSB3aGlsZSAocmVzdWx0KVxuICAgICAgICByZXR1cm4gbGlzdFxuICAgIH1cbiAgICAvLyAvLyDlsIbmloflrZfkuK3nmoQ8JXQxMjY0ODY3MzEyMz4g6L2s5YyW5Li65pe26Ze0XG4gICAgLy8gLy8g6L+U5ZueIFvop6PmnpDlkI7nmoTlrZfnrKbkuLIs5pe26Ze05oizLOaXtumXtOaIsy4uLl1cbiAgICAvLyBzdGF0aWMgdGV4dEFuYWx5c2lzKHRleHQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAvLyAgICAgLy8gbGlzdOWIl+ihqCBbXCJ0MTIzMjM0NTE1MTRcIixcInQxNDUxMzIxNTRcIl1cbiAgICAvLyAgICAgbGV0IGxpc3QgPSBGb3JtdWxhQ29tLmdldEV4ZWNTdHJzKHRleHQpXG4gICAgLy8gICAgIGxldCB0aW1lTGlzdCA9IFtdXG4gICAgLy8gICAgIGxldCByZXN1bHQgPSBbXVxuICAgIC8vICAgICBsZXQgcmVzdWx0VGV4dCA9IHRleHRcbiAgICAvLyAgICAgbGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIC8vICAgICAgICAgaWYgKGVsZW1lbnRbMF0gPT0gXCJ0XCIpIHtcbiAgICAvLyAgICAgICAgICAgICAvLyDljrvpmaToi7Hmlocs5L+d55WZ5pWw5a2XXG4gICAgLy8gICAgICAgICAgICAgdGltZUxpc3QucHVzaChlbGVtZW50LnJlcGxhY2UoL1teXFxkXS9nLCAnJykpXG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgICB0aW1lTGlzdC5mb3JFYWNoKHRpbWUgPT4ge1xuICAgIC8vICAgICAgICAgbGV0IHRhZyA9IFwiPCV0XCIgKyB0aW1lICsgXCI+XCJcbiAgICAvLyAgICAgICAgIC8vIHJlc3VsdFRleHQgPSByZXN1bHRUZXh0LnJlcGxhY2UodGFnLCBuZXcgRGF0ZSh0aW1lKS50b1RpbWVTdHJpbmcoKSlcbiAgICAvLyAgICAgICAgIHJlc3VsdFRleHQgPSByZXN1bHRUZXh0LnJlcGxhY2UodGFnLCBzaG93VGltZVlNRCh0aW1lKSlcbiAgICAvLyAgICAgfSlcbiAgICAvLyAgICAgcmVzdWx0LnB1c2gocmVzdWx0VGV4dClcbiAgICAvLyAgICAgdGltZUxpc3QuZm9yRWFjaCh0aW1lID0+IHtcbiAgICAvLyAgICAgICAgIHJlc3VsdC5wdXNoKHRpbWUpXG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgICByZXR1cm4gcmVzdWx0XG4gICAgLy8gfVxuICAgIC8qKiDorqnliqjnlLvlnKjmjIflrprljLrpl7TlhoXlvqrnjq8gKi9cbiAgICBzdGF0aWMgbG9vcEF0RnJhbWUodGU6IHNwLnNwaW5lLlRyYWNrRW50cnksIHNGcmFtZTogbnVtYmVyLCBlRnJhbWU6IG51bWJlcikge1xuICAgICAgICBpZiAodGUuYW5pbWF0aW9uU3RhcnQgPT09IDApIHtcbiAgICAgICAgICAgIHRlLmFuaW1hdGlvblN0YXJ0ID0gc0ZyYW1lIC8gMzA7IC8vIDMw5pivU3BpbmXliqjnlLvnmoTluKfnjodcbiAgICAgICAgICAgIHRlLmFuaW1hdGlvbkVuZCA9IGVGcmFtZSAvIDMwO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICog5YGc5q2i5Zyo5oyH5a6a5bin44CCMeaYr+W8gOWni++8jC0x5piv5pyA5ZCOXG4gICAgKiBAcGFyYW0gZnJhbWUg5bin5pWwXG4gICAgKi9cbiAgICBzdGF0aWMgc3RvcEF0RnJhbWUoc3BpbmVDb21wOiBzcC5Ta2VsZXRvbiwgZnJhbWU6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0ZSA9IHNwaW5lQ29tcC5nZXRDdXJyZW50KDApIGFzIHNwLnNwaW5lLlRyYWNrRW50cnk7XG4gICAgICAgIC8vIOeul+WHuuW4p+WvueW6lOeahOaXtumXtFxuICAgICAgICBsZXQgdGltZTtcbiAgICAgICAgaWYgKGZyYW1lID09PSAtMSkge1xuICAgICAgICAgICAgdGltZSA9IHRlLmFuaW1hdGlvbi5kdXJhdGlvbjsgLy8g5pyA5ZCO5LiA5binXG4gICAgICAgIH0gZWxzZSBpZiAoZnJhbWUgPiAxKSB7XG4gICAgICAgICAgICB0aW1lID0gKGZyYW1lIC0gMSkgLyAzMDsgIC8vIOagueaNruW4p+eOh+eul+WHuuWvueW6lOaXtumXtO+8jHNwaW5l5bin546H5pivMzBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbWUgPSAwOyAvLyDpppbluKdcbiAgICAgICAgfVxuICAgICAgICAvLyDlr7l0aW1l5L2c6ZmQ5Yi2XG4gICAgICAgIGlmICh0aW1lIDwgMCkgdGltZSA9IDA7XG4gICAgICAgIGlmICh0aW1lID49IHRlLmFuaW1hdGlvbi5kdXJhdGlvbikgdGltZSA9IHRlLmFuaW1hdGlvbi5kdXJhdGlvbiAtIDAuMDE7IC8vIOWkqueyvuehrueahOivne+8jOWKqOeUu+S8muWBnOWcqOmmluW4p++8jOaJgOS7peimgeWHj+S4gOeCuVxuXG4gICAgICAgIHRlLnRpbWVTY2FsZSA9IDA7IC8vIOiuqeWKqOeUu+WBnOatolxuICAgICAgICB0ZS50cmFja1RpbWUgPSB0aW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaKiuacjeWKoeWZqOaXtumXtOaIsyDmlLnkuLrmnKzlnLDml7bpl7TmiLNcbiAgICAgKiBAcGFyYW0gdGltZSDpnIDopoHovazmjaLnmoTml7bpl7TmiLNcbiAgICAgKiBAcGFyYW0gdXRjTWluIOacjeWKoeWZqOaXtuWMuijmjInliIbpkp/orqEpXG4gICAgICAgIC8vIC0zMDAg6KW/NeWMuue+juWbvSAtNSo2MCAgR01ULTVcbiAgICAgICAgLy8gMFxuICAgICAgICAvLyA0ODAg5LicOOWMuuWMl+S6rCA4KjYwXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0VXRjVGltZSh0aW1lOiBudW1iZXIsIHV0Y0hvdXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCB1dGNNaW4gPSB1dGNIb3VyICogNjBcbiAgICAgICAgLy/mnKzlnLDml7bpl7TnsbtcbiAgICAgICAgbGV0IGxvY2FsdGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIC8v5pys5Zyw5pe25Yy66ZKI5a+55qCH5YeG5pe25Yy655qE5YGP56e7XG4gICAgICAgIGxldCBweW0gPSBsb2NhbHRpbWUuZ2V0VGltZXpvbmVPZmZzZXQoKVxuICAgICAgICAvL+aXtumXtOi9rOaNouS4uuaMh+WumuaXtuWMuuaXtumXtFxuICAgICAgICB0aW1lICs9IChweW0gKyB1dGNNaW4pICogNjBcbiAgICAgICAgcmV0dXJuIHRpbWVcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0UmFuZG9tVGFnKCk6IHN0cmluZyB7XG4gICAgICAgIGxldCBvdXRTdHJpbmc6IHN0cmluZyA9ICcnO1xuICAgICAgICBsZXQgaW5PcHRpb25zOiBzdHJpbmcgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgICAgICBvdXRTdHJpbmcgKz0gaW5PcHRpb25zLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBpbk9wdGlvbnMubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dFN0cmluZztcbiAgICB9XG4gICAgc3RhdGljIGdldERpc3RhbmNlKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpIHtcbiAgICAgICAgdmFyIGEgPSB4MiAtIHgxXG4gICAgICAgIHZhciBiID0geTIgLSB5MVxuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpXG4gICAgfVxuICAgIC8qKlxuICAgICAqIOagueaNrumUmueCuemHjeaWsOiuoeeul+S4reW/g+eCueS4lueVjOWdkOagh+WdkOagh1xuICAgICAqIEBwYXJhbSBwb3Mg6ZSa54K555qE5LiW55WM5Z2Q5qCHXG4gICAgICogQHBhcmFtIG5vZGUg6IqC54K5XG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgc3RhdGljIGZpeEFuY2hvcihwb3M6IGNjLlZlYzIsIG5vZGU6IGNjLk5vZGUpOiBjYy5WZWMyIHtcbiAgICAgICAgbGV0IHggPSBwb3MueCAtIG5vZGUuYW5jaG9yWCAqIG5vZGUud2lkdGggKyBub2RlLndpZHRoIC8gMlxuICAgICAgICBsZXQgeSA9IHBvcy55IC0gbm9kZS5hbmNob3JZICogbm9kZS5oZWlnaHQgKyBub2RlLmhlaWdodCAvIDJcbiAgICAgICAgcmV0dXJuIG5ldyBjYy5WZWMyKHgsIHkpXG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiOt+W+l+afkOS4quiKgueCueS4reW/g+eCueeahOS4lueVjOWdkOagh1xuICAgICAqIEBwYXJhbSBub2RlIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRXb3JsZENlbnRlclBvcyhub2RlOiBjYy5Ob2RlKTogY2MuVmVjMiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpeEFuY2hvcih0aGlzLmdldFdvcmxkUG9zKG5vZGUpLCBub2RlKVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0V29ybGRQb3Mobm9kZTogY2MuTm9kZSk6IGNjLlZlYzIge1xuICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KG5vZGUpKSByZXR1cm4gY2MudjIoMCwgMCk7XG4gICAgICAgIHJldHVybiBub2RlLmNvbnZlcnRUb1dvcmxkU3BhY2VBUihjYy5WZWMyLlpFUk8pXG4gICAgfVxuICAgIHN0YXRpYyBzZXRQb3NCeVdvcmxkUG9zKG5vZGU6IGNjLk5vZGUsIHBvczogY2MuVmVjMikge1xuICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KG5vZGUpKSByZXR1cm47XG4gICAgICAgIGxldCBfcG9zID0gbm9kZS5wYXJlbnQuY29udmVydFRvTm9kZVNwYWNlQVIocG9zKVxuICAgICAgICBub2RlLnggPSBfcG9zLnhcbiAgICAgICAgbm9kZS55ID0gX3Bvcy55XG4gICAgfVxuICAgIC8v6I635Y+Wbm9kZeS9jeS6jnRhcmdldOeahOWdkOagh+ebuOWvueWdkOagh1xuICAgIHN0YXRpYyBnZXRQb3NpdGlvbkluVmlldyhub2RlOiBjYy5Ob2RlLCB0YXJnZXQ6IGNjLk5vZGUpOiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgd29ybGRQb3MgPSBub2RlLnBhcmVudC5jb252ZXJ0VG9Xb3JsZFNwYWNlQVIobm9kZS5wb3NpdGlvbik7XG4gICAgICAgIGxldCB2aWV3UG9zID0gdGFyZ2V0LmNvbnZlcnRUb05vZGVTcGFjZUFSKHdvcmxkUG9zKTtcbiAgICAgICAgcmV0dXJuIHZpZXdQb3M7XG4gICAgfVxuXG4gICAgLy8g6I635Y+W546p5a625pyA5ZCO5LiA5qyh55m75b2V5pe26Ze0XG4gICAgc3RhdGljIGdldFVzZXJTdGF0ZShsYXN0YWRvazogbnVtYmVyLCBzZXZUaW1lOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHVzZXJTdGF0ZTogc3RyaW5nID0gJydcbiAgICAgICAgbGV0IHRpbWUgPSBNYXRoLmZsb29yKChzZXZUaW1lIC0gbGFzdGFkb2spIC8gNjApXG4gICAgICAgIGlmICh0aW1lIDwgNikge1xuICAgICAgICAgICAgdXNlclN0YXRlID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3VzZXJMb2dpblN0YXRlXzEnKVxuICAgICAgICB9IGVsc2UgaWYgKHRpbWUgPCA2MCkge1xuICAgICAgICAgICAgdXNlclN0YXRlID0gSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX3RpbWV3b3JkXzEnLCB0aW1lKVxuICAgICAgICB9IGVsc2UgaWYgKHRpbWUgPCAyNCAqIDYwKSB7XG4gICAgICAgICAgICB1c2VyU3RhdGUgPSBJMThuLmdldEkxOG5UZXh0KCdjb21tb25fdGltZXdvcmRfMicsIE1hdGguZmxvb3IodGltZSAvIDYwKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVzZXJTdGF0ZSA9IEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl90aW1ld29yZF8zJywgTWF0aC5mbG9vcigodGltZSAvIDYwKSAvIDI0KSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1c2VyU3RhdGVcbiAgICB9XG4gICAgLy8g5bey55+l5ZyG5b+DLOWNiuW+hCzop5LluqYs5rGC5Z2Q5qCHXG4gICAgc3RhdGljIGdldFBvc2J5QW5nbGUoY2VudGVyWDogbnVtYmVyLCBjZW50ZXJZOiBudW1iZXIsIHJhbmdlOiBudW1iZXIsIGFuZ2xlOiBudW1iZXIpOiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgcmFkaWFucyA9IHRoaXMuZ2V0UmFkaWFuc0J5QW5nbGUoYW5nbGUpXG4gICAgICAgIGxldCBkeCA9IE1hdGguY29zKHJhZGlhbnMpICogcmFuZ2VcbiAgICAgICAgbGV0IGR5ID0gTWF0aC5zaW4ocmFkaWFucykgKiByYW5nZVxuICAgICAgICByZXR1cm4geyB4OiBjZW50ZXJYICsgZHgsIHk6IGNlbnRlclkgKyBkeSB9XG4gICAgfVxuICAgIC8vIOW3suefpeWdkOagh+axguinkuW6plxuICAgIHN0YXRpYyBnZXRBbmdsZUJ5UG9zKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAoeDEgPT0geDIgJiYgeTEgPT0geTIpIHtcbiAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRlZ3JlZSA9IE1hdGguYXRhbjIoeTIgLSB5MSwgeDIgLSB4MSlcbiAgICAgICAgcmV0dXJuIGRlZ3JlZSAqIDE4MCAvIE1hdGguUElcbiAgICB9XG4gICAgLy/msYLkuKTkuKrngrnnmoTop5LluqZcbiAgICBzdGF0aWMgZ2V0QW5nbGUoc3RhcnRQb3M6IGNjLlZlYzIsIGVuZFBvczogY2MuVmVjMik6IG51bWJlciB7XG4gICAgICAgIC8v6K6h566X5Ye65pyd5ZCRXG4gICAgICAgIHZhciBkeCA9IGVuZFBvcy54IC0gc3RhcnRQb3MueDtcbiAgICAgICAgdmFyIGR5ID0gZW5kUG9zLnkgLSBzdGFydFBvcy55O1xuICAgICAgICB2YXIgZGlyID0gY2MudjIoZHgsIGR5KTtcblxuICAgICAgICAvL+agueaNruacneWQkeiuoeeul+WHuuWkueinkuW8p+W6plxuICAgICAgICB2YXIgYW5nbGUgPSBkaXIuc2lnbkFuZ2xlKGNjLnYyKDEsIDApKTtcblxuICAgICAgICAvL+WwhuW8p+W6pui9rOaNouS4uuasp+aLieinklxuICAgICAgICB2YXIgZGVncmVlID0gYW5nbGUgLyBNYXRoLlBJICogMTgwO1xuXG4gICAgICAgIHJldHVybiAtZGVncmVlXG4gICAgfVxuICAgIC8vIOagueaNruinkuW6puiOt+WPluW8p+W6plxuICAgIHN0YXRpYyBnZXRSYWRpYW5zQnlBbmdsZShhbmdsZTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBhbmdsZSAvIDE4MCAqIE1hdGguUElcbiAgICB9XG4gICAgLy8g5qC55o2u5byn5bqm6I635Y+W6KeS5bqmXG4gICAgc3RhdGljIGdldEFuZ2xlQnlSYWRpYW5zKHJhZGlhbnM6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gcmFkaWFucyAqIDE4MCAvIE1hdGguUElcbiAgICB9XG5cbiAgICBzdGF0aWMgb2JqMkFycmF5PFQ+KG9iamVjdDogeyBbczogc3RyaW5nXTogVCB9KTogVFtdIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QgIT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMob2JqZWN0KVxuICAgICAgICAvLyBsZXQgYXJyYXkgPSBbXVxuICAgICAgICAvLyBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgLy8gICAgIGFycmF5LnB1c2gob2JqZWN0W2tleV0pXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gcmV0dXJuIGFycmF5XG4gICAgfVxuXG4gICAgc3RhdGljIHN0ckRMZW5ndGgoc3RyOiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICBsZXQgclN0ciA9IHN0ci5yZXBsYWNlKC9bXlxceDAwLVxceGZmXS9nLCAnJykvL+WPjOWtl+iKguWtl+espu+8mijljIXmi6zmsYnlrZflnKjlhoXvvIzlj6/ku6XnlKjmnaXorqHnrpflrZfnrKbkuLLnmoTplb/luqYo5LiA5Liq5Y+M5a2X6IqC5a2X56ym6ZW/5bqm6K6hMu+8jEFTQ0lJ5a2X56ym6K6hMSkpXG4gICAgICAgIHJldHVybiBzdHIubGVuZ3RoIC0gclN0ci5sZW5ndGhcbiAgICB9XG5cbiAgICAvLyDpppblrZfmr43lpKflhplcbiAgICBzdGF0aWMgZmlyc3RVcENhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0clswXS50b1VwcGVyQ2FzZSgpICsgc3RyLnN1YnN0cmluZygxKVxuICAgIH1cbiAgICAvLyDliKTmlq3lrZfnrKbplb/luqZcbiAgICBzdGF0aWMgZ2V0U3RyQ2hhcmFjdGVyTGVuZ3RoKHN0cik6IG51bWJlciB7XG4gICAgICAgIGxldCBwYXR0ZXJuQ2hpbmVzZSA9IG5ldyBSZWdFeHAoXCJbXFx1NEUwMC1cXHU5RkE1XStcIik7IC8vIOS4reaWh1xuICAgICAgICBsZXQgbGVuZyA9IDBcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHN0ci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuQ2hpbmVzZS50ZXN0KHN0cltpbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgbGVuZyArPSAyXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxlbmcgKz0gMVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsZW5nXG4gICAgfVxuXG4gICAgLy/moLnmja7ntKLlvJXojrflj5blvZPliY3ooYzliJfmlbBcbiAgICAvLyBpbmRleCDlvZPliY3ntKLlvJXlgLzvvIjku44w5byA5aeL77yJICAgZWxlbWVudHNQZXJSb3cgIOS4gOihjOacieWHoOS4qlxuICAgIHN0YXRpYyBnZXRSb3dBbmRDb2x1bW5Gcm9tSW5kZXgoaW5kZXg6IG51bWJlciwgY29sdW1uQ291bnQ6IG51bWJlcikge1xuICAgICAgICBpZiAoY29sdW1uQ291bnQgPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbHVtbiBjb3VudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dJbmRleCA9IE1hdGguZmxvb3IoaW5kZXggLyBjb2x1bW5Db3VudCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gaW5kZXggJSBjb2x1bW5Db3VudDtcbiAgICAgICAgcmV0dXJuIHsgcm93SW5kZXgsIGNvbHVtbkluZGV4IH07XG4gICAgfVxuXG4gICAgLy8g5a+55pWw57uE5oyJ5pWw6YeP5YiG57uEXG4gICAgc3RhdGljIGdyb3VwVHdvQnlUd288VD4oaW5wdXQ6IFRbXSwgY291bnQ6IG51bWJlcik6IFRbXVtdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBUW11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSArPSBjb3VudCkge1xuICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShpbnB1dFtpXSkgfHwgZ2FtZU1ldGhvZC5pc0VtcHR5KGlucHV0W2kgKyAxXSkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwi6K+l5pWw57uE5YiG6YWN5LiN6Laz77yM5qOA5p+l5pWw57uE6ZW/5bqmXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChbaW5wdXRbaV0sIGlucHV0W2kgKyAxXV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5cbi8vIOmYv+aLieS8r+aVsOWtl+i9rOS4reaWh1xuZXhwb3J0IGZ1bmN0aW9uIGNoaW5lc2VCeU51bWJlcihudW1iZXI6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgY2hpbmVzZU51bWJlcnMgPSBbJ+mbticsICfkuIAnLCAn5LqMJywgJ+S4iScsICflm5snLCAn5LqUJywgJ+WFrScsICfkuIMnLCAn5YWrJywgJ+S5nScsICfljYEnXTtcbiAgICBjb25zdCBjaGluZXNlVW5pdHMgPSBbJycsICfljYEnLCAn55m+JywgJ+WNgycsICfkuIcnXTtcbiAgICBpZiAobnVtYmVyIDw9IDEwKSB7XG4gICAgICAgIHJldHVybiBjaGluZXNlTnVtYmVyc1tudW1iZXJdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG51bWJlclN0cmluZyA9IG51bWJlci50b1N0cmluZygpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gJyAnO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyU3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaWdpdCA9IHBhcnNlSW50KG51bWJlclN0cmluZ1tpXSk7XG5cbiAgICAgICAgICAgIGlmIChkaWdpdCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJTdHJpbmcubGVuZ3RoID09PSAyICYmIGkgPT09IDAgJiYgZGlnaXQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNoaW5lc2VVbml0c1tudW1iZXJTdHJpbmcubGVuZ3RoIC0gaSAtIDFdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjaGluZXNlTnVtYmVyc1tkaWdpdF0gKyBjaGluZXNlVW5pdHNbbnVtYmVyU3RyaW5nLmxlbmd0aCAtIGkgLSAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSAwIHx8IG51bWJlclN0cmluZ1tpIC0gMV0gIT09ICcwJykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2hpbmVzZU51bWJlcnNbZGlnaXRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbiJdfQ==